!c99Shell v. 1.0 pre-release build #16!

Software: Apache/2.2.3 (CentOS). PHP/5.1.6 

uname -a: Linux mx-ll-110-164-51-230.static.3bb.co.th 2.6.18-194.el5PAE #1 SMP Fri Apr 2 15:37:44
EDT 2010 i686
 

uid=48(apache) gid=48(apache) groups=48(apache) 

Safe-mode: OFF (not secure)

/var/www/html/reportEregis111/chart/   drwxr-xr-x
Free 51.01 GB of 127.8 GB (39.91%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     canvasjs.js (1.73 MB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.CanvasJS = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var ghostCtx = this._eventManager.ghostCtx;

	var axisXProps = plotUnit.axisX.lineCoordinates;
	var axisYProps = plotUnit.axisY.lineCoordinates;
	var markers = [];

	var plotArea = this.plotArea;
	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];

		var dataPoints = dataSeries.dataPoints;

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};

		var hexColor = (0, _utils.intToHexColorString)(seriesId);
		ghostCtx.fillStyle = hexColor;
		//ghostCtx.lineWidth = dataSeries.lineThickness;
		//ghostCtx.lineWidth = 20;

		markers = [];

		var isFirstDataPointInPlotArea = true;
		var i = 0,
		    x,
		    y;
		var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.

		var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
		var baseY;

		var startPoint = null;

		if (dataPoints.length > 0) {
			//ctx.strokeStyle = "#4572A7 ";
			var color = dataSeries._colorSet[i % dataSeries._colorSet.length];
			//ctx.strokeStyle = "red";
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash((0, _utils.getLineDashArray)(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			var prevDataNull = true;
			for (; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") {
					closeArea();

					prevDataNull = true;
					continue;
				}

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				if (isFirstDataPointInPlotArea || prevDataNull) {
					ctx.beginPath();
					ctx.moveTo(x, y);
					startPoint = {
						x: x, y: y
					};

					if (_utils.isCanvasSupported) {
						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y);
					}

					isFirstDataPointInPlotArea = false;
					prevDataNull = false;
				} else {

					ctx.lineTo(x, y);

					if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y);

					if (i % 250 == 0) {
						closeArea();
					}
				}

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y
				};

				//Render Marker
				if (dataPoints[i].markerSize !== 0) {
					if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) {
						var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						var markerColor = (0, _utils.intToHexColorString)(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "area",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						color: color
					});
				}
			}

			closeArea();

			//startPoint = { x: x, y: y };
			_render2.default.drawMarkers(markers);
		}
	}

	ctx.restore();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	function closeArea() {

		if (!startPoint) return;

		if (dataSeries.lineThickness > 0) ctx.stroke();

		if (plotUnit.axisY.viewportMinimum <= 0 && plotUnit.axisY.viewportMaximum >= 0) {
			baseY = yZeroToPixel;
		} else if (plotUnit.axisY.viewportMaximum < 0) baseY = axisYProps.y1;else if (plotUnit.axisY.viewportMinimum > 0) baseY = axisXProps.y2;

		ctx.lineTo(x, baseY);
		ctx.lineTo(startPoint.x, baseY);
		ctx.closePath();

		ctx.globalAlpha = dataSeries.fillOpacity;
		ctx.fill();
		ctx.globalAlpha = 1;

		if (_utils.isCanvasSupported) {
			ghostCtx.lineTo(x, baseY);
			ghostCtx.lineTo(startPoint.x, baseY);
			ghostCtx.closePath();
			ghostCtx.fill();
		}

		ctx.beginPath();
		ctx.moveTo(x, y);
		ghostCtx.beginPath();
		ghostCtx.moveTo(x, y);

		startPoint = {
			x: x, y: y
		};
	}

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xClipAnimation, easingFunction: _animator2.default.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],2:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	//In case of Bar Chart, yZeroToPixel is x co-ordinate!
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.height * .15, this.plotArea.height / plotUnit.plotType.totalDataSeries * .9) << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	//var barWidth = (((plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum)) * Math.abs(xMinDiff)) / totalDataSeries * .9) << 0;

	var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < dataPoints.length; i++) {

				dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				//x and y are pixel co-ordinates of point and should not be confused with X and Y values
				y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				x = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var y1 = y - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0;
				var y2 = y1 + barWidth << 0;
				var x1;
				var x2;

				if (dataPoints[i].y >= 0) {
					x1 = yZeroToPixel;
					x2 = x;
				} else {
					x1 = x;
					x2 = yZeroToPixel;
				}

				//drawRect(ctx, x1, y1, plotArea.x2, y2, "#EEEEEE", 0, null, false, false, false, false);
				//drawRect(ctx, x1, y1, plotArea.x2, y2, "#BDCED3", 0, null, false, false, false, false);

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				//color = "#1B4962";
				(0, _utils.drawRect)(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity);

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};
				color = (0, _utils.intToHexColorString)(id);

				if (_utils.isCanvasSupported) (0, _utils.drawRect)(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) this._indexLabels.push({
					chartType: "bar",
					dataPoint: dataPoints[i],
					dataSeries: dataSeries,
					point: {
						x: dataPoints[i].y >= 0 ? x2 : x1, y: y1 + (y2 - y1) / 2
					},
					direction: dataPoints[i].y >= 0 ? 1 : -1,
					bounds: {
						x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2
					},
					color: color
				});
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationBase = Math.max(yZeroToPixel, plotUnit.axisX.boundingRect.x2);
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xScaleAnimation, easingFunction: _animator2.default.easing.easeOutQuart, animationBase: animationBase
	};
	return animationInfo;
};

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/utils":39}],3:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {

	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / totalDataSeries * .9 << 0;

	ctx.save();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	var maxZ = -Infinity;
	var minZ = Infinity;

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];
		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var z = 0;

		for (var i = 0; i < dataPoints.length; i++) {

			dataPointX = dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

			if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
				continue;
			}

			if (typeof dataPoints[i].z !== "undefined") {

				z = dataPoints[i].z;

				if (z > maxZ) maxZ = z;

				if (z < minZ) minZ = z;
			}
		}
	}

	var minArea = Math.PI * 5 * 5;
	var maxArea = Math.max(Math.pow(Math.min(plotArea.height, plotArea.width) * .25 / 2, 2) * Math.PI, minArea);

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		if (dataPoints.length == 1) barWidth = maxBarWidth;

		if (barWidth < 1) barWidth = 1;else if (barWidth > maxBarWidth) barWidth = maxBarWidth;

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);
			//var bevelEnabled = (barWidth > 5) ? false : false;

			ctx.strokeStyle = "#4572A7 ";

			for (var i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var z = dataPoints[i].z;

				var area = maxZ === minZ ? maxArea / 2 : minArea + (maxArea - minArea) / (maxZ - minZ) * (z - minZ);
				var radius = Math.max(Math.sqrt(area / Math.PI) << 0, 1);

				var markerSize = radius * 2;
				var markerProps = dataSeries.getMarkerProperties(i, ctx);
				markerProps.size = markerSize;

				ctx.globalAlpha = dataSeries.fillOpacity;
				_render2.default.drawMarker(x, y, ctx, markerProps.type, markerProps.size, markerProps.color, markerProps.borderColor, markerProps.borderThickness);
				ctx.globalAlpha = 1;

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y, size: markerSize
				};
				var markerColor = (0, _utils.intToHexColorString)(id);
				//RenderHelper.drawMarker(x, y, this._eventManager.ghostCtx, markerType, markerSize, markerColor, markerColor, dataSeries.markerBorderThickness);
				if (_utils.isCanvasSupported) _render2.default.drawMarker(x, y, this._eventManager.ghostCtx, markerProps.type, markerProps.size, markerColor, markerColor, markerProps.borderThickness);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "bubble",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: 1,
						bounds: {
							x1: x - markerProps.size / 2, y1: y - markerProps.size / 2, x2: x + markerProps.size / 2, y2: y + markerProps.size / 2
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.fadeInAnimation, easingFunction: _animator2.default.easing.easeInQuad, animationBase: 0
	};
	return animationInfo;
};

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],4:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var ghostCtx = this._eventManager.ghostCtx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;
	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x,
	    y1,
	    y2,
	    y3,
	    y4;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .015;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) * .7 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();
	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}
	//ctx.beginPath();

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		// Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels.
		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		//var offsetX = barWidth * plotUnit.index << 0;

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			for (i = 0; i < dataPoints.length; i++) {

				dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number" || typeof dataPoints[i].y[2] !== "number" || typeof dataPoints[i].y[3] !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
				y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				y3 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[2] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
				y4 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[3] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var x1 = x - barWidth / 2 << 0;
				var x2 = x1 + barWidth << 0;

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[0];

				//var borderThickness = Math.max(2, ((barWidth * .1) / 2 << 0) * 2); // Set only even numbers for border
				var borderThickness = Math.round(Math.max(1, barWidth * .15));
				//borderThickness = (borderThickness / 2 << 0) * 2;
				//borderThickness = 2;
				var offset = borderThickness % 2 === 0 ? 0 : .5;

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2,
					x3: x, y3: y3, x4: x, y4: y4, borderThickness: borderThickness, color: color
				};

				ctx.strokeStyle = color;
				ctx.beginPath();
				ctx.lineWidth = borderThickness;
				ghostCtx.lineWidth = Math.max(borderThickness, 4);

				if (dataSeries.type === "candlestick") {

					ctx.moveTo(x - offset, y2);
					ctx.lineTo(x - offset, Math.min(y1, y4));
					ctx.stroke();
					ctx.moveTo(x - offset, Math.max(y1, y4));
					ctx.lineTo(x - offset, y3);
					ctx.stroke();

					drawRect(ctx, x1, Math.min(y1, y4), x2, Math.max(y1, y4), dataPoints[i].y[0] <= dataPoints[i].y[3] ? dataSeries.risingColor : color, borderThickness, color, bevelEnabled, bevelEnabled, false, false, dataSeries.fillOpacity);

					if (_utils.isCanvasSupported) {
						color = intToHexColorString(id);
						ghostCtx.strokeStyle = color;

						ghostCtx.moveTo(x - offset, y2);
						ghostCtx.lineTo(x - offset, Math.min(y1, y4));
						ghostCtx.stroke();
						ghostCtx.moveTo(x - offset, Math.max(y1, y4));
						ghostCtx.lineTo(x - offset, y3);
						ghostCtx.stroke();
						drawRect(ghostCtx, x1, Math.min(y1, y4), x2, Math.max(y1, y4), color, 0, null, false, false, false, false);
					}
				} else if (dataSeries.type === "ohlc") {

					ctx.moveTo(x - offset, y2);
					ctx.lineTo(x - offset, y3);
					ctx.stroke();

					ctx.beginPath();
					ctx.moveTo(x, y1);
					ctx.lineTo(x1, y1);
					ctx.stroke();

					ctx.beginPath();
					ctx.moveTo(x, y4);
					ctx.lineTo(x2, y4);
					ctx.stroke();

					if (_utils.isCanvasSupported) {

						color = intToHexColorString(id);
						ghostCtx.strokeStyle = color;

						ghostCtx.moveTo(x - offset, y2);
						ghostCtx.lineTo(x - offset, y3);
						ghostCtx.stroke();

						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y1);
						ghostCtx.lineTo(x1, y1);
						ghostCtx.stroke();

						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y4);
						ghostCtx.lineTo(x2, y4);
						ghostCtx.stroke();
					}
				}

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: dataSeries.type,
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x1 + (x2 - x1) / 2, y: y2
						},
						direction: 1,
						bounds: {
							x1: x1, y1: Math.min(y2, y3), x2: x2, y2: Math.max(y2, y3)
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.fadeInAnimation, easingFunction: AnimationHelper.easing.easeInQuad, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],5:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {

	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.width * .15, this.plotArea.width / plotUnit.plotType.totalDataSeries * .9) << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}
	//ctx.beginPath();

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		// Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels.
		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		//var offsetX = barWidth * plotUnit.index << 0;

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			for (i = 0; i < dataPoints.length; i++) {

				dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var x1 = x - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0;
				var x2 = x1 + barWidth << 0;
				var y1;
				var y2;

				if (dataPoints[i].y >= 0) {
					y1 = y;

					y2 = yZeroToPixel;

					if (y1 > y2) {
						var temp = y1;
						y1 = y2;
						y2 = y1;
					}
				} else {
					y2 = y;

					y1 = yZeroToPixel;

					if (y1 > y2) {
						var temp = y1;
						y1 = y2;
						y2 = y1;
					}
				}

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				(0, _utils.drawRect)(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled && dataPoints[i].y >= 0, dataPoints[i].y < 0 && bevelEnabled, false, false, dataSeries.fillOpacity);

				//if (dataSeries.markerType && dataSeries.markerSize > 0) {
				//    RenderHelper.drawMarker(x1 + (x2 - x1) / 2, y, ctx, dataSeries.markerType, dataSeries.markerSize, color, dataSeries.markerBorderColor, dataSeries.markerBorderThickness ? dataSeries.markerBorderThickness : 1);
				//}

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};

				color = (0, _utils.intToHexColorString)(id);
				if (_utils.isCanvasSupported) (0, _utils.drawRect)(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "column",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x1 + (x2 - x1) / 2, y: dataPoints[i].y >= 0 ? y1 : y2
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						bounds: {
							x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2)
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationBase = Math.min(yZeroToPixel, plotUnit.axisY.boundingRect.y2);
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.yScaleAnimation, easingFunction: _animator2.default.easing.easeOutQuart, animationBase: animationBase
	};
	return animationInfo;
};

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/utils":39}],6:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PieChart = exports.RangeSplineAreaChart = exports.RangeAreaChart = exports.RangeBarChart = exports.RangeColumnChart = exports.CandlestickChart = exports.ScatterChart = exports.BubbleChart = exports.StackedArea100Chart = exports.StackedAreaChart = exports.StepAreaChart = exports.SplineAreaChart = exports.AreaChart = exports.StackedBar100Chart = exports.StackedBarChart = exports.BarChart = exports.StackedColumn100Chart = exports.StackedColumnChart = exports.ColumnChart = exports.SplineChart = undefined;

var _spline = require('../charts/spline');

var _spline2 = _interopRequireDefault(_spline);

var _column = require('../charts/column');

var _column2 = _interopRequireDefault(_column);

var _stacked_column = require('../charts/stacked_column');

var _stacked_column2 = _interopRequireDefault(_stacked_column);

var _stacked_column_ = require('../charts/stacked_column_100');

var _stacked_column_2 = _interopRequireDefault(_stacked_column_);

var _bar = require('../charts/bar');

var _bar2 = _interopRequireDefault(_bar);

var _stacked_bar = require('../charts/stacked_bar');

var _stacked_bar2 = _interopRequireDefault(_stacked_bar);

var _stacked_bar_ = require('../charts/stacked_bar_100');

var _stacked_bar_2 = _interopRequireDefault(_stacked_bar_);

var _area = require('../charts/area');

var _area2 = _interopRequireDefault(_area);

var _spline_area = require('../charts/spline_area');

var _spline_area2 = _interopRequireDefault(_spline_area);

var _step_area = require('../charts/step_area');

var _step_area2 = _interopRequireDefault(_step_area);

var _stacked_area = require('../charts/stacked_area');

var _stacked_area2 = _interopRequireDefault(_stacked_area);

var _stacked_area_ = require('../charts/stacked_area_100');

var _stacked_area_2 = _interopRequireDefault(_stacked_area_);

var _bubble = require('../charts/bubble');

var _bubble2 = _interopRequireDefault(_bubble);

var _scatter = require('../charts/scatter');

var _scatter2 = _interopRequireDefault(_scatter);

var _candlestick = require('../charts/candlestick');

var _candlestick2 = _interopRequireDefault(_candlestick);

var _range_column = require('../charts/range_column');

var _range_column2 = _interopRequireDefault(_range_column);

var _range_bar = require('../charts/range_bar');

var _range_bar2 = _interopRequireDefault(_range_bar);

var _range_area = require('../charts/range_area');

var _range_area2 = _interopRequireDefault(_range_area);

var _range_spline_area = require('../charts/range_spline_area');

var _range_spline_area2 = _interopRequireDefault(_range_spline_area);

var _pie = require('../charts/pie');

var _pie2 = _interopRequireDefault(_pie);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

exports.SplineChart = _spline2.default;
exports.ColumnChart = _column2.default;
exports.StackedColumnChart = _stacked_column2.default;
exports.StackedColumn100Chart = _stacked_column_2.default;
exports.BarChart = _bar2.default;
exports.StackedBarChart = _stacked_bar2.default;
exports.StackedBar100Chart = _stacked_bar_2.default;
exports.AreaChart = _area2.default;
exports.SplineAreaChart = _spline_area2.default;
exports.StepAreaChart = _step_area2.default;
exports.StackedAreaChart = _stacked_area2.default;
exports.StackedArea100Chart = _stacked_area_2.default;
exports.BubbleChart = _bubble2.default;
exports.ScatterChart = _scatter2.default;
exports.CandlestickChart = _candlestick2.default;
exports.RangeColumnChart = _range_column2.default;
exports.RangeBarChart = _range_bar2.default;
exports.RangeAreaChart = _range_area2.default;
exports.RangeSplineAreaChart = _range_spline_area2.default;
exports.PieChart = _pie2.default;

},{"../charts/area":1,"../charts/bar":2,"../charts/bubble":3,"../charts/candlestick":4,"../charts/column":5,"../charts/pie":7,"../charts/range_area":8,"../charts/range_bar":9,"../charts/range_column":10,"../charts/range_spline_area":11,"../charts/scatter":12,"../charts/spline":13,"../charts/spline_area":14,"../charts/stacked_area":15,"../charts/stacked_area_100":16,"../charts/stacked_bar":17,"../charts/stacked_bar_100":18,"../charts/stacked_column":19,"../charts/stacked_column_100":20,"../charts/step_area":21}],7:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {

	var _this = this;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var dataSeriesIndex = plotUnit.dataSeriesIndexes[0];
	var dataSeries = this.data[dataSeriesIndex];
	var dataPoints = dataSeries.dataPoints;
	var indexLabelLineEdgeLength = 10;
	var explodeDuration = 500;

	var plotArea = this.plotArea;

	//var maxFrame = isCanvasSupported ? 300 : 4;
	//var totalRecursions = 0;
	var dataPointEOs = []; //dataPoint Extension Objects Behaves like a storage place for all additional data relating to dataPoints. Requred because actual dataPoints should not be modified.

	var minDistanceBetweenLabels = 2;
	var indexLabelRadiusToRadiusRatio = 1.3;
	var poleAnglularDistance = 20 / 180 * Math.PI; //Anglular Distance from 90 & 270 to be considered pole
	var precision = 6;

	var center = {
		x: (plotArea.x2 + plotArea.x1) / 2, y: (plotArea.y2 + plotArea.y1) / 2
	};

	var sum = 0;
	var isIndexLabelPresent = false;
	for (var j = 0; j < dataPoints.length; j++) {
		sum += Math.abs(dataPoints[j].y);

		if (!isIndexLabelPresent && typeof dataPoints[j].indexLabel !== "undefined" && dataPoints[j].indexLabel !== null && dataPoints[j].indexLabel.toString().length > 0) isIndexLabelPresent = true;

		if (!isIndexLabelPresent && typeof dataPoints[j].label !== "undefined" && dataPoints[j].label !== null && dataPoints[j].label.toString().length > 0) isIndexLabelPresent = true;
	}

	if (sum === 0) return;

	isIndexLabelPresent = isIndexLabelPresent || typeof dataSeries.indexLabel !== "undefined" && dataSeries.indexLabel !== null && dataSeries.indexLabel.toString().length > 0;

	var outerRadius = dataSeries.indexLabelPlacement !== "inside" && isIndexLabelPresent ? Math.min(plotArea.width, plotArea.height) * 0.75 / 2 : Math.min(plotArea.width, plotArea.height) * .92 / 2;

	if (dataSeries.radius) outerRadius = (0, _utils.convertPercentToValue)(dataSeries.radius, outerRadius);

	var innerRadius = typeof dataSeries.innerRadius !== 'undefined' && dataSeries.innerRadius !== null ? (0, _utils.convertPercentToValue)(dataSeries.innerRadius, outerRadius) : 0.7 * outerRadius;

	var percentInnerRadius = Math.min(innerRadius / outerRadius, (outerRadius - 1) / outerRadius);

	function initLabels() {

		if (!dataSeries || !dataPoints) return;

		var noDPNearSouthPole = 0;
		var noDPNearNorthPole = 0;
		var firstDPCloseToSouth = 0;
		var firstDPCloseToNorth = 0;

		for (j = 0; j < dataPoints.length; j++) {

			var dataPoint = dataPoints[j];
			var id = dataSeries.dataPointIds[j];

			var dataPointEO = {
				id: id, objectType: "dataPoint", dataPointIndex: j, dataSeriesIndex: 0
			};
			dataPointEOs.push(dataPointEO);

			var percentAndTotal = {
				percent: null, total: null
			};
			var formatterParameter = null;

			percentAndTotal = _this.getPercentAndTotal(dataSeries, dataPoint);

			if (dataSeries.indexLabelFormatter || dataPoint.indexLabelFormatter) formatterParameter = {
				chart: _this._options, dataSeries: dataSeries, dataPoint: dataPoint, total: percentAndTotal.total, percent: percentAndTotal.percent
			};

			var indexLabelText = dataPoint.indexLabelFormatter ? dataPoint.indexLabelFormatter(formatterParameter) : dataPoint.indexLabel ? _this.replaceKeywordsWithValue(dataPoint.indexLabel, dataPoint, dataSeries, j) : dataSeries.indexLabelFormatter ? dataSeries.indexLabelFormatter(formatterParameter) : dataSeries.indexLabel ? _this.replaceKeywordsWithValue(dataSeries.indexLabel, dataPoint, dataSeries, j) : dataPoint.label ? dataPoint.label : '';

			_this._eventManager.objectMap[id] = dataPointEO;

			//dataPointEO.indexLabelText = j.toString() + " " + "kingfisher: " + dataPoint.y.toString();;
			dataPointEO.center = {
				x: center.x, y: center.y
			};
			dataPointEO.y = dataPoint.y;
			dataPointEO.radius = outerRadius;
			dataPointEO.percentInnerRadius = percentInnerRadius;
			dataPointEO.indexLabelText = indexLabelText;
			dataPointEO.indexLabelPlacement = dataSeries.indexLabelPlacement;
			dataPointEO.indexLabelLineColor = dataPoint.indexLabelLineColor ? dataPoint.indexLabelLineColor : dataSeries.indexLabelLineColor ? dataSeries.indexLabelLineColor : dataPoint.color ? dataPoint.color : dataSeries._colorSet[j % dataSeries._colorSet.length];
			dataPointEO.indexLabelLineThickness = dataPoint.indexLabelLineThickness ? dataPoint.indexLabelLineThickness : dataSeries.indexLabelLineThickness;
			dataPointEO.indexLabelLineDashType = dataPoint.indexLabelLineDashType ? dataPoint.indexLabelLineDashType : dataSeries.indexLabelLineDashType;
			dataPointEO.indexLabelFontColor = dataPoint.indexLabelFontColor ? dataPoint.indexLabelFontColor : dataSeries.indexLabelFontColor;
			dataPointEO.indexLabelFontStyle = dataPoint.indexLabelFontStyle ? dataPoint.indexLabelFontStyle : dataSeries.indexLabelFontStyle;
			dataPointEO.indexLabelFontWeight = dataPoint.indexLabelFontWeight ? dataPoint.indexLabelFontWeight : dataSeries.indexLabelFontWeight;
			dataPointEO.indexLabelFontSize = dataPoint.indexLabelFontSize ? dataPoint.indexLabelFontSize : dataSeries.indexLabelFontSize;
			dataPointEO.indexLabelFontFamily = dataPoint.indexLabelFontFamily ? dataPoint.indexLabelFontFamily : dataSeries.indexLabelFontFamily;
			dataPointEO.indexLabelBackgroundColor = dataPoint.indexLabelBackgroundColor ? dataPoint.indexLabelBackgroundColor : dataSeries.indexLabelBackgroundColor ? dataSeries.indexLabelBackgroundColor : null;
			dataPointEO.indexLabelMaxWidth = dataPoint.indexLabelMaxWidth ? dataPoint.indexLabelMaxWidth : dataSeries.indexLabelMaxWidth ? dataSeries.indexLabelMaxWidth : plotArea.width * .33;
			dataPointEO.indexLabelWrap = typeof dataPoint.indexLabelWrap !== "undefined" ? dataPoint.indexLabelWrap : dataSeries.indexLabelWrap;

			dataPointEO.startAngle = j === 0 ? dataSeries.startAngle ? dataSeries.startAngle / 180 * Math.PI : 0 : dataPointEOs[j - 1].endAngle;

			dataPointEO.startAngle = (dataPointEO.startAngle + 2 * Math.PI) % (2 * Math.PI);

			dataPointEO.endAngle = dataPointEO.startAngle + 2 * Math.PI / sum * Math.abs(dataPoint.y);

			//var midAngle = dataPointEO.startAngle + Math.abs(dataPointEO.endAngle - dataPointEO.startAngle) / 2;
			var midAngle = (dataPointEO.endAngle + dataPointEO.startAngle) / 2;

			//var midAngle = (180 / Math.PI * midAngle);

			midAngle = (midAngle + 2 * Math.PI) % (2 * Math.PI);

			dataPointEO.midAngle = midAngle;

			if (dataPointEO.midAngle > Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < Math.PI / 2 + poleAnglularDistance) {
				if (noDPNearSouthPole === 0 || dataPointEOs[firstDPCloseToSouth].midAngle > dataPointEO.midAngle) firstDPCloseToSouth = j;

				noDPNearSouthPole++;
			} else if (dataPointEO.midAngle > 3 * Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < 3 * Math.PI / 2 + poleAnglularDistance) {
				if (noDPNearNorthPole === 0 || dataPointEOs[firstDPCloseToNorth].midAngle > dataPointEO.midAngle) firstDPCloseToNorth = j;

				noDPNearNorthPole++;
			}

			if (midAngle > Math.PI / 2 && midAngle <= 3 * Math.PI / 2) dataPointEO.hemisphere = "left";else dataPointEO.hemisphere = "right";

			//dataPointEO.indexLabelText = j.toString() + "; " + dataPoint.y.toString() + "; " + midAngle.toString() + "; junk";
			dataPointEO.indexLabelTextBlock = new _text_block2.default(_this.plotArea.ctx, {
				fontSize: dataPointEO.indexLabelFontSize, fontFamily: dataPointEO.indexLabelFontFamily, fontColor: dataPointEO.indexLabelFontColor,
				fontStyle: dataPointEO.indexLabelFontStyle, fontWeight: dataPointEO.indexLabelFontWeight,
				horizontalAlign: "left",
				backgroundColor: dataPointEO.indexLabelBackgroundColor,
				maxWidth: dataPointEO.indexLabelMaxWidth, maxHeight: dataPointEO.indexLabelWrap ? dataPointEO.indexLabelFontSize * 5 : dataPointEO.indexLabelFontSize * 1.5,
				text: dataPointEO.indexLabelText,
				padding: 0,
				//textBaseline: dataPointEO.indexLabelBackgroundColor ? "middle" : "top"
				textBaseline: "top"
			});

			dataPointEO.indexLabelTextBlock.measureText();

			//dataPoint.labelWidth = ctx.measureText(j.toString() + "; " + dataPoint.label).width;

			//console.log(dataPoint.label);
		}

		var noOfDPToRightOfSouthPole = 0;
		var noOfDPToLeftOfNorthPole = 0;
		var keepSameDirection = false; // once a dataPoint's hemisphere is changed, others should follow the same so that there are no labes near pole pointing in opposite direction.

		for (j = 0; j < dataPoints.length; j++) {

			var dataPointEO = dataPointEOs[(firstDPCloseToSouth + j) % dataPoints.length];

			if (noDPNearSouthPole > 1 && dataPointEO.midAngle > Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < Math.PI / 2 + poleAnglularDistance) {

				if (noOfDPToRightOfSouthPole <= noDPNearSouthPole / 2 && !keepSameDirection) {
					dataPointEO.hemisphere = "right";
					noOfDPToRightOfSouthPole++;
				} else {
					dataPointEO.hemisphere = "left";
					keepSameDirection = true;
				}
			}
		}

		keepSameDirection = false;
		for (j = 0; j < dataPoints.length; j++) {

			var dataPointEO = dataPointEOs[(firstDPCloseToNorth + j) % dataPoints.length];

			//if (dataPoint.hemisphere = "right")
			//	break;

			if (noDPNearNorthPole > 1 && dataPointEO.midAngle > 3 * Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < 3 * Math.PI / 2 + poleAnglularDistance) {

				if (noOfDPToLeftOfNorthPole <= noDPNearNorthPole / 2 && !keepSameDirection) {
					dataPointEO.hemisphere = "left";
					noOfDPToLeftOfNorthPole++;
				} else {
					dataPointEO.hemisphere = "right";
					keepSameDirection = true;
				}
			}
		}
	} //End of initLabels()

	function renderLabels() {

		var ctx = _this.plotArea.ctx;
		ctx.fillStyle = "black";
		ctx.strokeStyle = "grey";
		var fontSize = 16;
		//ctx.font = fontSize + "px Arial";
		ctx.textBaseline = "middle";
		ctx.lineJoin = "round";
		var i = 0,
		    j = 0;

		for (i = 0; i < dataPoints.length; i++) {
			var dataPointEO = dataPointEOs[i];

			if (!dataPointEO.indexLabelText) continue;

			dataPointEO.indexLabelTextBlock.y -= dataPointEO.indexLabelTextBlock.height / 2;

			var xOffset = 0;

			if (dataPointEO.hemisphere === "left") {
				var xOffset = dataSeries.indexLabelPlacement !== "inside" ? -(dataPointEO.indexLabelTextBlock.width + indexLabelLineEdgeLength) : -dataPointEO.indexLabelTextBlock.width / 2;
			} else {
				var xOffset = dataSeries.indexLabelPlacement !== "inside" ? indexLabelLineEdgeLength : -dataPointEO.indexLabelTextBlock.width / 2;
			}

			dataPointEO.indexLabelTextBlock.x += xOffset;
			dataPointEO.indexLabelTextBlock.render(true);
			dataPointEO.indexLabelTextBlock.x -= xOffset;

			//if (i < 4)
			//	customPrompt(i + "; " + center.y + "; " + dataPointEO.indexLabelTextBlock.y.toFixed(2));

			dataPointEO.indexLabelTextBlock.y += dataPointEO.indexLabelTextBlock.height / 2;

			if (dataPointEO.indexLabelPlacement !== "inside") {
				var indexLabelLineStartX = dataPointEO.center.x + outerRadius * Math.cos(dataPointEO.midAngle);
				var indexLabelLineStartY = dataPointEO.center.y + outerRadius * Math.sin(dataPointEO.midAngle);

				//ctx.strokeStyle = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				ctx.strokeStyle = dataPointEO.indexLabelLineColor;
				ctx.lineWidth = dataPointEO.indexLabelLineThickness;

				if (ctx.setLineDash) {
					ctx.setLineDash((0, _utils.getLineDashArray)(dataPointEO.indexLabelLineDashType, dataPointEO.indexLabelLineThickness));
				}

				//ctx.lineWidth = 4;
				ctx.beginPath();
				ctx.moveTo(indexLabelLineStartX, indexLabelLineStartY);
				ctx.lineTo(dataPointEO.indexLabelTextBlock.x, dataPointEO.indexLabelTextBlock.y);
				ctx.lineTo(dataPointEO.indexLabelTextBlock.x + (dataPointEO.hemisphere === "left" ? -indexLabelLineEdgeLength : indexLabelLineEdgeLength), dataPointEO.indexLabelTextBlock.y);
				ctx.stroke();
				//ctx.closePath();
				//window.alert("contine??");
				//animate();
			}

			ctx.lineJoin = "miter";
		}
	}

	function animate(fractionComplete) {

		var ctx = _this.plotArea.ctx;

		ctx.clearRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ctx.fillStyle = _this.backgroundColor;
		ctx.fillRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);

		var maxAngle = dataPointEOs[0].startAngle + 2 * Math.PI * fractionComplete;

		for (var i = 0; i < dataPoints.length; i++) {

			var startAngle = i === 0 ? dataPointEOs[i].startAngle : endAngle;
			var endAngle = startAngle + (dataPointEOs[i].endAngle - dataPointEOs[i].startAngle);

			var shouldBreak = false;

			if (endAngle > maxAngle) {
				endAngle = maxAngle;
				shouldBreak = true;
			}

			var color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];

			if (endAngle > startAngle) (0, _utils.drawSegment)(_this.plotArea.ctx, dataPointEOs[i].center, dataPointEOs[i].radius, color, dataSeries.type, startAngle, endAngle, dataSeries.fillOpacity, dataPointEOs[i].percentInnerRadius);

			if (shouldBreak) break;
		}
	}

	function explodeToggle(fractionComplete) {

		var ctx = _this.plotArea.ctx;

		ctx.clearRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ctx.fillStyle = _this.backgroundColor;
		ctx.fillRect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);

		for (var i = 0; i < dataPoints.length; i++) {

			var startAngle = dataPointEOs[i].startAngle;
			var endAngle = dataPointEOs[i].endAngle;

			if (endAngle > startAngle) {

				var offsetX = outerRadius * .07 * Math.cos(dataPointEOs[i].midAngle);
				var offsetY = outerRadius * .07 * Math.sin(dataPointEOs[i].midAngle);
				var isInTransition = false;

				if (dataPoints[i].exploded) {
					if (Math.abs(dataPointEOs[i].center.x - (center.x + offsetX)) > 0.000000001 || Math.abs(dataPointEOs[i].center.y - (center.y + offsetY)) > 0.000000001) {

						dataPointEOs[i].center.x = center.x + offsetX * fractionComplete;
						dataPointEOs[i].center.y = center.y + offsetY * fractionComplete;

						isInTransition = true;
					}
				} else if (Math.abs(dataPointEOs[i].center.x - center.x) > 0 || Math.abs(dataPointEOs[i].center.y - center.y) > 0) {
					dataPointEOs[i].center.x = center.x + offsetX * (1 - fractionComplete);
					dataPointEOs[i].center.y = center.y + offsetY * (1 - fractionComplete);

					isInTransition = true;
				}

				if (isInTransition) {
					var entry = {};
					entry.dataSeries = dataSeries;
					entry.dataPoint = dataSeries.dataPoints[i];
					entry.index = i;
					_this._toolTip.highlightObjects([entry]);
				}

				var color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];

				(0, _utils.drawSegment)(_this.plotArea.ctx, dataPointEOs[i].center, dataPointEOs[i].radius, color, dataSeries.type, startAngle, endAngle, dataSeries.fillOpacity, dataPointEOs[i].percentInnerRadius);
			}
		}

		//window.alert("next??");
		renderLabels();
	}

	function areDataPointsTooClose(first, second) {

		var label1 = {
			x1: first.indexLabelTextBlock.x, y1: first.indexLabelTextBlock.y - first.indexLabelTextBlock.height / 2, x2: first.indexLabelTextBlock.x + first.indexLabelTextBlock.width, y2: first.indexLabelTextBlock.y + first.indexLabelTextBlock.height / 2
		};
		var label2 = {
			x1: second.indexLabelTextBlock.x, y1: second.indexLabelTextBlock.y - second.indexLabelTextBlock.height / 2, x2: second.indexLabelTextBlock.x + second.indexLabelTextBlock.width, y2: second.indexLabelTextBlock.y + second.indexLabelTextBlock.height / 2
		};

		if (label1.x2 < label2.x1 - indexLabelLineEdgeLength || label1.x1 > label2.x2 + indexLabelLineEdgeLength || label1.y1 > label2.y2 + indexLabelLineEdgeLength || label1.y2 < label2.y1 - indexLabelLineEdgeLength) return false;

		return true;
	}

	function getVerticalDistanceBetweenLabels(first, second) {

		var distance = 0;
		var label1 = {
			y: first.indexLabelTextBlock.y, y1: first.indexLabelTextBlock.y - first.indexLabelTextBlock.height / 2, y2: first.indexLabelTextBlock.y + first.indexLabelTextBlock.height / 2
		};
		var label2 = {
			y: second.indexLabelTextBlock.y, y1: second.indexLabelTextBlock.y - second.indexLabelTextBlock.height / 2, y2: second.indexLabelTextBlock.y + second.indexLabelTextBlock.height / 2
		};

		if (label2.y > label1.y) {
			distance = label2.y1 - label1.y2;
		} else {
			distance = label1.y1 - label2.y2;
		}

		return distance;
	}

	function getNextLabelIndex(currentLabelIndex) {
		var nextLabelIndex = null;

		for (var i = 1; i < dataPoints.length; i++) {

			nextLabelIndex = (currentLabelIndex + i + dataPointEOs.length) % dataPointEOs.length;

			if (dataPointEOs[nextLabelIndex].hemisphere !== dataPointEOs[currentLabelIndex].hemisphere) {
				nextLabelIndex = null;
				break;
			} else if (dataPointEOs[nextLabelIndex].indexLabelText && nextLabelIndex !== currentLabelIndex && (getVerticalDistanceBetweenLabels(dataPointEOs[nextLabelIndex], dataPointEOs[currentLabelIndex]) < 0 || (dataPointEOs[currentLabelIndex].hemisphere === "right" ? dataPointEOs[nextLabelIndex].indexLabelTextBlock.y >= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y : dataPointEOs[nextLabelIndex].indexLabelTextBlock.y <= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y))) break;else {
				nextLabelIndex = null;
			}
		}

		return nextLabelIndex;
	}

	function getPreviousLabelIndex(currentLabelIndex) {
		var prevLabelIndex = null;

		for (var i = 1; i < dataPoints.length; i++) {

			prevLabelIndex = (currentLabelIndex - i + dataPointEOs.length) % dataPointEOs.length;

			if (dataPointEOs[prevLabelIndex].hemisphere !== dataPointEOs[currentLabelIndex].hemisphere) {
				prevLabelIndex = null;
				break;
			} else if (dataPointEOs[prevLabelIndex].indexLabelText && dataPointEOs[prevLabelIndex].hemisphere === dataPointEOs[currentLabelIndex].hemisphere && prevLabelIndex !== currentLabelIndex && (getVerticalDistanceBetweenLabels(dataPointEOs[prevLabelIndex], dataPointEOs[currentLabelIndex]) < 0 || (dataPointEOs[currentLabelIndex].hemisphere === "right" ? dataPointEOs[prevLabelIndex].indexLabelTextBlock.y <= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y : dataPointEOs[prevLabelIndex].indexLabelTextBlock.y >= dataPointEOs[currentLabelIndex].indexLabelTextBlock.y))) break;else {
				prevLabelIndex = null;
			}
		}

		return prevLabelIndex;
	}

	function rePositionLabels(dataPointIndex, offset) {
		offset = offset || 0;

		var actualOffset = 0;

		//var labelYMin = 2;
		//var labelYMax = ctx.canvas.height - 2;
		//var labelYMin = _this.plotArea.ctx.canvas.height / 2 - indexLabelRadius * 1;
		//var labelYMax = _this.plotArea.ctx.canvas.height / 2 + indexLabelRadius * 1;

		var labelYMin = center.y - indexLabelRadius * 1;
		var labelYMax = center.y + indexLabelRadius * 1;

		//console.log(totalRecursions);

		if (dataPointIndex >= 0 && dataPointIndex < dataPoints.length) {

			var dataPointEO = dataPointEOs[dataPointIndex];
			//if (dataPointIndex === 0)
			//	customPrompt(labelYMin.toFixed(2) + "; " + labelYMax.toFixed(2) + "; " + dataPointEO.indexLabelTextBlock.y.toFixed(2));

			// If label is already outside the bounds, return
			if (offset < 0 && dataPointEO.indexLabelTextBlock.y < labelYMin || offset > 0 && dataPointEO.indexLabelTextBlock.y > labelYMax) return 0;

			var validOffset = offset;

			//Check if the offset falls within the bounds (labelYMin, labelYMax, tangential bounds) without considering overlap. Else use the closest offset that is possible - validOffset.
			{
				var distFromIndexLineStart = 0;
				var indexLabelLineStartX = 0;
				var indexLabelLineStartY = 0;
				var indexLabelAngle = 0;
				var indexLabelAngleWhenTangent = 0;

				if (validOffset < 0) {
					if (dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 > labelYMin && dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 + validOffset < labelYMin) validOffset = -(labelYMin - (dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 + validOffset));
				} else {
					if (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 < labelYMin && dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + validOffset > labelYMax) validOffset = dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + validOffset - labelYMax;
				}

				var newlabelY = dataPointEO.indexLabelTextBlock.y + validOffset;
				var newlabelX = 0;

				if (dataPointEO.hemisphere === "right") {
					newlabelX = center.x + Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newlabelY - center.y, 2));
				} else newlabelX = center.x - Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newlabelY - center.y, 2));

				indexLabelLineStartX = center.x + outerRadius * Math.cos(dataPointEO.midAngle);
				indexLabelLineStartY = center.y + outerRadius * Math.sin(dataPointEO.midAngle);

				distFromIndexLineStart = Math.sqrt(Math.pow(newlabelX - indexLabelLineStartX, 2) + Math.pow(newlabelY - indexLabelLineStartY, 2));

				indexLabelAngleWhenTangent = Math.acos(outerRadius / indexLabelRadius);

				//indexLabelAngle = Math.acos((outerRadius * outerRadius + distFromIndexLineStart * distFromIndexLineStart - indexLabelRadius * indexLabelRadius) / (2 * outerRadius * distFromIndexLineStart));
				indexLabelAngle = Math.acos((indexLabelRadius * indexLabelRadius + outerRadius * outerRadius - distFromIndexLineStart * distFromIndexLineStart) / (2 * outerRadius * indexLabelRadius));

				if (indexLabelAngle < indexLabelAngleWhenTangent) {
					validOffset = newlabelY - dataPointEO.indexLabelTextBlock.y;
					//dataPointEO.indexLabelTextBlock.x = newlabelX;
				} else {

						validOffset = 0;

						//dataPointEO.indexLabelTextBlock.x = newlabelX;

						//Index Line is overlapping the pie. So lets find out the point where indexline becomes a tangent.

						//distFromIndexLineStart = Math.sqrt(indexLabelRadius * indexLabelRadius - outerRadius * outerRadius);
						////distFromIndexLineStart *= offset < 0 ? -1 : 1;
						////indexLabelAngle = Math.acos((indexLabelRadius * indexLabelRadius + outerRadius * outerRadius - distFromIndexLineStart * distFromIndexLineStart) / (2 * outerRadius * indexLabelRadius));
						//indexLabelAngle = Math.atan2(distFromIndexLineStart, outerRadius);

						//newlabelX = center.x + indexLabelRadius * Math.cos(indexLabelAngle);
						//newlabelY = center.y + indexLabelRadius * Math.sin(indexLabelAngle);

						//actualOffset = newlabelY - dataPointEO.indexLabelTextBlock.y;

						//dataPointEO.indexLabelTextBlock.y = newlabelY;
						//dataPointEO.indexLabelTextBlock.x = newlabelX;
					}
			}

			//var tempIndex = (dataPointIndex + dataPointEOs.length - 1) % dataPointEOs.length;

			//var prevDataPointIndex = dataPointEOs[tempIndex].hemisphere === dataPointEO.hemisphere ? tempIndex : null;

			var prevDataPointIndex = getPreviousLabelIndex(dataPointIndex);

			//tempIndex = (dataPointIndex + dataPointEOs.length + 1) % dataPointEOs.length;

			//var nextDataPointIndex = dataPointEOs[tempIndex].hemisphere === dataPointEO.hemisphere ? tempIndex : null;

			var nextDataPointIndex = getNextLabelIndex(dataPointIndex);

			var otherdataPointEO, otherDataPointIndex, distanceFromOtherLabel;
			var otherDataPointOffset = 0;
			var otherDataPointActualOffset = 0;

			if (validOffset < 0) {

				otherDataPointIndex = dataPointEO.hemisphere === "right" ? prevDataPointIndex : nextDataPointIndex;

				actualOffset = validOffset;

				if (otherDataPointIndex !== null) {

					//if (dataPointIndex < 4)
					//	customPrompt("valid: " + validOffset);

					var tempOffset = -validOffset;

					var distanceFromOtherLabel = dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 - (dataPointEOs[otherDataPointIndex].indexLabelTextBlock.y + dataPointEOs[otherDataPointIndex].indexLabelTextBlock.height / 2);

					if (distanceFromOtherLabel - tempOffset < minDistanceBetweenLabels) {
						otherDataPointOffset = -tempOffset;
						//totalRecursions++;
						otherDataPointActualOffset = rePositionLabels(otherDataPointIndex, otherDataPointOffset, recursionCount + 1);

						//if (dataPointIndex < 4)
						//	customPrompt(dataPointIndex + "; " + "offset: " + otherDataPointOffset);

						if (+otherDataPointActualOffset.toFixed(precision) > +otherDataPointOffset.toFixed(precision)) {

							if (distanceFromOtherLabel > minDistanceBetweenLabels) actualOffset = -(distanceFromOtherLabel - minDistanceBetweenLabels);
							//else
							//	actualOffset = 0;
							else actualOffset = -(tempOffset - (otherDataPointActualOffset - otherDataPointOffset));
						}

						//if (dataPointIndex < 4)
						//	customPrompt("actual: " + actualOffset);
					}
				}
			} else if (validOffset > 0) {

					otherDataPointIndex = dataPointEO.hemisphere === "right" ? nextDataPointIndex : prevDataPointIndex;

					actualOffset = validOffset;

					if (otherDataPointIndex !== null) {

						var tempOffset = validOffset;

						var distanceFromOtherLabel = dataPointEOs[otherDataPointIndex].indexLabelTextBlock.y - dataPointEOs[otherDataPointIndex].indexLabelTextBlock.height / 2 - (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2);

						if (distanceFromOtherLabel - tempOffset < minDistanceBetweenLabels) {
							otherDataPointOffset = tempOffset;
							//totalRecursions++;
							otherDataPointActualOffset = rePositionLabels(otherDataPointIndex, otherDataPointOffset, recursionCount + 1);

							if (+otherDataPointActualOffset.toFixed(precision) < +otherDataPointOffset.toFixed(precision)) {

								if (distanceFromOtherLabel > minDistanceBetweenLabels) actualOffset = distanceFromOtherLabel - minDistanceBetweenLabels;
								//else
								//	actualOffset = 0;
								else actualOffset = tempOffset - (otherDataPointOffset - otherDataPointActualOffset);
							}
						}
					}

					//if (!(dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + actualOffset < labelYMax)) {
					//	if (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 < labelYMax) {
					//		actualOffset = labelYMax - (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2);
					//	}
					//	else {
					//		actualOffset = 0;
					//	}
					//}
				}

			if (actualOffset) {

				var newLabelY = dataPointEO.indexLabelTextBlock.y + actualOffset;

				var newLabelX = 0;

				if (dataPointEO.hemisphere === "right") {
					newLabelX = center.x + Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newLabelY - center.y, 2));
				} else newLabelX = center.x - Math.sqrt(Math.pow(indexLabelRadius, 2) - Math.pow(newLabelY - center.y, 2));

				if (dataPointEO.midAngle > Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < Math.PI / 2 + poleAnglularDistance) {

					var prevDPIndex = (dataPointIndex - 1 + dataPointEOs.length) % dataPointEOs.length;
					var prevDP = dataPointEOs[prevDPIndex];
					var nextDP = dataPointEOs[(dataPointIndex + 1 + dataPointEOs.length) % dataPointEOs.length];

					if (dataPointEO.hemisphere === "left" && prevDP.hemisphere === "right" && newLabelX > prevDP.indexLabelTextBlock.x) {
						newLabelX = prevDP.indexLabelTextBlock.x - 15;
					} else if (dataPointEO.hemisphere === "right" && nextDP.hemisphere === "left" && newLabelX < nextDP.indexLabelTextBlock.x) {
						newLabelX = nextDP.indexLabelTextBlock.x + 15;
					}
				} else if (dataPointEO.midAngle > 3 * Math.PI / 2 - poleAnglularDistance && dataPointEO.midAngle < 3 * Math.PI / 2 + poleAnglularDistance) {

					var prevDPIndex = (dataPointIndex - 1 + dataPointEOs.length) % dataPointEOs.length;
					var prevDP = dataPointEOs[prevDPIndex];
					var nextDP = dataPointEOs[(dataPointIndex + 1 + dataPointEOs.length) % dataPointEOs.length];

					if (dataPointEO.hemisphere === "right" && prevDP.hemisphere === "left" && newLabelX < prevDP.indexLabelTextBlock.x) {
						newLabelX = prevDP.indexLabelTextBlock.x + 15;
					} else if (dataPointEO.hemisphere === "left" && nextDP.hemisphere === "right" && newLabelX > nextDP.indexLabelTextBlock.x) {
						newLabelX = nextDP.indexLabelTextBlock.x - 15;
					}
				}

				//if (actualOffset < 0 && dataPointIndex < 4)
				//	customPrompt(actualOffset.toFixed(2) + "; " + dataPointEO.indexLabelTextBlock.y.toFixed(2) + "; " + newLabelY.toFixed(2));

				dataPointEO.indexLabelTextBlock.y = newLabelY;

				dataPointEO.indexLabelTextBlock.x = newLabelX;

				dataPointEO.indexLabelAngle = Math.atan2(dataPointEO.indexLabelTextBlock.y - center.y, dataPointEO.indexLabelTextBlock.x - center.x);
			}
		}

		return actualOffset;
	}

	function positionLabels() {
		var ctx = _this.plotArea.ctx;

		ctx.fillStyle = "grey";
		ctx.strokeStyle = "grey";
		var fontSize = 16;
		ctx.font = fontSize + "px Arial";
		ctx.textBaseline = "middle";
		var i = 0,
		    j = 0;
		var deltaR = 0;

		var resizeFlag = true;

		var _loop = function _loop() {

			if (dataSeries.radius || !dataSeries.radius && typeof dataSeries.innerRadius !== 'undefined' && dataSeries.innerRadius !== null && outerRadius - deltaR <= innerRadius) resizeFlag = false;

			if (resizeFlag) outerRadius -= deltaR;

			deltaR = 0;

			if (dataSeries.indexLabelPlacement !== "inside") {
				indexLabelRadius = outerRadius * indexLabelRadiusToRadiusRatio;

				for (i = 0; i < dataPoints.length; i++) {
					dataPointEO = dataPointEOs[i];

					dataPointEO.indexLabelTextBlock.x = center.x + indexLabelRadius * Math.cos(dataPointEO.midAngle);
					dataPointEO.indexLabelTextBlock.y = center.y + indexLabelRadius * Math.sin(dataPointEO.midAngle);

					dataPointEO.indexLabelAngle = dataPointEO.midAngle;
					dataPointEO.radius = outerRadius;
					dataPointEO.percentInnerRadius = percentInnerRadius;
					//dataPointEO.indexLabelFontSize = dataPoint.indexLabelFontSize ? dataPoint.indexLabelFontSize : dataSeries.indexLabelFontSize;
				}

				for (i = 0; i < dataPoints.length; i++) {
					dataPointEO = dataPointEOs[i];
					//dataPointEO.lab
					//resetAnimationFrame();
					//animate();
					//renderLabels();

					//var prevDataPointIndex = (i - 1 + dataPointEOs.length) % dataPointEOs.length;

					//var nextDataPointIndex = (i + 1 + dataPointEOs.length) % dataPointEOs.length;
					//nextDataPointIndex = dataPointEOs[nextDataPointIndex].hemisphere === dataPointEO.hemisphere && nextDataPointIndex !== i ? nextDataPointIndex : null;

					nextDataPointIndex = getNextLabelIndex(i);

					if (nextDataPointIndex === null) continue;

					currentDataPoint = dataPointEOs[i];
					nextDataPoint = dataPointEOs[nextDataPointIndex];

					distanceFromNextLabel = 0;

					//if (dataPointEO.hemisphere === "right")
					//	distanceFromNextLabel = (nextDataPoint.indexLabelTextBlock.y - nextDataPoint.indexLabelTextBlock.height / 2) - (currentDataPoint.indexLabelTextBlock.y + currentDataPoint.indexLabelTextBlock.height / 2) - minDistanceBetweenLabels;
					//else
					//	distanceFromNextLabel = (currentDataPoint.indexLabelTextBlock.y - currentDataPoint.indexLabelTextBlock.height / 2) - (nextDataPoint.indexLabelTextBlock.y + nextDataPoint.indexLabelTextBlock.height / 2) - minDistanceBetweenLabels;

					distanceFromNextLabel = getVerticalDistanceBetweenLabels(currentDataPoint, nextDataPoint) - minDistanceBetweenLabels;

					if (distanceFromNextLabel < 0) {
						dataPointsAbove = 0;
						dataPointsBelow = 0;
						//var indexLabelAngleWhenTangent = Math.acos(outerRadius / indexLabelRadius) / Math.PI * 180;

						for (k = 0; k < dataPoints.length; k++) {

							if (k === i) continue;

							//if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere || Math.abs(dataPointEOs[k].midAngle - dataPointEO.midAngle) > 30)
							//	continue;
							//if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere || Math.abs(dataPointEOs[k].labelAngle - dataPointEO.indexLabelAngle) > 30)
							//	continue;
							//if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere || Math.abs(dataPointEOs[k].midAngle - dataPointEO.midAngle) > indexLabelAngleWhenTangent)
							//	continue;
							if (dataPointEOs[k].hemisphere !== dataPointEO.hemisphere) continue;

							if (dataPointEOs[k].indexLabelTextBlock.y < dataPointEO.indexLabelTextBlock.y) dataPointsAbove++;else dataPointsBelow++;
						}

						//var upWardsOffset = (distanceFromNextLabel) / dataPoints.length * (dataPointsBelow);
						upWardsOffset = distanceFromNextLabel / (dataPointsAbove + dataPointsBelow || 1) * dataPointsBelow;
						downWardsOffset = -1 * (distanceFromNextLabel - upWardsOffset);
						actualUpwardOffset = 0;
						actualDownwardOffset = 0;

						if (dataPointEO.hemisphere === "right") {
							actualUpwardOffset = rePositionLabels(i, upWardsOffset);

							//if (i < 4 && actualDownwardOffset !== upWardsOffset)
							//	customPrompt(i + "; " + upWardsOffset.toFixed(2) + "; " + actualUpwardOffset.toFixed(2));

							downWardsOffset = -1 * (distanceFromNextLabel - actualUpwardOffset);

							actualDownwardOffset = rePositionLabels(nextDataPointIndex, downWardsOffset);

							//window.alert(typeof +downWardsOffset.toFixed(precision));
							//Setting precision to make sure that they don't become not equal become of minor differences - like a difference of .000001
							if (+actualDownwardOffset.toFixed(precision) < +downWardsOffset.toFixed(precision) && +actualUpwardOffset.toFixed(precision) <= +upWardsOffset.toFixed(precision)) rePositionLabels(i, -(downWardsOffset - actualDownwardOffset));
						} else {
							actualUpwardOffset = rePositionLabels(nextDataPointIndex, upWardsOffset);

							downWardsOffset = -1 * (distanceFromNextLabel - actualUpwardOffset);

							actualDownwardOffset = rePositionLabels(i, downWardsOffset);

							//Setting precision to make sure that they don't become not equal become of minor differences - like a difference of .000001
							if (+actualDownwardOffset.toFixed(precision) < +downWardsOffset.toFixed(precision) && +actualUpwardOffset.toFixed(precision) <= +upWardsOffset.toFixed(precision)) rePositionLabels(nextDataPointIndex, -(downWardsOffset - actualDownwardOffset));
						}
					}

					//resetAnimationFrame();
					//animate();
					//renderLabels();
					//window.alert("next??");
				}
			} else {
					for (i = 0; i < dataPoints.length; i++) {
						dataPointEO = dataPointEOs[i];

						indexLabelRadius = dataSeries.type === "pie" ? outerRadius * .7 : outerRadius * .8;

						dx = center.x + indexLabelRadius * Math.cos(dataPointEO.midAngle);
						dy = center.y + indexLabelRadius * Math.sin(dataPointEO.midAngle);

						dataPointEO.indexLabelTextBlock.x = dx;
						dataPointEO.indexLabelTextBlock.y = dy;
					}
				}

			// Resize Pie based on the label length.
			for (i = 0; i < dataPoints.length; i++) {

				dataPointEO = dataPointEOs[i];

				size = dataPointEO.indexLabelTextBlock.measureText();
				// To make sure that null text or empty strings don't affect the radius. Required when user is not showing any labels

				if (size.height === 0 || size.width === 0) continue;

				xOverflow = 0;
				xdr = 0;

				if (dataPointEO.hemisphere === "right") {
					xOverflow = plotArea.x2 - (dataPointEO.indexLabelTextBlock.x + dataPointEO.indexLabelTextBlock.width + indexLabelLineEdgeLength);
					xOverflow *= -1;
				} else {
					xOverflow = plotArea.x1 - (dataPointEO.indexLabelTextBlock.x - dataPointEO.indexLabelTextBlock.width - indexLabelLineEdgeLength);
				}
				if (xOverflow > 0) {
					if (!resizeFlag && dataPointEO.indexLabelText) {
						newIndexLabelMaxWidth = dataPointEO.hemisphere === "right" ? plotArea.x2 - dataPointEO.indexLabelTextBlock.x : dataPointEO.indexLabelTextBlock.x - plotArea.x1;

						dataPointEO.indexLabelTextBlock.maxWidth * .3 > newIndexLabelMaxWidth ? dataPointEO.indexLabelText = "" : dataPointEO.indexLabelTextBlock.maxWidth = newIndexLabelMaxWidth * .85;
						if (dataPointEO.indexLabelTextBlock.maxWidth * .3 < newIndexLabelMaxWidth) dataPointEO.indexLabelTextBlock.x -= dataPointEO.hemisphere === "right" ? 2 : -2;
					}

					if (Math.abs(dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 - center.y) < outerRadius || Math.abs(dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 - center.y) < outerRadius) {

						xdr = xOverflow / Math.abs(Math.cos(dataPointEO.indexLabelAngle));

						if (xdr > 9) xdr = xdr * .3;

						if (xdr > deltaR) deltaR = xdr;
					}
				}

				yOverflow = 0;
				ydr = 0;

				if (dataPointEO.indexLabelAngle > 0 && dataPointEO.indexLabelAngle < Math.PI) {
					yOverflow = plotArea.y2 - (dataPointEO.indexLabelTextBlock.y + dataPointEO.indexLabelTextBlock.height / 2 + 5);
					yOverflow *= -1;
				} else {
					yOverflow = plotArea.y1 - (dataPointEO.indexLabelTextBlock.y - dataPointEO.indexLabelTextBlock.height / 2 - 5);
				}

				if (yOverflow > 0) {
					if (!resizeFlag && dataPointEO.indexLabelText) {
						positionMultiplier = dataPointEO.indexLabelAngle > 0 && dataPointEO.indexLabelAngle < Math.PI ? -1 : 1;

						if (rePositionLabels(i, yOverflow * positionMultiplier) === 0) rePositionLabels(i, 2 * positionMultiplier);
					}
					if (Math.abs(dataPointEO.indexLabelTextBlock.x - center.x) < outerRadius) {

						ydr = yOverflow / Math.abs(Math.sin(dataPointEO.indexLabelAngle));

						if (ydr > 9) ydr = ydr * .3;

						if (ydr > deltaR) deltaR = ydr;
					}
				}
			}

			function removeLabelsForSmallSegments(totalOverlap, startIndex, endIndex) {

				var dpEOs = [];
				var totalRemovedLabelHeight = 0;

				for (var i = startIndex; true; i = (i + 1 + dataPoints.length) % dataPoints.length) {
					dpEOs.push(dataPointEOs[i]);

					if (i === endIndex) break;
				}

				dpEOs.sort(function (entry1, entry2) {
					return entry1.y - entry2.y;
				});

				for (i = 0; i < dpEOs.length; i++) {
					var dpEO = dpEOs[i];

					if (totalRemovedLabelHeight < totalOverlap * .7) {
						totalRemovedLabelHeight += dpEO.indexLabelTextBlock.height;
						dpEO.indexLabelTextBlock.text = "";
						dpEO.indexLabelText = "";
						dpEO.indexLabelTextBlock.measureText();
					} else break;
				}
			}

			//resetAnimationFrame(1);
			//animate();
			//window.alert("next??");
			function skipLabels() {
				var overlapStartIndex = -1;
				var overlapEndIndex = -1;
				var totalOverlap = 0;
				var removeLabels = false;

				for (var k = 0; k < dataPoints.length; k++) {
					removeLabels = false;
					currentDataPoint = dataPointEOs[k];

					if (!currentDataPoint.indexLabelText) continue;

					var nextLabelIndex = getNextLabelIndex(k);
					if (nextLabelIndex === null) continue;

					var nextDataPoint = dataPointEOs[nextLabelIndex];

					distanceFromNextLabel = 0;

					//if (nextDataPoint.indexLabelTextBlock.y > currentDataPoint.indexLabelTextBlock.y)
					//	distanceFromNextLabel = (nextDataPoint.indexLabelTextBlock.y - (nextDataPoint.indexLabelTextBlock.height / 2)) - (currentDataPoint.indexLabelTextBlock.y + (currentDataPoint.indexLabelTextBlock.height / 2));
					//else
					//	distanceFromNextLabel = (currentDataPoint.indexLabelTextBlock.y - (currentDataPoint.indexLabelTextBlock.height / 2)) - (nextDataPoint.indexLabelTextBlock.y + (nextDataPoint.indexLabelTextBlock.height / 2));

					distanceFromNextLabel = getVerticalDistanceBetweenLabels(currentDataPoint, nextDataPoint);

					if (distanceFromNextLabel < 0 && areDataPointsTooClose(currentDataPoint, nextDataPoint)) {
						//if (distanceFromNextLabel < 0 && areDataPointsTooClose(currentDataPoint, nextDataPoint) ) {
						if (overlapStartIndex < 0) overlapStartIndex = k;

						if (nextLabelIndex !== overlapStartIndex) {
							overlapEndIndex = nextLabelIndex;

							totalOverlap += -distanceFromNextLabel;
						}

						if (k % Math.max(dataPoints.length / 10, 3) === 0) removeLabels = true;

						//nextDataPoint.indexLabelText = "";
						//nextDataPoint.indexLabelTextBlock.text = "";
						//nextDataPoint.indexLabelTextBlock.measureText();
					} else {

							removeLabels = true;
						}

					if (removeLabels) {

						if (totalOverlap > 0 && overlapStartIndex >= 0 && overlapEndIndex >= 0) {
							removeLabelsForSmallSegments(totalOverlap, overlapStartIndex, overlapEndIndex);

							overlapStartIndex = -1;
							overlapEndIndex = -1;
							totalOverlap = 0;
						}
					}
				}

				if (totalOverlap > 0) removeLabelsForSmallSegments(totalOverlap, overlapStartIndex, overlapEndIndex);
			}

			skipLabels();
		};

		for (j = 0; j < 10 && (j < 1 || deltaR > 0); j++) {
			var indexLabelRadius;
			var dataPointEO;
			var currentDataPoint, nextDataPoint;
			var dataPointEO;
			var nextDataPointIndex;
			var distanceFromNextLabel;
			var dataPointsAbove;
			var dataPointsBelow;
			var k;
			var upWardsOffset;
			var downWardsOffset;
			var actualUpwardOffset;
			var actualDownwardOffset;
			var dataPointEO;
			var dx;
			var dy;
			var size;
			var xOverflow;
			var xdr;
			var newIndexLabelMaxWidth;
			var yOverflow;
			var ydr;
			var positionMultiplier;

			_loop();
		}
		//window.alert("next??");

		//resetAnimationFrame(_this.animationEnabled && _this.renderCount === 0 ? isCanvasSupported ? 60 : 30 : 1);
		//animate();

		//console.log("totalRecursions: " + totalRecursions);
	}

	this.pieDoughnutClickHandler = function (e) {

		if (_this.isAnimating) {
			return;
		}

		var i = e.dataPointIndex;
		var dataPoint = e.dataPoint;
		var dataSeries = this;

		var id = dataSeries.dataPointIds[i];

		//dataPointEO = _this._eventManager.objectMap[id];

		if (dataPoint.exploded) dataPoint.exploded = false;else dataPoint.exploded = true;

		// So that it doesn't try to explode when there is only one segment
		if (dataSeries.dataPoints.length > 1) {
			_this._animator.animate(0, explodeDuration, function (fractionComplete) {

				explodeToggle(fractionComplete);
				renderChartElementsInPlotArea();
				//console.log("Explode Start");
			});
		}

		return;
	};

	initLabels();

	positionLabels();
	positionLabels();
	positionLabels();
	positionLabels();

	this.disableToolTip = true;
	this._animator.animate(0, this.animatedRender ? this.animationDuration : 0, function (fractionComplete) {

		animate(fractionComplete);
		renderChartElementsInPlotArea();
	}, function () {

		_this.disableToolTip = false;
		_this._animator.animate(0, _this.animatedRender ? explodeDuration : 0, function (fractionComplete) {

			explodeToggle(fractionComplete);
			renderChartElementsInPlotArea();
		});

		//console.log("Animation Complete");
	});

	function renderChartElementsInPlotArea() {

		_this.plotArea.layoutManager.reset();

		if (_this._title) {
			if (_this._title.dockInsidePlotArea || _this._title.horizontalAlign === "center" && _this._title.verticalAlign === "center") _this._title.render();
		}

		if (_this.subtitles) for (var i = 0; i < _this.subtitles.length; i++) {
			var subtitle = _this.subtitles[i];
			if (subtitle.dockInsidePlotArea || subtitle.horizontalAlign === "center" && subtitle.verticalAlign === "center") subtitle.render();
		}

		if (_this.legend) {
			if (_this.legend.dockInsidePlotArea || _this.legend.horizontalAlign === "center" && _this.legend.verticalAlign === "center") _this.legend.render();
		}
	}

	//this.ctx.strokeRect(plotArea.x1 + 1, plotArea.y1, plotArea.width - 2, plotArea.height);
};

var _text_block = require('../core/text_block');

var _text_block2 = _interopRequireDefault(_text_block);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../core/text_block":34,"../helpers/utils":39}],8:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var ghostCtx = this._eventManager.ghostCtx;

	var axisXProps = plotUnit.axisX.lineCoordinates;
	var axisYProps = plotUnit.axisY.lineCoordinates;
	var markers = [];

	var plotArea = this.plotArea;
	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var closingPath = [];

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];

		var dataPoints = dataSeries.dataPoints;

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};

		var hexColor = intToHexColorString(seriesId);
		ghostCtx.fillStyle = hexColor;
		//ghostCtx.lineWidth = dataSeries.lineThickness;
		//ghostCtx.lineWidth = 20;

		markers = [];

		var isFirstDataPointInPlotArea = true;
		var i = 0,
		    x,
		    y1,
		    y2;
		var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.

		var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
		var baseY;

		var startPoint = null;

		if (dataPoints.length > 0) {
			//ctx.strokeStyle = "#4572A7 ";
			var color = dataSeries._colorSet[i % dataSeries._colorSet.length];
			//ctx.strokeStyle = "red";
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			var prevDataNull = true;
			for (; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") {

					closeArea();

					prevDataNull = true;
					continue;
				}

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;

				y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
				y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				if (isFirstDataPointInPlotArea || prevDataNull) {
					ctx.beginPath();
					ctx.moveTo(x, y1);
					startPoint = {
						x: x, y: y1
					};
					closingPath = [];
					closingPath.push({ x: x, y: y2 });

					if (_utils.isCanvasSupported) {
						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y1);
					}

					isFirstDataPointInPlotArea = false;
					prevDataNull = false;
				} else {

					ctx.lineTo(x, y1);
					closingPath.push({ x: x, y: y2 });

					if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y1);

					if (i % 250 == 0) {
						closeArea();
					}
				}

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y1, y2: y2
				};

				//Render Marker
				if (dataPoints[i].markerSize !== 0) {
					if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) {
						var markerProps = dataSeries.getMarkerProperties(i, x, y2, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						var markerColor = intToHexColorString(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y2, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}

						markerProps = dataSeries.getMarkerProperties(i, x, y1, ctx);
						markers.push(markerProps);

						var markerColor = intToHexColorString(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y1, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "rangeArea",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 0,
						point: {
							x: x, y: y1
						},
						direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? -1 : 1,
						color: color
					});

					this._indexLabels.push({
						chartType: "rangeArea",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 1,
						point: {
							x: x, y: y2
						},
						direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? 1 : -1,
						color: color
					});
				}

				//alert("hi");
			}

			closeArea();

			//startPoint = { x: x, y: y };
			RenderHelper.drawMarkers(markers);
		}
	}

	ctx.restore();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	function closeArea() {

		if (!startPoint) return;

		var point = null;

		if (dataSeries.lineThickness > 0) ctx.stroke();

		for (var i = closingPath.length - 1; i >= 0; i--) {
			point = closingPath[i];
			ctx.lineTo(point.x, point.y);
			ghostCtx.lineTo(point.x, point.y);
		}

		ctx.closePath();
		//ctx.lineTo(startPoint.x, startPoint.y);

		ctx.globalAlpha = dataSeries.fillOpacity;
		ctx.fill();
		ctx.globalAlpha = 1;

		ghostCtx.fill();

		//if (isCanvasSupported) {
		//	ghostCtx.lineTo(x, baseY);
		//	ghostCtx.lineTo(startPoint.x, baseY);
		//	ghostCtx.closePath();
		//	ghostCtx.fill();
		//}

		if (dataSeries.lineThickness > 0) {
			ctx.beginPath();
			ctx.moveTo(point.x, point.y);
			for (var i = 0; i < closingPath.length; i++) {
				point = closingPath[i];
				ctx.lineTo(point.x, point.y);
			}

			ctx.stroke();
		}

		ctx.beginPath();
		ctx.moveTo(x, y1);
		ghostCtx.beginPath();
		ghostCtx.moveTo(x, y1);

		startPoint = {
			x: x, y: y1
		};
		closingPath = [];
		closingPath.push({ x: x, y: y2 });
	}

	//ctx.beginPath();
	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],9:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x1,
	    x2,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	//In case of Bar Chart, yZeroToPixel is x co-ordinate!
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.height * .15, this.plotArea.height / plotUnit.plotType.totalDataSeries * .9) << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	//var barWidth = (((plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum)) * Math.abs(xMinDiff)) / totalDataSeries * .9) << 0;

	var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < dataPoints.length; i++) {

				dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") continue;

				//x and y are pixel co-ordinates of point and should not be confused with X and Y values
				x1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
				x2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;

				var y1 = y - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0;
				var y2 = y1 + barWidth << 0;

				if (x1 > x2) {
					var temp = x1;
					x1 = x2;
					x2 = temp;
				}

				//drawRect(ctx, x1, y1, plotArea.x2, y2, "#EEEEEE", 0, null, false, false, false, false);
				//drawRect(ctx, x1, y1, plotArea.x2, y2, "#BDCED3", 0, null, false, false, false, false);

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				//color = "#1B4962";
				drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity);

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};
				color = intToHexColorString(id);

				if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "rangeBar",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 0,
						point: {
							x: dataPoints[i].y[1] >= dataPoints[i].y[0] ? x1 : x2, y: y1 + (y2 - y1) / 2
						},
						direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? -1 : 1,
						bounds: {
							x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2
						},
						color: color
					});

					this._indexLabels.push({
						chartType: "rangeBar",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 1,
						point: {
							x: dataPoints[i].y[1] >= dataPoints[i].y[0] ? x2 : x1, y: y1 + (y2 - y1) / 2
						},
						direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? 1 : -1,
						bounds: {
							x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.fadeInAnimation, easingFunction: AnimationHelper.easing.easeInQuad, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],10:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x,
	    y1,
	    y2;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .03;
	//var maxBarWidth = (this.width * .015);
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	//var barWidth = (((plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum)) * Math.abs(xMinDiff)) * .9) << 0;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.totalDataSeries * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth / plotUnit.plotType.totalDataSeries * .9;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}
	//ctx.beginPath();

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		// Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels.
		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		//var offsetX = barWidth * plotUnit.index << 0;

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			for (i = 0; i < dataPoints.length; i++) {

				dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
				y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				//var x1 = x - barWidth / 2 << 0;
				var x1 = x - plotUnit.plotType.totalDataSeries * barWidth / 2 + (plotUnit.previousDataSeriesCount + j) * barWidth << 0;
				var x2 = x1 + barWidth << 0;
				var y1;
				var y2;

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];

				if (y1 > y2) {
					var temp = y1;
					y1 = y2;
					y2 = temp;
				}

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};

				//var borderThickness = Math.max(1, (barWidth * .1 << 0));
				var borderThickness = 0;

				drawRect(ctx, x1, y1, x2, y2, color, borderThickness, color, bevelEnabled, bevelEnabled, false, false, dataSeries.fillOpacity);
				color = intToHexColorString(id);

				if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "rangeColumn",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 0,
						point: {
							x: x1 + (x2 - x1) / 2, y: dataPoints[i].y[1] >= dataPoints[i].y[0] ? y2 : y1
						},
						direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? -1 : 1,
						bounds: {
							x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2)
						},
						color: color
					});

					this._indexLabels.push({
						chartType: "rangeColumn",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 1,
						point: {
							x: x1 + (x2 - x1) / 2, y: dataPoints[i].y[1] >= dataPoints[i].y[0] ? y1 : y2
						},
						direction: dataPoints[i].y[1] >= dataPoints[i].y[0] ? 1 : -1,
						bounds: {
							x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2)
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.fadeInAnimation, easingFunction: AnimationHelper.easing.easeInQuad, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],11:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var ghostCtx = this._eventManager.ghostCtx;

	var axisXProps = plotUnit.axisX.lineCoordinates;
	var axisYProps = plotUnit.axisY.lineCoordinates;
	var markers = [];

	var plotArea = this.plotArea;
	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];

		var dataPoints = dataSeries.dataPoints;

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};

		var hexColor = intToHexColorString(seriesId);
		ghostCtx.fillStyle = hexColor;
		//ghostCtx.lineWidth = dataSeries.lineThickness;
		//ghostCtx.lineWidth = 20;

		markers = [];

		var isFirstDataPointInPlotArea = true;
		var i = 0,
		    x,
		    y1,
		    y2;
		var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.

		var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
		var baseY;

		var startPoint = null;

		var pixelsY1 = [];
		var pixelsY2 = [];

		if (dataPoints.length > 0) {
			//ctx.strokeStyle = "#4572A7 ";
			color = dataSeries._colorSet[i % dataSeries._colorSet.length];
			//ctx.strokeStyle = "red";
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			for (; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (dataPoints[i].y === null || !dataPoints[i].y.length || typeof dataPoints[i].y[0] !== "number" || typeof dataPoints[i].y[1] !== "number") {
					if (i > 0) {
						renderBezierArea();
						pixelsY1 = [];
						pixelsY2 = [];
					}
					continue;
				}

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y1 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[0] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
				y2 = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y[1] - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y1, y2: y2
				};

				pixelsY1[pixelsY1.length] = {
					x: x, y: y1
				};
				pixelsY2[pixelsY2.length] = {
					x: x, y: y2
				};

				//Render Marker
				if (dataPoints[i].markerSize !== 0) {
					if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) {
						var markerProps = dataSeries.getMarkerProperties(i, x, y1, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						var markerColor = intToHexColorString(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y1, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}

						var markerProps = dataSeries.getMarkerProperties(i, x, y2, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						var markerColor = intToHexColorString(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y2, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				//Render Index Labels
				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "splineArea",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 0,
						point: {
							x: x, y: y1
						},
						direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? -1 : 1,
						color: color
					});

					this._indexLabels.push({
						chartType: "splineArea",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						indexKeyword: 1,
						point: {
							x: x, y: y2
						},
						direction: dataPoints[i].y[0] <= dataPoints[i].y[1] ? 1 : -1,
						color: color
					});
				}
			}

			renderBezierArea();

			RenderHelper.drawMarkers(markers);
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	function renderBezierArea() {
		var bp = getBezierPoints(pixelsY1, 2);

		if (bp.length > 0) {
			ctx.beginPath();
			ctx.moveTo(bp[0].x, bp[0].y);

			if (_utils.isCanvasSupported) {
				ghostCtx.beginPath();
				ghostCtx.moveTo(bp[0].x, bp[0].y);
			}

			for (var i = 0; i < bp.length - 3; i += 3) {

				ctx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y);

				if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y);
			}

			if (dataSeries.lineThickness > 0) ctx.stroke();

			bp = getBezierPoints(pixelsY2, 2);

			ctx.lineTo(pixelsY2[pixelsY2.length - 1].x, pixelsY2[pixelsY2.length - 1].y);

			for (var i = bp.length - 1; i > 2; i -= 3) {

				ctx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y);

				if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y);
			}

			ctx.closePath();

			ctx.globalAlpha = dataSeries.fillOpacity;
			ctx.fill();
			ctx.globalAlpha = 1;

			if (dataSeries.lineThickness > 0) {
				ctx.beginPath();
				ctx.moveTo(pixelsY2[pixelsY2.length - 1].x, pixelsY2[pixelsY2.length - 1].y);

				for (var i = bp.length - 1; i > 2; i -= 3) {

					ctx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y);

					if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i - 1].x, bp[i - 1].y, bp[i - 2].x, bp[i - 2].y, bp[i - 3].x, bp[i - 3].y);
				}
				ctx.stroke();
			}

			ctx.beginPath();

			if (_utils.isCanvasSupported) {
				ghostCtx.closePath();
				ghostCtx.fill();
			}
		}
	}

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

//#region pieChart

var drawSegment = function drawSegment(ctx, center, radius, color, type, theta1, theta2, fillOpacity, percentInnerRadius) {

	if (typeof fillOpacity === "undefined") fillOpacity = 1;

	//IE8- FIX: In IE8- segment doesn't get draw if theta2 is equal to theta1 + 2*PI.
	if (!_utils.isCanvasSupported) {
		var theta2Mod = Number((theta2 % (2 * Math.PI)).toFixed(8));
		var theta1Mod = Number((theta1 % (2 * Math.PI)).toFixed(8));
		if (theta1Mod === theta2Mod) theta2 -= .0001;
	}

	ctx.save();
	ctx.globalAlpha = fillOpacity;

	if (type === "pie") {
		ctx.beginPath();
		ctx.moveTo(center.x, center.y);
		ctx.arc(center.x, center.y, radius, theta1, theta2, false);
		ctx.fillStyle = color;
		ctx.strokeStyle = "white";
		ctx.lineWidth = 2;
		//    ctx.shadowOffsetX = 2;
		//    ctx.shadowOffsetY = 1;
		//     ctx.shadowBlur = 2;
		//    ctx.shadowColor = '#BFBFBF';
		ctx.closePath();
		//ctx.stroke();
		ctx.fill();
	} else if (type === "doughnut") {
		ctx.beginPath();
		ctx.arc(center.x, center.y, radius, theta1, theta2, false);
		ctx.arc(center.x, center.y, percentInnerRadius * radius, theta2, theta1, true);
		ctx.closePath();
		ctx.fillStyle = color;
		ctx.strokeStyle = "white";
		ctx.lineWidth = 2;
		// shadow properties
		//     ctx.shadowOffsetX = 1;
		//    ctx.shadowOffsetY = 1;
		//     ctx.shadowBlur = 1;
		//    ctx.shadowColor = '#BFBFBF';  //grey shadow
		//ctx.stroke();
		ctx.fill();
	}

	ctx.globalAlpha = 1;

	ctx.restore();
};

},{"../helpers/utils":39}],12:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number from dataTime everytime it is used.

	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / totalDataSeries * .9 << 0;

	ctx.save();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		if (dataPoints.length == 1) barWidth = maxBarWidth;

		if (barWidth < 1) barWidth = 1;else if (barWidth > maxBarWidth) barWidth = maxBarWidth;

		if (dataPoints.length > 0) {
			//var bevelEnabled = (barWidth > 5) ? false : false;

			ctx.strokeStyle = "#4572A7 ";

			var maxArea = Math.pow(Math.min(plotArea.height, plotArea.width) * .3 / 2, 2) * Math.PI;

			var prevDataPointX = 0;
			var prevDataPointY = 0;

			for (var i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].getTime ? dataPointX = dataPoints[i].x.getTime() : dataPointX = dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);

				ctx.globalAlpha = dataSeries.fillOpacity;
				_render2.default.drawMarker(markerProps.x, markerProps.y, markerProps.ctx, markerProps.type, markerProps.size, markerProps.color, markerProps.borderColor, markerProps.borderThickness);
				ctx.globalAlpha = 1;

				//if (Math.abs(prevDataPointX - x) < markerProps.size / 2 && Math.abs(prevDataPointY - y) < markerProps.size / 2) {
				//    continue;
				//}

				//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
				//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
				//}

				if (Math.sqrt((prevDataPointX - x) * (prevDataPointX - x) + (prevDataPointY - y) * (prevDataPointY - y)) < Math.min(markerProps.size, 5) && dataPoints.length > Math.min(this.plotArea.width, this.plotArea.height)) {
					continue;
				}

				//Render ID on Ghost Canvas - for event handling
				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y
				};
				var markerColor = (0, _utils.intToHexColorString)(id);

				if (_utils.isCanvasSupported) {
					_render2.default.drawMarker(markerProps.x, markerProps.y, this._eventManager.ghostCtx, markerProps.type, markerProps.size, markerColor, markerColor, markerProps.borderThickness);
				}
				//markers.push();

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "scatter",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: 1,
						bounds: {
							x1: x - markerProps.size / 2, y1: y - markerProps.size / 2, x2: x + markerProps.size / 2, y2: y + markerProps.size / 2
						},
						color: color
					});
				}

				prevDataPointX = x;
				prevDataPointY = y;
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.fadeInAnimation, easingFunction: _animator2.default.easing.easeInQuad, animationBase: 0
	};
	return animationInfo;
};

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],13:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;
	if (totalDataSeries <= 0) return;

	var ghostCtx = this._eventManager.ghostCtx;

	ctx.save();

	var plotArea = this.plotArea;

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	var markers = [];

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		ctx.lineWidth = dataSeries.lineThickness;
		var dataPoints = dataSeries.dataPoints;

		if (ctx.setLineDash) {
			ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness));
		}

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};
		var hexColor = intToHexColorString(seriesId);
		ghostCtx.strokeStyle = hexColor;
		//ghostCtx.lineWidth = dataSeries.lineThickness;
		ghostCtx.lineWidth = dataSeries.lineThickness > 0 ? Math.max(dataSeries.lineThickness, 4) : 0;

		var colorSet = dataSeries._colorSet;
		var color = colorSet[0];
		ctx.strokeStyle = color;

		var isFirstDataPointInPlotArea = true;
		var i = 0,
		    x,
		    y;
		var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.

		//if (!dataSeries._options.markerSize && dataSeries.dataPoints.length < 1000)
		//    dataSeries.markerSize = 8;

		var pixels = [];

		ctx.beginPath();
		if (dataPoints.length > 0) {

			for (i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) continue;

				//if (!isFinite(dataPoints[i].y))
				//    continue;

				if (typeof dataPoints[i].y !== "number") {
					if (i > 0) {
						// if first dataPoint is null then no need to call stroke method
						renderBezier(pixels);
						pixels = [];
					}

					continue;
				}

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y
				};

				pixels[pixels.length] = {
					x: x, y: y
				};

				//Add Markers
				if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) {

					var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);
					markers.push(markerProps);

					//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
					//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
					//}

					var markerColor = intToHexColorString(id);

					//window.console.log("index: " + i + "; id: " + id + "; hex: " + markerColor);
					if (_utils.isCanvasSupported) {
						markers.push({
							x: x, y: y, ctx: ghostCtx,
							type: markerProps.type,
							size: markerProps.size,
							color: markerColor,
							borderColor: markerColor,
							borderThickness: markerProps.borderThickness
						});
					}
				}

				//Add Labels
				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "spline",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						color: color
					});
				}
			}
		}

		renderBezier(pixels);
	}

	RenderHelper.drawMarkers(markers);
	ctx.restore();

	ctx.beginPath();

	if (_utils.isCanvasSupported) ghostCtx.beginPath();

	function renderBezier(pixels) {

		var bp = getBezierPoints(pixels, 2);

		if (bp.length > 0) {
			ctx.beginPath();
			if (_utils.isCanvasSupported) ghostCtx.beginPath();

			ctx.moveTo(bp[0].x, bp[0].y);
			if (_utils.isCanvasSupported) ghostCtx.moveTo(bp[0].x, bp[0].y);

			for (var i = 0; i < bp.length - 3; i += 3) {

				ctx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y);

				if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y);

				if (i > 0 && i % 3000 === 0) {
					ctx.stroke();
					ctx.beginPath();
					ctx.moveTo(bp[i + 3].x, bp[i + 3].y);

					if (_utils.isCanvasSupported) {
						ghostCtx.stroke();
						ghostCtx.beginPath();
						ghostCtx.moveTo(bp[i + 3].x, bp[i + 3].y);
					}
				}
			}

			ctx.stroke();

			if (_utils.isCanvasSupported) ghostCtx.stroke();
		}
	}

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

var drawRect = function drawRect(ctx, x1, y1, x2, y2, color, borderThickness, borderColor, top, bottom, left, right, fillOpacity) {
	if (typeof fillOpacity === "undefined") fillOpacity = 1;

	borderThickness = borderThickness || 0;
	borderColor = borderColor || "black";
	//alert("top"+ top + "bottom" + bottom + " lt" + left+ "rt" + right )
	var a1 = x1,
	    a2 = x2,
	    b1 = y1,
	    b2 = y2,
	    edgeY,
	    edgeX;
	if (x2 - x1 > 15 && y2 - y1 > 15) var bevelDepth = 8;else var bevelDepth = 0.35 * Math.min(x2 - x1, y2 - y1);
	//alert(a1 + "" + a2);
	var color2 = "rgba(255, 255, 255, .4)";
	var color3 = "rgba(255, 255, 255, 0.1)";
	//color1 = "rgba(" + r + "," + g + ", " + b + ",1)";
	var color1 = color;

	ctx.beginPath();
	ctx.moveTo(x1, y1);
	ctx.save();
	ctx.fillStyle = color1;

	ctx.globalAlpha = fillOpacity;
	ctx.fillRect(x1, y1, x2 - x1, y2 - y1);
	ctx.globalAlpha = 1;

	if (borderThickness > 0) {
		var offset = borderThickness % 2 === 0 ? 0 : .5;
		ctx.beginPath();
		ctx.lineWidth = borderThickness;
		ctx.strokeStyle = borderColor;
		ctx.moveTo(x1, y1);
		ctx.rect(x1 - offset, y1 - offset, x2 - x1 + 2 * offset, y2 - y1 + 2 * offset);
		ctx.stroke();
	}

	ctx.restore();
	//   ctx.beginPath();
	if (top === true) {
		// alert(x1 + "" + x2 + " " + bevelDepth);
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x1, y1);
		ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x2, y1);
		ctx.closePath();
		var grd = ctx.createLinearGradient((x2 + x1) / 2, b1 + bevelDepth, (x2 + x1) / 2, b1);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color2);
		ctx.fillStyle = grd;
		ctx.fill();
		//              ctx.stroke();
		ctx.restore();
	}

	if (bottom === true) {
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x1, y2);
		ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x2, y2);
		ctx.closePath();
		var grd = ctx.createLinearGradient((x2 + x1) / 2, b2 - bevelDepth, (x2 + x1) / 2, b2);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color2);
		ctx.fillStyle = grd;
		//       ctx.stroke();
		ctx.fill();
		ctx.restore();
	}

	if (left === true) {
		//   alert(x1)
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x1, y1);
		ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x1, y2);
		ctx.closePath();
		var grd = ctx.createLinearGradient(a1 + bevelDepth, (y2 + y1) / 2, a1, (y2 + y1) / 2);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color3);
		ctx.fillStyle = grd;
		ctx.fill();
		//     ctx.stroke();
		ctx.restore();
	}

	if (right === true) {
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x2, y1);
		ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x2, y2);
		var grd = ctx.createLinearGradient(a2 - bevelDepth, (y2 + y1) / 2, a2, (y2 + y1) / 2);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color3);
		ctx.fillStyle = grd;
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color3);
		ctx.fillStyle = grd;
		ctx.fill();
		ctx.closePath();
		//          ctx.stroke();
		ctx.restore();
	}
	//
};

},{"../helpers/utils":39}],14:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var ghostCtx = this._eventManager.ghostCtx;

	var axisXProps = plotUnit.axisX.lineCoordinates;
	var axisYProps = plotUnit.axisY.lineCoordinates;
	var markers = [];

	var plotArea = this.plotArea;
	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];

		var dataPoints = dataSeries.dataPoints;

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};

		var hexColor = intToHexColorString(seriesId);
		ghostCtx.fillStyle = hexColor;
		//ghostCtx.lineWidth = dataSeries.lineThickness;
		//ghostCtx.lineWidth = 20;

		markers = [];

		var isFirstDataPointInPlotArea = true;
		var i = 0,
		    x,
		    y;
		var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.

		var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
		var baseY;

		var startPoint = null;

		var pixels = [];

		if (dataPoints.length > 0) {
			//ctx.strokeStyle = "#4572A7 ";
			color = dataSeries._colorSet[i % dataSeries._colorSet.length];
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			for (; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") {
					if (i > 0) {
						renderBezierArea();
						pixels = [];
					}
					continue;
				}

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y
				};

				pixels[pixels.length] = {
					x: x, y: y
				};

				//Render Marker
				if (dataPoints[i].markerSize !== 0) {
					if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) {
						var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						var markerColor = intToHexColorString(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				//Render Index Labels
				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "splineArea",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						color: color
					});
				}
			}

			renderBezierArea();

			RenderHelper.drawMarkers(markers);
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	function renderBezierArea() {
		var bp = getBezierPoints(pixels, 2);

		if (bp.length > 0) {
			ctx.beginPath();
			ctx.moveTo(bp[0].x, bp[0].y);

			if (_utils.isCanvasSupported) {
				ghostCtx.beginPath();
				ghostCtx.moveTo(bp[0].x, bp[0].y);
			}

			for (var i = 0; i < bp.length - 3; i += 3) {

				ctx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y);

				if (_utils.isCanvasSupported) ghostCtx.bezierCurveTo(bp[i + 1].x, bp[i + 1].y, bp[i + 2].x, bp[i + 2].y, bp[i + 3].x, bp[i + 3].y);
			}

			if (dataSeries.lineThickness > 0) ctx.stroke();

			if (plotUnit.axisY.viewportMinimum <= 0 && plotUnit.axisY.viewportMaximum >= 0) {
				baseY = yZeroToPixel;
			} else if (plotUnit.axisY.viewportMaximum < 0) baseY = axisYProps.y1;else if (plotUnit.axisY.viewportMinimum > 0) baseY = axisXProps.y2;

			startPoint = {
				x: bp[0].x, y: bp[0].y
			};

			ctx.lineTo(bp[bp.length - 1].x, baseY);
			ctx.lineTo(startPoint.x, baseY);
			ctx.closePath();

			ctx.globalAlpha = dataSeries.fillOpacity;
			ctx.fill();
			ctx.globalAlpha = 1;

			if (_utils.isCanvasSupported) {
				ghostCtx.lineTo(bp[bp.length - 1].x, baseY);
				ghostCtx.lineTo(startPoint.x, baseY);
				ghostCtx.closePath();
				ghostCtx.fill();
			}
		}
	}

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],15:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;
	var markers = [];

	var plotArea = this.plotArea;

	var offsetY = [];

	var allXValues = [];
	//var offsetNegativeY = [];

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed.

	//var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0;
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;

	var ghostCtx = this._eventManager.ghostCtx;

	if (_utils.isCanvasSupported) ghostCtx.beginPath();

	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	var xValuePresent = [];
	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];
		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var xValue;

		dataSeries.dataPointIndexes = [];

		for (i = 0; i < dataPoints.length; i++) {
			xValue = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;
			dataSeries.dataPointIndexes[xValue] = i;

			if (!xValuePresent[xValue]) {
				allXValues.push(xValue);
				xValuePresent[xValue] = true;
			}
		}

		allXValues.sort(_utils.compareNumbers);
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		var currentBaseValues = [];

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};
		var hexColor = (0, _utils.intToHexColorString)(seriesId);
		ghostCtx.fillStyle = hexColor;

		if (allXValues.length > 0) {

			color = dataSeries._colorSet[0];
			//ctx.strokeStyle = "red";
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash((0, _utils.getLineDashArray)(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			for (i = 0; i < allXValues.length; i++) {

				dataPointX = allXValues[i];
				var dataPoint = null;

				if (dataSeries.dataPointIndexes[dataPointX] >= 0) dataPoint = dataPoints[dataSeries.dataPointIndexes[dataPointX]];else dataPoint = {
					x: dataPointX, y: 0
				};

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoint.y !== "number") continue;

				var x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				//var y = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoint.y - plotUnit.axisY.conversionParameters.minimum) + .5) << 0;
				var y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoint.y - plotUnit.axisY.conversionParameters.minimum);

				var offset = offsetY[dataPointX] ? offsetY[dataPointX] : 0;

				y = y - offset;
				currentBaseValues.push({ x: x, y: yZeroToPixel - offset });
				offsetY[dataPointX] = yZeroToPixel - y;

				if (isFirstDataPointInPlotArea) {
					ctx.beginPath();
					ctx.moveTo(x, y);

					if (_utils.isCanvasSupported) {
						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y);
					}

					isFirstDataPointInPlotArea = false;
				} else {

					ctx.lineTo(x, y);

					if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y);

					if (i % 250 == 0) {

						if (dataSeries.lineThickness > 0) ctx.stroke();

						while (currentBaseValues.length > 0) {
							var point = currentBaseValues.pop();
							ctx.lineTo(point.x, point.y);

							if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y);
						}

						ctx.closePath();

						ctx.globalAlpha = dataSeries.fillOpacity;
						ctx.fill();
						ctx.globalAlpha = 1;

						ctx.beginPath();
						ctx.moveTo(x, y);

						if (_utils.isCanvasSupported) {
							ghostCtx.closePath();
							ghostCtx.fill();

							ghostCtx.beginPath();
							ghostCtx.moveTo(x, y);
						}

						currentBaseValues.push({ x: x, y: yZeroToPixel - offset });
					}
				}

				if (dataSeries.dataPointIndexes[dataPointX] >= 0) {
					var id = dataSeries.dataPointIds[dataSeries.dataPointIndexes[dataPointX]];
					this._eventManager.objectMap[id] = {
						id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: dataSeries.dataPointIndexes[dataPointX], x1: x, y1: y
					};
				}

				//Render Marker
				if (dataSeries.dataPointIndexes[dataPointX] >= 0 && dataPoint.markerSize !== 0) {
					if (dataPoint.markerSize > 0 || dataSeries.markerSize > 0) {

						var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						markerColor = (0, _utils.intToHexColorString)(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				if (dataPoint.indexLabel || dataSeries.indexLabel || dataPoint.indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "stackedArea",
						dataPoint: dataPoint,
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						color: color
					});
				}
			}

			if (dataSeries.lineThickness > 0) ctx.stroke();

			while (currentBaseValues.length > 0) {
				var point = currentBaseValues.pop();
				ctx.lineTo(point.x, point.y);

				if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y);
			}

			ctx.closePath();

			ctx.globalAlpha = dataSeries.fillOpacity;
			ctx.fill();
			ctx.globalAlpha = 1;

			ctx.beginPath();
			ctx.moveTo(x, y);

			if (_utils.isCanvasSupported) {
				ghostCtx.closePath();
				ghostCtx.fill();
				ghostCtx.beginPath();
				ghostCtx.moveTo(x, y);
			}
		}

		delete dataSeries.dataPointIndexes;
	}

	_render2.default.drawMarkers(markers);

	ctx.restore();

	if (_utils.isCanvasSupported) ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xClipAnimation, easingFunction: _animator2.default.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],16:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;
	var markers = [];

	var offsetY = [];

	var allXValues = [];
	//var offsetNegativeY = [];

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed.

	//var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0;
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) * .9 << 0;

	var ghostCtx = this._eventManager.ghostCtx;

	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	var xValuePresent = [];
	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];
		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var xValue;

		dataSeries.dataPointIndexes = [];

		for (i = 0; i < dataPoints.length; i++) {
			xValue = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;
			dataSeries.dataPointIndexes[xValue] = i;

			if (!xValuePresent[xValue]) {
				allXValues.push(xValue);
				xValuePresent[xValue] = true;
			}
		}

		allXValues.sort(_utils.compareNumbers);
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};
		var hexColor = (0, _utils.intToHexColorString)(seriesId);
		ghostCtx.fillStyle = hexColor;

		if (dataPoints.length == 1) barWidth = maxBarWidth;

		if (barWidth < 1) barWidth = 1;else if (barWidth > maxBarWidth) barWidth = maxBarWidth;

		var currentBaseValues = [];

		if (allXValues.length > 0) {

			color = dataSeries._colorSet[i % dataSeries._colorSet.length];
			//ctx.strokeStyle = "red";
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash((0, _utils.getLineDashArray)(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			var bevelEnabled = barWidth > 5 ? false : false;

			//ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < allXValues.length; i++) {

				dataPointX = allXValues[i];
				var dataPoint = null;

				if (dataSeries.dataPointIndexes[dataPointX] >= 0) dataPoint = dataPoints[dataSeries.dataPointIndexes[dataPointX]];else dataPoint = {
					x: dataPointX, y: 0
				};

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoint.y !== "number") continue;

				var yPercent;
				if (plotUnit.dataPointYSums[dataPointX] !== 0) yPercent = dataPoint.y / plotUnit.dataPointYSums[dataPointX] * 100;else yPercent = 0;

				var x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				var y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum);

				var offset = offsetY[dataPointX] ? offsetY[dataPointX] : 0;

				y = y - offset;
				currentBaseValues.push({ x: x, y: yZeroToPixel - offset });
				offsetY[dataPointX] = yZeroToPixel - y;

				if (isFirstDataPointInPlotArea) {
					ctx.beginPath();
					ctx.moveTo(x, y);

					if (_utils.isCanvasSupported) {
						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y);
					}

					isFirstDataPointInPlotArea = false;
				} else {

					ctx.lineTo(x, y);

					if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y);

					if (i % 250 == 0) {

						if (dataSeries.lineThickness > 0) ctx.stroke();

						while (currentBaseValues.length > 0) {
							var point = currentBaseValues.pop();
							ctx.lineTo(point.x, point.y);

							if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y);
						}

						ctx.closePath();

						ctx.globalAlpha = dataSeries.fillOpacity;
						ctx.fill();
						ctx.globalAlpha = 1;

						ctx.beginPath();
						ctx.moveTo(x, y);

						if (_utils.isCanvasSupported) {
							ghostCtx.closePath();
							ghostCtx.fill();
							ghostCtx.beginPath();
							ghostCtx.moveTo(x, y);
						}

						currentBaseValues.push({ x: x, y: yZeroToPixel - offset });
					}
				}

				if (dataSeries.dataPointIndexes[dataPointX] >= 0) {
					var id = dataSeries.dataPointIds[dataSeries.dataPointIndexes[dataPointX]];
					this._eventManager.objectMap[id] = {
						id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: dataSeries.dataPointIndexes[dataPointX], x1: x, y1: y
					};
				}

				//Render Marker
				if (dataSeries.dataPointIndexes[dataPointX] >= 0 && dataPoint.markerSize !== 0) {
					if (dataPoint.markerSize > 0 || dataSeries.markerSize > 0) {
						var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						markerColor = (0, _utils.intToHexColorString)(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				if (dataPoint.indexLabel || dataSeries.indexLabel || dataPoint.indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "stackedArea100",
						dataPoint: dataPoint,
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						color: color
					});
				}
			}

			if (dataSeries.lineThickness > 0) ctx.stroke();

			while (currentBaseValues.length > 0) {
				var point = currentBaseValues.pop();
				ctx.lineTo(point.x, point.y);

				if (_utils.isCanvasSupported) ghostCtx.lineTo(point.x, point.y);
			}

			ctx.closePath();

			ctx.globalAlpha = dataSeries.fillOpacity;
			ctx.fill();
			ctx.globalAlpha = 1;

			ctx.beginPath();
			ctx.moveTo(x, y);

			if (_utils.isCanvasSupported) {
				ghostCtx.closePath();
				ghostCtx.fill();
				ghostCtx.beginPath();
				ghostCtx.moveTo(x, y);
			}
		}

		delete dataSeries.dataPointIndexes;
	}

	_render2.default.drawMarkers(markers);

	ctx.restore();

	if (_utils.isCanvasSupported) ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: _animator2.default.xClipAnimation, easingFunction: _animator2.default.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

},{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39}],17:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var offsetPositiveY = [];
	var offsetNegativeY = [];

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed.

	//var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0;
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.height * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				//x = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5) << 0;
				x = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum);

				//var x1 = x - (plotUnit.plotType.plotUnits.length * barWidth / 2) + (plotUnit.index * barWidth) << 0;

				var y1 = y - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0;
				var y2 = y1 + barWidth << 0;
				var x1;
				var x2;

				if (dataPoints[i].y >= 0) {
					var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0;

					x1 = yZeroToPixel + offset;
					x2 = x + offset;

					offsetPositiveY[dataPointX] = offset + (x2 - x1);
				} else {
					var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0;

					x1 = x - offset;
					x2 = yZeroToPixel - offset;

					offsetNegativeY[dataPointX] = offset + (x2 - x1);
				}

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity);

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};
				color = intToHexColorString(id);

				if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) this._indexLabels.push({
					chartType: "stackedBar",
					dataPoint: dataPoints[i],
					dataSeries: dataSeries,
					point: {
						x: dataPoints[i].y >= 0 ? x2 : x1, y: y
					},
					direction: dataPoints[i].y >= 0 ? 1 : -1,
					bounds: {
						x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2
					},
					color: color
				});
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationBase = Math.max(yZeroToPixel, plotUnit.axisX.boundingRect.x2);
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],18:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var offsetPositiveY = [];
	var offsetNegativeY = [];

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed.

	//var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0;
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.height * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.height / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				y = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;

				var yPercent;
				if (plotUnit.dataPointYSums[dataPointX] !== 0) yPercent = dataPoints[i].y / plotUnit.dataPointYSums[dataPointX] * 100;else yPercent = 0;

				//x = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum) + .5) << 0;
				x = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum);

				var y1 = y - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0;
				var y2 = y1 + barWidth << 0;
				var x1;
				var x2;

				if (dataPoints[i].y >= 0) {
					var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0;

					x1 = yZeroToPixel + offset;
					x2 = x + offset;

					offsetPositiveY[dataPointX] = offset + (x2 - x1);
				} else {
					var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0;

					x1 = x - offset;
					x2 = yZeroToPixel - offset;

					offsetNegativeY[dataPointX] = offset + (x2 - x1);
				}

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled, false, false, false, dataSeries.fillOpacity);

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};
				color = intToHexColorString(id);

				if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) this._indexLabels.push({
					chartType: "stackedBar100",
					dataPoint: dataPoints[i],
					dataSeries: dataSeries,
					point: {
						x: dataPoints[i].y >= 0 ? x2 : x1, y: y
					},
					direction: dataPoints[i].y >= 0 ? 1 : -1,
					bounds: {
						x1: Math.min(x1, x2), y1: y1, x2: Math.max(x1, x2), y2: y2
					},
					color: color
				});
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationBase = Math.max(yZeroToPixel, plotUnit.axisX.boundingRect.x2);
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],19:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {

	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var offsetPositiveY = [];
	var offsetNegativeY = [];

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed.

	//var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0;
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];
		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		// Reducing pixelPerUnit by 1 just to overcome any problems due to rounding off of pixels.
		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum);

				var x1 = x - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0;
				var x2 = x1 + barWidth << 0;
				var y1;
				var y2;

				if (dataPoints[i].y >= 0) {
					var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0;

					y1 = y - offset;
					y2 = yZeroToPixel - offset;

					offsetPositiveY[dataPointX] = offset + (y2 - y1);
				} else {
					var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0;

					y2 = y + offset;
					y1 = yZeroToPixel + offset;

					offsetNegativeY[dataPointX] = offset + (y2 - y1);
				}

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];

				drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled && dataPoints[i].y >= 0, dataPoints[i].y < 0 && bevelEnabled, false, false, dataSeries.fillOpacity);

				//if (dataSeries.markerType && dataSeries.markerSize > 0) {
				//    RenderHelper.drawMarker(x1 + (x2 - x1)/2, y1, ctx, dataSeries.markerType, dataSeries.markerSize, color, dataSeries.markerBorderColor, dataSeries.markerBorderThickness ? dataSeries.markerBorderThickness : 1);
				//}

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};
				color = intToHexColorString(id);

				if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "stackedColumn",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: dataPoints[i].y >= 0 ? y1 : y2
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						bounds: {
							x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2)
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationBase = Math.min(yZeroToPixel, plotUnit.axisY.boundingRect.y2);
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.yScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],20:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;
	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var color = null;

	var plotArea = this.plotArea;

	var offsetPositiveY = [];
	var offsetNegativeY = [];

	var i = 0,
	    x,
	    y;
	var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number everytime it is accessed.

	//var yZeroToPixel = (axisYProps.y2 - axisYProps.height / rangeY * Math.abs(0 - plotUnit.axisY.viewportMinimum) + .5) << 0;
	var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) << 0;

	var maxBarWidth = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0;
	var xMinDiff = plotUnit.axisX.dataInfo.minDiff;
	var barWidth = plotArea.width / Math.abs(plotUnit.axisX.viewportMaximum - plotUnit.axisX.viewportMinimum) * Math.abs(xMinDiff) / plotUnit.plotType.plotUnits.length * .9 << 0;

	if (barWidth > maxBarWidth) barWidth = maxBarWidth;else if (xMinDiff === Infinity) {
		barWidth = maxBarWidth;
	} else if (barWidth < 1) barWidth = 1;

	ctx.save();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		this._eventManager.ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		this._eventManager.ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];
		var dataPoints = dataSeries.dataPoints;
		var isFirstDataPointInPlotArea = true;

		//dataSeries.maxWidthInX = barWidth / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);

		if (dataPoints.length > 0) {
			//var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);

			var bevelEnabled = barWidth > 5 && dataSeries.bevelEnabled ? true : false;

			//ctx.strokeStyle = "#4572A7 ";

			for (i = 0; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				if (typeof dataPoints[i].y !== "number") continue;

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;

				var yPercent;
				if (plotUnit.dataPointYSums[dataPointX] !== 0) yPercent = dataPoints[i].y / plotUnit.dataPointYSums[dataPointX] * 100;else yPercent = 0;

				//y = (plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum) + .5) << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (yPercent - plotUnit.axisY.conversionParameters.minimum);

				var x1 = x - plotUnit.plotType.plotUnits.length * barWidth / 2 + plotUnit.index * barWidth << 0;
				var x2 = x1 + barWidth << 0;
				var y1;
				var y2;

				if (dataPoints[i].y >= 0) {
					var offset = offsetPositiveY[dataPointX] ? offsetPositiveY[dataPointX] : 0;

					y1 = y - offset;
					y2 = yZeroToPixel - offset;

					offsetPositiveY[dataPointX] = offset + (y2 - y1);
				} else {
					var offset = offsetNegativeY[dataPointX] ? offsetNegativeY[dataPointX] : 0;

					y2 = y + offset;
					y1 = yZeroToPixel + offset;

					offsetNegativeY[dataPointX] = offset + (y2 - y1);
				}

				color = dataPoints[i].color ? dataPoints[i].color : dataSeries._colorSet[i % dataSeries._colorSet.length];
				drawRect(ctx, x1, y1, x2, y2, color, 0, null, bevelEnabled && dataPoints[i].y >= 0, dataPoints[i].y < 0 && bevelEnabled, false, false, dataSeries.fillOpacity);

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x1, y1: y1, x2: x2, y2: y2
				};
				color = intToHexColorString(id);

				if (_utils.isCanvasSupported) drawRect(this._eventManager.ghostCtx, x1, y1, x2, y2, color, 0, null, false, false, false, false);

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "stackedColumn100",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: dataPoints[i].y >= 0 ? y1 : y2
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						bounds: {
							x1: x1, y1: Math.min(y1, y2), x2: x2, y2: Math.max(y1, y2)
						},
						color: color
					});
				}
			}
		}
	}

	ctx.restore();

	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	//source and dest would be same when animation is not enabled
	var animationBase = Math.min(yZeroToPixel, plotUnit.axisY.boundingRect.y2);
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.yScaleAnimation, easingFunction: AnimationHelper.easing.easeOutQuart, animationBase: animationBase
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],21:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});

exports.default = function (plotUnit) {
	var ctx = plotUnit.targetCanvasCtx || this.plotArea.ctx;

	var totalDataSeries = plotUnit.dataSeriesIndexes.length;

	if (totalDataSeries <= 0) return;

	var ghostCtx = this._eventManager.ghostCtx;

	var axisXProps = plotUnit.axisX.lineCoordinates;
	var axisYProps = plotUnit.axisY.lineCoordinates;
	var markers = [];

	var plotArea = this.plotArea;
	ctx.save();

	if (_utils.isCanvasSupported) ghostCtx.save();

	ctx.beginPath();
	ctx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
	ctx.clip();

	if (_utils.isCanvasSupported) {
		ghostCtx.beginPath();
		ghostCtx.rect(plotArea.x1, plotArea.y1, plotArea.width, plotArea.height);
		ghostCtx.clip();
	}

	for (var j = 0; j < plotUnit.dataSeriesIndexes.length; j++) {

		var dataSeriesIndex = plotUnit.dataSeriesIndexes[j];

		var dataSeries = this.data[dataSeriesIndex];

		var dataPoints = dataSeries.dataPoints;

		var seriesId = dataSeries.id;
		this._eventManager.objectMap[seriesId] = {
			objectType: "dataSeries", dataSeriesIndex: dataSeriesIndex
		};

		var hexColor = intToHexColorString(seriesId);
		ghostCtx.fillStyle = hexColor;
		//ghostCtx.lineWidth = dataSeries.lineThickness;
		//ghostCtx.lineWidth = 20;

		markers = [];

		var isFirstDataPointInPlotArea = true;
		var i = 0,
		    x,
		    y;
		var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.

		var yZeroToPixel = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (0 - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;
		var baseY;

		var startPoint = null;

		var prevDataNull = false;
		if (dataPoints.length > 0) {
			//ctx.strokeStyle = "#4572A7 ";
			var color = dataSeries._colorSet[i % dataSeries._colorSet.length];
			//ctx.strokeStyle = "red";
			ctx.fillStyle = color;
			ctx.strokeStyle = color;
			ctx.lineWidth = dataSeries.lineThickness;

			if (ctx.setLineDash) {
				ctx.setLineDash(getLineDashArray(dataSeries.lineDashType, dataSeries.lineThickness));
			}

			for (; i < dataPoints.length; i++) {

				dataPointX = dataPoints[i].x.getTime ? dataPoints[i].x.getTime() : dataPoints[i].x;

				if (dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax) {
					continue;
				}

				var prevY = y;

				if (typeof dataPoints[i].y !== "number") {
					closeArea();

					prevDataNull = true;
					continue;
				}

				x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;
				y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;

				if (isFirstDataPointInPlotArea || prevDataNull) {
					ctx.beginPath();
					ctx.moveTo(x, y);
					startPoint = {
						x: x, y: y
					};

					if (_utils.isCanvasSupported) {
						ghostCtx.beginPath();
						ghostCtx.moveTo(x, y);
					}

					isFirstDataPointInPlotArea = false;
					prevDataNull = false;
				} else {

					ctx.lineTo(x, prevY);
					if (_utils.isCanvasSupported) ghostCtx.lineTo(x, prevY);

					ctx.lineTo(x, y);

					if (_utils.isCanvasSupported) ghostCtx.lineTo(x, y);

					if (i % 250 == 0) {
						closeArea();
					}
				}

				var id = dataSeries.dataPointIds[i];
				this._eventManager.objectMap[id] = {
					id: id, objectType: "dataPoint", dataSeriesIndex: dataSeriesIndex, dataPointIndex: i, x1: x, y1: y
				};

				//Render Marker
				if (dataPoints[i].markerSize !== 0) {
					if (dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0) {
						var markerProps = dataSeries.getMarkerProperties(i, x, y, ctx);
						markers.push(markerProps);

						//if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
						//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
						//}

						var markerColor = intToHexColorString(id);

						if (_utils.isCanvasSupported) {
							markers.push({
								x: x, y: y, ctx: ghostCtx,
								type: markerProps.type,
								size: markerProps.size,
								color: markerColor,
								borderColor: markerColor,
								borderThickness: markerProps.borderThickness
							});
						}
					}
				}

				if (dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter) {

					this._indexLabels.push({
						chartType: "stepArea",
						dataPoint: dataPoints[i],
						dataSeries: dataSeries,
						point: {
							x: x, y: y
						},
						direction: dataPoints[i].y >= 0 ? 1 : -1,
						color: color
					});
				}
			}

			closeArea();

			RenderHelper.drawMarkers(markers);
		}
	}

	ctx.restore();
	if (_utils.isCanvasSupported) this._eventManager.ghostCtx.restore();

	function closeArea() {

		if (!startPoint) return;

		if (dataSeries.lineThickness > 0) ctx.stroke();

		if (plotUnit.axisY.viewportMinimum <= 0 && plotUnit.axisY.viewportMaximum >= 0) {
			baseY = yZeroToPixel;
		} else if (plotUnit.axisY.viewportMaximum < 0) baseY = axisYProps.y1;else if (plotUnit.axisY.viewportMinimum > 0) baseY = axisXProps.y2;

		ctx.lineTo(x, baseY);
		ctx.lineTo(startPoint.x, baseY);
		ctx.closePath();

		ctx.globalAlpha = dataSeries.fillOpacity;
		ctx.fill();
		ctx.globalAlpha = 1;

		if (_utils.isCanvasSupported) {
			ghostCtx.lineTo(x, baseY);
			ghostCtx.lineTo(startPoint.x, baseY);
			ghostCtx.closePath();
			ghostCtx.fill();
		}

		ctx.beginPath();
		ctx.moveTo(x, y);
		ghostCtx.beginPath();
		ghostCtx.moveTo(x, y);

		startPoint = {
			x: x, y: y
		};
	}

	//source and dest would be same when animation is not enabled
	var animationInfo = {
		source: ctx, dest: this.plotArea.ctx, animationCallback: AnimationHelper.xClipAnimation, easingFunction: AnimationHelper.easing.linear, animationBase: 0
	};
	return animationInfo;
};

var _utils = require("../helpers/utils");

},{"../helpers/utils":39}],22:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var cultures = exports.cultures = {
  "en": {}
  //Derives from the default options
  //,
  //"es": {
  //    decimalSeparator: ",",
  //    digitGroupSeparator: ".",
  //    zoomText: "zoom",
  //    panText: "pan",
  //    resetText: "reset",
  //    days: ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"],
  //}
};

var constants = exports.constants = {
  numberDuration: 1,
  yearDuration: 1000 * 60 * 60 * 24 * 364,
  monthDuration: 1000 * 60 * 60 * 24 * 30,
  weekDuration: 1000 * 60 * 60 * 24 * 7,
  dayDuration: 1000 * 60 * 60 * 24,
  hourDuration: 1000 * 60 * 60,
  minuteDuration: 1000 * 60,
  secondDuration: 1000,
  millisecondDuration: 1,

  dayOfWeekFromInt: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
};

},{}],23:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});
var isDebugMode = exports.isDebugMode = false;

var isCanvasSupported = exports.isCanvasSupported = !!document.createElement("canvas").getContext;
//isCanvasSupported = false;

//Default values for all Chart Elements that can be set by the user. CanvasJSObject.setOptions looks into this while setting the default/user-defined values.
var defaultOptions = exports.defaultOptions = {
	Chart: {
		width: 500,
		height: 400,
		zoomEnabled: false,
		zoomType: "x",
		backgroundColor: "white",
		theme: "theme1",
		animationEnabled: false,
		animationDuration: 1200,
		dataPointMaxWidth: null,

		colorSet: "colorSet1",
		culture: "en",
		creditText: "CanvasJS.com",
		interactivityEnabled: true,
		exportEnabled: false,
		exportFileName: "Chart",

		rangeChanging: null,
		rangeChanged: null
	},

	Title: {
		padding: 0,
		text: null,
		verticalAlign: "top", //top, center, bottom
		horizontalAlign: "center", //left, center, right
		fontSize: 20, //in pixels
		fontFamily: "Calibri",
		fontWeight: "normal", //normal, bold, bolder, lighter,
		fontColor: "black",
		fontStyle: "normal", // normal, italic, oblique

		borderThickness: 0,
		borderColor: "black",
		cornerRadius: 0,
		backgroundColor: null,
		margin: 5,
		wrap: true,
		maxWidth: null,

		dockInsidePlotArea: false
		//toolTipContent: null//string - To be implemented (TBI)
	},

	Subtitle: {
		padding: 0,
		text: null,
		verticalAlign: "top", //top, center, bottom
		horizontalAlign: "center", //left, center, right
		fontSize: 14, //in pixels
		fontFamily: "Calibri",
		fontWeight: "normal", //normal, bold, bolder, lighter,
		fontColor: "black",
		fontStyle: "normal", // normal, italic, oblique

		borderThickness: 0,
		borderColor: "black",
		cornerRadius: 0,
		backgroundColor: null,
		margin: 2,
		wrap: true,
		maxWidth: null,

		dockInsidePlotArea: false
		//toolTipContent: null//string - To be implemented (TBI)
	},

	Legend: {
		name: null,
		verticalAlign: "center",
		horizontalAlign: "right",

		fontSize: 14, //in pixels
		fontFamily: "calibri",
		fontWeight: "normal", //normal, bold, bolder, lighter,
		fontColor: "black",
		fontStyle: "normal", // normal, italic, oblique

		cursor: null,
		itemmouseover: null,
		itemmouseout: null,
		itemmousemove: null,
		itemclick: null,

		dockInsidePlotArea: false,
		reversed: false,

		maxWidth: null,
		maxHeight: null,

		itemMaxWidth: null,
		itemWidth: null,
		itemWrap: true,
		itemTextFormatter: null
	},

	ToolTip: {
		enabled: true,
		shared: false,
		animationEnabled: true,
		content: null,
		contentFormatter: null,

		reversed: false,

		backgroundColor: null,

		borderColor: null,
		borderThickness: 2, //in pixels
		cornerRadius: 5, // in pixels

		fontSize: 14, // in pixels
		fontColor: "#000000",
		fontFamily: "Calibri, Arial, Georgia, serif;",
		fontWeight: "normal", //normal, bold, bolder, lighter,
		fontStyle: "italic" // normal, italic, oblique
	},

	Axis: {
		minimum: null, //Minimum value to be shown on the Axis
		maximum: null, //Minimum value to be shown on the Axis
		viewportMinimum: null,
		viewportMaximum: null,
		interval: null, // Interval for tick marks and grid lines
		intervalType: null, //number, millisecond, second, minute, hour, day, month, year
		//reversed: false,

		title: null, // string
		titleFontColor: "black",
		titleFontSize: 20,
		titleFontFamily: "arial",
		titleFontWeight: "normal",
		titleFontStyle: "normal",

		labelAngle: 0,
		labelFontFamily: "arial",
		labelFontColor: "black",
		labelFontSize: 12,
		labelFontWeight: "normal",
		labelFontStyle: "normal",
		labelAutoFit: false,
		labelWrap: true,
		labelMaxWidth: null, //null for auto
		labelFormatter: null,

		prefix: "",
		suffix: "",

		includeZero: true, //Applies only for axisY. Ignored in axisX.

		tickLength: 5,
		tickColor: "black",
		tickThickness: 1,

		lineColor: "black",
		lineThickness: 1,
		lineDashType: "solid",

		gridColor: "A0A0A0",
		gridThickness: 0,
		gridDashType: "solid",

		interlacedColor: null,

		valueFormatString: null,

		margin: 2,

		stripLines: [] // Just a placeholder. Does not have any effect on the actual number of striplines
	},

	StripLine: {
		value: null,
		startValue: null,
		endValue: null,

		color: "orange",
		opacity: null,
		thickness: 2,
		lineDashType: "solid",
		label: "",
		labelBackgroundColor: "#EEEEEE",
		labelFontFamily: "arial",
		labelFontColor: "orange",
		labelFontSize: 12,
		labelFontWeight: "normal",
		labelFontStyle: "normal",
		labelFormatter: null,

		showOnTop: false
	},

	DataSeries: {
		name: null,
		dataPoints: null,
		label: "",
		bevelEnabled: false,
		highlightEnabled: true,

		cursor: null,

		indexLabel: "",
		indexLabelPlacement: "auto", //inside, outside, auto
		indexLabelOrientation: "horizontal",
		indexLabelFontColor: "black",
		indexLabelFontSize: 12,
		indexLabelFontStyle: "normal", //   italic ,oblique, normal
		indexLabelFontFamily: "Arial", // fx: Arial Verdana "Courier New" Serif
		indexLabelFontWeight: "normal", // bold ,bolder, lighter, normal
		indexLabelBackgroundColor: null,
		indexLabelLineColor: null,
		indexLabelLineThickness: 1,
		indexLabelLineDashType: "solid",
		indexLabelMaxWidth: null,
		indexLabelWrap: true,
		indexLabelFormatter: null,

		lineThickness: 2,
		lineDashType: "solid",

		color: null,
		risingColor: "white",
		fillOpacity: null,

		startAngle: 0,

		radius: null,
		innerRadius: null,

		type: "column", //line, column, bar, area, scatter stackedColumn, stackedBar, stackedArea, stackedColumn100, stackedBar100, stackedArea100, pie, doughnut
		xValueType: "number", //number, dateTime
		axisYType: "primary",

		xValueFormatString: null,
		yValueFormatString: null,
		zValueFormatString: null,
		percentFormatString: null,

		showInLegend: null,
		legendMarkerType: null,
		legendMarkerColor: null,
		legendText: null,
		legendMarkerBorderColor: null,
		legendMarkerBorderThickness: null,

		markerType: "circle", //none, circle, square, cross, triangle, line
		markerColor: null,
		markerSize: null,
		markerBorderColor: null,
		markerBorderThickness: null,
		//animationEnabled: true,
		mouseover: null,
		mouseout: null,
		mousemove: null,
		click: null,
		toolTipContent: null,

		visible: true
	},

	//Private
	TextBlock: {
		x: 0,
		y: 0,
		width: null, //read only
		height: null, //read only
		maxWidth: null,
		maxHeight: null,
		padding: 0,
		angle: 0,
		text: "",
		horizontalAlign: "center", //left, center, right
		fontSize: 12, //in pixels
		fontFamily: "calibri",
		fontWeight: "normal", //normal, bold, bolder, lighter,
		fontColor: "black",
		fontStyle: "normal", // normal, italic, oblique

		borderThickness: 0,
		borderColor: "black",
		cornerRadius: 0,
		backgroundColor: null,
		textBaseline: "top"
	},

	CultureInfo: {
		decimalSeparator: ".",
		digitGroupSeparator: ",",
		zoomText: "Zoom",
		panText: "Pan",
		resetText: "Reset",

		menuText: "More Options",
		saveJPGText: "Save as JPG",
		savePNGText: "Save as PNG",

		days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
		shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],

		months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
		shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
	}
};

},{}],24:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.themes = exports.colorSets = undefined;

var _utils = require("../helpers/utils");

var colorSets = exports.colorSets = {

	"colorSet1": ["#369EAD", "#C24642", "#7F6084",
	//"#96C412",
	"#86B402", "#A2D1CF",
	//"#D8C641",
	"#C8B631", "#6DBCEB",
	//"#4A4946",
	"#52514E", "#4F81BC", "#A064A1", "#F79647"],
	"colorSet2": ["#4F81BC", "#C0504E", "#9BBB58", "#23BFAA",
	//"#FAA586",
	"#8064A1", "#4AACC5", "#F79647",
	//"#77AA33",
	//"#7F6084"
	"#33558B"],
	"colorSet3": ["#8CA1BC", "#36845C", "#017E82", "#8CB9D0", "#708C98", "#94838D", "#F08891", "#0366A7", "#008276", "#EE7757", "#E5BA3A", "#F2990B", "#03557B", "#782970"] //,
	//"colorSet4": [
	//    "#3698C5",
	//    "#009B8D",
	//    "#F1D691",
	//    "#F8B90C",
	//    "#0081B8",
	//    "#5B5A96",
	//    "#ACBDD1",
	//    "#88A891",
	//    "#39969D",
	//    "#AECEDD",
	//    "#A0B2BC",
	//    "#BBAEB7",
	//    "#A0C65F",
	//    "#EEA6AA",
	//    "#3798C5"
	//],
	//"colorSet5": [
	//    "#88ADBF",
	//    "#84C336",
	//    "#7B91C3",
	//    "#4661EE",
	//    "#EC5657",
	//    "#1BCDD1",
	//    "#8FAABB",
	//    "#B08BEB",
	//    "#3EA0DD",
	//    "#F5A52A",
	//    "#23BFAA",
	//    "#FAA586",
	//    "#EB8CC6"
	//]

};

var themes = exports.themes = {

	"theme1": {
		Chart: {
			colorSet: "colorSet1"
		},
		Title: {
			fontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
			fontSize: 33,
			fontColor: "#3A3A3A",
			fontWeight: "bold",
			verticalAlign: "top",
			margin: 5
		},
		Subtitle: {
			fontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
			fontSize: 16,
			fontColor: "#3A3A3A",
			fontWeight: "bold",
			verticalAlign: "top",
			margin: 5
		},
		Axis: {
			titleFontSize: 26,
			//titleFontColor: "rgb(98,98,98)",
			titleFontColor: "#666666",
			//titleFontFamily: "arial black",
			//titleFontFamily: "Verdana, Geneva, Calibri, sans-serif",
			titleFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
			//titleFontWeight: "bold",

			//labelFontFamily: "Times New Roman, Times, serif",
			labelFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
			//labelFontFamily: "Helvetica Neue, Helvetica",
			labelFontSize: 18,
			labelFontColor: "grey",
			//labelFontWeight: "bold",
			tickColor: "#BBBBBB",
			tickThickness: 2,
			gridThickness: 2,
			gridColor: "#BBBBBB",
			lineThickness: 2,
			lineColor: "#BBBBBB"
		},
		Legend: {
			verticalAlign: "bottom",
			horizontalAlign: "center",
			fontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "calibri"
		},
		DataSeries: {
			//bevelEnabled: true,
			indexLabelFontColor: "grey",
			//indexLabelFontFamily: "Trebuchet MS, monospace, Courier New, Courier",
			indexLabelFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
			//indexLabelFontWeight: "bold",
			indexLabelFontSize: 18,
			//indexLabelLineColor: "lightgrey",
			indexLabelLineThickness: 1
		}
	},

	"theme2": {
		Chart: {
			colorSet: "colorSet2"
		},
		Title: {
			fontFamily: "impact, charcoal, arial black, sans-serif",
			fontSize: 32, //fontColor: "rgb(58,58,58)",
			fontColor: "#333333",
			verticalAlign: "top",
			margin: 5
		},
		Subtitle: {
			fontFamily: "impact, charcoal, arial black, sans-serif",
			fontSize: 14, //fontColor: "rgb(58,58,58)",
			fontColor: "#333333",
			verticalAlign: "top",
			margin: 5
		},
		Axis: {
			titleFontSize: 22,
			titleFontColor: "rgb(98,98,98)",
			//titleFontFamily: "arial black",
			titleFontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "arial",
			titleFontWeight: "bold",

			labelFontFamily: _utils.isCanvasSupported ? "monospace, Courier New, Courier" : "arial",
			//labelFontFamily: "Helvetica Neue, Helvetica",
			labelFontSize: 16,
			labelFontColor: "grey",
			labelFontWeight: "bold",
			tickColor: "grey",
			tickThickness: 2,
			gridThickness: 2,
			gridColor: "grey",
			lineColor: "grey",
			lineThickness: 0
		},
		Legend: {
			verticalAlign: "bottom",
			horizontalAlign: "center",
			fontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "arial"
		},
		DataSeries: {
			indexLabelFontColor: "grey",
			//indexLabelFontFamily: "Trebuchet MS, monospace, Courier New, Courier",
			indexLabelFontFamily: _utils.isCanvasSupported ? "Courier New, Courier, monospace" : "arial",
			indexLabelFontWeight: "bold",
			indexLabelFontSize: 18,
			//indexLabelLineColor: "lightgrey",
			indexLabelLineThickness: 1
		}
	},

	"theme3": {
		Chart: {
			colorSet: "colorSet1"
		},
		Title: {
			fontFamily: _utils.isCanvasSupported ? "Candara, Optima, Trebuchet MS, Helvetica Neue, Helvetica, Trebuchet MS, serif" : "calibri",
			fontSize: 32,
			fontColor: "#3A3A3A",
			fontWeight: "bold",
			verticalAlign: "top",
			margin: 5
		},
		Subtitle: {
			fontFamily: _utils.isCanvasSupported ? "Candara, Optima, Trebuchet MS, Helvetica Neue, Helvetica, Trebuchet MS, serif" : "calibri",
			fontSize: 16,
			fontColor: "#3A3A3A",
			fontWeight: "bold",
			verticalAlign: "top",
			margin: 5
		},
		Axis: {
			titleFontSize: 22,
			titleFontColor: "rgb(98,98,98)",
			//titleFontFamily: "arial black",
			titleFontFamily: _utils.isCanvasSupported ? "Verdana, Geneva, Calibri, sans-serif" : "calibri",
			//titleFontWeight: "bold",

			//labelFontFamily: "Times New Roman, Times, serif",
			labelFontFamily: _utils.isCanvasSupported ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
			//labelFontFamily: "Helvetica Neue, Helvetica",
			labelFontSize: 18,
			labelFontColor: "grey",
			//labelFontWeight: "bold",
			tickColor: "grey",
			tickThickness: 2,
			gridThickness: 2,
			gridColor: "grey",
			lineThickness: 2,
			lineColor: "grey"
		},
		Legend: {
			verticalAlign: "bottom",
			horizontalAlign: "center",
			fontFamily: _utils.isCanvasSupported ? "monospace, sans-serif,arial black" : "calibri"
		},
		DataSeries: {
			bevelEnabled: true,
			indexLabelFontColor: "grey",
			//indexLabelFontFamily: "Trebuchet MS, monospace, Courier New, Courier",
			indexLabelFontFamily: _utils.isCanvasSupported ? "Candara, Optima, Calibri, Verdana, Geneva, sans-serif" : "calibri",
			//indexLabelFontWeight: "bold",
			indexLabelFontSize: 18,
			indexLabelLineColor: "lightgrey",
			indexLabelLineThickness: 2
		}
	}
};

},{"../helpers/utils":39}],25:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function Animator(chart) {

  this.chart = chart;
  this.ctx = this.chart.plotArea.ctx;
  this.animations = [];
  this.animationRequestId = null;
}

//Animator.prototype.animate = function (duration, base, dest, source, animationCallback, onComplete) {
//#region Animator

Animator.prototype.animate = function (startDelay, duration, animationCallback, onComplete, easingFunction) {
  var _this = this;

  this.chart.isAnimating = true;
  easingFunction = easingFunction || _animator2.default.easing.linear;

  if (animationCallback) {

    this.animations.push({
      startTime: new Date().getTime() + (startDelay ? startDelay : 0),
      duration: duration,
      animationCallback: animationCallback,
      onComplete: onComplete
    });
  }

  var remainingAnimations = [];

  while (this.animations.length > 0) {

    var animation = this.animations.shift();
    var now = new Date().getTime();
    var fractionComplete = 0;
    //var fractionComplete = Math.min(((new Date()).getTime() - animation.startTime) / animation.duration, 1);

    if (animation.startTime <= now) {
      fractionComplete = easingFunction(Math.min(now - animation.startTime, animation.duration), 0, 1, animation.duration);
      //var fractionComplete = AnimationHelper.easing.easeOutQuad(Math.min(((new Date()).getTime() - animation.startTime), animation.duration), 0, 1, animation.duration);

      fractionComplete = Math.min(fractionComplete, 1);

      if (isNaN(fractionComplete) || !isFinite(fractionComplete)) fractionComplete = 1;
    }

    if (fractionComplete < 1) {
      remainingAnimations.push(animation);
    }

    animation.animationCallback(fractionComplete);

    if (fractionComplete >= 1 && animation.onComplete) animation.onComplete();
  }

  this.animations = remainingAnimations;

  if (this.animations.length > 0) {
    this.animationRequestId = this.chart.requestAnimFrame.call(window, function () {
      _this.animate.call(_this);
    });
  } else {
    this.chart.isAnimating = false;
  }
};

Animator.prototype.cancelAllAnimations = function () {

  this.animations = [];

  if (this.animationRequestId) {
    this.chart.cancelRequestAnimFrame.call(window, this.animationRequestId);
  }

  this.animationRequestId = null;
  this.chart.isAnimating = false;
};

exports.default = Animator;

},{"../helpers/animator":37}],26:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _text_block = require('./text_block');

var _text_block2 = _interopRequireDefault(_text_block);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function Axis(chart, options, type, position) {

	Axis.base.constructor.call(this, "Axis", options, chart.theme);

	this.chart = chart;
	this.canvas = chart.canvas;
	this.ctx = chart.ctx;
	this.maxWidth = 0;
	this.maxHeight = 0;
	this.intervalStartPosition = 0;
	this.labels = [];
	this._labels = null;

	//Processed information about the data that gets plotted against this axis
	this.dataInfo = {
		min: Infinity,
		max: -Infinity,
		viewPortMin: Infinity,
		viewPortMax: -Infinity,
		minDiff: Infinity // Used only in case of axisX
	};

	if (type === "axisX") {
		this.sessionVariables = this.chart.sessionVariables[type];

		if (!this._options.interval) this.intervalType = null;
	} else {
		if (position === "left" || position === "top") this.sessionVariables = this.chart.sessionVariables["axisY"];else {
			this.sessionVariables = this.chart.sessionVariables["axisY2"];
		}
	}

	if (typeof this._options.titleFontSize === "undefined") {

		this.titleFontSize = this.chart.getAutoFontSize(this.titleFontSize);

		//window.console.log("titleFontSize: " + this.titleFontSize);
	}

	if (typeof this._options.labelFontSize === "undefined") {

		this.labelFontSize = this.chart.getAutoFontSize(this.labelFontSize);

		//window.console.log("labelFontSize: " + this.labelFontSize);
	}

	//Axis Type : axisX, axisY
	this.type = type;
	if (type === "axisX" && (!options || typeof options.gridThickness === "undefined")) this.gridThickness = 0;

	this._position = position;

	this.lineCoordinates = {
		x1: null, y1: null, x2: null, y2: null, width: null
	}; //{x1:, y1:, x2:, y2:, width:}
	//
	{
		this.labelAngle = (this.labelAngle % 360 + 360) % 360;

		if (this.labelAngle > 90 && this.labelAngle <= 270) this.labelAngle -= 180;else if (this.labelAngle > 180 && this.labelAngle <= 270) this.labelAngle -= 180;else if (this.labelAngle > 270 && this.labelAngle <= 360) this.labelAngle -= 360;
	}

	if (this._options.stripLines && this._options.stripLines.length > 0) {

		this.stripLines = [];

		for (var i = 0; i < this._options.stripLines.length; i++) {
			this.stripLines.push(new StripLine(this.chart, this._options.stripLines[i], chart.theme, ++this.chart._eventManager.lastObjectId, this));
		}
	}

	this._titleTextBlock = null;

	if (!this.hasOptionChanged("viewportMinimum") && !isNaN(this.sessionVariables.newViewportMinimum) && this.sessionVariables.newViewportMinimum !== null) this.viewportMinimum = this.sessionVariables.newViewportMinimum;else this.sessionVariables.newViewportMinimum = null;

	if (!this.hasOptionChanged("viewportMaximum") && !isNaN(this.sessionVariables.newViewportMaximum) && this.sessionVariables.newViewportMaximum !== null) this.viewportMaximum = this.sessionVariables.newViewportMaximum;else this.sessionVariables.newViewportMaximum = null;

	if (this.minimum !== null && this.viewportMinimum !== null) this.viewportMinimum = Math.max(this.viewportMinimum, this.minimum);

	if (this.maximum !== null && this.viewportMaximum !== null) this.viewportMaximum = Math.min(this.viewportMaximum, this.maximum);

	this.trackChanges("viewportMinimum");
	this.trackChanges("viewportMaximum");
}

(0, _utils.extend)(Axis, _canvasjs2.default);

Axis.prototype.createLabels = function () {

	var textBlock;
	var i = 0;
	var endPoint;

	var labelMaxWidth = 0;
	var labelMaxHeight = 0;
	var intervalInPixels = 0;

	//var intervalInPixels = this.conversionParameters.pixelPerUnit * this.interval;

	if (this._position === "bottom" || this._position === "top") {
		intervalInPixels = this.lineCoordinates.width / Math.abs(this.viewportMaximum - this.viewportMinimum) * this.interval;

		if (this.labelAutoFit) {
			labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? intervalInPixels * .9 >> 0 : this.labelMaxWidth;
		} else {
			labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? this.chart.width * .7 >> 0 : this.labelMaxWidth;
		}

		labelMaxHeight = typeof this._options.labelWrap === "undefined" || this.labelWrap ? this.chart.height * .5 >> 0 : this.labelFontSize * 1.5;
	} else if (this._position === "left" || this._position === "right") {

		intervalInPixels = this.lineCoordinates.height / Math.abs(this.viewportMaximum - this.viewportMinimum) * this.interval;

		if (this.labelAutoFit) {
			labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? this.chart.width * .3 >> 0 : this.labelMaxWidth;
		} else {
			labelMaxWidth = typeof this._options.labelMaxWidth === "undefined" ? this.chart.width * .5 >> 0 : this.labelMaxWidth;
		}

		labelMaxHeight = typeof this._options.labelWrap === "undefined" || this.labelWrap ? intervalInPixels * 2 >> 0 : this.labelFontSize * 1.5;
	}

	if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") {
		endPoint = addToDateTime(new Date(this.viewportMaximum), this.interval, this.intervalType);
		//endPoint = this.viewportMaximum;

		for (i = this.intervalStartPosition; i < endPoint; addToDateTime(i, this.interval, this.intervalType)) {

			//var text = dateFormat(i, this.valueFormatString);
			var timeInMilliseconds = i.getTime();
			var text = this.labelFormatter ? this.labelFormatter({ chart: this.chart, axis: this._options, value: i, label: this.labels[i] ? this.labels[i] : null }) : this.type === "axisX" && this.labels[timeInMilliseconds] ? this.labels[timeInMilliseconds] : dateFormat(i, this.valueFormatString, this.chart._cultureInfo);

			textBlock = new _text_block2.default(this.ctx, {
				x: 0,
				y: 0,
				//maxWidth: this.maxHeight,
				//maxHeight: this.labelFontSize,
				maxWidth: labelMaxWidth,
				maxHeight: labelMaxHeight,
				angle: this.labelAngle,
				text: this.prefix + text + this.suffix,
				horizontalAlign: "left", //left, center, right
				fontSize: this.labelFontSize, //in pixels
				fontFamily: this.labelFontFamily,
				fontWeight: this.labelFontWeight, //normal, bold, bolder, lighter,
				fontColor: this.labelFontColor,
				fontStyle: this.labelFontStyle, // normal, italic, oblique
				textBaseline: "middle"
			});

			this._labels.push({ position: i.getTime(), textBlock: textBlock, effectiveHeight: null });
		}
	} else {
		endPoint = this.viewportMaximum;

		//if ((Math.floor(this.interval) < this.interval && !this._options.interval) || true) {

		//Check if it should be rendered as a category axis. If yes, then ceil the interval
		if (this.labels && this.labels.length) {
			var tempInterval = Math.ceil(this.interval);
			var tempStartPoint = Math.ceil(this.intervalStartPosition);
			var hasAllLabels = false;
			for (i = tempStartPoint; i < this.viewportMaximum; i += tempInterval) {
				if (this.labels[i]) {
					hasAllLabels = true;
				} else {
					hasAllLabels = false;
					break;
				}
			}

			if (hasAllLabels) {
				this.interval = tempInterval;
				this.intervalStartPosition = tempStartPoint;
			}
		}

		//parseFloat & toPrecision are being used to avoid issues related to precision.
		for (i = this.intervalStartPosition; i <= endPoint; i = parseFloat((i + this.interval).toFixed(14))) {

			var text = this.labelFormatter ? this.labelFormatter({ chart: this.chart, axis: this._options, value: i, label: this.labels[i] ? this.labels[i] : null }) : this.type === "axisX" && this.labels[i] ? this.labels[i] : (0, _utils.numberFormat)(i, this.valueFormatString, this.chart._cultureInfo);

			textBlock = new _text_block2.default(this.ctx, {
				x: 0,
				y: 0,
				//maxWidth: this.maxHeight,
				//maxHeight: this.labelFontSize,
				maxWidth: labelMaxWidth,
				maxHeight: labelMaxHeight,
				angle: this.labelAngle,
				text: this.prefix + text + this.suffix,
				horizontalAlign: "left", //left, center, right
				fontSize: this.labelFontSize, //in pixels
				fontFamily: this.labelFontFamily,
				fontWeight: this.labelFontWeight, //normal, bold, bolder, lighter,
				fontColor: this.labelFontColor,
				fontStyle: this.labelFontStyle, // normal, italic, oblique
				textBaseline: "middle",
				borderThickness: 0
			});

			this._labels.push({ position: i, textBlock: textBlock, effectiveHeight: null });
		}
	}

	for (var i = 0; i < this.stripLines.length; i++) {

		var stripLine = this.stripLines[i];

		textBlock = new _text_block2.default(this.ctx, {
			x: 0,
			y: 0,
			//maxWidth: this.maxHeight,
			//maxHeight: this.labelFontSize,
			backgroundColor: stripLine.labelBackgroundColor,
			maxWidth: labelMaxWidth,
			maxHeight: labelMaxHeight,
			angle: this.labelAngle,
			text: stripLine.labelFormatter ? stripLine.labelFormatter({ chart: this.chart, axis: this, stripLine: stripLine }) : stripLine.label,
			horizontalAlign: "left", //left, center, right
			fontSize: stripLine.labelFontSize, //in pixels
			fontFamily: stripLine.labelFontFamily,
			fontWeight: stripLine.labelFontWeight, //normal, bold, bolder, lighter,
			fontColor: stripLine._options.labelFontColor || stripLine.color,
			fontStyle: stripLine.labelFontStyle, // normal, italic, oblique
			textBaseline: "middle",
			borderThickness: 0
		});

		this._labels.push({ position: stripLine.value, textBlock: textBlock, effectiveHeight: null, stripLine: stripLine });
	}
};

Axis.prototype.createLabelsAndCalculateWidth = function () {

	var maxLabelEffectiveWidth = 0;
	this._labels = [];

	if (this._position === "left" || this._position === "right") {

		this.createLabels();

		for (var i = 0; i < this._labels.length; i++) {

			var textBlock = this._labels[i].textBlock;

			var size = textBlock.measureText();

			//var hypotenuse = Math.sqrt(Math.pow(size.height / 2, 2) + Math.pow(size.width, 2));
			//labelEffectiveWidth = hypotenuse * Math.cos(Math.abs(Math.PI / 180 * this.labelAngle) - Math.abs(Math.acos(size.width / hypotenuse)));

			var labelEffectiveWidth = 0;

			if (this.labelAngle === 0) labelEffectiveWidth = size.width;else labelEffectiveWidth = size.width * Math.cos(Math.PI / 180 * Math.abs(this.labelAngle)) + size.height / 2 * Math.sin(Math.PI / 180 * Math.abs(this.labelAngle));

			if (maxLabelEffectiveWidth < labelEffectiveWidth) maxLabelEffectiveWidth = labelEffectiveWidth;

			this._labels[i].effectiveWidth = labelEffectiveWidth;
		}
	}

	var titleHeight = this.title ? getFontHeightInPixels(this.titleFontFamily, this.titleFontSize, this.titleFontWeight) + 2 : 0;

	var axisWidth = titleHeight + maxLabelEffectiveWidth + this.tickLength + 5;

	//if (isDebugMode && window.console) {
	//	window.console.log(this.type + "--- axisWidth: " + axisWidth);
	//}

	return axisWidth;
};

Axis.prototype.createLabelsAndCalculateHeight = function () {
	var maxLabelEffectiveHeight = 0;
	this._labels = [];
	var textBlock;
	var i = 0;

	this.createLabels();

	if (this._position === "bottom" || this._position === "top") {

		for (i = 0; i < this._labels.length; i++) {

			textBlock = this._labels[i].textBlock;

			var size = textBlock.measureText();
			//var diagonal = Math.sqrt(Math.pow(size.height, 2) + Math.pow(size.width, 2));

			//var hypotenuse = Math.sqrt(Math.pow(size.height / 2, 2) + Math.pow(size.width, 2));
			//var labelEffectiveHeight = hypotenuse * Math.cos(Math.PI / 2 - (Math.abs(Math.PI / 180 * this.labelAngle) + Math.abs(Math.acos(size.width / hypotenuse))));

			var labelEffectiveHeight = 0;

			if (this.labelAngle === 0) labelEffectiveHeight = size.height;else labelEffectiveHeight = size.width * Math.sin(Math.PI / 180 * Math.abs(this.labelAngle)) + size.height / 2 * Math.cos(Math.PI / 180 * Math.abs(this.labelAngle));

			if (maxLabelEffectiveHeight < labelEffectiveHeight) maxLabelEffectiveHeight = labelEffectiveHeight;

			this._labels[i].effectiveHeight = labelEffectiveHeight;
		}
	}

	//var titleHeight = this.title ? this.titleFontSize + 5 : 0;
	var titleHeight = this.title ? getFontHeightInPixels(this.titleFontFamily, this.titleFontSize, this.titleFontWeight) + 2 : 0;

	return titleHeight + maxLabelEffectiveHeight + this.tickLength + 5;
};

//Static Method that co-ordinates between axisX, axisY and renders them
Axis.setLayoutAndRender = function (axisX, axisY, axisY2, axisPlacement, freeSpace) {
	var x1, y1, x2, y2;
	var chart = axisX.chart;
	var ctx = chart.ctx;

	axisX.calculateAxisParameters();

	if (axisY) axisY.calculateAxisParameters();

	if (axisY2) axisY2.calculateAxisParameters();

	//if (axisY && axisY2 && typeof (axisY._options.viewportMaximum) === "undefined" && typeof (axisY._options.viewportMinimum) === "undefined" && typeof (axisY._options.interval) === "undefined"
	//		&& typeof (axisY2._options.viewportMaximum) === "undefined" && typeof (axisY2._options.viewportMinimum) === "undefined" && typeof (axisY2._options.interval) === "undefined") {

	//	var noTicksY = (axisY.viewportMaximum - axisY.viewportMinimum) / axisY.interval;

	//	var noTicksY2 = (axisY2.viewportMaximum - axisY2.viewportMinimum) / axisY2.interval;

	//	if (noTicksY > noTicksY2) {
	//		axisY2.viewportMaximum = axisY2.interval * noTicksY + axisY2.viewportMinimum;
	//	} else if (noTicksY2 > noTicksY) {
	//		axisY.viewportMaximum = axisY.interval * noTicksY2 + axisY.viewportMinimum;
	//	}
	//}

	var axisYlineThickness = axisY ? axisY.lineThickness ? axisY.lineThickness : 0 : 0;
	var axisY2lineThickness = axisY2 ? axisY2.lineThickness ? axisY2.lineThickness : 0 : 0;

	var axisYGridThickness = axisY ? axisY.gridThickness ? axisY.gridThickness : 0 : 0;
	var axisY2GridThickness = axisY2 ? axisY2.gridThickness ? axisY2.gridThickness : 0 : 0;

	var axisYMargin = axisY ? axisY.margin : 0;
	var axisY2Margin = axisY ? axisY.margin : 0;

	if (axisPlacement === "normal") {

		axisX.lineCoordinates = {};

		var axisYWidth = Math.ceil(axisY ? axisY.createLabelsAndCalculateWidth() : 0);
		x1 = Math.round(freeSpace.x1 + axisYWidth + axisYMargin);
		axisX.lineCoordinates.x1 = x1;

		var axisY2Width = Math.ceil(axisY2 ? axisY2.createLabelsAndCalculateWidth() : 0);
		x2 = Math.round(freeSpace.x2 - axisY2Width > axisX.chart.width - 10 ? axisX.chart.width - 10 : freeSpace.x2 - axisY2Width);
		axisX.lineCoordinates.x2 = x2;

		axisX.lineCoordinates.width = Math.abs(x2 - x1); // required early on inside createLabels of axisX

		var axisXHeight = Math.ceil(axisX.createLabelsAndCalculateHeight());

		// Position axisX based on the available free space, Margin and its height
		//x1 = freeSpace.x1 + axisYWidth + axisYMargin + axisYlineThickness / 2;
		y1 = Math.round(freeSpace.y2 - axisXHeight - axisX.margin);
		y2 = Math.round(freeSpace.y2 - axisX.margin);

		//axisX.lineCoordinates = { x1: x1, y1: y1, x2: x2, y2: y1, width: Math.abs(x2 - x1) }
		axisX.lineCoordinates.y1 = y1;
		axisX.lineCoordinates.y2 = y1;

		axisX.boundingRect = {
			x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1
		};

		//if (isDebugMode) {
		//	axisX.ctx.rect(axisX.boundingRect.x1, axisX.boundingRect.y1, axisX.boundingRect.width, axisX.boundingRect.height);
		//	axisX.ctx.stroke();
		//}

		// Position axisY based on the available free space, Margin and its height
		if (axisY) {
			x1 = Math.round(freeSpace.x1 + axisY.margin);
			y1 = Math.round(freeSpace.y1 < 10 ? 10 : freeSpace.y1);
			x2 = Math.round(freeSpace.x1 + axisYWidth + axisY.margin);
			//y2 = freeSpace.y2 - axisXHeight - axisX.margin - axisX.lineThickness / 2;
			y2 = Math.round(freeSpace.y2 - axisXHeight - axisX.margin);

			axisY.lineCoordinates = {
				x1: x2, y1: y1, x2: x2, y2: y2, height: Math.abs(y2 - y1)
			};

			axisY.boundingRect = {
				x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1
			};
		}

		//if (isDebugMode && axisY) {
		//	axisY.ctx.rect(axisY.boundingRect.x1, axisY.boundingRect.y1, axisY.boundingRect.width, axisY.boundingRect.height);
		//	axisY.ctx.stroke();
		//}

		// Position axisY2 based on the available free space, Margin and its height
		if (axisY2) {
			x1 = Math.round(axisX.lineCoordinates.x2);
			y1 = Math.round(freeSpace.y1 < 10 ? 10 : freeSpace.y1);
			x2 = Math.round(x1 + axisY2Width + axisY2.margin);
			//y2 = freeSpace.y2 - axisXHeight - axisX.margin - axisX.lineThickness / 2;
			y2 = Math.round(freeSpace.y2 - axisXHeight - axisX.margin);

			axisY2.lineCoordinates = {
				x1: x1, y1: y1, x2: x1, y2: y2, height: Math.abs(y2 - y1)
			};

			axisY2.boundingRect = {
				x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1
			};
		}

		axisX.calculateValueToPixelConversionParameters();

		if (axisY) axisY.calculateValueToPixelConversionParameters();

		if (axisY2) axisY2.calculateValueToPixelConversionParameters();

		ctx.save();
		ctx.rect(5, axisX.boundingRect.y1, axisX.chart.width - 10, axisX.boundingRect.height);
		ctx.clip();

		axisX.renderLabelsTicksAndTitle();
		ctx.restore();

		if (axisY) axisY.renderLabelsTicksAndTitle();

		if (axisY2) axisY2.renderLabelsTicksAndTitle();

		chart.preparePlotArea();
		var plotArea = axisX.chart.plotArea;

		ctx.save();

		ctx.rect(plotArea.x1, plotArea.y1, Math.abs(plotArea.x2 - plotArea.x1), Math.abs(plotArea.y2 - plotArea.y1));

		ctx.clip();

		axisX.renderStripLinesOfThicknessType("value");

		if (axisY) axisY.renderStripLinesOfThicknessType("value");

		if (axisY2) axisY2.renderStripLinesOfThicknessType("value");

		axisX.renderInterlacedColors();

		if (axisY) axisY.renderInterlacedColors();

		if (axisY2) axisY2.renderInterlacedColors();

		ctx.restore();

		axisX.renderGrid();

		if (axisY) axisY.renderGrid();

		if (axisY2) axisY2.renderGrid();

		axisX.renderAxisLine();

		if (axisY) axisY.renderAxisLine();

		if (axisY2) axisY2.renderAxisLine();

		//No need to clip to plotArea because stripLines need to render on top of gridlines
		axisX.renderStripLinesOfThicknessType("pixel");

		if (axisY) axisY.renderStripLinesOfThicknessType("pixel");

		if (axisY2) axisY2.renderStripLinesOfThicknessType("pixel");
	} else {
		var axisXWidth = Math.ceil(axisX.createLabelsAndCalculateWidth());

		if (axisY) {
			axisY.lineCoordinates = {};

			x1 = Math.round(freeSpace.x1 + axisXWidth + axisX.margin);
			x2 = Math.round(freeSpace.x2 > axisY.chart.width - 10 ? axisY.chart.width - 10 : freeSpace.x2);

			axisY.lineCoordinates.x1 = x1;
			axisY.lineCoordinates.x2 = x2;
			axisY.lineCoordinates.width = Math.abs(x2 - x1);
		}

		if (axisY2) {
			axisY2.lineCoordinates = {};
			x1 = Math.round(freeSpace.x1 + axisXWidth + axisX.margin);
			x2 = Math.round(freeSpace.x2 > axisY2.chart.width - 10 ? axisY2.chart.width - 10 : freeSpace.x2);

			axisY2.lineCoordinates.x1 = x1;
			axisY2.lineCoordinates.x2 = x2;
			axisY2.lineCoordinates.width = Math.abs(x2 - x1);
		}

		var axisYHeight = Math.ceil(axisY ? axisY.createLabelsAndCalculateHeight() : 0);
		var axisY2Height = Math.ceil(axisY2 ? axisY2.createLabelsAndCalculateHeight() : 0);

		// Position axisY based on the available free space, Margin and its height
		if (axisY) {
			//x1 = freeSpace.x1 + axisXWidth + axisX.margin + axisX.lineThickness / 2;
			//x2 = freeSpace.x2 > axisY.chart.width - 10 ? axisY.chart.width - 10 : freeSpace.x2;

			y1 = Math.round(freeSpace.y2 - axisYHeight - axisY.margin);
			y2 = Math.round(freeSpace.y2 - axisYMargin > axisY.chart.height - 10 ? axisY.chart.height - 10 : freeSpace.y2 - axisYMargin);

			//axisY.lineCoordinates = { x1: x1, y1: y1, x2: x2, y2: y1, width: Math.abs(x2 - x1) }
			axisY.lineCoordinates.y1 = y1;
			axisY.lineCoordinates.y2 = y1;

			axisY.boundingRect = {
				x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: axisYHeight
			};
		}

		// Position axisY based on the available free space, Margin and its height
		if (axisY2) {
			//x1 = freeSpace.x1 + axisXWidth + axisX.margin + axisX.lineThickness / 2;
			//x2 = freeSpace.x2 > axisY2.chart.width - 10 ? axisY2.chart.width - 10 : freeSpace.x2;

			y1 = Math.round(freeSpace.y1 + axisY2.margin);
			y2 = freeSpace.y1 + axisY2.margin + axisY2Height;

			//axisY2.lineCoordinates = { x1: x1, y1: y2, x2: x2, y2: y2, width: Math.abs(x2 - x1) }
			axisY2.lineCoordinates.y1 = y2;
			axisY2.lineCoordinates.y2 = y2;

			axisY2.boundingRect = {
				x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: axisY2Height
			};
		}

		//axisY.ctx.rect(axisY.boundingRect.x1, axisY.boundingRect.y1, axisY.boundingRect.width, axisY.boundingRect.height);
		//axisY.ctx.stroke();

		// Position axisX based on the available free space, Margin and its height
		x1 = Math.round(freeSpace.x1 + axisX.margin);
		y1 = Math.round(axisY2 ? axisY2.lineCoordinates.y2 : freeSpace.y1 < 10 ? 10 : freeSpace.y1);
		x2 = Math.round(freeSpace.x1 + axisXWidth + axisX.margin);
		y2 = Math.round(axisY ? axisY.lineCoordinates.y1 : freeSpace.y2 - axisYMargin > axisX.chart.height - 10 ? axisX.chart.height - 10 : freeSpace.y2 - axisYMargin);

		axisX.lineCoordinates = {
			x1: x2, y1: y1, x2: x2, y2: y2, height: Math.abs(y2 - y1)
		};

		axisX.boundingRect = {
			x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1
		};

		//axisX.ctx.rect(axisX.boundingRect.x1, axisX.boundingRect.y1, axisX.boundingRect.width, axisX.boundingRect.height);
		//axisX.ctx.stroke();

		axisX.calculateValueToPixelConversionParameters();

		if (axisY) axisY.calculateValueToPixelConversionParameters();
		if (axisY2) axisY2.calculateValueToPixelConversionParameters();

		//ctx.save();
		//ctx.rect(axisY.boundingRect.x1 - 30, axisY.boundingRect.y1, axisY.boundingRect.width + 60, axisY.boundingRect.height);
		//ctx.clip();

		if (axisY) axisY.renderLabelsTicksAndTitle();

		if (axisY2) axisY2.renderLabelsTicksAndTitle();

		//ctx.restore();

		axisX.renderLabelsTicksAndTitle();

		chart.preparePlotArea();
		var plotArea = axisX.chart.plotArea;

		ctx.save();
		ctx.rect(plotArea.x1, plotArea.y1, Math.abs(plotArea.x2 - plotArea.x1), Math.abs(plotArea.y2 - plotArea.y1));

		ctx.clip();

		//No need to clip to plotArea because stripLines need to render on top of gridlines
		axisX.renderStripLinesOfThicknessType("value");

		if (axisY) axisY.renderStripLinesOfThicknessType("value");
		if (axisY2) axisY2.renderStripLinesOfThicknessType("value");

		axisX.renderInterlacedColors();

		if (axisY) axisY.renderInterlacedColors();
		if (axisY2) axisY2.renderInterlacedColors();

		ctx.restore();

		axisX.renderGrid();

		if (axisY) axisY.renderGrid();

		if (axisY2) axisY2.renderGrid();

		axisX.renderAxisLine();

		if (axisY) axisY.renderAxisLine();

		if (axisY2) axisY2.renderAxisLine();

		axisX.renderStripLinesOfThicknessType("pixel");

		if (axisY) axisY.renderStripLinesOfThicknessType("pixel");
		if (axisY2) axisY2.renderStripLinesOfThicknessType("pixel");
	}
};

Axis.prototype.renderLabelsTicksAndTitle = function () {

	var skipLabels = false;
	var totalLabelWidth = 0;
	var thresholdRatio = 1;
	var labelCount = 0;

	var intervalInPixels = this.conversionParameters.pixelPerUnit * this.interval;

	if (this.labelAngle !== 0 && this.labelAngle !== 360) thresholdRatio = 1.2;

	//Don't skip labels when interval is explicitely set
	if (typeof this._options.interval === "undefined") {
		if (this._position === "bottom" || this._position === "top") {

			//thresholdRatio = .9;// More space is preferred between labels when axis is horizontally aligned

			for (i = 0; i < this._labels.length; i++) {
				label = this._labels[i];
				if (label.position < this.viewportMinimum || label.stripLine) // don't consider stripLine's lable
					continue;

				var width = label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) + label.textBlock.height * Math.sin(Math.PI / 180 * this.labelAngle);

				totalLabelWidth += width;
			}

			if (totalLabelWidth > this.lineCoordinates.width * thresholdRatio) {
				skipLabels = true;
			}
		}if (this._position === "left" || this._position === "right") {
			for (i = 0; i < this._labels.length; i++) {
				label = this._labels[i];
				if (label.position < this.viewportMinimum || label.stripLine) // don't consider stripLine's lable
					continue;

				var width = label.textBlock.height * Math.cos(Math.PI / 180 * this.labelAngle) + label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle);

				totalLabelWidth += width;
			}

			if (totalLabelWidth > this.lineCoordinates.height * thresholdRatio) {
				skipLabels = true;
			}
		}
	}

	if (this._position === "bottom") {
		var i = 0;

		var label;
		var xy;

		for (i = 0; i < this._labels.length; i++) {

			label = this._labels[i];
			if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue;

			xy = this.getPixelCoordinatesOnAxis(label.position);

			if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") {

				if (this._labels[i].stripLine) {
					stripLine = this._labels[i].stripLine;
					this.ctx.lineWidth = stripLine.thickness;
					this.ctx.strokeStyle = stripLine.color;
				} else {
					this.ctx.lineWidth = this.tickThickness;
					this.ctx.strokeStyle = this.tickColor;
				}

				var tickX = this.ctx.lineWidth % 2 === 1 ? (xy.x << 0) + .5 : xy.x << 0;
				this.ctx.beginPath();
				this.ctx.moveTo(tickX, xy.y << 0);
				this.ctx.lineTo(tickX, xy.y + this.tickLength << 0);
				this.ctx.stroke();
			}

			//Don't skip stripLine's labels
			if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue;

			if (label.textBlock.angle === 0) {
				xy.x -= label.textBlock.width / 2;
				//xy.y += this.tickLength + label.textBlock.height / 2;
				xy.y += this.tickLength + label.textBlock.fontSize / 2;
			} else {
				xy.x -= this.labelAngle < 0 ? label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) : 0;
				xy.y += this.tickLength + Math.abs(this.labelAngle < 0 ? label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle) - 5 : 5);
			}
			label.textBlock.x = xy.x;
			label.textBlock.y = xy.y;

			label.textBlock.render(true);
		}

		if (this.title) {

			this._titleTextBlock = new _text_block2.default(this.ctx, {
				x: this.lineCoordinates.x1, // This is recalculated again
				y: this.boundingRect.y2 - this.titleFontSize - 5, // This is recalculated again
				maxWidth: this.lineCoordinates.width,
				maxHeight: this.titleFontSize * 1.5,
				angle: 0,
				text: this.title,
				horizontalAlign: "center", //left, center, right
				fontSize: this.titleFontSize, //in pixels
				fontFamily: this.titleFontFamily,
				fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter,
				fontColor: this.titleFontColor,
				fontStyle: this.titleFontStyle, // normal, italic, oblique
				textBaseline: "top"
			});

			this._titleTextBlock.measureText();
			this._titleTextBlock.x = this.lineCoordinates.x1 + this.lineCoordinates.width / 2 - this._titleTextBlock.width / 2;
			this._titleTextBlock.y = this.boundingRect.y2 - this._titleTextBlock.height - 3;
			this._titleTextBlock.render(true);
		}
	} else if (this._position === "top") {
		var i = 0;

		var label;
		var xy;
		var stripLine;

		for (i = 0; i < this._labels.length; i++) {
			label = this._labels[i];
			if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue;

			xy = this.getPixelCoordinatesOnAxis(label.position);

			if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") {

				if (this._labels[i].stripLine) {
					stripLine = this._labels[i].stripLine;

					this.ctx.lineWidth = stripLine.thickness;
					this.ctx.strokeStyle = stripLine.color;
				} else {
					this.ctx.lineWidth = this.tickThickness;
					this.ctx.strokeStyle = this.tickColor;
				}

				var tickX = this.ctx.lineWidth % 2 === 1 ? (xy.x << 0) + .5 : xy.x << 0;
				this.ctx.beginPath();
				this.ctx.moveTo(tickX, xy.y << 0);
				this.ctx.lineTo(tickX, xy.y - this.tickLength << 0);
				this.ctx.stroke();
			}

			//Don't skip stripLine's labels
			if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue;

			if (label.textBlock.angle === 0) {
				xy.x -= label.textBlock.width / 2;
				xy.y -= this.tickLength + label.textBlock.height / 2;
			} else {
				xy.x -= this.labelAngle > 0 ? label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) : 0;
				xy.y -= this.tickLength + Math.abs(this.labelAngle > 0 ? label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle) + 5 : 5);
			}
			label.textBlock.x = xy.x;
			label.textBlock.y = xy.y;

			label.textBlock.render(true);
		}

		if (this.title) {

			this._titleTextBlock = new _text_block2.default(this.ctx, {
				x: this.lineCoordinates.x1, // This is recalculated again
				y: this.boundingRect.y1 + 1,
				maxWidth: this.lineCoordinates.width,
				maxHeight: this.titleFontSize * 1.5,
				angle: 0,
				text: this.title,
				horizontalAlign: "center", //left, center, right
				fontSize: this.titleFontSize, //in pixels
				fontFamily: this.titleFontFamily,
				fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter,
				fontColor: this.titleFontColor,
				fontStyle: this.titleFontStyle, // normal, italic, oblique
				textBaseline: "top"
			});

			this._titleTextBlock.measureText();
			this._titleTextBlock.x = this.lineCoordinates.x1 + this.lineCoordinates.width / 2 - this._titleTextBlock.width / 2;
			this._titleTextBlock.render(true);
		}
	} else if (this._position === "left") {

		var label;
		var xy;
		for (var i = 0; i < this._labels.length; i++) {
			label = this._labels[i];
			if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue;

			xy = this.getPixelCoordinatesOnAxis(label.position);

			if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") {

				if (this._labels[i].stripLine) {
					stripLine = this._labels[i].stripLine;

					this.ctx.lineWidth = stripLine.thickness;
					this.ctx.strokeStyle = stripLine.color;
				} else {
					this.ctx.lineWidth = this.tickThickness;
					this.ctx.strokeStyle = this.tickColor;
				}

				var tickY = this.ctx.lineWidth % 2 === 1 ? (xy.y << 0) + .5 : xy.y << 0;
				this.ctx.beginPath();
				this.ctx.moveTo(xy.x << 0, tickY);
				this.ctx.lineTo(xy.x - this.tickLength << 0, tickY);
				this.ctx.stroke();
			}

			//Don't skip stripLine's labels
			if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue;

			label.textBlock.x = xy.x - label.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) - this.tickLength - 5;

			if (this.labelAngle === 0) {
				label.textBlock.y = xy.y;
			} else label.textBlock.y = xy.y - label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle);

			label.textBlock.render(true);
		}

		if (this.title) {

			this._titleTextBlock = new _text_block2.default(this.ctx, {
				x: this.boundingRect.x1 + 1,
				y: this.lineCoordinates.y2,
				maxWidth: this.lineCoordinates.height,
				maxHeight: this.titleFontSize * 1.5,
				angle: -90,
				text: this.title,
				horizontalAlign: "center", //left, center, right
				fontSize: this.titleFontSize, //in pixels
				fontFamily: this.titleFontFamily,
				fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter,
				fontColor: this.titleFontColor,
				fontStyle: this.titleFontStyle, // normal, italic, oblique
				textBaseline: "top"
			});

			var size = this._titleTextBlock.measureText();

			//this._titleTextBlock.x -= 4;

			this._titleTextBlock.y = this.lineCoordinates.height / 2 + this._titleTextBlock.width / 2 + this.lineCoordinates.y1;
			this._titleTextBlock.render(true);

			//if (isDebugMode) {
			//	window.console.log("titleFontSize: " + this.titleFontSize + "; width: " + size.width + "; height: " + size.height);
			//	window.console.log("this.boundingRect.x1: " + this.boundingRect.x1);

			//	//this.ctx.rect(this._titleTextBlock.x, this._titleTextBlock.y, this._titleTextBlock.height, -this._titleTextBlock.width);
			//	//this.ctx.stroke();

			//}
		}
	} else if (this._position === "right") {

			var label;
			var xy;

			for (var i = 0; i < this._labels.length; i++) {
				label = this._labels[i];
				if (label.position < this.viewportMinimum || label.position > this.viewportMaximum) continue;

				xy = this.getPixelCoordinatesOnAxis(label.position);

				if (this.tickThickness && !this._labels[i].stripLine || this._labels[i].stripLine && this._labels[i].stripLine._thicknessType === "pixel") {

					if (this._labels[i].stripLine) {
						stripLine = this._labels[i].stripLine;

						this.ctx.lineWidth = stripLine.thickness;
						this.ctx.strokeStyle = stripLine.color;
					} else {
						this.ctx.lineWidth = this.tickThickness;
						this.ctx.strokeStyle = this.tickColor;
					}

					var tickY = this.ctx.lineWidth % 2 === 1 ? (xy.y << 0) + .5 : xy.y << 0;
					this.ctx.beginPath();
					this.ctx.moveTo(xy.x << 0, tickY);
					this.ctx.lineTo(xy.x + this.tickLength << 0, tickY);
					this.ctx.stroke();
				}

				//Don't skip stripLine's labels
				if (skipLabels && labelCount++ % 2 !== 0 && !this._labels[i].stripLine) continue;

				label.textBlock.x = xy.x + this.tickLength + 5;
				//label.textBlock.y = xy.y - (label.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle));
				if (this.labelAngle === 0) {
					label.textBlock.y = xy.y;
				} else label.textBlock.y = xy.y;

				label.textBlock.render(true);
			}

			if (this.title) {

				this._titleTextBlock = new _text_block2.default(this.ctx, {
					x: this.boundingRect.x2 - 1,
					y: this.lineCoordinates.y2,
					maxWidth: this.lineCoordinates.height,
					maxHeight: this.titleFontSize * 1.5,
					angle: 90,
					text: this.title,
					horizontalAlign: "center", //left, center, right
					fontSize: this.titleFontSize, //in pixels
					fontFamily: this.titleFontFamily,
					fontWeight: this.titleFontWeight, //normal, bold, bolder, lighter,
					fontColor: this.titleFontColor,
					fontStyle: this.titleFontStyle, // normal, italic, oblique
					textBaseline: "top"
				});

				this._titleTextBlock.measureText();
				this._titleTextBlock.y = this.lineCoordinates.height / 2 - this._titleTextBlock.width / 2 + this.lineCoordinates.y1;
				this._titleTextBlock.render(true);
			}
		}
};

Axis.prototype.renderInterlacedColors = function () {
	var ctx = this.chart.plotArea.ctx;
	//return;

	var interlacedGridStartPoint;
	var interlacedGridEndPoint;
	var plotAreaCoordinates = this.chart.plotArea;
	var i = 0,
	    renderInterlacedGrid = true;

	if ((this._position === "bottom" || this._position === "top") && this.interlacedColor) {

		ctx.fillStyle = this.interlacedColor;

		for (i = 0; i < this._labels.length; i++) {

			if (this._labels[i].stripLine) continue;

			if (renderInterlacedGrid) {
				//So that the interlaced color alternates
				interlacedGridStartPoint = this.getPixelCoordinatesOnAxis(this._labels[i].position);

				if (i + 1 >= this._labels.length - 1) interlacedGridEndPoint = this.getPixelCoordinatesOnAxis(this.viewportMaximum);else interlacedGridEndPoint = this.getPixelCoordinatesOnAxis(this._labels[i + 1].position);

				ctx.fillRect(interlacedGridStartPoint.x, plotAreaCoordinates.y1, Math.abs(interlacedGridEndPoint.x - interlacedGridStartPoint.x), Math.abs(plotAreaCoordinates.y1 - plotAreaCoordinates.y2));
				renderInterlacedGrid = false;
			} else renderInterlacedGrid = true;
		}
	} else if ((this._position === "left" || this._position === "right") && this.interlacedColor) {

		ctx.fillStyle = this.interlacedColor;

		for (i = 0; i < this._labels.length; i++) {
			if (this._labels[i].stripLine) continue;

			if (renderInterlacedGrid) {
				//So that the interlaced color alternates

				interlacedGridEndPoint = this.getPixelCoordinatesOnAxis(this._labels[i].position);

				if (i + 1 >= this._labels.length - 1) interlacedGridStartPoint = this.getPixelCoordinatesOnAxis(this.viewportMaximum);else interlacedGridStartPoint = this.getPixelCoordinatesOnAxis(this._labels[i + 1].position);

				ctx.fillRect(plotAreaCoordinates.x1, interlacedGridStartPoint.y, Math.abs(plotAreaCoordinates.x1 - plotAreaCoordinates.x2), Math.abs(interlacedGridStartPoint.y - interlacedGridEndPoint.y));
				renderInterlacedGrid = false;
			} else renderInterlacedGrid = true;
		}
		//throw "123";
	}

	ctx.beginPath();
};

//Renders stripLines of given thickness type.
Axis.prototype.renderStripLinesOfThicknessType = function (thicknessType) {

	if (!(this.stripLines && this.stripLines.length > 0) || !thicknessType) return;

	var _this = this;

	var i = 0;
	for (i = 0; i < this.stripLines.length; i++) {

		var stripLine = this.stripLines[i];

		if (stripLine._thicknessType !== thicknessType) continue;

		//Should be skipped only if thicknessType is "pixel". If it is "value" then clipping is automatically applied before calling.
		if (thicknessType === "pixel" && (stripLine.value < this.viewportMinimum || stripLine.value > this.viewportMaximum)) continue;

		if (stripLine.showOnTop) {
			this.chart.addEventListener("dataAnimationIterationEnd", stripLine.render, stripLine);
		} else stripLine.render();
	}
};

Axis.prototype.renderGrid = function () {

	if (!(this.gridThickness && this.gridThickness > 0)) return;

	//var ctx = this.chart.plotArea.ctx;
	var ctx = this.chart.ctx;

	var xy;
	var plotAreaCoordinates = this.chart.plotArea;
	var stripLine;
	var tempLineWidth, tempStrokeStyle;
	//return;

	ctx.lineWidth = this.gridThickness;
	ctx.strokeStyle = this.gridColor;

	if (ctx.setLineDash) {
		ctx.setLineDash((0, _utils.getLineDashArray)(this.gridDashType, this.gridThickness));
	}

	if (this._position === "bottom" || this._position === "top") {

		for (i = 0; i < this._labels.length && !this._labels[i].stripLine; i++) {

			if (this._labels[i].position < this.viewportMinimum || this._labels[i].position > this.viewportMaximum) continue;

			ctx.beginPath();

			xy = this.getPixelCoordinatesOnAxis(this._labels[i].position);

			var gridX = ctx.lineWidth % 2 === 1 ? (xy.x << 0) + .5 : xy.x << 0;

			ctx.moveTo(gridX, plotAreaCoordinates.y1 << 0);
			ctx.lineTo(gridX, plotAreaCoordinates.y2 << 0);

			ctx.stroke();
		}
	} else if (this._position === "left" || this._position === "right") {

		for (var i = 0; i < this._labels.length && !this._labels[i].stripLine; i++) {

			if (i === 0 && this.type === "axisY" && this.chart.axisX && this.chart.axisX.lineThickness) continue;

			if (this._labels[i].position < this.viewportMinimum || this._labels[i].position > this.viewportMaximum) continue;

			ctx.beginPath();

			xy = this.getPixelCoordinatesOnAxis(this._labels[i].position);

			var gridY = ctx.lineWidth % 2 === 1 ? (xy.y << 0) + .5 : xy.y << 0;

			ctx.moveTo(plotAreaCoordinates.x1 << 0, gridY);
			ctx.lineTo(plotAreaCoordinates.x2 << 0, gridY);

			ctx.stroke();
		}
	}
};

Axis.prototype.renderAxisLine = function () {
	//var ctx = this.chart.plotArea.ctx;
	var ctx = this.chart.ctx;

	if (this._position === "bottom" || this._position === "top") {
		if (this.lineThickness) {
			ctx.lineWidth = this.lineThickness;
			ctx.strokeStyle = this.lineColor ? this.lineColor : "black";

			if (ctx.setLineDash) {
				ctx.setLineDash((0, _utils.getLineDashArray)(this.lineDashType, this.lineThickness));
			}

			var lineY = this.lineThickness % 2 === 1 ? (this.lineCoordinates.y1 << 0) + .5 : this.lineCoordinates.y1 << 0;

			ctx.beginPath();
			ctx.moveTo(this.lineCoordinates.x1, lineY);
			ctx.lineTo(this.lineCoordinates.x2, lineY);
			ctx.stroke();
		}
	} else if (this._position === "left" || this._position === "right") {
		if (this.lineThickness) {
			ctx.lineWidth = this.lineThickness;
			ctx.strokeStyle = this.lineColor;

			if (ctx.setLineDash) {
				ctx.setLineDash((0, _utils.getLineDashArray)(this.lineDashType, this.lineThickness));
			}

			var lineX = this.lineThickness % 2 === 1 ? (this.lineCoordinates.x1 << 0) + .5 : this.lineCoordinates.x1 << 0;

			ctx.beginPath();
			ctx.moveTo(lineX, this.lineCoordinates.y1);
			ctx.lineTo(lineX, this.lineCoordinates.y2);
			ctx.stroke();
		}
	}
};

Axis.prototype.getPixelCoordinatesOnAxis = function (value) {
	var xy = {};
	var width = this.lineCoordinates.width;
	var height = this.lineCoordinates.height;

	if (this._position === "bottom" || this._position === "top") {
		//var pixelPerUnit = width / Math.abs(this.viewportMaximum - this.viewportMinimum);
		var pixelPerUnit = this.conversionParameters.pixelPerUnit;

		//xy.x = this.lineCoordinates.x1 + (pixelPerUnit * (value - this.viewportMinimum));
		xy.x = this.conversionParameters.reference + pixelPerUnit * (value - this.viewportMinimum);
		xy.y = this.lineCoordinates.y1;
	}
	if (this._position === "left" || this._position === "right") {
		//var pixelPerUnit = height / Math.abs(this.viewportMaximum - this.viewportMinimum);
		var pixelPerUnit = -this.conversionParameters.pixelPerUnit;

		//xy.y = this.lineCoordinates.y2 - (pixelPerUnit * (value - this.viewportMinimum));
		xy.y = this.conversionParameters.reference - pixelPerUnit * (value - this.viewportMinimum);
		xy.x = this.lineCoordinates.x2;
	}

	return xy;
};

Axis.prototype.convertPixelToValue = function (pixel) {

	if (!pixel) return null;

	var value = 0;
	var p = this._position === "left" || this._position === "right" ? pixel.y : pixel.x;

	value = this.conversionParameters.minimum + (p - this.conversionParameters.reference) / this.conversionParameters.pixelPerUnit;

	return value;
};

Axis.prototype.setViewPortRange = function (viewportMinimum, viewportMaximum) {

	this.sessionVariables.newViewportMinimum = this.viewportMinimum = Math.min(viewportMinimum, viewportMaximum);
	this.sessionVariables.newViewportMaximum = this.viewportMaximum = Math.max(viewportMinimum, viewportMaximum);
};

Axis.prototype.getXValueAt = function (pixel) {
	if (!pixel) return null;

	var xval = null;

	if (this._position === "left") {
		xval = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.height * (this.chart.axisX.lineCoordinates.y2 - pixel.y) + this.chart.axisX.viewportMinimum;
	} else if (this._position === "bottom") {
		xval = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.width * (pixel.x - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.viewportMinimum;
	}

	return xval;
};

Axis.prototype.calculateValueToPixelConversionParameters = function (value) {
	this.reversed = false;

	var conversionParameters = {
		pixelPerUnit: null, minimum: null, reference: null
	};

	var width = this.lineCoordinates.width;
	var height = this.lineCoordinates.height;

	conversionParameters.minimum = this.viewportMinimum;

	if (this._position === "bottom" || this._position === "top") {
		conversionParameters.pixelPerUnit = (this.reversed ? -1 : 1) * width / Math.abs(this.viewportMaximum - this.viewportMinimum);
		conversionParameters.reference = this.reversed ? this.lineCoordinates.x2 : this.lineCoordinates.x1;
	}

	if (this._position === "left" || this._position === "right") {
		conversionParameters.pixelPerUnit = (this.reversed ? 1 : -1) * height / Math.abs(this.viewportMaximum - this.viewportMinimum);
		conversionParameters.reference = this.reversed ? this.lineCoordinates.y1 : this.lineCoordinates.y2;
	}

	this.conversionParameters = conversionParameters;
};

Axis.prototype.calculateAxisParameters = function () {

	var freeSpace = this.chart.layoutManager.getFreeSpace();
	var availableWidth = 0;
	var availableHeight = 0;
	var isLessThanTwoDataPoints = false;

	if (this._position === "bottom" || this._position === "top") {
		this.maxWidth = freeSpace.width;
		this.maxHeight = freeSpace.height;
	} else {
		this.maxWidth = freeSpace.height;
		this.maxHeight = freeSpace.width;
	}

	var noTicks = this.type === "axisX" ? this.maxWidth < 500 ? 8 : Math.max(6, Math.floor(this.maxWidth / 62)) : Math.max(Math.floor(this.maxWidth / 40), 2);
	var min, max;
	var minDiff;
	var range;
	var rangePadding = 0;

	if (this.viewportMinimum === null || isNaN(this.viewportMinimum)) this.viewportMinimum = this.minimum;

	if (this.viewportMaximum === null || isNaN(this.viewportMaximum)) this.viewportMaximum = this.maximum;

	if (this.type === "axisX") {
		min = this.viewportMinimum !== null ? this.viewportMinimum : this.dataInfo.viewPortMin;
		max = this.viewportMaximum !== null ? this.viewportMaximum : this.dataInfo.viewPortMax;

		if (max - min === 0) {
			rangePadding = typeof this._options.interval === "undefined" ? .4 : this._options.interval;

			max += rangePadding;
			min -= rangePadding;
		}

		if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) {
			minDiff = Math.abs(max - min) * .5;
		} else {
			minDiff = 1;

			if (this.chart.plotInfo.axisXValueType === "dateTime") isLessThanTwoDataPoints = true;
		}
	} else if (this.type === "axisY") {

		//min = typeof (this._options.viewportMinimum) === "undefined" || this._options.viewportMinimum === null ? this.dataInfo.viewPortMin : this._options.viewportMinimum;
		//max = typeof (this._options.viewportMaximum) === "undefined" || this._options.viewportMaximum === null ? this.dataInfo.viewPortMax : this._options.viewportMaximum;
		min = this.viewportMinimum !== null ? this.viewportMinimum : this.dataInfo.viewPortMin;
		max = this.viewportMaximum !== null ? this.viewportMaximum : this.dataInfo.viewPortMax;

		if (!isFinite(min) && !isFinite(max)) {
			max = typeof this._options.interval === "undefined" ? -Infinity : this._options.interval;
			min = 0;
		} else if (!isFinite(min)) {
			min = max;
		} else if (!isFinite(max)) {
			max = min;
		}

		if (min === 0 && max === 0) {
			// When all dataPoints are zero
			max += 9;
			min = 0;
		} else if (max - min === 0) {
			// When there is only a single dataPoint or when all dataPoints have same Y Value
			rangePadding = Math.min(Math.abs(Math.abs(max) * .01), 5);
			max += rangePadding;
			min -= rangePadding;
		} else if (min > max) {
			rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), 5);

			if (max >= 0) min = max - rangePadding;else max = min + rangePadding;
		} else {

			rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), .05);

			if (max !== 0) max += rangePadding;
			if (min !== 0) min -= rangePadding;
		}

		if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) {
			minDiff = Math.abs(max - min) * .5;
		} else {
			minDiff = 1;
		}

		//Apply includeZero
		if (this.includeZero && (this.viewportMinimum === null || isNaN(this.viewportMinimum))) {
			if (min > 0) min = 0;
		}
		if (this.includeZero && (this.viewportMaximum === null || isNaN(this.viewportMaximum))) {
			if (max < 0) max = 0;
		}
	}

	range = (isNaN(this.viewportMaximum) || this.viewportMaximum === null ? max : this.viewportMaximum) - (isNaN(this.viewportMinimum) || this.viewportMinimum === null ? min : this.viewportMinimum);

	if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") {

		if (!this.intervalType) {

			if (range / (1 * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "millisecond";
			} else if (range / (1 * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "millisecond";
			} else if (range / (1 * 5) <= noTicks) {
				this.interval = 5;
				this.intervalType = "millisecond";
			} else if (range / (1 * 10) <= noTicks) {
				this.interval = 10;
				this.intervalType = "millisecond";
			} else if (range / (1 * 20) <= noTicks) {
				this.interval = 20;
				this.intervalType = "millisecond";
			} else if (range / (1 * 50) <= noTicks) {
				this.interval = 50;
				this.intervalType = "millisecond";
			} else if (range / (1 * 100) <= noTicks) {
				this.interval = 100;
				this.intervalType = "millisecond";
			} else if (range / (1 * 200) <= noTicks) {
				this.interval = 200;
				this.intervalType = "millisecond";
			} else if (range / (1 * 250) <= noTicks) {
				this.interval = 250;
				this.intervalType = "millisecond";
			} else if (range / (1 * 300) <= noTicks) {
				this.interval = 300;
				this.intervalType = "millisecond";
			} else if (range / (1 * 400) <= noTicks) {
				this.interval = 400;
				this.intervalType = "millisecond";
			} else if (range / (1 * 500) <= noTicks) {
				this.interval = 500;
				this.intervalType = "millisecond";
			} else if (range / (constants.secondDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "second";
			} else if (range / (constants.secondDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "second";
			} else if (range / (constants.secondDuration * 5) <= noTicks) {
				this.interval = 5;
				this.intervalType = "second";
			} else if (range / (constants.secondDuration * 10) <= noTicks) {
				this.interval = 10;
				this.intervalType = "second";
			} else if (range / (constants.secondDuration * 15) <= noTicks) {
				this.interval = 15;
				this.intervalType = "second";
			} else if (range / (constants.secondDuration * 20) <= noTicks) {
				this.interval = 20;
				this.intervalType = "second";
			} else if (range / (constants.secondDuration * 30) <= noTicks) {
				this.interval = 30;
				this.intervalType = "second";
			} else if (range / (constants.minuteDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "minute";
			} else if (range / (constants.minuteDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "minute";
			} else if (range / (constants.minuteDuration * 5) <= noTicks) {
				this.interval = 5;
				this.intervalType = "minute";
			} else if (range / (constants.minuteDuration * 10) <= noTicks) {
				this.interval = 10;
				this.intervalType = "minute";
			} else if (range / (constants.minuteDuration * 15) <= noTicks) {
				this.interval = 15;
				this.intervalType = "minute";
			} else if (range / (constants.minuteDuration * 20) <= noTicks) {
				this.interval = 20;
				this.intervalType = "minute";
			} else if (range / (constants.minuteDuration * 30) <= noTicks) {
				this.interval = 30;
				this.intervalType = "minute";
			} else if (range / (constants.hourDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "hour";
			} else if (range / (constants.hourDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "hour";
			} else if (range / (constants.hourDuration * 3) <= noTicks) {
				this.interval = 3;
				this.intervalType = "hour";
			} else if (range / (constants.hourDuration * 6) <= noTicks) {
				this.interval = 6;
				this.intervalType = "hour";
			} else if (range / (constants.dayDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "day";
			} else if (range / (constants.dayDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "day";
			} else if (range / (constants.dayDuration * 4) <= noTicks) {
				this.interval = 4;
				this.intervalType = "day";
			} else if (range / (constants.weekDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "week";
			} else if (range / (constants.weekDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "week";
			} else if (range / (constants.weekDuration * 3) <= noTicks) {
				this.interval = 3;
				this.intervalType = "week";
			} else if (range / (constants.monthDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "month";
			} else if (range / (constants.monthDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "month";
			} else if (range / (constants.monthDuration * 3) <= noTicks) {
				this.interval = 3;
				this.intervalType = "month";
			} else if (range / (constants.monthDuration * 6) <= noTicks) {
				this.interval = 6;
				this.intervalType = "month";
			} else if (range / (constants.yearDuration * 1) <= noTicks) {
				this.interval = 1;
				this.intervalType = "year";
			} else if (range / (constants.yearDuration * 2) <= noTicks) {
				this.interval = 2;
				this.intervalType = "year";
			} else if (range / (constants.yearDuration * 4) <= noTicks) {
				this.interval = 4;
				this.intervalType = "year";
			} else {
				this.interval = Math.floor(Axis.getNiceNumber(range / (noTicks - 1), true) / constants.yearDuration);
				this.intervalType = "year";
			}
		}

		if (this.viewportMinimum === null || isNaN(this.viewportMinimum)) this.viewportMinimum = min - minDiff / 2;

		if (this.viewportMaximum === null || isNaN(this.viewportMaximum)) this.viewportMaximum = max + minDiff / 2;

		if (!this.valueFormatString) {
			if (isLessThanTwoDataPoints) {
				this.valueFormatString = "MMM DD YYYY HH:mm";
			} else if (this.intervalType === "year") {
				this.valueFormatString = "YYYY";
			} else if (this.intervalType === "month") {
				this.valueFormatString = "MMM YYYY";
			} else if (this.intervalType === "week") {
				this.valueFormatString = "MMM DD YYYY";
			} else if (this.intervalType === "day") {
				this.valueFormatString = "MMM DD YYYY";
			} else if (this.intervalType === "hour") {
				this.valueFormatString = "hh:mm TT";
			} else if (this.intervalType === "minute") {
				this.valueFormatString = "hh:mm TT";
			} else if (this.intervalType === "second") {
				this.valueFormatString = "hh:mm:ss TT";
			} else if (this.intervalType === "millisecond") {
				this.valueFormatString = "fff'ms'";
			}
		}
	} else {

		this.intervalType = "number";

		range = Axis.getNiceNumber(range, false);

		if (this._options && this._options.interval) this.interval = this._options.interval;else {
			this.interval = Axis.getNiceNumber(range / (noTicks - 1), true);
		}

		if (this.viewportMinimum === null || isNaN(this.viewportMinimum)) {
			if (this.type === "axisX") this.viewportMinimum = min - minDiff / 2;else this.viewportMinimum = Math.floor(min / this.interval) * this.interval;
		}

		if (this.viewportMaximum === null || isNaN(this.viewportMaximum)) {
			if (this.type === "axisX") this.viewportMaximum = max + minDiff / 2;else this.viewportMaximum = Math.ceil(max / this.interval) * this.interval;
		}

		if (this.viewportMaximum === 0 && this.viewportMinimum === 0) {

			if (this._options.viewportMinimum === 0) {
				this.viewportMaximum += 10;
			} else if (this._options.viewportMaximum === 0) {
				this.viewportMinimum -= 10;
			}

			if (this._options && typeof this._options.interval === "undefined") {
				this.interval = Axis.getNiceNumber((this.viewportMaximum - this.viewportMinimum) / (noTicks - 1), true);
			}
		}
	}

	//Calculate minimum and maximum if not provided by the user
	if (this.minimum === null || this.maximum === null) {
		if (this.type === "axisX") {
			min = this.minimum !== null ? this.minimum : this.dataInfo.min;
			max = this.maximum !== null ? this.maximum : this.dataInfo.max;

			if (max - min === 0) {
				rangePadding = typeof this._options.interval === "undefined" ? .4 : this._options.interval;

				max += rangePadding;
				min -= rangePadding;
			}

			if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) {
				minDiff = Math.abs(max - min) * .5;
			} else {
				minDiff = 1;
			}
		} else if (this.type === "axisY") {

			min = this.minimum !== null ? this.minimum : this.dataInfo.min;
			max = this.maximum !== null ? this.maximum : this.dataInfo.max;

			if (!isFinite(min) && !isFinite(max)) {
				max = typeof this._options.interval === "undefined" ? -Infinity : this._options.interval;
				min = 0;
			} else if (min === 0 && max === 0) {
				// When all dataPoints are zero
				max += 9;
				min = 0;
			} else if (max - min === 0) {
				// When there is only a single dataPoint or when all dataPoints have same Y Value
				rangePadding = Math.min(Math.abs(Math.abs(max) * .01), 5);
				max += rangePadding;
				min -= rangePadding;
			} else if (min > max) {
				rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), 5);

				if (max >= 0) min = max - rangePadding;else max = min + rangePadding;
			} else {

				rangePadding = Math.min(Math.abs(Math.abs(max - min) * .01), .05);

				if (max !== 0) max += rangePadding;
				if (min !== 0) min -= rangePadding;
			}

			if (this.dataInfo.minDiff !== Infinity) minDiff = this.dataInfo.minDiff;else if (max - min > 1) {
				minDiff = Math.abs(max - min) * .5;
			} else {
				minDiff = 1;
			}

			//Apply includeZero
			if (this.includeZero && (this.minimum === null || isNaN(this.minimum))) {
				if (min > 0) min = 0;
			}
			if (this.includeZero && (this.maximum === null || isNaN(this.maximum))) {
				if (max < 0) max = 0;
			}
		}

		range = max - min;

		if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") {

			if (this.minimum === null || isNaN(this.minimum)) this.minimum = min - minDiff / 2;

			if (this.maximum === null || isNaN(this.maximum)) this.maximum = max + minDiff / 2;
		} else {

			this.intervalType = "number";

			if (this.minimum === null) {
				if (this.type === "axisX") this.minimum = min - minDiff / 2;else this.minimum = Math.floor(min / this.interval) * this.interval;

				this.minimum = Math.min(this.minimum, this.sessionVariables.viewportMinimum === null || isNaN(this.sessionVariables.viewportMinimum) ? Infinity : this.sessionVariables.viewportMinimum);
			}

			if (this.maximum === null) {
				if (this.type === "axisX") this.maximum = max + minDiff / 2;else this.maximum = Math.ceil(max / this.interval) * this.interval;

				this.maximum = Math.max(this.maximum, this.sessionVariables.viewportMaximum === null || isNaN(this.sessionVariables.viewportMaximum) ? -Infinity : this.sessionVariables.viewportMaximum);
			}

			//var nfrac = Math.max(-Math.floor(Math.log(d)/Math.LN10), 0); //number of fractional digits to show

			if (this.maximum === 0 && this.minimum === 0) {

				if (this._options.minimum === 0) {
					this.maximum += 10;
				} else if (this._options.maximum === 0) {
					this.minimum -= 10;
				}
			}
		}
	}

	this.viewportMinimum = Math.max(this.viewportMinimum, this.minimum);
	this.viewportMaximum = Math.min(this.viewportMaximum, this.maximum);

	if (this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime") this.intervalStartPosition = this.getLabelStartPoint(new Date(this.viewportMinimum), this.intervalType, this.interval);else this.intervalStartPosition = Math.floor((this.viewportMinimum + this.interval * .2) / this.interval) * this.interval;

	//Set valueFormatString
	if (!this.valueFormatString) {
		this.valueFormatString = "#,##0.##";

		range = Math.abs(this.viewportMaximum - this.viewportMinimum);

		if (range < 1) {
			var numberOfDecimals = Math.floor(Math.abs(Math.log(range) / Math.LN10)) + 2;

			if (isNaN(numberOfDecimals) || !isFinite(numberOfDecimals)) numberOfDecimals = 2;

			if (numberOfDecimals > 2) {
				for (var i = 0; i < numberOfDecimals - 2; i++) {
					this.valueFormatString += "#";
				}
			}
		}
	}

	//if (isDebugMode && window.console) {
	//    window.console.log(this.type + ": Min = " + this.viewportMinimum);
	//    window.console.log(this.type + ": Max = " + this.viewportMaximum);
	//    window.console.log(this.type + ": Interval = " + this.interval);
	//}
};

Axis.getNiceNumber = function (x, round) {

	var exp = Math.floor(Math.log(x) / Math.LN10);
	var f = x / Math.pow(10, exp);
	var nf;

	if (round) {
		if (f < 1.5) nf = 1;else if (f < 3) nf = 2;else if (f < 7) nf = 5;else nf = 10;
	} else {
		if (f <= 1) nf = 1;else if (f <= 2) nf = 2;else if (f <= 5) nf = 5;else nf = 10;
	}

	return Number((nf * Math.pow(10, exp)).toFixed(20));
};

Axis.prototype.getLabelStartPoint = function () {

	var intervalInMilliseconds = convertToNumber(this.interval, this.intervalType);
	var minimum = Math.floor(this.viewportMinimum / intervalInMilliseconds) * intervalInMilliseconds;
	var dateTime = new Date(minimum);

	if (this.intervalType === "millisecond") {
		//millisecond = dateTime.getMilliSecond();
		//millisecond = Math.floor((millisecond + this.interval) / this.interval) * this.interval;
	} else if (this.intervalType === "second") {
			if (dateTime.getMilliseconds() > 0) {
				dateTime.setSeconds(dateTime.getSeconds() + 1);
				dateTime.setMilliseconds(0);
			}
		} else if (this.intervalType === "minute") {
			if (dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) {
				dateTime.setMinutes(dateTime.getMinutes() + 1);
				dateTime.setSeconds(0);
				dateTime.setMilliseconds(0);
			}
		} else if (this.intervalType === "hour") {
			if (dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) {
				dateTime.setHours(dateTime.getHours() + 1);
				dateTime.setMinutes(0);
				dateTime.setSeconds(0);
				dateTime.setMilliseconds(0);
			}
		} else if (this.intervalType === "day") {
			if (dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) {
				dateTime.setDate(dateTime.getDate() + 1);
				dateTime.setHours(0);
				dateTime.setMinutes(0);
				dateTime.setSeconds(0);
				dateTime.setMilliseconds(0);
			}
		} else if (this.intervalType === "week") {
			if (dateTime.getDay() > 0 || dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) {
				dateTime.setDate(dateTime.getDate() + (7 - dateTime.getDay()));
				dateTime.setHours(0);
				dateTime.setMinutes(0);
				dateTime.setSeconds(0);
				dateTime.setMilliseconds(0);
			}
		} else if (this.intervalType === "month") {
			if (dateTime.getDate() > 1 || dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) {
				dateTime.setMonth(dateTime.getMonth() + 1);
				dateTime.setDate(1);
				dateTime.setHours(0);
				dateTime.setMinutes(0);
				dateTime.setSeconds(0);
				dateTime.setMilliseconds(0);
			}
		} else if (this.intervalType === "year") {
			if (dateTime.getMonth() > 0 || dateTime.getDate() > 1 || dateTime.getHours() > 0 || dateTime.getMinutes() > 0 || dateTime.getSeconds() > 0 || dateTime.getMilliseconds() > 0) {
				dateTime.setFullYear(dateTime.getFullYear() + 1);
				dateTime.setMonth(0);
				dateTime.setDate(1);
				dateTime.setHours(0);
				dateTime.setMinutes(0);
				dateTime.setSeconds(0);
				dateTime.setMilliseconds(0);
			}
		}

	return dateTime;
};

exports.default = Axis;

},{"../helpers/utils":39,"./canvasjs":27,"./text_block":34}],27:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _themes = require('../constants/themes');

var _options = require('../constants/options');

function CanvasJSObject(defaultsKey, options, theme, parent) {
  this._defaultsKey = defaultsKey;

  this.parent = parent;

  this._eventListeners = []; //Multidimentional array with an array for each event type

  var currentThemeOptions = {};

  if (theme && _themes.themes[theme] && _themes.themes[theme][defaultsKey]) currentThemeOptions = _themes.themes[theme][defaultsKey];

  this._options = options ? options : {};
  this.setOptions(this._options, currentThemeOptions);
}

CanvasJSObject.prototype.setOptions = function (options, currentThemeOptions) {

  if (!_options.defaultOptions[this._defaultsKey]) {
    if (_options.isDebugMode && window.console) console.log("defaults not set");
  } else {
    var defaults = _options.defaultOptions[this._defaultsKey];

    for (var prop in defaults) {

      if (defaults.hasOwnProperty(prop)) {
        if (options && prop in options) this[prop] = options[prop];else if (currentThemeOptions && prop in currentThemeOptions) this[prop] = currentThemeOptions[prop];else this[prop] = defaults[prop];

        //if (typeof this[prop] === "function") {
        //    alert("function");
        //    this[prop] = this[prop]();
        //}
      }
    }
  }
};

// Update options. Returns true if changed or else false
CanvasJSObject.prototype.updateOption = function (prop) {

  if (!_options.defaultOptions[this._defaultsKey] && _options.isDebugMode && window.console) console.log("defaults not set");

  var defaults = _options.defaultOptions[this._defaultsKey];
  var theme = this._options.theme ? this._options.theme : this.chart && this.chart._options.theme ? this.chart._options.theme : "theme1";

  var currentThemeOptions = {};
  var newValue = this[prop];

  if (theme && _themes.themes[theme] && _themes.themes[theme][this._defaultsKey]) currentThemeOptions = _themes.themes[theme][this._defaultsKey];

  if (prop in defaults) {
    if (prop in this._options) newValue = this._options[prop];else if (currentThemeOptions && prop in currentThemeOptions) newValue = currentThemeOptions[prop];else newValue = defaults[prop];
  }

  if (newValue === this[prop]) return false;

  this[prop] = newValue;
  return true;
};

//Stores values in _oldOptions so that it can be tracked for any changes
CanvasJSObject.prototype.trackChanges = function (option) {
  if (!this.sessionVariables) throw "Session Variable Store not set";

  this.sessionVariables[option] = this._options[option];
};

CanvasJSObject.prototype.isBeingTracked = function (option) {
  if (!this._options._oldOptions) this._options._oldOptions = {};

  if (this._options._oldOptions[option]) return true;else return false;
};

CanvasJSObject.prototype.hasOptionChanged = function (option) {
  if (!this.sessionVariables) throw "Session Variable Store not set";

  var hasChanged = !(this.sessionVariables[option] === this._options[option]);

  return hasChanged;
};

CanvasJSObject.prototype.addEventListener = function (eventName, eventHandler, context) {
  if (!eventName || !eventHandler) return;

  context = context || this;

  this._eventListeners[eventName] = this._eventListeners[eventName] || [];

  this._eventListeners[eventName].push({ context: context, eventHandler: eventHandler });
};

CanvasJSObject.prototype.removeEventListener = function (eventName, eventHandler) {
  if (!eventName || !eventHandler || !this._eventListeners[eventName]) return;

  var listeners = this._eventListeners[eventName];
  for (var i = 0; i < listeners.length; i++) {

    if (listeners[i].eventHandler === eventHandler) {
      listeners[i].splice(i, 1);
      break;
    }
  }
};

CanvasJSObject.prototype.removeAllEventListeners = function () {
  this._eventListeners = [];
};

CanvasJSObject.prototype.dispatchEvent = function (eventName, eventParameter, context) {

  //For Internal Events
  if (eventName && this._eventListeners[eventName]) {

    eventParameter = eventParameter || {};

    var listeners = this._eventListeners[eventName];
    for (var i = 0; i < listeners.length; i++) {

      listeners[i].eventHandler.call(listeners[i].context, eventParameter);
    }
  }

  //External Events do not require registering as the property name is suffient to fire the event.
  if (typeof this[eventName] === "function") {
    this[eventName].call(context || this.chart._publicChartReference, eventParameter);
  }
};

exports.default = CanvasJSObject;

},{"../constants/options":23,"../constants/themes":24}],28:[function(require,module,exports){
'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _canvasjs=require('./canvasjs');var _canvasjs2=_interopRequireDefault(_canvasjs);var _animator=require('./animator');var _animator2=_interopRequireDefault(_animator);var _data_series=require('./data_series');var _data_series2=_interopRequireDefault(_data_series);var _text_block=require('./text_block');var _text_block2=_interopRequireDefault(_text_block);var _render=require('../helpers/render');var _render2=_interopRequireDefault(_render);var _layout_manager=require('./layout_manager');var _layout_manager2=_interopRequireDefault(_layout_manager);var _event_manager=require('./event_manager');var _event_manager2=_interopRequireDefault(_event_manager);var _tooltip=require('./tooltip');var _tooltip2=_interopRequireDefault(_tooltip);var _culture_info=require('../core/culture_info');var _culture_info2=_interopRequireDefault(_culture_info);var _axis=require('../core/axis');var _axis2=_interopRequireDefault(_axis);var _title=require('../core/title');var _title2=_interopRequireDefault(_title);var _legend=require('../core/legend');var _legend2=_interopRequireDefault(_legend);var _animator3=require('../helpers/animator');var _animator4=_interopRequireDefault(_animator3);var _themes=require('../constants/themes');var _options=require('../constants/options');var _utils=require('../helpers/utils');var _index=require('../charts/index');function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{default:obj};} // import {inherits} from 'util';
function Chart(containerId,options,publicChartReference){this._publicChartReference = publicChartReference;options = options || {};Chart.base.constructor.call(this,"Chart",options,options.theme?options.theme:"theme1");var _this=this;this._containerId = containerId;this._objectsInitialized = false;this.ctx = null;this.overlaidCanvasCtx = null;this._indexLabels = [];this._panTimerId = 0;this._lastTouchEventType = "";this._lastTouchData = null;this.isAnimating = false;this.renderCount = 0;this.animatedRender = false;this.disableToolTip = false;this.panEnabled = false;this._defaultCursor = "default";this.plotArea = {canvas:null,ctx:null,x1:0,y1:0,x2:0,y2:0,width:0,height:0};this._dataInRenderedOrder = [];this._container = typeof this._containerId === "string"?document.getElementById(this._containerId):this._containerId;if(!this._container){if(window.console)window.console.log("CanvasJS Error: Chart Container with id \"" + this._containerId + "\" was not found");return;}this._container.innerHTML = "";var width=0;var height=0;if(this._options.width)width = this.width;else width = this._container.clientWidth > 0?this._container.clientWidth:this.width;if(this._options.height)height = this.height;else height = this._container.clientHeight > 0?this._container.clientHeight:this.height;this.width = width;this.height = height;this.x1 = this.y1 = 0;this.x2 = this.width;this.y2 = this.height;this._selectedColorSet = typeof _themes.colorSets[this.colorSet] !== "undefined"?_themes.colorSets[this.colorSet]:_themes.colorSets["colorSet1"];this._canvasJSContainer = document.createElement("div");this._canvasJSContainer.setAttribute("class","canvasjs-chart-container");this._canvasJSContainer.style.position = "relative";this._canvasJSContainer.style.textAlign = "left";this._canvasJSContainer.style.cursor = "auto";if(!_utils.isCanvasSupported){this._canvasJSContainer.style.height = "0px"; //In IE6 toolTip doesn't show at proper position if not set.
}this._container.appendChild(this._canvasJSContainer);this.canvas = (0,_utils.createCanvas)(width,height);this.canvas.style.position = "absolute";if(this.canvas.getContext){ //try {
//	this.canvas.style.background = this.backgroundColor;
//} catch (e) { }
this._canvasJSContainer.appendChild(this.canvas);this.ctx = this.canvas.getContext("2d");this.ctx.textBaseline = "top";(0,_utils.extendCtx)(this.ctx);}else return; //this.canvas.style.cursor = "pointer";
if(!_utils.isCanvasSupported){this.plotArea.canvas = (0,_utils.createCanvas)(width,height);this.plotArea.canvas.style.position = "absolute";this.plotArea.canvas.setAttribute("class","plotAreaCanvas");this._canvasJSContainer.appendChild(this.plotArea.canvas);this.plotArea.ctx = this.plotArea.canvas.getContext("2d");}else {this.plotArea.ctx = this.ctx;}this.overlaidCanvas = (0,_utils.createCanvas)(width,height);this.overlaidCanvas.style.position = "absolute";this._canvasJSContainer.appendChild(this.overlaidCanvas);this.overlaidCanvasCtx = this.overlaidCanvas.getContext("2d");this.overlaidCanvasCtx.textBaseline = "top";this._eventManager = new _event_manager2.default(this);(0,_utils.addEvent)(window,"resize",function(){ //this._container.addEventListener("DOMSubtreeModified", function () {
if(_this._updateSize())_this.render();});this._toolBar = document.createElement("div");this._toolBar.setAttribute("class","canvasjs-chart-toolbar");this._toolBar.style.cssText = "position: absolute; right: 1px; top: 1px;";this._canvasJSContainer.appendChild(this._toolBar);this.bounds = {x1:0,y1:0,x2:this.width,y2:this.height};(0,_utils.addEvent)(this.overlaidCanvas,'click',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,'mousemove',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,'mouseup',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,'mousedown',function(e){_this._mouseEventHandler(e);(0,_utils.hide)(_this._dropdownMenu);});(0,_utils.addEvent)(this.overlaidCanvas,'mouseout',function(e){_this._mouseEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerDown":"touchstart",function(e){_this._touchEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerMove":'touchmove',function(e){_this._touchEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerUp":'touchend',function(e){_this._touchEventHandler(e);});(0,_utils.addEvent)(this.overlaidCanvas,window.navigator.msPointerEnabled?"MSPointerCancel":'touchcancel',function(e){_this._touchEventHandler(e);});if(!this._creditLink){this._creditLink = document.createElement("a");this._creditLink.setAttribute("class","canvasjs-chart-credit");this._creditLink.setAttribute("style","outline:none;margin:0px;position:absolute;right:3px;top:" + (this.height - 14) + "px;color:dimgrey;text-decoration:none;font-size:10px;font-family:Lucida Grande, Lucida Sans Unicode, Arial, sans-serif");this._creditLink.setAttribute("tabIndex",-1);this._creditLink.setAttribute("target","_blank");}this._toolTip = new _tooltip2.default(this,this._options.toolTip,this.theme);this.data = null;this.axisX = null;this.axisY = null;this.axisY2 = null;this.sessionVariables = {axisX:{},axisY:{},axisY2:{}};}(0,_utils.extend)(Chart,_canvasjs2.default); //Update Chart Properties
Chart.prototype._updateOptions = function(){var _this=this;this.updateOption("width");this.updateOption("height");this.updateOption("dataPointMaxWidth");this.updateOption("interactivityEnabled");this.updateOption("theme");if(this.updateOption("colorSet"))this._selectedColorSet = typeof _themes.colorSets[this.colorSet] !== "undefined"?_themes.colorSets[this.colorSet]:_themes.colorSets["colorSet1"];this.updateOption("backgroundColor");if(!this.backgroundColor)this.backgroundColor = "rgba(0,0,0,0)";this.updateOption("culture");this._cultureInfo = new _culture_info2.default(this._options.culture);this.updateOption("animationEnabled");this.animationEnabled = this.animationEnabled && _utils.isCanvasSupported;this.updateOption("animationDuration");this.updateOption("rangeChanging");this.updateOption("rangeChanged"); //Need to check this._options.zoomEnabled because this.zoomEnabled is used internally to keep track of state - and hence changes.
if(this._options.zoomEnabled){if(!this._zoomButton){(0,_utils.hide)(this._zoomButton = document.createElement("button"));setButtonState(this,this._zoomButton,"pan");this._toolBar.appendChild(this._zoomButton);(0,_utils.addEvent)(this._zoomButton,"click",function(){if(_this.zoomEnabled){_this.zoomEnabled = false;_this.panEnabled = true;setButtonState(_this,_this._zoomButton,"zoom");}else {_this.zoomEnabled = true;_this.panEnabled = false;setButtonState(_this,_this._zoomButton,"pan");}_this.render();});}if(!this._resetButton){(0,_utils.hide)(this._resetButton = document.createElement("button"));setButtonState(this,this._resetButton,"reset");this._toolBar.appendChild(this._resetButton);(0,_utils.addEvent)(this._resetButton,"click",function(){_this._toolTip.hide();if(_this.zoomEnabled || _this.panEnabled){_this.zoomEnabled = true;_this.panEnabled = false;setButtonState(_this,_this._zoomButton,"pan");_this._defaultCursor = "default";_this.overlaidCanvas.style.cursor = _this._defaultCursor;}else {_this.zoomEnabled = false;_this.panEnabled = false;} //Reset axisX
if(_this.sessionVariables.axisX){_this.sessionVariables.axisX.newViewportMinimum = null;_this.sessionVariables.axisX.newViewportMaximum = null;} //Reset axisY
if(_this.sessionVariables.axisY){_this.sessionVariables.axisY.newViewportMinimum = null;_this.sessionVariables.axisY.newViewportMaximum = null;} //Reset axisY2
if(_this.sessionVariables.axisY2){_this.sessionVariables.axisY2.newViewportMinimum = null;_this.sessionVariables.axisY2.newViewportMaximum = null;}_this.resetOverlayedCanvas();(0,_utils.hide)(_this._zoomButton,_this._resetButton);_this._dispatchRangeEvent("rangeChanging","reset");_this.render();_this._dispatchRangeEvent("rangeChanged","reset");});this.overlaidCanvas.style.cursor = _this._defaultCursor;}if(!this.zoomEnabled && !this.panEnabled){if(!this._zoomButton){this.zoomEnabled = true;this.panEnabled = false;}else {if(_this._zoomButton.getAttribute("state") === _this._cultureInfo.zoomText){this.panEnabled = true;this.zoomEnabled = false;}else {this.zoomEnabled = true;this.panEnabled = false;}(0,_utils.show)(_this._zoomButton,_this._resetButton);}}}else {this.zoomEnabled = false;this.panEnabled = false;}if(this._menuButton){if(this.exportEnabled)(0,_utils.show)(this._menuButton);else (0,_utils.hide)(this._menuButton);}else if(this.exportEnabled && _utils.isCanvasSupported){this._menuButton = document.createElement("button");setButtonState(this,this._menuButton,"menu");this._toolBar.appendChild(this._menuButton);(0,_utils.addEvent)(this._menuButton,"click",function(){if(_this._dropdownMenu.style.display === "none"){if(_this._dropDownCloseTime && new Date().getTime() - _this._dropDownCloseTime.getTime() <= 500)return;_this._dropdownMenu.style.display = "block";_this._menuButton.blur();_this._dropdownMenu.focus();}},true);}if(!this._dropdownMenu && this.exportEnabled && _utils.isCanvasSupported){this._dropdownMenu = document.createElement("div");this._dropdownMenu.setAttribute("tabindex",-1);this._dropdownMenu.style.cssText = "position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 1px;top: 25px;min-width: 120px;outline: 0;border: 1px solid silver;font-size: 14px;font-family: Calibri, Verdana, sans-serif;padding: 5px 0px 5px 0px;text-align: left;background-color: #fff;line-height: 20px;box-shadow: 2px 2px 10px #888888;";_this._dropdownMenu.style.display = "none";this._toolBar.appendChild(this._dropdownMenu);(0,_utils.addEvent)(this._dropdownMenu,"blur",function(){(0,_utils.hide)(_this._dropdownMenu);_this._dropDownCloseTime = new Date();},true);var exportOption=document.createElement("div");exportOption.style.cssText = "padding: 2px 15px 2px 10px";exportOption.innerHTML = this._cultureInfo.saveJPGText;this._dropdownMenu.appendChild(exportOption);(0,_utils.addEvent)(exportOption,"mouseover",function(){this.style.backgroundColor = "#EEEEEE";},true);(0,_utils.addEvent)(exportOption,"mouseout",function(){this.style.backgroundColor = "transparent";},true);(0,_utils.addEvent)(exportOption,"click",function(){exportCanvas(_this.canvas,"jpg",_this.exportFileName);(0,_utils.hide)(_this._dropdownMenu);},true);var exportOption=document.createElement("div");exportOption.style.cssText = "padding: 2px 15px 2px 10px";exportOption.innerHTML = this._cultureInfo.savePNGText;this._dropdownMenu.appendChild(exportOption);(0,_utils.addEvent)(exportOption,"mouseover",function(){this.style.backgroundColor = "#EEEEEE";},true);(0,_utils.addEvent)(exportOption,"mouseout",function(){this.style.backgroundColor = "transparent";},true);(0,_utils.addEvent)(exportOption,"click",function(){exportCanvas(_this.canvas,"png",_this.exportFileName);(0,_utils.hide)(_this._dropdownMenu);},true);}if(this._toolBar.style.display !== "none" && this._zoomButton){this.panEnabled?setButtonState(_this,_this._zoomButton,"zoom"):setButtonState(_this,_this._zoomButton,"pan");if(_this._resetButton.getAttribute("state") !== _this._cultureInfo.resetText)setButtonState(_this,_this._resetButton,"reset");}if(typeof _options.defaultOptions.Chart.creditHref === "undefined"){this.creditHref = "http://canvasjs.com/";this.creditText = "CanvasJS.com";}else {var creditTextChanged=this.updateOption("creditText");var creditHrefChanged=this.updateOption("creditHref");}if(this.renderCount === 0 || creditTextChanged || creditHrefChanged){this._creditLink.setAttribute("href",this.creditHref);this._creditLink.innerHTML = this.creditText;}if(this.creditHref && this.creditText){if(!this._creditLink.parentElement)this._canvasJSContainer.appendChild(this._creditLink);}else if(this._creditLink.parentElement)this._canvasJSContainer.removeChild(this._creditLink);if(this._options.toolTip && this._toolTip._options !== this._options.toolTip)this._toolTip._options = this._options.toolTip;for(var prop in this._toolTip._options) {if(this._toolTip._options.hasOwnProperty(prop)){this._toolTip.updateOption(prop);}}};Chart.prototype._updateSize = function(){var width=0;var height=0;if(this._options.width)width = this.width;else this.width = width = this._container.clientWidth > 0?this._container.clientWidth:this.width;if(this._options.height)height = this.height;else this.height = height = this._container.clientHeight > 0?this._container.clientHeight:this.height;if(this.canvas.width !== width * _utils.devicePixelBackingStoreRatio || this.canvas.height !== height * _utils.devicePixelBackingStoreRatio){(0,_utils.setCanvasSize)(this.canvas,width,height);(0,_utils.setCanvasSize)(this.overlaidCanvas,width,height);(0,_utils.setCanvasSize)(this._eventManager.ghostCanvas,width,height);return true;}return false;}; // initialize chart objects
Chart.prototype._initialize = function(){ ///<signature>
///<summary>Initializes Chart objects/state. Creates DataSeries class instance for each DataSeries provided by ther user. Sets the Axis Type based on the user data</summary>
///</signature>
//this.width = this.width;
if(!this._animator)this._animator = new _animator2.default(this);else {this._animator.cancelAllAnimations();}this.removeAllEventListeners();this.disableToolTip = false;this._axes = [];this.pieDoughnutClickHandler = null; //this._touchCurrentCoordinates = null;
if(this.animationRequestId)this.cancelRequestAnimFrame.call(window,this.animationRequestId);this._updateOptions();this.animatedRender = _utils.isCanvasSupported && this.animationEnabled && this.renderCount === 0;this._updateSize(); //this._selectedColorSet = colorSets["colorSet2"];
//this.ctx.clearRect(0, 0, this.width, this.height);
this.clearCanvas();this.ctx.beginPath();this.axisX = null;this.axisY = null;this.axisY2 = null;this._indexLabels = [];this._dataInRenderedOrder = [];this._events = [];if(this._eventManager)this._eventManager.reset();this.plotInfo = {axisPlacement:null,axisXValueType:null,plotTypes:[] //array of plotType: {type:"", axisYType: "primary", dataSeriesIndexes:[]}
};this.layoutManager = new _layout_manager2.default(0,0,this.width,this.height,2);if(this.plotArea.layoutManager)this.plotArea.layoutManager.reset();this.data = [];var dataSeriesIndex=0;for(var series=0;series < this._options.data.length;series++) { //for (series in this._options.data) {
dataSeriesIndex++;if(!(!this._options.data[series].type || Chart._supportedChartTypes.indexOf(this._options.data[series].type) >= 0))continue;var dataSeries=new _data_series2.default(this,this._options.data[series],this.theme,dataSeriesIndex - 1,++this._eventManager.lastObjectId);if(dataSeries.name === null)dataSeries.name = "DataSeries " + dataSeriesIndex;if(dataSeries.color === null){if(this._options.data.length > 1){dataSeries._colorSet = [this._selectedColorSet[dataSeries.index % this._selectedColorSet.length]];dataSeries.color = this._selectedColorSet[dataSeries.index % this._selectedColorSet.length];}else {if(dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea" || dataSeries.type === "candlestick" || dataSeries.type === "ohlc"){dataSeries._colorSet = [this._selectedColorSet[0]];}else dataSeries._colorSet = this._selectedColorSet;}}else {dataSeries._colorSet = [dataSeries.color];}if(dataSeries.markerSize === null){if((dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline") && dataSeries.dataPoints && dataSeries.dataPoints.length < this.width / 16 || dataSeries.type === "scatter"){ //if (dataSeries.type === "line") {
dataSeries.markerSize = 8;}}if((dataSeries.type === "bubble" || dataSeries.type === "scatter") && dataSeries.dataPoints){dataSeries.dataPoints.sort(_utils.compareDataPointX);} //if (dataSeries.markerBorderThickness === null && dataSeries.type === "scatter") {
//    dataSeries.markerBorderThickness = 2;
//}
//if (dataSeries.markerType === null) {
//    if (dataSeries.type === "line" & dataSeries.dataPoints.length < 500) {
//        dataSeries.markerType = "circle";
//    }
//}
this.data.push(dataSeries);var seriesAxisPlacement=dataSeries.axisPlacement; //if (isDebugMode && window.console)
//    window.console.log(dataSeries.type);
var errorMessage;if(seriesAxisPlacement === "normal"){if(this.plotInfo.axisPlacement === "xySwapped"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with bar chart";}else if(this.plotInfo.axisPlacement === "none"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with pie chart";}else if(this.plotInfo.axisPlacement === null)this.plotInfo.axisPlacement = "normal";}else if(seriesAxisPlacement === "xySwapped"){if(this.plotInfo.axisPlacement === "normal"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with line, area, column or pie chart";}else if(this.plotInfo.axisPlacement === "none"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with pie chart";}else if(this.plotInfo.axisPlacement === null)this.plotInfo.axisPlacement = "xySwapped";}else if(seriesAxisPlacement == "none"){if(this.plotInfo.axisPlacement === "normal"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with line, area, column or bar chart";}else if(this.plotInfo.axisPlacement === "xySwapped"){errorMessage = "You cannot combine \"" + dataSeries.type + "\" with bar chart";}else if(this.plotInfo.axisPlacement === null)this.plotInfo.axisPlacement = "none";}if(errorMessage && window.console){window.console.log(errorMessage);return;}} //if (isDebugMode && window.console) {
//    window.console.log("xMin: " + this.plotInfo.viewPortXMin + "; xMax: " + this.plotInfo.viewPortXMax + "; yMin: " + this.plotInfo.yMin + "; yMax: " + this.plotInfo.yMax);
//}
this._objectsInitialized = true;}; //indexOf is not supported in IE8-
Chart._supportedChartTypes = (0,_utils.addArrayIndexOf)(["line","stepLine","spline","column","area","stepArea","splineArea","bar","bubble","scatter","stackedColumn","stackedColumn100","stackedBar","stackedBar100","stackedArea","stackedArea100","candlestick","ohlc","rangeColumn","rangeBar","rangeArea","rangeSplineArea","pie","doughnut","funnel"]);Chart.prototype.render = function(options){if(options)this._options = options;this._initialize();var plotAreaElements=[]; //Elements to be rendered inside the plotArea
//Create Primary and Secondary axis and assign them to the series
for(var i=0;i < this.data.length;i++) {if(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped"){if(!this.data[i].axisYType || this.data[i].axisYType === "primary"){if(!this.axisY){if(this.plotInfo.axisPlacement === "normal"){this._axes.push(this.axisY = new _axis2.default(this,this._options.axisY,"axisY","left"));}else if(this.plotInfo.axisPlacement === "xySwapped"){this._axes.push(this.axisY = new _axis2.default(this,this._options.axisY,"axisY","bottom"));}}this.data[i].axisY = this.axisY;}else if(this.data[i].axisYType === "secondary"){if(!this.axisY2){if(this.plotInfo.axisPlacement === "normal"){this._axes.push(this.axisY2 = new _axis2.default(this,this._options.axisY2,"axisY","right"));}else if(this.plotInfo.axisPlacement === "xySwapped"){this._axes.push(this.axisY2 = new _axis2.default(this,this._options.axisY2,"axisY","top"));}}this.data[i].axisY = this.axisY2;}if(!this.axisX){if(this.plotInfo.axisPlacement === "normal"){this._axes.push(this.axisX = new _axis2.default(this,this._options.axisX,"axisX","bottom"));}else if(this.plotInfo.axisPlacement === "xySwapped"){this._axes.push(this.axisX = new _axis2.default(this,this._options.axisX,"axisX","left"));}}this.data[i].axisX = this.axisX;}} //If Both Primary and Secondary axis are present, disable gridlines for one of them unless the user has set value for both
if(this.axisY && this.axisY2){if(this.axisY.gridThickness > 0 && typeof this.axisY2._options.gridThickness === "undefined")this.axisY2.gridThickness = 0;else if(this.axisY2.gridThickness > 0 && typeof this.axisY._options.gridThickness === "undefined")this.axisY.gridThickness = 0;} //Show toolBar when viewportMinimum/viewportMaximum are set
var showToolBar=false;if(this._axes.length > 0 && (this.zoomEnabled || this.panEnabled)){for(var i=0;i < this._axes.length;i++) {if(this._axes[i].viewportMinimum !== null || this._axes[i].viewportMaximum !== null){showToolBar = true;break;}}}if(showToolBar){(0,_utils.show)(this._zoomButton,this._resetButton);}else {(0,_utils.hide)(this._zoomButton,this._resetButton);}this._processData(); // Categorises the dataSeries and calculates min, max and other values
if(this._options.title){this._title = new _title2.default(this,this._options.title);if(!this._title.dockInsidePlotArea)this._title.render();else plotAreaElements.push(this._title);}if(this._options.subtitles){for(var i=0;i < this._options.subtitles.length;i++) {this.subtitles = [];var subtitle=new Subtitle(this,this._options.subtitles[i]);this.subtitles.push(subtitle);if(!subtitle.dockInsidePlotArea)subtitle.render();else plotAreaElements.push(subtitle);}}this.legend = new _legend2.default(this,this._options.legend,this.theme);for(var i=0;i < this.data.length;i++) {if(this.data[i].showInLegend || this.data[i].type === "pie" || this.data[i].type === "doughnut"){this.legend.dataSeries.push(this.data[i]);}}if(!this.legend.dockInsidePlotArea)this.legend.render();else plotAreaElements.push(this.legend); //TBI: Revisit and check if the functionality is enough.
if(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped"){ //var freeSpace = this.layoutManager.getFreeSpace();
_axis2.default.setLayoutAndRender(this.axisX,this.axisY,this.axisY2,this.plotInfo.axisPlacement,this.layoutManager.getFreeSpace());}else if(this.plotInfo.axisPlacement === "none"){ //In case of charts with axis this method is called inside setLayoutAndRender
this.preparePlotArea();}else {return;}var index=0;for(index in plotAreaElements) {if(plotAreaElements.hasOwnProperty(index))plotAreaElements[index].render();}var animations=[];if(this.animatedRender){var initialState=(0,_utils.createCanvas)(this.width,this.height);var initialStateCtx=initialState.getContext("2d");initialStateCtx.drawImage(this.canvas,0,0,this.width,this.height);}for(var i=0;i < this.plotInfo.plotTypes.length;i++) {var plotType=this.plotInfo.plotTypes[i];for(var j=0;j < plotType.plotUnits.length;j++) {var plotUnit=plotType.plotUnits[j];var animationInfo=null;plotUnit.targetCanvas = null; //In case chart updates before the animation is complete, previous canvases need to be removed
if(this.animatedRender){plotUnit.targetCanvas = (0,_utils.createCanvas)(this.width,this.height);plotUnit.targetCanvasCtx = plotUnit.targetCanvas.getContext("2d");}if(plotUnit.type === "line")animationInfo = this.renderLine(plotUnit);else if(plotUnit.type === "stepLine")animationInfo = this.renderStepLine(plotUnit);else if(plotUnit.type === "spline")animationInfo = this.renderSpline(plotUnit);else if(plotUnit.type === "column")animationInfo = this.renderColumn(plotUnit);else if(plotUnit.type === "bar")animationInfo = this.renderBar(plotUnit);else if(plotUnit.type === "area")animationInfo = this.renderArea(plotUnit);else if(plotUnit.type === "stepArea")animationInfo = this.renderStepArea(plotUnit);else if(plotUnit.type === "splineArea")animationInfo = this.renderSplineArea(plotUnit);else if(plotUnit.type === "stackedColumn")animationInfo = this.renderStackedColumn(plotUnit);else if(plotUnit.type === "stackedColumn100")animationInfo = this.renderStackedColumn100(plotUnit);else if(plotUnit.type === "stackedBar")animationInfo = this.renderStackedBar(plotUnit);else if(plotUnit.type === "stackedBar100")animationInfo = this.renderStackedBar100(plotUnit);else if(plotUnit.type === "stackedArea")animationInfo = this.renderStackedArea(plotUnit);else if(plotUnit.type === "stackedArea100")animationInfo = this.renderStackedArea100(plotUnit);else if(plotUnit.type === "bubble")animationInfo = animationInfo = this.renderBubble(plotUnit);else if(plotUnit.type === "scatter")animationInfo = this.renderScatter(plotUnit);else if(plotUnit.type === "pie")this.renderPie(plotUnit);else if(plotUnit.type === "doughnut")this.renderPie(plotUnit);else if(plotUnit.type === "candlestick")animationInfo = this.renderCandlestick(plotUnit);else if(plotUnit.type === "ohlc")animationInfo = this.renderCandlestick(plotUnit);else if(plotUnit.type === "rangeColumn")animationInfo = this.renderRangeColumn(plotUnit);else if(plotUnit.type === "rangeBar")animationInfo = this.renderRangeBar(plotUnit);else if(plotUnit.type === "rangeArea")animationInfo = this.renderRangeArea(plotUnit);else if(plotUnit.type === "rangeSplineArea")animationInfo = this.renderRangeSplineArea(plotUnit);for(var k=0;k < plotUnit.dataSeriesIndexes.length;k++) {this._dataInRenderedOrder.push(this.data[plotUnit.dataSeriesIndexes[k]]);}if(this.animatedRender && animationInfo)animations.push(animationInfo);}}if(this.animatedRender && this._indexLabels.length > 0){var indexLabelCanvas=(0,_utils.createCanvas)(this.width,this.height);var indexLabelCanvasCtx=indexLabelCanvas.getContext("2d");animations.push(this.renderIndexLabels(indexLabelCanvasCtx));}var _this=this;if(animations.length > 0){ //var animationCount = 0;
_this.disableToolTip = true;_this._animator.animate(200,_this.animationDuration,function(fractionComplete){ //console.log(fractionComplete);
//animationCount++;
_this.ctx.clearRect(0,0,_this.width,_this.height); //  _this.ctx.drawImage(initialState, 0, 0, _this.width * devicePixelBackingStoreRatio, _this.height * devicePixelBackingStoreRatio, 0, 0, _this.width, _this.height);
_this.ctx.drawImage(initialState,0,0,Math.floor(_this.width * _utils.devicePixelBackingStoreRatio),Math.floor(_this.height * _utils.devicePixelBackingStoreRatio),0,0,_this.width,_this.height);for(var l=0;l < animations.length;l++) {animationInfo = animations[l];if(fractionComplete < 1 && typeof animationInfo.startTimePercent !== "undefined"){if(fractionComplete >= animationInfo.startTimePercent){ //animationInfo.animationCallback(AnimationHelper.easing.linear(fractionComplete - animationInfo.startTimePercent, 0, 1, 1 - animationInfo.startTimePercent), animationInfo);
animationInfo.animationCallback(animationInfo.easingFunction(fractionComplete - animationInfo.startTimePercent,0,1,1 - animationInfo.startTimePercent),animationInfo);}}else {animationInfo.animationCallback(animationInfo.easingFunction(fractionComplete,0,1,1),animationInfo);}}_this.dispatchEvent("dataAnimationIterationEnd",{chart:_this});},function(){animations = [];var count=0; //Delete all render target canvases used for animation.
for(var i=0;i < _this.plotInfo.plotTypes.length;i++) {var plotType=_this.plotInfo.plotTypes[i];for(var j=0;j < plotType.plotUnits.length;j++) {var plotUnit=plotType.plotUnits[j];plotUnit.targetCanvas = null;}}initialState = null;_this.disableToolTip = false; //console.log("*********** Animation Complete - " + animationCount + " ***********");
});}else {if(_this._indexLabels.length > 0)_this.renderIndexLabels();_this.dispatchEvent("dataAnimationIterationEnd",{chart:_this});}this.attachPlotAreaEventHandlers();if(!this.zoomEnabled && !this.panEnabled && this._zoomButton && this._zoomButton.style.display !== "none"){(0,_utils.hide)(this._zoomButton,this._resetButton);}this._toolTip._updateToolTip();this.renderCount++; //if (window.console) {
//    window.console.log(new Date().getTime() - dt);
//}
if(_options.isDebugMode){var _this=this;setTimeout(function(){var ghostCanvasCopy=document.getElementById("ghostCanvasCopy");if(ghostCanvasCopy){ //console.log(ghostCanvasCopy.clientWidth);
(0,_utils.setCanvasSize)(ghostCanvasCopy,_this.width,_this.height);var ghostCanvasCopyCtx=ghostCanvasCopy.getContext("2d"); //ghostCanvasCopyCtx.scale(1, 1);
//var imageData = this._eventManager.ghostCtx.getImageData(0, 0, this._container.clientWidth, this._container.clientHeight);
//this._eventManager.ghostCtx.drawImage(this._eventManager.ghostCanvas, 0, 0);
//this.ctx.drawImage(this._eventManager.ghostCanvas, 0, 0);
ghostCanvasCopyCtx.drawImage(_this._eventManager.ghostCanvas,0,0); //_this._canvasJSContainer.appendChild(_this._eventManager.ghostCanvas);
//_this.overlaidCanvasCtx.drawImage(_this._eventManager.ghostCanvas, 0, 0);
}},2000);}};Chart.prototype.attachPlotAreaEventHandlers = function(){ //this._toolBar.style.display = "inline";
this.attachEvent({context:this,chart:this,mousedown:this._plotAreaMouseDown,mouseup:this._plotAreaMouseUp,mousemove:this._plotAreaMouseMove,cursor:this.zoomEnabled?"col-resize":"move",cursor:this.panEnabled?"move":"default",capture:true,bounds:this.plotArea});};Chart.prototype.categoriseDataSeries = function(){var dataSeries="";for(var i=0;i < this.data.length;i++) {dataSeries = this.data[i];if(!dataSeries.dataPoints || dataSeries.dataPoints.length === 0 || !dataSeries.visible)continue;if(Chart._supportedChartTypes.indexOf(dataSeries.type) >= 0){var plotType=null;var plotTypeExists=false;var plotUnit=null;var plotUnitExists=false;for(var j=0;j < this.plotInfo.plotTypes.length;j++) {if(this.plotInfo.plotTypes[j].type === dataSeries.type){plotTypeExists = true;var plotType=this.plotInfo.plotTypes[j];break;}}if(!plotTypeExists){plotType = {type:dataSeries.type,totalDataSeries:0,plotUnits:[]};this.plotInfo.plotTypes.push(plotType);}for(var j=0;j < plotType.plotUnits.length;j++) {if(plotType.plotUnits[j].axisYType === dataSeries.axisYType){plotUnitExists = true;var plotUnit=plotType.plotUnits[j];break;}}if(!plotUnitExists){plotUnit = {type:dataSeries.type,previousDataSeriesCount:0, //to be set next
index:plotType.plotUnits.length,plotType:plotType,axisYType:dataSeries.axisYType,axisY:dataSeries.axisYType === "primary"?this.axisY:this.axisY2,axisX:this.axisX,dataSeriesIndexes:[], //index of dataSeries
yTotals:[]};plotType.plotUnits.push(plotUnit);}plotType.totalDataSeries++;plotUnit.dataSeriesIndexes.push(i);dataSeries.plotUnit = plotUnit;}}for(var i=0;i < this.plotInfo.plotTypes.length;i++) {var plotType=this.plotInfo.plotTypes[i];var previousDataSeriesCount=0;for(var j=0;j < plotType.plotUnits.length;j++) {plotType.plotUnits[j].previousDataSeriesCount = previousDataSeriesCount;previousDataSeriesCount += plotType.plotUnits[j].dataSeriesIndexes.length;}}};Chart.prototype.assignIdToDataPoints = function(){for(var i=0;i < this.data.length;i++) {var dataSeries=this.data[i];if(!dataSeries.dataPoints)continue;var length=dataSeries.dataPoints.length;for(var j=0;j < length;j++) {dataSeries.dataPointIds[j] = ++this._eventManager.lastObjectId;}}};Chart.prototype._processData = function(){this.assignIdToDataPoints();this.categoriseDataSeries();for(var i=0;i < this.plotInfo.plotTypes.length;i++) {var plotType=this.plotInfo.plotTypes[i];for(var j=0;j < plotType.plotUnits.length;j++) {var plotUnit=plotType.plotUnits[j];if(plotUnit.type === "line" || plotUnit.type === "stepLine" || plotUnit.type === "spline" || plotUnit.type === "column" || plotUnit.type === "area" || plotUnit.type === "stepArea" || plotUnit.type === "splineArea" || plotUnit.type === "bar" || plotUnit.type === "bubble" || plotUnit.type === "scatter")this._processMultiseriesPlotUnit(plotUnit);else if(plotUnit.type === "stackedColumn" || plotUnit.type === "stackedBar" || plotUnit.type === "stackedArea")this._processStackedPlotUnit(plotUnit);else if(plotUnit.type === "stackedColumn100" || plotUnit.type === "stackedBar100" || plotUnit.type === "stackedArea100")this._processStacked100PlotUnit(plotUnit);else if(plotUnit.type === "candlestick" || plotUnit.type === "ohlc" || plotUnit.type === "rangeColumn" || plotUnit.type === "rangeBar" || plotUnit.type === "rangeArea" || plotUnit.type === "rangeSplineArea")this._processMultiYPlotUnit(plotUnit);}}};Chart.prototype._processMultiseriesPlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY;var isDateTime=false;for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) {if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values
}else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(dataPointY < axisYDataInfo.min)axisYDataInfo.min = dataPointY;if(dataPointY > axisYDataInfo.max)axisYDataInfo.max = dataPointY;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut
if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY !== null && dataSeries.dataPoints[i - 1].y !== null){var yDiff=dataPointY - dataSeries.dataPoints[i - 1].y;yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut
if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining
if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end
if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;if(dataPointY < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = dataPointY;if(dataPointY > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = dataPointY;}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";} //this.dataPoints.sort(compareDataPointX);
//this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; });
};Chart.prototype._processStackedPlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY;var isDateTime=false;var dataPointYPositiveSums=[];var dataPointYNegativeSums=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) { // Requird when no x values are provided
if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values
}else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut
if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY !== null && dataSeries.dataPoints[i - 1].y !== null){var yDiff=dataPointY - dataSeries.dataPoints[i - 1].y;yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut
if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining
if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end
if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;plotUnit.yTotals[dataPointX] = (!plotUnit.yTotals[dataPointX]?0:plotUnit.yTotals[dataPointX]) + Math.abs(dataPointY);if(dataPointY >= 0){if(dataPointYPositiveSums[dataPointX])dataPointYPositiveSums[dataPointX] += dataPointY;else dataPointYPositiveSums[dataPointX] = dataPointY;}else {if(dataPointYNegativeSums[dataPointX])dataPointYNegativeSums[dataPointX] += dataPointY;else dataPointYNegativeSums[dataPointX] = dataPointY;}}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";}for(i in dataPointYPositiveSums) {if(dataPointYPositiveSums.hasOwnProperty(i)){if(isNaN(i)){continue;}var ySum=dataPointYPositiveSums[i];if(ySum < axisYDataInfo.min)axisYDataInfo.min = ySum;if(ySum > axisYDataInfo.max)axisYDataInfo.max = ySum;if(i < axisXDataInfo.viewPortMin || i > axisXDataInfo.viewPortMax)continue;if(ySum < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = ySum;if(ySum > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = ySum;}}for(i in dataPointYNegativeSums) {if(dataPointYNegativeSums.hasOwnProperty(i)){if(isNaN(i)){continue;}var ySum=dataPointYNegativeSums[i];if(ySum < axisYDataInfo.min)axisYDataInfo.min = ySum;if(ySum > axisYDataInfo.max)axisYDataInfo.max = ySum;if(i < axisXDataInfo.viewPortMin || i > axisXDataInfo.viewPortMax)continue;if(ySum < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = ySum;if(ySum > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = ySum;}} //this.dataPoints.sort(compareDataPointX);
//this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; });
//window.console.log("viewPortYMin: " + plotInfo.viewPortYMin + "; viewPortYMax: " + plotInfo.viewPortYMax);
};Chart.prototype._processStacked100PlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY;var isDateTime=false;var containsPositiveY=false;var containsNegativeY=false;var dataPointYSums=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) { // Requird when no x values are provided
if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values
}else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut
if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY !== null && dataSeries.dataPoints[i - 1].y !== null){var yDiff=dataPointY - dataSeries.dataPoints[i - 1].y;yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut
if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining
if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end
if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;plotUnit.yTotals[dataPointX] = (!plotUnit.yTotals[dataPointX]?0:plotUnit.yTotals[dataPointX]) + Math.abs(dataPointY);if(dataPointY >= 0){containsPositiveY = true;}else {containsNegativeY = true;}if(dataPointYSums[dataPointX])dataPointYSums[dataPointX] += Math.abs(dataPointY);else dataPointYSums[dataPointX] = Math.abs(dataPointY);}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";}if(containsPositiveY && !containsNegativeY){axisYDataInfo.max = 99;axisYDataInfo.min = 1;}else if(containsPositiveY && containsNegativeY){axisYDataInfo.max = 99;axisYDataInfo.min = -99;}else if(!containsPositiveY && containsNegativeY){axisYDataInfo.max = -1;axisYDataInfo.min = -99;}axisYDataInfo.viewPortMin = axisYDataInfo.min;axisYDataInfo.viewPortMax = axisYDataInfo.max;plotUnit.dataPointYSums = dataPointYSums; //this.dataPoints.sort(compareDataPointX);
//this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; });
//window.console.log("viewPortYMin: " + plotInfo.viewPortYMin + "; viewPortYMax: " + plotInfo.viewPortYMax);
};Chart.prototype._processMultiYPlotUnit = function(plotUnit){if(!plotUnit.dataSeriesIndexes || plotUnit.dataSeriesIndexes.length < 1)return;var axisYDataInfo=plotUnit.axisY.dataInfo;var axisXDataInfo=plotUnit.axisX.dataInfo;var dataPointX,dataPointY,dataPointYMin,dataPointYMax;var isDateTime=false;for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeries=this.data[plotUnit.dataSeriesIndexes[j]];var i=0;var isFirstDPInViewPort=false;var isLastDPInViewPort=false;if(dataSeries.axisPlacement === "normal" || dataSeries.axisPlacement === "xySwapped"){var plotAreaXMin=this.sessionVariables.axisX.newViewportMinimum?this.sessionVariables.axisX.newViewportMinimum:this._options.axisX && this._options.axisX.viewportMinimum?this._options.axisX.viewportMinimum:this._options.axisX && this._options.axisX.minimum?this._options.axisX.minimum:-Infinity;var plotAreaXMax=this.sessionVariables.axisX.newViewportMaximum?this.sessionVariables.axisX.newViewportMaximum:this._options.axisX && this._options.axisX.viewportMaximum?this._options.axisX.viewportMaximum:this._options.axisX && this._options.axisX.maximum?this._options.axisX.maximum:Infinity;}if(dataSeries.dataPoints[i].x && dataSeries.dataPoints[i].x.getTime || dataSeries.xValueType === "dateTime"){isDateTime = true;}for(i = 0;i < dataSeries.dataPoints.length;i++) {if(typeof dataSeries.dataPoints[i].x === "undefined"){dataSeries.dataPoints[i].x = i;}if(dataSeries.dataPoints[i].x.getTime){isDateTime = true;dataPointX = dataSeries.dataPoints[i].x.getTime(); //dataPointX is used so that getTime is called only once in case of dateTime values
}else dataPointX = dataSeries.dataPoints[i].x;dataPointY = dataSeries.dataPoints[i].y;if(dataPointY && dataPointY.length){dataPointYMin = Math.min.apply(null,dataPointY);dataPointYMax = Math.max.apply(null,dataPointY);}if(dataPointX < axisXDataInfo.min)axisXDataInfo.min = dataPointX;if(dataPointX > axisXDataInfo.max)axisXDataInfo.max = dataPointX;if(dataPointYMin < axisYDataInfo.min)axisYDataInfo.min = dataPointYMin;if(dataPointYMax > axisYDataInfo.max)axisYDataInfo.max = dataPointYMax;if(i > 0){var xDiff=dataPointX - dataSeries.dataPoints[i - 1].x;xDiff < 0 && (xDiff = xDiff * -1); //If Condition shortcut
if(axisXDataInfo.minDiff > xDiff && xDiff !== 0){axisXDataInfo.minDiff = xDiff;}if(dataPointY[0] !== null && dataSeries.dataPoints[i - 1].y[0] !== null){var yDiff=dataPointY[0] - dataSeries.dataPoints[i - 1].y[0];yDiff < 0 && (yDiff = yDiff * -1); //If Condition shortcut
if(axisYDataInfo.minDiff > yDiff && yDiff !== 0){axisYDataInfo.minDiff = yDiff;}}} // This section makes sure that partially visible dataPoints are included in the begining
if(dataPointX < plotAreaXMin && !isFirstDPInViewPort){continue;}else if(!isFirstDPInViewPort){isFirstDPInViewPort = true;if(i > 0){i -= 2;continue;}} // This section makes sure that partially visible dataPoints are included at the end
if(dataPointX > plotAreaXMax && !isLastDPInViewPort){isLastDPInViewPort = true;}else if(dataPointX > plotAreaXMax && isLastDPInViewPort){continue;}if(dataSeries.dataPoints[i].label)plotUnit.axisX.labels[dataPointX] = dataSeries.dataPoints[i].label;if(dataPointX < axisXDataInfo.viewPortMin)axisXDataInfo.viewPortMin = dataPointX;if(dataPointX > axisXDataInfo.viewPortMax)axisXDataInfo.viewPortMax = dataPointX;if(dataPointY === null)continue;if(dataPointYMin < axisYDataInfo.viewPortMin)axisYDataInfo.viewPortMin = dataPointYMin;if(dataPointYMax > axisYDataInfo.viewPortMax)axisYDataInfo.viewPortMax = dataPointYMax;}this.plotInfo.axisXValueType = dataSeries.xValueType = isDateTime?"dateTime":"number";} //this.dataPoints.sort(compareDataPointX);
//this.dataPoints.sort(function (dataPoint1, dataPoint2) { return dataPoint1.x - dataPoint2.x; });
}; //getClosest returns objects nearby and hence shouldn't be used for events like click, mouseover, mousemove, etc which require object that is exactly under the mouse.
Chart.prototype.getDataPointAtXY = function(mouseX,mouseY,getClosest){getClosest = getClosest || false;var results=[];for(var i=this._dataInRenderedOrder.length - 1;i >= 0;i--) {var dataSeries=this._dataInRenderedOrder[i];var result=null;result = dataSeries.getDataPointAtXY(mouseX,mouseY,getClosest);if(result)results.push(result);}var closestResult=null;var onlyLineAreaTypes=false;for(var m=0;m < results.length;m++) {if(results[m].dataSeries.type === "line" || results[m].dataSeries.type === "stepLine" || results[m].dataSeries.type === "area" || results[m].dataSeries.type === "stepArea"){var markerSize=(0,_utils.getProperty)("markerSize",results[m].dataPoint,results[m].dataSeries) || 8;if(results[m].distance <= markerSize / 2){onlyLineAreaTypes = true;break;}}}for(m = 0;m < results.length;m++) {if(onlyLineAreaTypes && results[m].dataSeries.type !== "line" && results[m].dataSeries.type !== "stepLine" && results[m].dataSeries.type !== "area" && results[m].dataSeries.type !== "stepArea")continue;if(!closestResult){closestResult = results[m];}else if(results[m].distance <= closestResult.distance){closestResult = results[m];}}return closestResult;};Chart.prototype.getObjectAtXY = function(mouseX,mouseY,getClosest){getClosest = getClosest || false;var id=null;var dataPointInfo=this.getDataPointAtXY(mouseX,mouseY,getClosest);if(dataPointInfo){id = dataPointInfo.dataSeries.dataPointIds[dataPointInfo.dataPointIndex];}else if(_utils.isCanvasSupported){ //IE9+
id = (0,_utils.getObjectId)(mouseX,mouseY,this._eventManager.ghostCtx);}else {for(var i=0;i < this.legend.items.length;i++) {var item=this.legend.items[i];if(mouseX >= item.x1 && mouseX <= item.x2 && mouseY >= item.y1 && mouseY <= item.y2){id = item.id;}}}return id;}; /// <summary>Calculates Font Size based on standardSize and Chart Size</summary>
/// <param name="standardSize" type="Number">Standard font size for a Chart with min(width,height) = 400px</param>
/// <returns type="Number">The area.</returns>
Chart.prototype.getAutoFontSize = function(standardSize,width,height){width = width || this.width;height = height || this.height;var fontSizeScaleFactor=standardSize / 400;return Math.round(Math.min(this.width,this.height) * fontSizeScaleFactor);}; //#region Events
Chart.prototype.resetOverlayedCanvas = function(){ //var width = this.overlaidCanvas.width;
//this.overlaidCanvas.width = 0;
//this.overlaidCanvas.width = width;
this.overlaidCanvasCtx.clearRect(0,0,this.width,this.height);};Chart.prototype.clearCanvas = function(){this.ctx.clearRect(0,0,this.width,this.height);if(this.backgroundColor){this.ctx.fillStyle = this.backgroundColor;this.ctx.fillRect(0,0,this.width,this.height);}};Chart.prototype.attachEvent = function(param){this._events.push(param);};Chart.prototype._touchEventHandler = function(ev){if(!ev.changedTouches || !this.interactivityEnabled)return;var mouseEvents=[];var touches=ev.changedTouches;var first=touches?touches[0]:ev;var touchCurrentCoordinates=null; //window.console.log(touches.length);
switch(ev.type){case "touchstart":case "MSPointerDown":mouseEvents = ["mousemove","mousedown"];this._lastTouchData = (0,_utils.getMouseCoordinates)(first);this._lastTouchData.time = new Date();break;case "touchmove":case "MSPointerMove":mouseEvents = ["mousemove"];break;case "touchend":case "MSPointerUp":mouseEvents = this._lastTouchEventType === "touchstart" || this._lastTouchEventType === "MSPointerDown"?["mouseup","click"]:["mouseup"];break;default:return;}if(touches && touches.length > 1)return;touchCurrentCoordinates = (0,_utils.getMouseCoordinates)(first);touchCurrentCoordinates.time = new Date();try{var dy=touchCurrentCoordinates.y - this._lastTouchData.y;var dx=touchCurrentCoordinates.x - this._lastTouchData.x;var dt=touchCurrentCoordinates.time - this._lastTouchData.time;if(Math.abs(dy) > 15 && (!!this._lastTouchData.scroll || dt < 200)){ //this._lastTouchData.y = touchCurrentCoordinates.y;
this._lastTouchData.scroll = true;var win=window.parent || window;if(win && win.scrollBy)win.scrollBy(0,-dy);}}catch(e) {};this._lastTouchEventType = ev.type;if(!!this._lastTouchData.scroll && this.zoomEnabled){if(this.isDrag)this.resetOverlayedCanvas();this.isDrag = false;return;}for(var i=0;i < mouseEvents.length;i++) {var type=mouseEvents[i];var simulatedEvent=document.createEvent("MouseEvent");simulatedEvent.initMouseEvent(type,true,true,window,1,first.screenX,first.screenY,first.clientX,first.clientY,false,false,false,false,0,null);first.target.dispatchEvent(simulatedEvent);if(ev.preventManipulation){ //alert("preventManipulation");
ev.preventManipulation();}if(ev.preventDefault){ //alert("preventDefault");
ev.preventDefault();}}};Chart.prototype._dispatchRangeEvent = function(eventName,triggerSource){var eventParameter={};eventParameter.chart = this._publicChartReference;eventParameter.type = eventName;eventParameter.trigger = triggerSource;var axes=[];if(this.axisX)axes.push("axisX");if(this.axisY)axes.push("axisY");if(this.axisY2)axes.push("axisY2");for(var i=0;i < axes.length;i++) {eventParameter[axes[i]] = {viewportMinimum:this[axes[i]].sessionVariables.newViewportMinimum,viewportMaximum:this[axes[i]].sessionVariables.newViewportMaximum};}this.dispatchEvent(eventName,eventParameter,this._publicChartReference);};Chart.prototype._mouseEventHandler = function(ev){if(!this.interactivityEnabled)return;if(this._ignoreNextEvent){this._ignoreNextEvent = false;return;} // stop panning and zooming so we can draw
if(ev.preventManipulation){ //alert("preventManipulation");
ev.preventManipulation();} // we are handling this event
if(ev.preventDefault){ //alert("preventDefault");
ev.preventDefault();} //IE8- uses srcElement instead of target. So instead of checking this condition everytime, its better to create a reference called target.
if(typeof ev.target === "undefined" && ev.srcElement)ev.target = ev.srcElement; //console.log(ev.type);
var xy=(0,_utils.getMouseCoordinates)(ev);var type=ev.type;var eventParam;var rightclick;if(!ev)var e=window.event;if(ev.which)rightclick = ev.which == 3;else if(ev.button)rightclick = ev.button == 2; //window.console.log(type + " --> x: " + xy.x + "; y:" + xy.y);
//if (type === "mouseout") {
//    this._toolTip.hide();
//}
if(_options.isDebugMode && window.console){window.console.log(type + " --> x: " + xy.x + "; y:" + xy.y);if(rightclick)window.console.log(ev.which);if(type === "mouseup")window.console.log("mouseup");}if(rightclick)return; //if (this.plotInfo.axisPlacement === "xySwapped") {
//    //var temp = xy.x;
//    //xy.x = xy.y;
//    //xy.y = temp;
//    xy = {x: xy.y, y: xy.x};
//}
if(Chart.capturedEventParam){eventParam = Chart.capturedEventParam;if(type === "mouseup"){Chart.capturedEventParam = null;if(eventParam.chart.overlaidCanvas.releaseCapture)eventParam.chart.overlaidCanvas.releaseCapture();else document.body.removeEventListener("mouseup",eventParam.chart._mouseEventHandler,false);}if(eventParam.hasOwnProperty(type))eventParam[type].call(eventParam.context,xy.x,xy.y);}else if(this._events){for(var i=0;i < this._events.length;i++) {if(!this._events[i].hasOwnProperty(type))continue;eventParam = this._events[i];var bounds=eventParam.bounds;if(xy.x >= bounds.x1 && xy.x <= bounds.x2 && xy.y >= bounds.y1 && xy.y <= bounds.y2){eventParam[type].call(eventParam.context,xy.x,xy.y);if(type === "mousedown" && eventParam.capture === true){Chart.capturedEventParam = eventParam;if(this.overlaidCanvas.setCapture)this.overlaidCanvas.setCapture();else {document.body.addEventListener("mouseup",this._mouseEventHandler,false); //addEvent(document.body, "mouseup", this._mouseEventHandler);
}}else if(type === "mouseup"){if(eventParam.chart.overlaidCanvas.releaseCapture)eventParam.chart.overlaidCanvas.releaseCapture();else document.body.removeEventListener("mouseup",this._mouseEventHandler,false);}break;}else eventParam = null;}if(eventParam && eventParam.cursor){ev.target.style.cursor = eventParam.cursor;}else ev.target.style.cursor = this._defaultCursor; //eventParam =
}if(this._toolTip && this._toolTip.enabled){var plotArea=this.plotArea;if(xy.x < plotArea.x1 || xy.x > plotArea.x2 || xy.y < plotArea.y1 || xy.y > plotArea.y2)this._toolTip.hide();}if((!this.isDrag || !this.zoomEnabled) && this._eventManager){this._eventManager.mouseEventHandler(ev); //this._updateToolTip(ev.x, ev.y);
} //if (this._toolTip.enabled)
//    this._toolTip.mouseMoveHandler(ev.x, ev.y);
};Chart.prototype._plotAreaMouseDown = function(x,y){this.isDrag = true;if(this.plotInfo.axisPlacement !== "none"){this.dragStartPoint = {x:x,y:y};}else {this.dragStartPoint = {x:x,y:y};}};Chart.prototype._plotAreaMouseUp = function(x,y){if(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped"){if(this.isDrag){var dragDelta=0,dragDeltaPY=y - this.dragStartPoint.y,dragDeltaPX=x - this.dragStartPoint.x,zoomPX=this.zoomType.indexOf("x") >= 0, //Whether to zoom horizontally
zoomPY=this.zoomType.indexOf("y") >= 0, //Whether to zoom vertically
reRender=false;this.resetOverlayedCanvas();if(this.plotInfo.axisPlacement === "xySwapped"){var temp=zoomPY;zoomPY = zoomPX;zoomPX = temp;}if(this.panEnabled || this.zoomEnabled){if(this.panEnabled){var overflow=0;for(var i=0;i < this._axes.length;i++) {var axis=this._axes[i];if(axis.viewportMinimum < axis.minimum){overflow = axis.minimum - axis.viewportMinimum;axis.sessionVariables.newViewportMinimum = axis.viewportMinimum + overflow;axis.sessionVariables.newViewportMaximum = axis.viewportMaximum + overflow;reRender = true;}else if(axis.viewportMaximum > axis.maximum){overflow = axis.viewportMaximum - axis.maximum;axis.sessionVariables.newViewportMinimum = axis.viewportMinimum - overflow;axis.sessionVariables.newViewportMaximum = axis.viewportMaximum - overflow;reRender = true;}}}else if((!zoomPX || Math.abs(dragDeltaPX) > 2) && (!zoomPY || Math.abs(dragDeltaPY) > 2) && this.zoomEnabled){if(!this.dragStartPoint)return;var selectedRegion={x1:zoomPX?this.dragStartPoint.x:this.plotArea.x1,y1:zoomPY?this.dragStartPoint.y:this.plotArea.y1,x2:zoomPX?x:this.plotArea.x2,y2:zoomPY?y:this.plotArea.y2};if(Math.abs(selectedRegion.x1 - selectedRegion.x2) > 2 && Math.abs(selectedRegion.y1 - selectedRegion.y2) > 2){if(this._zoomPanToSelectedRegion(selectedRegion.x1,selectedRegion.y1,selectedRegion.x2,selectedRegion.y2)){reRender = true;}}}if(reRender){this._ignoreNextEvent = true; //Required so that click event doesn't fire after zooming into a section of the chart.
this._dispatchRangeEvent("rangeChanging","zoom");this.render();this._dispatchRangeEvent("rangeChanged","zoom");if(reRender && this.zoomEnabled && this._zoomButton.style.display === "none"){(0,_utils.show)(this._zoomButton,this._resetButton);setButtonState(this,this._zoomButton,"pan");setButtonState(this,this._resetButton,"reset");}}}}}this.isDrag = false;};Chart.prototype._plotAreaMouseMove = function(x,y){if(this.isDrag && this.plotInfo.axisPlacement !== "none"){var dragDeltaPX=0,dragDeltaPY=0,alpha=null,selectedRegion=null,zoomPX=this.zoomType.indexOf("x") >= 0, //Whether to zoom horizontally
zoomPY=this.zoomType.indexOf("y") >= 0, //Whether to zoom vertically
_this=this;if(this.plotInfo.axisPlacement === "xySwapped"){var temp=zoomPY;zoomPY = zoomPX;zoomPX = temp;}dragDeltaPX = this.dragStartPoint.x - x;dragDeltaPY = this.dragStartPoint.y - y;if(Math.abs(dragDeltaPX) > 2 && Math.abs(dragDeltaPX) < 8 && (this.panEnabled || this.zoomEnabled)){this._toolTip.hide();}else if(!this.panEnabled && !this.zoomEnabled){this._toolTip.mouseMoveHandler(x,y);}if((!zoomPX || Math.abs(dragDeltaPX) > 2 || !zoomPY || Math.abs(dragDeltaPY) > 2) && (this.panEnabled || this.zoomEnabled)){if(this.panEnabled){selectedRegion = {x1:zoomPX?this.plotArea.x1 + dragDeltaPX:this.plotArea.x1,y1:zoomPY?this.plotArea.y1 + dragDeltaPY:this.plotArea.y1,x2:zoomPX?this.plotArea.x2 + dragDeltaPX:this.plotArea.x2,y2:zoomPY?this.plotArea.y2 + dragDeltaPY:this.plotArea.y2};if(this._zoomPanToSelectedRegion(selectedRegion.x1,selectedRegion.y1,selectedRegion.x2,selectedRegion.y2,true)){this._dispatchRangeEvent("rangeChanging","pan");this.render();this._dispatchRangeEvent("rangeChanged","pan");this.dragStartPoint.x = x;this.dragStartPoint.y = y; //clearTimeout(this._panTimerId);
//this._panTimerId = setTimeout(function () {
//	_this._dispatchRangeEvent("rangeChanging", "pan");
//	_this.render();
//	_this._dispatchRangeEvent("rangeChanged", "pan");
//}, 0);
}}else if(this.zoomEnabled){this.resetOverlayedCanvas();alpha = this.overlaidCanvasCtx.globalAlpha;this.overlaidCanvasCtx.globalAlpha = .7;this.overlaidCanvasCtx.fillStyle = "#A0ABB8";var rect={x1:zoomPX?this.dragStartPoint.x:this.plotArea.x1,y1:zoomPY?this.dragStartPoint.y:this.plotArea.y1,x2:zoomPX?x - this.dragStartPoint.x:this.plotArea.x2 - this.plotArea.x1,y2:zoomPY?y - this.dragStartPoint.y:this.plotArea.y2 - this.plotArea.y1};this.overlaidCanvasCtx.fillRect(rect.x1,rect.y1,rect.x2,rect.y2);this.overlaidCanvasCtx.globalAlpha = alpha;}}}else this._toolTip.mouseMoveHandler(x,y);}; //#endregion Events
//Sets the viewport range of Axis based on the given rect bounds (pixels). Also limits the zooming/panning based on axis bounds. Returns a boolean to indicate whether it was succesful or not based on the selected region.
Chart.prototype._zoomPanToSelectedRegion = function(px1,py1,px2,py2,keepAxisIndependent){keepAxisIndependent = keepAxisIndependent || false;var zoomPX=this.zoomType.indexOf("x") >= 0, //Whether to zoom horizontally
zoomPY=this.zoomType.indexOf("y") >= 0, //Whether to zoom vertically
validRegion=false;var axes=[],axesWithValidRange=[];if(this.axisX && zoomPX)axes.push(this.axisX);if(this.axisY && zoomPY)axes.push(this.axisY);if(this.axisY2 && zoomPY)axes.push(this.axisY2);var params=[];for(var i=0;i < axes.length;i++) {var axis=axes[i]; //var range = Math.abs(axis.viewportMaximum - axis.viewportMinimum);
var val1=axis.convertPixelToValue({x:px1,y:py1});var val2=axis.convertPixelToValue({x:px2,y:py2});if(val1 > val2){var temp=val2;val2 = val1;val1 = temp;}if(isFinite(axis.dataInfo.minDiff)){if(!(Math.abs(val2 - val1) < 3 * Math.abs(axis.dataInfo.minDiff) || val1 < axis.minimum || val2 > axis.maximum)){axesWithValidRange.push(axis);params.push({val1:val1,val2:val2});validRegion = true;}else if(!keepAxisIndependent){validRegion = false;break;}}}if(validRegion){for(var i=0;i < axesWithValidRange.length;i++) {var axis=axesWithValidRange[i];var param=params[i];axis.setViewPortRange(param.val1,param.val2);}}return validRegion;};Chart.prototype.preparePlotArea = function(){var plotArea=this.plotArea;var yAxis=this.axisY?this.axisY:this.axisY2;if(!_utils.isCanvasSupported && (plotArea.x1 > 0 || plotArea.y1 > 0)){plotArea.ctx.translate(plotArea.x1,plotArea.y1);}if(this.axisX && yAxis){plotArea.x1 = this.axisX.lineCoordinates.x1 < this.axisX.lineCoordinates.x2?this.axisX.lineCoordinates.x1:yAxis.lineCoordinates.x1;plotArea.y1 = this.axisX.lineCoordinates.y1 < yAxis.lineCoordinates.y1?this.axisX.lineCoordinates.y1:yAxis.lineCoordinates.y1;plotArea.x2 = this.axisX.lineCoordinates.x2 > yAxis.lineCoordinates.x2?this.axisX.lineCoordinates.x2:yAxis.lineCoordinates.x2;plotArea.y2 = this.axisX.lineCoordinates.y2 > this.axisX.lineCoordinates.y1?this.axisX.lineCoordinates.y2:yAxis.lineCoordinates.y2;plotArea.width = plotArea.x2 - plotArea.x1;plotArea.height = plotArea.y2 - plotArea.y1; //plotArea = { x1: x1, y1: y1, x2: x2, y2: y2, width: x2 - x1, height: y2 - y1 };
}else { //ToDo: @sunil
var freeSpace=this.layoutManager.getFreeSpace();plotArea.x1 = freeSpace.x1;plotArea.x2 = freeSpace.x2;plotArea.y1 = freeSpace.y1;plotArea.y2 = freeSpace.y2;plotArea.width = freeSpace.width;plotArea.height = freeSpace.height;}if(!_utils.isCanvasSupported){plotArea.canvas.width = plotArea.width;plotArea.canvas.height = plotArea.height;plotArea.canvas.style.left = plotArea.x1 + "px";plotArea.canvas.style.top = plotArea.y1 + "px";if(plotArea.x1 > 0 || plotArea.y1 > 0){plotArea.ctx.translate(-plotArea.x1,-plotArea.y1);}}plotArea.layoutManager = new _layout_manager2.default(plotArea.x1,plotArea.y1,plotArea.x2,plotArea.y2,2);};Chart.prototype.getPixelCoordinatesOnPlotArea = function(x,y){return {x:this.axisX.getPixelCoordinatesOnAxis(x).x,y:this.axisY.getPixelCoordinatesOnAxis(y).y}; //return { x: 5, y: 10 };
}; //#region Render Methods
Chart.prototype.renderIndexLabels = function(targetCtx){var ctx=targetCtx || this.plotArea.ctx;var plotArea=this.plotArea;var mid=0;var yMinLimit=0;var yMaxLimit=0;var xMinLimit=0;var xMaxLimit=0;var marginX=0,marginY=0; // Margin between label and dataPoint / PlotArea
var offSetX=0,offSetY=0; // Distance to offSet textBlock (top) from dataPoint inorder to position it
var visibleWidth=0;var visibleHeight=0;for(var i=0;i < this._indexLabels.length;i++) {var indexLabel=this._indexLabels[i];var chartTypeLower=indexLabel.chartType.toLowerCase();var x,y,angle;var fontColor=(0,_utils.getProperty)("indexLabelFontColor",indexLabel.dataPoint,indexLabel.dataSeries);var fontSize=(0,_utils.getProperty)("indexLabelFontSize",indexLabel.dataPoint,indexLabel.dataSeries);var fontFamily=(0,_utils.getProperty)("indexLabelFontFamily",indexLabel.dataPoint,indexLabel.dataSeries);var fontStyle=(0,_utils.getProperty)("indexLabelFontStyle",indexLabel.dataPoint,indexLabel.dataSeries);var fontWeight=(0,_utils.getProperty)("indexLabelFontWeight",indexLabel.dataPoint,indexLabel.dataSeries);var backgroundColor=(0,_utils.getProperty)("indexLabelBackgroundColor",indexLabel.dataPoint,indexLabel.dataSeries);var maxWidth=(0,_utils.getProperty)("indexLabelMaxWidth",indexLabel.dataPoint,indexLabel.dataSeries);var indexLabelWrap=(0,_utils.getProperty)("indexLabelWrap",indexLabel.dataPoint,indexLabel.dataSeries);var percentAndTotal={percent:null,total:null};var formatterParameter=null;if(indexLabel.dataSeries.type.indexOf("stacked") >= 0 || indexLabel.dataSeries.type === "pie" || indexLabel.dataSeries.type === "doughnut")percentAndTotal = this.getPercentAndTotal(indexLabel.dataSeries,indexLabel.dataPoint);if(indexLabel.dataSeries.indexLabelFormatter || indexLabel.dataPoint.indexLabelFormatter)formatterParameter = {chart:this._options,dataSeries:indexLabel.dataSeries,dataPoint:indexLabel.dataPoint,index:indexLabel.indexKeyword,total:percentAndTotal.total,percent:percentAndTotal.percent};var indexLabelText=indexLabel.dataPoint.indexLabelFormatter?indexLabel.dataPoint.indexLabelFormatter(formatterParameter):indexLabel.dataPoint.indexLabel?this.replaceKeywordsWithValue(indexLabel.dataPoint.indexLabel,indexLabel.dataPoint,indexLabel.dataSeries,null,indexLabel.indexKeyword):indexLabel.dataSeries.indexLabelFormatter?indexLabel.dataSeries.indexLabelFormatter(formatterParameter):indexLabel.dataSeries.indexLabel?this.replaceKeywordsWithValue(indexLabel.dataSeries.indexLabel,indexLabel.dataPoint,indexLabel.dataSeries,null,indexLabel.indexKeyword):null;if(indexLabelText === null || indexLabelText === "")continue;var placement=(0,_utils.getProperty)("indexLabelPlacement",indexLabel.dataPoint,indexLabel.dataSeries);var orientation=(0,_utils.getProperty)("indexLabelOrientation",indexLabel.dataPoint,indexLabel.dataSeries);var angle=0;var direction=indexLabel.direction; // +1 for above the point and -1 for below the point
var axisX=indexLabel.dataSeries.axisX;var axisY=indexLabel.dataSeries.axisY;var textBlock=new _text_block2.default(ctx,{x:0,y:0,maxWidth:maxWidth?maxWidth:this.width * .5,maxHeight:indexLabelWrap?fontSize * 5:fontSize * 1.5,angle:orientation === "horizontal"?0:-90,text:indexLabelText,padding:0,backgroundColor:backgroundColor,horizontalAlign:"left", //left, center, right
fontSize:fontSize, //in pixels
fontFamily:fontFamily,fontWeight:fontWeight, //normal, bold, bolder, lighter,
fontColor:fontColor,fontStyle:fontStyle, // normal, italic, oblique
textBaseline:"top"});var textSize=textBlock.measureText(); //if (indexLabel.dataPoint.x < axisX.viewportMinimum || indexLabel.dataPoint.x > axisX.viewportMaximum || indexLabel.dataPoint.y < axisY.viewportMinimum || indexLabel.dataPoint.y > axisY.viewportMaximum)
//	continue;
if(chartTypeLower.indexOf("line") >= 0 || chartTypeLower.indexOf("area") >= 0 || chartTypeLower.indexOf("bubble") >= 0 || chartTypeLower.indexOf("scatter") >= 0){if(indexLabel.dataPoint.x < axisX.viewportMinimum || indexLabel.dataPoint.x > axisX.viewportMaximum || indexLabel.dataPoint.y < axisY.viewportMinimum || indexLabel.dataPoint.y > axisY.viewportMaximum)continue;}else {if(indexLabel.dataPoint.x < axisX.viewportMinimum || indexLabel.dataPoint.x > axisX.viewportMaximum)continue;}marginY = 2;marginX = 2;if(orientation === "horizontal"){visibleWidth = textBlock.width;visibleHeight = textBlock.height;}else {visibleHeight = textBlock.width;visibleWidth = textBlock.height;}if(this.plotInfo.axisPlacement === "normal"){if(chartTypeLower.indexOf("line") >= 0 || chartTypeLower.indexOf("area") >= 0){placement = "auto";marginY = 4;}else if(chartTypeLower.indexOf("stacked") >= 0){if(placement === "auto")placement = "inside";}else if(chartTypeLower === "bubble" || chartTypeLower === "scatter"){placement = "inside";}x = indexLabel.point.x - visibleWidth / 2;if(placement !== "inside"){ //outside or auto
yMinLimit = plotArea.y1;yMaxLimit = plotArea.y2;if(direction > 0){y = indexLabel.point.y - visibleHeight - marginY;if(y < yMinLimit){if(placement === "auto"){y = Math.max(indexLabel.point.y,yMinLimit) + marginY;}else {y = yMinLimit + marginY;}}}else {y = indexLabel.point.y + marginY;if(y > yMaxLimit - visibleHeight - marginY){if(placement === "auto"){y = Math.min(indexLabel.point.y,yMaxLimit) - visibleHeight - marginY;}else {y = yMaxLimit - visibleHeight - marginY;}}}}else {yMinLimit = Math.max(indexLabel.bounds.y1,plotArea.y1);yMaxLimit = Math.min(indexLabel.bounds.y2,plotArea.y2);if(chartTypeLower.indexOf("range") >= 0){if(direction > 0)mid = Math.max(indexLabel.bounds.y1,plotArea.y1) + visibleHeight / 2 + marginY;else mid = Math.min(indexLabel.bounds.y2,plotArea.y2) - visibleHeight / 2 - marginY;}else mid = (Math.max(indexLabel.bounds.y1,plotArea.y1) + Math.min(indexLabel.bounds.y2,plotArea.y2)) / 2;if(direction > 0){y = Math.max(indexLabel.point.y,mid) - visibleHeight / 2;if(y < yMinLimit && (chartTypeLower === "bubble" || chartTypeLower === "scatter")){y = Math.max(indexLabel.point.y - visibleHeight - marginY,plotArea.y1 + marginY);}}else {y = Math.min(indexLabel.point.y,mid) - visibleHeight / 2;if(y > yMaxLimit - visibleHeight - marginY && (chartTypeLower === "bubble" || chartTypeLower === "scatter")){y = Math.min(indexLabel.point.y + marginY,plotArea.y2 - visibleHeight - marginY);}} // Make Sure that it does not overlap the axis line
y = Math.min(y,yMaxLimit - visibleHeight);}}else {if(chartTypeLower.indexOf("line") >= 0 || chartTypeLower.indexOf("area") >= 0 || chartTypeLower.indexOf("scatter") >= 0){placement = "auto";marginX = 4;}else if(chartTypeLower.indexOf("stacked") >= 0){if(placement === "auto")placement = "inside";}else if(chartTypeLower === "bubble"){placement = "inside";}y = indexLabel.point.y - visibleHeight / 2;if(placement !== "inside"){ //outside or auto
xMinLimit = plotArea.x1;xMaxLimit = plotArea.x2;if(direction < 0){x = indexLabel.point.x - visibleWidth - marginX;if(x < xMinLimit){if(placement === "auto"){x = Math.max(indexLabel.point.x,xMinLimit) + marginX;}else {x = xMinLimit + marginX;}}}else {x = indexLabel.point.x + marginX;if(x > xMaxLimit - visibleWidth - marginX){if(placement === "auto"){x = Math.min(indexLabel.point.x,xMaxLimit) - visibleWidth - marginX;}else {x = xMaxLimit - visibleWidth - marginX;}}}}else {xMinLimit = Math.max(indexLabel.bounds.x1,plotArea.x1);xMaxLimit = Math.min(indexLabel.bounds.x2,plotArea.x2);if(chartTypeLower.indexOf("range") >= 0){if(direction < 0)mid = Math.max(indexLabel.bounds.x1,plotArea.x1) + visibleWidth / 2 + marginX;else mid = Math.min(indexLabel.bounds.x2,plotArea.x2) - visibleWidth / 2 - marginX;}else var mid=(Math.max(indexLabel.bounds.x1,plotArea.x1) + Math.min(indexLabel.bounds.x2,plotArea.x2)) / 2;if(direction < 0){x = Math.max(indexLabel.point.x,mid) - visibleWidth / 2; //if (y < xMinLimit) {
//	y = Math.max(indexLabel.point.y - visibleHeight - marginY, plotArea.y1 + marginY);
//}
}else {x = Math.min(indexLabel.point.x,mid) - visibleWidth / 2; //if (y > xMaxLimit - visibleHeight - marginY) {
//	y = Math.min(indexLabel.point.y + marginY, plotArea.y2 - visibleHeight - marginY);
//}
} // Make Sure that it does not overlap the axis line
x = Math.max(x,xMinLimit);}}if(orientation === "vertical"){y += visibleHeight;}textBlock.x = x;textBlock.y = y; //console.log(textBlock.text + ": " + textBlock.x + "; " + textBlock.y);
textBlock.render(true);} //source and dest would be same when animation is not enabled
var animationInfo={source:ctx,dest:this.plotArea.ctx,animationCallback:_animator4.default.fadeInAnimation,easingFunction:_animator4.default.easing.easeInQuad,animationBase:0,startTimePercent:.7};return animationInfo;};Chart.prototype.renderLine = function(plotUnit){var ctx=plotUnit.targetCanvasCtx || this.plotArea.ctx;var totalDataSeries=plotUnit.dataSeriesIndexes.length;if(totalDataSeries <= 0)return;var ghostCtx=this._eventManager.ghostCtx; //var ghostCtx = this.overlaidCanvasCtx;
ctx.save();var plotArea=this.plotArea;ctx.beginPath();ctx.rect(plotArea.x1,plotArea.y1,plotArea.width,plotArea.height);ctx.clip();var markers=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeriesIndex=plotUnit.dataSeriesIndexes[j];var dataSeries=this.data[dataSeriesIndex];ctx.lineWidth = dataSeries.lineThickness;var dataPoints=dataSeries.dataPoints;if(ctx.setLineDash){ctx.setLineDash((0,_utils.getLineDashArray)(dataSeries.lineDashType,dataSeries.lineThickness));}var seriesId=dataSeries.id;this._eventManager.objectMap[seriesId] = {objectType:"dataSeries",dataSeriesIndex:dataSeriesIndex};var hexColor=(0,_utils.intToHexColorString)(seriesId);ghostCtx.strokeStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness;
ghostCtx.lineWidth = dataSeries.lineThickness > 0?Math.max(dataSeries.lineThickness,4):0;var colorSet=dataSeries._colorSet;var color=colorSet[0];ctx.strokeStyle = color;var isFirstDataPointInPlotArea=true;var i=0,x,y;var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.
//if (!dataSeries._options.markerSize && dataSeries.dataPoints.length < 1000)
//    dataSeries.markerSize = 8;
ctx.beginPath();if(dataPoints.length > 0){ //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);
//dataSeries.noDataPointsInPlotArea = 0
var prevDataNull=false;for(i = 0;i < dataPoints.length;i++) {dataPointX = dataPoints[i].x.getTime?dataPoints[i].x.getTime():dataPoints[i].x;if(dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax)continue; //if (!isFinite(dataPoints[i].y))
//    continue;
if(typeof dataPoints[i].y !== "number"){if(i > 0){ // if first dataPoint is null then no need to call stroke method
ctx.stroke();if(_utils.isCanvasSupported){ghostCtx.stroke();}}prevDataNull = true;continue;}x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;var id=dataSeries.dataPointIds[i];this._eventManager.objectMap[id] = {id:id,objectType:"dataPoint",dataSeriesIndex:dataSeriesIndex,dataPointIndex:i,x1:x,y1:y}; //dataSeries.noDataPointsInPlotArea++;
if(isFirstDataPointInPlotArea || prevDataNull){ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.beginPath();ghostCtx.moveTo(x,y);}isFirstDataPointInPlotArea = false;prevDataNull = false;}else {ctx.lineTo(x,y);if(_utils.isCanvasSupported)ghostCtx.lineTo(x,y);if(i % 500 == 0){ctx.stroke();ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.stroke();ghostCtx.beginPath();ghostCtx.moveTo(x,y);}}} //Render Marker
if(dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0){var markerProps=dataSeries.getMarkerProperties(i,x,y,ctx);markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
//}
var markerColor=(0,_utils.intToHexColorString)(id); //window.console.log("index: " + i + "; id: " + id + "; hex: " + markerColor);
if(_utils.isCanvasSupported){markers.push({x:x,y:y,ctx:ghostCtx,type:markerProps.type,size:markerProps.size,color:markerColor,borderColor:markerColor,borderThickness:markerProps.borderThickness});}}if(dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter){this._indexLabels.push({chartType:"line",dataPoint:dataPoints[i],dataSeries:dataSeries,point:{x:x,y:y},direction:dataPoints[i].y >= 0?1:-1,color:color});}}ctx.stroke();if(_utils.isCanvasSupported)ghostCtx.stroke();}}_render2.default.drawMarkers(markers);ctx.restore();ctx.beginPath();if(_utils.isCanvasSupported)ghostCtx.beginPath(); //source and dest would be same when animation is not enabled
var animationInfo={source:ctx,dest:this.plotArea.ctx,animationCallback:_animator4.default.xClipAnimation,easingFunction:_animator4.default.easing.linear,animationBase:0};return animationInfo;};Chart.prototype.renderStepLine = function(plotUnit){var ctx=plotUnit.targetCanvasCtx || this.plotArea.ctx;var totalDataSeries=plotUnit.dataSeriesIndexes.length;if(totalDataSeries <= 0)return;var ghostCtx=this._eventManager.ghostCtx; //var ghostCtx = this.overlaidCanvasCtx;
ctx.save();var plotArea=this.plotArea;ctx.beginPath();ctx.rect(plotArea.x1,plotArea.y1,plotArea.width,plotArea.height);ctx.clip();var markers=[];for(var j=0;j < plotUnit.dataSeriesIndexes.length;j++) {var dataSeriesIndex=plotUnit.dataSeriesIndexes[j];var dataSeries=this.data[dataSeriesIndex];ctx.lineWidth = dataSeries.lineThickness;var dataPoints=dataSeries.dataPoints;if(ctx.setLineDash){ctx.setLineDash((0,_utils.getLineDashArray)(dataSeries.lineDashType,dataSeries.lineThickness));}var seriesId=dataSeries.id;this._eventManager.objectMap[seriesId] = {objectType:"dataSeries",dataSeriesIndex:dataSeriesIndex};var hexColor=(0,_utils.intToHexColorString)(seriesId);ghostCtx.strokeStyle = hexColor; //ghostCtx.lineWidth = dataSeries.lineThickness;
ghostCtx.lineWidth = dataSeries.lineThickness > 0?Math.max(dataSeries.lineThickness,4):0;var colorSet=dataSeries._colorSet;var color=colorSet[0];ctx.strokeStyle = color;var isFirstDataPointInPlotArea=true;var i=0,x,y;var dataPointX; //Used so that when dataPoint.x is a DateTime value, it doesn't get converted to number back and forth.
//if (!dataSeries._options.markerSize && dataSeries.dataPoints.length < 1000)
//    dataSeries.markerSize = 8;
ctx.beginPath();if(dataPoints.length > 0){ //var xy = this.getPixelCoordinatesOnPlotArea(dataPoints[0].x, dataPoints[0].y);
//dataSeries.noDataPointsInPlotArea = 0
var prevDataNull=false;for(i = 0;i < dataPoints.length;i++) {dataPointX = dataPoints[i].getTime?dataPoints[i].x.getTime():dataPoints[i].x;if(dataPointX < plotUnit.axisX.dataInfo.viewPortMin || dataPointX > plotUnit.axisX.dataInfo.viewPortMax)continue; //if (!isFinite(dataPoints[i].y))
//    continue;
if(typeof dataPoints[i].y !== "number"){if(i > 0){ // if first dataPoint is null then no need to call stroke method
ctx.stroke();if(_utils.isCanvasSupported){ghostCtx.stroke();}}prevDataNull = true;continue;}var prevY=y;x = plotUnit.axisX.conversionParameters.reference + plotUnit.axisX.conversionParameters.pixelPerUnit * (dataPointX - plotUnit.axisX.conversionParameters.minimum) + .5 << 0;y = plotUnit.axisY.conversionParameters.reference + plotUnit.axisY.conversionParameters.pixelPerUnit * (dataPoints[i].y - plotUnit.axisY.conversionParameters.minimum) + .5 << 0;var id=dataSeries.dataPointIds[i];this._eventManager.objectMap[id] = {id:id,objectType:"dataPoint",dataSeriesIndex:dataSeriesIndex,dataPointIndex:i,x1:x,y1:y}; //dataSeries.noDataPointsInPlotArea++;
if(isFirstDataPointInPlotArea || prevDataNull){ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.beginPath();ghostCtx.moveTo(x,y);}isFirstDataPointInPlotArea = false;prevDataNull = false;}else {ctx.lineTo(x,prevY);if(_utils.isCanvasSupported)ghostCtx.lineTo(x,prevY);ctx.lineTo(x,y);if(_utils.isCanvasSupported)ghostCtx.lineTo(x,y);if(i % 500 == 0){ctx.stroke();ctx.beginPath();ctx.moveTo(x,y);if(_utils.isCanvasSupported){ghostCtx.stroke();ghostCtx.beginPath();ghostCtx.moveTo(x,y);}}} //Render Marker
if(dataPoints[i].markerSize > 0 || dataSeries.markerSize > 0){var markerProps=dataSeries.getMarkerProperties(i,x,y,ctx);markers.push(markerProps); //if (!dataSeries.maxWidthInX || markerProps.size > dataSeries.maxWidthInX) {
//	dataSeries.maxWidthInX = markerProps.size / (plotUnit.axisX.conversionParameters.pixelPerUnit > 1 ? plotUnit.axisX.conversionParameters.pixelPerUnit - 1 : plotUnit.axisX.conversionParameters.pixelPerUnit);
//}
var markerColor=(0,_utils.intToHexColorString)(id); //window.console.log("index: " + i + "; id: " + id + "; hex: " + markerColor);
if(_utils.isCanvasSupported){markers.push({x:x,y:y,ctx:ghostCtx,type:markerProps.type,size:markerProps.size,color:markerColor,borderColor:markerColor,borderThickness:markerProps.borderThickness});}}if(dataPoints[i].indexLabel || dataSeries.indexLabel || dataPoints[i].indexLabelFormatter || dataSeries.indexLabelFormatter){this._indexLabels.push({chartType:"stepLine",dataPoint:dataPoints[i],dataSeries:dataSeries,point:{x:x,y:y},direction:dataPoints[i].y >= 0?1:-1,color:color});}}ctx.stroke();if(_utils.isCanvasSupported)ghostCtx.stroke();}}_render2.default.drawMarkers(markers);ctx.restore();ctx.beginPath();if(_utils.isCanvasSupported)ghostCtx.beginPath(); //source and dest would be same when animation is not enabled
var animationInfo={source:ctx,dest:this.plotArea.ctx,animationCallback:_animator4.default.xClipAnimation,easingFunction:_animator4.default.easing.linear,animationBase:0};return animationInfo;};Chart.prototype.animationRequestId = null;Chart.prototype.requestAnimFrame = (function(){return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback){window.setTimeout(callback,1000 / 60);};})();Chart.prototype.cancelRequestAnimFrame = (function(){return window.cancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame || clearTimeout;})();Chart.prototype.getPercentAndTotal = function(ds,dp){var dpX=null;var total=null;var percent=null;if(ds.type.indexOf("stacked") >= 0){total = 0;dpX = dp.x.getTime?dp.x.getTime():dp.x;if(dpX in ds.plotUnit.yTotals){total = ds.plotUnit.yTotals[dpX];if(!isNaN(dp.y)){if(total === 0)percent = 0;else percent = dp.y / total * 100;}else percent = 0;}}else if(ds.type === "pie" || ds.type === "doughnut"){total = 0;for(var i=0;i < ds.dataPoints.length;i++) {if(!isNaN(ds.dataPoints[i].y))total += ds.dataPoints[i].y;}if(!isNaN(dp.y))percent = dp.y / total * 100;else percent = 0;}return {percent:percent,total:total};};Chart.prototype.replaceKeywordsWithValue = function(str,dp,ds,dpIndex,indexKeywordValue){ //var regex = /\{\s*[a-zA-Z]+\s*\}|"[^"]*"|'[^']*'/g;
var regex=/\{.*?\}|"[^"]*"|'[^']*'/g;var chart=this;indexKeywordValue = typeof indexKeywordValue === "undefined"?0:indexKeywordValue;if((ds.type.indexOf("stacked") >= 0 || ds.type === "pie" || ds.type === "doughnut") && (str.indexOf("#percent") >= 0 || str.indexOf("#total") >= 0)){var percent="#percent";var total="#total";var dpX=null;var percentAndTotal=this.getPercentAndTotal(ds,dp);total = isNaN(percentAndTotal.total)?total:percentAndTotal.total;percent = isNaN(percentAndTotal.percent)?percent:percentAndTotal.percent;do {var percentFormatString="";if(ds.percentFormatString)percentFormatString = ds.percentFormatString;else {percentFormatString = "#,##0.";var numberOfDecimals=Math.max(Math.ceil(Math.log(1 / Math.abs(percent)) / Math.LN10),2);if(isNaN(numberOfDecimals) || !isFinite(numberOfDecimals))numberOfDecimals = 2;for(var n=0;n < numberOfDecimals;n++) {percentFormatString += "#";}}str = str.replace("#percent",(0,_utils.numberFormat)(percent,percentFormatString,chart._cultureInfo));str = str.replace("#total",(0,_utils.numberFormat)(total,ds.yValueFormatString?ds.yValueFormatString:"#,##0.########"));}while(str.indexOf("#percent") >= 0 || str.indexOf("#total") >= 0);}var fcn=function fcn($0){if($0[0] === "\"" && $0[$0.length - 1] === "\"" || $0[0] === "\'" && $0[$0.length - 1] === "\'")return $0.slice(1,$0.length - 1);var key=(0,_utils.trimString)($0.slice(1,$0.length - 1));key = key.replace("#index",indexKeywordValue);var index=null;try{var match=key.match(/(.*?)\s*\[\s*(.*?)\s*\]/);if(match && match.length > 0){index = (0,_utils.trimString)(match[2]);key = (0,_utils.trimString)(match[1]);}}catch(e) {};var obj=null;if(key === "color"){return dp.color?dp.color:ds.color?ds.color:ds._colorSet[dpIndex % ds._colorSet.length];}if(dp.hasOwnProperty(key))obj = dp;else if(ds.hasOwnProperty(key))obj = ds;else return "";var value=obj[key];if(index !== null)value = value[index];if(key === "x"){if(chart.axisX && chart.plotInfo.axisXValueType === "dateTime")return dateFormat(value,dp.xValueFormatString?dp.xValueFormatString:ds.xValueFormatString?ds.xValueFormatString:chart.axisX && chart.axisX.valueFormatString?chart.axisX.valueFormatString:"DD MMM YY",chart._cultureInfo);else return (0,_utils.numberFormat)(value,dp.xValueFormatString?dp.xValueFormatString:ds.xValueFormatString?ds.xValueFormatString:"#,##0.########",chart._cultureInfo);}else if(key === "y")return (0,_utils.numberFormat)(value,dp.yValueFormatString?dp.yValueFormatString:ds.yValueFormatString?ds.yValueFormatString:"#,##0.########",chart._cultureInfo);else if(key === "z")return (0,_utils.numberFormat)(value,dp.zValueFormatString?dp.zValueFormatString:ds.zValueFormatString?ds.zValueFormatString:"#,##0.########",chart._cultureInfo);else return value;};return str.replace(regex,fcn);};Chart.prototype.renderSpline = _index.SplineChart;Chart.prototype.renderColumn = _index.ColumnChart;Chart.prototype.renderStackedColumn = _index.StackedColumnChart;Chart.prototype.renderStackedColumn100 = _index.StackedColumn100Chart;Chart.prototype.renderBar = _index.BarChart;Chart.prototype.renderStackedBar = _index.StackedBarChart;Chart.prototype.renderStackedBar100 = _index.StackedBar100Chart;Chart.prototype.renderArea = _index.AreaChart;Chart.prototype.renderSplineArea = _index.SplineAreaChart;Chart.prototype.renderStepArea = _index.StepAreaChart;Chart.prototype.renderStackedArea = _index.StackedAreaChart;Chart.prototype.renderStackedArea100 = _index.StackedArea100Chart;Chart.prototype.renderBubble = _index.BubbleChart;Chart.prototype.renderScatter = _index.ScatterChart;Chart.prototype.renderCandlestick = _index.CandlestickChart;Chart.prototype.renderRangeColumn = _index.RangeColumnChart;Chart.prototype.renderRangeBar = _index.RangeBarChart;Chart.prototype.renderRangeArea = _index.RangeAreaChart;Chart.prototype.renderRangeSplineArea = _index.RangeSplineAreaChart;Chart.prototype.renderPie = _index.PieChart;exports.default = Chart;

},{"../charts/index":6,"../constants/options":23,"../constants/themes":24,"../core/axis":26,"../core/culture_info":29,"../core/legend":33,"../core/title":35,"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39,"./animator":25,"./canvasjs":27,"./data_series":30,"./event_manager":31,"./layout_manager":32,"./text_block":34,"./tooltip":36}],29:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _utils = require('../helpers/utils');

var _culture = require('../constants/culture');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function CultureInfo(culture) {

  var cultureInfo;

  if (culture && _culture.cultures[culture]) cultureInfo = _culture.cultures[culture];

  CultureInfo.base.constructor.call(this, "CultureInfo", cultureInfo);
}

(0, _utils.extend)(CultureInfo, _canvasjs2.default);

exports.default = CultureInfo;

},{"../constants/culture":22,"../helpers/utils":39,"./canvasjs":27}],30:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function DataSeries(chart, options, theme, index, id) {
  DataSeries.base.constructor.call(this, "DataSeries", options, theme);

  this.chart = chart;
  this.canvas = chart.canvas;
  this._ctx = chart.canvas.ctx;
  this.index = index;
  this.noDataPointsInPlotArea = 0;
  //this.maxWidthInX = 0;
  this.id = id;
  this.chart._eventManager.objectMap[id] = {
    id: id, objectType: "dataSeries", dataSeriesIndex: index
  };
  this.dataPointIds = [];
  this.plotUnit = [];

  this.axisX = null;
  this.axisY = null;

  if (this.fillOpacity === null) {
    if (this.type.match(/area/i)) this.fillOpacity = .7;else this.fillOpacity = 1;
  }

  this.axisPlacement = this.getDefaultAxisPlacement();

  if (typeof this._options.indexLabelFontSize === "undefined") {

    this.indexLabelFontSize = this.chart.getAutoFontSize(this.indexLabelFontSize);
  }
}

(0, _utils.extend)(DataSeries, _canvasjs2.default);

//Static Method that returns the axisPlacement for a given ChartType. Returns one of "normal", "xySwapped", "none"
DataSeries.prototype.getDefaultAxisPlacement = function () {

  //if (!this.visible)
  //	return "none";

  //type = this.type.toLowerCase();
  var type = this.type;

  if (type === "column" || type === "line" || type === "stepLine" || type === "spline" || type === "area" || type === "stepArea" || type === "splineArea" || type === "stackedColumn" || type === "stackedLine" || type === "bubble" || type === "scatter" || type === "stackedArea" || type === "stackedColumn100" || type === "stackedLine100" || type === "stackedArea100" || type === "candlestick" || type === "ohlc" || type === "rangeColumn" || type === "rangeArea" || type === "rangeSplineArea") {
    return "normal";
  } else if (type === "bar" || type === "stackedBar" || type === "stackedBar100" || type === "rangeBar") {

    return "xySwapped";
  } else if (type === "pie" || type === "doughnut" || type === "funnel") {
    return "none";
  } else {
    window.console.log("Unknown Chart Type: " + type);
    return null;
  }
};

DataSeries.getDefaultLegendMarker = function (type) {

  //type = type.toLowerCase();

  if (type === "column" || type === "stackedColumn" || type === "stackedLine" || type === "bar" || type === "stackedBar" || type === "stackedBar100" || type === "bubble" || type === "scatter" || type === "stackedColumn100" || type === "stackedLine100" || type === "stepArea" || type === "candlestick" || type === "ohlc" || type === "rangeColumn" || type === "rangeBar" || type === "rangeArea" || type === "rangeSplineArea") {
    return "square";
  } else if (type === "line" || type === "stepLine" || type === "spline" || type === "pie" || type === "doughnut" || type === "funnel") {
    return "circle";
  } else if (type === "area" || type === "splineArea" || type === "stackedArea" || type === "stackedArea100") {
    return "triangle";
  } else {
    window.console.log("Unknown Chart Type: " + type);
    return null;
  }
};

//Finds dataPoint with the given x value. If findClosest is set, finds dataPoint with closest x value.
//Returns searchResult object if found, else returns null
DataSeries.prototype.getDataPointAtX = function (x, findClosest) {

  if (!this.dataPoints || this.dataPoints.length === 0) return null;

  var searchResult = {
    dataPoint: null, distance: Infinity, index: NaN
  };
  var dataPoint = null;

  var j = 0;
  var i = 0;
  var direction = 1; // +1 for foward and -1 for backward.

  var minimumXDistance = Infinity;
  var forwardMissCount = 0,
      backwardMissCount = 0;
  var maxMissCount = 1000;
  var searchStartIndex = 0;

  if (this.chart.plotInfo.axisPlacement !== "none") {

    //var xRange = (this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x);

    //if (xRange > 0)
    //	searchStartIndex = ((this.dataPoints.length - 1) / xRange * (x - this.dataPoints[0].x)) >> 0;
    //else
    //	searchStartIndex = 0;

    var xRange = this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x;

    if (xRange > 0) searchStartIndex = Math.min(Math.max((this.dataPoints.length - 1) / xRange * (x - this.dataPoints[0].x) >> 0, 0), this.dataPoints.length);else searchStartIndex = 0;

    //searchStartIndex = ((this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x) / this.dataPoints.length * (x - this.dataPoints[0].x)) >> 0;
  }

  while (true) {

    i = direction > 0 ? searchStartIndex + j : searchStartIndex - j;

    if (i >= 0 && i < this.dataPoints.length) {

      dataPoint = this.dataPoints[i];

      var distance = Math.abs(dataPoint.x - x);

      if (distance < searchResult.distance) {
        searchResult.dataPoint = dataPoint;
        searchResult.distance = distance;
        searchResult.index = i;
      }

      var xDistance = Math.abs(dataPoint.x - x);
      if (xDistance <= minimumXDistance) minimumXDistance = xDistance;else {
        if (direction > 0) forwardMissCount++;else backwardMissCount++;
      }

      if (forwardMissCount > maxMissCount && backwardMissCount > maxMissCount) break;
    } else if (searchStartIndex - j < 0 && searchStartIndex + j >= this.dataPoints.length) break;

    if (direction === -1) {
      j++;
      direction = 1;
    } else direction = -1;
  }

  if (!findClosest && searchResult.dataPoint.x === x) return searchResult;else if (findClosest && searchResult.dataPoint !== null) return searchResult;else return null;
};

// x & y should be in pixels. Can be used only after rendering the chart.
DataSeries.prototype.getDataPointAtXY = function (x, y, getClosest) {

  if (!this.dataPoints || this.dataPoints.length === 0) return null;

  getClosest = getClosest || false;
  var results = [];
  var j = 0,
      i = 0;
  var direction = 1; // +1 for foward and -1 for backward.
  var foundDataPoint = false;
  var minimumXDistance = Infinity;
  var forwardMissCount = 0,
      backwardMissCount = 0;
  var maxMissCount = 1000;
  var searchStartIndex = 0;

  if (this.chart.plotInfo.axisPlacement !== "none") {
    var xval = this.chart.axisX.getXValueAt({ x: x, y: y });

    var xRange = this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x;

    if (xRange > 0) searchStartIndex = Math.min(Math.max((this.dataPoints.length - 1) / xRange * (xval - this.dataPoints[0].x) >> 0, 0), this.dataPoints.length);else searchStartIndex = 0;

    //var xRange = (this.axisX._absoluteMaximum - this.axisX._absoluteMinimum);

    //if (xRange > 0)
    //	searchStartIndex = Math.min(Math.max(((this.dataPoints.length - 1) / xRange * (xval - this.axisX._absoluteMinimum)) >> 0, 0), this.dataPoints.length);
    //else
    //	searchStartIndex = 0;
  }

  while (true) {

    //i = searchStartIndex + (j * direction);
    i = direction > 0 ? searchStartIndex + j : searchStartIndex - j;

    if (i >= 0 && i < this.dataPoints.length) {

      var id = this.dataPointIds[i];
      var visualInfo = this.chart._eventManager.objectMap[id];
      var dataPoint = this.dataPoints[i];
      var distance = null;

      if (visualInfo) {

        switch (this.type) {

          case "column":
          case "stackedColumn":
          case "stackedColumn100":
          case "bar":
          case "stackedBar":
          case "stackedBar100":
          case "rangeColumn":
          case "rangeBar":

            if (x >= visualInfo.x1 && x <= visualInfo.x2 && y >= visualInfo.y1 && y <= visualInfo.y2) {
              results.push({
                dataPoint: dataPoint,
                dataPointIndex: i,
                dataSeries: this,
                distance: Math.min(Math.abs(visualInfo.x1 - x), Math.abs(visualInfo.x2 - x), Math.abs(visualInfo.y1 - y), Math.abs(visualInfo.y2 - y))
                //distance:0
              });

              foundDataPoint = true;
            }
            break;

          case "line":
          case "stepLine":
          case "spline":
          case "area":
          case "stepArea":
          case "stackedArea":
          case "stackedArea100":
          case "splineArea":
          case "scatter":
            var markerSize = (0, _utils.getProperty)("markerSize", dataPoint, this) || 4;
            var snapDistance = getClosest ? 20 : markerSize;

            distance = Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y1 - y, 2));
            if (distance <= snapDistance) {
              results.push({
                dataPoint: dataPoint,
                dataPointIndex: i,
                dataSeries: this,
                distance: distance
              });
            }

            var xDistance = Math.abs(visualInfo.x1 - x);
            if (xDistance <= minimumXDistance) minimumXDistance = xDistance;else {
              if (direction > 0) forwardMissCount++;else backwardMissCount++;
            }

            if (distance <= markerSize / 2) {
              foundDataPoint = true;
            }

            break;

          case "rangeArea":
          case "rangeSplineArea":

            var markerSize = (0, _utils.getProperty)("markerSize", dataPoint, this) || 4;
            var snapDistance = getClosest ? 20 : markerSize;

            distance = Math.min(Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y1 - y, 2)), Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y2 - y, 2)));
            if (distance <= snapDistance) {
              results.push({
                dataPoint: dataPoint,
                dataPointIndex: i,
                dataSeries: this,
                distance: distance
              });
            }

            var xDistance = Math.abs(visualInfo.x1 - x);
            if (xDistance <= minimumXDistance) minimumXDistance = xDistance;else {
              if (direction > 0) forwardMissCount++;else backwardMissCount++;
            }

            if (distance <= markerSize / 2) {
              foundDataPoint = true;
            }

            break;

          case "bubble":
            var markerSize = visualInfo.size;
            distance = Math.sqrt(Math.pow(visualInfo.x1 - x, 2) + Math.pow(visualInfo.y1 - y, 2));
            if (distance <= markerSize / 2) {
              results.push({
                dataPoint: dataPoint,
                dataPointIndex: i,
                dataSeries: this,
                distance: distance
              });

              foundDataPoint = true;
            }
            break;

          case "pie":
          case "doughnut":
            var center = visualInfo.center;
            var innerRadius = this.type === "doughnut" ? visualInfo.percentInnerRadius * visualInfo.radius : 0;

            distance = Math.sqrt(Math.pow(center.x - x, 2) + Math.pow(center.y - y, 2));
            if (distance < visualInfo.radius && distance > innerRadius) {

              var deltaY = y - center.y;
              var deltaX = x - center.x;
              var angle = Math.atan2(deltaY, deltaX);

              if (angle < 0) angle += Math.PI * 2;

              angle = Number(((angle / Math.PI * 180 % 360 + 360) % 360).toFixed(12));
              //console.log(angle);

              var startAngle = Number(((visualInfo.startAngle / Math.PI * 180 % 360 + 360) % 360).toFixed(12));
              var endAngle = Number(((visualInfo.endAngle / Math.PI * 180 % 360 + 360) % 360).toFixed(12));

              //So that data point is detected when there is only one dataPoint
              if (endAngle === 0 && visualInfo.endAngle > 1) {
                endAngle = 360;
              }

              if (startAngle >= endAngle && dataPoint.y !== 0) {
                endAngle += 360;

                if (angle < startAngle) angle += 360;
              }

              if (angle > startAngle && angle < endAngle) {
                results.push({
                  dataPoint: dataPoint,
                  dataPointIndex: i,
                  dataSeries: this,
                  distance: 0
                });

                foundDataPoint = true;
              }
            }

            break;

          case "candlestick":
            if (x >= visualInfo.x1 - visualInfo.borderThickness / 2 && x <= visualInfo.x2 + visualInfo.borderThickness / 2 && y >= visualInfo.y2 - visualInfo.borderThickness / 2 && y <= visualInfo.y3 + visualInfo.borderThickness / 2 || Math.abs(visualInfo.x2 - x + visualInfo.x1 - x) < visualInfo.borderThickness && y >= visualInfo.y1 && y <= visualInfo.y4) {
              results.push({
                dataPoint: dataPoint,
                dataPointIndex: i,
                dataSeries: this,
                distance: Math.min(Math.abs(visualInfo.x1 - x), Math.abs(visualInfo.x2 - x), Math.abs(visualInfo.y2 - y), Math.abs(visualInfo.y3 - y))
                //distance:0
              });

              foundDataPoint = true;
            }
            break;

          case "ohlc":

            if (Math.abs(visualInfo.x2 - x + visualInfo.x1 - x) < visualInfo.borderThickness && y >= visualInfo.y2 && y <= visualInfo.y3 || x >= visualInfo.x1 && x <= (visualInfo.x2 + visualInfo.x1) / 2 && y >= visualInfo.y1 - visualInfo.borderThickness / 2 && y <= visualInfo.y1 + visualInfo.borderThickness / 2 || x >= (visualInfo.x1 + visualInfo.x2) / 2 && x <= visualInfo.x2 && y >= visualInfo.y4 - visualInfo.borderThickness / 2 && y <= visualInfo.y4 + visualInfo.borderThickness / 2) {

              results.push({
                dataPoint: dataPoint,
                dataPointIndex: i,
                dataSeries: this,
                distance: Math.min(Math.abs(visualInfo.x1 - x), Math.abs(visualInfo.x2 - x), Math.abs(visualInfo.y2 - y), Math.abs(visualInfo.y3 - y))
                //distance:0
              });

              foundDataPoint = true;
            }
            break;

        }

        if (foundDataPoint || forwardMissCount > maxMissCount && backwardMissCount > maxMissCount) break;
      }
    } else if (searchStartIndex - j < 0 && searchStartIndex + j >= this.dataPoints.length) break;

    if (direction === -1) {
      j++;
      direction = 1;
    } else direction = -1;
  }

  var closestResult = null;

  for (var m = 0; m < results.length; m++) {
    if (!closestResult) {
      closestResult = results[m];
    } else if (results[m].distance <= closestResult.distance) {
      closestResult = results[m];
    }
  }

  //if (window.console)
  //	window.console.log("forwardMissCount: " + forwardMissCount + "; backwardMissCount: " + backwardMissCount + "; getClosest: " + getClosest);

  //if (window.console && closestResult)
  //    window.console.log(j + ": distance = " + closestResult.distance);

  return closestResult;
};

DataSeries.prototype.getMarkerProperties = function (index, x, y, ctx) {
  var dataPoints = this.dataPoints;
  var dataSeries = this;

  var markerColor = dataPoints[index].markerColor ? dataPoints[index].markerColor : dataSeries.markerColor ? dataSeries.markerColor : dataPoints[index].color ? dataPoints[index].color : dataSeries.color ? dataSeries.color : dataSeries._colorSet[index % dataSeries._colorSet.length];
  var markerBorderColor = dataPoints[index].markerBorderColor ? dataPoints[index].markerBorderColor : dataSeries.markerBorderColor ? dataSeries.markerBorderColor : null;
  var markerBorderThickness = dataPoints[index].markerBorderThickness ? dataPoints[index].markerBorderThickness : dataSeries.markerBorderThickness ? dataSeries.markerBorderThickness : null;
  var markerType = dataPoints[index].markerType ? dataPoints[index].markerType : dataSeries.markerType;
  var markerSize = dataPoints[index].markerSize ? dataPoints[index].markerSize : dataSeries.markerSize;

  return {
    x: x, y: y, ctx: ctx,
    type: markerType,
    size: markerSize,
    color: markerColor,
    borderColor: markerBorderColor,
    borderThickness: markerBorderThickness
  };
};

exports.default = DataSeries;

},{"../helpers/utils":39,"./canvasjs":27}],31:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _utils = require("../helpers/utils");

function EventManager(chart) {
  this.chart = chart;
  this.lastObjectId = 0;
  var _this = this;
  this.objectMap = [];
  this.rectangularRegionEventSubscriptions = [];
  this.previousDataPointEventObject = null;
  //this.previousDataSeriesEventObject = null;

  this.ghostCanvas = (0, _utils.createCanvas)(this.chart.width, this.chart.height);
  //this.ghostCanvas.width = this.chart.width;
  //this.ghostCanvas.height = this.chart.height;

  this.ghostCtx = this.ghostCanvas.getContext("2d");

  var eventHandler = function eventHandler(ev) {
    _this.mouseEventHandler.call(_this, ev);
  };

  this.mouseoveredObjectMaps = [];
  //this.chart.canvas.addEventListener("mouseover", eventHandler);
  //this.chart.canvas.addEventListener("mousemove", eventHandler);
  //this.chart.canvas.addEventListener("mouseout", eventHandler);
  //this.chart.canvas.addEventListener("click", eventHandler);
}

EventManager.prototype.reset = function () {
  this.lastObjectId = 0;
  this.objectMap = [];
  this.rectangularRegionEventSubscriptions = [];
  this.previousDataPointEventObject = null;

  this.eventObjects = [];
  //this.ghostCanvas.width = this.chart.width;
  //this.ghostCanvas.height = this.chart.height;

  if (_utils.isCanvasSupported) {
    this.ghostCtx.clearRect(0, 0, this.chart.width, this.chart.height);
    this.ghostCtx.beginPath();
  }
};

EventManager.prototype.getNewObjectTrackingId = function () {
  return ++this.lastObjectId;
};

EventManager.prototype.mouseEventHandler = function (ev) {

  if (ev.type !== "mousemove" && ev.type !== "click") return;

  var eventObjectMaps = [];
  var xy = (0, _utils.getMouseCoordinates)(ev);
  var id = null;

  //var dataPointInfo = this.chart.getDataPointAtXY(xy.x, xy.y, false);

  //if (dataPointInfo) {
  //	id = dataPointInfo.dataSeries.dataPointIds[dataPointInfo.dataPointIndex];
  //} else if (isCanvasSupported) {//IE9+
  //	id = getObjectId(xy.x, xy.y, this.ghostCtx);
  //}
  id = this.chart.getObjectAtXY(xy.x, xy.y, false);

  if (id && typeof this.objectMap[id] !== "undefined") {

    var eventObjectMap = this.objectMap[id];

    if (eventObjectMap.objectType === "dataPoint") {
      var dataSeries = this.chart.data[eventObjectMap.dataSeriesIndex];
      var dataPoint = dataSeries.dataPoints[eventObjectMap.dataPointIndex];
      var dataPointIndex = eventObjectMap.dataPointIndex;

      //Event Parameter should not contain reference to dataSeries directly. But to its options.
      eventObjectMap.eventParameter = {
        x: xy.x, y: xy.y, dataPoint: dataPoint,
        dataSeries: dataSeries._options, dataPointIndex: dataPointIndex, dataSeriesIndex: dataSeries.index,
        chart: this.chart._publicChartReference
      };
      eventObjectMap.eventContext = {
        context: dataPoint, userContext: dataPoint, mouseover: "mouseover", mousemove: "mousemove", mouseout: "mouseout", click: "click"
      };
      eventObjectMaps.push(eventObjectMap);

      //Add Dataseries too because mouse event on dataPoint also means there is an event on dataSeries. DataSeries is not present on ghost canvas
      eventObjectMap = this.objectMap[dataSeries.id];

      //Event Parameter should not contain reference to dataSeries directly. But to its options.
      eventObjectMap.eventParameter = {
        x: xy.x, y: xy.y,
        dataPoint: dataPoint, dataSeries: dataSeries._options, dataPointIndex: dataPointIndex, dataSeriesIndex: dataSeries.index,
        chart: this.chart._publicChartReference
      };

      eventObjectMap.eventContext = {
        context: dataSeries, userContext: dataSeries._options, mouseover: "mouseover", mousemove: "mousemove", mouseout: "mouseout", click: "click"
      };
      eventObjectMaps.push(this.objectMap[dataSeries.id]);
    }
    //else if (eventObjectMap.objectType === "stripLine") {

    //	//Event Parameter should not contain reference to stripLine directly. But to its options.
    //	eventObjectMap.eventParameter = { x: xy.x, y: xy.y, stripLine: eventObjectMap.stripLine._options, axis: eventObjectMap.axis._options, stripLineIndex: eventObjectMap.stripLineIndex };
    //	eventObjectMap.eventContext = { context: eventObjectMap.stripLine, userContext: eventObjectMap.stripLine._options, mouseover: "mouseover", mousemove: "mousemove", mouseout: "mouseout", click: "click" };

    //	eventObjectMaps.push(eventObjectMap);
    //}
    else if (eventObjectMap.objectType === "legendItem") {

        var dataSeries = this.chart.data[eventObjectMap.dataSeriesIndex];
        var dataPoint = eventObjectMap.dataPointIndex !== null ? dataSeries.dataPoints[eventObjectMap.dataPointIndex] : null;

        //Event Parameter should not contain reference to DataSeries directly. But to its options.
        eventObjectMap.eventParameter = {
          x: xy.x, y: xy.y,
          dataSeries: dataSeries._options, dataPoint: dataPoint, dataPointIndex: eventObjectMap.dataPointIndex, dataSeriesIndex: eventObjectMap.dataSeriesIndex,
          chart: this.chart._publicChartReference
        };
        eventObjectMap.eventContext = {
          context: this.chart.legend, userContext: this.chart.legend._options, mouseover: "itemmouseover", mousemove: "itemmousemove", mouseout: "itemmouseout", click: "itemclick"
        };
        eventObjectMaps.push(eventObjectMap);
      }
  }

  //Fire mouseout if existing mouseovered objects are not present in the objectmap.
  var mouseOutObjectMapsExcluded = [];
  for (var i = 0; i < this.mouseoveredObjectMaps.length; i++) {
    var mouseOut = true;

    for (var j = 0; j < eventObjectMaps.length; j++) {
      if (eventObjectMaps[j].id === this.mouseoveredObjectMaps[i].id) {
        mouseOut = false;
        break;
      }
    }

    if (mouseOut) {
      this.fireEvent(this.mouseoveredObjectMaps[i], "mouseout", ev);
    } else {
      mouseOutObjectMapsExcluded.push(this.mouseoveredObjectMaps[i]);
    }
  }

  this.mouseoveredObjectMaps = mouseOutObjectMapsExcluded;

  //Process new eventObectMaps
  //If they already don't exist, add them and fire mouseover
  //If ev.type is mousemove, then just fire mousemove
  //If ev.type is click, then fire two events - click followed by mousemove
  for (var i = 0; i < eventObjectMaps.length; i++) {

    var existing = false;

    for (var j = 0; j < this.mouseoveredObjectMaps.length; j++) {
      if (eventObjectMaps[i].id === this.mouseoveredObjectMaps[j].id) {
        existing = true;
        break;
      }
    }

    if (!existing) {
      this.fireEvent(eventObjectMaps[i], "mouseover", ev);
      this.mouseoveredObjectMaps.push(eventObjectMaps[i]);
    }

    if (ev.type === "click") {
      this.fireEvent(eventObjectMaps[i], "click", ev);
    } else if (ev.type === "mousemove") {
      this.fireEvent(eventObjectMaps[i], "mousemove", ev);
    }
  }
};

EventManager.prototype.fireEvent = function (eventObjectMap, eventType, ev) {

  if (!eventObjectMap || !eventType) return;

  var eventParameter = eventObjectMap.eventParameter;
  var eventContext = eventObjectMap.eventContext;
  //var context = eventObjectMap.eventContext.context;
  var userContext = eventObjectMap.eventContext.userContext;

  if (userContext && eventContext && userContext[eventContext[eventType]]) userContext[eventContext[eventType]].call(userContext, eventParameter);

  if (eventType !== "mouseout") {
    if (userContext.cursor && userContext.cursor !== ev.target.style.cursor) {
      ev.target.style.cursor = userContext.cursor;
    }
  } else {
    ev.target.style.cursor = this.chart._defaultCursor;
    delete eventObjectMap.eventParameter; // reference no longer required.
    delete eventObjectMap.eventContext; // reference no longer required.
  }

  //This is just a quick fix. Need to find a better way of calling internal event handlers.
  if (eventType === "click" && eventObjectMap.objectType === "dataPoint" && this.chart.pieDoughnutClickHandler) {
    this.chart.pieDoughnutClickHandler.call(this.chart.data[eventObjectMap.dataSeriesIndex], eventParameter);
  }
};

exports.default = EventManager;

},{"../helpers/utils":39}],32:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
function LayoutManager(x1, y1, x2, y2, padding) {

  if (typeof padding === "undefined") padding = 0;

  this._padding = padding;

  this._x1 = x1;
  this._y1 = y1;
  this._x2 = x2;
  this._y2 = y2;

  this._topOccupied = this._padding;
  this._bottomOccupied = this._padding;
  this._leftOccupied = this._padding;
  this._rightOccupied = this._padding;
}

LayoutManager.prototype.registerSpace = function (position, size) {
  if (position === "top") {
    this._topOccupied += size.height;
  } else if (position === "bottom") {
    this._bottomOccupied += size.height;
  } else if (position === "left") {
    this._leftOccupied += size.width; // this is width when seen upright/vertically
  } else if (position === "right") {
      this._rightOccupied += size.width; // this is width when seen upright/vertically
    }
};

LayoutManager.prototype.unRegisterSpace = function (position, size) {
  if (position === "top") {
    this._topOccupied -= size.height;
  } else if (position === "bottom") {
    this._bottomOccupied -= size.height;
  } else if (position === "left") {
    this._leftOccupied -= size.width; // this is width when seen upright/vertically
  } else if (position === "right") {
      this._rightOccupied -= size.width; // this is width when seen upright/vertically
    }
};

LayoutManager.prototype.getFreeSpace = function () {
  ///<signature>
  ///<summary>Returns available free space {x1:number, y1:number, x2:number, y2:number}</summary>
  ///</signature>

  return {
    x1: this._x1 + this._leftOccupied,
    y1: this._y1 + this._topOccupied,
    x2: this._x2 - this._rightOccupied,
    y2: this._y2 - this._bottomOccupied,
    width: this._x2 - this._x1 - this._rightOccupied - this._leftOccupied,
    height: this._y2 - this._y1 - this._bottomOccupied - this._topOccupied
  };
};

LayoutManager.prototype.reset = function () {
  //so that there is enough padding.
  this._topOccupied = this._padding;
  this._bottomOccupied = this._padding;
  this._leftOccupied = this._padding;
  this._rightOccupied = this._padding;
};

exports.default = LayoutManager;

},{}],33:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _data_series = require('./data_series');

var _data_series2 = _interopRequireDefault(_data_series);

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _text_block = require('./text_block');

var _text_block2 = _interopRequireDefault(_text_block);

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function Legend(chart, options, theme) {
  Legend.base.constructor.call(this, "Legend", options, theme);

  this.chart = chart;
  this.canvas = chart.canvas;
  this.ctx = this.chart.ctx;
  this.ghostCtx = this.chart._eventManager.ghostCtx;
  this.items = [];

  this.width = 0,
  //this.fontSize = 12,
  this.height = 0, this.orientation = null, this.dataSeries = [];
  this.bounds = {
    x1: null, y1: null, x2: null, y2: null
  };

  if (typeof this._options.fontSize === "undefined") {
    this.fontSize = this.chart.getAutoFontSize(this.fontSize);
    //window.console.log("fontSize: " + this.fontSize);
  }

  this.lineHeight = (0, _utils.getFontHeightInPixels)(this.fontFamily, this.fontSize, this.fontWeight);

  this.horizontalSpacing = this.fontSize;
}

(0, _utils.extend)(Legend, _canvasjs2.default);

Legend.prototype.render = function () {

  var container = !this.dockInsidePlotArea ? this.chart : this.chart.plotArea;
  var freeSpace = container.layoutManager.getFreeSpace();
  var position = null;
  var top = 0;
  var left = 0;
  var maxWidth = 0;
  var maxHeight = 0;
  var itemMargin = 5;

  var items = [];
  var rows = [];

  //this.ctx.font = getFontString("", this, null);
  //this.ctx.fontColor = this.fontColor;

  if (this.verticalAlign === "top" || this.verticalAlign === "bottom") {
    this.orientation = "horizontal";
    position = this.verticalAlign;

    maxWidth = this.maxWidth !== null ? this.maxWidth : freeSpace.width * .7;
    maxHeight = this.maxHeight !== null ? this.maxHeight : freeSpace.height * .5;
  } else if (this.verticalAlign === "center") {
    this.orientation = "vertical";
    position = this.horizontalAlign;

    maxWidth = this.maxWidth !== null ? this.maxWidth : freeSpace.width * .5;
    maxHeight = this.maxHeight !== null ? this.maxHeight : freeSpace.height * .7;
  }

  for (var i = 0; i < this.dataSeries.length; i++) {
    var dataSeries = this.dataSeries[i];

    if (dataSeries.type !== "pie" && dataSeries.type !== "doughnut" && dataSeries.type !== "funnel") {

      var markerType = dataSeries.legendMarkerType ? dataSeries.legendMarkerType : (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "scatter" || dataSeries.type === "bubble") && dataSeries.markerType ? dataSeries.markerType : _data_series2.default.getDefaultLegendMarker(dataSeries.type);
      var legendText = dataSeries.legendText ? dataSeries.legendText : this.itemTextFormatter ? this.itemTextFormatter({ chart: this.chart, legend: this._options, dataSeries: dataSeries, dataPoint: null }) : dataSeries.name;
      var markerColor = dataSeries.legendMarkerColor ? dataSeries.legendMarkerColor : dataSeries.markerColor ? dataSeries.markerColor : dataSeries._colorSet[0];
      var markerSize = !dataSeries.markerSize && (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline") ? 0 : this.lineHeight * .6;
      var markerBorderColor = dataSeries.legendMarkerBorderColor ? dataSeries.legendMarkerBorderColor : dataSeries.markerBorderColor;
      var markerBorderThickness = dataSeries.legendMarkerBorderThickness ? dataSeries.legendMarkerBorderThickness : dataSeries.markerBorderThickness ? Math.max(1, Math.round(markerSize * .2)) : 0;
      var lineColor = dataSeries._colorSet[0];

      legendText = this.chart.replaceKeywordsWithValue(legendText, dataSeries.dataPoints[0], dataSeries, i);
      var item = {
        markerType: markerType, markerColor: markerColor, text: legendText, textBlock: null, chartType: dataSeries.type, markerSize: markerSize, lineColor: dataSeries._colorSet[0],
        dataSeriesIndex: dataSeries.index, dataPointIndex: null, markerBorderColor: markerBorderColor, markerBorderThickness: markerBorderThickness
      };

      items.push(item);
    } else {
      for (var dataPointIndex = 0; dataPointIndex < dataSeries.dataPoints.length; dataPointIndex++) {

        var dataPoint = dataSeries.dataPoints[dataPointIndex];

        var markerType = dataPoint.legendMarkerType ? dataPoint.legendMarkerType : dataSeries.legendMarkerType ? dataSeries.legendMarkerType : _data_series2.default.getDefaultLegendMarker(dataSeries.type);
        var legendText = dataPoint.legendText ? dataPoint.legendText : dataSeries.legendText ? dataSeries.legendText : this.itemTextFormatter ? this.itemTextFormatter({ chart: this.chart, legend: this._options, dataSeries: dataSeries, dataPoint: dataPoint }) : dataPoint.name ? dataPoint.name : "DataPoint: " + (dataPointIndex + 1);
        var markerColor = dataPoint.legendMarkerColor ? dataPoint.legendMarkerColor : dataSeries.legendMarkerColor ? dataSeries.legendMarkerColor : dataPoint.color ? dataPoint.color : dataSeries.color ? dataSeries.color : dataSeries._colorSet[dataPointIndex % dataSeries._colorSet.length];
        var markerSize = this.lineHeight * .6;
        var markerBorderColor = dataPoint.legendMarkerBorderColor ? dataPoint.legendMarkerBorderColor : dataSeries.legendMarkerBorderColor ? dataSeries.legendMarkerBorderColor : dataPoint.markerBorderColor ? dataPoint.markerBorderColor : dataSeries.markerBorderColor;
        var markerBorderThickness = dataPoint.legendMarkerBorderThickness ? dataPoint.legendMarkerBorderThickness : dataSeries.legendMarkerBorderThickness ? dataSeries.legendMarkerBorderThickness : dataPoint.markerBorderThickness || dataSeries.markerBorderThickness ? Math.max(1, Math.round(markerSize * .2)) : 0;

        legendText = this.chart.replaceKeywordsWithValue(legendText, dataPoint, dataSeries, dataPointIndex);

        var item = {
          markerType: markerType, markerColor: markerColor, text: legendText, textBlock: null, chartType: dataSeries.type, markerSize: markerSize,
          dataSeriesIndex: i, dataPointIndex: dataPointIndex, markerBorderColor: markerBorderColor, markerBorderThickness: markerBorderThickness
        };

        if (dataPoint.showInLegend || dataSeries.showInLegend && dataPoint.showInLegend !== false) {
          items.push(item);
        }
      }
    }
    item = null;
  }
  if (this.reversed === true) {
    items.reverse();
  }

  // Find out the required width and height of Legend and position the items relative to the container
  if (items.length > 0) {
    var row = null;
    var rowIndex = 0; // required for vertical orientation
    var textMaxWidth = 0;
    var columnHeight = 0;

    if (this.itemWidth !== null) {
      if (this.itemMaxWidth !== null) {
        textMaxWidth = Math.min(this.itemWidth, this.itemMaxWidth, maxWidth);
      } else {
        textMaxWidth = Math.min(this.itemWidth, maxWidth);
      }
    } else {
      if (this.itemMaxWidth !== null) {
        textMaxWidth = Math.min(this.itemMaxWidth, maxWidth);
      } else {
        textMaxWidth = maxWidth;
      }
    }

    markerSize = markerSize === 0 ? this.lineHeight * .6 : markerSize;
    textMaxWidth = textMaxWidth - (markerSize + this.horizontalSpacing * .1);

    for (var i = 0; i < items.length; i++) {
      var item = items[i];

      if (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine") {
        textMaxWidth = textMaxWidth - 2 * (this.lineHeight * .1);
      }

      if (maxHeight <= 0 || typeof maxHeight === "undefined" || textMaxWidth <= 0 || typeof textMaxWidth === "undefined") {
        continue;
      }

      if (this.orientation === "horizontal") {

        item.textBlock = new _text_block2.default(this.ctx, {
          x: 0,
          y: 0, //TBI
          maxWidth: textMaxWidth,
          maxHeight: this.itemWrap ? maxHeight : this.lineHeight, //TBI: FontSize
          angle: 0,
          text: item.text,
          horizontalAlign: "left", //left, center, right
          fontSize: this.fontSize, //in pixels
          fontFamily: this.fontFamily,
          fontWeight: this.fontWeight, //normal, bold, bolder, lighter,
          fontColor: this.fontColor,
          fontStyle: this.fontStyle, // normal, italic, oblique
          textBaseline: "top"
        });
        item.textBlock.measureText();

        if (this.itemWidth !== null) {
          item.textBlock.width = this.itemWidth - (markerSize + this.horizontalSpacing * .1 + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0));
        }

        if (!row || row.width + Math.round(item.textBlock.width + this.horizontalSpacing * .1 + markerSize + (row.width === 0 ? 0 : this.horizontalSpacing) + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0)) > maxWidth) {
          row = {
            items: [], width: 0
          };
          rows.push(row);
          this.height += columnHeight;
          columnHeight = 0;
        }

        columnHeight = Math.max(columnHeight, item.textBlock.height);

        item.textBlock.x = row.width;
        item.textBlock.y = 0;

        row.width += Math.round(item.textBlock.width + this.horizontalSpacing * .1 + markerSize + (row.width === 0 ? 0 : this.horizontalSpacing) + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0));
        row.items.push(item);

        this.width = Math.max(row.width, this.width);
      } else {

        item.textBlock = new _text_block2.default(this.ctx, {
          x: 0,
          y: 0, //TBI
          maxWidth: textMaxWidth,
          maxHeight: this.itemWrap === true ? maxHeight : this.fontSize * 1.5, //TBI: FontSize
          angle: 0,
          text: item.text,
          horizontalAlign: "left", //left, center, right
          fontSize: this.fontSize, //in pixels
          fontFamily: this.fontFamily,
          fontWeight: this.fontWeight, //normal, bold, bolder, lighter,
          fontColor: this.fontColor,
          fontStyle: this.fontStyle, // normal, italic, oblique
          textBaseline: "top"
        });

        item.textBlock.measureText();

        if (this.itemWidth !== null) {
          item.textBlock.width = this.itemWidth - (markerSize + this.horizontalSpacing * .1 + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0));
        }

        if (this.height <= maxHeight) {
          row = {
            items: [], width: 0
          };
          rows.push(row);
        } else {
          row = rows[rowIndex];
          rowIndex = (rowIndex + 1) % rows.length;
        }

        this.height += item.textBlock.height;

        item.textBlock.x = row.width; // relative to the row
        item.textBlock.y = 0; // relative to the row

        row.width += Math.round(item.textBlock.width + this.horizontalSpacing * .1 + markerSize + (row.width === 0 ? 0 : this.horizontalSpacing) + (item.chartType === "line" || item.chartType === "spline" || item.chartType === "stepLine" ? 2 * (this.lineHeight * .1) : 0));
        row.items.push(item);

        this.width = Math.max(row.width, this.width);
      }
    }

    if (this.itemWrap === false) {
      this.height = rows.length * this.lineHeight;
    } else {
      this.height += columnHeight;
    }

    this.height = Math.min(maxHeight, this.height);
    this.width = Math.min(maxWidth, this.width);
  }

  if (this.verticalAlign === "top") {
    if (this.horizontalAlign === "left") left = freeSpace.x1;else if (this.horizontalAlign === "right") left = freeSpace.x2 - this.width;else left = freeSpace.x1 + freeSpace.width / 2 - this.width / 2;

    top = freeSpace.y1;
  } else if (this.verticalAlign === "center") {
    if (this.horizontalAlign === "left") left = freeSpace.x1;else if (this.horizontalAlign === "right") left = freeSpace.x2 - this.width;else left = freeSpace.x1 + freeSpace.width / 2 - this.width / 2;

    top = freeSpace.y1 + freeSpace.height / 2 - this.height / 2;
  } else if (this.verticalAlign === "bottom") {
    if (this.horizontalAlign === "left") left = freeSpace.x1;else if (this.horizontalAlign === "right") left = freeSpace.x2 - this.width;else left = freeSpace.x1 + freeSpace.width / 2 - this.width / 2;

    top = freeSpace.y2 - this.height;
  }

  this.items = items;

  //Assign ids to all legendItems
  for (var i = 0; i < this.items.length; i++) {

    var item = items[i];

    item.id = ++this.chart._eventManager.lastObjectId;
    this.chart._eventManager.objectMap[item.id] = {
      id: item.id, objectType: "legendItem", legendItemIndex: i, dataSeriesIndex: item.dataSeriesIndex, dataPointIndex: item.dataPointIndex
    };
    //delete item.textBlock;// Not Required anymore
  }

  var rowHeight = 0;
  for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    var columnHeight = 0;
    for (var itemIndex = 0; itemIndex < row.items.length; itemIndex++) {
      var item = row.items[itemIndex];

      var itemX = item.textBlock.x + left + (itemIndex === 0 ? markerSize * .2 : this.horizontalSpacing);
      var itemY = top + rowHeight;

      var ghostX = itemX;

      if (!this.chart.data[item.dataSeriesIndex].visible) this.ctx.globalAlpha = .5;

      this.ctx.save();
      this.ctx.rect(left, top, maxWidth, maxHeight);
      this.ctx.clip();

      if (item.chartType === "line" || item.chartType === "stepLine" || item.chartType === "spline") {
        this.ctx.strokeStyle = item.lineColor;
        this.ctx.lineWidth = Math.ceil(this.lineHeight / 8);
        this.ctx.beginPath();
        this.ctx.moveTo(itemX - this.lineHeight * .1, itemY + this.lineHeight / 2);
        this.ctx.lineTo(itemX + this.lineHeight * .7, itemY + this.lineHeight / 2);
        this.ctx.stroke();

        ghostX -= this.lineHeight * .1;
      }

      _render2.default.drawMarker(itemX + markerSize / 2, itemY + this.lineHeight / 2, this.ctx, item.markerType, item.markerSize, item.markerColor, item.markerBorderColor, item.markerBorderThickness);

      item.textBlock.x = itemX + this.horizontalSpacing * .1 + markerSize;

      if (item.chartType === "line" || item.chartType === "stepLine" || item.chartType === "spline") {
        item.textBlock.x = item.textBlock.x + this.lineHeight * .1;
      }

      item.textBlock.y = itemY;

      item.textBlock.render(true);

      this.ctx.restore();

      if (itemIndex > 0) {
        columnHeight = Math.max(columnHeight, item.textBlock.height);
      } else {
        columnHeight = item.textBlock.height;
      }

      if (!this.chart.data[item.dataSeriesIndex].visible) this.ctx.globalAlpha = 1;

      var hexColor = intToHexColorString(item.id);
      this.ghostCtx.fillStyle = hexColor;
      this.ghostCtx.beginPath();
      this.ghostCtx.fillRect(ghostX, item.textBlock.y, item.textBlock.x + item.textBlock.width - ghostX, item.textBlock.height);

      item.x1 = this.chart._eventManager.objectMap[item.id].x1 = ghostX;
      item.y1 = this.chart._eventManager.objectMap[item.id].y1 = item.textBlock.y;
      item.x2 = this.chart._eventManager.objectMap[item.id].x2 = item.textBlock.x + item.textBlock.width;
      item.y2 = this.chart._eventManager.objectMap[item.id].y2 = item.textBlock.y + item.textBlock.height;
    }
    rowHeight = rowHeight + columnHeight;
  }

  //this.ctx.beginPath();
  //this.ctx.lineWidth = 2;
  //this.ctx.strokeStyle = "red";
  //this.ctx.rect(left, top, this.width, this.height);
  //this.ctx.stroke();

  container.layoutManager.registerSpace(position, { width: this.width + 2 + 2, height: this.height + 5 + 5 });

  this.bounds = {
    x1: left, y1: top, x2: left + this.width, y2: top + this.height
  };
};

exports.default = Legend;

},{"../helpers/render":38,"../helpers/utils":39,"./canvasjs":27,"./data_series":30,"./text_block":34}],34:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function TextBlock(ctx, options) {

  TextBlock.base.constructor.call(this, "TextBlock", options);

  this.ctx = ctx;
  this._isDirty = true;
  this._wrappedText = null;
  this._lineHeight = (0, _utils.getFontHeightInPixels)(this.fontFamily, this.fontSize, this.fontWeight);
}

(0, _utils.extend)(TextBlock, _canvasjs2.default);

TextBlock.prototype.render = function (preserveContext) {
  if (preserveContext) this.ctx.save();

  var font = this.ctx.font;
  this.ctx.textBaseline = this.textBaseline;

  var offsetY = 0;

  if (this._isDirty) this.measureText(this.ctx);

  this.ctx.translate(this.x, this.y + offsetY);

  if (this.textBaseline === "middle") {
    offsetY = -this._lineHeight / 2;
  }

  this.ctx.font = this._getFontString();

  this.ctx.rotate(Math.PI / 180 * this.angle);

  var textLeft = 0;
  var textTop = this.padding;
  //var textTop = this.padding;
  var line = null;

  if (this.borderThickness > 0 && this.borderColor || this.backgroundColor) {
    this.ctx.roundRect(0, offsetY, this.width, this.height, this.cornerRadius, this.borderThickness, this.backgroundColor, this.borderColor);

    //if (this.textBaseline === "middle") {
    //	//textTop += this.fontSize / 2;
    //	textTop += this._lineHeight / 2;
    //}
  }

  this.ctx.fillStyle = this.fontColor;

  for (var i = 0; i < this._wrappedText.lines.length; i++) {

    line = this._wrappedText.lines[i];
    if (this.horizontalAlign === "right") textLeft = this.width - line.width - this.padding;else if (this.horizontalAlign === "left") textLeft = this.padding;else if (this.horizontalAlign === "center") textLeft = (this.width - this.padding * 2) / 2 - line.width / 2 + this.padding;

    this.ctx.fillText(line.text, textLeft, textTop);

    textTop += line.height;
  }

  this.ctx.font = font;

  if (preserveContext) this.ctx.restore();
};

TextBlock.prototype.setText = function (text) {
  this.text = text;
  this._isDirty = true;
  this._wrappedText = null;
};

TextBlock.prototype.measureText = function () {
  if (this.maxWidth === null) {
    throw "Please set maxWidth and height for TextBlock";
  }

  this._wrapText(this.ctx);
  this._isDirty = false;

  return {
    width: this.width, height: this.height
  };
};

TextBlock.prototype._getLineWithWidth = function (text, width, clipWord) {
  text = String(text);
  clipWord = clipWord || false;

  if (!text) return {
    text: "", width: 0
  };

  var textWidth = 0,
      min = 0,
      max = text.length - 1,
      mid = Infinity;

  this.ctx.font = this._getFontString();

  while (min <= max) {
    mid = Math.floor((min + max) / 2);
    var tempText = text.substr(0, mid + 1);

    textWidth = this.ctx.measureText(tempText).width;

    if (textWidth < width) {
      min = mid + 1;
    } else if (textWidth > width) {
      max = mid - 1;
    } else {
      break;
    }
  }

  //edge cases
  if (textWidth > width && tempText.length > 1) {
    tempText = tempText.substr(0, tempText.length - 1);
    textWidth = this.ctx.measureText(tempText).width;
  }

  var isClipped = true;

  if (tempText.length === text.length || text[tempText.length] === " ") isClipped = false;

  if (isClipped) {
    var resultWords = tempText.split(" ");
    if (resultWords.length > 1) resultWords.pop();

    tempText = resultWords.join(" ");
    textWidth = this.ctx.measureText(tempText).width;
  }

  return {
    text: tempText, width: textWidth
  };
};

TextBlock.prototype._wrapText = function wrapText() {
  //this.ctx.save();
  var text = new String((0, _utils.trimString)(String(this.text)));
  var lines = [];
  var font = this.ctx.font; // Save the current Font
  var height = 0;
  var width = 0;

  this.ctx.font = this._getFontString();

  while (text.length > 0) {

    var maxWidth = this.maxWidth - this.padding * 2;
    var maxHeight = this.maxHeight - this.padding * 2;

    var line = this._getLineWithWidth(text, maxWidth, false);
    line.height = this._lineHeight;

    lines.push(line);

    width = Math.max(width, line.width);
    height += line.height;
    text = (0, _utils.trimString)(text.slice(line.text.length, text.length));

    if (maxHeight && height > maxHeight) {
      var line = lines.pop();
      height -= line.height;
    }
  }

  this._wrappedText = {
    lines: lines, width: width, height: height
  };
  this.width = width + this.padding * 2;
  this.height = height + this.padding * 2;

  this.ctx.font = font; // Restore the font
};

TextBlock.prototype._getFontString = function () {
  //return this.fontStyle + " " + this.fontWeight + " " + this.fontSize + "px " + this.fontFamily
  return (0, _utils.getFontString)("", this, null);
};

exports.default = TextBlock;

},{"../helpers/utils":39,"./canvasjs":27}],35:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
	value: true
});

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _text_block = require('./text_block');

var _text_block2 = _interopRequireDefault(_text_block);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function Title(chart, options) {
	Title.base.constructor.call(this, "Title", options, chart.theme);

	this.chart = chart;
	this.canvas = chart.canvas;
	this.ctx = this.chart.ctx;

	if (typeof this._options.fontSize === "undefined") {

		this.fontSize = this.chart.getAutoFontSize(this.fontSize);

		//window.console.log("Chart Title fontSize: " + this.fontSize);
	}

	this.width = null, //read only
	this.height = null; //read only
	this.bounds = {
		x1: null, y1: null, x2: null, y2: null
	};
}

(0, _utils.extend)(Title, _canvasjs2.default);

Title.prototype.render = function () {

	if (!this.text) return;

	var container = !this.dockInsidePlotArea ? this.chart : this.chart.plotArea;
	var freespace = container.layoutManager.getFreeSpace();
	var left = freespace.x1;
	var top = freespace.y1;
	var angle = 0;
	var maxHeight = 0;
	var containerMargin = 2; //Margin towards the container
	var rightOffset = this.chart._menuButton && this.chart.exportEnabled && this.verticalAlign === "top" ? 22 : 0; //So that Title doesn't overlap menu button.

	var textBlockHorizontalAlign;
	var position;

	if (this.verticalAlign === "top" || this.verticalAlign === "bottom") {
		if (this.maxWidth === null) this.maxWidth = freespace.width - containerMargin * 2 - rightOffset * (this.horizontalAlign === "center" ? 2 : 1);

		maxHeight = freespace.height * .5 - this.margin - containerMargin;
		angle = 0;
	} else if (this.verticalAlign === "center") {

		if (this.horizontalAlign === "left" || this.horizontalAlign === "right") {
			if (this.maxWidth === null) this.maxWidth = freespace.height - containerMargin * 2;

			maxHeight = freespace.width * .5 - this.margin - containerMargin;
		} else if (this.horizontalAlign === "center") {
			if (this.maxWidth === null) this.maxWidth = freespace.width - containerMargin * 2;

			maxHeight = freespace.height * .5 - containerMargin * 2;
		}
	}

	if (!this.wrap) maxHeight = Math.min(maxHeight, Math.max(this.fontSize * 1.5, this.fontSize + this.padding * 2.5));
	//console.log(this.maxWidth);

	var textBlock = new _text_block2.default(this.ctx, {
		fontSize: this.fontSize, fontFamily: this.fontFamily, fontColor: this.fontColor,
		fontStyle: this.fontStyle, fontWeight: this.fontWeight,
		horizontalAlign: this.horizontalAlign, verticalAlign: this.verticalAlign,
		borderColor: this.borderColor, borderThickness: this.borderThickness,
		backgroundColor: this.backgroundColor,
		maxWidth: this.maxWidth, maxHeight: maxHeight,
		cornerRadius: this.cornerRadius,
		text: this.text,
		padding: this.padding,
		textBaseline: "top"
	});

	var textBlockSize = textBlock.measureText();

	if (this.verticalAlign === "top" || this.verticalAlign === "bottom") {

		if (this.verticalAlign === "top") {
			top = freespace.y1 + containerMargin;
			position = "top";
		} else if (this.verticalAlign === "bottom") {
			top = freespace.y2 - containerMargin - textBlockSize.height;
			position = "bottom";
		}

		if (this.horizontalAlign === "left") {
			left = freespace.x1 + containerMargin;
		} else if (this.horizontalAlign === "center") {
			left = freespace.x1 + freespace.width / 2 - textBlockSize.width / 2;
		} else if (this.horizontalAlign === "right") {
			left = freespace.x2 - containerMargin - textBlockSize.width - rightOffset;
		}

		textBlockHorizontalAlign = this.horizontalAlign;

		this.width = textBlockSize.width;
		this.height = textBlockSize.height;
	} else if (this.verticalAlign === "center") {

		if (this.horizontalAlign === "left") {

			left = freespace.x1 + containerMargin;
			top = freespace.y2 - containerMargin - (this.maxWidth / 2 - textBlockSize.width / 2);
			angle = -90;

			position = "left";
			this.width = textBlockSize.height;
			this.height = textBlockSize.width;
		} else if (this.horizontalAlign === "right") {
			left = freespace.x2 - containerMargin;
			top = freespace.y1 + containerMargin + (this.maxWidth / 2 - textBlockSize.width / 2);
			angle = 90;

			position = "right";
			this.width = textBlockSize.height;
			this.height = textBlockSize.width;
		} else if (this.horizontalAlign === "center") {
			top = container.y1 + (container.height / 2 - textBlockSize.height / 2);
			left = container.x1 + (container.width / 2 - textBlockSize.width / 2);

			position = "center";
			this.width = textBlockSize.width;
			this.height = textBlockSize.height;
		}

		textBlockHorizontalAlign = "center";
	}

	textBlock.x = left;
	textBlock.y = top;
	textBlock.angle = angle;
	textBlock.horizontalAlign = textBlockHorizontalAlign;
	textBlock.render(true);

	container.layoutManager.registerSpace(position, {
		width: this.width + (position === "left" || position === "right" ? this.margin + containerMargin : 0),
		height: this.height + (position === "top" || position === "bottom" ? this.margin + containerMargin : 0)
	});

	this.bounds = {
		x1: left, y1: top, x2: left + this.width, y2: top + this.height
	};

	this.ctx.textBaseline = "top";
};

exports.default = Title;

},{"../helpers/utils":39,"./canvasjs":27,"./text_block":34}],36:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _animator = require('../helpers/animator');

var _animator2 = _interopRequireDefault(_animator);

var _render = require('../helpers/render');

var _render2 = _interopRequireDefault(_render);

var _canvasjs = require('./canvasjs');

var _canvasjs2 = _interopRequireDefault(_canvasjs);

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function ToolTip(chart, options, theme) {

  ToolTip.base.constructor.call(this, "ToolTip", options, theme);

  this.chart = chart;
  this.canvas = chart.canvas;
  this.ctx = this.chart.ctx;
  this.currentSeriesIndex = -1;
  this.currentDataPointIndex = -1;
  this._timerId = 0;
  this._prevX = NaN;
  this._prevY = NaN;

  this._initialize();
}

(0, _utils.extend)(ToolTip, _canvasjs2.default);

ToolTip.prototype._initialize = function () {

  if (this.enabled) {
    this.container = document.createElement("div");
    this.container.setAttribute("class", "canvasjs-chart-tooltip");
    this.container.style.position = "absolute";
    this.container.style.height = "auto";
    this.container.style.boxShadow = "1px 1px 2px 2px rgba(0,0,0,0.1)";
    this.container.style.zIndex = "1000";
    //this.container.style.pointerEvents = "none";
    this.container.style.display = "none";
    //this.container.style.whiteSpace = "no-wrap";

    var toolTipHtml = "<div style=\" width: auto;";
    toolTipHtml += "height: auto;";
    toolTipHtml += "min-width: 50px;";
    toolTipHtml += "line-height: auto;";
    toolTipHtml += "margin: 0px 0px 0px 0px;";
    toolTipHtml += "padding: 5px;";
    toolTipHtml += "font-family: Calibri, Arial, Georgia, serif;";
    toolTipHtml += "font-weight: normal;";
    toolTipHtml += "font-style: " + (_utils.isCanvasSupported ? "italic;" : "normal;");
    toolTipHtml += "font-size: 14px;";
    toolTipHtml += "color: #000000;";
    toolTipHtml += "text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1);";
    toolTipHtml += "text-align: left;";
    toolTipHtml += "border: 2px solid gray;";

    //Older browsers like IE8- don't support alpha values
    toolTipHtml += _utils.isCanvasSupported ? "background: rgba(255,255,255,.9);" : "background: rgb(255,255,255);";

    toolTipHtml += "text-indent: 0px;";
    toolTipHtml += "white-space: nowrap;";
    //toolTipHtml += "pointer-events:none;";
    toolTipHtml += "border-radius: 5px;";

    //Disable Text Selection
    toolTipHtml += "-moz-user-select:none;";
    toolTipHtml += "-khtml-user-select: none;";
    toolTipHtml += "-webkit-user-select: none;";
    toolTipHtml += "-ms-user-select: none;";
    toolTipHtml += "user-select: none;";

    //toolTipHtml += "opacity: 0;";
    //toolTipHtml += "filter: progid: DXImageTransform.Microsoft.gradient(GradientType = 0, startColorstr = '#4cffffff', endColorstr = '#4cffffff');";

    if (!_utils.isCanvasSupported) {
      //toolTipHtml += "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=90)'";
      //-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000')";
      /* For IE 5.5 - 7 */
      toolTipHtml += "filter: alpha(opacity = 90);";
      toolTipHtml += "filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#666666');";
    }

    toolTipHtml += "} \"> Sample Tooltip</div>";

    this.container.innerHTML = toolTipHtml;
    this.contentDiv = this.container.firstChild;

    this.container.style.borderRadius = this.contentDiv.style.borderRadius;
    this.chart._canvasJSContainer.appendChild(this.container);
  }
};

ToolTip.prototype.mouseMoveHandler = function (x, y) {

  if (!(this._lastUpdated && new Date().getTime() - this._lastUpdated < 40)) {
    this._lastUpdated = new Date().getTime();
    this._updateToolTip(x, y);
  }
};

ToolTip.prototype._updateToolTip = function (mouseX, mouseY) {
  //return;

  if (this.chart.disableToolTip) // Disabled during animation, etc
    return;

  if (typeof mouseX === "undefined" || typeof mouseY === "undefined") {
    if (isNaN(this._prevX) || isNaN(this._prevY)) return;else {
      mouseX = this._prevX;
      mouseY = this._prevY;
    }
  } else {
    this._prevX = mouseX;
    this._prevY = mouseY;
  }

  var dataPoint = null;
  var dataSeries = null;
  var toolTipContent = "";
  var entries = [];
  var toolTipRight;
  var toolTipBottom;
  var x = 0;

  if (this.shared && this.enabled && this.chart.plotInfo.axisPlacement !== "none") {
    // && this.chart.plotInfo.axisPlacement !== "none"
    if (this.chart.plotInfo.axisPlacement === "xySwapped") {
      x = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.height * (this.chart.axisX.lineCoordinates.y2 - mouseY) + this.chart.axisX.viewportMinimum;
    } else {
      x = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.width * (mouseX - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.viewportMinimum;
    }

    var nearbyEntries = [];

    for (var i = 0; i < this.chart.data.length; i++) {
      var entry = this.chart.data[i].getDataPointAtX(x, true);

      if (entry && entry.index >= 0) {
        entry.dataSeries = this.chart.data[i];

        if (entry.dataPoint.y !== null) nearbyEntries.push(entry);
      }
    }

    if (nearbyEntries.length === 0) return;

    nearbyEntries.sort(function (entry1, entry2) {
      return entry1.distance - entry2.distance;
    });

    var closest = nearbyEntries[0];

    for (i = 0; i < nearbyEntries.length; i++) {

      if (nearbyEntries[i].dataPoint.x.valueOf() === closest.dataPoint.x.valueOf()) entries.push(nearbyEntries[i]);
    }

    nearbyEntries = null;
  } else {

    var dataPointInfo = this.chart.getDataPointAtXY(mouseX, mouseY, true);
    //dataPointInfo = null;

    if (dataPointInfo) {
      this.currentDataPointIndex = dataPointInfo.dataPointIndex;
      this.currentSeriesIndex = dataPointInfo.dataSeries.index;
    } else if (_utils.isCanvasSupported) {

      var id = (0, _utils.getObjectId)(mouseX, mouseY, this.chart._eventManager.ghostCtx);
      if (id > 0 && typeof this.chart._eventManager.objectMap[id] !== "undefined") {
        //DataPoint/DataSeries event
        var eventObject = this.chart._eventManager.objectMap[id];

        if (eventObject.objectType === "legendItem") return;

        //if (this.currentSeriesIndex === eventObject.dataSeriesIndex && this.currentDataPointIndex === eventObject.dataPointIndex)
        //  return;
        //else {
        this.currentSeriesIndex = eventObject.dataSeriesIndex;
        this.currentDataPointIndex = eventObject.dataPointIndex >= 0 ? eventObject.dataPointIndex : -1;
        //}

        //window.console.log("id: " + id + "; hex: " + intToHexColorString(id));
      } else this.currentDataPointIndex = -1;
    } else this.currentDataPointIndex = -1;

    if (this.currentSeriesIndex >= 0) {

      dataSeries = this.chart.data[this.currentSeriesIndex];

      var entry = {};

      if (this.currentDataPointIndex >= 0) {
        dataPoint = dataSeries.dataPoints[this.currentDataPointIndex];

        entry.dataSeries = dataSeries;
        entry.dataPoint = dataPoint;
        entry.index = this.currentDataPointIndex;
        entry.distance = Math.abs(dataPoint.x - x);
      } else if (this.enabled && (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea" || dataSeries.type === "candlestick" || dataSeries.type === "ohlc")) {

        //var x = (this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum) / this.chart.axisX.lineCoordinates.width * (mouseX - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.viewportMinimum.valueOf();
        var x = dataSeries.axisX.conversionParameters.minimum + (mouseX - dataSeries.axisX.conversionParameters.reference) / dataSeries.axisX.conversionParameters.pixelPerUnit;

        entry = dataSeries.getDataPointAtX(x, true);
        entry.dataSeries = dataSeries;
        this.currentDataPointIndex = entry.index;
        dataPoint = entry.dataPoint;
      } else {
        //this.hide();
        return;
      }

      if (entry.dataPoint.y !== null) {
        if (entry.dataSeries.axisY) {
          if (entry.dataPoint.y.length > 0) {
            var unboundToViewport = 0;
            for (var i = 0; i < entry.dataPoint.y.length; i++) {
              if (entry.dataPoint.y[i] < entry.dataSeries.axisY.viewportMinimum) unboundToViewport--;else if (entry.dataPoint.y[i] > entry.dataSeries.axisY.viewportMaximum) unboundToViewport++;
            }if (unboundToViewport < entry.dataPoint.y.length && unboundToViewport > -entry.dataPoint.y.length) entries.push(entry);
          } else {
            if (entry.dataPoint.y >= entry.dataSeries.axisY.viewportMinimum && entry.dataPoint.y <= entry.dataSeries.axisY.viewportMaximum) entries.push(entry);
          }
        } else entries.push(entry);
      }
    }
  }

  if (entries.length > 0) {

    this.highlightObjects(entries);

    if (this.enabled) {

      var toolTipInnerHtml = "";

      toolTipInnerHtml = this.getToolTipInnerHTML({ entries: entries });

      if (toolTipInnerHtml !== null) {
        this.contentDiv.innerHTML = toolTipInnerHtml;

        this.contentDiv.innerHTML = toolTipInnerHtml;

        var previouslyHidden = false;
        if (this.container.style.display === "none") {
          previouslyHidden = true;
          this.container.style.display = "block";
        }

        try {
          this.contentDiv.style.background = this.backgroundColor ? this.backgroundColor : _utils.isCanvasSupported ? "rgba(255,255,255,.9)" : "rgb(255,255,255)";

          this.contentDiv.style.borderRightColor = this.contentDiv.style.borderLeftColor = this.contentDiv.style.borderColor = this.borderColor ? this.borderColor : entries[0].dataPoint.color ? entries[0].dataPoint.color : entries[0].dataSeries.color ? entries[0].dataSeries.color : entries[0].dataSeries._colorSet[entries[0].index % entries[0].dataSeries._colorSet.length];

          this.contentDiv.style.borderWidth = this.borderThickness || this.borderThickness === 0 ? this.borderThickness + "px" : 2 + "px";

          this.contentDiv.style.borderRadius = this.cornerRadius || this.cornerRadius === 0 ? this.cornerRadius + "px" : 5 + "px";
          this.container.style.borderRadius = this.contentDiv.style.borderRadius;

          this.contentDiv.style.fontSize = this.fontSize || this.fontSize === 0 ? this.fontSize + "px" : 14 + "px";
          this.contentDiv.style.color = this.fontColor ? this.fontColor : "#000000";
          this.contentDiv.style.fontFamily = this.fontFamily ? this.fontFamily : "Calibri, Arial, Georgia, serif;";
          this.contentDiv.style.fontWeight = this.fontWeight ? this.fontWeight : "normal";
          this.contentDiv.style.fontStyle = this.fontStyle ? this.fontStyle : _utils.isCanvasSupported ? "italic" : "normal";
        } catch (e) {}

        var toolTipLeft;

        if (entries[0].dataSeries.type === "pie" || entries[0].dataSeries.type === "doughnut" || entries[0].dataSeries.type === "funnel" || entries[0].dataSeries.type === "bar" || entries[0].dataSeries.type === "rangeBar" || entries[0].dataSeries.type === "stackedBar" || entries[0].dataSeries.type === "stackedBar100") {
          toolTipLeft = mouseX - 10 - this.container.clientWidth;
        } else {
          //toolTipLeft = (((this.chart.axisX.lineCoordinates.width / Math.abs(this.chart.axisX.viewportMaximum - this.chart.axisX.viewportMinimum)) * Math.abs(entries[0].dataPoint.x - this.chart.axisX.viewportMinimum)) + this.chart.axisX.lineCoordinates.x1 + .5) - this.container.clientWidth << 0;
          toolTipLeft = entries[0].dataSeries.axisX.conversionParameters.reference + entries[0].dataSeries.axisX.conversionParameters.pixelPerUnit * (entries[0].dataPoint.x - entries[0].dataSeries.axisX.conversionParameters.minimum) - this.container.clientWidth << 0;
          toolTipLeft -= 10;
        }

        if (toolTipLeft < 0) {
          toolTipLeft += this.container.clientWidth + 20;
        }

        if (toolTipLeft + this.container.clientWidth > this.chart._container.clientWidth) toolTipLeft = Math.max(0, this.chart._container.clientWidth - this.container.clientWidth);

        toolTipLeft += "px";

        if (entries.length === 1 && !this.shared && (entries[0].dataSeries.type === "line" || entries[0].dataSeries.type === "stepLine" || entries[0].dataSeries.type === "spline" || entries[0].dataSeries.type === "area" || entries[0].dataSeries.type === "stepArea" || entries[0].dataSeries.type === "splineArea" || entries[0].dataSeries.type === "stackedArea" || entries[0].dataSeries.type === "stackedArea100")) {
          //toolTipBottom = (entries[0].dataSeries.axisY.lineCoordinates.y2 - entries[0].dataSeries.axisY.lineCoordinates.height / Math.abs(entries[0].dataSeries.axisY.maximum - entries[0].dataSeries.axisY.viewportMinimum) * Math.abs(entries[0].dataPoint.y - entries[0].dataSeries.axisY.viewportMinimum) + .5) << 0;
          toolTipBottom = entries[0].dataSeries.axisY.conversionParameters.reference + entries[0].dataSeries.axisY.conversionParameters.pixelPerUnit * (entries[0].dataPoint.y - entries[0].dataSeries.axisY.viewportMinimum) + .5 << 0;
        } else if (entries[0].dataSeries.type === "bar" || entries[0].dataSeries.type === "rangeBar" || entries[0].dataSeries.type === "stackedBar" || entries[0].dataSeries.type === "stackedBar100") {
          //toolTipBottom = (entries[0].dataSeries.axisX.lineCoordinates.y2 - entries[0].dataSeries.axisX.lineCoordinates.height / Math.abs(entries[0].dataSeries.axisX.maximum - entries[0].dataSeries.axisX.viewportMinimum) * Math.abs(entries[0].dataPoint.x - entries[0].dataSeries.axisX.viewportMinimum) + .5) << 0;
          toolTipBottom = entries[0].dataSeries.axisX.conversionParameters.reference + entries[0].dataSeries.axisX.conversionParameters.pixelPerUnit * (entries[0].dataPoint.x - entries[0].dataSeries.axisX.viewportMinimum) + .5 << 0;
        } else {
          toolTipBottom = mouseY;
        }

        toolTipBottom = -toolTipBottom + 10;

        if (toolTipBottom + this.container.clientHeight + 5 > 0) {
          toolTipBottom -= toolTipBottom + this.container.clientHeight + 5 - 0;
        }

        toolTipBottom += "px";

        //this.container.style.right = toolTipRight;
        this.container.style.left = toolTipLeft;
        this.container.style.bottom = toolTipBottom;

        if (!this.animationEnabled || previouslyHidden) {
          this.disableAnimation();
        } else this.enableAnimation();
      } else {
        this.hide(false);
      }
    }

    //if (isDebugMode)
    //  console.log("searchX: " + x + " x: " + searchResult.dataPoint.x + "; y: " + searchResult.dataPoint.y + "; distance: " + searchResult.distance + "; steps: " + steps);
  }
};

ToolTip.prototype.highlightObjects = function (entries) {
  //if (!this.enabled)
  //	return;

  //this.chart.overlaidCanvasCtx.clearRect(0, 0, this.chart.overlaidCanvas.width, this.chart.overlaidCanvas.height);
  var overlaidCanvasCtx = this.chart.overlaidCanvasCtx;
  this.chart.resetOverlayedCanvas();

  overlaidCanvasCtx.clearRect(0, 0, this.chart.width, this.chart.height);
  overlaidCanvasCtx.save();

  var plotArea = this.chart.plotArea;
  var offset = 0;

  overlaidCanvasCtx.rect(plotArea.x1, plotArea.y1, plotArea.x2 - plotArea.x1, plotArea.y2 - plotArea.y1);
  overlaidCanvasCtx.clip();

  for (var i = 0; i < entries.length; i++) {

    var entry = entries[i];

    var eventObject = this.chart._eventManager.objectMap[entry.dataSeries.dataPointIds[entry.index]];

    if (!eventObject || !eventObject.objectType || eventObject.objectType !== "dataPoint") continue;

    var dataSeries = this.chart.data[eventObject.dataSeriesIndex];
    var dataPoint = dataSeries.dataPoints[eventObject.dataPointIndex];
    var index = eventObject.dataPointIndex;

    if (dataPoint.highlightEnabled !== false && (dataSeries.highlightEnabled === true || dataPoint.highlightEnabled === true)) {

      if (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "scatter" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea") {
        var markerProps = dataSeries.getMarkerProperties(index, eventObject.x1, eventObject.y1, this.chart.overlaidCanvasCtx);
        markerProps.size = Math.max(markerProps.size * 1.5 << 0, 10);

        markerProps.borderColor = markerProps.borderColor || "#FFFFFF";
        markerProps.borderThickness = markerProps.borderThickness || Math.ceil(markerProps.size * .1);

        //overlaidCanvasCtx.globalAlpha = .8;
        _render2.default.drawMarkers([markerProps]);
        //overlaidCanvasCtx.globalAlpha = .8;

        if (typeof eventObject.y2 !== "undefined") {

          var markerProps = dataSeries.getMarkerProperties(index, eventObject.x1, eventObject.y2, this.chart.overlaidCanvasCtx);
          markerProps.size = Math.max(markerProps.size * 1.5 << 0, 10);

          markerProps.borderColor = markerProps.borderColor || "#FFFFFF";
          markerProps.borderThickness = markerProps.borderThickness || Math.ceil(markerProps.size * .1);

          //overlaidCanvasCtx.globalAlpha = .8;
          _render2.default.drawMarkers([markerProps]);
          //overlaidCanvasCtx.globalAlpha = .8;
        }
      } else if (dataSeries.type === "bubble") {
          var markerProps = dataSeries.getMarkerProperties(index, eventObject.x1, eventObject.y1, this.chart.overlaidCanvasCtx);
          markerProps.size = eventObject.size;
          markerProps.color = "white";
          markerProps.borderColor = "white";
          //markerProps.borderThickness = 2;
          overlaidCanvasCtx.globalAlpha = .3;
          _render2.default.drawMarkers([markerProps]);
          overlaidCanvasCtx.globalAlpha = 1;
        } else if (dataSeries.type === "column" || dataSeries.type === "stackedColumn" || dataSeries.type === "stackedColumn100" || dataSeries.type === "bar" || dataSeries.type === "rangeBar" || dataSeries.type === "stackedBar" || dataSeries.type === "stackedBar100" || dataSeries.type === "rangeColumn") {
          (0, _utils.drawRect)(overlaidCanvasCtx, eventObject.x1, eventObject.y1, eventObject.x2, eventObject.y2, "white", 0, null, false, false, false, false, .3);
        } else if (dataSeries.type === "pie" || dataSeries.type === "doughnut") {
          (0, _utils.drawSegment)(overlaidCanvasCtx, eventObject.center, eventObject.radius, "white", dataSeries.type, eventObject.startAngle, eventObject.endAngle, .3, eventObject.percentInnerRadius);
        } else if (dataSeries.type === "candlestick") {

          overlaidCanvasCtx.globalAlpha = 1;
          overlaidCanvasCtx.strokeStyle = eventObject.color;
          overlaidCanvasCtx.lineWidth = eventObject.borderThickness * 2;
          offset = overlaidCanvasCtx.lineWidth % 2 === 0 ? 0 : .5;

          overlaidCanvasCtx.beginPath();
          overlaidCanvasCtx.moveTo(eventObject.x3 - offset, eventObject.y2);
          overlaidCanvasCtx.lineTo(eventObject.x3 - offset, Math.min(eventObject.y1, eventObject.y4));
          overlaidCanvasCtx.stroke();

          overlaidCanvasCtx.beginPath();
          overlaidCanvasCtx.moveTo(eventObject.x3 - offset, Math.max(eventObject.y1, eventObject.y4));
          overlaidCanvasCtx.lineTo(eventObject.x3 - offset, eventObject.y3);
          overlaidCanvasCtx.stroke();

          (0, _utils.drawRect)(overlaidCanvasCtx, eventObject.x1, Math.min(eventObject.y1, eventObject.y4), eventObject.x2, Math.max(eventObject.y1, eventObject.y4), "transparent", eventObject.borderThickness * 2, eventObject.color, false, false, false, false);
          overlaidCanvasCtx.globalAlpha = 1;
        } else if (dataSeries.type === "ohlc") {
          overlaidCanvasCtx.globalAlpha = 1;

          overlaidCanvasCtx.strokeStyle = eventObject.color;
          overlaidCanvasCtx.lineWidth = eventObject.borderThickness * 2;

          offset = overlaidCanvasCtx.lineWidth % 2 === 0 ? 0 : .5;

          overlaidCanvasCtx.beginPath();
          overlaidCanvasCtx.moveTo(eventObject.x3 - offset, eventObject.y2);
          overlaidCanvasCtx.lineTo(eventObject.x3 - offset, eventObject.y3);
          overlaidCanvasCtx.stroke();

          overlaidCanvasCtx.beginPath();
          overlaidCanvasCtx.moveTo(eventObject.x3, eventObject.y1);
          overlaidCanvasCtx.lineTo(eventObject.x1, eventObject.y1);
          overlaidCanvasCtx.stroke();

          overlaidCanvasCtx.beginPath();
          overlaidCanvasCtx.moveTo(eventObject.x3, eventObject.y4);
          overlaidCanvasCtx.lineTo(eventObject.x2, eventObject.y4);
          overlaidCanvasCtx.stroke();

          overlaidCanvasCtx.globalAlpha = 1;
        }
    }
  }

  overlaidCanvasCtx.restore();
  overlaidCanvasCtx.globalAlpha = 1;
  overlaidCanvasCtx.beginPath();

  return;
};

ToolTip.prototype.getToolTipInnerHTML = function (e) {
  var entries = e.entries;
  var toolTipInnerHtml = null;
  var dataSeries = null;
  var dataPoint = null;
  var index = 0;
  var color = null;
  var toolTipContent = "";

  var isToolTipDefinedInData = true;
  for (var i = 0; i < entries.length; i++) {
    if (entries[i].dataSeries.toolTipContent || entries[i].dataPoint.toolTipContent) {
      isToolTipDefinedInData = false;
      break;
    }
  }

  if (isToolTipDefinedInData && (this.content && typeof this.content === "function" || this.contentFormatter)) {

    var param = {
      chart: this.chart, toolTip: this._options, entries: entries
    };
    toolTipInnerHtml = this.contentFormatter ? this.contentFormatter(param) : this.content(param);
  } else {

    if (this.shared && this.chart.plotInfo.axisPlacement !== "none") {

      var toolTipInnerHtmlPrefix = "";

      for (var i = 0; i < entries.length; i++) {
        dataSeries = entries[i].dataSeries;
        dataPoint = entries[i].dataPoint;
        index = entries[i].index;

        toolTipContent = "";

        if (i === 0 && isToolTipDefinedInData && !this.content) {
          toolTipInnerHtmlPrefix += typeof this.chart.axisX.labels[dataPoint.x] !== "undefined" ? this.chart.axisX.labels[dataPoint.x] : "{x}";
          toolTipInnerHtmlPrefix += "</br>";
          toolTipInnerHtmlPrefix = this.chart.replaceKeywordsWithValue(toolTipInnerHtmlPrefix, dataPoint, dataSeries, index);
        }

        //Allows disabling of toolTip for individual dataPoints/dataSeries
        if (dataPoint.toolTipContent === null || typeof dataPoint.toolTipContent === "undefined" && dataSeries._options.toolTipContent === null) continue;

        if (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "column" || dataSeries.type === "bar" || dataSeries.type === "scatter" || dataSeries.type === "stackedColumn" || dataSeries.type === "stackedColumn100" || dataSeries.type === "stackedBar" || dataSeries.type === "stackedBar100" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100") {
          toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>{name}:</span>&nbsp;&nbsp;{y}";
        } else if (dataSeries.type === "bubble") {
          toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>{name}:</span>&nbsp;&nbsp;{y}, &nbsp;&nbsp;{z}";
        } else if (dataSeries.type === "pie" || dataSeries.type === "doughnut" || dataSeries.type === "funnel") {
          toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "&nbsp;&nbsp;{y}";
        } else if (dataSeries.type === "rangeColumn" || dataSeries.type === "rangeBar" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea") {
          toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>{name}:</span>&nbsp;&nbsp;{y[0]},&nbsp;{y[1]}";
        } else if (dataSeries.type === "candlestick" || dataSeries.type === "ohlc") {
          toolTipContent += dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>{name}:</span>" + "<br/>Open: &nbsp;&nbsp;{y[0]}" + "<br/>High: &nbsp;&nbsp;&nbsp;{y[1]}" + "<br/>Low:&nbsp;&nbsp;&nbsp;{y[2]}" + "<br/>Close: &nbsp;&nbsp;{y[3]}";
        }

        if (toolTipInnerHtml === null) toolTipInnerHtml = "";

        if (this.reversed === true) {

          toolTipInnerHtml = this.chart.replaceKeywordsWithValue(toolTipContent, dataPoint, dataSeries, index) + toolTipInnerHtml;

          if (i < entries.length - 1) toolTipInnerHtml = "</br>" + toolTipInnerHtml;
        } else {

          toolTipInnerHtml += this.chart.replaceKeywordsWithValue(toolTipContent, dataPoint, dataSeries, index);

          if (i < entries.length - 1) toolTipInnerHtml += "</br>";
        }
      }

      if (toolTipInnerHtml !== null) toolTipInnerHtml = toolTipInnerHtmlPrefix + toolTipInnerHtml;
    } else {

      dataSeries = entries[0].dataSeries;
      dataPoint = entries[0].dataPoint;
      index = entries[0].index;

      //Allows disabling of toolTip for individual dataPoints/dataSeries
      if (dataPoint.toolTipContent === null || typeof dataPoint.toolTipContent === "undefined" && dataSeries._options.toolTipContent === null) return null;

      if (dataSeries.type === "line" || dataSeries.type === "stepLine" || dataSeries.type === "spline" || dataSeries.type === "area" || dataSeries.type === "stepArea" || dataSeries.type === "splineArea" || dataSeries.type === "column" || dataSeries.type === "bar" || dataSeries.type === "scatter" || dataSeries.type === "stackedColumn" || dataSeries.type === "stackedColumn100" || dataSeries.type === "stackedBar" || dataSeries.type === "stackedBar100" || dataSeries.type === "stackedArea" || dataSeries.type === "stackedArea100") {
        toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>" + (dataPoint.label ? "{label}" : "{x}") + " :</span>&nbsp;&nbsp;{y}";
      } else if (dataSeries.type === "bubble") {
        toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>" + (dataPoint.label ? "{label}" : "{x}") + ":</span>&nbsp;&nbsp;{y}, &nbsp;&nbsp;{z}";
      } else if (dataSeries.type === "pie" || dataSeries.type === "doughnut" || dataSeries.type === "funnel") {
        toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : (dataPoint.name ? "{name}:&nbsp;&nbsp;" : dataPoint.label ? "{label}:&nbsp;&nbsp;" : "") + "{y}";
      } else if (dataSeries.type === "rangeColumn" || dataSeries.type === "rangeBar" || dataSeries.type === "rangeArea" || dataSeries.type === "rangeSplineArea") {
        toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>" + (dataPoint.label ? "{label}" : "{x}") + " :</span>&nbsp;&nbsp;{y[0]}, &nbsp;{y[1]}";
      } else if (dataSeries.type === "candlestick" || dataSeries.type === "ohlc") {
        toolTipContent = dataPoint.toolTipContent ? dataPoint.toolTipContent : dataSeries.toolTipContent ? dataSeries.toolTipContent : this.content && typeof this.content !== "function" ? this.content : "<span style='\"'color:{color};'\"'>" + (dataPoint.label ? "{label}" : "{x}") + "</span>" + "<br/>Open: &nbsp;&nbsp;{y[0]}" + "<br/>High: &nbsp;&nbsp;&nbsp;{y[1]}" + "<br/>Low: &nbsp;&nbsp;&nbsp;&nbsp;{y[2]}" + "<br/>Close: &nbsp;&nbsp;{y[3]}";
      }

      if (toolTipInnerHtml === null) toolTipInnerHtml = "";

      toolTipInnerHtml += this.chart.replaceKeywordsWithValue(toolTipContent, dataPoint, dataSeries, index);
    }
  }

  return toolTipInnerHtml;
};

ToolTip.prototype.enableAnimation = function () {
  if (this.container.style.WebkitTransition) return;

  this.container.style.WebkitTransition = "left .2s ease-out, bottom .2s ease-out";
  this.container.style.MozTransition = "left .2s ease-out, bottom .2s ease-out";
  this.container.style.MsTransition = "left .2s ease-out, bottom .2s ease-out";
  this.container.style.transition = "left .2s ease-out, bottom .2s ease-out";
};

ToolTip.prototype.disableAnimation = function () {
  if (!this.container.style.WebkitTransition) return;

  this.container.style.WebkitTransition = "";
  this.container.style.MozTransition = "";
  this.container.style.MsTransition = "";
  this.container.style.transition = "";
};

ToolTip.prototype.hide = function (resetOverlayedCanvas) {
  if (!this.enabled) return;

  resetOverlayedCanvas = typeof resetOverlayedCanvas === "undefined" ? true : resetOverlayedCanvas;

  this.container.style.display = "none";
  this.currentSeriesIndex = -1;
  this._prevX = NaN;
  this._prevY = NaN;
  //this.chart.overlaidCanvasCtx.clearRect(0, 0, this.chart.overlaidCanvas.width, this.chart.overlaidCanvas.height);
  if (resetOverlayedCanvas) this.chart.resetOverlayedCanvas();
};

exports.default = ToolTip;

},{"../helpers/animator":37,"../helpers/render":38,"../helpers/utils":39,"./canvasjs":27}],37:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

function yScaleAnimation(fractionComplete, animationInfo) {

  if (fractionComplete === 0) return;

  var ctx = animationInfo.dest;
  var sourceCanvas = animationInfo.source.canvas;
  var base = animationInfo.animationBase;

  var offsetY = base - base * fractionComplete;

  ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height, 0, offsetY, ctx.canvas.width / devicePixelBackingStoreRatio, fractionComplete * ctx.canvas.height / devicePixelBackingStoreRatio);
}

function xScaleAnimation(fractionComplete, animationInfo) {

  if (fractionComplete === 0) return;

  var ctx = animationInfo.dest;
  var sourceCanvas = animationInfo.source.canvas;
  var base = animationInfo.animationBase;

  var offsetX = base - base * fractionComplete;

  ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height, offsetX, 0, fractionComplete * ctx.canvas.width / devicePixelBackingStoreRatio, ctx.canvas.height / devicePixelBackingStoreRatio);
}

function xClipAnimation(fractionComplete, animationInfo) {

  if (fractionComplete === 0) return;

  var ctx = animationInfo.dest;
  var sourceCanvas = animationInfo.source.canvas;

  ctx.save();

  if (fractionComplete > 0) ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width * fractionComplete, sourceCanvas.height, 0, 0, sourceCanvas.width * fractionComplete / devicePixelBackingStoreRatio, sourceCanvas.height / devicePixelBackingStoreRatio);

  ctx.restore();
}

function fadeInAnimation(fractionComplete, animationInfo) {

  if (fractionComplete === 0) return;

  var ctx = animationInfo.dest;
  var sourceCanvas = animationInfo.source.canvas;

  ctx.save();

  ctx.globalAlpha = fractionComplete;

  ctx.drawImage(sourceCanvas, 0, 0, sourceCanvas.width, sourceCanvas.height, 0, 0, ctx.canvas.width / devicePixelBackingStoreRatio, ctx.canvas.height / devicePixelBackingStoreRatio);

  ctx.restore();
}

var easing = {
  linear: function linear(t, b, c, d) {
    return c * t / d + b;
  },
  easeOutQuad: function easeOutQuad(t, b, c, d) {
    return -c * (t /= d) * (t - 2) + b;
  },
  easeOutQuart: function easeOutQuart(t, b, c, d) {
    return -c * ((t = t / d - 1) * t * t * t - 1) + b;
  },
  easeInQuad: function easeInQuad(t, b, c, d) {
    return c * (t /= d) * t + b;
  },
  easeInQuart: function easeInQuart(t, b, c, d) {
    return c * (t /= d) * t * t * t + b;
  }
};

exports.default = {

  yScaleAnimation: yScaleAnimation,
  xScaleAnimation: xScaleAnimation,
  xClipAnimation: xClipAnimation,
  fadeInAnimation: fadeInAnimation,
  easing: easing

};

},{}],38:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var RenderHelper = {

  drawMarker: function drawMarker(x, y, ctx, markerType, markerSize, markerColor, markerBorderColor, markerBorderThickness) {

    if (!ctx) return;

    var alpha = 1;

    ctx.fillStyle = markerColor ? markerColor : "#000000";
    ctx.strokeStyle = markerBorderColor ? markerBorderColor : "#000000";
    ctx.lineWidth = markerBorderThickness ? markerBorderThickness : 0;

    if (markerType === "circle") {

      ctx.moveTo(x, y);
      ctx.beginPath();
      //return;

      ctx.arc(x, y, markerSize / 2, 0, Math.PI * 2, false);

      if (markerColor) ctx.fill();

      if (markerBorderThickness) {

        if (!markerBorderColor) {
          alpha = ctx.globalAlpha;
          ctx.globalAlpha = .15;
          ctx.strokeStyle = "black";
          ctx.stroke();
          ctx.globalAlpha = alpha;
        } else ctx.stroke();
      }
    } else if (markerType === "square") {

      //ctx.moveTo(x - markerSize / 2, y - markerSize / 2);
      ctx.beginPath();
      ctx.rect(x - markerSize / 2, y - markerSize / 2, markerSize, markerSize);

      if (markerColor) ctx.fill();

      if (markerBorderThickness) {

        if (!markerBorderColor) {
          alpha = ctx.globalAlpha;
          ctx.globalAlpha = .15;
          ctx.strokeStyle = "black";
          ctx.stroke();
          ctx.globalAlpha = alpha;
        } else ctx.stroke();
      }
    } else if (markerType === "triangle") {

      ctx.beginPath();
      ctx.moveTo(x - markerSize / 2, y + markerSize / 2);
      ctx.lineTo(x + markerSize / 2, y + markerSize / 2);
      ctx.lineTo(x, y - markerSize / 2);
      ctx.closePath();

      if (markerColor) ctx.fill();

      if (markerBorderThickness) {

        if (!markerBorderColor) {
          alpha = ctx.globalAlpha;
          ctx.globalAlpha = .15;
          ctx.strokeStyle = "black";
          ctx.stroke();
          ctx.globalAlpha = alpha;
        } else ctx.stroke();
      }
      ctx.beginPath();
    } else if (markerType === "cross") {

      ctx.strokeStyle = markerColor;
      markerBorderThickness = markerSize / 4;
      ctx.lineWidth = markerBorderThickness;

      ctx.beginPath();
      ctx.moveTo(x - markerSize / 2, y - markerSize / 2);
      ctx.lineTo(x + markerSize / 2, y + markerSize / 2);
      ctx.stroke();

      ctx.moveTo(x + markerSize / 2, y - markerSize / 2);
      ctx.lineTo(x - markerSize / 2, y + markerSize / 2);
      ctx.stroke();
    }
  },
  drawMarkers: function drawMarkers(markers) {
    for (var i = 0; i < markers.length; i++) {
      var marker = markers[i];

      RenderHelper.drawMarker(marker.x, marker.y, marker.ctx, marker.type, marker.size, marker.color, marker.borderColor, marker.borderThickness);
    }
  }
  //,
  //draw1pxLine: function (x1, y1, x2, y2, color, ctx) {
  //	ctx.beginPath();
  //	ctx.drawRect(x1, y1, x2 - x1, y2 - y1);
  //	ctx.stroke();
  //}
};

exports.default = RenderHelper;

},{}],39:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
	value: true
});
exports.extend = extend;
exports.inherit = inherit;
exports.addToDateTime = addToDateTime;
exports.convertToNumber = convertToNumber;
exports.pad = pad;
exports.trimString = trimString;
exports.extendCtx = extendCtx;
exports.compareNumbers = compareNumbers;
exports.compareDataPointX = compareDataPointX;
exports.intToHexColorString = intToHexColorString;
exports.RGBToInt = RGBToInt;
exports.intToRGB = intToRGB;
exports.arrayIndexOf = arrayIndexOf;
exports.addArrayIndexOf = addArrayIndexOf;
exports.getFontHeightInPixels = getFontHeightInPixels;
exports.getLineDashArray = getLineDashArray;
exports.addEvent = addEvent;
exports.dateFormat = dateFormat;
exports.numberFormat = numberFormat;
exports.getObjectId = getObjectId;
exports.getMouseCoordinates = getMouseCoordinates;
exports.getFontString = getFontString;
exports.getProperty = getProperty;
exports.setCanvasSize = setCanvasSize;
exports.createCanvas = createCanvas;
exports.exportCanvas = exportCanvas;
exports.setButtonState = setButtonState;
exports.show = show;
exports.hide = hide;
exports.getBezierPoints = getBezierPoints;
exports.convertPercentToValue = convertPercentToValue;
exports.drawRect = drawRect;
exports.drawSegment = drawSegment;
function extend(derived, base) {
	derived.prototype = inherit(base.prototype);
	derived.prototype.constructor = derived;
	derived.base = base.prototype;
}

function inherit(proto) {
	function F() {}
	F.prototype = proto;
	return new F();
}

function addToDateTime(dateTime, num, type) {

	if (type === "millisecond") dateTime.setMilliseconds(dateTime.getMilliseconds() + 1 * num);else if (type === "second") dateTime.setSeconds(dateTime.getSeconds() + 1 * num);else if (type === "minute") dateTime.setMinutes(dateTime.getMinutes() + 1 * num);else if (type === "hour") dateTime.setHours(dateTime.getHours() + 1 * num);else if (type === "day") dateTime.setDate(dateTime.getDate() + 1 * num);else if (type === "week") dateTime.setDate(dateTime.getDate() + 7 * num);else if (type === "month") dateTime.setMonth(dateTime.getMonth() + 1 * num);else if (type === "year") dateTime.setFullYear(dateTime.getFullYear() + 1 * num);

	return dateTime;
}

function convertToNumber(num, type) {
	return constants[type + "Duration"] * num;
}

function pad(value, length) {
	var isNegative = false;
	if (value < 0) {
		isNegative = true;
		value *= -1;
	}

	value = "" + value;
	length = !length ? 1 : length;

	while (value.length < length) {
		value = "0" + value;
	}return isNegative ? "-" + value : value;
}

function trimString(str) {
	if (!str) return str;

	str = str.replace(/^\s\s*/, '');
	var ws = /\s/;
	var i = str.length;
	while (ws.test(str.charAt(--i))) {}
	return str.slice(0, i + 1);
}

function extendCtx(context) {
	context.roundRect = function (x, y, width, height, radius, borderThickness, backgroundColor, borderColor) {
		///<signature>
		///<summary>Creates a rounded rectangle with given fill/stroke parameters</summary>
		///<param name="x" type="number">x value</param>
		///<param name="y" type="number">y value</param>
		///<param name="width" type="number">Border Width</param>
		///<param name="height" type="number">Border Height</param>
		///<param name="radius" type="number">Border CornerRadius</param>
		///<param name="borderThickness" type="number">Border Thickess</param>
		///<param name="backgroundColor" type="number">Background Color</param>
		///<param name="borderColor" type="number">Border Color</param>
		///</signature>

		if (backgroundColor) {
			this.fillStyle = backgroundColor;
		}

		if (borderColor) {
			this.strokeStyle = borderColor;
		}

		//if (typeof stroke == "undefined") {
		//	stroke = true;
		//}

		if (typeof radius === "undefined") {
			radius = 5;
		}

		this.lineWidth = borderThickness;

		this.beginPath();
		this.moveTo(x + radius, y);
		this.lineTo(x + width - radius, y);
		this.quadraticCurveTo(x + width, y, x + width, y + radius);
		this.lineTo(x + width, y + height - radius);
		this.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
		this.lineTo(x + radius, y + height);
		this.quadraticCurveTo(x, y + height, x, y + height - radius);
		this.lineTo(x, y + radius);
		this.quadraticCurveTo(x, y, x + radius, y);
		this.closePath();

		if (backgroundColor) {
			this.fill();
		}

		if (borderColor && borderThickness > 0) {
			this.stroke();
		}
	};
}

function compareNumbers(a, b) {
	return a - b;
}

function compareDataPointX(dataPoint1, dataPoint2) {
	return dataPoint1.x - dataPoint2.x;
}

function intToHexColorString(num) {
	var r = ((num & 0xFF0000) >> 16).toString(16);
	var g = ((num & 0x00FF00) >> 8).toString(16);
	var b = ((num & 0x0000FF) >> 0).toString(16);

	r = r.length < 2 ? "0" + r : r;
	g = g.length < 2 ? "0" + g : g;
	b = b.length < 2 ? "0" + b : b;

	return "#" + r + g + b;
}

function RGBToInt(r, g, b) {
	var num = r << 16 | g << 8 | b;

	return num;
}

function intToRGB(num) {
	var rgb = [];
	var r = (num & 0xFF0000) >> 16;
	var g = (num & 0x00FF00) >> 8;
	var b = (num & 0x0000FF) >> 0;

	//r = r.length < 2 ? "0" + r : r;
	//g = g.length < 2 ? "0" + g : g;
	//b = b.length < 2 ? "0" + b : b;

	rgb[0] = r;
	rgb[1] = g;
	rgb[2] = b;

	return rgb;
}

function arrayIndexOf(elt /*, from*/) {
	var len = this.length >>> 0;

	var from = Number(arguments[1]) || 0;
	from = from < 0 ? Math.ceil(from) : Math.floor(from);
	if (from < 0) from += len;

	for (; from < len; from++) {
		if (from in this && this[from] === elt) return from;
	}
	return -1;
};

//IE8- Fix: indexOf is not supported in IE8- for arrays
function addArrayIndexOf(obj) {
	if (!obj.indexOf) {
		obj.indexOf = arrayIndexOf;
	}

	return obj;
}

var fontHeightInPixels = {};
var textMeasureEl = null;

function getFontHeightInPixels(fontFamily, fontSize, fontWeight) {

	//return fontSize;

	fontWeight = fontWeight || "normal";

	var entry = fontFamily + "_" + fontSize + "_" + fontWeight;
	var height = fontHeightInPixels[entry];

	if (isNaN(height)) {
		try {
			var style = "position:absolute; left:0px; top:-20000px; padding:0px;margin:0px;border:none;white-space:pre;line-height:normal;" + "font-family:" + fontFamily + "; " + "font-size:" + fontSize + "px; font-weight:" + fontWeight + ";";
			//console.log(style);
			if (!textMeasureEl) {
				var body = document.body;
				textMeasureEl = document.createElement("span");
				textMeasureEl.innerHTML = "";
				var textNode = document.createTextNode("Mpgyi");
				textMeasureEl.appendChild(textNode);
				body.appendChild(textMeasureEl);
			}

			textMeasureEl.style.display = "";
			textMeasureEl.setAttribute("style", style);

			height = Math.round(textMeasureEl.offsetHeight);
			textMeasureEl.style.display = "none";
			//body.removeChild(tempDiv);

			//if (window.console)
			//	window.console.log(fontSize + ": " + height);
		} catch (e) {
			height = Math.ceil(fontSize * 1.1);
		}

		height = Math.max(height, fontSize);

		fontHeightInPixels[entry] = height;
	}

	return height;
}

function getLineDashArray(lineDashType, lineThickness) {
	lineDashType = lineDashType || "solid";

	var lineDashArray = [];

	var lineDashTypeMap = {
		"solid": [],
		"shortDash": [3, 1],
		"shortDot": [1, 1],
		"shortDashDot": [3, 1, 1, 1],
		"shortDashDotDot": [3, 1, 1, 1, 1, 1],
		"dot": [1, 2],
		"dash": [4, 2],
		"dashDot": [4, 2, 1, 2],
		"longDash": [8, 2],
		"longDashDot": [8, 2, 1, 2],
		"longDashDotDot": [8, 2, 1, 2, 1, 2]
	};

	lineDashArray = lineDashTypeMap[lineDashType];

	if (lineDashArray) {

		for (var i = 0; i < lineDashArray.length; i++) {
			lineDashArray[i] *= lineThickness;
		}
	} else lineDashArray = [];

	return lineDashArray;
}

//userCapture is optional. Defaults to false
function addEvent(obj, eventType, fn, useCapture) {
	if (obj.addEventListener) {
		obj.addEventListener(eventType, fn, useCapture || false);
	} else if (obj.attachEvent) {
		obj.attachEvent("on" + eventType, function (e) {
			e = e || window.event;
			e.preventDefault = e.preventDefault || function () {
				e.returnValue = false;
			};
			e.stopPropagation = e.stopPropagation || function () {
				e.cancelBubble = true;
			};
			fn.call(obj, e);
		});
	} else return false;
}

//#region formatting functions/methods
function dateFormat() {

	var reg = /D{1,4}|M{1,4}|Y{1,4}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|f{1,3}|t{1,2}|T{1,2}|K|z{1,3}|"[^"]*"|'[^']*'/g;

	var defDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
	var defShortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

	var defMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
	var defShortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

	var timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g;
	var timezoneClip = /[^-+\dA-Z]/g;

	return function (dt, formatString, cultureInfo) {

		var days = cultureInfo ? cultureInfo.days : defDays;
		var months = cultureInfo ? cultureInfo.months : defMonths;

		var shortDays = cultureInfo ? cultureInfo.shortDays : defShortDays;
		var shortMonths = cultureInfo ? cultureInfo.shortMonths : defShortMonths;

		var result = "";
		var utc = false;

		dt = dt && dt.getTime ? dt : dt ? new Date(dt) : new Date();
		if (isNaN(dt)) throw SyntaxError("invalid date");

		if (formatString.slice(0, 4) === "UTC:") {
			formatString = formatString.slice(4);
			utc = true;
		}

		var pre = utc ? "getUTC" : "get";
		var date = dt[pre + "Date"]();
		var day = dt[pre + "Day"]();
		var month = dt[pre + "Month"]();
		var year = dt[pre + "FullYear"]();
		var hours = dt[pre + "Hours"]();
		var minutes = dt[pre + "Minutes"]();
		var seconds = dt[pre + "Seconds"]();
		var milliseconds = dt[pre + "Milliseconds"]();
		var offset = utc ? 0 : dt.getTimezoneOffset();

		result = formatString.replace(reg, function (key) {

			switch (key) {

				case "D":
					return date;
				case "DD":
					return pad(date, 2);
				case "DDD":
					return shortDays[day];
				case "DDDD":
					return days[day];

				case "M":
					return month + 1;
				case "MM":
					return pad(month + 1, 2);
				case "MMM":
					return shortMonths[month];
				case "MMMM":
					return months[month];

				case "Y":
					return parseInt(String(year).slice(-2));
				case "YY":
					return pad(String(year).slice(-2), 2);
				case "YYY":
					return pad(String(year).slice(-3), 3);
				case "YYYY":
					return pad(year, 4);

				case "h":
					return hours % 12 || 12;
				case "hh":
					return pad(hours % 12 || 12, 2);

				case "H":
					return hours;
				case "HH":
					return pad(hours, 2);

				case "m":
					return minutes;
				case "mm":
					return pad(minutes, 2);

				case "s":
					return seconds;
				case "ss":
					return pad(seconds, 2);

				case "f":
					return String(milliseconds).slice(0, 1);
				case "ff":
					return pad(String(milliseconds).slice(0, 2), 2);
				case "fff":
					return pad(String(milliseconds).slice(0, 3), 3);

				case "t":
					return hours < 12 ? "a" : "p";
				case "tt":
					return hours < 12 ? "am" : "pm";
				case "T":
					return hours < 12 ? "A" : "P";
				case "TT":
					return hours < 12 ? "AM" : "PM";

				case "K":
					return utc ? "UTC" : (String(dt).match(timezone) || [""]).pop().replace(timezoneClip, ""); // Time Zone;
				case "z":
					return (offset > 0 ? "-" : "+") + Math.floor(Math.abs(offset) / 60); // Hour Offset from UTC without padding
				case "zz":
					return (offset > 0 ? "-" : "+") + pad(Math.floor(Math.abs(offset) / 60), 2); // Hour Offset from UTC with padding
				case "zzz":
					return (offset > 0 ? "-" : "+") + pad(Math.floor(Math.abs(offset) / 60), 2) + pad(Math.abs(offset) % 60, 2); // Hour and Minute Offset from UTC with padding

				default:
					return key.slice(1, key.length - 1);

			}
		});

		return result;
	};
};

function numberFormat(v, fs, cultureInfo) {
	if (v === null) return "";

	v = Number(v);
	var isNegative = v < 0 ? true : false;
	if (isNegative) v *= -1;

	var decimalSeparator = cultureInfo ? cultureInfo.decimalSeparator : ".";
	var digitGroupSeparator = cultureInfo ? cultureInfo.digitGroupSeparator : ",";

	var vString = "";
	fs = String(fs);
	var multiplier = 1;
	var temp;
	var result = "";

	var matches = "";
	var decimalPosition = -1;
	var fsBeforeDecimal = [];
	var fsAfterDecimal = [];
	var noPhBeforeDecimal = 0; // Number of Placeholders before Decimal
	var noPhAfterDecimal = 0; // Number of Placeholders after Decimal
	var noComma = 0;
	var isScientificNotation = false;
	var exponent = 0;

	matches = fs.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|‰|./g);
	//window.console.log(matches + " = " + matches.length);
	var match = null;

	for (var i = 0; matches && i < matches.length; i++) {
		match = matches[i];

		if (match === "." && decimalPosition < 0) {
			decimalPosition = i;
			continue;
		} else if (match === "%") {
			multiplier *= 100;
		} else if (match === "‰") {
			multiplier *= 1000;
			continue;
		} else if (match[0] === "," && match[match.length - 1] === ".") {
			multiplier /= Math.pow(1000, match.length - 1);
			decimalPosition = i + match.length - 1;
			continue;
		} else if ((match[0] === "E" || match[0] === "e") && match[match.length - 1] === "0") {
			isScientificNotation = true;
		}

		if (decimalPosition < 0) {
			fsBeforeDecimal.push(match);
			if (match === "#" || match === "0") noPhBeforeDecimal++;else if (match === ",") noComma++;
		} else {
			fsAfterDecimal.push(match);
			if (match === "#" || match === "0") noPhAfterDecimal++;
		}
	}

	if (isScientificNotation) {
		var integer = Math.floor(v);
		exponent = (integer === 0 ? "" : String(integer)).length - noPhBeforeDecimal;
		multiplier /= Math.pow(10, exponent);
	}

	v *= multiplier;

	if (decimalPosition < 0) decimalPosition = i;

	vString = v.toFixed(noPhAfterDecimal);
	var split = vString.split(".");
	//window.console.log(split);
	var vStringBeforeDecimal = (split[0] + "").split("");
	var vStringAfterDecimal = (split[1] + "").split("");

	if (vStringBeforeDecimal && vStringBeforeDecimal[0] === "0") vStringBeforeDecimal.shift();

	//window.console.log(fsBeforeDecimal + "<---------->" + fsAfterDecimal + " &        " + vStringBeforeDecimal + "<---------->" + vStringAfterDecimal);

	var noPhProcessed = 0;
	var noDigitsAdded = 0;
	var noCommaAdded = 0;
	var commaDistance = 0;
	var distanceFromLastComma = 0;

	while (fsBeforeDecimal.length > 0) {
		match = fsBeforeDecimal.pop();

		if (match === "#" || match === "0") {
			noPhProcessed++;

			if (noPhProcessed === noPhBeforeDecimal) {
				var digits = vStringBeforeDecimal;
				vStringBeforeDecimal = [];

				if (match === "0") {
					//var totalDigits = result.match(/[0-9]/g).length;
					var toPad = noPhBeforeDecimal - noDigitsAdded - (digits ? digits.length : 0);

					while (toPad > 0) {
						digits.unshift("0");
						toPad--;
					}
				}

				while (digits.length > 0) {
					result = digits.pop() + result;
					distanceFromLastComma++;

					if (distanceFromLastComma % commaDistance === 0 && noCommaAdded === noComma && digits.length > 0) result = digitGroupSeparator + result;
				}

				if (isNegative) result = "-" + result;
			} else {
				if (vStringBeforeDecimal.length > 0) {
					result = vStringBeforeDecimal.pop() + result;
					noDigitsAdded++;
					distanceFromLastComma++;
				} else if (match === "0") {
					result = "0" + result;
					noDigitsAdded++;
					distanceFromLastComma++;
				}

				if (distanceFromLastComma % commaDistance === 0 && noCommaAdded === noComma && vStringBeforeDecimal.length > 0) result = digitGroupSeparator + result;
			}
		} else if ((match[0] === "E" || match[0] === "e") && match[match.length - 1] === "0" && /[eE][+-]*[0]+/.test(match)) {
			if (exponent < 0) match = match.replace("+", "").replace("-", "");else match = match.replace("-", "");

			result += match.replace(/[0]+/, function ($0) {
				return pad(exponent, $0.length);
			});
		} else {
			if (match === ",") {
				noCommaAdded++;
				commaDistance = distanceFromLastComma;
				distanceFromLastComma = 0;

				if (vStringBeforeDecimal.length > 0) result = digitGroupSeparator + result;
			} else if (match.length > 1 && (match[0] === "\"" && match[match.length - 1] === "\"" || match[0] === "'" && match[match.length - 1] === "'")) {
				result = match.slice(1, match.length - 1) + result;
			} else result = match + result;
		}
	}

	var charCount = 0;
	var resultAfterDecimal = "";
	var addDecimalSeparator = false;

	while (fsAfterDecimal.length > 0) {
		match = fsAfterDecimal.shift();

		if (match === "#" || match === "0") {
			if (vStringAfterDecimal.length > 0 && Number(vStringAfterDecimal.join("")) !== 0) {
				resultAfterDecimal += vStringAfterDecimal.shift();
				addDecimalSeparator = true;
			} else if (match === "0") {
				resultAfterDecimal += "0";
				addDecimalSeparator = true;
			}
		} else if (match.length > 1 && (match[0] === "\"" && match[match.length - 1] === "\"" || match[0] === "'" && match[match.length - 1] === "'")) {
			resultAfterDecimal += match.slice(1, match.length - 1);
			//addDecimalSeparator = true;
		} else if ((match[0] === "E" || match[0] === "e") && match[match.length - 1] === "0" && /[eE][+-]*[0]+/.test(match)) {
				if (exponent < 0) match = match.replace("+", "").replace("-", "");else match = match.replace("-", "");
				resultAfterDecimal += match.replace(/[0]+/, function ($0) {
					return pad(exponent, $0.length);
				});
			} else {
				resultAfterDecimal += match;
				//addDecimalSeparator = true;
			}
	}

	result += (addDecimalSeparator ? decimalSeparator : "") + resultAfterDecimal;
	//window.console.log(result);
	return result;
};

//#endregion formatting functions/methods

function getObjectId(x, y, ctx) {
	x *= devicePixelBackingStoreRatio;
	y *= devicePixelBackingStoreRatio;
	var pixels = ctx.getImageData(x, y, 2, 2).data;
	var isObject = true;

	for (var i = 0; i < 4; i++) {

		if (pixels[i] !== pixels[i + 4] | pixels[i] !== pixels[i + 8] | pixels[i] !== pixels[i + 12]) {
			isObject = false;
			break;
		}
	}

	if (isObject) {
		return RGBToInt(pixels[0], pixels[1], pixels[2]);
	} else {
		return 0;
	}

	//window.console.log(pixels);
}

//extracts mouse coordinates from the event parameters
function getMouseCoordinates(ev) {
	var x = 0;
	var y = 0;

	ev = ev || window.event;

	if (ev.offsetX || ev.offsetX === 0) {
		x = ev.offsetX;
		y = ev.offsetY;
	} else if (ev.layerX || ev.layerX == 0) {
		// Firefox
		x = ev.layerX;
		y = ev.layerY;
	} else {
		x = ev.pageX - ev.target.offsetLeft;
		y = ev.pageY - ev.target.offsetTop;
	}

	return { x: x, y: y };
};

function getFontString(prefix, object, fallbackObject) {
	var fontString = "";

	var fontStyleString = prefix ? prefix + "FontStyle" : "fontStyle";
	var fontWeightString = prefix ? prefix + "FontWeight" : "fontWeight";
	var fontSizeString = prefix ? prefix + "FontSize" : "fontSize";
	var fontFamilyString = prefix ? prefix + "FontFamily" : "fontFamily";

	fontString += object[fontStyleString] ? object[fontStyleString] + " " : fallbackObject && fallbackObject[fontStyleString] ? fallbackObject[fontStyleString] + " " : "";
	fontString += object[fontWeightString] ? object[fontWeightString] + " " : fallbackObject && fallbackObject[fontWeightString] ? fallbackObject[fontWeightString] + " " : "";
	fontString += object[fontSizeString] ? object[fontSizeString] + "px " : fallbackObject && fallbackObject[fontSizeString] ? fallbackObject[fontSizeString] + "px " : "";

	var fontFamily = object[fontFamilyString] ? object[fontFamilyString] + "" : fallbackObject && fallbackObject[fontFamilyString] ? fallbackObject[fontFamilyString] + "" : "";

	if (!isCanvasSupported && fontFamily) {
		var firstFontFamily = fontFamily.split(",")[0];

		if (firstFontFamily[0] !== "'" && firstFontFamily[0] !== "\"") firstFontFamily = "'" + firstFontFamily + "'";

		fontString += firstFontFamily;
	} else fontString += fontFamily;

	return fontString;
}

function getProperty(propertyName, object, fallbackObject) {

	var value = propertyName in object ? object[propertyName] : fallbackObject[propertyName];

	return value;
}

var optimizeForHiDPI = true;
//optimizeForHiDPI = false;

var devicePixelRatio = window.devicePixelRatio || 1;
var backingStoreRatio = 1;
var devicePixelBackingStoreRatio = optimizeForHiDPI ? devicePixelRatio / backingStoreRatio : 1;

function setCanvasSize(canvas, width, height) {

	if (isCanvasSupported && !!optimizeForHiDPI) {
		var ctx = canvas.getContext("2d");
		backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;

		devicePixelBackingStoreRatio = devicePixelRatio / backingStoreRatio;

		canvas.width = width * devicePixelBackingStoreRatio;
		canvas.height = height * devicePixelBackingStoreRatio;

		if (devicePixelRatio !== backingStoreRatio) {

			canvas.style.width = width + 'px';
			canvas.style.height = height + 'px';

			ctx.scale(devicePixelBackingStoreRatio, devicePixelBackingStoreRatio);
		}

		//window.alert(backingStoreRatio);
		//window.alert(devicePixelRatio);
	} else {
			canvas.width = width;
			canvas.height = height;
		}
}

function createCanvas(width, height) {
	var canvas = document.createElement("canvas");
	canvas.setAttribute("class", "canvasjs-chart-canvas");

	setCanvasSize(canvas, width, height);

	if (!isCanvasSupported && typeof G_vmlCanvasManager !== "undefined") {
		G_vmlCanvasManager.initElement(canvas);
	}

	return canvas;
}

function exportCanvas(canvas, format, fileName) {
	if (!canvas || !format || !fileName) return;

	var fullFileName = fileName + "." + (format === "jpeg" ? "jpg" : format);
	var mimeType = "image/" + format;
	var img = canvas.toDataURL(mimeType);
	var saved = false;

	var downloadLink = document.createElement("a");
	downloadLink.download = fullFileName;
	downloadLink.href = img;
	downloadLink.target = "_blank";
	var e;

	if (typeof Blob !== "undefined" && !!new Blob()) {

		//alert("blob");
		var imgData = img.replace(/^data:[a-z/]*;base64,/, '');

		var byteString = atob(imgData);
		var buffer = new ArrayBuffer(byteString.length);
		var intArray = new Uint8Array(buffer);
		for (var i = 0; i < byteString.length; i++) {
			intArray[i] = byteString.charCodeAt(i);
		}

		var blob = new Blob([buffer], { type: "image/" + format });

		// Save the blob
		try {
			window.navigator.msSaveBlob(blob, fullFileName);
			saved = true;
		} catch (e) {
			downloadLink.dataset.downloadurl = [mimeType, downloadLink.download, downloadLink.href].join(':');
			downloadLink.href = window.URL.createObjectURL(blob);
		}
	}

	if (!saved) {

		try {

			event = document.createEvent("MouseEvents");

			event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

			if (downloadLink.dispatchEvent) {
				//alert("dispatchEvent");
				downloadLink.dispatchEvent(event);
			} else if (downloadLink.fireEvent) {
				//alert("fireEvent");
				downloadLink.fireEvent("onclick");
			}
		} catch (e) {
			var win = window.open();
			//alert("<IE10");
			//window.console.log("IE");
			win.document.write("<img src='" + img + "'></img><div>Please right click on the image and save it to your device</div>");
			win.document.close();
		}
	}
}

var base64Images = {
	reset: {
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAKRSURBVEiJrdY/iF1FFMfxzwnZrGISUSR/JLGIhoh/QiRNBLWxMLIWEkwbgiAoFgoW2mhlY6dgpY2IlRBRxBSKhSAKIklWJRYuMZKAhiyopAiaTY7FvRtmZ+/ed9/zHRjezLw5v/O9d86cuZGZpmURAfdn5o9DfdZNLXpjz+LziPgyIl6MiG0jPTJzZBuyDrP4BVm0P/AKbljTb4ToY/gGewYA7KyCl+1b3DUYANvwbiHw0gCAGRzBOzjTAXEOu0cC4Ch+r5x/HrpdrcZmvIDFSucMtnYCYC++6HmNDw8FKDT34ETrf639/azOr5vwRk/g5fbeuABtgC04XWk9VQLciMP4EH/3AFzErRNC7MXlQmsesSoHsGPE23hmEoBW+61K66HMXFmIMvN8myilXS36R01ub+KfYvw43ZXwYDX+AHP4BAci4pFJomfmr/ihmNofESsBImJGk7mlncrM45n5JPbhz0kAWpsv+juxaX21YIPmVJS2uNzJMS6ZNexC0d+I7fUWXLFyz2kSZlpWPvASlmqAf/FXNXf3FAF2F/1LuFifAlionB6dRuSI2IwHi6lzmXmp6xR8XY0fiIh7psAwh+3FuDkRHQVjl+a8lkXjo0kLUKH7XaV5oO86PmZ1FTzyP4K/XGl9v/zwfbW7BriiuETGCP5ch9bc9f97HF/vcFzCa5gdEPgWq+t/4v0V63oE1uF4h0DiFJ7HnSWMppDdh1dxtsPvJ2wcBNAKbsJXa0Ck5opdaBPsRNu/usba09i1KsaAVzmLt3sghrRjuK1Tf4xkegInxwy8gKf7dKMVH2QRsV5zXR/Cftyu+aKaKbbkQrsdH+PTzLzcqzkOQAVzM+7FHdiqqe2/YT4zF/t8S/sPmawyvC974vcAAAAASUVORK5CYII="
	},
	pan: {
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAJVSURBVFiFvZe7a1RBGMV/x2hWI4JpfKCIiSBKOoOCkID/wP4BFqIIFkE02ChIiC8QDKlSiI3YqRBsBVGwUNAUdiIEUgjiAzQIIsuKJsfizsXr5t7d+8jmwLDfzHz3nLOzc7+ZxTZlGyDgZiWOCuJ9wH2gCUyuqQFgF/AGcKJNrYkBYBj40CIet+muGQi/96kM4WS7C/Tm5VUg7whJg8BkEGkCR4BDYfodsADUgP6wErO5iCtswsuJb32hdbXy8qzL5TIdmzJinHdZoZIBZcSFkGlAKs1Z3YCketZcBtouuaQNkrblMiBpBrhme7mAgU4wMCvpcFsDkq4C54DFVRTH9h+i6vlE0r5UA5ImgCuh28jB28iIs7BIVCOeStoZD64P4uPAjUTygKSx2FsK2TIwkugfk9Qkfd/E+yMWHQCeSRqx/R3gOp3LazfaS2C4B5gHDgD7U9x3E3uAH7KNpC3AHHAwTL4FHgM9GQ8vAaPA0dB/Abxqk2/gBLA9MXba9r1k/d4LfA3JtwueBeM58ucS+edXnAW23wP10N3advEi9CXizTnyN4bPS7Zn4sH/dq3t18AY4e1YLYSy3g/csj2VnFshZPuOpOeSKHCodUINuGj7YetE6je1PV9QoNPJ9StNHKodx7nRbiWrGHBGXAi5DUiqtQwtpcWK0Jubt8CltA5MEV1IfwO7+VffPwGfia5m34CT4bXujIIX0Qna1/cGMNqV/wUJE2czxD8CQ4X5Sl7Jz7SILwCDpbjKPBRMHAd+EtX4HWV5Spdc2w8kDQGPbH8py/MXMygM69/FKz4AAAAASUVORK5CYII="
	},
	zoom: {
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAMqSURBVFiFvdfbj91TFMDxz57U6GUEMS1aYzyMtCSSDhWjCZMInpAI3khE/QHtgzdRkXgSCS8SES9epKLi0oRKNETjRahREq2KS1stdRujtDPtbA97n5zdn9+5zJxTK9k5v3POXmt991p7r71+IcaoGwkhTOIebMRqzOBTvIG3Y4zTXRmqSoyx5cAKbMJOHMFJnMZ8/jyFaXyMR7G6nb1aH22cP4BvcBxziG3GKfyTIR9D6BYg1KUghPBCDveFlb/24Av8iuUYw41YVsz5G7uxKcZ4aMEpwGt5NY3V/YbHsQ6rcAHOw/kYxigewr5CZw4fYGxBKcCLOFEYehXrMdRhr5yLETxVScsOLOkKAPfn1TYMPIvLFrShUlS2FDZm8XRHACzFAWl3R2xbqPMCYhmeLCAOYEMngAczbcTvuHYxzguIy/FesR9e6gSwU/OoPYHBHgHgviIKX2Flq7k34KhmcVnbi/PC8JX4MgMcxb118wZwdz5aISscqx7VRcox7MrPQ7i+btIAJrAkf9+bI9EPmZY2IAxiTSuAldLq4Y9+AcSUh78KP0tbAcwU35cXMD1JCIFUoGiehlqAz6TNB1f1C0DK+0h+nsNPrQC2a4bqGmlD9kOGcWt+Po6pVgDvSxfJaSkFd4UQBvoAsBYbCoB3a2flM7slA0R8iyt6rAFDeDPbm8eOTpVwGD9qVq7nLbIaZnmksPU1JtsCZMXNmpdRxFasWITzh6Xj3LCzra1OxcD2QjHiGVzdpfORnMqZio2PcF23ABdJF1Np4BPptlyPi6WzPYBzpJZtHe7A6xW9cnyP8TqA//SEIYRL8Bxul7rihvwgtVn78WcGGZXa9HGd5TDujDHuOePXNiHdKjWgZX/YbsxLx/ktqbjVzTlcjUSnvI5JrdlUVp6WesZZ6R1hRrpq9+EVTGS9jTjYAuKIouGpbcurEkIYxC051KNSamazsc+xK8b4S0VnEi/j0hqTP+M27O258egQwZuzs7pI7Mf4WQXIEDc5s9sux+5+1Py2EmP8UOq6GvWhIScxfdYjUERiAt9Jd84J6a16zf8JEKT3yCm8g1UxRv8CC4pyRhzR1uUAAAAASUVORK5CYII="
	},
	menu: {
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAgCAYAAAAbifjMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDcvMTUvMTTPsvU0AAAAP0lEQVRIie2SMQoAIBDDUvH/X667g8sJJ9KOhYYOkW0qGaU1MPdC0vGSbV19EACo3YMPAFH5BUBUjsqfAPpVXtNgGDfxEDCtAAAAAElFTkSuQmCC"
	}
};

function setButtonState(chart, button, state) {
	if (button.getAttribute("state") !== state) {

		button.setAttribute("state", state);
		button.setAttribute("type", 'button');
		button.style.position = "relative";
		button.style.margin = "0px 0px 0px 0px";
		button.style.padding = "3px 4px 0px 4px";
		button.style.cssFloat = "left";
		button.setAttribute("title", chart._cultureInfo[state + "Text"]);
		button.innerHTML = "<img style='height:16px;' src='" + base64Images[state].image + "' alt='" + chart._cultureInfo[state + "Text"] + "' />";
	}
}

function show() {

	var element = null;

	for (var i = 0; i < arguments.length; i++) {
		element = arguments[i];
		if (element.style) element.style.display = "inline";
	}
}

function hide() {

	var element = null;

	for (var i = 0; i < arguments.length; i++) {
		element = arguments[i];
		if (element && element.style) element.style.display = "none";
	}
}

var isCanvasSupported = exports.isCanvasSupported = !!document.createElement("canvas").getContext;

function getBezierPoints(points, tension) {

	var bezierPoints = [];

	for (var i = 0; i < points.length; i++) {

		if (i == 0) {
			bezierPoints.push(points[0]);
			continue;
		}

		var i1, i2, pointIndex;

		pointIndex = i - 1;
		i1 = pointIndex === 0 ? 0 : pointIndex - 1;
		i2 = pointIndex === points.length - 1 ? pointIndex : pointIndex + 1;

		var drv1 = {
			x: (points[i2].x - points[i1].x) / tension, y: (points[i2].y - points[i1].y) / tension
		};
		var cp1 = {
			x: points[pointIndex].x + drv1.x / 3, y: points[pointIndex].y + drv1.y / 3
		};
		bezierPoints[bezierPoints.length] = cp1;

		pointIndex = i;
		i1 = pointIndex === 0 ? 0 : pointIndex - 1;
		i2 = pointIndex === points.length - 1 ? pointIndex : pointIndex + 1;

		var drv2 = {
			x: (points[i2].x - points[i1].x) / tension, y: (points[i2].y - points[i1].y) / tension
		};
		var cp2 = {
			x: points[pointIndex].x - drv2.x / 3, y: points[pointIndex].y - drv2.y / 3
		};
		bezierPoints[bezierPoints.length] = cp2;

		bezierPoints[bezierPoints.length] = points[i];
	}

	return bezierPoints;
}

function convertPercentToValue(input, referenceValue) {
	//input can be a number or string
	if (input === null || typeof input === "undefined") return referenceValue;

	var result = parseFloat(input.toString()) * (input.toString().indexOf("%") >= 0 ? referenceValue / 100 : 1);

	// limit to plot area
	if (!isNaN(result) && result <= referenceValue && result >= 0) return result;

	return referenceValue;
}

function drawRect(ctx, x1, y1, x2, y2, color, borderThickness, borderColor, top, bottom, left, right, fillOpacity) {
	if (typeof fillOpacity === "undefined") fillOpacity = 1;

	borderThickness = borderThickness || 0;
	borderColor = borderColor || "black";
	//alert("top"+ top + "bottom" + bottom + " lt" + left+ "rt" + right )
	var a1 = x1,
	    a2 = x2,
	    b1 = y1,
	    b2 = y2,
	    edgeY,
	    edgeX;
	if (x2 - x1 > 15 && y2 - y1 > 15) var bevelDepth = 8;else var bevelDepth = 0.35 * Math.min(x2 - x1, y2 - y1);
	//alert(a1 + "" + a2);
	var color2 = "rgba(255, 255, 255, .4)";
	var color3 = "rgba(255, 255, 255, 0.1)";
	//color1 = "rgba(" + r + "," + g + ", " + b + ",1)";
	var color1 = color;

	ctx.beginPath();
	ctx.moveTo(x1, y1);
	ctx.save();
	ctx.fillStyle = color1;

	ctx.globalAlpha = fillOpacity;
	ctx.fillRect(x1, y1, x2 - x1, y2 - y1);
	ctx.globalAlpha = 1;

	if (borderThickness > 0) {
		var offset = borderThickness % 2 === 0 ? 0 : .5;
		ctx.beginPath();
		ctx.lineWidth = borderThickness;
		ctx.strokeStyle = borderColor;
		ctx.moveTo(x1, y1);
		ctx.rect(x1 - offset, y1 - offset, x2 - x1 + 2 * offset, y2 - y1 + 2 * offset);
		ctx.stroke();
	}

	ctx.restore();
	//   ctx.beginPath();
	if (top === true) {
		// alert(x1 + "" + x2 + " " + bevelDepth);
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x1, y1);
		ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x2, y1);
		ctx.closePath();
		var grd = ctx.createLinearGradient((x2 + x1) / 2, b1 + bevelDepth, (x2 + x1) / 2, b1);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color2);
		ctx.fillStyle = grd;
		ctx.fill();
		//              ctx.stroke();
		ctx.restore();
	}

	if (bottom === true) {
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x1, y2);
		ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x2, y2);
		ctx.closePath();
		var grd = ctx.createLinearGradient((x2 + x1) / 2, b2 - bevelDepth, (x2 + x1) / 2, b2);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color2);
		ctx.fillStyle = grd;
		//       ctx.stroke();
		ctx.fill();
		ctx.restore();
	}

	if (left === true) {
		//   alert(x1)
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x1, y1);
		ctx.lineTo(x1 + bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x1 + bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x1, y2);
		ctx.closePath();
		var grd = ctx.createLinearGradient(a1 + bevelDepth, (y2 + y1) / 2, a1, (y2 + y1) / 2);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color3);
		ctx.fillStyle = grd;
		ctx.fill();
		//     ctx.stroke();
		ctx.restore();
	}

	if (right === true) {
		ctx.save();
		ctx.beginPath();
		ctx.moveTo(x2, y1);
		ctx.lineTo(x2 - bevelDepth, y1 + bevelDepth);
		ctx.lineTo(x2 - bevelDepth, y2 - bevelDepth);
		ctx.lineTo(x2, y2);
		var grd = ctx.createLinearGradient(a2 - bevelDepth, (y2 + y1) / 2, a2, (y2 + y1) / 2);
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color3);
		ctx.fillStyle = grd;
		grd.addColorStop(0, color1);
		grd.addColorStop(1, color3);
		ctx.fillStyle = grd;
		ctx.fill();
		ctx.closePath();
		//          ctx.stroke();
		ctx.restore();
	}
	//
}

function drawSegment(ctx, center, radius, color, type, theta1, theta2, fillOpacity, percentInnerRadius) {

	if (typeof fillOpacity === "undefined") fillOpacity = 1;

	//IE8- FIX: In IE8- segment doesn't get draw if theta2 is equal to theta1 + 2*PI.
	if (!isCanvasSupported) {
		var theta2Mod = Number((theta2 % (2 * Math.PI)).toFixed(8));
		var theta1Mod = Number((theta1 % (2 * Math.PI)).toFixed(8));
		if (theta1Mod === theta2Mod) theta2 -= .0001;
	}

	ctx.save();
	ctx.globalAlpha = fillOpacity;

	if (type === "pie") {
		ctx.beginPath();
		ctx.moveTo(center.x, center.y);
		ctx.arc(center.x, center.y, radius, theta1, theta2, false);
		ctx.fillStyle = color;
		ctx.strokeStyle = "white";
		ctx.lineWidth = 2;
		//    ctx.shadowOffsetX = 2;
		//    ctx.shadowOffsetY = 1;
		//     ctx.shadowBlur = 2;
		//    ctx.shadowColor = '#BFBFBF';
		ctx.closePath();
		//ctx.stroke();
		ctx.fill();
	} else if (type === "doughnut") {
		ctx.beginPath();
		ctx.arc(center.x, center.y, radius, theta1, theta2, false);
		ctx.arc(center.x, center.y, percentInnerRadius * radius, theta2, theta1, true);
		ctx.closePath();
		ctx.fillStyle = color;
		ctx.strokeStyle = "white";
		ctx.lineWidth = 2;
		// shadow properties
		//     ctx.shadowOffsetX = 1;
		//    ctx.shadowOffsetY = 1;
		//     ctx.shadowBlur = 1;
		//    ctx.shadowColor = '#BFBFBF';  //grey shadow
		//ctx.stroke();
		ctx.fill();
	}

	ctx.globalAlpha = 1;

	ctx.restore();
};

},{}],40:[function(require,module,exports){
'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.formatDate = exports.formatNumber = exports.addCultureInfo = exports.addColorSet = undefined;
exports.Chart = Chart;

var _charts = require('../core/charts');

var _charts2 = _interopRequireDefault(_charts);

var _culture_info = require('../core/culture_info');

var _culture_info2 = _interopRequireDefault(_culture_info);

var _themes = require('../constants/themes');

var _culture = require('../constants/culture');

var _utils = require('../helpers/utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function Chart(containerId, options) {
    var _this = this;

    var _chart = new _charts2.default(containerId, options, this);

    this.render = function () {
        return _chart.render(_this.options);
    };

    this.options = _chart._options;
} /**
  * @preserve CanvasJS HTML5 & JavaScript Charts - v1.8.0 Beta 2 - http://canvasjs.com/
  * CanvasJS Charts follows Dual Licensing Model as mentioned below.
  *
  * ---------------------Free for Non-Commercial Use--------------------
  *
  * For non-commercial purposes you can use the software for free under Creative Commons Attribution-NonCommercial 3.0 License. Refer to the following link for further details on the same.
  * http://creativecommons.org/licenses/by-nc/3.0/deed.en_US
  *
  * ---------------------Commercial License--------------------
  * Commercial use of CanvasJS requires you to purchase a license. Without a commercial license you can use it for evaluation purposes only. Please refer to the following link for further details.
  * http://canvasjs.com/
  *
  **/
;

var addColorSet = exports.addColorSet = function addColorSet(name, colorSet) {

    _themes.colorSets[name] = colorSet;
};

var addCultureInfo = exports.addCultureInfo = function addCultureInfo(name, cultureInfo) {

    _culture.cultures[name] = cultureInfo;
};

var formatNumber = exports.formatNumber = function formatNumber(number, formatString, culture) {

    culture = culture || "en";
    formatString = formatString || "#,##0.##";

    if (!_culture.cultures[culture]) throw "Unknown Culture Name";else (0, _utils.numberFormat)(number, formatString, new _culture_info2.default(culture));
};

var formatDate = exports.formatDate = function formatDate(date, formatString, culture) {

    culture = culture || "en";
    formatString = formatString || "DD MMM YYYY";

    if (!_culture.cultures[culture]) throw "Unknown Culture Name";else (0, _utils.dateFormat)(date, formatString, new _culture_info2.default(culture));
};

Chart.version = "v1.8.2";

},{"../constants/culture":22,"../constants/themes":24,"../core/charts":28,"../core/culture_info":29,"../helpers/utils":39}]},{},[40])(40)
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY2hhcnRzL2FyZWEuanMiLCJzcmMvY2hhcnRzL2Jhci5qcyIsInNyYy9jaGFydHMvYnViYmxlLmpzIiwic3JjL2NoYXJ0cy9jYW5kbGVzdGljay5qcyIsInNyYy9jaGFydHMvY29sdW1uLmpzIiwic3JjL2NoYXJ0cy9pbmRleC5qcyIsInNyYy9jaGFydHMvcGllLmpzIiwic3JjL2NoYXJ0cy9yYW5nZV9hcmVhLmpzIiwic3JjL2NoYXJ0cy9yYW5nZV9iYXIuanMiLCJzcmMvY2hhcnRzL3JhbmdlX2NvbHVtbi5qcyIsInNyYy9jaGFydHMvcmFuZ2Vfc3BsaW5lX2FyZWEuanMiLCJzcmMvY2hhcnRzL3NjYXR0ZXIuanMiLCJzcmMvY2hhcnRzL3NwbGluZS5qcyIsInNyYy9jaGFydHMvc3BsaW5lX2FyZWEuanMiLCJzcmMvY2hhcnRzL3N0YWNrZWRfYXJlYS5qcyIsInNyYy9jaGFydHMvc3RhY2tlZF9hcmVhXzEwMC5qcyIsInNyYy9jaGFydHMvc3RhY2tlZF9iYXIuanMiLCJzcmMvY2hhcnRzL3N0YWNrZWRfYmFyXzEwMC5qcyIsInNyYy9jaGFydHMvc3RhY2tlZF9jb2x1bW4uanMiLCJzcmMvY2hhcnRzL3N0YWNrZWRfY29sdW1uXzEwMC5qcyIsInNyYy9jaGFydHMvc3RlcF9hcmVhLmpzIiwic3JjL2NvbnN0YW50cy9jdWx0dXJlLmpzIiwic3JjL2NvbnN0YW50cy9vcHRpb25zLmpzIiwic3JjL2NvbnN0YW50cy90aGVtZXMuanMiLCJzcmMvY29yZS9hbmltYXRvci5qcyIsInNyYy9jb3JlL2F4aXMuanMiLCJzcmMvY29yZS9jYW52YXNqcy5qcyIsInNyYy9jb3JlL2NoYXJ0cy5qcyIsInNyYy9jb3JlL2N1bHR1cmVfaW5mby5qcyIsInNyYy9jb3JlL2RhdGFfc2VyaWVzLmpzIiwic3JjL2NvcmUvZXZlbnRfbWFuYWdlci5qcyIsInNyYy9jb3JlL2xheW91dF9tYW5hZ2VyLmpzIiwic3JjL2NvcmUvbGVnZW5kLmpzIiwic3JjL2NvcmUvdGV4dF9ibG9jay5qcyIsInNyYy9jb3JlL3RpdGxlLmpzIiwic3JjL2NvcmUvdG9vbHRpcC5qcyIsInNyYy9oZWxwZXJzL2FuaW1hdG9yLmpzIiwic3JjL2hlbHBlcnMvcmVuZGVyLmpzIiwic3JjL2hlbHBlcnMvdXRpbHMuanMiLCJzcmMvbWFpbi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztrQkNLZSxVQUFVLFFBQVEsRUFBRTtBQUNsQyxLQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDOztBQUV4RCxLQUFJLGVBQWUsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDOztBQUV4RCxLQUFJLGVBQWUsSUFBSSxDQUFDLEVBQ3ZCLE9BQU87O0FBRVIsS0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7O0FBRTNDLEtBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0FBQ2hELEtBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0FBQ2hELEtBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQzs7QUFFakIsS0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUM3QixJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O0FBRVgsWUFuQk8saUJBQWlCLEVBb0J2QixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7O0FBRWpCLElBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNoQixJQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwRSxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O0FBRVgsWUExQk8saUJB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QU0sR0FBRyxRQUFRLEdBQUcsQ0FBQyxBQUFDLEdBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLEFBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEcsUUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUM7QUFDNUIsUUFBSSxFQUFFLENBQUM7QUFDUCxRQUFJLEVBQUUsQ0FBQzs7QUFHUCxRQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3pCLFNBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUUzRSxPQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQixPQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQzs7QUFFM0Isb0JBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUM7S0FFakQsTUFBTTtBQUNOLFNBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUUzRSxPQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQixPQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQzs7QUFFM0Isb0JBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUM7S0FDakQ7O0FBR0QsU0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFHLFlBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVB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QUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBQUMsQUFFMUQsS0FBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztBQUUzRCxRQUFLLENBQUMsZUFBZSxHQUFHO0FBQ3ZCLE1BQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUN6RCxDQUFBOztBQUVELFFBQUssQ0FBQyxZQUFZLEdBQUc7QUFDcEIsTUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7SUFDL0QsQ0FBQztHQUNGOzs7Ozs7OztBQUFBLEFBUUQsTUFBSSxNQUFNLEVBQUU7QUFDWCxLQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLEtBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkQsS0FBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztBQUFDLEFBRWxELEtBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFM0QsU0FBTSxDQUFDLGVBQWUsR0FBRztBQUN4QixNQUFF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QUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEFBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFFBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFbEI7OztBQUFBLEFBR0QsT0FBSSxVQUFVLElBQUksVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNyRSxTQUFTOztBQUVWLE9BQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLE1BQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLE1BQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckQsTUFBTTtBQUNOLE1BQUUsQ0FBQyxDQUFDLElBQUssSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUksQ0FBQyxBQUFDLENBQUM7QUFDeEcsTUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxD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dkMsTUFBTTtBQUNOLFNBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDeEMsU0FBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztLQUN0Qzs7QUFFRCxRQUFJLEtBQUssR0FBRyxBQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxHQUFJLEVBQUUsR0FBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQUFBQyxDQUFDO0FBQzVFLFFBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDckIsUUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsUUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQUFBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RELFFBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEI7OztBQUFBLEFBR0QsT0FBSSxVQUFVLElBQUksVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNyRSxTQUFTOztBQUVWLFFBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEFBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQzs7QUFFckgsT0FBSSxJQUFJLENBQUMsVUFB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QyxDQUFDLFNBQVMsQ0FBQzs7QUFFdEMsVUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUN6QyxVQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO01BQ3ZDLE1BQU07QUFDTixVQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0FBQ3hDLFVBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7TUFDdEM7O0FBRUQsU0FBSSxLQUFLLEdBQUcsQUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsR0FBSSxFQUFFLEdBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEFBQUMsQ0FBQztBQUM1RSxTQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3JCLFNBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLFNBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEFBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RCxTQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBRWxCOzs7QUFBQSxBQUdELFFBQUksVUFBVSxJQUFJLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDckUsU0FBUzs7QUFFVixTQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQzs7QUFBQyxBQUUvQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFO0FBQzFCLFVBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDekIsTUFFQSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztBQUUxQixTQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3Qjs7QUFFRCxPQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7O0FBRWYsUUFBSSxDQUFDLGVBQWUsR0FBRyx5QkFBYyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzlDLE1BQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDO0FBQzNCLE1BQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7QUFDMUIsYUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtBQUNyQyxjQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHO0FBQ25DLFVBQUssRUFBRSxFQUFFO0FBQ1QsU0FBSSxFQUFFLElBQUksQ0FBQyxLQUFLO0FBQ2hCLG9CQUFlLEVBQUUsUUFBUTtBQUN6QixhQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWE7QUFDNUIsZUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlO0FBQ2hDLGVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZTtBQUNoQyxjQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWM7QUFDOUIsY0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjO0FBQzlCLGlCQUFZLEVBQUUsS0FBSztLQUNuQixDQUFDLENBQUM7O0FBRUgsUUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxRQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxBQUFDLENBQUM7QUFDdEgsUUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbEM7R0FDRDtDQUNELENBQUE7O0FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsR0FBRyxZQUFZO0FBQ25ELEtBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUc7OztBQUFDLEFBR2xDLEtBQUksd0JBQXdCLENBQUM7QUFDN0IsS0FBSSxzQkFBc0IsQ0FBQztBQUMzQixLQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQzlDLEtBQUksQ0FBQyxHQUFHLENBQUM7S0FBRSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7O0FBRXZDLEtBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQSxJQUFLLElBQUksQ0FBQyxlQUFlLEVBQUU7O0FBRXRGLEtBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7QUFFckMsT0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7QUFFekMsT0FBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDNUIsU0FBUzs7QUFFVixPQUFJLG9CQUFvQixFQUFFOztBQUN6Qiw0QkFBd0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFcEYsUUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUU5RSxzQkFBc0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRXZGLE9BQUcsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdMLHdCQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QixNQUNBLG9CQUFvQixHQUFHLElBQUksQ0FBQztHQUU3QjtFQUVELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFBLElBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTs7QUFFN0YsS0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDOztBQUVyQyxPQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xDLE9BQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ3pCLFNBQVM7O0FBRXBCLE9BQUksb0JBQW9CLEVBQUU7OztBQUV6QiwwQkFBc0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFbEYsUUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUVoRix3QkFBd0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRXpGLE9BQUcsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLHdCQUF3QixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdMLHdCQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QixNQUNBLG9CQUFvQixHQUFHLElBQUksQ0FBQztHQUM3Qjs7QUFBQSxFQUVEOztBQUVELElBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNoQjs7O0FBQUEsQUFHRCxJQUFJLENBQUMsU0FBUyxDQUFDLCtCQUErQixHQUFHLFVBQVUsYUFBYSxFQUFFOztBQUV6RSxLQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUEsQUFBQyxJQUFJLENBQUMsYUFBYSxFQUNyRSxPQUFPOztBQUVSLEtBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7QUFFakIsS0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsTUFBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7QUFFNUMsTUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbkMsTUFBSSxTQUFTLENBQUMsY0FBYyxLQUFLLGFBQWEsRUFDN0MsU0FBUzs7O0FBQUEsQUFJVixNQUFJLGFBQWEsS0FBSyxPQUFPLEtBQUssU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQSxBQUFDLEVBQ2xILFNBQVM7O0FBRVYsTUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFO0FBQ3hCLE9BQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztHQUN0RixNQUVBLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUNwQjtDQUNELENBQUM7O0FBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsWUFBWTs7QUFFdkMsS0FBSSxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUEsQUFBQyxFQUNsRCxPQUFPOzs7QUFBQSxBQUdSLEtBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDOztBQUV6QixLQUFJLEVBQUUsQ0FBQztBQUNQLEtBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDOUMsS0FBSSxTQUFTLENBQUM7QUFDZCxLQUFJLGFBQWEsRUFBRSxlQUFlOzs7QUFBQyxBQUduQyxJQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDbkMsSUFBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztBQUVqQyxLQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDcEIsS0FBRyxDQUFDLFdBQVcsQ0FBQyxXQW5wQ1ksZ0JBQWdCLEVBbXBDWCxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0VBQ3pFOztBQUdELEtBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7O0FBRTVELE9BQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTs7QUFFdkUsT0FBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQ3JHLFNBQVM7O0FBRVYsTUFBRyxDQUFDLFNBQVMsRUFBRSxDQUFDOztBQUVoQixLQUFFLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlELE9BQUksS0FBSyxHQUFHLEFBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsR0FBSSxFQUFFLEdBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEFBQUMsQ0FBQzs7QUFFdkUsTUFBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQy9DLE1BQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs7QUFFL0MsTUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0dBQ2I7RUFFRCxNQUNJLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUU7O0FBRWpFLE9BQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFOztBQUUzRSxPQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUN6RixTQUFTOztBQUVWLE9BQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUNyRyxTQUFTOztBQUVWLE1BQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7QUFFaEIsS0FBRSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUU5RCxPQUFJLEtBQUssR0FBRyxBQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBLEdBQUksRUFBRSxHQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxBQUFDLENBQUM7O0FBRXZFLE1BQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxNQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7O0FBRS9DLE1BQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUNiO0VBRUQ7Q0FDRCxDQUFBOztBQUVELElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLFlBQVk7O0FBRTNDLEtBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDOztBQUV6QixLQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO0FBQzVELE1BQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUN2QixNQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDbkMsTUFBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDOztBQUU1RCxPQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDcEIsT0FBRyxDQUFDLFdBQVcsQ0FBQyxXQTlzQ1UsZ0JBQWdCLEVBOHNDVCxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3pFOztBQUVELE9BQUksS0FBSyxHQUFHLEFBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBLEdBQUksRUFBRSxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQUFBQyxDQUFDOztBQUVsSCxNQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDaEIsTUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQyxNQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLE1BQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUNiO0VBRUQsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFO0FBQ25FLE1BQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUN2QixNQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDbkMsTUFBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztBQUVqQyxPQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDcEIsT0FBRyxDQUFDLFdBQVcsQ0FBQyxXQS90Q1UsZ0JBQWdCLEVBK3RDVCxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3pFOztBQUVELE9BQUksS0FBSyxHQUFHLEFBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBLEdBQUksRUFBRSxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQUFBQyxDQUFDOztBQUVsSCxNQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDaEIsTUFBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzQyxNQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLE1BQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUNiO0VBQ0Q7Q0FDRCxDQUFBOztBQUVELElBQUksQ0FBQyxTQUFTLENBQUMseUJBQXlCLEdBQUcsVUFBVSxLQUFLLEVBQUU7QUFDM0QsS0FBSSxFQUFFLEdBQUcsRUFDUixDQUFDO0FBQ0YsS0FBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7QUFDdkMsS0FBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7O0FBRXpDLEtBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7O0FBRTVELE1BQUksWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZOzs7QUFBQyxBQUcxRCxJQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEdBQUksWUFBWSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBLEFBQUMsQUFBQyxDQUFDO0FBQzdGLElBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7RUFDL0I7QUFDRCxLQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFOztBQUU1RCxNQUFJLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZOzs7QUFBQyxBQUczRCxJQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEdBQUksWUFBWSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBLEFBQUMsQUFBQyxDQUFDO0FBQzdGLElBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7RUFDL0I7O0FBRUQsUUFBTyxFQUFFLENBQUM7Q0FDVixDQUFBOztBQUVELElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxLQUFLLEVBQUU7O0FBRXJELEtBQUksQ0FBQyxLQUFLLEVBQ1QsT0FBTyxJQUFJLENBQUM7O0FBRWIsS0FBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsS0FBSSxDQUFDLEdBQUcsQUFBQyxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sR0FBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7O0FBRXRGLE1BQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUEsR0FBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDOztBQUUvSCxRQUFPLEtBQUssQ0FBQztDQUNiLENBQUE7O0FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLGVBQWUsRUFBRSxlQUFlLEVBQUU7O0FBRTdFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzdHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0NBRTdHLENBQUE7O0FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxLQUFLLEVBQUU7QUFDN0MsS0FBSSxDQUFDLEtBQUssRUFDVCxPQUFPLElBQUksQ0FBQzs7QUFFYixLQUFJLElBQUksR0FBRyxJQUFJLENBQUM7O0FBRWhCLEtBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUU7QUFDOUIsTUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQSxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLElBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFBLEFBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7RUFDOU0sTUFDSSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO0FBQ3JDLE1BQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUEsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQSxBQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0VBQzNNOztBQUVELFFBQU8sSUFBSSxDQUFDO0NBQ1osQ0FBQTs7QUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLHlDQUF5QyxHQUFHLFVBQVUsS0FBSyxFQUFFO0FBQzNFLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDOztBQUV0QixLQUFJLG9CQUFvQixHQUFHO0FBQzFCLGNBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSTtFQUNsRCxDQUFDOztBQUVGLEtBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0FBQ3ZDLEtBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDOztBQUV6QyxxQkFBb0IsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7QUFFcEQsS0FBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtBQUM1RCxzQkFBb0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzdILHNCQUFvQixDQUFDLFNBQVMsR0FBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxBQUFDLENBQUM7RUFDckc7O0FBRUQsS0FBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFBRTtBQUM1RCxzQkFBb0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQSxHQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzlILHNCQUFvQixDQUFDLFNBQVMsR0FBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxBQUFDLENBQUM7RUFDckc7O0FBR0QsS0FBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0NBQ2pELENBQUE7O0FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxZQUFZOztBQUVwRCxLQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN4RCxLQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDdkIsS0FBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEtBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDOztBQUVwQyxLQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO0FBQzVELE1BQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUNoQyxNQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7RUFDbEMsTUFBTTtBQUNOLE1BQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNqQyxNQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7RUFDakM7O0FBRUQsS0FBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEdBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVKLEtBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNiLEtBQUksT0FBTyxDQUFDO0FBQ1osS0FBSSxLQUFLLENBQUM7QUFDVixLQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7O0FBR3JCLEtBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFDL0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOztBQUVyQyxLQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQy9ELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7QUFFckMsS0FBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtBQUMxQixLQUFHLEdBQUcsQUFBQyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksR0FBSSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO0FBQ3pGLEtBQUcsR0FBRyxBQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxHQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0FBRXpGLE1BQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDcEIsZUFBWSxHQUFHLE9BQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEFBQUMsS0FBSyxXQUFXLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDOztBQUU3RixNQUFHLElBQUksWUFBWSxDQUFDO0FBQ3BCLE1BQUcsSUFBSSxZQUFZLENBQUM7R0FDcEI7O0FBRUQsTUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUM1QixJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZCLFVBQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDbkMsTUFDSTtBQUNKLFVBQU8sR0FBRyxDQUFDLENBQUM7O0FBRVosT0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUNwRCx1QkFBdUIsR0FBRyxJQUFJLENBQUM7R0FDaEM7RUFFRCxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Ozs7QUFJakMsS0FBRyxHQUFHLEFBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLEdBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUN6RixLQUFHLEdBQUcsQUFBQyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksR0FBSSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDOztBQUV6RixNQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3JDLE1BQUcsR0FBRyxPQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxBQUFDLEtBQUssV0FBVyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0FBQzNGLE1BQUcsR0FBRyxDQUFDLENBQUM7R0FDUixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDMUIsTUFBRyxHQUFHLEdBQUcsQ0FBQztHQUNWLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMxQixNQUFHLEdBQUcsR0FBRyxDQUFDO0dBQ1Y7O0FBRUEsTUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7O0FBQzNCLE1BQUcsSUFBSSxDQUFDLENBQUM7QUFDVCxNQUFHLEdBQUcsQ0FBQyxDQUFDO0dBQ1IsTUFDSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFOztBQUN6QixlQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUQsTUFBRyxJQUFJLFlBQVksQ0FBQztBQUNwQixNQUFHLElBQUksWUFBWSxDQUFDO0dBQ3BCLE1BQ0ksSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQ25CLGVBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0FBRWhFLE9BQUksR0FBRyxJQUFJLENBQUMsRUFDWCxHQUFHLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxLQUV6QixHQUFHLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQztHQUMxQixNQUNJOztBQUVKLGVBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0FBRWxFLE9BQUksR0FBRyxLQUFLLENBQUMsRUFDWixHQUFHLElBQUksWUFBWSxDQUFDO0FBQ3JCLE9BQUksR0FBRyxLQUFLLENBQUMsRUFDWixHQUFHLElBQUksWUFBWSxDQUFDO0dBQ3JCOztBQUVGLE1BQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUNyQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FDNUIsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtBQUN2QixVQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ25DLE1BQ0k7QUFDSixVQUFPLEdBQUcsQ0FBQyxDQUFDO0dBQ1o7OztBQUFBLEFBSUQsTUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUEsQUFBQyxFQUFFO0FBQ3ZGLE9BQUksR0FBRyxHQUFHLENBQUMsRUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDO0dBQ1Q7QUFDRCxNQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQSxBQUFDLEVBQUU7QUFDdkYsT0FBSSxHQUFHLEdBQUcsQ0FBQyxFQUNWLEdBQUcsR0FBRyxDQUFDLENBQUM7R0FDVDtFQUNEOztBQUVELE1BQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUEsSUFBSyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBLEFBQUMsQ0FBQzs7QUFFbE0sS0FBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFOztBQUUvRSxNQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTs7QUFFdkIsT0FBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQy9CLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3RDLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3RDLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQSxBQUFDLElBQUksT0FBTyxFQUFFO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLElBQUks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QUMsQ0FBQyxBQUNyQyxJQUFJLGFBQWEsQ0FBRyxJQUFJLENBQUMsQUFFekIsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJO0FBQUMsQUFFN0IsR0FBSSxJQUFJLENBQUMsY0FBYyxDQUFFLENBQ3hCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsVUE3ekIzQixZQUFZLEVBNnpCNEIsSUFBSSxDQUFDLEtBQUssQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQUFDOUQsUUFBUSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNsRSxBQUVELEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLENBQzNCLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3RDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLENBQ3BDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQzFDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2xDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3hDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2xDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3hDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLENBQy9CLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3JDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLENBQ2hDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQ3RDLEdBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLENBQ3BDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQzFDLEdBQUksUUFBUSxD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QUMsQUFDeEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDekMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQUFFeEMsR0FBSSxVQUFVLEtBQUssSUFBSSxDQUN0QixTQUFTLEFBRVYsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDekMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQUFDeEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDekMsYUFBYSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FDeEMsQUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBRyxVQUFVLENBQUcsUUFBUSxDQUFDLENBQzFGOztBQUFBLENBSUQsQ0FBQSxBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsdUJBQXVCLEdBQUcsU0FBVSxRQUFRLENBQUUsQ0FFN0QsR0FBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdkUsT0FBTyxBQUVSLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBQzVDLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBRTVDLElBQUksVUFBVSxDQUFFLFVBQVUsQ0FBQyxBQUMzQixJQUFJLFVBQVUsQ0FBRyxLQUFLLENBQUMsQUFFdkIsSUFBSSxzQkFBc0IsQ0FBRyxFQUFFLENBQUMsQUFDaEMsSUFBSSxzQkFBc0IsQ0FBRyxFQUFFLENBQUMsQUFFaEMsSUFBSyxJQUFJLENBQUMsQ0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDM0QsSUFBSSxVQUFVLENBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUMxRCxJQUFJLENBQUMsQ0FBRyxDQUFDLENBQUMsQUFDVixJQUFJLG1CQUFtQixDQUFHLEtBQUssQ0FBQyxBQUNoQyxJQUFJLGtCQUFrQixDQUFHLEtBQUssQ0FBQyxBQUUvQixHQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFFLENBRXRGLElBQUksWUFBWSxDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDL0ssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFHLEFBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBRyxDQUFDLFFBQVEsQ0FBQyxBQUV0SSxJQUFJLFlBQVksQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQy9LLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUcsUUFBUSxDQUFDLENBQ3JJLEFBR0QsR0FBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUUsQ0FDN0csVUFBVSxHQUFHLElBQUksQ0FBQyxDQUNsQixBQUVELElBQUssQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLEVBQUU7QUFHbEQsR0FBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUN0RCxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDL0IsQUFFRCxHQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxDQUN2QyxVQUFVLEdBQUcsSUFBSSxDQUFDLEFBQ2xCLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7QUFBQyxDQUNsRCxLQUVBLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUV6QyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFJeEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDakMsYUFBYSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsQUFDaEMsR0FBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDakMsYUFBYSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsQUFFaEMsR0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQ1YsSUFBSSxLQUFLLENBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUN4RCxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUEsQUFBQztBQUFDLEFBRWxDLEdBQUksYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBRSxDQUNqRCxhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUM5QixBQUVELEdBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFFLENBQ25FLElBQUksS0FBSyxDQUFHLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDeEQsS0FBSyxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBLEFBQUM7QUFBQyxBQUVsQyxHQUFJLGFBQWEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUUsQ0FDakQsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FDaEMsQ0FDQyxDQUNEO0FBQUEsQUFHRCxHQUFJLFVBQVUsR0FBRyxZQUFZLElBQUksQ0FBQyxtQkFBbUIsQ0FBRSxDQUN0RCxTQUFTLENBQ1QsS0FBTSxHQUFJLENBQUMsbUJBQW1CLENBQUUsQ0FDaEMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEFBRTNCLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUNWLENBQUMsSUFBSSxDQUFDLENBQUMsQUFDUCxTQUFTLENBQ1QsQ0FDRDtBQUFBLEFBR0QsR0FBSSxVQUFVLEdBQUcsWUFBWSxJQUFJLENBQUMsa0JBQWtCLENBQUUsQ0FDckQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQzFCLEtBQU0sR0FBSSxVQUFVLEdBQUcsWUFBWSxJQUFJLGtCQUFrQixDQUFFLENBQzNELFNBQVMsQ0FDVCxBQUdELEdBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ2pDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEFBRXBFLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ3pDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEFBQ3hDLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ3pDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEFBRXhDLEdBQUksVUFBVSxLQUFLLElBQUksQ0FDdEIsU0FBUyxBQUVWLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUcsQ0FBQyxDQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUEsR0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEFBRXpILEdBQUksVUFBVSxJQUFJLENBQUMsQ0FBRSxDQUNwQixHQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUNyQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsS0FFakQsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQ2pELEtBQU0sQ0FDTixHQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUNyQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsS0FFakQsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQ2pELENBQ0QsQUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBRyxVQUFVLENBQUcsUUFBUSxDQUFDLENBQzFGLEFBRUQsSUFBSyxDQUFDLElBQUksc0JBQXNCLEVBQUUsQ0FDakMsR0FBSSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FDOUMsR0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FDYixTQUFTLENBQ1QsQUFDRCxJQUFJLElBQUksQ0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUVyQyxHQUFJLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUMzQixhQUFhLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxBQUUxQixHQUFJLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUMzQixhQUFhLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxBQUUxQixHQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsV0FBVyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUNqRSxTQUFTLEFBRVYsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDbkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQUFDbEMsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDbkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FDbEMsQ0FFQSxBQUVELElBQUssQ0FBQyxJQUFJLHNCQUFzQixFQUFFLENBRWpDLEdBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQzlDLEdBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQ2IsU0FBUyxDQUNULEFBRUQsSUFBSSxJQUFJLENBQUcsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFFckMsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDM0IsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQUFFMUIsR0FBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FDM0IsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQUFFMUIsR0FBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLFdBQVcsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FDakUsU0FBUyxBQUVWLEdBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ25DLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEFBQ2xDLEdBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ25DLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQ2xDLENBRUE7OztBQUFBLENBT0QsQ0FBQSxBQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsMEJBQTBCLEdBQUcsU0FBVSxRQUFRLENBQUUsQ0FDaEUsR0FBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdkUsT0FBTyxBQUVSLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBQzVDLElBQUksYUFBYSxDQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEFBRTVDLElBQUksVUFBVSxDQUFFLFVBQVUsQ0FBQyxBQUMzQixJQUFJLFVBQVUsQ0FBRyxLQUFLLENBQUMsQUFDdkIsSUFBSSxpQkFBaUIsQ0FBRyxLQUFLLENBQUMsQUFDOUIsSUFBSSxpQkFBaUIsQ0FBRyxLQUFLLENBQUMsQUFFOUIsSUFBSSxjQUFjLENBQUcsRUFBRSxDQUFDLEFBRXhCLElBQUssSUFBSSxDQUFDLENBQUcsQ0FBQyxDQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxFQUFFLENBQzNELElBQUksVUFBVSxDQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDMUQsSUFBSSxDQUFDLENBQUcsQ0FBQyxDQUFDLEFBQ1YsSUFBSSxtQkFBbUIsQ0FBRyxLQUFLLENBQUMsQUFDaEMsSUFBSSxrQkFBa0IsQ0FBRyxLQUFLLENBQUMsQUFFL0IsR0FBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBRSxDQUV0RixJQUFJLFlBQVksQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQy9LLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUcsQ0FBQyxRQUFRLENBQUMsQUFFdEksSUFBSSxZQUFZLENBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLEFBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUMvSyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFHLFFBQVEsQ0FBQyxDQUNySSxBQUdELEdBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFFLENBQzdHLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FDbEIsQUFFRCxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxFQUFFO0FBR2xELEdBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUUsQ0FDdEQsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQy9CLEFBRUQsR0FBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FDdkMsVUFBVSxHQUFHLElBQUksQ0FBQyxBQUNsQixVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO0FBQUMsQ0FDbEQsS0FFQSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFFekMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBSXhDLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQ2pDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEFBQ2hDLEdBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQ2pDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEFBRWhDLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUNWLElBQUksS0FBSyxDQUFHLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDeEQsS0FBSyxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBLEFBQUM7QUFBQyxBQUVsQyxH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SSxtQkFBbUIsQ0FBRyxLQUFLLENBQUMsQUFDaEMsSUFBSSxrQkFBa0IsQ0FBRyxLQUFLLENBQUMsQUFFL0IsR0FBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBRSxDQUV0RixJQUFJLFlBQVksQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQy9LLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBRyxBQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUcsQ0FBQyxRQUFRLENBQUMsQUFFdEksSUFBSSxZQUFZLENBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFHLEFBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUMvSyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUcsQUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFHLFFBQVEsQ0FBQyxDQUNySSxBQUdELEdBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxD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LFNBQVMsQ0FBRSxVQUFVLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFFLEtBQUssQ0FBQyxDQUFDLENBRTFGLEFBRUQsR0FBSSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUUsRUFBRSxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FJdkQsS0FDSSxHQUFJLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FFdEIsSUFBSyxJQUFJLENBQUMsQ0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxFQUFFLENBQzdDLEdBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FDeEMsU0FBUyxBQUVWLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQzdCLElBQUksTUFBTSxDQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQUFFL0IsR0FBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUUsQ0FDckYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBRXRELEdBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBRSxDQUN4RCxLQUFLLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEFBRXRDLEdBQUksSUFB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QUFHLElBQUksQ0FDckIsTUFBTSxDQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsTUFBTSxDQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsS0FBSyxDQUFHLElBQUksQ0FBQyxBQUVkLEdBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFFLENBQ2hELElBQUksSUFBSSxDQUFHLE1BQU0sQ0FBQyxBQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFDLEFBQ2hCLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FDZCxBQUVELFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQUFDeEMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxBQUV4QyxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQSxBQUFDLENBQUUsQ0FDcEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUNyQixLQUFNLEdBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBRSxDQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxBQUVELEdBQUksQ0FBQyxBQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQU0sSUFBSSxDQUFDLFVB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QVcsQ0FBQyxDQUNuQixDQUFBLEFBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBWSxDQUU3QyxJQUFJLFFBQVEsQ0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEFBRTdCLElBQUksS0FBSyxDQUFHLElBQUksQ0FBQyxLQUFLLENBQUcsSUFBSSxDQUFDLEtBQUssQ0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEFBRWxELEdBQUksUUFqd0VKLGlCQUFpQixBQWl3RUssS0FBSyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQSxBQUFDLENBQUUsQ0FDL0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDakQsQUFFRCxHQUFJLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFFLENBQ3hCLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQUFDdkksUUFBUSxDQUFDLEVBQUUsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxBQUFDLENBQUMsQUFFcEksUUFBUSxDQUFDLEVBQUUsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFHLEtB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LEVBQUUsS0FBSyxFQUFFLENBQUM7V0FDcEIsQ0FBQztBQUNGLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEIsTUFBTTtBQUNMLGFBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsa0JBQVEsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUEsR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3pDOztBQUVELFlBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7O0FBRXJDLFlBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO0FBQUMsQUFDN0IsWUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs7QUFBQyxBQUVyQixXQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxVQUFVLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQSxBQUFDLElBQUksQUFBQyxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsR0FBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUEsQUFBQyxHQUFHLENBQUMsQ0FBQSxBQUFDLENBQUMsQ0FBQztBQUMzUSxXQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFckIsWUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO09BQzlDO0tBQ0Y7O0FBRUQsUUFBSSxJQUFJLENBQUMsUUFBUSxLQUFL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Q0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7O0FBRTFILFVBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQ2xFLFVBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsVUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUNuRyxVQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0tBQ3JHO0FBQ0QsYUFBUyxHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7R0FDdEM7Ozs7Ozs7O0FBQUEsQUFRRCxXQUFTLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxD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R0FBRyxDQUFDLENBQUM7Q0FDdkI7O0FBRU0sU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsS0FBSSxHQUFHLEdBQUcsQUFBQyxDQUFDLElBQUksRUFBRSxHQUFLLENBQUMsSUFBSSxDQUFDLEFBQUMsR0FBSSxDQUFDLEFBQUMsQ0FBQzs7QUFFckMsUUFBTyxHQUFHLENBQUM7Q0FDWDs7QUFFTSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDN0IsS0FBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2IsS0FBSSxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBLElBQUssRUFBRSxBQUFDLENBQUM7QUFDakMsS0FBSSxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBLElBQUssQ0FBQyxBQUFDLENBQUM7QUFDaEMsS0FBSSxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBLElBQUssQ0FBQyxBQUFDOzs7Ozs7QUFBQyxBQU1oQyxJQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNYLElBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRVgsUUFBTyxHQUFHLENBQUM7Q0FDWDs7QUFFTSxTQUFTLFlBQVksQ0FBQyxjQUFHLEVBQWE7QUFDNUMsS0FBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7O0FBRTVCLEtBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsS0FBSSxHQUFHLEFBQUMsSUFBSSxHQUFHLENBQUMsR0FDWixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckIsS0FBSSxJQUFJLEdBQUcsQ0FBQyxFQUNYLElBQUksSUFB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QUc7QUFDUCxZQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBLEdBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQUEsQUFDckUsU0FBSyxJQUFJO0FBQ1IsWUFBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQSxHQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFBQSxBQUM3RSxTQUFLLEtBQUs7QUFDVCxZQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBLEdBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0FBQUEsQUFFN0c7QUFDQyxZQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0FBQUEsSUFFckM7R0FDRCxDQUFDLENBQUM7O0FBRUgsU0FBTyxNQUFNLENBQUM7RUFDZCxDQUFDO0NBQ0YsQ0FBQzs7QUFFSyxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRTtBQUNoRCxLQUFJLENBQUMsS0FBSyxJQUFJLEVBQ2IsT0FBTyxFQUFFLENBQUM7O0FBRVgsRUFBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEtBQUksVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtB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QWdCLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FFakUsQ0FBQzs7QUFFRixLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWQsIGdldExpbmVEYXNoQXJyYXksIGludFRvSGV4Q29sb3JTdHJpbmd9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdHZhciBheGlzWFByb3BzID0gcGxvdFVuaXQuYXhpc1gubGluZUNvb3JkaW5hdGVzO1xuXHR2YXIgYXhpc1lQcm9wcyA9IHBsb3RVbml0LmF4aXNZLmxpbmVDb29yZGluYXRlcztcblx0dmFyIG1hcmtlcnMgPSBbXTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHRnaG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cblx0XHR2YXIgc2VyaWVzSWQgPSBkYXRhU2VyaWVzLmlkO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbc2VyaWVzSWRdID0ge1xuXHRcdFx0b2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4XG5cdFx0fTtcblxuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gMjA7XG5cblx0XHRtYXJrZXJzID0gW107XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9jdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cdFx0XHR2YXIgY29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSB0cnVlO1xuXHRcdFx0Zm9yICg7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdGlmIChpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSB8fCBwcmV2RGF0YU51bGwpIHtcblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHRzdGFydFBvaW50ID0ge1xuXHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gZmFsc2U7XG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGkgJSAyNTAgPT0gMCkge1xuXHRcdFx0XHRcdFx0Y2xvc2VBcmVhKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJhcmVhXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHQvL3N0YXJ0UG9pbnQgPSB7IHg6IHgsIHk6IHkgfTtcblx0XHRcdFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhtYXJrZXJzKTtcblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHRmdW5jdGlvbiBjbG9zZUFyZWEoKSB7XG5cblx0XHRpZiAoIXN0YXJ0UG9pbnQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMClcblx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdGlmIChwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0gPD0gMCAmJiBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1heGltdW0gPj0gMCkge1xuXHRcdFx0YmFzZVkgPSB5WmVyb1RvUGl4ZWw7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWF4aW11bSA8IDApXG5cdFx0XHRiYXNlWSA9IGF4aXNZUHJvcHMueTE7XG5cdFx0ZWxzZSBpZiAocGxvdFVuaXQuYXhpc1kudmlld3BvcnRNaW5pbXVtID4gMClcblx0XHRcdGJhc2VZID0gYXhpc1hQcm9wcy55MjtcblxuXHRcdGN0eC5saW5lVG8oeCwgYmFzZVkpO1xuXHRcdGN0eC5saW5lVG8oc3RhcnRQb2ludC54LCBiYXNlWSk7XG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0Y3R4Lmdsb2JhbEFscGhhID0gZGF0YVNlcmllcy5maWxsT3BhY2l0eTtcblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCBiYXNlWSk7XG5cdFx0XHRnaG9zdEN0eC5saW5lVG8oc3RhcnRQb2ludC54LCBiYXNlWSk7XG5cdFx0XHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdGdob3N0Q3R4LmZpbGwoKTtcblx0XHR9XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRzdGFydFBvaW50ID0ge1xuXHRcdFx0eDogeCwgeTogeVxuXHRcdH07XG5cdH1cblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgZHJhd1JlY3QsIGludFRvSGV4Q29sb3JTdHJpbmd9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHQvL0luIGNhc2Ugb2YgQmFyIENoYXJ0LCB5WmVyb1RvUGl4ZWwgaXMgeCBjby1vcmRpbmF0ZSFcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogTWF0aC5taW4oKHRoaXMuaGVpZ2h0ICogLjE1KSwgdGhpcy5wbG90QXJlYS5oZWlnaHQgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0Ly92YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyB0b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHR2YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblxuXHRcdC8vZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IGJhcldpZHRoIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50c1tpXS5nZXRUaW1lID8gZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdC8veCBhbmQgeSBhcmUgcGl4ZWwgY28tb3JkaW5hdGVzIG9mIHBvaW50IGFuZCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggWCBhbmQgWSB2YWx1ZXNcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblxuXHRcdFx0XHR2YXIgeTEgPSAoeSAtIChwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiBiYXJXaWR0aCAvIDIpICsgKChwbG90VW5pdC5wcmV2aW91c0RhdGFTZXJpZXNDb3VudCArIGopICogYmFyV2lkdGgpKSA8PCAwO1xuXHRcdFx0XHR2YXIgeTIgPSB5MSArIGJhcldpZHRoIDw8IDA7XG5cdFx0XHRcdHZhciB4MTtcblx0XHRcdFx0dmFyIHgyO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLnkgPj0gMCkge1xuXHRcdFx0XHRcdHgxID0geVplcm9Ub1BpeGVsO1xuXHRcdFx0XHRcdHgyID0geDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4MSA9IHg7XG5cdFx0XHRcdFx0eDIgPSB5WmVyb1RvUGl4ZWw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2RyYXdSZWN0KGN0eCwgeDEsIHkxLCBwbG90QXJlYS54MiwgeTIsIFwiI0VFRUVFRVwiLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdC8vZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHBsb3RBcmVhLngyLCB5MiwgXCIjQkRDRUQzXCIsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHRcdC8vY29sb3IgPSBcIiMxQjQ5NjJcIjtcblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZGF0YVNlcmllcy5maWxsT3BhY2l0eSk7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwiYmFyXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogZGF0YVBvaW50c1tpXS55ID49IDAgPyB4MiA6IHgxLCB5OiB5MSArICh5MiAtIHkxKSAvIDJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Ym91bmRzOiB7XG5cdFx0XHRcdFx0XHRcdHgxOiBNYXRoLm1pbih4MSwgeDIpLCB5MTogeTEsIHgyOiBNYXRoLm1heCh4MSwgeDIpLCB5MjogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkJhc2UgPSBNYXRoLm1heCh5WmVyb1RvUGl4ZWwsIHBsb3RVbml0LmF4aXNYLmJvdW5kaW5nUmVjdC54Mik7XG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54U2NhbGVBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VPdXRRdWFydCwgYW5pbWF0aW9uQmFzZTogYW5pbWF0aW9uQmFzZVxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgaW50VG9IZXhDb2xvclN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiB0aGlzLndpZHRoICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLndpZHRoIC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpIC8gdG90YWxEYXRhU2VyaWVzICogLjkpIDw8IDA7XG5cblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHR2YXIgbWF4WiA9IC1JbmZpbml0eTtcblx0dmFyIG1pblogPSBJbmZpbml0eTtcblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgeiA9IDA7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueikgIT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHRcdFx0XHR6ID0gZGF0YVBvaW50c1tpXS56O1xuXG5cdFx0XHRcdGlmICh6ID4gbWF4Wilcblx0XHRcdFx0XHRtYXhaID0gejtcblxuXHRcdFx0XHRpZiAoeiA8IG1pblopXG5cdFx0XHRcdFx0bWluWiA9IHo7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dmFyIG1pbkFyZWEgPSBNYXRoLlBJICogNSAqIDU7XG5cdHZhciBtYXhBcmVhID0gTWF0aC5tYXgoTWF0aC5wb3coTWF0aC5taW4ocGxvdEFyZWEuaGVpZ2h0LCBwbG90QXJlYS53aWR0aCkgKiAuMjUgLyAyLCAyKSAqIE1hdGguUEksIG1pbkFyZWEpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA9PSAxKVxuXHRcdFx0YmFyV2lkdGggPSBtYXhCYXJXaWR0aDtcblxuXHRcdGlmIChiYXJXaWR0aCA8IDEpXG5cdFx0XHRiYXJXaWR0aCA9IDE7XG5cdFx0ZWxzZSBpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXHRcdFx0Ly92YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgPyBmYWxzZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblxuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS5nZXRUaW1lID8gZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHZhciB6ID0gZGF0YVBvaW50c1tpXS56O1xuXG5cdFx0XHRcdHZhciBhcmVhID0gKG1heFogPT09IG1pblopID8gbWF4QXJlYSAvIDIgOiBtaW5BcmVhICsgKG1heEFyZWEgLSBtaW5BcmVhKSAvIChtYXhaIC0gbWluWikgKiAoeiAtIG1pblopO1xuXHRcdFx0XHR2YXIgcmFkaXVzID0gTWF0aC5tYXgoTWF0aC5zcXJ0KGFyZWEgLyBNYXRoLlBJKSA8PCAwLCAxKTtcblxuXHRcdFx0XHR2YXIgbWFya2VyU2l6ZSA9IHJhZGl1cyAqIDI7XG5cdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCBjdHgpO1xuXHRcdFx0XHRtYXJrZXJQcm9wcy5zaXplID0gbWFya2VyU2l6ZTtcblxuXG5cdFx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IGRhdGFTZXJpZXMuZmlsbE9wYWNpdHk7XG5cdFx0XHRcdFJlbmRlckhlbHBlci5kcmF3TWFya2VyKHgsIHksIGN0eCwgbWFya2VyUHJvcHMudHlwZSwgbWFya2VyUHJvcHMuc2l6ZSwgbWFya2VyUHJvcHMuY29sb3IsIG1hcmtlclByb3BzLmJvcmRlckNvbG9yLCBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3MpO1xuXHRcdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdFx0XHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRpZDogaWQsIG9iamVjdFR5cGU6IFwiZGF0YVBvaW50XCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4LCBkYXRhUG9pbnRJbmRleDogaSwgeDE6IHgsIHkxOiB5LCBzaXplOiBtYXJrZXJTaXplXG5cdFx0XHRcdH07XG5cdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXHRcdFx0XHQvL1JlbmRlckhlbHBlci5kcmF3TWFya2VyKHgsIHksIHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCwgbWFya2VyVHlwZSwgbWFya2VyU2l6ZSwgbWFya2VyQ29sb3IsIG1hcmtlckNvbG9yLCBkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyk7XG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRSZW5kZXJIZWxwZXIuZHJhd01hcmtlcih4LCB5LCB0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIG1hcmtlclByb3BzLnR5cGUsIG1hcmtlclByb3BzLnNpemUsIG1hcmtlckNvbG9yLCBtYXJrZXJDb2xvciwgbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzKTtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcImJ1YmJsZVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IDEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHggLSBtYXJrZXJQcm9wcy5zaXplIC8gMiwgeTE6IHkgLSBtYXJrZXJQcm9wcy5zaXplIC8gMiwgeDI6IHggKyBtYXJrZXJQcm9wcy5zaXplIC8gMiwgeTI6IHkgKyBtYXJrZXJQcm9wcy5zaXplIC8gMlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y3R4LnJlc3RvcmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci5mYWRlSW5BbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VJblF1YWQsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBpID0gMCwgeCwgeTEsIHkyLCB5MywgeTQ7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiAodGhpcy53aWR0aCAqIC4wMTUpO1xuXHR2YXIgeE1pbkRpZmYgPSBwbG90VW5pdC5heGlzWC5kYXRhSW5mby5taW5EaWZmO1xuXHR2YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS53aWR0aCAvIE1hdGguYWJzKHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWF4aW11bSAtIHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkpICogTWF0aC5hYnMoeE1pbkRpZmYpKSAqIC43KSA8PCAwO1xuXG5cdGlmIChiYXJXaWR0aCA+IG1heEJhcldpZHRoKVxuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdGVsc2UgaWYgKHhNaW5EaWZmID09PSBJbmZpbml0eSkge1xuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0Ly8gUmVkdWNpbmcgcGl4ZWxQZXJVbml0IGJ5IDEganVzdCB0byBvdmVyY29tZSBhbnkgcHJvYmxlbXMgZHVlIHRvIHJvdW5kaW5nIG9mZiBvZiBwaXhlbHMuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0Ly92YXIgb2Zmc2V0WCA9IGJhcldpZHRoICogcGxvdFVuaXQuaW5kZXggPDwgMDtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA9PT0gbnVsbCB8fCAhZGF0YVBvaW50c1tpXS55Lmxlbmd0aFxuXHRcdFx0XHRcdHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCJcblx0XHRcdFx0XHR8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsyXSkgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIChkYXRhUG9pbnRzW2ldLnlbM10pICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzBdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eTIgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueVsxXSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0eTMgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueVsyXSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHk0ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbM10gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHZhciB4MSA9ICh4IC0gYmFyV2lkdGggLyAyKSA8PCAwO1xuXHRcdFx0XHR2YXIgeDIgPSAoeDEgKyBiYXJXaWR0aCkgPDwgMDtcblxuXG5cdFx0XHRcdGNvbG9yID0gZGF0YVBvaW50c1tpXS5jb2xvciA/IGRhdGFQb2ludHNbaV0uY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFswXTtcblxuXG5cdFx0XHRcdC8vdmFyIGJvcmRlclRoaWNrbmVzcyA9IE1hdGgubWF4KDIsICgoYmFyV2lkdGggKiAuMSkgLyAyIDw8IDApICogMik7IC8vIFNldCBvbmx5IGV2ZW4gbnVtYmVycyBmb3IgYm9yZGVyXG5cdFx0XHRcdHZhciBib3JkZXJUaGlja25lc3MgPSBNYXRoLnJvdW5kKE1hdGgubWF4KDEsIChiYXJXaWR0aCAqIC4xNSkpKTtcblx0XHRcdFx0Ly9ib3JkZXJUaGlja25lc3MgPSAoYm9yZGVyVGhpY2tuZXNzIC8gMiA8PCAwKSAqIDI7XG5cdFx0XHRcdC8vYm9yZGVyVGhpY2tuZXNzID0gMjtcblx0XHRcdFx0dmFyIG9mZnNldCA9IGJvcmRlclRoaWNrbmVzcyAlIDIgPT09IDAgPyAwIDogLjU7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5Mixcblx0XHRcdFx0XHR4MzogeCwgeTM6IHkzLCB4NDogeCwgeTQ6IHk0LCBib3JkZXJUaGlja25lc3M6IGJvcmRlclRoaWNrbmVzcywgY29sb3I6IGNvbG9yXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGJvcmRlclRoaWNrbmVzcztcblx0XHRcdFx0Z2hvc3RDdHgubGluZVdpZHRoID0gTWF0aC5tYXgoYm9yZGVyVGhpY2tuZXNzLCA0KTtcblxuXHRcdFx0XHRpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIpIHtcblxuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgeTIpO1xuXHRcdFx0XHRcdGN0eC5saW5lVG8oeCAtIG9mZnNldCwgTWF0aC5taW4oeTEsIHk0KSk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgTWF0aC5tYXgoeTEsIHk0KSk7XG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4IC0gb2Zmc2V0LCB5Myk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgTWF0aC5taW4oeTEsIHk0KSwgeDIsIE1hdGgubWF4KHkxLCB5NCksIGRhdGFQb2ludHNbaV0ueVswXSA8PSBkYXRhUG9pbnRzW2ldLnlbM10gPyBkYXRhU2VyaWVzLnJpc2luZ0NvbG9yIDogY29sb3IsIGJvcmRlclRoaWNrbmVzcywgY29sb3IsIGJldmVsRW5hYmxlZCwgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHkpO1xuXG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgeTIpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHggLSBvZmZzZXQsIE1hdGgubWluKHkxLCB5NCkpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgTWF0aC5tYXgoeTEsIHk0KSk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeCAtIG9mZnNldCwgeTMpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRkcmF3UmVjdChnaG9zdEN0eCwgeDEsIE1hdGgubWluKHkxLCB5NCksIHgyLCBNYXRoLm1heCh5MSwgeTQpLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwib2hsY1wiKSB7XG5cblx0XHRcdFx0XHRjdHgubW92ZVRvKHggLSBvZmZzZXQsIHkyKTtcblx0XHRcdFx0XHRjdHgubGluZVRvKHggLSBvZmZzZXQsIHkzKTtcblx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4LCB5MSk7XG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4MSwgeTEpO1xuXHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHk0KTtcblx0XHRcdFx0XHRjdHgubGluZVRvKHgyLCB5NCk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCAtIG9mZnNldCwgeTIpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHggLSBvZmZzZXQsIHkzKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5MSk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeDEsIHkxKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5NCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeDIsIHk0KTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBkYXRhU2VyaWVzLnR5cGUsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeDEgKyAoeDIgLSB4MSkgLyAyLCB5OiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogeDEsIHkxOiBNYXRoLm1pbih5MiwgeTMpLCB4MjogeDIsIHkyOiBNYXRoLm1heCh5MiwgeTMpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdGdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci5mYWRlSW5BbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VJblF1YWQsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCBBbmltYXRpb25IZWxwZXIgZnJvbSAnLi4vaGVscGVycy9hbmltYXRvcic7XG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkLCBkcmF3UmVjdCwgaW50VG9IZXhDb2xvclN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiBNYXRoLm1pbigodGhpcy53aWR0aCAqIC4xNSksIHRoaXMucGxvdEFyZWEud2lkdGggLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0Ly8gUmVkdWNpbmcgcGl4ZWxQZXJVbml0IGJ5IDEganVzdCB0byBvdmVyY29tZSBhbnkgcHJvYmxlbXMgZHVlIHRvIHJvdW5kaW5nIG9mZiBvZiBwaXhlbHMuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0Ly92YXIgb2Zmc2V0WCA9IGJhcldpZHRoICogcGxvdFVuaXQuaW5kZXggPDwgMDtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHR2YXIgeDEgPSB4IC0gKHBsb3RVbml0LnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcyAqIGJhcldpZHRoIC8gMikgKyAoKHBsb3RVbml0LnByZXZpb3VzRGF0YVNlcmllc0NvdW50ICsgaikgKiBiYXJXaWR0aCkgPDwgMDtcblx0XHRcdFx0dmFyIHgyID0geDEgKyBiYXJXaWR0aCA8PCAwO1xuXHRcdFx0XHR2YXIgeTE7XG5cdFx0XHRcdHZhciB5MjtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS55ID49IDApIHtcblx0XHRcdFx0XHR5MSA9IHk7XG5cblx0XHRcdFx0XHR5MiA9IHlaZXJvVG9QaXhlbDtcblxuXHRcdFx0XHRcdGlmICh5MSA+IHkyKSB7XG5cdFx0XHRcdFx0XHR2YXIgdGVtcCA9IHkxO1xuXHRcdFx0XHRcdFx0eTEgPSB5Mjtcblx0XHRcdFx0XHRcdHkyID0geTE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eTIgPSB5O1xuXG5cdFx0XHRcdFx0eTEgPSB5WmVyb1RvUGl4ZWw7XG5cblx0XHRcdFx0XHRpZiAoeTEgPiB5Mikge1xuXHRcdFx0XHRcdFx0dmFyIHRlbXAgPSB5MTtcblx0XHRcdFx0XHRcdHkxID0geTI7XG5cdFx0XHRcdFx0XHR5MiA9IHkxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yID0gZGF0YVBvaW50c1tpXS5jb2xvciA/IGRhdGFQb2ludHNbaV0uY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCAmJiAoZGF0YVBvaW50c1tpXS55ID49IDApLCAoZGF0YVBvaW50c1tpXS55IDwgMCkgJiYgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHkpO1xuXG5cdFx0XHRcdC8vaWYgKGRhdGFTZXJpZXMubWFya2VyVHlwZSAmJiBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cdFx0XHRcdC8vICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VyKHgxICsgKHgyIC0geDEpIC8gMiwgeSwgY3R4LCBkYXRhU2VyaWVzLm1hcmtlclR5cGUsIGRhdGFTZXJpZXMubWFya2VyU2l6ZSwgY29sb3IsIGRhdGFTZXJpZXMubWFya2VyQm9yZGVyQ29sb3IsIGRhdGFTZXJpZXMubWFya2VyQm9yZGVyVGhpY2tuZXNzID8gZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgOiAxKTtcblx0XHRcdFx0Ly99XG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0ZHJhd1JlY3QodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJjb2x1bW5cIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4MSArICh4MiAtIHgxKSAvIDIsIHk6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geTEgOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHgxLCB5MTogTWF0aC5taW4oeTEsIHkyKSwgeDI6IHgyLCB5MjogTWF0aC5tYXgoeTEsIHkyKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkJhc2UgPSBNYXRoLm1pbih5WmVyb1RvUGl4ZWwsIHBsb3RVbml0LmF4aXNZLmJvdW5kaW5nUmVjdC55Mik7XG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci55U2NhbGVBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VPdXRRdWFydCwgYW5pbWF0aW9uQmFzZTogYW5pbWF0aW9uQmFzZVxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsImV4cG9ydCBTcGxpbmVDaGFydCBmcm9tICcuLi9jaGFydHMvc3BsaW5lJztcbmV4cG9ydCBDb2x1bW5DaGFydCBmcm9tICcuLi9jaGFydHMvY29sdW1uJztcbmV4cG9ydCBTdGFja2VkQ29sdW1uQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3N0YWNrZWRfY29sdW1uJztcbmV4cG9ydCBTdGFja2VkQ29sdW1uMTAwQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3N0YWNrZWRfY29sdW1uXzEwMCc7XG5leHBvcnQgQmFyQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL2Jhcic7XG5leHBvcnQgU3RhY2tlZEJhckNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zdGFja2VkX2Jhcic7XG5leHBvcnQgU3RhY2tlZEJhcjEwMENoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zdGFja2VkX2Jhcl8xMDAnO1xuZXhwb3J0IEFyZWFDaGFydCBmcm9tICcuLi9jaGFydHMvYXJlYSc7XG5leHBvcnQgU3BsaW5lQXJlYUNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zcGxpbmVfYXJlYSc7XG5leHBvcnQgU3RlcEFyZWFDaGFydCBmcm9tICcuLi9jaGFydHMvc3RlcF9hcmVhJztcbmV4cG9ydCBTdGFja2VkQXJlYUNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9zdGFja2VkX2FyZWEnO1xuZXhwb3J0IFN0YWNrZWRBcmVhMTAwQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3N0YWNrZWRfYXJlYV8xMDAnO1xuZXhwb3J0IEJ1YmJsZUNoYXJ0IGZyb20gJy4uL2NoYXJ0cy9idWJibGUnO1xuZXhwb3J0IFNjYXR0ZXJDaGFydCBmcm9tICcuLi9jaGFydHMvc2NhdHRlcic7XG5leHBvcnQgQ2FuZGxlc3RpY2tDaGFydCBmcm9tICcuLi9jaGFydHMvY2FuZGxlc3RpY2snO1xuZXhwb3J0IFJhbmdlQ29sdW1uQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3JhbmdlX2NvbHVtbic7XG5leHBvcnQgUmFuZ2VCYXJDaGFydCBmcm9tICcuLi9jaGFydHMvcmFuZ2VfYmFyJztcbmV4cG9ydCBSYW5nZUFyZWFDaGFydCBmcm9tICcuLi9jaGFydHMvcmFuZ2VfYXJlYSc7XG5leHBvcnQgUmFuZ2VTcGxpbmVBcmVhQ2hhcnQgZnJvbSAnLi4vY2hhcnRzL3JhbmdlX3NwbGluZV9hcmVhJztcbmV4cG9ydCBQaWVDaGFydCBmcm9tICcuLi9jaGFydHMvcGllJztcbiIsIlxuaW1wb3J0IFRleHRCbG9jayBmcm9tICcuLi9jb3JlL3RleHRfYmxvY2snO1xuaW1wb3J0IHtjb252ZXJ0UGVyY2VudFRvVmFsdWUsIGlzQ2FudmFzU3VwcG9ydGVkLCBkcmF3U2VnbWVudCwgZ2V0TGluZURhc2hBcnJheX0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXG5cdHZhciBfdGhpcyA9IHRoaXM7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbMF07XG5cdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHR2YXIgaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoID0gMTA7XG5cdHZhciBleHBsb2RlRHVyYXRpb24gPSA1MDA7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHQvL3ZhciBtYXhGcmFtZSA9IGlzQ2FudmFzU3VwcG9ydGVkID8gMzAwIDogNDtcblx0Ly92YXIgdG90YWxSZWN1cnNpb25zID0gMDtcblx0dmFyIGRhdGFQb2ludEVPcyA9IFtdOyAvL2RhdGFQb2ludCBFeHRlbnNpb24gT2JqZWN0cyBCZWhhdmVzIGxpa2UgYSBzdG9yYWdlIHBsYWNlIGZvciBhbGwgYWRkaXRpb25hbCBkYXRhIHJlbGF0aW5nIHRvIGRhdGFQb2ludHMuIFJlcXVyZWQgYmVjYXVzZSBhY3R1YWwgZGF0YVBvaW50cyBzaG91bGQgbm90IGJlIG1vZGlmaWVkLlxuXG5cdHZhciBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHMgPSAyO1xuXHR2YXIgaW5kZXhMYWJlbFJhZGl1c1RvUmFkaXVzUmF0aW8gPSAxLjM7XG5cdHZhciBwb2xlQW5nbHVsYXJEaXN0YW5jZSA9ICgyMCAvIDE4MCkgKiBNYXRoLlBJOyAvL0FuZ2x1bGFyIERpc3RhbmNlIGZyb20gOTAgJiAyNzAgdG8gYmUgY29uc2lkZXJlZCBwb2xlXG5cdHZhciBwcmVjaXNpb24gPSA2O1xuXG5cdHZhciBjZW50ZXIgPSB7XG5cdFx0eDogKHBsb3RBcmVhLngyICsgcGxvdEFyZWEueDEpIC8gMiwgeTogKHBsb3RBcmVhLnkyICsgcGxvdEFyZWEueTEpIC8gMlxuXHR9O1xuXG5cdHZhciBzdW0gPSAwO1xuXHR2YXIgaXNJbmRleExhYmVsUHJlc2VudCA9IGZhbHNlO1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFQb2ludHMubGVuZ3RoOyBqKyspIHtcblx0XHRzdW0gKz0gTWF0aC5hYnMoZGF0YVBvaW50c1tqXS55KTtcblxuXHRcdGlmICghaXNJbmRleExhYmVsUHJlc2VudCAmJiB0eXBlb2YgKGRhdGFQb2ludHNbal0uaW5kZXhMYWJlbCkgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YVBvaW50c1tqXS5pbmRleExhYmVsICE9PSBudWxsICYmIGRhdGFQb2ludHNbal0uaW5kZXhMYWJlbC50b1N0cmluZygpLmxlbmd0aCA+IDApXG5cdFx0XHRpc0luZGV4TGFiZWxQcmVzZW50ID0gdHJ1ZTtcblxuXHRcdGlmICghaXNJbmRleExhYmVsUHJlc2VudCAmJiB0eXBlb2YgKGRhdGFQb2ludHNbal0ubGFiZWwpICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGFQb2ludHNbal0ubGFiZWwgIT09IG51bGwgJiYgZGF0YVBvaW50c1tqXS5sYWJlbC50b1N0cmluZygpLmxlbmd0aCA+IDApXG5cdFx0XHRpc0luZGV4TGFiZWxQcmVzZW50ID0gdHJ1ZTtcblx0fVxuXG5cdGlmIChzdW0gPT09IDApXG5cdFx0cmV0dXJuO1xuXG5cdGlzSW5kZXhMYWJlbFByZXNlbnQgPSBpc0luZGV4TGFiZWxQcmVzZW50IHx8ICh0eXBlb2YgKGRhdGFTZXJpZXMuaW5kZXhMYWJlbCkgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YVNlcmllcy5pbmRleExhYmVsICE9PSBudWxsICYmIGRhdGFTZXJpZXMuaW5kZXhMYWJlbC50b1N0cmluZygpLmxlbmd0aCA+IDApO1xuXG5cdHZhciBvdXRlclJhZGl1cyA9IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIiAmJiBpc0luZGV4TGFiZWxQcmVzZW50ID8gKE1hdGgubWluKHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpICogMC43NSkgLyAyIDogKE1hdGgubWluKHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpICogLjkyKSAvIDI7XG5cblx0aWYgKGRhdGFTZXJpZXMucmFkaXVzKVxuXHRcdG91dGVyUmFkaXVzID0gY29udmVydFBlcmNlbnRUb1ZhbHVlKGRhdGFTZXJpZXMucmFkaXVzLCBvdXRlclJhZGl1cyk7XG5cblxuXHR2YXIgaW5uZXJSYWRpdXMgPSAodHlwZW9mIGRhdGFTZXJpZXMuaW5uZXJSYWRpdXMgIT09ICd1bmRlZmluZWQnICYmIGRhdGFTZXJpZXMuaW5uZXJSYWRpdXMgIT09IG51bGwpID8gY29udmVydFBlcmNlbnRUb1ZhbHVlKGRhdGFTZXJpZXMuaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzKSA6IDAuNyAqIG91dGVyUmFkaXVzO1xuXG5cdHZhciBwZXJjZW50SW5uZXJSYWRpdXMgPSBNYXRoLm1pbihpbm5lclJhZGl1cyAvIG91dGVyUmFkaXVzLCAob3V0ZXJSYWRpdXMgLSAxKSAvIG91dGVyUmFkaXVzKTtcblxuXHRmdW5jdGlvbiBpbml0TGFiZWxzKCkge1xuXG5cdFx0aWYgKCFkYXRhU2VyaWVzIHx8ICFkYXRhUG9pbnRzKVxuXHRcdFx0cmV0dXJuO1xuXG5cblx0XHR2YXIgbm9EUE5lYXJTb3V0aFBvbGUgPSAwO1xuXHRcdHZhciBub0RQTmVhck5vcnRoUG9sZSA9IDA7XG5cdFx0dmFyIGZpcnN0RFBDbG9zZVRvU291dGggPSAwO1xuXHRcdHZhciBmaXJzdERQQ2xvc2VUb05vcnRoID0gMDtcblxuXHRcdGZvciAoaiA9IDA7IGogPCBkYXRhUG9pbnRzLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdHZhciBkYXRhUG9pbnQgPSBkYXRhUG9pbnRzW2pdO1xuXHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbal07XG5cblx0XHRcdHZhciBkYXRhUG9pbnRFTyA9IHtcblx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhUG9pbnRJbmRleDogaiwgZGF0YVNlcmllc0luZGV4OiAwXG5cdFx0XHR9O1xuXHRcdFx0ZGF0YVBvaW50RU9zLnB1c2goZGF0YVBvaW50RU8pO1xuXG5cdFx0XHR2YXIgcGVyY2VudEFuZFRvdGFsID0ge1xuXHRcdFx0XHRwZXJjZW50OiBudWxsLCB0b3RhbDogbnVsbFxuXHRcdFx0fTtcblx0XHRcdHZhciBmb3JtYXR0ZXJQYXJhbWV0ZXIgPSBudWxsO1xuXG5cdFx0XHRwZXJjZW50QW5kVG90YWwgPSBfdGhpcy5nZXRQZXJjZW50QW5kVG90YWwoZGF0YVNlcmllcywgZGF0YVBvaW50KTtcblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvcm1hdHRlcilcblx0XHRcdFx0Zm9ybWF0dGVyUGFyYW1ldGVyID0ge1xuXHRcdFx0XHRcdGNoYXJ0OiBfdGhpcy5fb3B0aW9ucywgZGF0YVNlcmllczogZGF0YVNlcmllcywgZGF0YVBvaW50OiBkYXRhUG9pbnQsIHRvdGFsOiBwZXJjZW50QW5kVG90YWwudG90YWwsIHBlcmNlbnQ6IHBlcmNlbnRBbmRUb3RhbC5wZXJjZW50XG5cdFx0XHRcdH07XG5cblx0XHRcdHZhciBpbmRleExhYmVsVGV4dCA9IGRhdGFQb2ludC5pbmRleExhYmVsRm9ybWF0dGVyID8gZGF0YVBvaW50LmluZGV4TGFiZWxGb3JtYXR0ZXIoZm9ybWF0dGVyUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBkYXRhUG9pbnQuaW5kZXhMYWJlbCA/IF90aGlzLnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZShkYXRhUG9pbnQuaW5kZXhMYWJlbCwgZGF0YVBvaW50LCBkYXRhU2VyaWVzLCBqKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIgPyBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIoZm9ybWF0dGVyUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBkYXRhU2VyaWVzLmluZGV4TGFiZWwgPyBfdGhpcy5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUoZGF0YVNlcmllcy5pbmRleExhYmVsLCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGopIDogZGF0YVBvaW50LmxhYmVsID8gZGF0YVBvaW50LmxhYmVsIDogJyc7XG5cblxuXHRcdFx0X3RoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0gZGF0YVBvaW50RU87XG5cblx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHQgPSBqLnRvU3RyaW5nKCkgKyBcIiBcIiArIFwia2luZ2Zpc2hlcjogXCIgKyBkYXRhUG9pbnQueS50b1N0cmluZygpOztcblx0XHRcdGRhdGFQb2ludEVPLmNlbnRlciA9IHtcblx0XHRcdFx0eDogY2VudGVyLngsIHk6IGNlbnRlci55XG5cdFx0XHR9O1xuXHRcdFx0ZGF0YVBvaW50RU8ueSA9IGRhdGFQb2ludC55O1xuXHRcdFx0ZGF0YVBvaW50RU8ucmFkaXVzID0gb3V0ZXJSYWRpdXM7XG5cdFx0XHRkYXRhUG9pbnRFTy5wZXJjZW50SW5uZXJSYWRpdXMgPSBwZXJjZW50SW5uZXJSYWRpdXM7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dCA9IGluZGV4TGFiZWxUZXh0O1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFBsYWNlbWVudCA9IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFBsYWNlbWVudDtcblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxMaW5lQ29sb3IgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbExpbmVDb2xvciA/IGRhdGFQb2ludC5pbmRleExhYmVsTGluZUNvbG9yIDogZGF0YVNlcmllcy5pbmRleExhYmVsTGluZUNvbG9yID8gZGF0YVNlcmllcy5pbmRleExhYmVsTGluZUNvbG9yIDogZGF0YVBvaW50LmNvbG9yID8gZGF0YVBvaW50LmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaiAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZVRoaWNrbmVzcyA9IGRhdGFQb2ludC5pbmRleExhYmVsTGluZVRoaWNrbmVzcyA/IGRhdGFQb2ludC5pbmRleExhYmVsTGluZVRoaWNrbmVzcyA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbExpbmVUaGlja25lc3M7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZURhc2hUeXBlID0gZGF0YVBvaW50LmluZGV4TGFiZWxMaW5lRGFzaFR5cGUgPyBkYXRhUG9pbnQuaW5kZXhMYWJlbExpbmVEYXNoVHlwZSA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbExpbmVEYXNoVHlwZTtcblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250Q29sb3IgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRDb2xvciA/IGRhdGFQb2ludC5pbmRleExhYmVsRm9udENvbG9yIDogZGF0YVNlcmllcy5pbmRleExhYmVsRm9udENvbG9yO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRTdHlsZSA9IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFN0eWxlID8gZGF0YVBvaW50LmluZGV4TGFiZWxGb250U3R5bGUgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb250U3R5bGU7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFdlaWdodCA9IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFdlaWdodCA/IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFdlaWdodCA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvbnRXZWlnaHQ7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFNpemUgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRTaXplID8gZGF0YVBvaW50LmluZGV4TGFiZWxGb250U2l6ZSA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvbnRTaXplO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRGYW1pbHkgPSBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRGYW1pbHkgPyBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvbnRGYW1pbHkgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb250RmFtaWx5O1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvciA9IGRhdGFQb2ludC5pbmRleExhYmVsQmFja2dyb3VuZENvbG9yID8gZGF0YVBvaW50LmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IgPyBkYXRhU2VyaWVzLmluZGV4TGFiZWxCYWNrZ3JvdW5kQ29sb3IgOiBudWxsO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbE1heFdpZHRoID0gZGF0YVBvaW50LmluZGV4TGFiZWxNYXhXaWR0aCA/IGRhdGFQb2ludC5pbmRleExhYmVsTWF4V2lkdGggOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxNYXhXaWR0aCA/IGRhdGFTZXJpZXMuaW5kZXhMYWJlbE1heFdpZHRoIDogcGxvdEFyZWEud2lkdGggKiAuMzM7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsV3JhcCA9IHR5cGVvZiAoZGF0YVBvaW50LmluZGV4TGFiZWxXcmFwKSAhPT0gXCJ1bmRlZmluZWRcIiA/IGRhdGFQb2ludC5pbmRleExhYmVsV3JhcCA6IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFdyYXA7XG5cblx0XHRcdGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUgPSBqID09PSAwID8gZGF0YVNlcmllcy5zdGFydEFuZ2xlID8gKGRhdGFTZXJpZXMuc3RhcnRBbmdsZSAvIDE4MCkgKiBNYXRoLlBJIDogMCA6IGRhdGFQb2ludEVPc1tqIC0gMV0uZW5kQW5nbGU7XG5cblx0XHRcdGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUgPSAoZGF0YVBvaW50RU8uc3RhcnRBbmdsZSArICgyICogTWF0aC5QSSkpICUgKDIgKiBNYXRoLlBJKTtcblxuXHRcdFx0ZGF0YVBvaW50RU8uZW5kQW5nbGUgPSBkYXRhUG9pbnRFTy5zdGFydEFuZ2xlICsgKCgyICogTWF0aC5QSSAvIHN1bSkgKiBNYXRoLmFicyhkYXRhUG9pbnQueSkpO1xuXG5cdFx0XHQvL3ZhciBtaWRBbmdsZSA9IGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUgKyBNYXRoLmFicyhkYXRhUG9pbnRFTy5lbmRBbmdsZSAtIGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUpIC8gMjtcblx0XHRcdHZhciBtaWRBbmdsZSA9IChkYXRhUG9pbnRFTy5lbmRBbmdsZSArIGRhdGFQb2ludEVPLnN0YXJ0QW5nbGUpIC8gMjtcblxuXHRcdFx0Ly92YXIgbWlkQW5nbGUgPSAoMTgwIC8gTWF0aC5QSSAqIG1pZEFuZ2xlKTtcblxuXHRcdFx0bWlkQW5nbGUgPSAobWlkQW5nbGUgKyAoMiAqIE1hdGguUEkpKSAlICgyICogTWF0aC5QSSk7XG5cblx0XHRcdGRhdGFQb2ludEVPLm1pZEFuZ2xlID0gbWlkQW5nbGU7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRFTy5taWRBbmdsZSA+IChNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8IChNYXRoLlBJIC8gMikgKyBwb2xlQW5nbHVsYXJEaXN0YW5jZSkge1xuXHRcdFx0XHRpZiAobm9EUE5lYXJTb3V0aFBvbGUgPT09IDAgfHwgZGF0YVBvaW50RU9zW2ZpcnN0RFBDbG9zZVRvU291dGhdLm1pZEFuZ2xlID4gZGF0YVBvaW50RU8ubWlkQW5nbGUpXG5cdFx0XHRcdFx0Zmlyc3REUENsb3NlVG9Tb3V0aCA9IGo7XG5cblx0XHRcdFx0bm9EUE5lYXJTb3V0aFBvbGUrKztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGRhdGFQb2ludEVPLm1pZEFuZ2xlID4gKDMgKiBNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8ICgzICogTWF0aC5QSSAvIDIpICsgcG9sZUFuZ2x1bGFyRGlzdGFuY2UpIHtcblx0XHRcdFx0aWYgKG5vRFBOZWFyTm9ydGhQb2xlID09PSAwIHx8IGRhdGFQb2ludEVPc1tmaXJzdERQQ2xvc2VUb05vcnRoXS5taWRBbmdsZSA+IGRhdGFQb2ludEVPLm1pZEFuZ2xlKVxuXHRcdFx0XHRcdGZpcnN0RFBDbG9zZVRvTm9ydGggPSBqO1xuXG5cdFx0XHRcdG5vRFBOZWFyTm9ydGhQb2xlKys7XG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKG1pZEFuZ2xlID4gKE1hdGguUEkgLyAyKSAmJiBtaWRBbmdsZSA8PSAoMyAqIE1hdGguUEkgLyAyKSlcblx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwibGVmdFwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID0gXCJyaWdodFwiO1xuXG5cdFx0XHQvL2RhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0ID0gai50b1N0cmluZygpICsgXCI7IFwiICsgZGF0YVBvaW50LnkudG9TdHJpbmcoKSArIFwiOyBcIiArIG1pZEFuZ2xlLnRvU3RyaW5nKCkgKyBcIjsganVua1wiO1xuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2soX3RoaXMucGxvdEFyZWEuY3R4LCB7XG5cdFx0XHRcdGZvbnRTaXplOiBkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFNpemUsIGZvbnRGYW1pbHk6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250RmFtaWx5LCBmb250Q29sb3I6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250Q29sb3IsXG5cdFx0XHRcdGZvbnRTdHlsZTogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRTdHlsZSwgZm9udFdlaWdodDogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRXZWlnaHQsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogXCJsZWZ0XCIsXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0bWF4V2lkdGg6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxNYXhXaWR0aCwgbWF4SGVpZ2h0OiBkYXRhUG9pbnRFTy5pbmRleExhYmVsV3JhcCA/IGRhdGFQb2ludEVPLmluZGV4TGFiZWxGb250U2l6ZSAqIDUgOiBkYXRhUG9pbnRFTy5pbmRleExhYmVsRm9udFNpemUgKiAxLjUsXG5cdFx0XHRcdHRleHQ6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0LFxuXHRcdFx0XHRwYWRkaW5nOiAwLFxuXHRcdFx0XHQvL3RleHRCYXNlbGluZTogZGF0YVBvaW50RU8uaW5kZXhMYWJlbEJhY2tncm91bmRDb2xvciA/IFwibWlkZGxlXCIgOiBcInRvcFwiXG5cdFx0XHRcdHRleHRCYXNlbGluZTogXCJ0b3BcIlxuXHRcdFx0fSk7XG5cblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblxuXHRcdFx0Ly9kYXRhUG9pbnQubGFiZWxXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChqLnRvU3RyaW5nKCkgKyBcIjsgXCIgKyBkYXRhUG9pbnQubGFiZWwpLndpZHRoO1xuXG5cdFx0XHQvL2NvbnNvbGUubG9nKGRhdGFQb2ludC5sYWJlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIG5vT2ZEUFRvUmlnaHRPZlNvdXRoUG9sZSA9IDA7XG5cdFx0dmFyIG5vT2ZEUFRvTGVmdE9mTm9ydGhQb2xlID0gMDtcblx0XHR2YXIga2VlcFNhbWVEaXJlY3Rpb24gPSBmYWxzZTsgLy8gb25jZSBhIGRhdGFQb2ludCdzIGhlbWlzcGhlcmUgaXMgY2hhbmdlZCwgb3RoZXJzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgc28gdGhhdCB0aGVyZSBhcmUgbm8gbGFiZXMgbmVhciBwb2xlIHBvaW50aW5nIGluIG9wcG9zaXRlIGRpcmVjdGlvbi5cblxuXHRcdGZvciAoaiA9IDA7IGogPCBkYXRhUG9pbnRzLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdHZhciBkYXRhUG9pbnRFTyA9IGRhdGFQb2ludEVPc1soZmlyc3REUENsb3NlVG9Tb3V0aCArIGopICUgZGF0YVBvaW50cy5sZW5ndGhdO1xuXG5cdFx0XHRpZiAobm9EUE5lYXJTb3V0aFBvbGUgPiAxICYmIGRhdGFQb2ludEVPLm1pZEFuZ2xlID4gKE1hdGguUEkgLyAyKSAtIHBvbGVBbmdsdWxhckRpc3RhbmNlICYmIGRhdGFQb2ludEVPLm1pZEFuZ2xlIDwgKE1hdGguUEkgLyAyKSArIHBvbGVBbmdsdWxhckRpc3RhbmNlKSB7XG5cblx0XHRcdFx0aWYgKG5vT2ZEUFRvUmlnaHRPZlNvdXRoUG9sZSA8PSBub0RQTmVhclNvdXRoUG9sZSAvIDIgJiYgIWtlZXBTYW1lRGlyZWN0aW9uKSB7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwicmlnaHRcIjtcblx0XHRcdFx0XHRub09mRFBUb1JpZ2h0T2ZTb3V0aFBvbGUrKztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID0gXCJsZWZ0XCI7XG5cdFx0XHRcdFx0a2VlcFNhbWVEaXJlY3Rpb24gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0a2VlcFNhbWVEaXJlY3Rpb24gPSBmYWxzZTtcblx0XHRmb3IgKGogPSAwOyBqIDwgZGF0YVBvaW50cy5sZW5ndGg7IGorKykge1xuXG5cdFx0XHR2YXIgZGF0YVBvaW50RU8gPSBkYXRhUG9pbnRFT3NbKGZpcnN0RFBDbG9zZVRvTm9ydGggKyBqKSAlIGRhdGFQb2ludHMubGVuZ3RoXTtcblxuXHRcdFx0Ly9pZiAoZGF0YVBvaW50LmhlbWlzcGhlcmUgPSBcInJpZ2h0XCIpXG5cdFx0XHQvL1x0YnJlYWs7XG5cblx0XHRcdGlmIChub0RQTmVhck5vcnRoUG9sZSA+IDEgJiYgZGF0YVBvaW50RU8ubWlkQW5nbGUgPiAoMyAqIE1hdGguUEkgLyAyKSAtIHBvbGVBbmdsdWxhckRpc3RhbmNlICYmIGRhdGFQb2ludEVPLm1pZEFuZ2xlIDwgKDMgKiBNYXRoLlBJIC8gMikgKyBwb2xlQW5nbHVsYXJEaXN0YW5jZSkge1xuXG5cdFx0XHRcdGlmIChub09mRFBUb0xlZnRPZk5vcnRoUG9sZSA8PSBub0RQTmVhck5vcnRoUG9sZSAvIDIgJiYgIWtlZXBTYW1lRGlyZWN0aW9uKSB7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwibGVmdFwiO1xuXHRcdFx0XHRcdG5vT2ZEUFRvTGVmdE9mTm9ydGhQb2xlKys7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9IFwicmlnaHRcIjtcblx0XHRcdFx0XHRrZWVwU2FtZURpcmVjdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0vL0VuZCBvZiBpbml0TGFiZWxzKClcblxuXHRmdW5jdGlvbiByZW5kZXJMYWJlbHMoKSB7XG5cblx0XHR2YXIgY3R4ID0gX3RoaXMucGxvdEFyZWEuY3R4O1xuXHRcdGN0eC5maWxsU3R5bGUgPSBcImJsYWNrXCI7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gXCJncmV5XCI7XG5cdFx0dmFyIGZvbnRTaXplID0gMTY7XG5cdFx0Ly9jdHguZm9udCA9IGZvbnRTaXplICsgXCJweCBBcmlhbFwiO1xuXHRcdGN0eC50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiO1xuXHRcdGN0eC5saW5lSm9pbiA9IFwicm91bmRcIjtcblx0XHR2YXIgaSA9IDAsIGogPSAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBkYXRhUG9pbnRFTyA9IGRhdGFQb2ludEVPc1tpXTtcblxuXHRcdFx0aWYgKCFkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dClcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtPSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDI7XG5cblx0XHRcdHZhciB4T2Zmc2V0ID0gMDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiKSB7XG5cdFx0XHRcdHZhciB4T2Zmc2V0ID0gZGF0YVNlcmllcy5pbmRleExhYmVsUGxhY2VtZW50ICE9PSBcImluc2lkZVwiID8gLShkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoICsgaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoKSA6IC1kYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoIC8gMjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR2YXIgeE9mZnNldCA9IGRhdGFTZXJpZXMuaW5kZXhMYWJlbFBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIiA/IGluZGV4TGFiZWxMaW5lRWRnZUxlbmd0aCA6IC1kYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLndpZHRoIC8gMjtcblx0XHRcdH1cblxuXHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ICs9IHhPZmZzZXQ7XG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtPSB4T2Zmc2V0O1xuXG5cdFx0XHQvL2lmIChpIDwgNClcblx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoaSArIFwiOyBcIiArIGNlbnRlci55ICsgXCI7IFwiICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55LnRvRml4ZWQoMikpO1xuXG5cdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKz0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIikge1xuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbExpbmVTdGFydFggPSBkYXRhUG9pbnRFTy5jZW50ZXIueCArIG91dGVyUmFkaXVzICogTWF0aC5jb3MoZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbExpbmVTdGFydFkgPSBkYXRhUG9pbnRFTy5jZW50ZXIueSArIG91dGVyUmFkaXVzICogTWF0aC5zaW4oZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXG5cdFx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gZGF0YVBvaW50c1tpXS5jb2xvciA/IGRhdGFQb2ludHNbaV0uY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbExpbmVDb2xvcjtcblx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFQb2ludEVPLmluZGV4TGFiZWxMaW5lVGhpY2tuZXNzO1xuXG5cdFx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZURhc2hUeXBlLCBkYXRhUG9pbnRFTy5pbmRleExhYmVsTGluZVRoaWNrbmVzcykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly9jdHgubGluZVdpZHRoID0gNDtcblx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRjdHgubW92ZVRvKGluZGV4TGFiZWxMaW5lU3RhcnRYLCBpbmRleExhYmVsTGluZVN0YXJ0WSk7XG5cdFx0XHRcdGN0eC5saW5lVG8oZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54LCBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkpO1xuXHRcdFx0XHRjdHgubGluZVRvKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCArIChkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcImxlZnRcIiA/IC1pbmRleExhYmVsTGluZUVkZ2VMZW5ndGggOiBpbmRleExhYmVsTGluZUVkZ2VMZW5ndGgpLCBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkpO1xuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdC8vY3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHQvL3dpbmRvdy5hbGVydChcImNvbnRpbmU/P1wiKTtcblx0XHRcdFx0Ly9hbmltYXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5saW5lSm9pbiA9IFwibWl0ZXJcIjtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBhbmltYXRlKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdHZhciBjdHggPSBfdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHRjdHguY2xlYXJSZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IF90aGlzLmJhY2tncm91bmRDb2xvcjtcblx0XHRjdHguZmlsbFJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblxuXHRcdHZhciBtYXhBbmdsZSA9IGRhdGFQb2ludEVPc1swXS5zdGFydEFuZ2xlICsgKDIgKiBNYXRoLlBJICogZnJhY3Rpb25Db21wbGV0ZSk7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSBpID09PSAwID8gZGF0YVBvaW50RU9zW2ldLnN0YXJ0QW5nbGUgOiBlbmRBbmdsZTtcblx0XHRcdHZhciBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyAoZGF0YVBvaW50RU9zW2ldLmVuZEFuZ2xlIC0gZGF0YVBvaW50RU9zW2ldLnN0YXJ0QW5nbGUpO1xuXG5cdFx0XHR2YXIgc2hvdWxkQnJlYWsgPSBmYWxzZTtcblxuXHRcdFx0aWYgKGVuZEFuZ2xlID4gbWF4QW5nbGUpIHtcblx0XHRcdFx0ZW5kQW5nbGUgPSBtYXhBbmdsZTtcblx0XHRcdFx0c2hvdWxkQnJlYWsgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXG5cdFx0XHRpZiAoZW5kQW5nbGUgPiBzdGFydEFuZ2xlKVxuXHRcdFx0XHRkcmF3U2VnbWVudChfdGhpcy5wbG90QXJlYS5jdHgsIGRhdGFQb2ludEVPc1tpXS5jZW50ZXIsIGRhdGFQb2ludEVPc1tpXS5yYWRpdXMsIGNvbG9yLCBkYXRhU2VyaWVzLnR5cGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5LCBkYXRhUG9pbnRFT3NbaV0ucGVyY2VudElubmVyUmFkaXVzKTtcblxuXHRcdFx0aWYgKHNob3VsZEJyZWFrKVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBleHBsb2RlVG9nZ2xlKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdHZhciBjdHggPSBfdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHRjdHguY2xlYXJSZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IF90aGlzLmJhY2tncm91bmRDb2xvcjtcblx0XHRjdHguZmlsbFJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IGRhdGFQb2ludEVPc1tpXS5zdGFydEFuZ2xlO1xuXHRcdFx0dmFyIGVuZEFuZ2xlID0gZGF0YVBvaW50RU9zW2ldLmVuZEFuZ2xlO1xuXG5cdFx0XHRpZiAoZW5kQW5nbGUgPiBzdGFydEFuZ2xlKSB7XG5cblxuXHRcdFx0XHR2YXIgb2Zmc2V0WCA9IChvdXRlclJhZGl1cyAqIC4wNyAqIE1hdGguY29zKGRhdGFQb2ludEVPc1tpXS5taWRBbmdsZSkpO1xuXHRcdFx0XHR2YXIgb2Zmc2V0WSA9IChvdXRlclJhZGl1cyAqIC4wNyAqIE1hdGguc2luKGRhdGFQb2ludEVPc1tpXS5taWRBbmdsZSkpO1xuXHRcdFx0XHR2YXIgaXNJblRyYW5zaXRpb24gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5leHBsb2RlZCkge1xuXHRcdFx0XHRcdGlmIChNYXRoLmFicyhkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggLSAoY2VudGVyLnggKyBvZmZzZXRYKSkgPiAwLjAwMDAwMDAwMSB8fCBNYXRoLmFicyhkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnkgLSAoY2VudGVyLnkgKyBvZmZzZXRZKSkgPiAwLjAwMDAwMDAwMSkge1xuXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggPSBjZW50ZXIueCArIG9mZnNldFggKiBmcmFjdGlvbkNvbXBsZXRlO1xuXHRcdFx0XHRcdFx0ZGF0YVBvaW50RU9zW2ldLmNlbnRlci55ID0gY2VudGVyLnkgKyBvZmZzZXRZICogZnJhY3Rpb25Db21wbGV0ZTtcblxuXHRcdFx0XHRcdFx0aXNJblRyYW5zaXRpb24gPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChNYXRoLmFicyhkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggLSBjZW50ZXIueCkgPiAwIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1tpXS5jZW50ZXIueSAtIGNlbnRlci55KSA+IDApIHtcblx0XHRcdFx0XHRkYXRhUG9pbnRFT3NbaV0uY2VudGVyLnggPSBjZW50ZXIueCArIG9mZnNldFggKiAoMSAtIGZyYWN0aW9uQ29tcGxldGUpO1xuXHRcdFx0XHRcdGRhdGFQb2ludEVPc1tpXS5jZW50ZXIueSA9IGNlbnRlci55ICsgb2Zmc2V0WSAqICgxIC0gZnJhY3Rpb25Db21wbGV0ZSk7XG5cblx0XHRcdFx0XHRpc0luVHJhbnNpdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNJblRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHR2YXIgZW50cnkgPSB7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRlbnRyeS5kYXRhU2VyaWVzID0gZGF0YVNlcmllcztcblx0XHRcdFx0XHRlbnRyeS5kYXRhUG9pbnQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV07XG5cdFx0XHRcdFx0ZW50cnkuaW5kZXggPSBpO1xuXHRcdFx0XHRcdF90aGlzLl90b29sVGlwLmhpZ2hsaWdodE9iamVjdHMoW2VudHJ5XSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgY29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXG5cdFx0XHRcdGRyYXdTZWdtZW50KF90aGlzLnBsb3RBcmVhLmN0eCwgZGF0YVBvaW50RU9zW2ldLmNlbnRlciwgZGF0YVBvaW50RU9zW2ldLnJhZGl1cywgY29sb3IsIGRhdGFTZXJpZXMudHlwZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHksIGRhdGFQb2ludEVPc1tpXS5wZXJjZW50SW5uZXJSYWRpdXMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vd2luZG93LmFsZXJ0KFwibmV4dD8/XCIpO1xuXHRcdHJlbmRlckxhYmVscygpO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJlRGF0YVBvaW50c1Rvb0Nsb3NlKGZpcnN0LCBzZWNvbmQpIHtcblxuXHRcdHZhciBsYWJlbDEgPSB7XG5cdFx0XHR4MTogZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay54LCB5MTogZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyLCB4MjogZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay54ICsgZmlyc3QuaW5kZXhMYWJlbFRleHRCbG9jay53aWR0aCwgeTI6IGZpcnN0LmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGZpcnN0LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMlxuXHRcdH07XG5cdFx0dmFyIGxhYmVsMiA9IHtcblx0XHRcdHgxOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay54LCB5MTogc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtIHNlY29uZC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIsIHgyOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay54ICsgc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGgsIHkyOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay55ICsgc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMlxuXHRcdH07XG5cblx0XHRpZiAobGFiZWwxLngyIDwgbGFiZWwyLngxIC0gaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoIHx8IGxhYmVsMS54MSA+IGxhYmVsMi54MiArIGluZGV4TGFiZWxMaW5lRWRnZUxlbmd0aCB8fCBsYWJlbDEueTEgPiBsYWJlbDIueTIgKyBpbmRleExhYmVsTGluZUVkZ2VMZW5ndGggfHwgbGFiZWwxLnkyIDwgbGFiZWwyLnkxIC0gaW5kZXhMYWJlbExpbmVFZGdlTGVuZ3RoKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0aWNhbERpc3RhbmNlQmV0d2VlbkxhYmVscyhmaXJzdCwgc2Vjb25kKSB7XG5cblx0XHR2YXIgZGlzdGFuY2UgPSAwO1xuXHRcdHZhciBsYWJlbDEgPSB7XG5cdFx0XHR5OiBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLnksIHkxOiBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIsIHkyOiBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBmaXJzdC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDJcblx0XHR9O1xuXHRcdHZhciBsYWJlbDIgPSB7XG5cdFx0XHR5OiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay55LCB5MTogc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtIHNlY29uZC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIsIHkyOiBzZWNvbmQuaW5kZXhMYWJlbFRleHRCbG9jay55ICsgc2Vjb25kLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMlxuXHRcdH07XG5cblx0XHRpZiAobGFiZWwyLnkgPiBsYWJlbDEueSkge1xuXHRcdFx0ZGlzdGFuY2UgPSBsYWJlbDIueTEgLSBsYWJlbDEueTI7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZGlzdGFuY2UgPSBsYWJlbDEueTEgLSBsYWJlbDIueTI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRpc3RhbmNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TmV4dExhYmVsSW5kZXgoY3VycmVudExhYmVsSW5kZXgpIHtcblx0XHR2YXIgbmV4dExhYmVsSW5kZXggPSBudWxsO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdG5leHRMYWJlbEluZGV4ID0gKGN1cnJlbnRMYWJlbEluZGV4ICsgaSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludEVPc1tuZXh0TGFiZWxJbmRleF0uaGVtaXNwaGVyZSAhPT0gZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XS5oZW1pc3BoZXJlKSB7XG5cdFx0XHRcdG5leHRMYWJlbEluZGV4ID0gbnVsbDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICgoZGF0YVBvaW50RU9zW25leHRMYWJlbEluZGV4XS5pbmRleExhYmVsVGV4dCkgJiYgKG5leHRMYWJlbEluZGV4ICE9PSBjdXJyZW50TGFiZWxJbmRleClcblx0XHRcdFx0JiYgKChnZXRWZXJ0aWNhbERpc3RhbmNlQmV0d2VlbkxhYmVscyhkYXRhUG9pbnRFT3NbbmV4dExhYmVsSW5kZXhdLCBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdKSA8IDApIHx8IChkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmhlbWlzcGhlcmUgPT09IFwicmlnaHRcIiA/IGRhdGFQb2ludEVPc1tuZXh0TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55ID49IGRhdGFQb2ludEVPc1tjdXJyZW50TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55IDogZGF0YVBvaW50RU9zW25leHRMYWJlbEluZGV4XS5pbmRleExhYmVsVGV4dEJsb2NrLnkgPD0gZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XS5pbmRleExhYmVsVGV4dEJsb2NrLnkpKSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bmV4dExhYmVsSW5kZXggPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBuZXh0TGFiZWxJbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIGdldFByZXZpb3VzTGFiZWxJbmRleChjdXJyZW50TGFiZWxJbmRleCkge1xuXHRcdHZhciBwcmV2TGFiZWxJbmRleCA9IG51bGw7XG5cblx0XHRmb3IgKHZhciBpID0gMTsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0cHJldkxhYmVsSW5kZXggPSAoY3VycmVudExhYmVsSW5kZXggLSBpICsgZGF0YVBvaW50RU9zLmxlbmd0aCkgJSBkYXRhUG9pbnRFT3MubGVuZ3RoO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50RU9zW3ByZXZMYWJlbEluZGV4XS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmhlbWlzcGhlcmUpIHtcblx0XHRcdFx0cHJldkxhYmVsSW5kZXggPSBudWxsO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKChkYXRhUG9pbnRFT3NbcHJldkxhYmVsSW5kZXhdLmluZGV4TGFiZWxUZXh0KSAmJiAoZGF0YVBvaW50RU9zW3ByZXZMYWJlbEluZGV4XS5oZW1pc3BoZXJlID09PSBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmhlbWlzcGhlcmUpICYmIChwcmV2TGFiZWxJbmRleCAhPT0gY3VycmVudExhYmVsSW5kZXgpXG5cdFx0XHRcdCYmICgoZ2V0VmVydGljYWxEaXN0YW5jZUJldHdlZW5MYWJlbHMoZGF0YVBvaW50RU9zW3ByZXZMYWJlbEluZGV4XSwgZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XSkgPCAwKSB8fCAoZGF0YVBvaW50RU9zW2N1cnJlbnRMYWJlbEluZGV4XS5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgPyBkYXRhUG9pbnRFT3NbcHJldkxhYmVsSW5kZXhdLmluZGV4TGFiZWxUZXh0QmxvY2sueSA8PSBkYXRhUG9pbnRFT3NbY3VycmVudExhYmVsSW5kZXhdLmluZGV4TGFiZWxUZXh0QmxvY2sueSA6IGRhdGFQb2ludEVPc1twcmV2TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55ID49IGRhdGFQb2ludEVPc1tjdXJyZW50TGFiZWxJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55KSkpXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHByZXZMYWJlbEluZGV4ID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBwcmV2TGFiZWxJbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlUG9zaXRpb25MYWJlbHMoZGF0YVBvaW50SW5kZXgsIG9mZnNldCkge1xuXHRcdG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG5cdFx0dmFyIGFjdHVhbE9mZnNldCA9IDA7XG5cblx0XHQvL3ZhciBsYWJlbFlNaW4gPSAyO1xuXHRcdC8vdmFyIGxhYmVsWU1heCA9IGN0eC5jYW52YXMuaGVpZ2h0IC0gMjtcblx0XHQvL3ZhciBsYWJlbFlNaW4gPSBfdGhpcy5wbG90QXJlYS5jdHguY2FudmFzLmhlaWdodCAvIDIgLSBpbmRleExhYmVsUmFkaXVzICogMTtcblx0XHQvL3ZhciBsYWJlbFlNYXggPSBfdGhpcy5wbG90QXJlYS5jdHguY2FudmFzLmhlaWdodCAvIDIgKyBpbmRleExhYmVsUmFkaXVzICogMTtcblxuXHRcdHZhciBsYWJlbFlNaW4gPSBjZW50ZXIueSAtIGluZGV4TGFiZWxSYWRpdXMgKiAxO1xuXHRcdHZhciBsYWJlbFlNYXggPSBjZW50ZXIueSArIGluZGV4TGFiZWxSYWRpdXMgKiAxO1xuXG5cdFx0Ly9jb25zb2xlLmxvZyh0b3RhbFJlY3Vyc2lvbnMpO1xuXG5cdFx0aWYgKGRhdGFQb2ludEluZGV4ID49IDAgJiYgZGF0YVBvaW50SW5kZXggPCBkYXRhUG9pbnRzLmxlbmd0aCkge1xuXG5cdFx0XHR2YXIgZGF0YVBvaW50RU8gPSBkYXRhUG9pbnRFT3NbZGF0YVBvaW50SW5kZXhdO1xuXHRcdFx0Ly9pZiAoZGF0YVBvaW50SW5kZXggPT09IDApXG5cdFx0XHQvL1x0Y3VzdG9tUHJvbXB0KGxhYmVsWU1pbi50b0ZpeGVkKDIpICsgXCI7IFwiICsgbGFiZWxZTWF4LnRvRml4ZWQoMikgKyBcIjsgXCIgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkudG9GaXhlZCgyKSk7XG5cblx0XHRcdC8vIElmIGxhYmVsIGlzIGFscmVhZHkgb3V0c2lkZSB0aGUgYm91bmRzLCByZXR1cm5cblx0XHRcdGlmICgob2Zmc2V0IDwgMCAmJiBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgPCBsYWJlbFlNaW4pIHx8IChvZmZzZXQgPiAwICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSA+IGxhYmVsWU1heCkpXG5cdFx0XHRcdHJldHVybiAwO1xuXG5cblx0XHRcdHZhciB2YWxpZE9mZnNldCA9IG9mZnNldDtcblxuXG5cdFx0XHQvL0NoZWNrIGlmIHRoZSBvZmZzZXQgZmFsbHMgd2l0aGluIHRoZSBib3VuZHMgKGxhYmVsWU1pbiwgbGFiZWxZTWF4LCB0YW5nZW50aWFsIGJvdW5kcykgd2l0aG91dCBjb25zaWRlcmluZyBvdmVybGFwLiBFbHNlIHVzZSB0aGUgY2xvc2VzdCBvZmZzZXQgdGhhdCBpcyBwb3NzaWJsZSAtIHZhbGlkT2Zmc2V0LlxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgZGlzdEZyb21JbmRleExpbmVTdGFydCA9IDA7XG5cdFx0XHRcdHZhciBpbmRleExhYmVsTGluZVN0YXJ0WCA9IDA7XG5cdFx0XHRcdHZhciBpbmRleExhYmVsTGluZVN0YXJ0WSA9IDA7XG5cdFx0XHRcdHZhciBpbmRleExhYmVsQW5nbGUgPSAwO1xuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbEFuZ2xlV2hlblRhbmdlbnQgPSAwO1xuXG5cdFx0XHRcdGlmICh2YWxpZE9mZnNldCA8IDApIHtcblx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyID4gbGFiZWxZTWluICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSAtIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiArIHZhbGlkT2Zmc2V0IDwgbGFiZWxZTWluKVxuXHRcdFx0XHRcdFx0dmFsaWRPZmZzZXQgPSAtKGxhYmVsWU1pbiAtIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgKyB2YWxpZE9mZnNldCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgPCBsYWJlbFlNaW4gJiYgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyICsgdmFsaWRPZmZzZXQgPiBsYWJlbFlNYXgpXG5cdFx0XHRcdFx0XHR2YWxpZE9mZnNldCA9IChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgKyB2YWxpZE9mZnNldCkgLSBsYWJlbFlNYXg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgbmV3bGFiZWxZID0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ICsgdmFsaWRPZmZzZXQ7XG5cdFx0XHRcdHZhciBuZXdsYWJlbFggPSAwO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIpIHtcblx0XHRcdFx0XHRuZXdsYWJlbFggPSBjZW50ZXIueCArIE1hdGguc3FydChNYXRoLnBvdyhpbmRleExhYmVsUmFkaXVzLCAyKSAtIE1hdGgucG93KG5ld2xhYmVsWSAtIGNlbnRlci55LCAyKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdG5ld2xhYmVsWCA9IGNlbnRlci54IC0gTWF0aC5zcXJ0KE1hdGgucG93KGluZGV4TGFiZWxSYWRpdXMsIDIpIC0gTWF0aC5wb3cobmV3bGFiZWxZIC0gY2VudGVyLnksIDIpKTtcblxuXG5cdFx0XHRcdGluZGV4TGFiZWxMaW5lU3RhcnRYID0gY2VudGVyLnggKyBvdXRlclJhZGl1cyAqIE1hdGguY29zKGRhdGFQb2ludEVPLm1pZEFuZ2xlKTtcblx0XHRcdFx0aW5kZXhMYWJlbExpbmVTdGFydFkgPSBjZW50ZXIueSArIG91dGVyUmFkaXVzICogTWF0aC5zaW4oZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXG5cdFx0XHRcdGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgPSBNYXRoLnNxcnQoTWF0aC5wb3cobmV3bGFiZWxYIC0gaW5kZXhMYWJlbExpbmVTdGFydFgsIDIpICsgTWF0aC5wb3cobmV3bGFiZWxZIC0gaW5kZXhMYWJlbExpbmVTdGFydFksIDIpKTtcblxuXHRcdFx0XHRpbmRleExhYmVsQW5nbGVXaGVuVGFuZ2VudCA9IE1hdGguYWNvcyhvdXRlclJhZGl1cyAvIGluZGV4TGFiZWxSYWRpdXMpO1xuXG5cdFx0XHRcdC8vaW5kZXhMYWJlbEFuZ2xlID0gTWF0aC5hY29zKChvdXRlclJhZGl1cyAqIG91dGVyUmFkaXVzICsgZGlzdEZyb21JbmRleExpbmVTdGFydCAqIGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgLSBpbmRleExhYmVsUmFkaXVzICogaW5kZXhMYWJlbFJhZGl1cykgLyAoMiAqIG91dGVyUmFkaXVzICogZGlzdEZyb21JbmRleExpbmVTdGFydCkpO1xuXHRcdFx0XHRpbmRleExhYmVsQW5nbGUgPSBNYXRoLmFjb3MoKGluZGV4TGFiZWxSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzICsgb3V0ZXJSYWRpdXMgKiBvdXRlclJhZGl1cyAtIGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgKiBkaXN0RnJvbUluZGV4TGluZVN0YXJ0KSAvICgyICogb3V0ZXJSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzKSk7XG5cblx0XHRcdFx0aWYgKGluZGV4TGFiZWxBbmdsZSA8IGluZGV4TGFiZWxBbmdsZVdoZW5UYW5nZW50KSB7XG5cdFx0XHRcdFx0dmFsaWRPZmZzZXQgPSBuZXdsYWJlbFkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnk7XG5cdFx0XHRcdFx0Ly9kYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggPSBuZXdsYWJlbFg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHR2YWxpZE9mZnNldCA9IDA7XG5cblx0XHRcdFx0XHQvL2RhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCA9IG5ld2xhYmVsWDtcblxuXHRcdFx0XHRcdC8vSW5kZXggTGluZSBpcyBvdmVybGFwcGluZyB0aGUgcGllLiBTbyBsZXRzIGZpbmQgb3V0IHRoZSBwb2ludCB3aGVyZSBpbmRleGxpbmUgYmVjb21lcyBhIHRhbmdlbnQuXG5cblx0XHRcdFx0XHQvL2Rpc3RGcm9tSW5kZXhMaW5lU3RhcnQgPSBNYXRoLnNxcnQoaW5kZXhMYWJlbFJhZGl1cyAqIGluZGV4TGFiZWxSYWRpdXMgLSBvdXRlclJhZGl1cyAqIG91dGVyUmFkaXVzKTtcblx0XHRcdFx0XHQvLy8vZGlzdEZyb21JbmRleExpbmVTdGFydCAqPSBvZmZzZXQgPCAwID8gLTEgOiAxO1xuXHRcdFx0XHRcdC8vLy9pbmRleExhYmVsQW5nbGUgPSBNYXRoLmFjb3MoKGluZGV4TGFiZWxSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzICsgb3V0ZXJSYWRpdXMgKiBvdXRlclJhZGl1cyAtIGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQgKiBkaXN0RnJvbUluZGV4TGluZVN0YXJ0KSAvICgyICogb3V0ZXJSYWRpdXMgKiBpbmRleExhYmVsUmFkaXVzKSk7XG5cdFx0XHRcdFx0Ly9pbmRleExhYmVsQW5nbGUgPSBNYXRoLmF0YW4yKGRpc3RGcm9tSW5kZXhMaW5lU3RhcnQsIG91dGVyUmFkaXVzKTtcblxuXHRcdFx0XHRcdC8vbmV3bGFiZWxYID0gY2VudGVyLnggKyBpbmRleExhYmVsUmFkaXVzICogTWF0aC5jb3MoaW5kZXhMYWJlbEFuZ2xlKTtcblx0XHRcdFx0XHQvL25ld2xhYmVsWSA9IGNlbnRlci55ICsgaW5kZXhMYWJlbFJhZGl1cyAqIE1hdGguc2luKGluZGV4TGFiZWxBbmdsZSk7XG5cblx0XHRcdFx0XHQvL2FjdHVhbE9mZnNldCA9IG5ld2xhYmVsWSAtIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueTtcblxuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gbmV3bGFiZWxZO1xuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ID0gbmV3bGFiZWxYO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvL3ZhciB0ZW1wSW5kZXggPSAoZGF0YVBvaW50SW5kZXggKyBkYXRhUG9pbnRFT3MubGVuZ3RoIC0gMSkgJSBkYXRhUG9pbnRFT3MubGVuZ3RoO1xuXG5cdFx0XHQvL3ZhciBwcmV2RGF0YVBvaW50SW5kZXggPSBkYXRhUG9pbnRFT3NbdGVtcEluZGV4XS5oZW1pc3BoZXJlID09PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID8gdGVtcEluZGV4IDogbnVsbDtcblxuXHRcdFx0dmFyIHByZXZEYXRhUG9pbnRJbmRleCA9IGdldFByZXZpb3VzTGFiZWxJbmRleChkYXRhUG9pbnRJbmRleCk7XG5cblx0XHRcdC8vdGVtcEluZGV4ID0gKGRhdGFQb2ludEluZGV4ICsgZGF0YVBvaW50RU9zLmxlbmd0aCArIDEpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblxuXHRcdFx0Ly92YXIgbmV4dERhdGFQb2ludEluZGV4ID0gZGF0YVBvaW50RU9zW3RlbXBJbmRleF0uaGVtaXNwaGVyZSA9PT0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA/IHRlbXBJbmRleCA6IG51bGw7XG5cblx0XHRcdHZhciBuZXh0RGF0YVBvaW50SW5kZXggPSBnZXROZXh0TGFiZWxJbmRleChkYXRhUG9pbnRJbmRleCk7XG5cblx0XHRcdHZhciBvdGhlcmRhdGFQb2ludEVPLCBvdGhlckRhdGFQb2ludEluZGV4LCBkaXN0YW5jZUZyb21PdGhlckxhYmVsO1xuXHRcdFx0dmFyIG90aGVyRGF0YVBvaW50T2Zmc2V0ID0gMDtcblx0XHRcdHZhciBvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCA9IDA7XG5cblxuXHRcdFx0aWYgKHZhbGlkT2Zmc2V0IDwgMCkge1xuXG5cdFx0XHRcdG90aGVyRGF0YVBvaW50SW5kZXggPSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgPyBwcmV2RGF0YVBvaW50SW5kZXggOiBuZXh0RGF0YVBvaW50SW5kZXg7XG5cblx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0aWYgKG90aGVyRGF0YVBvaW50SW5kZXggIT09IG51bGwpIHtcblxuXHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEluZGV4IDwgNClcblx0XHRcdFx0XHQvL1x0Y3VzdG9tUHJvbXB0KFwidmFsaWQ6IFwiICsgdmFsaWRPZmZzZXQpO1xuXG5cdFx0XHRcdFx0dmFyIHRlbXBPZmZzZXQgPSAtdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2VGcm9tT3RoZXJMYWJlbCA9IChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpIC0gKGRhdGFQb2ludEVPc1tvdGhlckRhdGFQb2ludEluZGV4XS5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFT3Nbb3RoZXJEYXRhUG9pbnRJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyKTtcblxuXHRcdFx0XHRcdGlmIChkaXN0YW5jZUZyb21PdGhlckxhYmVsIC0gdGVtcE9mZnNldCA8IG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscykge1xuXHRcdFx0XHRcdFx0b3RoZXJEYXRhUG9pbnRPZmZzZXQgPSAtdGVtcE9mZnNldDtcblx0XHRcdFx0XHRcdC8vdG90YWxSZWN1cnNpb25zKys7XG5cdFx0XHRcdFx0XHRvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCA9IHJlUG9zaXRpb25MYWJlbHMob3RoZXJEYXRhUG9pbnRJbmRleCwgb3RoZXJEYXRhUG9pbnRPZmZzZXQsIHJlY3Vyc2lvbkNvdW50ICsgMSk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEluZGV4IDwgNClcblx0XHRcdFx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoZGF0YVBvaW50SW5kZXggKyBcIjsgXCIgKyBcIm9mZnNldDogXCIgKyBvdGhlckRhdGFQb2ludE9mZnNldCk7XG5cblxuXHRcdFx0XHRcdFx0aWYgKCtvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPiArb3RoZXJEYXRhUG9pbnRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGRpc3RhbmNlRnJvbU90aGVyTGFiZWwgPiBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHMpXG5cdFx0XHRcdFx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gLShkaXN0YW5jZUZyb21PdGhlckxhYmVsIC0gbWluRGlzdGFuY2VCZXR3ZWVuTGFiZWxzKTtcblx0XHRcdFx0XHRcdFx0XHQvL2Vsc2Vcblx0XHRcdFx0XHRcdFx0XHQvL1x0YWN0dWFsT2Zmc2V0ID0gMDtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGFjdHVhbE9mZnNldCA9IC0odGVtcE9mZnNldCAtIChvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCAtIG90aGVyRGF0YVBvaW50T2Zmc2V0KSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEluZGV4IDwgNClcblx0XHRcdFx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoXCJhY3R1YWw6IFwiICsgYWN0dWFsT2Zmc2V0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKHZhbGlkT2Zmc2V0ID4gMCkge1xuXG5cdFx0XHRcdG90aGVyRGF0YVBvaW50SW5kZXggPSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgPyBuZXh0RGF0YVBvaW50SW5kZXggOiBwcmV2RGF0YVBvaW50SW5kZXg7XG5cblx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0aWYgKG90aGVyRGF0YVBvaW50SW5kZXggIT09IG51bGwpIHtcblxuXHRcdFx0XHRcdHZhciB0ZW1wT2Zmc2V0ID0gdmFsaWRPZmZzZXQ7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2VGcm9tT3RoZXJMYWJlbCA9IChkYXRhUG9pbnRFT3Nbb3RoZXJEYXRhUG9pbnRJbmRleF0uaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZGF0YVBvaW50RU9zW290aGVyRGF0YVBvaW50SW5kZXhdLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikgLSAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyKTtcblxuXHRcdFx0XHRcdGlmIChkaXN0YW5jZUZyb21PdGhlckxhYmVsIC0gdGVtcE9mZnNldCA8IG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscykge1xuXHRcdFx0XHRcdFx0b3RoZXJEYXRhUG9pbnRPZmZzZXQgPSB0ZW1wT2Zmc2V0O1xuXHRcdFx0XHRcdFx0Ly90b3RhbFJlY3Vyc2lvbnMrKztcblx0XHRcdFx0XHRcdG90aGVyRGF0YVBvaW50QWN0dWFsT2Zmc2V0ID0gcmVQb3NpdGlvbkxhYmVscyhvdGhlckRhdGFQb2ludEluZGV4LCBvdGhlckRhdGFQb2ludE9mZnNldCwgcmVjdXJzaW9uQ291bnQgKyAxKTtcblxuXHRcdFx0XHRcdFx0aWYgKCtvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPCArb3RoZXJEYXRhUG9pbnRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGRpc3RhbmNlRnJvbU90aGVyTGFiZWwgPiBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHMpXG5cdFx0XHRcdFx0XHRcdFx0YWN0dWFsT2Zmc2V0ID0gZGlzdGFuY2VGcm9tT3RoZXJMYWJlbCAtIG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscztcblx0XHRcdFx0XHRcdFx0XHQvL2Vsc2Vcblx0XHRcdFx0XHRcdFx0XHQvL1x0YWN0dWFsT2Zmc2V0ID0gMDtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGFjdHVhbE9mZnNldCA9IHRlbXBPZmZzZXQgLSAob3RoZXJEYXRhUG9pbnRPZmZzZXQgLSBvdGhlckRhdGFQb2ludEFjdHVhbE9mZnNldCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2lmICghKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiArIGFjdHVhbE9mZnNldCA8IGxhYmVsWU1heCkpIHtcblx0XHRcdFx0Ly9cdGlmIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgPCBsYWJlbFlNYXgpIHtcblx0XHRcdFx0Ly9cdFx0YWN0dWFsT2Zmc2V0ID0gbGFiZWxZTWF4IC0gKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMik7XG5cdFx0XHRcdC8vXHR9XG5cdFx0XHRcdC8vXHRlbHNlIHtcblx0XHRcdFx0Ly9cdFx0YWN0dWFsT2Zmc2V0ID0gMDtcblx0XHRcdFx0Ly9cdH1cblx0XHRcdFx0Ly99XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKGFjdHVhbE9mZnNldCkge1xuXG5cdFx0XHRcdHZhciBuZXdMYWJlbFkgPSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBhY3R1YWxPZmZzZXQ7XG5cblxuXG5cblx0XHRcdFx0dmFyIG5ld0xhYmVsWCA9IDA7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwicmlnaHRcIikge1xuXHRcdFx0XHRcdG5ld0xhYmVsWCA9IGNlbnRlci54ICsgTWF0aC5zcXJ0KE1hdGgucG93KGluZGV4TGFiZWxSYWRpdXMsIDIpIC0gTWF0aC5wb3cobmV3TGFiZWxZIC0gY2VudGVyLnksIDIpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3TGFiZWxYID0gY2VudGVyLnggLSBNYXRoLnNxcnQoTWF0aC5wb3coaW5kZXhMYWJlbFJhZGl1cywgMikgLSBNYXRoLnBvdyhuZXdMYWJlbFkgLSBjZW50ZXIueSwgMikpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5taWRBbmdsZSA+IChNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8IChNYXRoLlBJIC8gMikgKyBwb2xlQW5nbHVsYXJEaXN0YW5jZSkge1xuXG5cdFx0XHRcdFx0dmFyIHByZXZEUEluZGV4ID0gKGRhdGFQb2ludEluZGV4IC0gMSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblx0XHRcdFx0XHR2YXIgcHJldkRQID0gZGF0YVBvaW50RU9zW3ByZXZEUEluZGV4XTtcblx0XHRcdFx0XHR2YXIgbmV4dERQID0gZGF0YVBvaW50RU9zWyhkYXRhUG9pbnRJbmRleCArIDEgKyBkYXRhUG9pbnRFT3MubGVuZ3RoKSAlIGRhdGFQb2ludEVPcy5sZW5ndGhdO1xuXG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiICYmIHByZXZEUC5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgJiYgbmV3TGFiZWxYID4gcHJldkRQLmluZGV4TGFiZWxUZXh0QmxvY2sueCkge1xuXHRcdFx0XHRcdFx0bmV3TGFiZWxYID0gcHJldkRQLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIDE1O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiICYmIG5leHREUC5oZW1pc3BoZXJlID09PSBcImxlZnRcIiAmJiBuZXdMYWJlbFggPCBuZXh0RFAuaW5kZXhMYWJlbFRleHRCbG9jay54KSB7XG5cdFx0XHRcdFx0XHRuZXdMYWJlbFggPSBuZXh0RFAuaW5kZXhMYWJlbFRleHRCbG9jay54ICsgMTU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludEVPLm1pZEFuZ2xlID4gKDMgKiBNYXRoLlBJIC8gMikgLSBwb2xlQW5nbHVsYXJEaXN0YW5jZSAmJiBkYXRhUG9pbnRFTy5taWRBbmdsZSA8ICgzICogTWF0aC5QSSAvIDIpICsgcG9sZUFuZ2x1bGFyRGlzdGFuY2UpIHtcblxuXHRcdFx0XHRcdHZhciBwcmV2RFBJbmRleCA9IChkYXRhUG9pbnRJbmRleCAtIDEgKyBkYXRhUG9pbnRFT3MubGVuZ3RoKSAlIGRhdGFQb2ludEVPcy5sZW5ndGg7XG5cdFx0XHRcdFx0dmFyIHByZXZEUCA9IGRhdGFQb2ludEVPc1twcmV2RFBJbmRleF07XG5cdFx0XHRcdFx0dmFyIG5leHREUCA9IGRhdGFQb2ludEVPc1soZGF0YVBvaW50SW5kZXggKyAxICsgZGF0YVBvaW50RU9zLmxlbmd0aCkgJSBkYXRhUG9pbnRFT3MubGVuZ3RoXTtcblxuXHRcdFx0XHRcdGlmIChkYXRhUG9pbnRFTy5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgJiYgcHJldkRQLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiICYmIG5ld0xhYmVsWCA8IHByZXZEUC5pbmRleExhYmVsVGV4dEJsb2NrLngpIHtcblx0XHRcdFx0XHRcdG5ld0xhYmVsWCA9IHByZXZEUC5pbmRleExhYmVsVGV4dEJsb2NrLnggKyAxNTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwibGVmdFwiICYmIG5leHREUC5oZW1pc3BoZXJlID09PSBcInJpZ2h0XCIgJiYgbmV3TGFiZWxYID4gbmV4dERQLmluZGV4TGFiZWxUZXh0QmxvY2sueCkge1xuXHRcdFx0XHRcdFx0bmV3TGFiZWxYID0gbmV4dERQLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIDE1O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vaWYgKGFjdHVhbE9mZnNldCA8IDAgJiYgZGF0YVBvaW50SW5kZXggPCA0KVxuXHRcdFx0XHQvL1x0Y3VzdG9tUHJvbXB0KGFjdHVhbE9mZnNldC50b0ZpeGVkKDIpICsgXCI7IFwiICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55LnRvRml4ZWQoMikgKyBcIjsgXCIgKyBuZXdMYWJlbFkudG9GaXhlZCgyKSk7XG5cblx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gbmV3TGFiZWxZO1xuXG5cdFx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCA9IG5ld0xhYmVsWDtcblxuXHRcdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsQW5nbGUgPSBNYXRoLmF0YW4yKChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBjZW50ZXIueSksIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggLSBjZW50ZXIueCkpO1xuXG5cdFx0XHR9XG5cblxuXHRcdH1cblxuXHRcdHJldHVybiBhY3R1YWxPZmZzZXQ7XG5cdH1cblxuXG5cdGZ1bmN0aW9uIHBvc2l0aW9uTGFiZWxzKCkge1xuXHRcdHZhciBjdHggPSBfdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gXCJncmV5XCI7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gXCJncmV5XCI7XG5cdFx0dmFyIGZvbnRTaXplID0gMTY7XG5cdFx0Y3R4LmZvbnQgPSBmb250U2l6ZSArIFwicHggQXJpYWxcIjtcblx0XHRjdHgudGV4dEJhc2VsaW5lID0gXCJtaWRkbGVcIjtcblx0XHR2YXIgaSA9IDAsIGogPSAwO1xuXHRcdHZhciBkZWx0YVIgPSAwO1xuXG5cdFx0dmFyIHJlc2l6ZUZsYWcgPSB0cnVlO1xuXG5cdFx0Zm9yIChqID0gMDsgaiA8IDEwICYmIChqIDwgMSB8fCBkZWx0YVIgPiAwKSA7IGorKykge1xuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5yYWRpdXMgfHwgKCFkYXRhU2VyaWVzLnJhZGl1cyAmJiB0eXBlb2YgZGF0YVNlcmllcy5pbm5lclJhZGl1cyAhPT0gJ3VuZGVmaW5lZCcgJiYgZGF0YVNlcmllcy5pbm5lclJhZGl1cyAhPT0gbnVsbCAmJiBvdXRlclJhZGl1cyAtIGRlbHRhUiA8PSBpbm5lclJhZGl1cykpXG5cdFx0XHRcdHJlc2l6ZUZsYWcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHJlc2l6ZUZsYWcpXG5cdFx0XHRvdXRlclJhZGl1cyAtPSBkZWx0YVI7XG5cblx0XHRcdGRlbHRhUiA9IDA7XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmluZGV4TGFiZWxQbGFjZW1lbnQgIT09IFwiaW5zaWRlXCIpIHtcblxuXHRcdFx0XHR2YXIgaW5kZXhMYWJlbFJhZGl1cyA9IG91dGVyUmFkaXVzICogaW5kZXhMYWJlbFJhZGl1c1RvUmFkaXVzUmF0aW87XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YXIgZGF0YVBvaW50RU8gPSBkYXRhUG9pbnRFT3NbaV07XG5cblx0XHRcdFx0XHRkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggPSBjZW50ZXIueCArIGluZGV4TGFiZWxSYWRpdXMgKiBNYXRoLmNvcyhkYXRhUG9pbnRFTy5taWRBbmdsZSk7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gY2VudGVyLnkgKyBpbmRleExhYmVsUmFkaXVzICogTWF0aC5zaW4oZGF0YVBvaW50RU8ubWlkQW5nbGUpO1xuXG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlID0gZGF0YVBvaW50RU8ubWlkQW5nbGU7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8ucmFkaXVzID0gb3V0ZXJSYWRpdXM7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8ucGVyY2VudElubmVyUmFkaXVzID0gcGVyY2VudElubmVyUmFkaXVzO1xuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8uaW5kZXhMYWJlbEZvbnRTaXplID0gZGF0YVBvaW50LmluZGV4TGFiZWxGb250U2l6ZSA/IGRhdGFQb2ludC5pbmRleExhYmVsRm9udFNpemUgOiBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb250U2l6ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBjdXJyZW50RGF0YVBvaW50LCBuZXh0RGF0YVBvaW50O1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdFx0dmFyIGRhdGFQb2ludEVPID0gZGF0YVBvaW50RU9zW2ldO1xuXHRcdFx0XHRcdC8vZGF0YVBvaW50RU8ubGFiXG5cdFx0XHRcdFx0Ly9yZXNldEFuaW1hdGlvbkZyYW1lKCk7XG5cdFx0XHRcdFx0Ly9hbmltYXRlKCk7XG5cdFx0XHRcdFx0Ly9yZW5kZXJMYWJlbHMoKTtcblxuXHRcdFx0XHRcdC8vdmFyIHByZXZEYXRhUG9pbnRJbmRleCA9IChpIC0gMSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vdmFyIG5leHREYXRhUG9pbnRJbmRleCA9IChpICsgMSArIGRhdGFQb2ludEVPcy5sZW5ndGgpICUgZGF0YVBvaW50RU9zLmxlbmd0aDtcblx0XHRcdFx0XHQvL25leHREYXRhUG9pbnRJbmRleCA9IGRhdGFQb2ludEVPc1tuZXh0RGF0YVBvaW50SW5kZXhdLmhlbWlzcGhlcmUgPT09IGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgJiYgbmV4dERhdGFQb2ludEluZGV4ICE9PSBpID8gbmV4dERhdGFQb2ludEluZGV4IDogbnVsbDtcblxuXHRcdFx0XHRcdHZhciBuZXh0RGF0YVBvaW50SW5kZXggPSBnZXROZXh0TGFiZWxJbmRleChpKTtcblxuXHRcdFx0XHRcdGlmIChuZXh0RGF0YVBvaW50SW5kZXggPT09IG51bGwpXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdGN1cnJlbnREYXRhUG9pbnQgPSBkYXRhUG9pbnRFT3NbaV07XG5cdFx0XHRcdFx0bmV4dERhdGFQb2ludCA9IGRhdGFQb2ludEVPc1tuZXh0RGF0YVBvaW50SW5kZXhdO1xuXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gMDtcblxuXHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPLmhlbWlzcGhlcmUgPT09IFwicmlnaHRcIilcblx0XHRcdFx0XHQvL1x0ZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gKG5leHREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55IC0gbmV4dERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpIC0gKGN1cnJlbnREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55ICsgY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpIC0gbWluRGlzdGFuY2VCZXR3ZWVuTGFiZWxzO1xuXHRcdFx0XHRcdC8vZWxzZVxuXHRcdFx0XHRcdC8vXHRkaXN0YW5jZUZyb21OZXh0TGFiZWwgPSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBjdXJyZW50RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikgLSAobmV4dERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyBuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikgLSBtaW5EaXN0YW5jZUJldHdlZW5MYWJlbHM7XG5cblx0XHRcdFx0XHRkaXN0YW5jZUZyb21OZXh0TGFiZWwgPSBnZXRWZXJ0aWNhbERpc3RhbmNlQmV0d2VlbkxhYmVscyhjdXJyZW50RGF0YVBvaW50LCBuZXh0RGF0YVBvaW50KSAtIG1pbkRpc3RhbmNlQmV0d2VlbkxhYmVscztcblxuXG5cdFx0XHRcdFx0aWYgKGRpc3RhbmNlRnJvbU5leHRMYWJlbCA8IDApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGFQb2ludHNBYm92ZSA9IDA7XG5cdFx0XHRcdFx0XHR2YXIgZGF0YVBvaW50c0JlbG93ID0gMDtcblx0XHRcdFx0XHRcdC8vdmFyIGluZGV4TGFiZWxBbmdsZVdoZW5UYW5nZW50ID0gTWF0aC5hY29zKG91dGVyUmFkaXVzIC8gaW5kZXhMYWJlbFJhZGl1cykgLyBNYXRoLlBJICogMTgwO1xuXG5cblx0XHRcdFx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgZGF0YVBvaW50cy5sZW5ndGg7IGsrKykge1xuXG5cdFx0XHRcdFx0XHRcdGlmIChrID09PSBpKVxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPc1trXS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1trXS5taWRBbmdsZSAtIGRhdGFQb2ludEVPLm1pZEFuZ2xlKSA+IDMwKVxuXHRcdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPc1trXS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1trXS5sYWJlbEFuZ2xlIC0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlKSA+IDMwKVxuXHRcdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdC8vaWYgKGRhdGFQb2ludEVPc1trXS5oZW1pc3BoZXJlICE9PSBkYXRhUG9pbnRFTy5oZW1pc3BoZXJlIHx8IE1hdGguYWJzKGRhdGFQb2ludEVPc1trXS5taWRBbmdsZSAtIGRhdGFQb2ludEVPLm1pZEFuZ2xlKSA+IGluZGV4TGFiZWxBbmdsZVdoZW5UYW5nZW50KVxuXHRcdFx0XHRcdFx0XHQvL1x0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhUG9pbnRFT3Nba10uaGVtaXNwaGVyZSAhPT0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSlcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU9zW2tdLmluZGV4TGFiZWxUZXh0QmxvY2sueSA8IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSlcblx0XHRcdFx0XHRcdFx0XHRkYXRhUG9pbnRzQWJvdmUrKztcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGRhdGFQb2ludHNCZWxvdysrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvL3ZhciB1cFdhcmRzT2Zmc2V0ID0gKGRpc3RhbmNlRnJvbU5leHRMYWJlbCkgLyBkYXRhUG9pbnRzLmxlbmd0aCAqIChkYXRhUG9pbnRzQmVsb3cpO1xuXHRcdFx0XHRcdFx0dmFyIHVwV2FyZHNPZmZzZXQgPSAoZGlzdGFuY2VGcm9tTmV4dExhYmVsKSAvIChkYXRhUG9pbnRzQWJvdmUgKyBkYXRhUG9pbnRzQmVsb3cgfHwgMSkgKiAoZGF0YVBvaW50c0JlbG93KTtcblx0XHRcdFx0XHRcdHZhciBkb3duV2FyZHNPZmZzZXQgPSAtMSAqIChkaXN0YW5jZUZyb21OZXh0TGFiZWwgLSB1cFdhcmRzT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0dmFyIGFjdHVhbFVwd2FyZE9mZnNldCA9IDA7XG5cdFx0XHRcdFx0XHR2YXIgYWN0dWFsRG93bndhcmRPZmZzZXQgPSAwO1xuXG5cdFx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiKSB7XG5cdFx0XHRcdFx0XHRcdGFjdHVhbFVwd2FyZE9mZnNldCA9IHJlUG9zaXRpb25MYWJlbHMoaSwgdXBXYXJkc09mZnNldCk7XG5cblx0XHRcdFx0XHRcdFx0Ly9pZiAoaSA8IDQgJiYgYWN0dWFsRG93bndhcmRPZmZzZXQgIT09IHVwV2FyZHNPZmZzZXQpXG5cdFx0XHRcdFx0XHRcdC8vXHRjdXN0b21Qcm9tcHQoaSArIFwiOyBcIiArIHVwV2FyZHNPZmZzZXQudG9GaXhlZCgyKSArIFwiOyBcIiArIGFjdHVhbFVwd2FyZE9mZnNldC50b0ZpeGVkKDIpKTtcblxuXG5cdFx0XHRcdFx0XHRcdGRvd25XYXJkc09mZnNldCA9IC0xICogKGRpc3RhbmNlRnJvbU5leHRMYWJlbCAtIGFjdHVhbFVwd2FyZE9mZnNldCk7XG5cblx0XHRcdFx0XHRcdFx0YWN0dWFsRG93bndhcmRPZmZzZXQgPSByZVBvc2l0aW9uTGFiZWxzKG5leHREYXRhUG9pbnRJbmRleCwgZG93bldhcmRzT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0XHQvL3dpbmRvdy5hbGVydCh0eXBlb2YgK2Rvd25XYXJkc09mZnNldC50b0ZpeGVkKHByZWNpc2lvbikpO1xuXHRcdFx0XHRcdFx0XHQvL1NldHRpbmcgcHJlY2lzaW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIG5vdCBlcXVhbCBiZWNvbWUgb2YgbWlub3IgZGlmZmVyZW5jZXMgLSBsaWtlIGEgZGlmZmVyZW5jZSBvZiAuMDAwMDAxXG5cdFx0XHRcdFx0XHRcdGlmICgrYWN0dWFsRG93bndhcmRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pIDwgK2Rvd25XYXJkc09mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgJiYgK2FjdHVhbFVwd2FyZE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPD0gK3VwV2FyZHNPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKVxuXHRcdFx0XHRcdFx0XHRcdHJlUG9zaXRpb25MYWJlbHMoaSwgLShkb3duV2FyZHNPZmZzZXQgLSBhY3R1YWxEb3dud2FyZE9mZnNldCkpO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhY3R1YWxVcHdhcmRPZmZzZXQgPSByZVBvc2l0aW9uTGFiZWxzKG5leHREYXRhUG9pbnRJbmRleCwgdXBXYXJkc09mZnNldCk7XG5cblx0XHRcdFx0XHRcdFx0ZG93bldhcmRzT2Zmc2V0ID0gLTEgKiAoZGlzdGFuY2VGcm9tTmV4dExhYmVsIC0gYWN0dWFsVXB3YXJkT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0XHRhY3R1YWxEb3dud2FyZE9mZnNldCA9IHJlUG9zaXRpb25MYWJlbHMoaSwgZG93bldhcmRzT2Zmc2V0KTtcblxuXHRcdFx0XHRcdFx0XHQvL1NldHRpbmcgcHJlY2lzaW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIG5vdCBlcXVhbCBiZWNvbWUgb2YgbWlub3IgZGlmZmVyZW5jZXMgLSBsaWtlIGEgZGlmZmVyZW5jZSBvZiAuMDAwMDAxXG5cdFx0XHRcdFx0XHRcdGlmICgrYWN0dWFsRG93bndhcmRPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pIDwgK2Rvd25XYXJkc09mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgJiYgK2FjdHVhbFVwd2FyZE9mZnNldC50b0ZpeGVkKHByZWNpc2lvbikgPD0gK3VwV2FyZHNPZmZzZXQudG9GaXhlZChwcmVjaXNpb24pKVxuXHRcdFx0XHRcdFx0XHRcdHJlUG9zaXRpb25MYWJlbHMobmV4dERhdGFQb2ludEluZGV4LCAtKGRvd25XYXJkc09mZnNldCAtIGFjdHVhbERvd253YXJkT2Zmc2V0KSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHQvL3Jlc2V0QW5pbWF0aW9uRnJhbWUoKTtcblx0XHRcdFx0XHQvL2FuaW1hdGUoKTtcblx0XHRcdFx0XHQvL3JlbmRlckxhYmVscygpO1xuXHRcdFx0XHRcdC8vd2luZG93LmFsZXJ0KFwibmV4dD8/XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdFx0dmFyIGRhdGFQb2ludEVPID0gZGF0YVBvaW50RU9zW2ldO1xuXHRcdFx0XHRcdGluZGV4TGFiZWxSYWRpdXMgPSBkYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgPyBvdXRlclJhZGl1cyAqIC43IDogb3V0ZXJSYWRpdXMgKiAuODtcblxuXG5cdFx0XHRcdFx0dmFyIGR4ID0gY2VudGVyLnggKyBpbmRleExhYmVsUmFkaXVzICogKE1hdGguY29zKChkYXRhUG9pbnRFTy5taWRBbmdsZSkpKTtcblx0XHRcdFx0XHR2YXIgZHkgPSBjZW50ZXIueSArIGluZGV4TGFiZWxSYWRpdXMgKiAoTWF0aC5zaW4oKGRhdGFQb2ludEVPLm1pZEFuZ2xlKSkpO1xuXG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ID0gZHg7XG5cdFx0XHRcdFx0ZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55ID0gZHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzaXplIFBpZSBiYXNlZCBvbiB0aGUgbGFiZWwgbGVuZ3RoLlxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRFTyA9IGRhdGFQb2ludEVPc1tpXTtcblxuXHRcdFx0XHR2YXIgc2l6ZSA9IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdFx0Ly8gVG8gbWFrZSBzdXJlIHRoYXQgbnVsbCB0ZXh0IG9yIGVtcHR5IHN0cmluZ3MgZG9uJ3QgYWZmZWN0IHRoZSByYWRpdXMuIFJlcXVpcmVkIHdoZW4gdXNlciBpcyBub3Qgc2hvd2luZyBhbnkgbGFiZWxzXG5cdFx0XHRcdGlmIChzaXplLmhlaWdodCA9PT0gMCB8fCBzaXplLndpZHRoID09PSAwKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHZhciB4T3ZlcmZsb3cgPSAwO1xuXHRcdFx0XHR2YXIgeGRyID0gMDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiKSB7XG5cdFx0XHRcdFx0eE92ZXJmbG93ID0gcGxvdEFyZWEueDIgLSAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay54ICsgZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay53aWR0aCArIGluZGV4TGFiZWxMaW5lRWRnZUxlbmd0aCk7XG5cdFx0XHRcdFx0eE92ZXJmbG93ICo9IC0xO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhPdmVyZmxvdyA9IHBsb3RBcmVhLngxIC0gKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sud2lkdGggLSBpbmRleExhYmVsTGluZUVkZ2VMZW5ndGgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh4T3ZlcmZsb3cgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKCFyZXNpemVGbGFnICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0KSB7XG5cdFx0XHRcdFx0XHR2YXIgbmV3SW5kZXhMYWJlbE1heFdpZHRoID0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiID8gcGxvdEFyZWEueDIgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggOiBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggLSBwbG90QXJlYS54MTtcblx0XHRcdFx0XHRcdGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWF4V2lkdGggKiAuMyA+IG5ld0luZGV4TGFiZWxNYXhXaWR0aCA/IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0ID0gXCJcIiA6IGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2subWF4V2lkdGggPSBuZXdJbmRleExhYmVsTWF4V2lkdGggKiAuODU7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5tYXhXaWR0aCAqIC4zIDwgbmV3SW5kZXhMYWJlbE1heFdpZHRoKSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnggLT0gZGF0YVBvaW50RU8uaGVtaXNwaGVyZSA9PT0gXCJyaWdodFwiID8gMiA6IC0yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoTWF0aC5hYnMoZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay55IC0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyIC0gY2VudGVyLnkpIDwgb3V0ZXJSYWRpdXNcblx0XHRcdFx0XHRcdHx8IE1hdGguYWJzKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiAtIGNlbnRlci55KSA8IG91dGVyUmFkaXVzKSB7XG5cblx0XHRcdFx0XHRcdHhkciA9IHhPdmVyZmxvdyAvIE1hdGguYWJzKE1hdGguY29zKGRhdGFQb2ludEVPLmluZGV4TGFiZWxBbmdsZSkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoeGRyID4gOSlcblx0XHRcdFx0XHRcdFx0eGRyID0geGRyICogLjM7XG5cblx0XHRcdFx0XHRcdGlmICh4ZHIgPiBkZWx0YVIpXG5cdFx0XHRcdFx0XHRcdGRlbHRhUiA9IHhkcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgeU92ZXJmbG93ID0gMDtcblx0XHRcdFx0dmFyIHlkciA9IDA7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludEVPLmluZGV4TGFiZWxBbmdsZSA+IDAgJiYgZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlIDwgTWF0aC5QSSkge1xuXHRcdFx0XHRcdHlPdmVyZmxvdyA9IHBsb3RBcmVhLnkyIC0gKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueSArIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMiArIDUpO1xuXHRcdFx0XHRcdHlPdmVyZmxvdyAqPSAtMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR5T3ZlcmZsb3cgPSBwbG90QXJlYS55MSAtIChkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSBkYXRhUG9pbnRFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIgLSA1KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh5T3ZlcmZsb3cgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKCFyZXNpemVGbGFnICYmIGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0KSB7XG5cdFx0XHRcdFx0XHR2YXIgcG9zaXRpb25NdWx0aXBsaWVyID0gZGF0YVBvaW50RU8uaW5kZXhMYWJlbEFuZ2xlID4gMCAmJiBkYXRhUG9pbnRFTy5pbmRleExhYmVsQW5nbGUgPCBNYXRoLlBJID8gLTEgOiAxO1xuXHRcdFx0XHRcdFx0aWYgKHJlUG9zaXRpb25MYWJlbHMoaSwgeU92ZXJmbG93ICogcG9zaXRpb25NdWx0aXBsaWVyKSA9PT0gMClcblx0XHRcdFx0XHRcdFx0cmVQb3NpdGlvbkxhYmVscyhpLCAyICogcG9zaXRpb25NdWx0aXBsaWVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKE1hdGguYWJzKGRhdGFQb2ludEVPLmluZGV4TGFiZWxUZXh0QmxvY2sueCAtIGNlbnRlci54KSA8IG91dGVyUmFkaXVzKSB7XG5cblx0XHRcdFx0XHRcdHlkciA9IHlPdmVyZmxvdyAvIE1hdGguYWJzKE1hdGguc2luKGRhdGFQb2ludEVPLmluZGV4TGFiZWxBbmdsZSkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoeWRyID4gOSlcblx0XHRcdFx0XHRcdFx0eWRyID0geWRyICogLjM7XG5cblx0XHRcdFx0XHRcdGlmICh5ZHIgPiBkZWx0YVIpXG5cdFx0XHRcdFx0XHRcdGRlbHRhUiA9IHlkcjtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIHJlbW92ZUxhYmVsc0ZvclNtYWxsU2VnbWVudHModG90YWxPdmVybGFwLCBzdGFydEluZGV4LCBlbmRJbmRleCkge1xuXG5cdFx0XHRcdHZhciBkcEVPcyA9IFtdO1xuXHRcdFx0XHR2YXIgdG90YWxSZW1vdmVkTGFiZWxIZWlnaHQgPSAwO1xuXG5cdFx0XHRcdGZvciAodmFyIGkgPSBzdGFydEluZGV4OyB0cnVlOyBpID0gKGkgKyAxICsgZGF0YVBvaW50cy5sZW5ndGgpICUgZGF0YVBvaW50cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRkcEVPcy5wdXNoKGRhdGFQb2ludEVPc1tpXSk7XG5cblx0XHRcdFx0XHRpZiAoaSA9PT0gZW5kSW5kZXgpXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRwRU9zLnNvcnQoZnVuY3Rpb24gKGVudHJ5MSwgZW50cnkyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVudHJ5MS55IC0gZW50cnkyLnk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBkcEVPcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhciBkcEVPID0gZHBFT3NbaV07XG5cblx0XHRcdFx0XHRpZiAodG90YWxSZW1vdmVkTGFiZWxIZWlnaHQgPCB0b3RhbE92ZXJsYXAgKiAuNykge1xuXHRcdFx0XHRcdFx0dG90YWxSZW1vdmVkTGFiZWxIZWlnaHQgKz0gZHBFTy5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodDtcblx0XHRcdFx0XHRcdGRwRU8uaW5kZXhMYWJlbFRleHRCbG9jay50ZXh0ID0gXCJcIjtcblx0XHRcdFx0XHRcdGRwRU8uaW5kZXhMYWJlbFRleHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0ZHBFTy5pbmRleExhYmVsVGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vcmVzZXRBbmltYXRpb25GcmFtZSgxKTtcblx0XHRcdC8vYW5pbWF0ZSgpO1xuXHRcdFx0Ly93aW5kb3cuYWxlcnQoXCJuZXh0Pz9cIik7XG5cdFx0XHRmdW5jdGlvbiBza2lwTGFiZWxzKCkge1xuXHRcdFx0dmFyIG92ZXJsYXBTdGFydEluZGV4ID0gLTE7XG5cdFx0XHR2YXIgb3ZlcmxhcEVuZEluZGV4ID0gLTE7XG5cdFx0XHR2YXIgdG90YWxPdmVybGFwID0gMDtcblx0XHRcdFx0dmFyIHJlbW92ZUxhYmVscyA9IGZhbHNlO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRhdGFQb2ludHMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRyZW1vdmVMYWJlbHMgPSBmYWxzZTtcblx0XHRcdFx0Y3VycmVudERhdGFQb2ludCA9IGRhdGFQb2ludEVPc1trXTtcblxuXHRcdFx0XHRpZiAoIWN1cnJlbnREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHQpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIG5leHRMYWJlbEluZGV4ID0gZ2V0TmV4dExhYmVsSW5kZXgoayk7XG5cdFx0XHRcdGlmIChuZXh0TGFiZWxJbmRleCA9PT0gbnVsbClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR2YXIgbmV4dERhdGFQb2ludCA9IGRhdGFQb2ludEVPc1tuZXh0TGFiZWxJbmRleF07XG5cblx0XHRcdFx0ZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gMDtcblxuXHRcdFx0XHQvL2lmIChuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2sueSA+IGN1cnJlbnREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55KVxuXHRcdFx0XHQvL1x0ZGlzdGFuY2VGcm9tTmV4dExhYmVsID0gKG5leHREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay55IC0gKG5leHREYXRhUG9pbnQuaW5kZXhMYWJlbFRleHRCbG9jay5oZWlnaHQgLyAyKSkgLSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgKyAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpKTtcblx0XHRcdFx0Ly9lbHNlXG5cdFx0XHRcdC8vXHRkaXN0YW5jZUZyb21OZXh0TGFiZWwgPSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLnkgLSAoY3VycmVudERhdGFQb2ludC5pbmRleExhYmVsVGV4dEJsb2NrLmhlaWdodCAvIDIpKSAtIChuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2sueSArIChuZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2suaGVpZ2h0IC8gMikpO1xuXG5cdFx0XHRcdGRpc3RhbmNlRnJvbU5leHRMYWJlbCA9IGdldFZlcnRpY2FsRGlzdGFuY2VCZXR3ZWVuTGFiZWxzKGN1cnJlbnREYXRhUG9pbnQsIG5leHREYXRhUG9pbnQpO1xuXG5cdFx0XHRcdGlmIChkaXN0YW5jZUZyb21OZXh0TGFiZWwgPCAwICYmIGFyZURhdGFQb2ludHNUb29DbG9zZShjdXJyZW50RGF0YVBvaW50LCBuZXh0RGF0YVBvaW50KSkge1xuXHRcdFx0XHRcdFx0Ly9pZiAoZGlzdGFuY2VGcm9tTmV4dExhYmVsIDwgMCAmJiBhcmVEYXRhUG9pbnRzVG9vQ2xvc2UoY3VycmVudERhdGFQb2ludCwgbmV4dERhdGFQb2ludCkgKSB7XG5cdFx0XHRcdFx0aWYgKG92ZXJsYXBTdGFydEluZGV4IDwgMClcblx0XHRcdFx0XHRcdG92ZXJsYXBTdGFydEluZGV4ID0gaztcblxuXHRcdFx0XHRcdFx0aWYgKG5leHRMYWJlbEluZGV4ICE9PSBvdmVybGFwU3RhcnRJbmRleCkge1xuXHRcdFx0XHRcdFx0b3ZlcmxhcEVuZEluZGV4ID0gbmV4dExhYmVsSW5kZXg7XG5cblx0XHRcdFx0XHR0b3RhbE92ZXJsYXAgKz0gLWRpc3RhbmNlRnJvbU5leHRMYWJlbDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGsgJSBNYXRoLm1heChkYXRhUG9pbnRzLmxlbmd0aCAvIDEwLCAzKSA9PT0gMClcblx0XHRcdFx0XHRcdFx0cmVtb3ZlTGFiZWxzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vbmV4dERhdGFQb2ludC5pbmRleExhYmVsVGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0Ly9uZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2sudGV4dCA9IFwiXCI7XG5cdFx0XHRcdFx0Ly9uZXh0RGF0YVBvaW50LmluZGV4TGFiZWxUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0cmVtb3ZlTGFiZWxzID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVtb3ZlTGFiZWxzKSB7XG5cblx0XHRcdFx0XHRcdGlmICh0b3RhbE92ZXJsYXAgPiAwICYmIG92ZXJsYXBTdGFydEluZGV4ID49IDAgJiYgb3ZlcmxhcEVuZEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHJlbW92ZUxhYmVsc0ZvclNtYWxsU2VnbWVudHModG90YWxPdmVybGFwLCBvdmVybGFwU3RhcnRJbmRleCwgb3ZlcmxhcEVuZEluZGV4KTtcblxuXHRcdFx0XHRcdFx0b3ZlcmxhcFN0YXJ0SW5kZXggPSAtMTtcblx0XHRcdFx0XHRcdG92ZXJsYXBFbmRJbmRleCA9IC0xO1xuXHRcdFx0XHRcdFx0dG90YWxPdmVybGFwID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRvdGFsT3ZlcmxhcCA+IDApXG5cdFx0XHRcdHJlbW92ZUxhYmVsc0ZvclNtYWxsU2VnbWVudHModG90YWxPdmVybGFwLCBvdmVybGFwU3RhcnRJbmRleCwgb3ZlcmxhcEVuZEluZGV4KTtcblx0XHRcdH1cblxuXHRcdFx0c2tpcExhYmVscygpO1xuXG5cblx0XHR9XG5cdFx0Ly93aW5kb3cuYWxlcnQoXCJuZXh0Pz9cIik7XG5cblxuXHRcdC8vcmVzZXRBbmltYXRpb25GcmFtZShfdGhpcy5hbmltYXRpb25FbmFibGVkICYmIF90aGlzLnJlbmRlckNvdW50ID09PSAwID8gaXNDYW52YXNTdXBwb3J0ZWQgPyA2MCA6IDMwIDogMSk7XG5cdFx0Ly9hbmltYXRlKCk7XG5cblx0XHQvL2NvbnNvbGUubG9nKFwidG90YWxSZWN1cnNpb25zOiBcIiArIHRvdGFsUmVjdXJzaW9ucyk7XG5cdH1cblxuXG5cdHRoaXMucGllRG91Z2hudXRDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuXG5cdFx0aWYgKF90aGlzLmlzQW5pbWF0aW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGkgPSBlLmRhdGFQb2ludEluZGV4O1xuXHRcdHZhciBkYXRhUG9pbnQgPSBlLmRhdGFQb2ludDtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXM7XG5cblxuXHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXG5cdFx0Ly9kYXRhUG9pbnRFTyA9IF90aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXTtcblxuXHRcdGlmIChkYXRhUG9pbnQuZXhwbG9kZWQpXG5cdFx0XHRkYXRhUG9pbnQuZXhwbG9kZWQgPSBmYWxzZTtcblx0XHRlbHNlXG5cdFx0XHRkYXRhUG9pbnQuZXhwbG9kZWQgPSB0cnVlO1xuXG5cblx0XHQvLyBTbyB0aGF0IGl0IGRvZXNuJ3QgdHJ5IHRvIGV4cGxvZGUgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBzZWdtZW50XG5cdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRfdGhpcy5fYW5pbWF0b3IuYW5pbWF0ZSgwLCBleHBsb2RlRHVyYXRpb24sIGZ1bmN0aW9uIChmcmFjdGlvbkNvbXBsZXRlKSB7XG5cblx0XHRcdFx0ZXhwbG9kZVRvZ2dsZShmcmFjdGlvbkNvbXBsZXRlKTtcblx0XHRcdFx0cmVuZGVyQ2hhcnRFbGVtZW50c0luUGxvdEFyZWEoKTtcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhcIkV4cGxvZGUgU3RhcnRcIik7XG5cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybjtcblx0fVxuXG5cdGluaXRMYWJlbHMoKTtcblxuXHRwb3NpdGlvbkxhYmVscygpO1xuXHRwb3NpdGlvbkxhYmVscygpO1xuXHRwb3NpdGlvbkxhYmVscygpO1xuXHRwb3NpdGlvbkxhYmVscygpO1xuXG5cdHRoaXMuZGlzYWJsZVRvb2xUaXAgPSB0cnVlO1xuXHR0aGlzLl9hbmltYXRvci5hbmltYXRlKDAsIHRoaXMuYW5pbWF0ZWRSZW5kZXIgPyB0aGlzLmFuaW1hdGlvbkR1cmF0aW9uIDogMCwgZnVuY3Rpb24gKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdGFuaW1hdGUoZnJhY3Rpb25Db21wbGV0ZSk7XG5cdFx0cmVuZGVyQ2hhcnRFbGVtZW50c0luUGxvdEFyZWEoKTtcblxuXHR9LCBmdW5jdGlvbiAoKSB7XG5cblx0XHRfdGhpcy5kaXNhYmxlVG9vbFRpcCA9IGZhbHNlO1xuXHRcdF90aGlzLl9hbmltYXRvci5hbmltYXRlKDAsIF90aGlzLmFuaW1hdGVkUmVuZGVyID8gZXhwbG9kZUR1cmF0aW9uIDogMCwgZnVuY3Rpb24gKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdFx0ZXhwbG9kZVRvZ2dsZShmcmFjdGlvbkNvbXBsZXRlKTtcblx0XHRcdHJlbmRlckNoYXJ0RWxlbWVudHNJblBsb3RBcmVhKCk7XG5cblx0XHR9KTtcblxuXHRcdC8vY29uc29sZS5sb2coXCJBbmltYXRpb24gQ29tcGxldGVcIik7XG5cdH0pO1xuXG5cdGZ1bmN0aW9uIHJlbmRlckNoYXJ0RWxlbWVudHNJblBsb3RBcmVhKCkge1xuXG5cdFx0X3RoaXMucGxvdEFyZWEubGF5b3V0TWFuYWdlci5yZXNldCgpO1xuXG5cdFx0aWYgKF90aGlzLl90aXRsZSkge1xuXHRcdFx0aWYgKF90aGlzLl90aXRsZS5kb2NrSW5zaWRlUGxvdEFyZWEgfHwgKF90aGlzLl90aXRsZS5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIgJiYgX3RoaXMuX3RpdGxlLnZlcnRpY2FsQWxpZ24gPT09IFwiY2VudGVyXCIpKVxuXHRcdFx0XHRfdGhpcy5fdGl0bGUucmVuZGVyKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoX3RoaXMuc3VidGl0bGVzKVxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy5zdWJ0aXRsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHN1YnRpdGxlID0gX3RoaXMuc3VidGl0bGVzW2ldO1xuXHRcdFx0XHRpZiAoc3VidGl0bGUuZG9ja0luc2lkZVBsb3RBcmVhIHx8IChzdWJ0aXRsZS5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIgJiYgc3VidGl0bGUudmVydGljYWxBbGlnbiA9PT0gXCJjZW50ZXJcIikpXG5cdFx0XHRcdFx0c3VidGl0bGUucmVuZGVyKCk7XG5cdFx0XHR9XG5cblx0XHRpZiAoX3RoaXMubGVnZW5kKSB7XG5cdFx0XHRpZiAoX3RoaXMubGVnZW5kLmRvY2tJbnNpZGVQbG90QXJlYSB8fCAoX3RoaXMubGVnZW5kLmhvcml6b250YWxBbGlnbiA9PT0gXCJjZW50ZXJcIiAmJiBfdGhpcy5sZWdlbmQudmVydGljYWxBbGlnbiA9PT0gXCJjZW50ZXJcIikpXG5cdFx0XHRcdF90aGlzLmxlZ2VuZC5yZW5kZXIoKTtcblx0XHR9XG5cdH1cblxuXHQvL3RoaXMuY3R4LnN0cm9rZVJlY3QocGxvdEFyZWEueDEgKyAxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGggLSAyLCBwbG90QXJlYS5oZWlnaHQpO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgZ2hvc3RDdHggPSB0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7XG5cblx0dmFyIGF4aXNYUHJvcHMgPSBwbG90VW5pdC5heGlzWC5saW5lQ29vcmRpbmF0ZXM7XG5cdHZhciBheGlzWVByb3BzID0gcGxvdFVuaXQuYXhpc1kubGluZUNvb3JkaW5hdGVzO1xuXHR2YXIgbWFya2VycyA9IFtdO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cdGN0eC5zYXZlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdGdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0Z2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdGdob3N0Q3R4LmNsaXAoKTtcblx0fVxuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBjbG9zaW5nUGF0aCA9IFtdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblxuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cblx0XHR2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKHNlcmllc0lkKTtcblx0XHRnaG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IDIwO1xuXG5cdFx0bWFya2VycyA9IFtdO1xuXG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHR2YXIgaSA9IDAsIHgsIHkxLCB5Mjtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9jdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cdFx0XHR2YXIgY29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSB0cnVlO1xuXHRcdFx0Zm9yICg7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA9PT0gbnVsbCB8fCAhZGF0YVBvaW50c1tpXS55Lmxlbmd0aFxuXHRcdFx0XHRcdHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCIpIHtcblxuXHRcdFx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHkxID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbMF0gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MiA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzFdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHRpZiAoaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgfHwgcHJldkRhdGFOdWxsKSB7XG5cdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeTEpO1xuXHRcdFx0XHRcdHN0YXJ0UG9pbnQgPSB7XG5cdFx0XHRcdFx0XHR4OiB4LCB5OiB5MVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y2xvc2luZ1BhdGggPSBbXTtcblx0XHRcdFx0XHRjbG9zaW5nUGF0aC5wdXNoKHsgeDogeCwgeTogeTIgfSk7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkxKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IGZhbHNlO1xuXHRcdFx0XHRcdHByZXZEYXRhTnVsbCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5MSk7XG5cdFx0XHRcdFx0Y2xvc2luZ1BhdGgucHVzaCh7IHg6IHgsIHk6IHkyIH0pO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkxKTtcblxuXHRcdFx0XHRcdGlmIChpICUgMjUwID09IDApIHtcblx0XHRcdFx0XHRcdGNsb3NlQXJlYSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeCwgeTE6IHkxLCB5MjogeTJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSAhPT0gMCkge1xuXHRcdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLm1hcmtlclNpemUgPiAwIHx8IGRhdGFTZXJpZXMubWFya2VyU2l6ZSA+IDApIHtcblx0XHRcdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCB4LCB5MiwgY3R4KTtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHR4OiB4LCB5OiB5MiwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeTEsIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cblxuXHRcdFx0XHRcdFx0dmFyIG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxLCBjdHg6IGdob3N0Q3R4LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IG1hcmtlclByb3BzLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZTogbWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0XHRjb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclRoaWNrbmVzczogbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInJhbmdlQXJlYVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdGluZGV4S2V5d29yZDogMCxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnlbMF0gPD0gZGF0YVBvaW50c1tpXS55WzFdID8gLTEgOiAxLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJyYW5nZUFyZWFcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRpbmRleEtleXdvcmQ6IDEsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4LCB5OiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55WzBdIDw9IGRhdGFQb2ludHNbaV0ueVsxXSA/IDEgOiAtMSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2FsZXJ0KFwiaGlcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNsb3NlQXJlYSgpO1xuXG5cdFx0XHQvL3N0YXJ0UG9pbnQgPSB7IHg6IHgsIHk6IHkgfTtcblx0XHRcdFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhtYXJrZXJzKTtcblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHRmdW5jdGlvbiBjbG9zZUFyZWEoKSB7XG5cblx0XHRpZiAoIXN0YXJ0UG9pbnQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR2YXIgcG9pbnQgPSBudWxsO1xuXG5cdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApXG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRmb3IgKHZhciBpID0gY2xvc2luZ1BhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdHBvaW50ID0gY2xvc2luZ1BhdGhbaV07XG5cdFx0XHRjdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXHRcdFx0Z2hvc3RDdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXHRcdH1cblxuXG5cblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0Ly9jdHgubGluZVRvKHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55KTtcblxuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IGRhdGFTZXJpZXMuZmlsbE9wYWNpdHk7XG5cdFx0Y3R4LmZpbGwoKTtcblx0XHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdFx0Z2hvc3RDdHguZmlsbCgpO1xuXG5cdFx0Ly9pZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHQvL1x0Z2hvc3RDdHgubGluZVRvKHgsIGJhc2VZKTtcblx0XHQvL1x0Z2hvc3RDdHgubGluZVRvKHN0YXJ0UG9pbnQueCwgYmFzZVkpO1xuXHRcdC8vXHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHQvL1x0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdC8vfVxuXG5cdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApIHtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNsb3NpbmdQYXRoLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHBvaW50ID0gY2xvc2luZ1BhdGhbaV07XG5cdFx0XHRcdGN0eC5saW5lVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHgsIHkxKTtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeTEpO1xuXG5cdFx0c3RhcnRQb2ludCA9IHtcblx0XHRcdHg6IHgsIHk6IHkxXG5cdFx0fTtcblx0XHRjbG9zaW5nUGF0aCA9IFtdO1xuXHRcdGNsb3NpbmdQYXRoLnB1c2goeyB4OiB4LCB5OiB5MiB9KTtcblx0fVxuXG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgY29sb3IgPSBudWxsO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0dmFyIGkgPSAwLCB4MSwgeDIsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZnJvbSBkYXRhVGltZSBldmVyeXRpbWUgaXQgaXMgdXNlZC5cblxuXHQvL0luIGNhc2Ugb2YgQmFyIENoYXJ0LCB5WmVyb1RvUGl4ZWwgaXMgeCBjby1vcmRpbmF0ZSFcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogTWF0aC5taW4oKHRoaXMuaGVpZ2h0ICogLjE1KSwgdGhpcy5wbG90QXJlYS5oZWlnaHQgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0Ly92YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyB0b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHR2YXIgYmFyV2lkdGggPSAoKChwbG90QXJlYS5oZWlnaHQgLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblxuXHRcdC8vZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IGJhcldpZHRoIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50c1tpXS5nZXRUaW1lID8gZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS55ID09PSBudWxsIHx8ICFkYXRhUG9pbnRzW2ldLnkubGVuZ3RoXG5cdFx0XHRcdFx0fHwgdHlwZW9mIChkYXRhUG9pbnRzW2ldLnlbMF0pICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzFdKSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHQvL3ggYW5kIHkgYXJlIHBpeGVsIGNvLW9yZGluYXRlcyBvZiBwb2ludCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIFggYW5kIFkgdmFsdWVzXG5cdFx0XHRcdHgxID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbMF0gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR4MiA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzFdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXG5cdFx0XHRcdHZhciB5MSA9ICh5IC0gKHBsb3RVbml0LnBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcyAqIGJhcldpZHRoIC8gMikgKyAoKHBsb3RVbml0LnByZXZpb3VzRGF0YVNlcmllc0NvdW50ICsgaikgKiBiYXJXaWR0aCkpIDw8IDA7XG5cdFx0XHRcdHZhciB5MiA9IHkxICsgYmFyV2lkdGggPDwgMDtcblxuXHRcdFx0XHRpZiAoeDEgPiB4Mikge1xuXHRcdFx0XHRcdHZhciB0ZW1wID0geDE7XG5cdFx0XHRcdFx0eDEgPSB4Mjtcblx0XHRcdFx0XHR4MiA9IHRlbXA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2RyYXdSZWN0KGN0eCwgeDEsIHkxLCBwbG90QXJlYS54MiwgeTIsIFwiI0VFRUVFRVwiLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdC8vZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHBsb3RBcmVhLngyLCB5MiwgXCIjQkRDRUQzXCIsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHRcdC8vY29sb3IgPSBcIiMxQjQ5NjJcIjtcblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZGF0YVNlcmllcy5maWxsT3BhY2l0eSk7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwicmFuZ2VCYXJcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRpbmRleEtleXdvcmQ6IDAsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiBkYXRhUG9pbnRzW2ldLnlbMV0gPj0gZGF0YVBvaW50c1tpXS55WzBdID8geDEgOiB4MiwgeTogeTEgKyAoeTIgLSB5MSkgLyAyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnlbMV0gPj0gZGF0YVBvaW50c1tpXS55WzBdID8gLTEgOiAxLFxuXHRcdFx0XHRcdFx0Ym91bmRzOiB7XG5cdFx0XHRcdFx0XHRcdHgxOiBNYXRoLm1pbih4MSwgeDIpLCB5MTogeTEsIHgyOiBNYXRoLm1heCh4MSwgeDIpLCB5MjogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInJhbmdlQmFyXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0aW5kZXhLZXl3b3JkOiAxLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IHgyIDogeDEsIHk6IHkxICsgKHkyIC0geTEpIC8gMlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IDEgOiAtMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogTWF0aC5taW4oeDEsIHgyKSwgeTE6IHkxLCB4MjogTWF0aC5tYXgoeDEsIHgyKSwgeTI6IHkyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLmZhZGVJbkFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZUluUXVhZCwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBpID0gMCwgeCwgeTEsIHkyO1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGZyb20gZGF0YVRpbWUgZXZlcnl0aW1lIGl0IGlzIHVzZWQuXG5cblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogKHRoaXMud2lkdGggKiAuMDMpO1xuXHQvL3ZhciBtYXhCYXJXaWR0aCA9ICh0aGlzLndpZHRoICogLjAxNSk7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdC8vdmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgKiAuOSkgPDwgMDtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoIC8gcGxvdFVuaXQucGxvdFR5cGUudG90YWxEYXRhU2VyaWVzICogLjk7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cdC8vY3R4LmJlZ2luUGF0aCgpO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0Ly8gUmVkdWNpbmcgcGl4ZWxQZXJVbml0IGJ5IDEganVzdCB0byBvdmVyY29tZSBhbnkgcHJvYmxlbXMgZHVlIHRvIHJvdW5kaW5nIG9mZiBvZiBwaXhlbHMuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0Ly92YXIgb2Zmc2V0WCA9IGJhcldpZHRoICogcGxvdFVuaXQuaW5kZXggPDwgMDtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA9PT0gbnVsbCB8fCAhZGF0YVBvaW50c1tpXS55Lmxlbmd0aFxuXHRcdFx0XHRcdHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHkxID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnlbMF0gLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MiA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzFdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHQvL3ZhciB4MSA9IHggLSBiYXJXaWR0aCAvIDIgPDwgMDtcblx0XHRcdFx0dmFyIHgxID0geCAtIChwbG90VW5pdC5wbG90VHlwZS50b3RhbERhdGFTZXJpZXMgKiBiYXJXaWR0aCAvIDIpICsgKChwbG90VW5pdC5wcmV2aW91c0RhdGFTZXJpZXNDb3VudCArIGopICogYmFyV2lkdGgpIDw8IDA7XG5cdFx0XHRcdHZhciB4MiA9IHgxICsgYmFyV2lkdGggPDwgMDtcblx0XHRcdFx0dmFyIHkxO1xuXHRcdFx0XHR2YXIgeTI7XG5cblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cblx0XHRcdFx0aWYgKHkxID4geTIpIHtcblx0XHRcdFx0XHR2YXIgdGVtcCA9IHkxO1xuXHRcdFx0XHRcdHkxID0geTI7XG5cdFx0XHRcdFx0eTIgPSB0ZW1wO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTJcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvL3ZhciBib3JkZXJUaGlja25lc3MgPSBNYXRoLm1heCgxLCAoYmFyV2lkdGggKiAuMSA8PCAwKSk7XG5cdFx0XHRcdHZhciBib3JkZXJUaGlja25lc3MgPSAwO1xuXG5cdFx0XHRcdGRyYXdSZWN0KGN0eCwgeDEsIHkxLCB4MiwgeTIsIGNvbG9yLCBib3JkZXJUaGlja25lc3MsIGNvbG9yLCBiZXZlbEVuYWJsZWQsIGJldmVsRW5hYmxlZCwgZmFsc2UsIGZhbHNlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5KTtcblx0XHRcdFx0Y29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0ZHJhd1JlY3QodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInJhbmdlQ29sdW1uXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0aW5kZXhLZXl3b3JkOiAwLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeDEgKyAoeDIgLSB4MSkgLyAyLCB5OiBkYXRhUG9pbnRzW2ldLnlbMV0gPj0gZGF0YVBvaW50c1tpXS55WzBdID8geTIgOiB5MVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IC0xIDogMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogeDEsIHkxOiBNYXRoLm1pbih5MSwgeTIpLCB4MjogeDIsIHkyOiBNYXRoLm1heCh5MSwgeTIpXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJyYW5nZUNvbHVtblwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdGluZGV4S2V5d29yZDogMSxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgxICsgKHgyIC0geDEpIC8gMiwgeTogZGF0YVBvaW50c1tpXS55WzFdID49IGRhdGFQb2ludHNbaV0ueVswXSA/IHkxIDogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueVsxXSA+PSBkYXRhUG9pbnRzW2ldLnlbMF0gPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHgxLCB5MTogTWF0aC5taW4oeTEsIHkyKSwgeDI6IHgyLCB5MjogTWF0aC5tYXgoeTEsIHkyKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIuZmFkZUluQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlSW5RdWFkLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBnaG9zdEN0eCA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcblxuXHR2YXIgYXhpc1hQcm9wcyA9IHBsb3RVbml0LmF4aXNYLmxpbmVDb29yZGluYXRlcztcblx0dmFyIGF4aXNZUHJvcHMgPSBwbG90VW5pdC5heGlzWS5saW5lQ29vcmRpbmF0ZXM7XG5cdHZhciBtYXJrZXJzID0gW107XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblx0Y3R4LnNhdmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblxuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cblx0XHR2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKHNlcmllc0lkKTtcblx0XHRnaG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IDIwO1xuXG5cdFx0bWFya2VycyA9IFtdO1xuXG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHR2YXIgaSA9IDAsIHgsIHkxLCB5Mjtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0dmFyIHBpeGVsc1kxID0gW107XG5cdFx0dmFyIHBpeGVsc1kyID0gW107XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblx0XHRcdGNvbG9yID0gZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cblx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS55ID09PSBudWxsIHx8ICFkYXRhUG9pbnRzW2ldLnkubGVuZ3RoIHx8IHR5cGVvZiAoZGF0YVBvaW50c1tpXS55WzBdKSAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKGRhdGFQb2ludHNbaV0ueVsxXSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblx0XHRcdFx0XHRcdHBpeGVsc1kxID0gW107XG5cdFx0XHRcdFx0XHRwaXhlbHNZMiA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5MSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55WzBdIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eTIgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueVsxXSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeTEsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHBpeGVsc1kxW3BpeGVsc1kxLmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0eDogeCwgeTogeTFcblx0XHRcdFx0fTtcblx0XHRcdFx0cGl4ZWxzWTJbcGl4ZWxzWTIubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHR4OiB4LCB5OiB5MlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHkxLCBjdHgpO1xuXHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKG1hcmtlclByb3BzKTtcblxuXHRcdFx0XHRcdFx0Ly9pZiAoIWRhdGFTZXJpZXMubWF4V2lkdGhJblggfHwgbWFya2VyUHJvcHMuc2l6ZSA+IGRhdGFTZXJpZXMubWF4V2lkdGhJblgpIHtcblx0XHRcdFx0XHRcdC8vXHRkYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gbWFya2VyUHJvcHMuc2l6ZSAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cdFx0XHRcdFx0XHQvL31cblxuXHRcdFx0XHRcdFx0dmFyIG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxLCBjdHg6IGdob3N0Q3R4LFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IG1hcmtlclByb3BzLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZTogbWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0XHRjb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlclRoaWNrbmVzczogbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeTIsIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeTIsIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRzaXplOiBtYXJrZXJQcm9wcy5zaXplLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHQvL1JlbmRlciBJbmRleCBMYWJlbHNcblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3BsaW5lQXJlYVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdGluZGV4S2V5d29yZDogMCxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHkxXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnlbMF0gPD0gZGF0YVBvaW50c1tpXS55WzFdID8gLTEgOiAxLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzcGxpbmVBcmVhXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0aW5kZXhLZXl3b3JkOiAxLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueVswXSA8PSBkYXRhUG9pbnRzW2ldLnlbMV0gPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblxuXHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0ZnVuY3Rpb24gcmVuZGVyQmV6aWVyQXJlYSgpIHtcblx0XHR2YXIgYnAgPSBnZXRCZXppZXJQb2ludHMocGl4ZWxzWTEsIDIpO1xuXG5cdFx0aWYgKGJwLmxlbmd0aCA+IDApIHtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oYnBbMF0ueCwgYnBbMF0ueSk7XG5cblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKGJwWzBdLngsIGJwWzBdLnkpO1xuXHRcdFx0fVxuXG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYnAubGVuZ3RoIC0gMzsgaSArPSAzKSB7XG5cblx0XHRcdFx0Y3R4LmJlemllckN1cnZlVG8oYnBbaSArIDFdLngsIGJwW2kgKyAxXS55LCBicFtpICsgMl0ueCwgYnBbaSArIDJdLnksIGJwW2kgKyAzXS54LCBicFtpICsgM10ueSk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LmJlemllckN1cnZlVG8oYnBbaSArIDFdLngsIGJwW2kgKyAxXS55LCBicFtpICsgMl0ueCwgYnBbaSArIDJdLnksIGJwW2kgKyAzXS54LCBicFtpICsgM10ueSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwKVxuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdGJwID0gZ2V0QmV6aWVyUG9pbnRzKHBpeGVsc1kyLCAyKTtcblxuXHRcdFx0Y3R4LmxpbmVUbyhwaXhlbHNZMltwaXhlbHNZMi5sZW5ndGggLSAxXS54LCBwaXhlbHNZMltwaXhlbHNZMi5sZW5ndGggLSAxXS55KTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IGJwLmxlbmd0aCAtIDE7IGkgPiAyOyBpIC09IDMpIHtcblxuXHRcdFx0XHRjdHguYmV6aWVyQ3VydmVUbyhicFtpIC0gMV0ueCwgYnBbaSAtIDFdLnksIGJwW2kgLSAyXS54LCBicFtpIC0gMl0ueSwgYnBbaSAtIDNdLngsIGJwW2kgLSAzXS55KTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0Z2hvc3RDdHguYmV6aWVyQ3VydmVUbyhicFtpIC0gMV0ueCwgYnBbaSAtIDFdLnksIGJwW2kgLSAyXS54LCBicFtpIC0gMl0ueSwgYnBbaSAtIDNdLngsIGJwW2kgLSAzXS55KTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApIHtcblx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRjdHgubW92ZVRvKHBpeGVsc1kyW3BpeGVsc1kyLmxlbmd0aCAtIDFdLngsIHBpeGVsc1kyW3BpeGVsc1kyLmxlbmd0aCAtIDFdLnkpO1xuXG5cdFx0XHRcdGZvciAodmFyIGkgPSBicC5sZW5ndGggLSAxOyBpID4gMjsgaSAtPSAzKSB7XG5cblx0XHRcdFx0XHRjdHguYmV6aWVyQ3VydmVUbyhicFtpIC0gMV0ueCwgYnBbaSAtIDFdLnksIGJwW2kgLSAyXS54LCBicFtpIC0gMl0ueSwgYnBbaSAtIDNdLngsIGJwW2kgLSAzXS55KTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlemllckN1cnZlVG8oYnBbaSAtIDFdLngsIGJwW2kgLSAxXS55LCBicFtpIC0gMl0ueCwgYnBbaSAtIDJdLnksIGJwW2kgLSAzXS54LCBicFtpIC0gM10ueSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cblxuXHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5maWxsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbi8vI3JlZ2lvbiBwaWVDaGFydFxuXG52YXIgZHJhd1NlZ21lbnQgPSBmdW5jdGlvbiAoY3R4LCBjZW50ZXIsIHJhZGl1cywgY29sb3IsIHR5cGUsIHRoZXRhMSwgdGhldGEyLCBmaWxsT3BhY2l0eSwgcGVyY2VudElubmVyUmFkaXVzKSB7XG5cblx0aWYgKHR5cGVvZiAoZmlsbE9wYWNpdHkpID09PSBcInVuZGVmaW5lZFwiKVxuXHRcdGZpbGxPcGFjaXR5ID0gMTtcblxuXHQvL0lFOC0gRklYOiBJbiBJRTgtIHNlZ21lbnQgZG9lc24ndCBnZXQgZHJhdyBpZiB0aGV0YTIgaXMgZXF1YWwgdG8gdGhldGExICsgMipQSS5cblx0aWYgKCFpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdHZhciB0aGV0YTJNb2QgPSBOdW1iZXIoKHRoZXRhMiAlICgyICogTWF0aC5QSSkpLnRvRml4ZWQoOCkpO1xuXHRcdHZhciB0aGV0YTFNb2QgPSBOdW1iZXIoKHRoZXRhMSAlICgyICogTWF0aC5QSSkpLnRvRml4ZWQoOCkpO1xuXHRcdGlmICh0aGV0YTFNb2QgPT09IHRoZXRhMk1vZClcblx0XHRcdHRoZXRhMiAtPSAuMDAwMTtcblx0fVxuXG5cdGN0eC5zYXZlKCk7XG5cdGN0eC5nbG9iYWxBbHBoYSA9IGZpbGxPcGFjaXR5O1xuXG5cdGlmICh0eXBlID09PSBcInBpZVwiKSB7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oY2VudGVyLngsIGNlbnRlci55KTtcblx0XHRjdHguYXJjKGNlbnRlci54LCBjZW50ZXIueSwgcmFkaXVzLCB0aGV0YTEsIHRoZXRhMiwgZmFsc2UpO1xuXHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIndoaXRlXCI7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IDI7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd09mZnNldFggPSAyO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gMTtcblx0XHQvLyAgICAgY3R4LnNoYWRvd0JsdXIgPSAyO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dDb2xvciA9ICcjQkZCRkJGJztcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0Ly9jdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LmZpbGwoKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlID09PSBcImRvdWdobnV0XCIpIHtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4LmFyYyhjZW50ZXIueCwgY2VudGVyLnksIHJhZGl1cywgdGhldGExLCB0aGV0YTIsIGZhbHNlKTtcblx0XHRjdHguYXJjKGNlbnRlci54LCBjZW50ZXIueSwgcGVyY2VudElubmVyUmFkaXVzICogcmFkaXVzLCB0aGV0YTIsIHRoZXRhMSwgdHJ1ZSk7XG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIndoaXRlXCI7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IDI7XG5cdFx0Ly8gc2hhZG93IHByb3BlcnRpZXNcblx0XHQvLyAgICAgY3R4LnNoYWRvd09mZnNldFggPSAxO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gMTtcblx0XHQvLyAgICAgY3R4LnNoYWRvd0JsdXIgPSAxO1xuXHRcdC8vICAgIGN0eC5zaGFkb3dDb2xvciA9ICcjQkZCRkJGJzsgIC8vZ3JleSBzaGFkb3dcblx0XHQvL2N0eC5zdHJva2UoKTtcblx0XHRjdHguZmlsbCgpO1xuXHR9XG5cblx0Y3R4Lmdsb2JhbEFscGhhID0gMTtcblxuXHRjdHgucmVzdG9yZSgpO1xufTtcbiIsIlxuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgaW50VG9IZXhDb2xvclN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBpID0gMCwgeCwgeTtcblx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBmcm9tIGRhdGFUaW1lIGV2ZXJ5dGltZSBpdCBpcyB1c2VkLlxuXG5cdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSkgPDwgMDtcblxuXHR2YXIgbWF4QmFyV2lkdGggPSB0aGlzLmRhdGFQb2ludE1heFdpZHRoID8gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA6IHRoaXMud2lkdGggKiAuMTUgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyB0b3RhbERhdGFTZXJpZXMgKiAuOSkgPDwgMDtcblxuXG5cdGN0eC5zYXZlKCk7XG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPT0gMSlcblx0XHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cblx0XHRpZiAoYmFyV2lkdGggPCAxKVxuXHRcdFx0YmFyV2lkdGggPSAxO1xuXHRcdGVsc2UgaWYgKGJhcldpZHRoID4gbWF4QmFyV2lkdGgpXG5cdFx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgPyBmYWxzZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdHZhciBtYXhBcmVhID0gTWF0aC5wb3coTWF0aC5taW4ocGxvdEFyZWEuaGVpZ2h0LCBwbG90QXJlYS53aWR0aCkgKiAuMyAvIDIsIDIpICogTWF0aC5QSTtcblxuXHRcdFx0dmFyIHByZXZEYXRhUG9pbnRYID0gMDtcblx0XHRcdHZhciBwcmV2RGF0YVBvaW50WSA9IDA7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLmdldFRpbWUgPyBkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHkgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cblx0XHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gZGF0YVNlcmllcy5maWxsT3BhY2l0eTtcblx0XHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXIobWFya2VyUHJvcHMueCwgbWFya2VyUHJvcHMueSwgbWFya2VyUHJvcHMuY3R4LCBtYXJrZXJQcm9wcy50eXBlLCBtYXJrZXJQcm9wcy5zaXplLCBtYXJrZXJQcm9wcy5jb2xvciwgbWFya2VyUHJvcHMuYm9yZGVyQ29sb3IsIG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzcyk7XG5cdFx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblxuXHRcdFx0XHQvL2lmIChNYXRoLmFicyhwcmV2RGF0YVBvaW50WCAtIHgpIDwgbWFya2VyUHJvcHMuc2l6ZSAvIDIgJiYgTWF0aC5hYnMocHJldkRhdGFQb2ludFkgLSB5KSA8IG1hcmtlclByb3BzLnNpemUgLyAyKSB7XG5cdFx0XHRcdC8vICAgIGNvbnRpbnVlO1xuXHRcdFx0XHQvL31cblxuXHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHQvL31cblxuXHRcdFx0XHRpZiAoKE1hdGguc3FydCgocHJldkRhdGFQb2ludFggLSB4KSAqIChwcmV2RGF0YVBvaW50WCAtIHgpICsgKHByZXZEYXRhUG9pbnRZIC0geSkgKiAocHJldkRhdGFQb2ludFkgLSB5KSkgPCBNYXRoLm1pbihtYXJrZXJQcm9wcy5zaXplLCA1KSlcblx0XHRcdFx0XHQmJiBkYXRhUG9pbnRzLmxlbmd0aCA+IChNYXRoLm1pbih0aGlzLnBsb3RBcmVhLndpZHRoLCB0aGlzLnBsb3RBcmVhLmhlaWdodCkpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBJRCBvbiBHaG9zdCBDYW52YXMgLSBmb3IgZXZlbnQgaGFuZGxpbmdcblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeCwgeTE6IHlcblx0XHRcdFx0fTtcblx0XHRcdFx0dmFyIG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXIoXG5cdFx0XHRcdFx0XHRcdG1hcmtlclByb3BzLngsIG1hcmtlclByb3BzLnksIHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0bWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0bWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0bWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9tYXJrZXJzLnB1c2goKTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzY2F0dGVyXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogMSxcblx0XHRcdFx0XHRcdGJvdW5kczoge1xuXHRcdFx0XHRcdFx0XHR4MTogeCAtIG1hcmtlclByb3BzLnNpemUgLyAyLCB5MTogeSAtIG1hcmtlclByb3BzLnNpemUgLyAyLCB4MjogeCArIG1hcmtlclByb3BzLnNpemUgLyAyLCB5MjogeSArIG1hcmtlclByb3BzLnNpemUgLyAyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcmV2RGF0YVBvaW50WCA9IHg7XG5cdFx0XHRcdHByZXZEYXRhUG9pbnRZID0geTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLmZhZGVJbkFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZUluUXVhZCwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHRcdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0XHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXHRcdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdHZhciBnaG9zdEN0eCA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcblxuXHRcdGN0eC5zYXZlKCk7XG5cblx0XHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Y3R4LmNsaXAoKTtcblxuXHRcdHZhciBtYXJrZXJzID0gW107XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdFx0b2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4XG5cdFx0XHR9O1xuXHRcdFx0dmFyIGhleENvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhzZXJpZXNJZCk7XG5cdFx0XHRnaG9zdEN0eC5zdHJva2VTdHlsZSA9IGhleENvbG9yO1xuXHRcdFx0Ly9naG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0XHRnaG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwID8gTWF0aC5tYXgoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzLCA0KSA6IDA7XG5cblx0XHRcdHZhciBjb2xvclNldCA9IGRhdGFTZXJpZXMuX2NvbG9yU2V0O1xuXHRcdFx0dmFyIGNvbG9yID0gY29sb3JTZXRbMF07XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblxuXHRcdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHRcdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgYmFjayBhbmQgZm9ydGguXG5cblx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLl9vcHRpb25zLm1hcmtlclNpemUgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aCA8IDEwMDApXG5cdFx0XHQvLyAgICBkYXRhU2VyaWVzLm1hcmtlclNpemUgPSA4O1xuXG5cdFx0XHR2YXIgcGl4ZWxzID0gW107XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblxuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Ly9pZiAoIWlzRmluaXRlKGRhdGFQb2ludHNbaV0ueSkpXG5cdFx0XHRcdFx0Ly8gICAgY29udGludWU7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoaSA+IDApIHsvLyBpZiBmaXJzdCBkYXRhUG9pbnQgaXMgbnVsbCB0aGVuIG5vIG5lZWQgdG8gY2FsbCBzdHJva2UgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdHJlbmRlckJlemllcihwaXhlbHMpO1xuXHRcdFx0XHRcdFx0XHRwaXhlbHMgPSBbXTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXHRcdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHRcdH07XG5cblxuXHRcdFx0XHRcdHBpeGVsc1twaXhlbHMubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHR9O1xuXG5cblx0XHRcdFx0XHQvL0FkZCBNYXJrZXJzXG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeSwgY3R4KTtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdFx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcImluZGV4OiBcIiArIGkgKyBcIjsgaWQ6IFwiICsgaWQgKyBcIjsgaGV4OiBcIiArIG1hcmtlckNvbG9yKTtcblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHksIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRzaXplOiBtYXJrZXJQcm9wcy5zaXplLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly9BZGQgTGFiZWxzXG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInNwbGluZVwiLFxuXHRcdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmVuZGVyQmV6aWVyKHBpeGVscyk7XG5cdFx0fVxuXG5cdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cblx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblxuXHRcdGZ1bmN0aW9uIHJlbmRlckJlemllcihwaXhlbHMpIHtcblxuXHRcdFx0dmFyIGJwID0gZ2V0QmV6aWVyUG9pbnRzKHBpeGVscywgMik7XG5cblx0XHRcdGlmIChicC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXG5cdFx0XHRcdGN0eC5tb3ZlVG8oYnBbMF0ueCwgYnBbMF0ueSk7XG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oYnBbMF0ueCwgYnBbMF0ueSk7XG5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBicC5sZW5ndGggLSAzOyBpICs9IDMpIHtcblxuXHRcdFx0XHRcdGN0eC5iZXppZXJDdXJ2ZVRvKGJwW2kgKyAxXS54LCBicFtpICsgMV0ueSwgYnBbaSArIDJdLngsIGJwW2kgKyAyXS55LCBicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHguYmV6aWVyQ3VydmVUbyhicFtpICsgMV0ueCwgYnBbaSArIDFdLnksIGJwW2kgKyAyXS54LCBicFtpICsgMl0ueSwgYnBbaSArIDNdLngsIGJwW2kgKyAzXS55KTtcblxuXHRcdFx0XHRcdGlmIChpID4gMCAmJiBpICUgMzAwMCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y3R4Lm1vdmVUbyhicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oYnBbaSArIDNdLngsIGJwW2kgKyAzXS55KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0XHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdFx0fTtcblx0XHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcblx0fVxuXG5cdHZhciBkcmF3UmVjdCA9IGZ1bmN0aW9uIChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYm9yZGVyVGhpY2tuZXNzLCBib3JkZXJDb2xvciwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBmaWxsT3BhY2l0eSkge1xuXHRcdGlmICh0eXBlb2YgKGZpbGxPcGFjaXR5KSA9PT0gXCJ1bmRlZmluZWRcIilcblx0XHRcdGZpbGxPcGFjaXR5ID0gMTtcblxuXHRcdGJvcmRlclRoaWNrbmVzcyA9IGJvcmRlclRoaWNrbmVzcyB8fCAwO1xuXHRcdGJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3IgfHwgXCJibGFja1wiO1xuXHRcdC8vYWxlcnQoXCJ0b3BcIisgdG9wICsgXCJib3R0b21cIiArIGJvdHRvbSArIFwiIGx0XCIgKyBsZWZ0KyBcInJ0XCIgKyByaWdodCApXG5cdFx0dmFyIGExID0geDEsIGEyID0geDIsIGIxID0geTEsIGIyID0geTIsIGVkZ2VZLCBlZGdlWDtcblx0XHRpZiAoeDIgLSB4MSA+IDE1ICYmIHkyIC0geTEgPiAxNSlcblx0XHRcdHZhciBiZXZlbERlcHRoID0gODtcblx0XHRlbHNlXG5cdFx0XHR2YXIgYmV2ZWxEZXB0aCA9IDAuMzUgKiBNYXRoLm1pbigoeDIgLSB4MSksICh5MiAtIHkxKSk7XG5cdFx0Ly9hbGVydChhMSArIFwiXCIgKyBhMik7XG5cdFx0dmFyIGNvbG9yMiA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAuNClcIjtcblx0XHR2YXIgY29sb3IzID0gXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSlcIjtcblx0XHQvL2NvbG9yMSA9IFwicmdiYShcIiArIHIgKyBcIixcIiArIGcgKyBcIiwgXCIgKyBiICsgXCIsMSlcIjtcblx0XHR2YXIgY29sb3IxID0gY29sb3I7XG5cblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdGN0eC5zYXZlKCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yMTtcblxuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IGZpbGxPcGFjaXR5O1xuXHRcdGN0eC5maWxsUmVjdCh4MSwgeTEsIHgyIC0geDEsIHkyIC0geTEpO1xuXHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRpZiAoYm9yZGVyVGhpY2tuZXNzID4gMCkge1xuXHRcdFx0dmFyIG9mZnNldCA9IGJvcmRlclRoaWNrbmVzcyAlIDIgPT09IDAgPyAwIDogLjU7XG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubGluZVdpZHRoID0gYm9yZGVyVGhpY2tuZXNzO1xuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG5cdFx0XHRjdHgubW92ZVRvKHgxLCB5MSk7XG5cdFx0XHRjdHgucmVjdCh4MSAtIG9mZnNldCwgeTEgLSBvZmZzZXQsIHgyIC0geDEgKyAyICogb2Zmc2V0LCB5MiAtIHkxICsgMiAqIG9mZnNldCk7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHQvLyAgIGN0eC5iZWdpblBhdGgoKTtcblx0XHRpZiAodG9wID09PSB0cnVlKSB7XG5cdFx0XHQvLyBhbGVydCh4MSArIFwiXCIgKyB4MiArIFwiIFwiICsgYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHguc2F2ZSgpO1xuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHgubGluZVRvKHgyIC0gYmV2ZWxEZXB0aCwgeTEgKyBiZXZlbERlcHRoKTtcblx0XHRcdGN0eC5saW5lVG8oeDIsIHkxKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoKHgyICsgeDEpIC8gMiwgYjEgKyBiZXZlbERlcHRoLCAoeDIgKyB4MSkgLyAyLCBiMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMik7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdC8vICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblxuXG5cdFx0aWYgKGJvdHRvbSA9PT0gdHJ1ZSkge1xuXHRcdFx0Y3R4LnNhdmUoKTtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeDEsIHkyKTtcblx0XHRcdGN0eC5saW5lVG8oeDEgKyBiZXZlbERlcHRoLCB5MiAtIGJldmVsRGVwdGgpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkyIC0gYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHgubGluZVRvKHgyLCB5Mik7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHR2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KCh4MiArIHgxKSAvIDIsIGIyIC0gYmV2ZWxEZXB0aCwgKHgyICsgeDEpIC8gMiwgYjIpO1xuXHRcdFx0Z3JkLmFkZENvbG9yU3RvcCgwLCBjb2xvcjEpO1xuXHRcdFx0Z3JkLmFkZENvbG9yU3RvcCgxLCBjb2xvcjIpO1xuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRcdC8vICAgICAgIGN0eC5zdHJva2UoKTtcblx0XHRcdGN0eC5maWxsKCk7XG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblxuXHRcdGlmIChsZWZ0ID09PSB0cnVlKSB7XG5cdFx0XHQvLyAgIGFsZXJ0KHgxKVxuXHRcdFx0Y3R4LnNhdmUoKTtcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeDEsIHkxKVxuXHRcdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0XHRjdHgubGluZVRvKHgxICsgYmV2ZWxEZXB0aCwgeTIgLSBiZXZlbERlcHRoKTtcblx0XHRcdGN0eC5saW5lVG8oeDEsIHkyKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoYTEgKyBiZXZlbERlcHRoLCAoeTIgKyB5MSkgLyAyLCBhMSwgKHkyICsgeTEpIC8gMik7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdC8vICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdH1cblxuXG5cdFx0aWYgKHJpZ2h0ID09PSB0cnVlKSB7XG5cdFx0XHRjdHguc2F2ZSgpO1xuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4MiwgeTEpXG5cdFx0XHRjdHgubGluZVRvKHgyIC0gYmV2ZWxEZXB0aCwgeTEgKyBiZXZlbERlcHRoKTtcblx0XHRcdGN0eC5saW5lVG8oeDIgLSBiZXZlbERlcHRoLCB5MiAtIGJldmVsRGVwdGgpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4MiwgeTIpO1xuXHRcdFx0dmFyIGdyZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudChhMiAtIGJldmVsRGVwdGgsICh5MiArIHkxKSAvIDIsIGEyLCAoeTIgKyB5MSkgLyAyKTtcblx0XHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRcdGdyZC5hZGRDb2xvclN0b3AoMSwgY29sb3IzKTtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBncmQ7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yMSk7XG5cdFx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdC8vICAgICAgICAgIGN0eC5zdHJva2UoKTtcblx0XHRcdGN0eC5yZXN0b3JlKCk7XG5cdFx0fVxuXHRcdC8vXG5cblx0fVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBnaG9zdEN0eCA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcblxuXHR2YXIgYXhpc1hQcm9wcyA9IHBsb3RVbml0LmF4aXNYLmxpbmVDb29yZGluYXRlcztcblx0dmFyIGF4aXNZUHJvcHMgPSBwbG90VW5pdC5heGlzWS5saW5lQ29vcmRpbmF0ZXM7XG5cdHZhciBtYXJrZXJzID0gW107XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblx0Y3R4LnNhdmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblxuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cblx0XHR2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKHNlcmllc0lkKTtcblx0XHRnaG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHQvL2dob3N0Q3R4LmxpbmVXaWR0aCA9IDIwO1xuXG5cdFx0bWFya2VycyA9IFtdO1xuXG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblx0XHR2YXIgaSA9IDAsIHgsIHk7XG5cdFx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBiYWNrIGFuZCBmb3J0aC5cblxuXHRcdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdHZhciBiYXNlWTtcblxuXHRcdHZhciBzdGFydFBvaW50ID0gbnVsbDtcblxuXHRcdHZhciBwaXhlbHMgPSBbXTtcblxuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCIjNDU3MkE3IFwiO1xuXHRcdFx0Y29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFtpICUgZGF0YVNlcmllcy5fY29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblx0XHRcdFx0XHRcdHBpeGVscyA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeCwgeTE6IHlcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRwaXhlbHNbcGl4ZWxzLmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXG5cdFx0XHRcdC8vUmVuZGVyIEluZGV4IExhYmVsc1xuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzcGxpbmVBcmVhXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludHNbaV0sXG5cdFx0XHRcdFx0XHRkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJlbmRlckJlemllckFyZWEoKTtcblxuXHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0ZnVuY3Rpb24gcmVuZGVyQmV6aWVyQXJlYSgpIHtcblx0XHR2YXIgYnAgPSBnZXRCZXppZXJQb2ludHMocGl4ZWxzLCAyKTtcblxuXHRcdGlmIChicC5sZW5ndGggPiAwKSB7XG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubW92ZVRvKGJwWzBdLngsIGJwWzBdLnkpO1xuXG5cdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyhicFswXS54LCBicFswXS55KTtcblx0XHRcdH1cblxuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJwLmxlbmd0aCAtIDM7IGkgKz0gMykge1xuXG5cdFx0XHRcdGN0eC5iZXppZXJDdXJ2ZVRvKGJwW2kgKyAxXS54LCBicFtpICsgMV0ueSwgYnBbaSArIDJdLngsIGJwW2kgKyAyXS55LCBicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRnaG9zdEN0eC5iZXppZXJDdXJ2ZVRvKGJwW2kgKyAxXS54LCBicFtpICsgMV0ueSwgYnBbaSArIDJdLngsIGJwW2kgKyAyXS55LCBicFtpICsgM10ueCwgYnBbaSArIDNdLnkpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwKVxuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdGlmIChwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0gPD0gMCAmJiBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1heGltdW0gPj0gMCkge1xuXHRcdFx0XHRiYXNlWSA9IHlaZXJvVG9QaXhlbDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWF4aW11bSA8IDApXG5cdFx0XHRcdGJhc2VZID0gYXhpc1lQcm9wcy55MTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSA+IDApXG5cdFx0XHRcdGJhc2VZID0gYXhpc1hQcm9wcy55MjtcblxuXHRcdFx0c3RhcnRQb2ludCA9IHtcblx0XHRcdFx0eDogYnBbMF0ueCwgeTogYnBbMF0ueVxuXHRcdFx0fTtcblxuXHRcdFx0Y3R4LmxpbmVUbyhicFticC5sZW5ndGggLSAxXS54LCBiYXNlWSk7XG5cdFx0XHRjdHgubGluZVRvKHN0YXJ0UG9pbnQueCwgYmFzZVkpO1xuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oYnBbYnAubGVuZ3RoIC0gMV0ueCwgYmFzZVkpO1xuXHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oc3RhcnRQb2ludC54LCBiYXNlWSk7XG5cdFx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5maWxsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZCwgY29tcGFyZU51bWJlcnMsIGludFRvSGV4Q29sb3JTdHJpbmcsIGdldExpbmVEYXNoQXJyYXl9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblx0dmFyIG1hcmtlcnMgPSBbXTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBvZmZzZXRZID0gW107XG5cblx0dmFyIGFsbFhWYWx1ZXMgPSBbXTtcblx0Ly92YXIgb2Zmc2V0TmVnYXRpdmVZID0gW107XG5cblx0dmFyIGkgPSAwLCB4LCB5O1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGV2ZXJ5dGltZSBpdCBpcyBhY2Nlc3NlZC5cblxuXHQvL3ZhciB5WmVyb1RvUGl4ZWwgPSAoYXhpc1lQcm9wcy55MiAtIGF4aXNZUHJvcHMuaGVpZ2h0IC8gcmFuZ2VZICogTWF0aC5hYnMoMCAtIHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKyAuNSkgPDwgMDtcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHRnaG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHR2YXIgeFZhbHVlUHJlc2VudCA9IFtdO1xuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgeFZhbHVlO1xuXG5cdFx0ZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzID0gW107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0eFZhbHVlID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXHRcdFx0ZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW3hWYWx1ZV0gPSBpO1xuXG5cdFx0XHRpZiAoIXhWYWx1ZVByZXNlbnRbeFZhbHVlXSkge1xuXHRcdFx0XHRhbGxYVmFsdWVzLnB1c2goeFZhbHVlKTtcblx0XHRcdFx0eFZhbHVlUHJlc2VudFt4VmFsdWVdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhbGxYVmFsdWVzLnNvcnQoY29tcGFyZU51bWJlcnMpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXG5cdFx0dmFyIGN1cnJlbnRCYXNlVmFsdWVzID0gW107XG5cblxuXHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzZXJpZXNJZF0gPSB7XG5cdFx0XHRvYmplY3RUeXBlOiBcImRhdGFTZXJpZXNcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXhcblx0XHR9O1xuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xuXG5cblxuXHRcdGlmIChhbGxYVmFsdWVzLmxlbmd0aCA+IDApIHtcblxuXHRcdFx0Y29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFswXTtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcblx0XHRcdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheShkYXRhU2VyaWVzLmxpbmVEYXNoVHlwZSwgZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhbGxYVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGFsbFhWYWx1ZXNbaV07XG5cdFx0XHRcdHZhciBkYXRhUG9pbnQgPSBudWxsO1xuXG5cdFx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXNbZGF0YVBvaW50WF0gPj0gMClcblx0XHRcdFx0XHRkYXRhUG9pbnQgPSBkYXRhUG9pbnRzW2RhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXV07XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRkYXRhUG9pbnQgPSB7XG5cdFx0XHRcdFx0XHR4OiBkYXRhUG9pbnRYLCB5OiAwXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50LnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHZhciB4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0Ly92YXIgeSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50LnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR2YXIgeSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50LnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSk7XG5cblx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFlbZGF0YVBvaW50WF0gPyBvZmZzZXRZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHR5ID0geSAtIG9mZnNldDtcblx0XHRcdFx0Y3VycmVudEJhc2VWYWx1ZXMucHVzaCh7IHg6IHgsIHk6IHlaZXJvVG9QaXhlbCAtIG9mZnNldCB9KTtcblx0XHRcdFx0b2Zmc2V0WVtkYXRhUG9pbnRYXSA9IHlaZXJvVG9QaXhlbCAtIHk7XG5cblx0XHRcdFx0aWYgKGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhKSB7XG5cdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGkgJSAyNTAgPT0gMCkge1xuXG5cdFx0XHRcdFx0XHRpZiAoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMClcblx0XHRcdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAoY3VycmVudEJhc2VWYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgcG9pbnQgPSBjdXJyZW50QmFzZVZhbHVlcy5wb3AoKTtcblx0XHRcdFx0XHRcdFx0Y3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdFx0XHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gZGF0YVNlcmllcy5maWxsT3BhY2l0eTtcblx0XHRcdFx0XHRcdGN0eC5maWxsKCk7XG5cdFx0XHRcdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdFx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmZpbGwoKTtcblxuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50QmFzZVZhbHVlcy5wdXNoKHsgeDogeCwgeTogeVplcm9Ub1BpeGVsIC0gb2Zmc2V0IH0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW2RhdGFQb2ludFhdXTtcblx0XHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXNbZGF0YVBvaW50WF0sIHgxOiB4LCB5MTogeVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwICYmIGRhdGFQb2ludC5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludC5tYXJrZXJTaXplID4gMCB8fCBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cblx0XHRcdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCB4LCB5LCBjdHgpO1xuXHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKG1hcmtlclByb3BzKTtcblxuXHRcdFx0XHRcdFx0Ly9pZiAoIWRhdGFTZXJpZXMubWF4V2lkdGhJblggfHwgbWFya2VyUHJvcHMuc2l6ZSA+IGRhdGFTZXJpZXMubWF4V2lkdGhJblgpIHtcblx0XHRcdFx0XHRcdC8vXHRkYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gbWFya2VyUHJvcHMuc2l6ZSAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cdFx0XHRcdFx0XHQvL31cblxuXHRcdFx0XHRcdFx0bWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50LmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludC5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZEFyZWFcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50LFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMClcblx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0XHR3aGlsZSAoY3VycmVudEJhc2VWYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR2YXIgcG9pbnQgPSBjdXJyZW50QmFzZVZhbHVlcy5wb3AoKTtcblx0XHRcdFx0Y3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHBvaW50LngsIHBvaW50LnkpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IGRhdGFTZXJpZXMuZmlsbE9wYWNpdHk7XG5cdFx0XHRjdHguZmlsbCgpO1xuXHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gMTtcblxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblxuXHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5maWxsKCk7XG5cdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIChkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXMpO1xuXHR9XG5cblx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXG5cblx0Y3R4LnJlc3RvcmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhDbGlwQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5saW5lYXIsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWQsIGNvbXBhcmVOdW1iZXJzLCBpbnRUb0hleENvbG9yU3RyaW5nLCBnZXRMaW5lRGFzaEFycmF5fSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXHR2YXIgbWFya2VycyA9IFtdO1xuXG5cdHZhciBvZmZzZXRZID0gW107XG5cblx0dmFyIGFsbFhWYWx1ZXMgPSBbXTtcblx0Ly92YXIgb2Zmc2V0TmVnYXRpdmVZID0gW107XG5cblx0dmFyIGkgPSAwLCB4LCB5O1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGV2ZXJ5dGltZSBpdCBpcyBhY2Nlc3NlZC5cblxuXG5cdC8vdmFyIHlaZXJvVG9QaXhlbCA9IChheGlzWVByb3BzLnkyIC0gYXhpc1lQcm9wcy5oZWlnaHQgLyByYW5nZVkgKiBNYXRoLmFicygwIC0gcGxvdFVuaXQuYXhpc1kudmlld3BvcnRNaW5pbXVtKSArIC41KSA8PCAwO1xuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiB0aGlzLndpZHRoICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLndpZHRoIC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpICogLjkpIDw8IDA7XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdGN0eC5zYXZlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdGdob3N0Q3R4LnNhdmUoKTtcblxuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRnaG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0Z2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0dmFyIHhWYWx1ZVByZXNlbnQgPSBbXTtcblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIHhWYWx1ZTtcblxuXHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlcyA9IFtdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHhWYWx1ZSA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblx0XHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1t4VmFsdWVdID0gaTtcblxuXHRcdFx0aWYgKCF4VmFsdWVQcmVzZW50W3hWYWx1ZV0pIHtcblx0XHRcdFx0YWxsWFZhbHVlcy5wdXNoKHhWYWx1ZSk7XG5cdFx0XHRcdHhWYWx1ZVByZXNlbnRbeFZhbHVlXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YWxsWFZhbHVlcy5zb3J0KGNvbXBhcmVOdW1iZXJzKTtcblx0fVxuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cdFx0dmFyIGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gdHJ1ZTtcblxuXG5cdFx0dmFyIHNlcmllc0lkID0gZGF0YVNlcmllcy5pZDtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW3Nlcmllc0lkXSA9IHtcblx0XHRcdG9iamVjdFR5cGU6IFwiZGF0YVNlcmllc1wiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleFxuXHRcdH07XG5cdFx0dmFyIGhleENvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhzZXJpZXNJZCk7XG5cdFx0Z2hvc3RDdHguZmlsbFN0eWxlID0gaGV4Q29sb3I7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPT0gMSlcblx0XHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cblx0XHRpZiAoYmFyV2lkdGggPCAxKVxuXHRcdFx0YmFyV2lkdGggPSAxO1xuXHRcdGVsc2UgaWYgKGJhcldpZHRoID4gbWF4QmFyV2lkdGgpXG5cdFx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXG5cdFx0dmFyIGN1cnJlbnRCYXNlVmFsdWVzID0gW107XG5cblx0XHRpZiAoYWxsWFZhbHVlcy5sZW5ndGggPiAwKSB7XG5cblx0XHRcdGNvbG9yID0gZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cblx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgPyBmYWxzZSA6IGZhbHNlO1xuXG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGFsbFhWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gYWxsWFZhbHVlc1tpXTtcblx0XHRcdFx0dmFyIGRhdGFQb2ludCA9IG51bGw7XG5cblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwKVxuXHRcdFx0XHRcdGRhdGFQb2ludCA9IGRhdGFQb2ludHNbZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW2RhdGFQb2ludFhdXTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRhdGFQb2ludCA9IHtcblx0XHRcdFx0XHRcdHg6IGRhdGFQb2ludFgsIHk6IDBcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnQueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIHlQZXJjZW50O1xuXHRcdFx0XHRpZiAocGxvdFVuaXQuZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gIT09IDApXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSBkYXRhUG9pbnQueSAvIHBsb3RVbml0LmRhdGFQb2ludFlTdW1zW2RhdGFQb2ludFhdICogMTAwO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSAwO1xuXG5cdFx0XHRcdHZhciB4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0dmFyIHkgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKHlQZXJjZW50IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpO1xuXG5cdFx0XHRcdHZhciBvZmZzZXQgPSBvZmZzZXRZW2RhdGFQb2ludFhdID8gb2Zmc2V0WVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0eSA9IHkgLSBvZmZzZXQ7XG5cdFx0XHRcdGN1cnJlbnRCYXNlVmFsdWVzLnB1c2goeyB4OiB4LCB5OiB5WmVyb1RvUGl4ZWwgLSBvZmZzZXQgfSk7XG5cdFx0XHRcdG9mZnNldFlbZGF0YVBvaW50WF0gPSB5WmVyb1RvUGl4ZWwgLSB5O1xuXG5cdFx0XHRcdGlmIChpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSkge1xuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpICUgMjUwID09IDApIHtcblxuXHRcdFx0XHRcdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApXG5cdFx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0XHRcdFx0d2hpbGUgKGN1cnJlbnRCYXNlVmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0dmFyIHBvaW50ID0gY3VycmVudEJhc2VWYWx1ZXMucG9wKCk7XG5cdFx0XHRcdFx0XHRcdGN0eC5saW5lVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRcdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0XHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdFx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50QmFzZVZhbHVlcy5wdXNoKHsgeDogeCwgeTogeVplcm9Ub1BpeGVsIC0gb2Zmc2V0IH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzW2RhdGFQb2ludFhdXTtcblx0XHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBkYXRhU2VyaWVzLmRhdGFQb2ludEluZGV4ZXNbZGF0YVBvaW50WF0sIHgxOiB4LCB5MTogeVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50SW5kZXhlc1tkYXRhUG9pbnRYXSA+PSAwICYmIGRhdGFQb2ludC5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludC5tYXJrZXJTaXplID4gMCB8fCBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyUHJvcHMgPSBkYXRhU2VyaWVzLmdldE1hcmtlclByb3BlcnRpZXMoaSwgeCwgeSwgY3R4KTtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0XHQvL1x0ZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IG1hcmtlclByb3BzLnNpemUgLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXHRcdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHRcdG1hcmtlckNvbG9yID0gaW50VG9IZXhDb2xvclN0cmluZyhpZCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHksIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRzaXplOiBtYXJrZXJQcm9wcy5zaXplLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiBtYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3Ncblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludC5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnQuaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInN0YWNrZWRBcmVhMTAwXCIsXG5cdFx0XHRcdFx0XHRkYXRhUG9pbnQ6IGRhdGFQb2ludCxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4LCB5OiB5XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkYXRhUG9pbnRzW2ldLnkgPj0gMCA/IDEgOiAtMSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcyA+IDApXG5cdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0d2hpbGUgKGN1cnJlbnRCYXNlVmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dmFyIHBvaW50ID0gY3VycmVudEJhc2VWYWx1ZXMucG9wKCk7XG5cdFx0XHRcdGN0eC5saW5lVG8ocG9pbnQueCwgcG9pbnQueSk7XG5cblx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyhwb2ludC54LCBwb2ludC55KTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdFx0Y3R4LmZpbGwoKTtcblx0XHRcdGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRnaG9zdEN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdFx0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGRlbGV0ZSAoZGF0YVNlcmllcy5kYXRhUG9pbnRJbmRleGVzKTtcblx0fVxuXG5cdFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhtYXJrZXJzKTtcblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBvZmZzZXRQb3NpdGl2ZVkgPSBbXTtcblx0dmFyIG9mZnNldE5lZ2F0aXZlWSA9IFtdO1xuXG5cdHZhciBpID0gMCwgeCwgeTtcblx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBldmVyeXRpbWUgaXQgaXMgYWNjZXNzZWQuXG5cblx0Ly92YXIgeVplcm9Ub1BpeGVsID0gKGF4aXNZUHJvcHMueTIgLSBheGlzWVByb3BzLmhlaWdodCAvIHJhbmdlWSAqIE1hdGguYWJzKDAgLSBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0pICsgLjUpIDw8IDA7XG5cdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSkgPDwgMDtcblxuXHR2YXIgbWF4QmFyV2lkdGggPSB0aGlzLmRhdGFQb2ludE1heFdpZHRoID8gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA6IHRoaXMuaGVpZ2h0ICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLmhlaWdodCAvIE1hdGguYWJzKHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWF4aW11bSAtIHBsb3RVbml0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkpICogTWF0aC5hYnMoeE1pbkRpZmYpKSAvIHBsb3RVbml0LnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGggKiAuOSkgPDwgMDtcblxuXHRpZiAoYmFyV2lkdGggPiBtYXhCYXJXaWR0aClcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHRlbHNlIGlmICh4TWluRGlmZiA9PT0gSW5maW5pdHkpIHtcblx0XHRiYXJXaWR0aCA9IG1heEJhcldpZHRoO1xuXHR9IGVsc2UgaWYgKGJhcldpZHRoIDwgMSlcblx0XHRiYXJXaWR0aCA9IDE7XG5cblx0Y3R4LnNhdmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnNhdmUoKTtcblxuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdGN0eC5jbGlwKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguY2xpcCgpO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXG5cdFx0Ly9kYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gYmFyV2lkdGggLyAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ID4gMSA/IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAtIDEgOiBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQpO1xuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NTcyQTcgXCI7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIChkYXRhUG9pbnRzW2ldLnkpICE9PSBcIm51bWJlclwiKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHkgPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHQvL3ggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludHNbaV0ueSAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKTtcblxuXHRcdFx0XHQvL3ZhciB4MSA9IHggLSAocGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIGJhcldpZHRoIC8gMikgKyAocGxvdFVuaXQuaW5kZXggKiBiYXJXaWR0aCkgPDwgMDtcblxuXHRcdFx0XHR2YXIgeTEgPSB5IC0gKHBsb3RVbml0LnBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGggKiBiYXJXaWR0aCAvIDIpICsgKHBsb3RVbml0LmluZGV4ICogYmFyV2lkdGgpIDw8IDA7XG5cdFx0XHRcdHZhciB5MiA9IHkxICsgYmFyV2lkdGggPDwgMDtcblx0XHRcdFx0dmFyIHgxO1xuXHRcdFx0XHR2YXIgeDI7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR4MSA9IHlaZXJvVG9QaXhlbCArIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHggKyBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeDIgLSB4MSk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdID8gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHRcdHgxID0geCAtIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHlaZXJvVG9QaXhlbCAtIG9mZnNldDtcblxuXHRcdFx0XHRcdG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA9IG9mZnNldCArICh4MiAtIHgxKTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0Y29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdFx0XHRkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5KTtcblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZEJhclwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geDIgOiB4MSwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IE1hdGgubWluKHgxLCB4MiksIHkxOiB5MSwgeDI6IE1hdGgubWF4KHgxLCB4MiksIHkyOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uQmFzZSA9IE1hdGgubWF4KHlaZXJvVG9QaXhlbCwgcGxvdFVuaXQuYXhpc1guYm91bmRpbmdSZWN0LngyKTtcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhTY2FsZUFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZU91dFF1YXJ0LCBhbmltYXRpb25CYXNlOiBhbmltYXRpb25CYXNlXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgY29sb3IgPSBudWxsO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0dmFyIG9mZnNldFBvc2l0aXZlWSA9IFtdO1xuXHR2YXIgb2Zmc2V0TmVnYXRpdmVZID0gW107XG5cblx0dmFyIGkgPSAwLCB4LCB5O1xuXHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGV2ZXJ5dGltZSBpdCBpcyBhY2Nlc3NlZC5cblxuXHQvL3ZhciB5WmVyb1RvUGl4ZWwgPSAoYXhpc1lQcm9wcy55MiAtIGF4aXNZUHJvcHMuaGVpZ2h0IC8gcmFuZ2VZICogTWF0aC5hYnMoMCAtIHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKyAuNSkgPDwgMDtcblx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pKSA8PCAwO1xuXG5cdHZhciBtYXhCYXJXaWR0aCA9IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggPyB0aGlzLmRhdGFQb2ludE1heFdpZHRoIDogdGhpcy5oZWlnaHQgKiAuMTUgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEuaGVpZ2h0IC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpIC8gcGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIC45KSA8PCAwO1xuXG5cdGlmIChiYXJXaWR0aCA+IG1heEJhcldpZHRoKVxuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdGVsc2UgaWYgKHhNaW5EaWZmID09PSBJbmZpbml0eSkge1xuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblx0XHQvL2RhdGFTZXJpZXMubWF4V2lkdGhJblggPSBiYXJXaWR0aCAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXG5cdFx0XHR2YXIgYmV2ZWxFbmFibGVkID0gKGJhcldpZHRoID4gNSkgJiYgZGF0YVNlcmllcy5iZXZlbEVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XG5cblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0dmFyIHlQZXJjZW50O1xuXHRcdFx0XHRpZiAocGxvdFVuaXQuZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gIT09IDApXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSBkYXRhUG9pbnRzW2ldLnkgLyBwbG90VW5pdC5kYXRhUG9pbnRZU3Vtc1tkYXRhUG9pbnRYXSAqIDEwMDtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHlQZXJjZW50ID0gMDtcblxuXHRcdFx0XHQvL3ggPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKHlQZXJjZW50IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoeVBlcmNlbnQgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSk7XG5cblx0XHRcdFx0dmFyIHkxID0geSAtIChwbG90VW5pdC5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoICogYmFyV2lkdGggLyAyKSArIChwbG90VW5pdC5pbmRleCAqIGJhcldpZHRoKSA8PCAwO1xuXHRcdFx0XHR2YXIgeTIgPSB5MSArIGJhcldpZHRoIDw8IDA7XG5cdFx0XHRcdHZhciB4MTtcblx0XHRcdFx0dmFyIHgyO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR4MSA9IHlaZXJvVG9QaXhlbCArIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHggKyBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeDIgLSB4MSk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdID8gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHRcdHgxID0geCAtIG9mZnNldDtcblx0XHRcdFx0XHR4MiA9IHlaZXJvVG9QaXhlbCAtIG9mZnNldDtcblxuXHRcdFx0XHRcdG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA9IG9mZnNldCArICh4MiAtIHgxKTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0Y29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdFx0XHRkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5KTtcblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZEJhcjEwMFwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geDIgOiB4MSwgeTogeVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IE1hdGgubWluKHgxLCB4MiksIHkxOiB5MSwgeDI6IE1hdGgubWF4KHgxLCB4MiksIHkyOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZXN0b3JlKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uQmFzZSA9IE1hdGgubWF4KHlaZXJvVG9QaXhlbCwgcGxvdFVuaXQuYXhpc1guYm91bmRpbmdSZWN0LngyKTtcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhTY2FsZUFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcuZWFzZU91dFF1YXJ0LCBhbmltYXRpb25CYXNlOiBhbmltYXRpb25CYXNlXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuIiwiXG5pbXBvcnQge2lzQ2FudmFzU3VwcG9ydGVkfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblxuXHRpZiAodG90YWxEYXRhU2VyaWVzIDw9IDApXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBjb2xvciA9IG51bGw7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgb2Zmc2V0UG9zaXRpdmVZID0gW107XG5cdHZhciBvZmZzZXROZWdhdGl2ZVkgPSBbXTtcblxuXHR2YXIgaSA9IDAsIHgsIHk7XG5cdHZhciBkYXRhUG9pbnRYOyAvL1VzZWQgc28gdGhhdCB3aGVuIGRhdGFQb2ludC54IGlzIGEgRGF0ZVRpbWUgdmFsdWUsIGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBudW1iZXIgZXZlcnl0aW1lIGl0IGlzIGFjY2Vzc2VkLlxuXG5cdC8vdmFyIHlaZXJvVG9QaXhlbCA9IChheGlzWVByb3BzLnkyIC0gYXhpc1lQcm9wcy5oZWlnaHQgLyByYW5nZVkgKiBNYXRoLmFicygwIC0gcGxvdFVuaXQuYXhpc1kudmlld3BvcnRNaW5pbXVtKSArIC41KSA8PCAwO1xuXHR2YXIgeVplcm9Ub1BpeGVsID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqICgwIC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpIDw8IDA7XG5cblx0dmFyIG1heEJhcldpZHRoID0gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA/IHRoaXMuZGF0YVBvaW50TWF4V2lkdGggOiB0aGlzLndpZHRoICogLjE1IDw8IDA7XG5cdHZhciB4TWluRGlmZiA9IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLm1pbkRpZmY7XG5cdHZhciBiYXJXaWR0aCA9ICgoKHBsb3RBcmVhLndpZHRoIC8gTWF0aC5hYnMocGxvdFVuaXQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gcGxvdFVuaXQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSkgKiBNYXRoLmFicyh4TWluRGlmZikpIC8gcGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIC45KSA8PCAwO1xuXG5cdGlmIChiYXJXaWR0aCA+IG1heEJhcldpZHRoKVxuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdGVsc2UgaWYgKHhNaW5EaWZmID09PSBJbmZpbml0eSkge1xuXHRcdGJhcldpZHRoID0gbWF4QmFyV2lkdGg7XG5cdH0gZWxzZSBpZiAoYmFyV2lkdGggPCAxKVxuXHRcdGJhcldpZHRoID0gMTtcblxuXG5cblx0Y3R4LnNhdmUoKTtcblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEud2lkdGgsIHBsb3RBcmVhLmhlaWdodCk7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LmNsaXAoKTtcblx0fVxuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblx0XHQvLyBSZWR1Y2luZyBwaXhlbFBlclVuaXQgYnkgMSBqdXN0IHRvIG92ZXJjb21lIGFueSBwcm9ibGVtcyBkdWUgdG8gcm91bmRpbmcgb2ZmIG9mIHBpeGVscy5cblx0XHQvL2RhdGFTZXJpZXMubWF4V2lkdGhJblggPSBiYXJXaWR0aCAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cblxuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vdmFyIHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25QbG90QXJlYShkYXRhUG9pbnRzWzBdLngsIGRhdGFQb2ludHNbMF0ueSk7XG5cblx0XHRcdHZhciBiZXZlbEVuYWJsZWQgPSAoYmFyV2lkdGggPiA1KSAmJiBkYXRhU2VyaWVzLmJldmVsRW5hYmxlZCA/IHRydWUgOiBmYWxzZTtcblxuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gXCIjNDU3MkE3IFwiO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIilcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkpO1xuXG5cdFx0XHRcdHZhciB4MSA9IHggLSAocGxvdFVuaXQucGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCAqIGJhcldpZHRoIC8gMikgKyAocGxvdFVuaXQuaW5kZXggKiBiYXJXaWR0aCkgPDwgMDtcblx0XHRcdFx0dmFyIHgyID0geDEgKyBiYXJXaWR0aCA8PCAwO1xuXHRcdFx0XHR2YXIgeTE7XG5cdFx0XHRcdHZhciB5MjtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLnkgPj0gMCkge1xuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPyBvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gOiAwO1xuXG5cdFx0XHRcdFx0eTEgPSB5IC0gb2Zmc2V0O1xuXHRcdFx0XHRcdHkyID0geVplcm9Ub1BpeGVsIC0gb2Zmc2V0O1xuXG5cdFx0XHRcdFx0b2Zmc2V0UG9zaXRpdmVZW2RhdGFQb2ludFhdID0gb2Zmc2V0ICsgKHkyIC0geTEpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR5MiA9IHkgKyBvZmZzZXQ7XG5cdFx0XHRcdFx0eTEgPSB5WmVyb1RvUGl4ZWwgKyBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXROZWdhdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeTIgLSB5MSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvciA9IGRhdGFQb2ludHNbaV0uY29sb3IgPyBkYXRhUG9pbnRzW2ldLmNvbG9yIDogZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cblx0XHRcdFx0ZHJhd1JlY3QoY3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGJldmVsRW5hYmxlZCAmJiAoZGF0YVBvaW50c1tpXS55ID49IDApLCAoZGF0YVBvaW50c1tpXS55IDwgMCkgJiYgYmV2ZWxFbmFibGVkLCBmYWxzZSwgZmFsc2UsIGRhdGFTZXJpZXMuZmlsbE9wYWNpdHkpO1xuXG5cdFx0XHRcdC8vaWYgKGRhdGFTZXJpZXMubWFya2VyVHlwZSAmJiBkYXRhU2VyaWVzLm1hcmtlclNpemUgPiAwKSB7XG5cdFx0XHRcdC8vICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VyKHgxICsgKHgyIC0geDEpLzIsIHkxLCBjdHgsIGRhdGFTZXJpZXMubWFya2VyVHlwZSwgZGF0YVNlcmllcy5tYXJrZXJTaXplLCBjb2xvciwgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvciwgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyA6IDEpO1xuXHRcdFx0XHQvL31cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRkcmF3UmVjdCh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwic3RhY2tlZENvbHVtblwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IGRhdGFQb2ludHNbaV0ueSA+PSAwID8geTEgOiB5MlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGF0YVBvaW50c1tpXS55ID49IDAgPyAxIDogLTEsXG5cdFx0XHRcdFx0XHRib3VuZHM6IHtcblx0XHRcdFx0XHRcdFx0eDE6IHgxLCB5MTogTWF0aC5taW4oeTEsIHkyKSwgeDI6IHgyLCB5MjogTWF0aC5tYXgoeTEsIHkyKVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNvbG9yOiBjb2xvclxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkJhc2UgPSBNYXRoLm1pbih5WmVyb1RvUGl4ZWwsIHBsb3RVbml0LmF4aXNZLmJvdW5kaW5nUmVjdC55Mik7XG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci55U2NhbGVBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmVhc2VPdXRRdWFydCwgYW5pbWF0aW9uQmFzZTogYW5pbWF0aW9uQmFzZVxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGNvbG9yID0gbnVsbDtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdHZhciBvZmZzZXRQb3NpdGl2ZVkgPSBbXTtcblx0dmFyIG9mZnNldE5lZ2F0aXZlWSA9IFtdO1xuXG5cdHZhciBpID0gMCwgeCwgeTtcblx0dmFyIGRhdGFQb2ludFg7IC8vVXNlZCBzbyB0aGF0IHdoZW4gZGF0YVBvaW50LnggaXMgYSBEYXRlVGltZSB2YWx1ZSwgaXQgZG9lc24ndCBnZXQgY29udmVydGVkIHRvIG51bWJlciBldmVyeXRpbWUgaXQgaXMgYWNjZXNzZWQuXG5cblx0Ly92YXIgeVplcm9Ub1BpeGVsID0gKGF4aXNZUHJvcHMueTIgLSBheGlzWVByb3BzLmhlaWdodCAvIHJhbmdlWSAqIE1hdGguYWJzKDAgLSBwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0pICsgLjUpIDw8IDA7XG5cdHZhciB5WmVyb1RvUGl4ZWwgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKDAgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSkgPDwgMDtcblxuXHR2YXIgbWF4QmFyV2lkdGggPSB0aGlzLmRhdGFQb2ludE1heFdpZHRoID8gdGhpcy5kYXRhUG9pbnRNYXhXaWR0aCA6IHRoaXMud2lkdGggKiAuMTUgPDwgMDtcblx0dmFyIHhNaW5EaWZmID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8ubWluRGlmZjtcblx0dmFyIGJhcldpZHRoID0gKCgocGxvdEFyZWEud2lkdGggLyBNYXRoLmFicyhwbG90VW5pdC5heGlzWC52aWV3cG9ydE1heGltdW0gLSBwbG90VW5pdC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKHhNaW5EaWZmKSkgLyBwbG90VW5pdC5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoICogLjkpIDw8IDA7XG5cblx0aWYgKGJhcldpZHRoID4gbWF4QmFyV2lkdGgpXG5cdFx0YmFyV2lkdGggPSBtYXhCYXJXaWR0aDtcblx0ZWxzZSBpZiAoeE1pbkRpZmYgPT09IEluZmluaXR5KSB7XG5cdFx0YmFyV2lkdGggPSBtYXhCYXJXaWR0aDtcblx0fSBlbHNlIGlmIChiYXJXaWR0aCA8IDEpXG5cdFx0YmFyV2lkdGggPSAxO1xuXG5cdGN0eC5zYXZlKCk7XG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguc2F2ZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXHRcdHZhciBpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IHRydWU7XG5cblxuXHRcdC8vZGF0YVNlcmllcy5tYXhXaWR0aEluWCA9IGJhcldpZHRoIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblxuXG5cdFx0aWYgKGRhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly92YXIgeHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhKGRhdGFQb2ludHNbMF0ueCwgZGF0YVBvaW50c1swXS55KTtcblxuXHRcdFx0dmFyIGJldmVsRW5hYmxlZCA9IChiYXJXaWR0aCA+IDUpICYmIGRhdGFTZXJpZXMuYmV2ZWxFbmFibGVkID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwiIzQ1NzJBNyBcIjtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0eCA9IChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50WCAtIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cblx0XHRcdFx0dmFyIHlQZXJjZW50O1xuXHRcdFx0XHRpZiAocGxvdFVuaXQuZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gIT09IDApXG5cdFx0XHRcdFx0eVBlcmNlbnQgPSBkYXRhUG9pbnRzW2ldLnkgLyBwbG90VW5pdC5kYXRhUG9pbnRZU3Vtc1tkYXRhUG9pbnRYXSAqIDEwMDtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHlQZXJjZW50ID0gMDtcblxuXHRcdFx0XHQvL3kgPSAocGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKHlQZXJjZW50IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoeVBlcmNlbnQgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSk7XG5cblx0XHRcdFx0dmFyIHgxID0geCAtIChwbG90VW5pdC5wbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoICogYmFyV2lkdGggLyAyKSArIChwbG90VW5pdC5pbmRleCAqIGJhcldpZHRoKSA8PCAwO1xuXHRcdFx0XHR2YXIgeDIgPSB4MSArIGJhcldpZHRoIDw8IDA7XG5cdFx0XHRcdHZhciB5MTtcblx0XHRcdFx0dmFyIHkyO1xuXG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ueSA+PSAwKSB7XG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA/IG9mZnNldFBvc2l0aXZlWVtkYXRhUG9pbnRYXSA6IDA7XG5cblx0XHRcdFx0XHR5MSA9IHkgLSBvZmZzZXQ7XG5cdFx0XHRcdFx0eTIgPSB5WmVyb1RvUGl4ZWwgLSBvZmZzZXQ7XG5cblx0XHRcdFx0XHRvZmZzZXRQb3NpdGl2ZVlbZGF0YVBvaW50WF0gPSBvZmZzZXQgKyAoeTIgLSB5MSk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdID8gb2Zmc2V0TmVnYXRpdmVZW2RhdGFQb2ludFhdIDogMDtcblxuXHRcdFx0XHRcdHkyID0geSArIG9mZnNldDtcblx0XHRcdFx0XHR5MSA9IHlaZXJvVG9QaXhlbCArIG9mZnNldDtcblxuXHRcdFx0XHRcdG9mZnNldE5lZ2F0aXZlWVtkYXRhUG9pbnRYXSA9IG9mZnNldCArICh5MiAtIHkxKTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0Y29sb3IgPSBkYXRhUG9pbnRzW2ldLmNvbG9yID8gZGF0YVBvaW50c1tpXS5jb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0W2kgJSBkYXRhU2VyaWVzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdFx0XHRkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgMCwgbnVsbCwgYmV2ZWxFbmFibGVkICYmIChkYXRhUG9pbnRzW2ldLnkgPj0gMCksIChkYXRhUG9pbnRzW2ldLnkgPCAwKSAmJiBiZXZlbEVuYWJsZWQsIGZhbHNlLCBmYWxzZSwgZGF0YVNlcmllcy5maWxsT3BhY2l0eSk7XG5cblx0XHRcdFx0dmFyIGlkID0gZGF0YVNlcmllcy5kYXRhUG9pbnRJZHNbaV07XG5cdFx0XHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuXHRcdFx0XHRcdGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhUG9pbnRcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXgsIGRhdGFQb2ludEluZGV4OiBpLCB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTJcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0ZHJhd1JlY3QodGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIDAsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWwgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsIHx8IGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbEZvcm1hdHRlciB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWxGb3JtYXR0ZXIpIHtcblxuXHRcdFx0XHRcdHRoaXMuX2luZGV4TGFiZWxzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhcnRUeXBlOiBcInN0YWNrZWRDb2x1bW4xMDBcIixcblx0XHRcdFx0XHRcdGRhdGFQb2ludDogZGF0YVBvaW50c1tpXSxcblx0XHRcdFx0XHRcdGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsXG5cdFx0XHRcdFx0XHRwb2ludDoge1xuXHRcdFx0XHRcdFx0XHR4OiB4LCB5OiBkYXRhUG9pbnRzW2ldLnkgPj0gMCA/IHkxIDogeTJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Ym91bmRzOiB7XG5cdFx0XHRcdFx0XHRcdHgxOiB4MSwgeTE6IE1hdGgubWluKHkxLCB5MiksIHgyOiB4MiwgeTI6IE1hdGgubWF4KHkxLCB5Milcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjb2xvcjogY29sb3Jcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y3R4LnJlc3RvcmUoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4LnJlc3RvcmUoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25CYXNlID0gTWF0aC5taW4oeVplcm9Ub1BpeGVsLCBwbG90VW5pdC5heGlzWS5ib3VuZGluZ1JlY3QueTIpO1xuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueVNjYWxlQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlT3V0UXVhcnQsIGFuaW1hdGlvbkJhc2U6IGFuaW1hdGlvbkJhc2Vcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJcbmltcG9ydCB7aXNDYW52YXNTdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblx0dmFyIGN0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCB8fCB0aGlzLnBsb3RBcmVhLmN0eDtcblxuXHR2YXIgdG90YWxEYXRhU2VyaWVzID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoO1xuXG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXG5cdHZhciBheGlzWFByb3BzID0gcGxvdFVuaXQuYXhpc1gubGluZUNvb3JkaW5hdGVzO1xuXHR2YXIgYXhpc1lQcm9wcyA9IHBsb3RVbml0LmF4aXNZLmxpbmVDb29yZGluYXRlcztcblx0dmFyIG1hcmtlcnMgPSBbXTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXHRjdHguc2F2ZSgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5zYXZlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0XHRnaG9zdEN0eC5jbGlwKCk7XG5cdH1cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cblx0XHR2YXIgZGF0YVNlcmllc0luZGV4ID0gcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal07XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtkYXRhU2VyaWVzSW5kZXhdO1xuXG5cdFx0dmFyIGRhdGFQb2ludHMgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHM7XG5cblx0XHR2YXIgc2VyaWVzSWQgPSBkYXRhU2VyaWVzLmlkO1xuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbc2VyaWVzSWRdID0ge1xuXHRcdFx0b2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4XG5cdFx0fTtcblxuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzO1xuXHRcdC8vZ2hvc3RDdHgubGluZVdpZHRoID0gMjA7XG5cblx0XHRtYXJrZXJzID0gW107XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0dmFyIHlaZXJvVG9QaXhlbCA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoMCAtIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0pICsgLjUpIDw8IDA7XG5cdFx0dmFyIGJhc2VZO1xuXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSBudWxsO1xuXG5cdFx0dmFyIHByZXZEYXRhTnVsbCA9IGZhbHNlO1xuXHRcdGlmIChkYXRhUG9pbnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3R4LnN0cm9rZVN0eWxlID0gXCIjNDU3MkE3IFwiO1xuXHRcdFx0dmFyIGNvbG9yID0gZGF0YVNlcmllcy5fY29sb3JTZXRbaSAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cdFx0XHQvL2N0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdFx0XHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cblx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKDsgaSA8IGRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVBvaW50c1tpXS54LmdldFRpbWUgPyBkYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpIDogZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNaW4gfHwgZGF0YVBvaW50WCA+IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWF4KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcHJldlkgPSB5O1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRjbG9zZUFyZWEoKTtcblxuXHRcdFx0XHRcdHByZXZEYXRhTnVsbCA9IHRydWU7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXG5cblx0XHRcdFx0aWYgKGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhIHx8IHByZXZEYXRhTnVsbCkge1xuXHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdHN0YXJ0UG9pbnQgPSB7XG5cdFx0XHRcdFx0XHR4OiB4LCB5OiB5XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSBmYWxzZTtcblx0XHRcdFx0XHRwcmV2RGF0YU51bGwgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblxuXHRcdFx0XHRcdGN0eC5saW5lVG8oeCwgcHJldlkpO1xuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCBwcmV2WSk7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0aWYgKGkgJSAyNTAgPT0gMCkge1xuXHRcdFx0XHRcdFx0Y2xvc2VBcmVhKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vUmVuZGVyIE1hcmtlclxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5tYXJrZXJTaXplICE9PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0XHRtYXJrZXJzLnB1c2gobWFya2VyUHJvcHMpO1xuXG5cdFx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHRcdC8vfVxuXG5cdFx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtYXJrZXJQcm9wcy50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGJvcmRlckNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzdGVwQXJlYVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjbG9zZUFyZWEoKTtcblxuXHRcdFx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRcdH1cblx0fVxuXG5cdGN0eC5yZXN0b3JlKCk7XG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHR0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHgucmVzdG9yZSgpO1xuXG5cdGZ1bmN0aW9uIGNsb3NlQXJlYSgpIHtcblxuXHRcdGlmICghc3RhcnRQb2ludClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmxpbmVUaGlja25lc3MgPiAwKVxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xuXG5cdFx0aWYgKHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWluaW11bSA8PSAwICYmIHBsb3RVbml0LmF4aXNZLnZpZXdwb3J0TWF4aW11bSA+PSAwKSB7XG5cdFx0XHRiYXNlWSA9IHlaZXJvVG9QaXhlbDtcblx0XHR9XG5cdFx0ZWxzZSBpZiAocGxvdFVuaXQuYXhpc1kudmlld3BvcnRNYXhpbXVtIDwgMClcblx0XHRcdGJhc2VZID0gYXhpc1lQcm9wcy55MTtcblx0XHRlbHNlIGlmIChwbG90VW5pdC5heGlzWS52aWV3cG9ydE1pbmltdW0gPiAwKVxuXHRcdFx0YmFzZVkgPSBheGlzWFByb3BzLnkyO1xuXG5cdFx0Y3R4LmxpbmVUbyh4LCBiYXNlWSk7XG5cdFx0Y3R4LmxpbmVUbyhzdGFydFBvaW50LngsIGJhc2VZKTtcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cblx0XHRjdHguZ2xvYmFsQWxwaGEgPSBkYXRhU2VyaWVzLmZpbGxPcGFjaXR5O1xuXHRcdGN0eC5maWxsKCk7XG5cdFx0Y3R4Lmdsb2JhbEFscGhhID0gMTtcblxuXHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0Z2hvc3RDdHgubGluZVRvKHgsIGJhc2VZKTtcblx0XHRcdGdob3N0Q3R4LmxpbmVUbyhzdGFydFBvaW50LngsIGJhc2VZKTtcblx0XHRcdGdob3N0Q3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0Z2hvc3RDdHguZmlsbCgpO1xuXHRcdH1cblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblxuXHRcdHN0YXJ0UG9pbnQgPSB7XG5cdFx0XHR4OiB4LCB5OiB5XG5cdFx0fTtcblx0fVxuXG5cdC8vc291cmNlIGFuZCBkZXN0IHdvdWxkIGJlIHNhbWUgd2hlbiBhbmltYXRpb24gaXMgbm90IGVuYWJsZWRcblx0dmFyIGFuaW1hdGlvbkluZm8gPSB7XG5cdFx0c291cmNlOiBjdHgsIGRlc3Q6IHRoaXMucGxvdEFyZWEuY3R4LCBhbmltYXRpb25DYWxsYmFjazogQW5pbWF0aW9uSGVscGVyLnhDbGlwQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5saW5lYXIsIGFuaW1hdGlvbkJhc2U6IDBcblx0fTtcblx0cmV0dXJuIGFuaW1hdGlvbkluZm87XG59XG4iLCJleHBvcnQgY29uc3QgY3VsdHVyZXMgPSB7XG4gIFwiZW5cIjoge1xuICAgIC8vRGVyaXZlcyBmcm9tIHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgfS8vLFxuICAvL1wiZXNcIjoge1xuICAvLyAgICBkZWNpbWFsU2VwYXJhdG9yOiBcIixcIixcbiAgLy8gICAgZGlnaXRHcm91cFNlcGFyYXRvcjogXCIuXCIsXG4gIC8vICAgIHpvb21UZXh0OiBcInpvb21cIixcbiAgLy8gICAgcGFuVGV4dDogXCJwYW5cIixcbiAgLy8gICAgcmVzZXRUZXh0OiBcInJlc2V0XCIsXG4gIC8vICAgIGRheXM6IFtcImRvbWluZ29cIiwgXCJsdW5lc1wiLCBcIm1hcnRlc1wiLCBcIm1pw6lyY29sZXNcIiwgXCJqdWV2ZXNcIiwgXCJ2aWVybmVzXCIsIFwic8OhYmFkb1wiXSxcbiAgLy99XG59O1xuXG5leHBvcnQgY29uc3QgY29uc3RhbnRzID0ge1xuICBudW1iZXJEdXJhdGlvbjogMSxcbiAgeWVhckR1cmF0aW9uOiAxMDAwICogNjAgKiA2MCAqIDI0ICogMzY0LFxuICBtb250aER1cmF0aW9uOiAxMDAwICogNjAgKiA2MCAqIDI0ICogMzAsXG4gIHdlZWtEdXJhdGlvbjogMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsXG4gIGRheUR1cmF0aW9uOiAxMDAwICogNjAgKiA2MCAqIDI0LFxuICBob3VyRHVyYXRpb246IDEwMDAgKiA2MCAqIDYwLFxuICBtaW51dGVEdXJhdGlvbjogMTAwMCAqIDYwLFxuICBzZWNvbmREdXJhdGlvbjogMTAwMCxcbiAgbWlsbGlzZWNvbmREdXJhdGlvbjogMSxcblxuICBkYXlPZldlZWtGcm9tSW50OiBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXVxufTtcbiIsIlxuZXhwb3J0IGNvbnN0IGlzRGVidWdNb2RlID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBpc0NhbnZhc1N1cHBvcnRlZCA9ICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKS5nZXRDb250ZXh0O1xuXHQvL2lzQ2FudmFzU3VwcG9ydGVkID0gZmFsc2U7XG5cblx0Ly9EZWZhdWx0IHZhbHVlcyBmb3IgYWxsIENoYXJ0IEVsZW1lbnRzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlci4gQ2FudmFzSlNPYmplY3Quc2V0T3B0aW9ucyBsb29rcyBpbnRvIHRoaXMgd2hpbGUgc2V0dGluZyB0aGUgZGVmYXVsdC91c2VyLWRlZmluZWQgdmFsdWVzLlxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuXHRcdENoYXJ0OiB7XG5cdFx0XHR3aWR0aDogNTAwLFxuXHRcdFx0aGVpZ2h0OiA0MDAsXG5cdFx0XHR6b29tRW5hYmxlZDogZmFsc2UsXG5cdFx0XHR6b29tVHlwZTogXCJ4XCIsXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IFwid2hpdGVcIixcblx0XHRcdHRoZW1lOiBcInRoZW1lMVwiLFxuXHRcdFx0YW5pbWF0aW9uRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRhbmltYXRpb25EdXJhdGlvbjogMTIwMCxcblx0XHRcdGRhdGFQb2ludE1heFdpZHRoOiBudWxsLFxuXG5cdFx0XHRjb2xvclNldDogXCJjb2xvclNldDFcIixcblx0XHRcdGN1bHR1cmU6IFwiZW5cIixcblx0XHRcdGNyZWRpdFRleHQ6IFwiQ2FudmFzSlMuY29tXCIsXG5cdFx0XHRpbnRlcmFjdGl2aXR5RW5hYmxlZDogdHJ1ZSxcblx0XHRcdGV4cG9ydEVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0ZXhwb3J0RmlsZU5hbWU6IFwiQ2hhcnRcIixcblxuXHRcdFx0cmFuZ2VDaGFuZ2luZzogbnVsbCxcblx0XHRcdHJhbmdlQ2hhbmdlZDogbnVsbFxuXHRcdH0sXG5cblx0XHRUaXRsZToge1xuXHRcdFx0cGFkZGluZzogMCxcblx0XHRcdHRleHQ6IG51bGwsXG5cdFx0XHR2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLC8vdG9wLCBjZW50ZXIsIGJvdHRvbVxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLC8vbGVmdCwgY2VudGVyLCByaWdodFxuXHRcdFx0Zm9udFNpemU6IDIwLC8vaW4gcGl4ZWxzXG5cdFx0XHRmb250RmFtaWx5OiBcIkNhbGlicmlcIixcblx0XHRcdGZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGZvbnRTdHlsZTogXCJub3JtYWxcIiwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblxuXHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiAwLFxuXHRcdFx0Ym9yZGVyQ29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGNvcm5lclJhZGl1czogMCxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogbnVsbCxcblx0XHRcdG1hcmdpbjogNSxcblx0XHRcdHdyYXA6IHRydWUsXG5cdFx0XHRtYXhXaWR0aDogbnVsbCxcblxuXHRcdFx0ZG9ja0luc2lkZVBsb3RBcmVhOiBmYWxzZVxuXHRcdFx0Ly90b29sVGlwQ29udGVudDogbnVsbC8vc3RyaW5nIC0gVG8gYmUgaW1wbGVtZW50ZWQgKFRCSSlcblx0XHR9LFxuXG5cdFx0U3VidGl0bGU6IHtcblx0XHRcdHBhZGRpbmc6IDAsXG5cdFx0XHR0ZXh0OiBudWxsLFxuXHRcdFx0dmVydGljYWxBbGlnbjogXCJ0b3BcIiwvL3RvcCwgY2VudGVyLCBib3R0b21cblx0XHRcdGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdGZvbnRTaXplOiAxNCwvL2luIHBpeGVsc1xuXHRcdFx0Zm9udEZhbWlseTogXCJDYWxpYnJpXCIsXG5cdFx0XHRmb250V2VpZ2h0OiBcIm5vcm1hbFwiLCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuXHRcdFx0Zm9udENvbG9yOiBcImJsYWNrXCIsXG5cdFx0XHRmb250U3R5bGU6IFwibm9ybWFsXCIsIC8vIG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG5cblx0XHRcdGJvcmRlclRoaWNrbmVzczogMCxcblx0XHRcdGJvcmRlckNvbG9yOiBcImJsYWNrXCIsXG5cdFx0XHRjb3JuZXJSYWRpdXM6IDAsXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG51bGwsXG5cdFx0XHRtYXJnaW46IDIsXG5cdFx0XHR3cmFwOiB0cnVlLFxuXHRcdFx0bWF4V2lkdGg6IG51bGwsXG5cblx0XHRcdGRvY2tJbnNpZGVQbG90QXJlYTogZmFsc2Vcblx0XHRcdC8vdG9vbFRpcENvbnRlbnQ6IG51bGwvL3N0cmluZyAtIFRvIGJlIGltcGxlbWVudGVkIChUQkkpXG5cdFx0fSxcblxuXHRcdExlZ2VuZDoge1xuXHRcdFx0bmFtZTogbnVsbCxcblx0XHRcdHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IFwicmlnaHRcIixcblxuXHRcdFx0Zm9udFNpemU6IDE0LC8vaW4gcGl4ZWxzXG5cdFx0XHRmb250RmFtaWx5OiBcImNhbGlicmlcIixcblx0XHRcdGZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGZvbnRTdHlsZTogXCJub3JtYWxcIiwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblxuXHRcdFx0Y3Vyc29yOiBudWxsLFxuXHRcdFx0aXRlbW1vdXNlb3ZlcjogbnVsbCxcblx0XHRcdGl0ZW1tb3VzZW91dDogbnVsbCxcblx0XHRcdGl0ZW1tb3VzZW1vdmU6IG51bGwsXG5cdFx0XHRpdGVtY2xpY2s6IG51bGwsXG5cblx0XHRcdGRvY2tJbnNpZGVQbG90QXJlYTogZmFsc2UsXG5cdFx0XHRyZXZlcnNlZDogZmFsc2UsXG5cblx0XHRcdG1heFdpZHRoOiBudWxsLFxuXHRcdFx0bWF4SGVpZ2h0OiBudWxsLFxuXG5cdFx0XHRpdGVtTWF4V2lkdGg6IG51bGwsXG5cdFx0XHRpdGVtV2lkdGg6IG51bGwsXG5cdFx0XHRpdGVtV3JhcDogdHJ1ZSxcblx0XHRcdGl0ZW1UZXh0Rm9ybWF0dGVyOiBudWxsXG5cdFx0fSxcblxuXHRcdFRvb2xUaXA6IHtcblx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRzaGFyZWQ6IGZhbHNlLFxuXHRcdFx0YW5pbWF0aW9uRW5hYmxlZDogdHJ1ZSxcblx0XHRcdGNvbnRlbnQ6IG51bGwsXG5cdFx0XHRjb250ZW50Rm9ybWF0dGVyOiBudWxsLFxuXG5cdFx0XHRyZXZlcnNlZDogZmFsc2UsXG5cblx0XHRcdGJhY2tncm91bmRDb2xvcjogbnVsbCxcblxuXHRcdFx0Ym9yZGVyQ29sb3I6IG51bGwsXG5cdFx0XHRib3JkZXJUaGlja25lc3M6IDIsIC8vaW4gcGl4ZWxzXG5cdFx0XHRjb3JuZXJSYWRpdXM6IDUsIC8vIGluIHBpeGVsc1xuXG5cdFx0XHRmb250U2l6ZTogMTQsIC8vIGluIHBpeGVsc1xuXHRcdFx0Zm9udENvbG9yOiBcIiMwMDAwMDBcIixcblx0XHRcdGZvbnRGYW1pbHk6IFwiQ2FsaWJyaSwgQXJpYWwsIEdlb3JnaWEsIHNlcmlmO1wiLFxuXHRcdFx0Zm9udFdlaWdodDogXCJub3JtYWxcIiwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcblx0XHRcdGZvbnRTdHlsZTogXCJpdGFsaWNcIiAgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHR9LFxuXG5cdFx0QXhpczoge1xuXHRcdFx0bWluaW11bTogbnVsbCwgLy9NaW5pbXVtIHZhbHVlIHRvIGJlIHNob3duIG9uIHRoZSBBeGlzXG5cdFx0XHRtYXhpbXVtOiBudWxsLCAvL01pbmltdW0gdmFsdWUgdG8gYmUgc2hvd24gb24gdGhlIEF4aXNcblx0XHRcdHZpZXdwb3J0TWluaW11bTogbnVsbCxcblx0XHRcdHZpZXdwb3J0TWF4aW11bTogbnVsbCxcblx0XHRcdGludGVydmFsOiBudWxsLCAvLyBJbnRlcnZhbCBmb3IgdGljayBtYXJrcyBhbmQgZ3JpZCBsaW5lc1xuXHRcdFx0aW50ZXJ2YWxUeXBlOiBudWxsLCAvL251bWJlciwgbWlsbGlzZWNvbmQsIHNlY29uZCwgbWludXRlLCBob3VyLCBkYXksIG1vbnRoLCB5ZWFyXG5cdFx0XHQvL3JldmVyc2VkOiBmYWxzZSxcblxuXHRcdFx0dGl0bGU6IG51bGwsIC8vIHN0cmluZ1xuXHRcdFx0dGl0bGVGb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdHRpdGxlRm9udFNpemU6IDIwLFxuXHRcdFx0dGl0bGVGb250RmFtaWx5OiBcImFyaWFsXCIsXG5cdFx0XHR0aXRsZUZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsXG5cdFx0XHR0aXRsZUZvbnRTdHlsZTogXCJub3JtYWxcIixcblxuXHRcdFx0bGFiZWxBbmdsZTogMCxcblx0XHRcdGxhYmVsRm9udEZhbWlseTogXCJhcmlhbFwiLFxuXHRcdFx0bGFiZWxGb250Q29sb3I6IFwiYmxhY2tcIixcblx0XHRcdGxhYmVsRm9udFNpemU6IDEyLFxuXHRcdFx0bGFiZWxGb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuXHRcdFx0bGFiZWxGb250U3R5bGU6IFwibm9ybWFsXCIsXG5cdFx0XHRsYWJlbEF1dG9GaXQ6IGZhbHNlLFxuXHRcdFx0bGFiZWxXcmFwOiB0cnVlLFxuXHRcdFx0bGFiZWxNYXhXaWR0aDogbnVsbCwvL251bGwgZm9yIGF1dG9cblx0XHRcdGxhYmVsRm9ybWF0dGVyOiBudWxsLFxuXG5cdFx0XHRwcmVmaXg6IFwiXCIsXG5cdFx0XHRzdWZmaXg6IFwiXCIsXG5cblx0XHRcdGluY2x1ZGVaZXJvOiB0cnVlLCAvL0FwcGxpZXMgb25seSBmb3IgYXhpc1kuIElnbm9yZWQgaW4gYXhpc1guXG5cblx0XHRcdHRpY2tMZW5ndGg6IDUsXG5cdFx0XHR0aWNrQ29sb3I6IFwiYmxhY2tcIixcblx0XHRcdHRpY2tUaGlja25lc3M6IDEsXG5cblx0XHRcdGxpbmVDb2xvcjogXCJibGFja1wiLFxuXHRcdFx0bGluZVRoaWNrbmVzczogMSxcblx0XHRcdGxpbmVEYXNoVHlwZTogXCJzb2xpZFwiLFxuXG5cdFx0XHRncmlkQ29sb3I6IFwiQTBBMEEwXCIsXG5cdFx0XHRncmlkVGhpY2tuZXNzOiAwLFxuXHRcdFx0Z3JpZERhc2hUeXBlOiBcInNvbGlkXCIsXG5cblx0XHRcdGludGVybGFjZWRDb2xvcjogbnVsbCxcblxuXHRcdFx0dmFsdWVGb3JtYXRTdHJpbmc6IG51bGwsXG5cblx0XHRcdG1hcmdpbjogMixcblxuXHRcdFx0c3RyaXBMaW5lczogW10gLy8gSnVzdCBhIHBsYWNlaG9sZGVyLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGFjdHVhbCBudW1iZXIgb2Ygc3RyaXBsaW5lc1xuXHRcdH0sXG5cblx0XHRTdHJpcExpbmU6IHtcblx0XHRcdHZhbHVlOiBudWxsLFxuXHRcdFx0c3RhcnRWYWx1ZTogbnVsbCxcblx0XHRcdGVuZFZhbHVlOiBudWxsLFxuXG5cdFx0XHRjb2xvcjogXCJvcmFuZ2VcIixcblx0XHRcdG9wYWNpdHk6IG51bGwsXG5cdFx0XHR0aGlja25lc3M6IDIsXG5cdFx0XHRsaW5lRGFzaFR5cGU6IFwic29saWRcIixcblx0XHRcdGxhYmVsOiBcIlwiLFxuXHRcdFx0bGFiZWxCYWNrZ3JvdW5kQ29sb3I6IFwiI0VFRUVFRVwiLFxuXHRcdFx0bGFiZWxGb250RmFtaWx5OiBcImFyaWFsXCIsXG5cdFx0XHRsYWJlbEZvbnRDb2xvcjogXCJvcmFuZ2VcIixcblx0XHRcdGxhYmVsRm9udFNpemU6IDEyLFxuXHRcdFx0bGFiZWxGb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuXHRcdFx0bGFiZWxGb250U3R5bGU6IFwibm9ybWFsXCIsXG5cdFx0XHRsYWJlbEZvcm1hdHRlcjogbnVsbCxcblxuXHRcdFx0c2hvd09uVG9wOiBmYWxzZVxuXHRcdH0sXG5cblx0XHREYXRhU2VyaWVzOiB7XG5cdFx0XHRuYW1lOiBudWxsLFxuXHRcdFx0ZGF0YVBvaW50czogbnVsbCxcblx0XHRcdGxhYmVsOiBcIlwiLFxuXHRcdFx0YmV2ZWxFbmFibGVkOiBmYWxzZSxcblx0XHRcdGhpZ2hsaWdodEVuYWJsZWQ6IHRydWUsXG5cblx0XHRcdGN1cnNvcjogbnVsbCxcblxuXHRcdFx0aW5kZXhMYWJlbDogXCJcIixcblx0XHRcdGluZGV4TGFiZWxQbGFjZW1lbnQ6IFwiYXV0b1wiLCAgLy9pbnNpZGUsIG91dHNpZGUsIGF1dG9cblx0XHRcdGluZGV4TGFiZWxPcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXG5cdFx0XHRpbmRleExhYmVsRm9udENvbG9yOiBcImJsYWNrXCIsXG5cdFx0XHRpbmRleExhYmVsRm9udFNpemU6IDEyLFxuXHRcdFx0aW5kZXhMYWJlbEZvbnRTdHlsZTogXCJub3JtYWxcIiwgLy8gICBpdGFsaWMgLG9ibGlxdWUsIG5vcm1hbFxuXHRcdFx0aW5kZXhMYWJlbEZvbnRGYW1pbHk6IFwiQXJpYWxcIiwgXHQvLyBmeDogQXJpYWwgVmVyZGFuYSBcIkNvdXJpZXIgTmV3XCIgU2VyaWZcblx0XHRcdGluZGV4TGFiZWxGb250V2VpZ2h0OiBcIm5vcm1hbFwiLCBcdC8vIGJvbGQgLGJvbGRlciwgbGlnaHRlciwgbm9ybWFsXG5cdFx0XHRpbmRleExhYmVsQmFja2dyb3VuZENvbG9yOiBudWxsLFxuXHRcdFx0aW5kZXhMYWJlbExpbmVDb2xvcjogbnVsbCxcblx0XHRcdGluZGV4TGFiZWxMaW5lVGhpY2tuZXNzOiAxLFxuXHRcdFx0aW5kZXhMYWJlbExpbmVEYXNoVHlwZTogXCJzb2xpZFwiLFxuXHRcdFx0aW5kZXhMYWJlbE1heFdpZHRoOiBudWxsLFxuXHRcdFx0aW5kZXhMYWJlbFdyYXA6IHRydWUsXG5cdFx0XHRpbmRleExhYmVsRm9ybWF0dGVyOiBudWxsLFxuXG5cdFx0XHRsaW5lVGhpY2tuZXNzOiAyLFxuXHRcdFx0bGluZURhc2hUeXBlOiBcInNvbGlkXCIsXG5cblx0XHRcdGNvbG9yOiBudWxsLFxuXHRcdFx0cmlzaW5nQ29sb3I6IFwid2hpdGVcIixcblx0XHRcdGZpbGxPcGFjaXR5OiBudWxsLFxuXG5cdFx0XHRzdGFydEFuZ2xlOiAwLFxuXG5cdFx0XHRyYWRpdXM6IG51bGwsXG5cdFx0XHRpbm5lclJhZGl1czogbnVsbCxcblxuXHRcdFx0dHlwZTogXCJjb2x1bW5cIiwgLy9saW5lLCBjb2x1bW4sIGJhciwgYXJlYSwgc2NhdHRlciBzdGFja2VkQ29sdW1uLCBzdGFja2VkQmFyLCBzdGFja2VkQXJlYSwgc3RhY2tlZENvbHVtbjEwMCwgc3RhY2tlZEJhcjEwMCwgc3RhY2tlZEFyZWExMDAsIHBpZSwgZG91Z2hudXRcblx0XHRcdHhWYWx1ZVR5cGU6IFwibnVtYmVyXCIsIC8vbnVtYmVyLCBkYXRlVGltZVxuXHRcdFx0YXhpc1lUeXBlOiBcInByaW1hcnlcIixcblxuXHRcdFx0eFZhbHVlRm9ybWF0U3RyaW5nOiBudWxsLFxuXHRcdFx0eVZhbHVlRm9ybWF0U3RyaW5nOiBudWxsLFxuXHRcdFx0elZhbHVlRm9ybWF0U3RyaW5nOiBudWxsLFxuXHRcdFx0cGVyY2VudEZvcm1hdFN0cmluZzogbnVsbCxcblxuXHRcdFx0c2hvd0luTGVnZW5kOiBudWxsLFxuXHRcdFx0bGVnZW5kTWFya2VyVHlwZTogbnVsbCxcblx0XHRcdGxlZ2VuZE1hcmtlckNvbG9yOiBudWxsLFxuXHRcdFx0bGVnZW5kVGV4dDogbnVsbCxcblx0XHRcdGxlZ2VuZE1hcmtlckJvcmRlckNvbG9yOiBudWxsLFxuXHRcdFx0bGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzOiBudWxsLFxuXG5cdFx0XHRtYXJrZXJUeXBlOiBcImNpcmNsZVwiLCAvL25vbmUsIGNpcmNsZSwgc3F1YXJlLCBjcm9zcywgdHJpYW5nbGUsIGxpbmVcblx0XHRcdG1hcmtlckNvbG9yOiBudWxsLFxuXHRcdFx0bWFya2VyU2l6ZTogbnVsbCxcblx0XHRcdG1hcmtlckJvcmRlckNvbG9yOiBudWxsLFxuXHRcdFx0bWFya2VyQm9yZGVyVGhpY2tuZXNzOiBudWxsLFxuXHRcdFx0Ly9hbmltYXRpb25FbmFibGVkOiB0cnVlLFxuXHRcdFx0bW91c2VvdmVyOiBudWxsLFxuXHRcdFx0bW91c2VvdXQ6IG51bGwsXG5cdFx0XHRtb3VzZW1vdmU6IG51bGwsXG5cdFx0XHRjbGljazogbnVsbCxcblx0XHRcdHRvb2xUaXBDb250ZW50OiBudWxsLFxuXG5cdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8vUHJpdmF0ZVxuXHRcdFRleHRCbG9jazoge1xuXHRcdFx0eDogMCxcblx0XHRcdHk6IDAsXG5cdFx0XHR3aWR0aDogbnVsbCwvL3JlYWQgb25seVxuXHRcdFx0aGVpZ2h0OiBudWxsLC8vcmVhZCBvbmx5XG5cdFx0XHRtYXhXaWR0aDogbnVsbCxcblx0XHRcdG1heEhlaWdodDogbnVsbCxcblx0XHRcdHBhZGRpbmc6IDAsXG5cdFx0XHRhbmdsZTogMCxcblx0XHRcdHRleHQ6IFwiXCIsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG5cdFx0XHRmb250U2l6ZTogMTIsLy9pbiBwaXhlbHNcblx0XHRcdGZvbnRGYW1pbHk6IFwiY2FsaWJyaVwiLFxuXHRcdFx0Zm9udFdlaWdodDogXCJub3JtYWxcIiwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcblx0XHRcdGZvbnRDb2xvcjogXCJibGFja1wiLFxuXHRcdFx0Zm9udFN0eWxlOiBcIm5vcm1hbFwiLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXG5cdFx0XHRib3JkZXJUaGlja25lc3M6IDAsXG5cdFx0XHRib3JkZXJDb2xvcjogXCJibGFja1wiLFxuXHRcdFx0Y29ybmVyUmFkaXVzOiAwLFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBudWxsLFxuXHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0fSxcblxuXHRcdEN1bHR1cmVJbmZvOiB7XG5cdFx0XHRkZWNpbWFsU2VwYXJhdG9yOiBcIi5cIixcblx0XHRcdGRpZ2l0R3JvdXBTZXBhcmF0b3I6IFwiLFwiLFxuXHRcdFx0em9vbVRleHQ6IFwiWm9vbVwiLFxuXHRcdFx0cGFuVGV4dDogXCJQYW5cIixcblx0XHRcdHJlc2V0VGV4dDogXCJSZXNldFwiLFxuXG5cdFx0XHRtZW51VGV4dDogXCJNb3JlIE9wdGlvbnNcIixcblx0XHRcdHNhdmVKUEdUZXh0OiBcIlNhdmUgYXMgSlBHXCIsXG5cdFx0XHRzYXZlUE5HVGV4dDogXCJTYXZlIGFzIFBOR1wiLFxuXG5cdFx0XHRkYXlzOiBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXSxcblx0XHRcdHNob3J0RGF5czogW1wiU3VuXCIsIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJdLFxuXG5cdFx0XHRtb250aHM6IFtcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJdLFxuXHRcdFx0c2hvcnRNb250aHM6IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXVxuXHRcdH1cblx0fTtcbiIsIlxuaW1wb3J0IHtpc0NhbnZhc1N1cHBvcnRlZH0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjb2xvclNldHMgPSB7XG5cblx0XHRcImNvbG9yU2V0MVwiOiBbXG5cdFx0XHRcIiMzNjlFQURcIixcblx0XHRcdFwiI0MyNDY0MlwiLFxuXHRcdFx0XCIjN0Y2MDg0XCIsXG5cdFx0XHQvL1wiIzk2QzQxMlwiLFxuXHRcdFx0XCIjODZCNDAyXCIsXG5cdFx0XHRcIiNBMkQxQ0ZcIixcblx0XHRcdC8vXCIjRDhDNjQxXCIsXG5cdFx0XHRcIiNDOEI2MzFcIixcblx0XHRcdFwiIzZEQkNFQlwiLFxuXHRcdFx0Ly9cIiM0QTQ5NDZcIixcblx0XHRcdFwiIzUyNTE0RVwiLFxuXHRcdFx0XCIjNEY4MUJDXCIsXG5cdFx0XHRcIiNBMDY0QTFcIixcblx0XHRcdFwiI0Y3OTY0N1wiXG5cdFx0XSxcblx0XHRcImNvbG9yU2V0MlwiOiBbXG5cdFx0XHRcIiM0RjgxQkNcIixcblx0XHRcdFwiI0MwNTA0RVwiLFxuXHRcdFx0XCIjOUJCQjU4XCIsXG5cdFx0XHRcIiMyM0JGQUFcIixcblx0XHRcdC8vXCIjRkFBNTg2XCIsXG5cdFx0XHRcIiM4MDY0QTFcIixcblx0XHRcdFwiIzRBQUNDNVwiLFxuXHRcdFx0XCIjRjc5NjQ3XCIsXG5cdFx0XHQvL1wiIzc3QUEzM1wiLFxuXHRcdFx0Ly9cIiM3RjYwODRcIlxuXHRcdFx0XCIjMzM1NThCXCJcblx0XHRdLFxuXHRcdFwiY29sb3JTZXQzXCI6IFtcblx0XHRcdFwiIzhDQTFCQ1wiLFxuXHRcdFx0XCIjMzY4NDVDXCIsXG5cdFx0XHRcIiMwMTdFODJcIixcblx0XHRcdFwiIzhDQjlEMFwiLFxuXHRcdFx0XCIjNzA4Qzk4XCIsXG5cdFx0XHRcIiM5NDgzOERcIixcblx0XHRcdFwiI0YwODg5MVwiLFxuXHRcdFx0XCIjMDM2NkE3XCIsXG5cdFx0XHRcIiMwMDgyNzZcIixcblx0XHRcdFwiI0VFNzc1N1wiLFxuXHRcdFx0XCIjRTVCQTNBXCIsXG5cdFx0XHRcIiNGMjk5MEJcIixcblx0XHRcdFwiIzAzNTU3QlwiLFxuXHRcdFx0XCIjNzgyOTcwXCJcblx0XHRdLy8sXG5cdFx0Ly9cImNvbG9yU2V0NFwiOiBbXG5cdFx0Ly8gICAgXCIjMzY5OEM1XCIsXG5cdFx0Ly8gICAgXCIjMDA5QjhEXCIsXG5cdFx0Ly8gICAgXCIjRjFENjkxXCIsXG5cdFx0Ly8gICAgXCIjRjhCOTBDXCIsXG5cdFx0Ly8gICAgXCIjMDA4MUI4XCIsXG5cdFx0Ly8gICAgXCIjNUI1QTk2XCIsXG5cdFx0Ly8gICAgXCIjQUNCREQxXCIsXG5cdFx0Ly8gICAgXCIjODhBODkxXCIsXG5cdFx0Ly8gICAgXCIjMzk5NjlEXCIsXG5cdFx0Ly8gICAgXCIjQUVDRUREXCIsXG5cdFx0Ly8gICAgXCIjQTBCMkJDXCIsXG5cdFx0Ly8gICAgXCIjQkJBRUI3XCIsXG5cdFx0Ly8gICAgXCIjQTBDNjVGXCIsXG5cdFx0Ly8gICAgXCIjRUVBNkFBXCIsXG5cdFx0Ly8gICAgXCIjMzc5OEM1XCJcblx0XHQvL10sXG5cdFx0Ly9cImNvbG9yU2V0NVwiOiBbXG5cdFx0Ly8gICAgXCIjODhBREJGXCIsXG5cdFx0Ly8gICAgXCIjODRDMzM2XCIsXG5cdFx0Ly8gICAgXCIjN0I5MUMzXCIsXG5cdFx0Ly8gICAgXCIjNDY2MUVFXCIsXG5cdFx0Ly8gICAgXCIjRUM1NjU3XCIsXG5cdFx0Ly8gICAgXCIjMUJDREQxXCIsXG5cdFx0Ly8gICAgXCIjOEZBQUJCXCIsXG5cdFx0Ly8gICAgXCIjQjA4QkVCXCIsXG5cdFx0Ly8gICAgXCIjM0VBMEREXCIsXG5cdFx0Ly8gICAgXCIjRjVBNTJBXCIsXG5cdFx0Ly8gICAgXCIjMjNCRkFBXCIsXG5cdFx0Ly8gICAgXCIjRkFBNTg2XCIsXG5cdFx0Ly8gICAgXCIjRUI4Q0M2XCJcblx0XHQvL11cblxuXHR9O1xuXG5leHBvcnQgY29uc3QgdGhlbWVzID0ge1xuXG5cdFx0XHRcInRoZW1lMVwiOiB7XG5cdFx0XHRcdENoYXJ0OlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbG9yU2V0OiBcImNvbG9yU2V0MVwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0VGl0bGU6IHtcblx0XHRcdFx0XHRmb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdGZvbnRTaXplOiAzMyxcblx0XHRcdFx0XHRmb250Q29sb3I6IFwiIzNBM0EzQVwiLFxuXHRcdFx0XHRcdGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG5cdFx0XHRcdFx0bWFyZ2luOiA1XG5cdFx0XHRcdH0sXG5cdFx0XHRcdFN1YnRpdGxlOiB7XG5cdFx0XHRcdFx0Zm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIkNhbGlicmksIE9wdGltYSwgQ2FuZGFyYSwgVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmXCIgOiBcImNhbGlicmlcIixcblx0XHRcdFx0XHRmb250U2l6ZTogMTYsXG5cdFx0XHRcdFx0Zm9udENvbG9yOiBcIiMzQTNBM0FcIixcblx0XHRcdFx0XHRmb250V2VpZ2h0OiBcImJvbGRcIixcblx0XHRcdFx0XHR2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuXHRcdFx0XHRcdG1hcmdpbjogNVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRBeGlzOiB7XG5cdFx0XHRcdFx0dGl0bGVGb250U2l6ZTogMjYsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRDb2xvcjogXCJyZ2IoOTgsOTgsOTgpXCIsXG5cdFx0XHRcdFx0dGl0bGVGb250Q29sb3I6IFwiIzY2NjY2NlwiLFxuXHRcdFx0XHRcdC8vdGl0bGVGb250RmFtaWx5OiBcImFyaWFsIGJsYWNrXCIsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRGYW1pbHk6IFwiVmVyZGFuYSwgR2VuZXZhLCBDYWxpYnJpLCBzYW5zLXNlcmlmXCIsXG5cdFx0XHRcdFx0dGl0bGVGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vdGl0bGVGb250V2VpZ2h0OiBcImJvbGRcIixcblxuXHRcdFx0XHRcdC8vbGFiZWxGb250RmFtaWx5OiBcIlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmXCIsXG5cdFx0XHRcdFx0bGFiZWxGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vbGFiZWxGb250RmFtaWx5OiBcIkhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2FcIixcblx0XHRcdFx0XHRsYWJlbEZvbnRTaXplOiAxOCxcblx0XHRcdFx0XHRsYWJlbEZvbnRDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdHRpY2tDb2xvcjogXCIjQkJCQkJCXCIsXG5cdFx0XHRcdFx0dGlja1RoaWNrbmVzczogMixcblx0XHRcdFx0XHRncmlkVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGdyaWRDb2xvcjogXCIjQkJCQkJCXCIsXG5cdFx0XHRcdFx0bGluZVRoaWNrbmVzczogMixcblx0XHRcdFx0XHRsaW5lQ29sb3I6IFwiI0JCQkJCQlwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdExlZ2VuZDoge1xuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2tcIiA6IFwiY2FsaWJyaVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdERhdGFTZXJpZXM6IHtcblx0XHRcdFx0XHQvL2JldmVsRW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHQvL2luZGV4TGFiZWxGb250RmFtaWx5OiBcIlRyZWJ1Y2hldCBNUywgbW9ub3NwYWNlLCBDb3VyaWVyIE5ldywgQ291cmllclwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FsaWJyaSwgT3B0aW1hLCBDYW5kYXJhLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vaW5kZXhMYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250U2l6ZTogMTgsXG5cdFx0XHRcdFx0Ly9pbmRleExhYmVsTGluZUNvbG9yOiBcImxpZ2h0Z3JleVwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxMaW5lVGhpY2tuZXNzOiAxXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdFwidGhlbWUyXCI6IHtcblx0XHRcdFx0Q2hhcnQ6XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29sb3JTZXQ6IFwiY29sb3JTZXQyXCJcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRUaXRsZToge1xuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IFwiaW1wYWN0LCBjaGFyY29hbCwgYXJpYWwgYmxhY2ssIHNhbnMtc2VyaWZcIixcblx0XHRcdFx0XHRmb250U2l6ZTogMzIsLy9mb250Q29sb3I6IFwicmdiKDU4LDU4LDU4KVwiLFxuXHRcdFx0XHRcdGZvbnRDb2xvcjogXCIjMzMzMzMzXCIsXG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbjogXCJ0b3BcIixcblx0XHRcdFx0XHRtYXJnaW46IDVcblx0XHRcdFx0fSxcblx0XHRcdFx0U3VidGl0bGU6IHtcblx0XHRcdFx0XHRmb250RmFtaWx5OiBcImltcGFjdCwgY2hhcmNvYWwsIGFyaWFsIGJsYWNrLCBzYW5zLXNlcmlmXCIsXG5cdFx0XHRcdFx0Zm9udFNpemU6IDE0LC8vZm9udENvbG9yOiBcInJnYig1OCw1OCw1OClcIixcblx0XHRcdFx0XHRmb250Q29sb3I6IFwiIzMzMzMzM1wiLFxuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG5cdFx0XHRcdFx0bWFyZ2luOiA1XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEF4aXM6IHtcblx0XHRcdFx0XHR0aXRsZUZvbnRTaXplOiAyMixcblx0XHRcdFx0XHR0aXRsZUZvbnRDb2xvcjogXCJyZ2IoOTgsOTgsOTgpXCIsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRGYW1pbHk6IFwiYXJpYWwgYmxhY2tcIixcblx0XHRcdFx0XHR0aXRsZUZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2tcIiA6IFwiYXJpYWxcIixcblx0XHRcdFx0XHR0aXRsZUZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXG5cblx0XHRcdFx0XHRsYWJlbEZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIENvdXJpZXIgTmV3LCBDb3VyaWVyXCIgOiBcImFyaWFsXCIsXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYVwiLFxuXHRcdFx0XHRcdGxhYmVsRm9udFNpemU6IDE2LFxuXHRcdFx0XHRcdGxhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHRsYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdHRpY2tDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0dGlja1RoaWNrbmVzczogMixcblx0XHRcdFx0XHRncmlkVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGdyaWRDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0bGluZUNvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHRsaW5lVGhpY2tuZXNzOiAwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdExlZ2VuZDoge1xuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJtb25vc3BhY2UsIHNhbnMtc2VyaWYsYXJpYWwgYmxhY2tcIiA6IFwiYXJpYWxcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHREYXRhU2VyaWVzOiB7XG5cdFx0XHRcdFx0aW5kZXhMYWJlbEZvbnRDb2xvcjogXCJncmV5XCIsXG5cdFx0XHRcdFx0Ly9pbmRleExhYmVsRm9udEZhbWlseTogXCJUcmVidWNoZXQgTVMsIG1vbm9zcGFjZSwgQ291cmllciBOZXcsIENvdXJpZXJcIixcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIkNvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vc3BhY2VcIiA6IFwiYXJpYWxcIixcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udFdlaWdodDogXCJib2xkXCIsXG5cdFx0XHRcdFx0aW5kZXhMYWJlbEZvbnRTaXplOiAxOCxcblx0XHRcdFx0XHQvL2luZGV4TGFiZWxMaW5lQ29sb3I6IFwibGlnaHRncmV5XCIsXG5cdFx0XHRcdFx0aW5kZXhMYWJlbExpbmVUaGlja25lc3M6IDFcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0XCJ0aGVtZTNcIjoge1xuXHRcdFx0XHRDaGFydDpcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb2xvclNldDogXCJjb2xvclNldDFcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFRpdGxlOiB7XG5cdFx0XHRcdFx0Zm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIkNhbmRhcmEsIE9wdGltYSwgVHJlYnVjaGV0IE1TLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBUcmVidWNoZXQgTVMsIHNlcmlmXCIgOiBcImNhbGlicmlcIixcblx0XHRcdFx0XHRmb250U2l6ZTogMzIsXG5cdFx0XHRcdFx0Zm9udENvbG9yOiBcIiMzQTNBM0FcIixcblx0XHRcdFx0XHRmb250V2VpZ2h0OiBcImJvbGRcIixcblx0XHRcdFx0XHR2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuXHRcdFx0XHRcdG1hcmdpbjogNVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRTdWJ0aXRsZToge1xuXHRcdFx0XHRcdGZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJDYW5kYXJhLCBPcHRpbWEsIFRyZWJ1Y2hldCBNUywgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgVHJlYnVjaGV0IE1TLCBzZXJpZlwiIDogXCJjYWxpYnJpXCIsXG5cdFx0XHRcdFx0Zm9udFNpemU6IDE2LFxuXHRcdFx0XHRcdGZvbnRDb2xvcjogXCIjM0EzQTNBXCIsXG5cdFx0XHRcdFx0Zm9udFdlaWdodDogXCJib2xkXCIsXG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbjogXCJ0b3BcIixcblx0XHRcdFx0XHRtYXJnaW46IDVcblx0XHRcdFx0fSxcblx0XHRcdFx0QXhpczoge1xuXHRcdFx0XHRcdHRpdGxlRm9udFNpemU6IDIyLFxuXHRcdFx0XHRcdHRpdGxlRm9udENvbG9yOiBcInJnYig5OCw5OCw5OClcIixcblx0XHRcdFx0XHQvL3RpdGxlRm9udEZhbWlseTogXCJhcmlhbCBibGFja1wiLFxuXHRcdFx0XHRcdHRpdGxlRm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIlZlcmRhbmEsIEdlbmV2YSwgQ2FsaWJyaSwgc2Fucy1zZXJpZlwiIDogXCJjYWxpYnJpXCIsXG5cdFx0XHRcdFx0Ly90aXRsZUZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRGYW1pbHk6IFwiVGltZXMgTmV3IFJvbWFuLCBUaW1lcywgc2VyaWZcIixcblx0XHRcdFx0XHRsYWJlbEZvbnRGYW1pbHk6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJDYWxpYnJpLCBPcHRpbWEsIENhbmRhcmEsIFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZlwiIDogXCJjYWxpYnJpXCIsXG5cdFx0XHRcdFx0Ly9sYWJlbEZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYVwiLFxuXHRcdFx0XHRcdGxhYmVsRm9udFNpemU6IDE4LFxuXHRcdFx0XHRcdGxhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHQvL2xhYmVsRm9udFdlaWdodDogXCJib2xkXCIsXG5cdFx0XHRcdFx0dGlja0NvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHR0aWNrVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGdyaWRUaGlja25lc3M6IDIsXG5cdFx0XHRcdFx0Z3JpZENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHRsaW5lVGhpY2tuZXNzOiAyLFxuXHRcdFx0XHRcdGxpbmVDb2xvcjogXCJncmV5XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0TGVnZW5kOiB7XG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbjogXCJib3R0b21cIixcblx0XHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsXG5cdFx0XHRcdFx0Zm9udEZhbWlseTogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIm1vbm9zcGFjZSwgc2Fucy1zZXJpZixhcmlhbCBibGFja1wiIDogXCJjYWxpYnJpXCJcblx0XHRcdFx0fSxcblx0XHRcdFx0RGF0YVNlcmllczoge1xuXHRcdFx0XHRcdGJldmVsRW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0XHRpbmRleExhYmVsRm9udENvbG9yOiBcImdyZXlcIixcblx0XHRcdFx0XHQvL2luZGV4TGFiZWxGb250RmFtaWx5OiBcIlRyZWJ1Y2hldCBNUywgbW9ub3NwYWNlLCBDb3VyaWVyIE5ldywgQ291cmllclwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250RmFtaWx5OiBpc0NhbnZhc1N1cHBvcnRlZCA/IFwiQ2FuZGFyYSwgT3B0aW1hLCBDYWxpYnJpLCBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWZcIiA6IFwiY2FsaWJyaVwiLFxuXHRcdFx0XHRcdC8vaW5kZXhMYWJlbEZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuXHRcdFx0XHRcdGluZGV4TGFiZWxGb250U2l6ZTogMTgsXG5cdFx0XHRcdFx0aW5kZXhMYWJlbExpbmVDb2xvcjogXCJsaWdodGdyZXlcIixcblx0XHRcdFx0XHRpbmRleExhYmVsTGluZVRoaWNrbmVzczogMlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcbiIsIi8vI3JlZ2lvbiBBbmltYXRvclxuXG5pbXBvcnQgQW5pbWF0aW9uSGVscGVyIGZyb20gJy4uL2hlbHBlcnMvYW5pbWF0b3InO1xuXG5mdW5jdGlvbiBBbmltYXRvcihjaGFydCkge1xuXG4gIHRoaXMuY2hhcnQgPSBjaGFydDtcbiAgdGhpcy5jdHggPSB0aGlzLmNoYXJ0LnBsb3RBcmVhLmN0eDtcbiAgdGhpcy5hbmltYXRpb25zID0gW107XG4gIHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkID0gbnVsbDtcbn1cblxuLy9BbmltYXRvci5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uIChkdXJhdGlvbiwgYmFzZSwgZGVzdCwgc291cmNlLCBhbmltYXRpb25DYWxsYmFjaywgb25Db21wbGV0ZSkge1xuQW5pbWF0b3IucHJvdG90eXBlLmFuaW1hdGUgPSBmdW5jdGlvbiAoc3RhcnREZWxheSwgZHVyYXRpb24sIGFuaW1hdGlvbkNhbGxiYWNrLCBvbkNvbXBsZXRlLCBlYXNpbmdGdW5jdGlvbikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuY2hhcnQuaXNBbmltYXRpbmcgPSB0cnVlO1xuICBlYXNpbmdGdW5jdGlvbiA9IGVhc2luZ0Z1bmN0aW9uIHx8IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyO1xuXG4gIGlmIChhbmltYXRpb25DYWxsYmFjaykge1xuXG4gICAgdGhpcy5hbmltYXRpb25zLnB1c2goe1xuICAgICAgc3RhcnRUaW1lOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpICsgKHN0YXJ0RGVsYXkgPyBzdGFydERlbGF5IDogMCksXG4gICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICBhbmltYXRpb25DYWxsYmFjazogYW5pbWF0aW9uQ2FsbGJhY2ssXG4gICAgICBvbkNvbXBsZXRlOiBvbkNvbXBsZXRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgcmVtYWluaW5nQW5pbWF0aW9ucyA9IFtdO1xuXG4gIHdoaWxlICh0aGlzLmFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuXG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9ucy5zaGlmdCgpO1xuICAgIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgIHZhciBmcmFjdGlvbkNvbXBsZXRlID0gMDtcbiAgICAvL3ZhciBmcmFjdGlvbkNvbXBsZXRlID0gTWF0aC5taW4oKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBhbmltYXRpb24uc3RhcnRUaW1lKSAvIGFuaW1hdGlvbi5kdXJhdGlvbiwgMSk7XG5cbiAgICBpZiAoYW5pbWF0aW9uLnN0YXJ0VGltZSA8PSBub3cpIHtcbiAgICAgIGZyYWN0aW9uQ29tcGxldGUgPSBlYXNpbmdGdW5jdGlvbihNYXRoLm1pbigobm93IC0gYW5pbWF0aW9uLnN0YXJ0VGltZSksIGFuaW1hdGlvbi5kdXJhdGlvbiksIDAsIDEsIGFuaW1hdGlvbi5kdXJhdGlvbik7XG4gICAgICAvL3ZhciBmcmFjdGlvbkNvbXBsZXRlID0gQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlT3V0UXVhZChNYXRoLm1pbigoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIGFuaW1hdGlvbi5zdGFydFRpbWUpLCBhbmltYXRpb24uZHVyYXRpb24pLCAwLCAxLCBhbmltYXRpb24uZHVyYXRpb24pO1xuXG4gICAgICBmcmFjdGlvbkNvbXBsZXRlID0gTWF0aC5taW4oZnJhY3Rpb25Db21wbGV0ZSwgMSk7XG5cbiAgICAgIGlmIChpc05hTihmcmFjdGlvbkNvbXBsZXRlKSB8fCAhaXNGaW5pdGUoZnJhY3Rpb25Db21wbGV0ZSkpXG4gICAgICAgIGZyYWN0aW9uQ29tcGxldGUgPSAxO1xuICAgIH1cblxuICAgIGlmIChmcmFjdGlvbkNvbXBsZXRlIDwgMSkge1xuICAgICAgcmVtYWluaW5nQW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uLmFuaW1hdGlvbkNhbGxiYWNrKGZyYWN0aW9uQ29tcGxldGUpO1xuXG4gICAgaWYgKGZyYWN0aW9uQ29tcGxldGUgPj0gMSAmJiBhbmltYXRpb24ub25Db21wbGV0ZSlcbiAgICAgIGFuaW1hdGlvbi5vbkNvbXBsZXRlKCk7XG4gIH1cblxuICB0aGlzLmFuaW1hdGlvbnMgPSByZW1haW5pbmdBbmltYXRpb25zO1xuXG4gIGlmICh0aGlzLmFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkID0gdGhpcy5jaGFydC5yZXF1ZXN0QW5pbUZyYW1lLmNhbGwod2luZG93LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5hbmltYXRlLmNhbGwoX3RoaXMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuY2hhcnQuaXNBbmltYXRpbmcgPSBmYWxzZTtcbiAgfVxuXG59XG5cbkFuaW1hdG9yLnByb3RvdHlwZS5jYW5jZWxBbGxBbmltYXRpb25zID0gZnVuY3Rpb24gKCkge1xuXG4gIHRoaXMuYW5pbWF0aW9ucyA9IFtdO1xuXG4gIGlmICh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZCkge1xuICAgIHRoaXMuY2hhcnQuY2FuY2VsUmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQpO1xuICB9XG5cbiAgdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQgPSBudWxsO1xuICB0aGlzLmNoYXJ0LmlzQW5pbWF0aW5nID0gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdG9yO1xuIiwiXG5pbXBvcnQgQ2FudmFzSlNPYmplY3QgZnJvbSAnLi9jYW52YXNqcyc7XG5pbXBvcnQgVGV4dEJsb2NrIGZyb20gJy4vdGV4dF9ibG9jayc7XG5pbXBvcnQge2V4dGVuZCwgbnVtYmVyRm9ybWF0LCBnZXRMaW5lRGFzaEFycmF5fSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZnVuY3Rpb24gQXhpcyhjaGFydCwgb3B0aW9ucywgdHlwZSwgcG9zaXRpb24pIHtcblxuXHRBeGlzLmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkF4aXNcIiwgb3B0aW9ucywgY2hhcnQudGhlbWUpO1xuXG5cdHRoaXMuY2hhcnQgPSBjaGFydDtcblx0dGhpcy5jYW52YXMgPSBjaGFydC5jYW52YXM7XG5cdHRoaXMuY3R4ID0gY2hhcnQuY3R4O1xuXHR0aGlzLm1heFdpZHRoID0gMDtcblx0dGhpcy5tYXhIZWlnaHQgPSAwO1xuXHR0aGlzLmludGVydmFsU3RhcnRQb3NpdGlvbiA9IDA7XG5cdHRoaXMubGFiZWxzID0gW107XG5cdHRoaXMuX2xhYmVscyA9IG51bGw7XG5cblx0Ly9Qcm9jZXNzZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGEgdGhhdCBnZXRzIHBsb3R0ZWQgYWdhaW5zdCB0aGlzIGF4aXNcblx0dGhpcy5kYXRhSW5mbyA9IHtcblx0XHRtaW46IEluZmluaXR5LFxuXHRcdG1heDogLUluZmluaXR5LFxuXHRcdHZpZXdQb3J0TWluOiBJbmZpbml0eSxcblx0XHR2aWV3UG9ydE1heDogLUluZmluaXR5LFxuXHRcdG1pbkRpZmY6IEluZmluaXR5IC8vIFVzZWQgb25seSBpbiBjYXNlIG9mIGF4aXNYXG5cdH07XG5cblx0aWYgKHR5cGUgPT09IFwiYXhpc1hcIikge1xuXHRcdHRoaXMuc2Vzc2lvblZhcmlhYmxlcyA9IHRoaXMuY2hhcnQuc2Vzc2lvblZhcmlhYmxlc1t0eXBlXTtcblxuXHRcdGlmICghdGhpcy5fb3B0aW9ucy5pbnRlcnZhbClcblx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHRpZiAocG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHBvc2l0aW9uID09PSBcInRvcFwiKVxuXHRcdFx0dGhpcy5zZXNzaW9uVmFyaWFibGVzID0gdGhpcy5jaGFydC5zZXNzaW9uVmFyaWFibGVzW1wiYXhpc1lcIl07XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnNlc3Npb25WYXJpYWJsZXMgPSB0aGlzLmNoYXJ0LnNlc3Npb25WYXJpYWJsZXNbXCJheGlzWTJcIl07XG5cdFx0fVxuXHR9XG5cblxuXG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMudGl0bGVGb250U2l6ZSkgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHRcdHRoaXMudGl0bGVGb250U2l6ZSA9IHRoaXMuY2hhcnQuZ2V0QXV0b0ZvbnRTaXplKHRoaXMudGl0bGVGb250U2l6ZSk7XG5cblx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcInRpdGxlRm9udFNpemU6IFwiICsgdGhpcy50aXRsZUZvbnRTaXplKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMubGFiZWxGb250U2l6ZSkgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHRcdHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMuY2hhcnQuZ2V0QXV0b0ZvbnRTaXplKHRoaXMubGFiZWxGb250U2l6ZSk7XG5cblx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcImxhYmVsRm9udFNpemU6IFwiICsgdGhpcy5sYWJlbEZvbnRTaXplKTtcblxuXHR9XG5cblx0Ly9BeGlzIFR5cGUgOiBheGlzWCwgYXhpc1lcblx0dGhpcy50eXBlID0gdHlwZTtcblx0aWYgKHR5cGUgPT09IFwiYXhpc1hcIiAmJiAoIW9wdGlvbnMgfHwgdHlwZW9mIChvcHRpb25zLmdyaWRUaGlja25lc3MpID09PSBcInVuZGVmaW5lZFwiKSlcblx0XHR0aGlzLmdyaWRUaGlja25lc3MgPSAwO1xuXG5cdHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb247XG5cblx0dGhpcy5saW5lQ29vcmRpbmF0ZXMgPSB7XG5cdFx0eDE6IG51bGwsIHkxOiBudWxsLCB4MjogbnVsbCwgeTI6IG51bGwsIHdpZHRoOiBudWxsXG5cdH07Ly97eDE6LCB5MTosIHgyOiwgeTI6LCB3aWR0aDp9XG5cdC8vXG5cdHtcblx0XHR0aGlzLmxhYmVsQW5nbGUgPSAoKHRoaXMubGFiZWxBbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXG5cdFx0aWYgKHRoaXMubGFiZWxBbmdsZSA+IDkwICYmIHRoaXMubGFiZWxBbmdsZSA8PSAyNzApXG5cdFx0XHR0aGlzLmxhYmVsQW5nbGUgLT0gMTgwO1xuXHRcdGVsc2UgaWYgKHRoaXMubGFiZWxBbmdsZSA+IDE4MCAmJiB0aGlzLmxhYmVsQW5nbGUgPD0gMjcwKVxuXHRcdFx0dGhpcy5sYWJlbEFuZ2xlIC09IDE4MFxuXHRcdGVsc2UgaWYgKHRoaXMubGFiZWxBbmdsZSA+IDI3MCAmJiB0aGlzLmxhYmVsQW5nbGUgPD0gMzYwKVxuXHRcdFx0dGhpcy5sYWJlbEFuZ2xlIC09IDM2MFxuXHR9XG5cblx0aWYgKHRoaXMuX29wdGlvbnMuc3RyaXBMaW5lcyAmJiB0aGlzLl9vcHRpb25zLnN0cmlwTGluZXMubGVuZ3RoID4gMCkge1xuXG5cdFx0dGhpcy5zdHJpcExpbmVzID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29wdGlvbnMuc3RyaXBMaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dGhpcy5zdHJpcExpbmVzLnB1c2gobmV3IFN0cmlwTGluZSh0aGlzLmNoYXJ0LCB0aGlzLl9vcHRpb25zLnN0cmlwTGluZXNbaV0sIGNoYXJ0LnRoZW1lLCArK3RoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWQsIHRoaXMpKTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLl90aXRsZVRleHRCbG9jayA9IG51bGw7XG5cblx0aWYgKCF0aGlzLmhhc09wdGlvbkNoYW5nZWQoXCJ2aWV3cG9ydE1pbmltdW1cIikgJiYgIWlzTmFOKHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1pbmltdW0pICYmIHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1pbmltdW0gIT09IG51bGwpXG5cdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtO1xuXHRlbHNlXG5cdFx0dGhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWluaW11bSA9IG51bGw7XG5cblx0aWYgKCF0aGlzLmhhc09wdGlvbkNoYW5nZWQoXCJ2aWV3cG9ydE1heGltdW1cIikgJiYgIWlzTmFOKHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1heGltdW0pICYmIHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1heGltdW0gIT09IG51bGwpXG5cdFx0dGhpcy52aWV3cG9ydE1heGltdW0gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNYXhpbXVtO1xuXHRlbHNlXG5cdFx0dGhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IG51bGw7XG5cblx0aWYgKHRoaXMubWluaW11bSAhPT0gbnVsbCAmJiB0aGlzLnZpZXdwb3J0TWluaW11bSAhPT0gbnVsbClcblx0XHR0aGlzLnZpZXdwb3J0TWluaW11bSA9IE1hdGgubWF4KHRoaXMudmlld3BvcnRNaW5pbXVtLCB0aGlzLm1pbmltdW0pO1xuXG5cdGlmICh0aGlzLm1heGltdW0gIT09IG51bGwgJiYgdGhpcy52aWV3cG9ydE1heGltdW0gIT09IG51bGwpXG5cdFx0dGhpcy52aWV3cG9ydE1heGltdW0gPSBNYXRoLm1pbih0aGlzLnZpZXdwb3J0TWF4aW11bSwgdGhpcy5tYXhpbXVtKTtcblxuXHR0aGlzLnRyYWNrQ2hhbmdlcyhcInZpZXdwb3J0TWluaW11bVwiKTtcblx0dGhpcy50cmFja0NoYW5nZXMoXCJ2aWV3cG9ydE1heGltdW1cIik7XG59XG5cbmV4dGVuZChBeGlzLCBDYW52YXNKU09iamVjdCk7XG5cbkF4aXMucHJvdG90eXBlLmNyZWF0ZUxhYmVscyA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdGV4dEJsb2NrO1xuXHR2YXIgaSA9IDA7XG5cdHZhciBlbmRQb2ludDtcblxuXHR2YXIgbGFiZWxNYXhXaWR0aCA9IDA7XG5cdHZhciBsYWJlbE1heEhlaWdodCA9IDA7XG5cdHZhciBpbnRlcnZhbEluUGl4ZWxzID0gMDtcblxuXHQvL3ZhciBpbnRlcnZhbEluUGl4ZWxzID0gdGhpcy5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiB0aGlzLmludGVydmFsO1xuXG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInRvcFwiKSB7XG5cdFx0aW50ZXJ2YWxJblBpeGVscyA9IHRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoIC8gTWF0aC5hYnModGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSkgKiB0aGlzLmludGVydmFsO1xuXG5cdFx0aWYgKHRoaXMubGFiZWxBdXRvRml0KSB7XG5cdFx0XHRsYWJlbE1heFdpZHRoID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLmxhYmVsTWF4V2lkdGgpID09PSBcInVuZGVmaW5lZFwiID8gaW50ZXJ2YWxJblBpeGVscyAqIC45ID4+IDAgOiB0aGlzLmxhYmVsTWF4V2lkdGg7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGFiZWxNYXhXaWR0aCA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy5sYWJlbE1heFdpZHRoKSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMuY2hhcnQud2lkdGggKiAuNyA+PiAwIDogdGhpcy5sYWJlbE1heFdpZHRoO1xuXHRcdH1cblxuXHRcdGxhYmVsTWF4SGVpZ2h0ID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLmxhYmVsV3JhcCkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5sYWJlbFdyYXAgPyB0aGlzLmNoYXJ0LmhlaWdodCAqIC41ID4+IDAgOiB0aGlzLmxhYmVsRm9udFNpemUgKiAxLjU7XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpIHtcblxuXHRcdGludGVydmFsSW5QaXhlbHMgPSB0aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQgLyBNYXRoLmFicyh0aGlzLnZpZXdwb3J0TWF4aW11bSAtIHRoaXMudmlld3BvcnRNaW5pbXVtKSAqIHRoaXMuaW50ZXJ2YWw7XG5cblxuXHRcdGlmICh0aGlzLmxhYmVsQXV0b0ZpdCkge1xuXHRcdFx0bGFiZWxNYXhXaWR0aCA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy5sYWJlbE1heFdpZHRoKSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMuY2hhcnQud2lkdGggKiAuMyA+PiAwIDogdGhpcy5sYWJlbE1heFdpZHRoO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGxhYmVsTWF4V2lkdGggPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMubGFiZWxNYXhXaWR0aCkgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLmNoYXJ0LndpZHRoICogLjUgPj4gMCA6IHRoaXMubGFiZWxNYXhXaWR0aDtcblx0XHR9XG5cblx0XHRsYWJlbE1heEhlaWdodCA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy5sYWJlbFdyYXApID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMubGFiZWxXcmFwID8gaW50ZXJ2YWxJblBpeGVscyAqIDIgPj4gMCA6IHRoaXMubGFiZWxGb250U2l6ZSAqIDEuNTtcblx0fVxuXG5cdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpIHtcblx0XHRlbmRQb2ludCA9IGFkZFRvRGF0ZVRpbWUobmV3IERhdGUodGhpcy52aWV3cG9ydE1heGltdW0pLCB0aGlzLmludGVydmFsLCB0aGlzLmludGVydmFsVHlwZSlcblx0XHQvL2VuZFBvaW50ID0gdGhpcy52aWV3cG9ydE1heGltdW07XG5cblx0XHRmb3IgKGkgPSB0aGlzLmludGVydmFsU3RhcnRQb3NpdGlvbjsgaSA8IGVuZFBvaW50OyBhZGRUb0RhdGVUaW1lKGksIHRoaXMuaW50ZXJ2YWwsIHRoaXMuaW50ZXJ2YWxUeXBlKSkge1xuXG5cdFx0XHQvL3ZhciB0ZXh0ID0gZGF0ZUZvcm1hdChpLCB0aGlzLnZhbHVlRm9ybWF0U3RyaW5nKTtcblx0XHRcdHZhciB0aW1lSW5NaWxsaXNlY29uZHMgPSBpLmdldFRpbWUoKTtcblx0XHRcdHZhciB0ZXh0ID0gdGhpcy5sYWJlbEZvcm1hdHRlciA/IHRoaXMubGFiZWxGb3JtYXR0ZXIoeyBjaGFydDogdGhpcy5jaGFydCwgYXhpczogdGhpcy5fb3B0aW9ucywgdmFsdWU6IGksIGxhYmVsOiB0aGlzLmxhYmVsc1tpXSA/IHRoaXMubGFiZWxzW2ldIDogbnVsbCB9KVxuXHRcdFx0XHQ6IHRoaXMudHlwZSA9PT0gXCJheGlzWFwiICYmIHRoaXMubGFiZWxzW3RpbWVJbk1pbGxpc2Vjb25kc10gPyB0aGlzLmxhYmVsc1t0aW1lSW5NaWxsaXNlY29uZHNdIDogZGF0ZUZvcm1hdChpLCB0aGlzLnZhbHVlRm9ybWF0U3RyaW5nLCB0aGlzLmNoYXJ0Ll9jdWx0dXJlSW5mbyk7XG5cblx0XHRcdHRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRcdFx0eDogMCxcblx0XHRcdFx0eTogMCxcblx0XHRcdFx0Ly9tYXhXaWR0aDogdGhpcy5tYXhIZWlnaHQsXG5cdFx0XHRcdC8vbWF4SGVpZ2h0OiB0aGlzLmxhYmVsRm9udFNpemUsXG5cdFx0XHRcdG1heFdpZHRoOiBsYWJlbE1heFdpZHRoLFxuXHRcdFx0XHRtYXhIZWlnaHQ6IGxhYmVsTWF4SGVpZ2h0LFxuXHRcdFx0XHRhbmdsZTogdGhpcy5sYWJlbEFuZ2xlLFxuXHRcdFx0XHR0ZXh0OiB0aGlzLnByZWZpeCArIHRleHQgKyB0aGlzLnN1ZmZpeCxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdFx0Zm9udFNpemU6IHRoaXMubGFiZWxGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0XHRmb250RmFtaWx5OiB0aGlzLmxhYmVsRm9udEZhbWlseSxcblx0XHRcdFx0Zm9udFdlaWdodDogdGhpcy5sYWJlbEZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRcdGZvbnRDb2xvcjogdGhpcy5sYWJlbEZvbnRDb2xvcixcblx0XHRcdFx0Zm9udFN0eWxlOiB0aGlzLmxhYmVsRm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0XHR0ZXh0QmFzZWxpbmU6IFwibWlkZGxlXCJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl9sYWJlbHMucHVzaCh7IHBvc2l0aW9uOiBpLmdldFRpbWUoKSwgdGV4dEJsb2NrOiB0ZXh0QmxvY2ssIGVmZmVjdGl2ZUhlaWdodDogbnVsbCB9KTtcblx0XHR9XG5cblx0fVxuXHRlbHNlIHtcblx0XHRlbmRQb2ludCA9IHRoaXMudmlld3BvcnRNYXhpbXVtO1xuXG5cdFx0Ly9pZiAoKE1hdGguZmxvb3IodGhpcy5pbnRlcnZhbCkgPCB0aGlzLmludGVydmFsICYmICF0aGlzLl9vcHRpb25zLmludGVydmFsKSB8fCB0cnVlKSB7XG5cblx0XHQvL0NoZWNrIGlmIGl0IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIGNhdGVnb3J5IGF4aXMuIElmIHllcywgdGhlbiBjZWlsIHRoZSBpbnRlcnZhbFxuXHRcdGlmICh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5sZW5ndGgpIHtcblx0XHRcdHZhciB0ZW1wSW50ZXJ2YWwgPSBNYXRoLmNlaWwodGhpcy5pbnRlcnZhbCk7XG5cdFx0XHR2YXIgdGVtcFN0YXJ0UG9pbnQgPSBNYXRoLmNlaWwodGhpcy5pbnRlcnZhbFN0YXJ0UG9zaXRpb24pO1xuXHRcdFx0dmFyIGhhc0FsbExhYmVscyA9IGZhbHNlO1xuXHRcdFx0Zm9yIChpID0gdGVtcFN0YXJ0UG9pbnQ7IGkgPCB0aGlzLnZpZXdwb3J0TWF4aW11bTsgaSArPSB0ZW1wSW50ZXJ2YWwpIHtcblx0XHRcdFx0aWYgKHRoaXMubGFiZWxzW2ldKSB7XG5cdFx0XHRcdFx0aGFzQWxsTGFiZWxzID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYXNBbGxMYWJlbHMgPSBmYWxzZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaGFzQWxsTGFiZWxzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSB0ZW1wSW50ZXJ2YWw7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxTdGFydFBvc2l0aW9uID0gdGVtcFN0YXJ0UG9pbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly9wYXJzZUZsb2F0ICYgdG9QcmVjaXNpb24gYXJlIGJlaW5nIHVzZWQgdG8gYXZvaWQgaXNzdWVzIHJlbGF0ZWQgdG8gcHJlY2lzaW9uLlxuXHRcdGZvciAoaSA9IHRoaXMuaW50ZXJ2YWxTdGFydFBvc2l0aW9uOyBpIDw9IGVuZFBvaW50OyBpID0gcGFyc2VGbG9hdCgoaSArIHRoaXMuaW50ZXJ2YWwpLnRvRml4ZWQoMTQpKSkge1xuXG5cdFx0XHR2YXIgdGV4dCA9IHRoaXMubGFiZWxGb3JtYXR0ZXIgPyB0aGlzLmxhYmVsRm9ybWF0dGVyKHsgY2hhcnQ6IHRoaXMuY2hhcnQsIGF4aXM6IHRoaXMuX29wdGlvbnMsIHZhbHVlOiBpLCBsYWJlbDogdGhpcy5sYWJlbHNbaV0gPyB0aGlzLmxhYmVsc1tpXSA6IG51bGwgfSlcblx0XHRcdFx0OiB0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmxhYmVsc1tpXSA/IHRoaXMubGFiZWxzW2ldIDogbnVtYmVyRm9ybWF0KGksIHRoaXMudmFsdWVGb3JtYXRTdHJpbmcsIHRoaXMuY2hhcnQuX2N1bHR1cmVJbmZvKTtcblxuXHRcdFx0dGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiAwLFxuXHRcdFx0XHR5OiAwLFxuXHRcdFx0XHQvL21heFdpZHRoOiB0aGlzLm1heEhlaWdodCxcblx0XHRcdFx0Ly9tYXhIZWlnaHQ6IHRoaXMubGFiZWxGb250U2l6ZSxcblx0XHRcdFx0bWF4V2lkdGg6IGxhYmVsTWF4V2lkdGgsXG5cdFx0XHRcdG1heEhlaWdodDogbGFiZWxNYXhIZWlnaHQsXG5cdFx0XHRcdGFuZ2xlOiB0aGlzLmxhYmVsQW5nbGUsXG5cdFx0XHRcdHRleHQ6IHRoaXMucHJlZml4ICsgdGV4dCArIHRoaXMuc3VmZml4LFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwibGVmdFwiLC8vbGVmdCwgY2VudGVyLCByaWdodFxuXHRcdFx0XHRmb250U2l6ZTogdGhpcy5sYWJlbEZvbnRTaXplLC8vaW4gcGl4ZWxzXG5cdFx0XHRcdGZvbnRGYW1pbHk6IHRoaXMubGFiZWxGb250RmFtaWx5LFxuXHRcdFx0XHRmb250V2VpZ2h0OiB0aGlzLmxhYmVsRm9udFdlaWdodCwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcblx0XHRcdFx0Zm9udENvbG9yOiB0aGlzLmxhYmVsRm9udENvbG9yLFxuXHRcdFx0XHRmb250U3R5bGU6IHRoaXMubGFiZWxGb250U3R5bGUsIC8vIG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG5cdFx0XHRcdHRleHRCYXNlbGluZTogXCJtaWRkbGVcIixcblx0XHRcdFx0Ym9yZGVyVGhpY2tuZXNzOiAwXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fbGFiZWxzLnB1c2goeyBwb3NpdGlvbjogaSwgdGV4dEJsb2NrOiB0ZXh0QmxvY2ssIGVmZmVjdGl2ZUhlaWdodDogbnVsbCB9KTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RyaXBMaW5lcy5sZW5ndGg7IGkrKykge1xuXG5cdFx0dmFyIHN0cmlwTGluZSA9IHRoaXMuc3RyaXBMaW5lc1tpXTtcblxuXHRcdHRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRcdHg6IDAsXG5cdFx0XHR5OiAwLFxuXHRcdFx0Ly9tYXhXaWR0aDogdGhpcy5tYXhIZWlnaHQsXG5cdFx0XHQvL21heEhlaWdodDogdGhpcy5sYWJlbEZvbnRTaXplLFxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBzdHJpcExpbmUubGFiZWxCYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRtYXhXaWR0aDogbGFiZWxNYXhXaWR0aCxcblx0XHRcdG1heEhlaWdodDogbGFiZWxNYXhIZWlnaHQsXG5cdFx0XHRhbmdsZTogdGhpcy5sYWJlbEFuZ2xlLFxuXHRcdFx0dGV4dDogc3RyaXBMaW5lLmxhYmVsRm9ybWF0dGVyID8gc3RyaXBMaW5lLmxhYmVsRm9ybWF0dGVyKHsgY2hhcnQ6IHRoaXMuY2hhcnQsIGF4aXM6IHRoaXMsIHN0cmlwTGluZTogc3RyaXBMaW5lIH0pIDogc3RyaXBMaW5lLmxhYmVsLFxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdGZvbnRTaXplOiBzdHJpcExpbmUubGFiZWxGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0Zm9udEZhbWlseTogc3RyaXBMaW5lLmxhYmVsRm9udEZhbWlseSxcblx0XHRcdGZvbnRXZWlnaHQ6IHN0cmlwTGluZS5sYWJlbEZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IHN0cmlwTGluZS5fb3B0aW9ucy5sYWJlbEZvbnRDb2xvciB8fCBzdHJpcExpbmUuY29sb3IsXG5cdFx0XHRmb250U3R5bGU6IHN0cmlwTGluZS5sYWJlbEZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHRcdHRleHRCYXNlbGluZTogXCJtaWRkbGVcIixcblx0XHRcdGJvcmRlclRoaWNrbmVzczogMFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fbGFiZWxzLnB1c2goeyBwb3NpdGlvbjogc3RyaXBMaW5lLnZhbHVlLCB0ZXh0QmxvY2s6IHRleHRCbG9jaywgZWZmZWN0aXZlSGVpZ2h0OiBudWxsLCBzdHJpcExpbmU6IHN0cmlwTGluZSB9KTtcblx0fVxuXG59XG5cbkF4aXMucHJvdG90eXBlLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZVdpZHRoID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBtYXhMYWJlbEVmZmVjdGl2ZVdpZHRoID0gMDtcblx0dGhpcy5fbGFiZWxzID0gW107XG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImxlZnRcIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJyaWdodFwiKSB7XG5cblx0XHR0aGlzLmNyZWF0ZUxhYmVscygpO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0dmFyIHRleHRCbG9jayA9IHRoaXMuX2xhYmVsc1tpXS50ZXh0QmxvY2s7XG5cblx0XHRcdHZhciBzaXplID0gdGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cblx0XHRcdC8vdmFyIGh5cG90ZW51c2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coc2l6ZS5oZWlnaHQgLyAyLCAyKSArIE1hdGgucG93KHNpemUud2lkdGgsIDIpKTtcblx0XHRcdC8vbGFiZWxFZmZlY3RpdmVXaWR0aCA9IGh5cG90ZW51c2UgKiBNYXRoLmNvcyhNYXRoLmFicyhNYXRoLlBJIC8gMTgwICogdGhpcy5sYWJlbEFuZ2xlKSAtIE1hdGguYWJzKE1hdGguYWNvcyhzaXplLndpZHRoIC8gaHlwb3RlbnVzZSkpKTtcblxuXHRcdFx0dmFyIGxhYmVsRWZmZWN0aXZlV2lkdGggPSAwO1xuXG5cdFx0XHRpZiAodGhpcy5sYWJlbEFuZ2xlID09PSAwKVxuXHRcdFx0XHRsYWJlbEVmZmVjdGl2ZVdpZHRoID0gc2l6ZS53aWR0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bGFiZWxFZmZlY3RpdmVXaWR0aCA9IChzaXplLndpZHRoICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIE1hdGguYWJzKHRoaXMubGFiZWxBbmdsZSkpKSArIChzaXplLmhlaWdodCAvIDIgKiBNYXRoLnNpbihNYXRoLlBJIC8gMTgwICogTWF0aC5hYnModGhpcy5sYWJlbEFuZ2xlKSkpO1xuXG5cblx0XHRcdGlmIChtYXhMYWJlbEVmZmVjdGl2ZVdpZHRoIDwgbGFiZWxFZmZlY3RpdmVXaWR0aClcblx0XHRcdFx0bWF4TGFiZWxFZmZlY3RpdmVXaWR0aCA9IGxhYmVsRWZmZWN0aXZlV2lkdGg7XG5cblx0XHRcdHRoaXMuX2xhYmVsc1tpXS5lZmZlY3RpdmVXaWR0aCA9IGxhYmVsRWZmZWN0aXZlV2lkdGg7XG5cdFx0fVxuXHR9XG5cblxuXG5cdHZhciB0aXRsZUhlaWdodCA9IHRoaXMudGl0bGUgPyBnZXRGb250SGVpZ2h0SW5QaXhlbHModGhpcy50aXRsZUZvbnRGYW1pbHksIHRoaXMudGl0bGVGb250U2l6ZSwgdGhpcy50aXRsZUZvbnRXZWlnaHQpICsgMiA6IDA7XG5cblx0dmFyIGF4aXNXaWR0aCA9IHRpdGxlSGVpZ2h0ICsgbWF4TGFiZWxFZmZlY3RpdmVXaWR0aCArIHRoaXMudGlja0xlbmd0aCArIDU7XG5cblx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgd2luZG93LmNvbnNvbGUpIHtcblx0Ly9cdHdpbmRvdy5jb25zb2xlLmxvZyh0aGlzLnR5cGUgKyBcIi0tLSBheGlzV2lkdGg6IFwiICsgYXhpc1dpZHRoKTtcblx0Ly99XG5cblx0cmV0dXJuIGF4aXNXaWR0aDtcbn1cblxuQXhpcy5wcm90b3R5cGUuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbWF4TGFiZWxFZmZlY3RpdmVIZWlnaHQgPSAwO1xuXHR0aGlzLl9sYWJlbHMgPSBbXTtcblx0dmFyIHRleHRCbG9jaztcblx0dmFyIGkgPSAwO1xuXG5cdHRoaXMuY3JlYXRlTGFiZWxzKCk7XG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInRvcFwiKSB7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdHRleHRCbG9jayA9IHRoaXMuX2xhYmVsc1tpXS50ZXh0QmxvY2s7XG5cblx0XHRcdHZhciBzaXplID0gdGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cdFx0XHQvL3ZhciBkaWFnb25hbCA9IE1hdGguc3FydChNYXRoLnBvdyhzaXplLmhlaWdodCwgMikgKyBNYXRoLnBvdyhzaXplLndpZHRoLCAyKSk7XG5cblx0XHRcdC8vdmFyIGh5cG90ZW51c2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coc2l6ZS5oZWlnaHQgLyAyLCAyKSArIE1hdGgucG93KHNpemUud2lkdGgsIDIpKTtcblx0XHRcdC8vdmFyIGxhYmVsRWZmZWN0aXZlSGVpZ2h0ID0gaHlwb3RlbnVzZSAqIE1hdGguY29zKE1hdGguUEkgLyAyIC0gKE1hdGguYWJzKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpICsgTWF0aC5hYnMoTWF0aC5hY29zKHNpemUud2lkdGggLyBoeXBvdGVudXNlKSkpKTtcblxuXHRcdFx0dmFyIGxhYmVsRWZmZWN0aXZlSGVpZ2h0ID0gMDtcblxuXHRcdFx0aWYgKHRoaXMubGFiZWxBbmdsZSA9PT0gMClcblx0XHRcdFx0bGFiZWxFZmZlY3RpdmVIZWlnaHQgPSBzaXplLmhlaWdodDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bGFiZWxFZmZlY3RpdmVIZWlnaHQgPSAoc2l6ZS53aWR0aCAqIE1hdGguc2luKE1hdGguUEkgLyAxODAgKiBNYXRoLmFicyh0aGlzLmxhYmVsQW5nbGUpKSkgKyAoc2l6ZS5oZWlnaHQgLyAyICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIE1hdGguYWJzKHRoaXMubGFiZWxBbmdsZSkpKTtcblxuXHRcdFx0aWYgKG1heExhYmVsRWZmZWN0aXZlSGVpZ2h0IDwgbGFiZWxFZmZlY3RpdmVIZWlnaHQpXG5cdFx0XHRcdG1heExhYmVsRWZmZWN0aXZlSGVpZ2h0ID0gbGFiZWxFZmZlY3RpdmVIZWlnaHQ7XG5cblx0XHRcdHRoaXMuX2xhYmVsc1tpXS5lZmZlY3RpdmVIZWlnaHQgPSBsYWJlbEVmZmVjdGl2ZUhlaWdodDtcblx0XHR9XG5cdH1cblxuXHQvL3ZhciB0aXRsZUhlaWdodCA9IHRoaXMudGl0bGUgPyB0aGlzLnRpdGxlRm9udFNpemUgKyA1IDogMDtcblx0dmFyIHRpdGxlSGVpZ2h0ID0gdGhpcy50aXRsZSA/IGdldEZvbnRIZWlnaHRJblBpeGVscyh0aGlzLnRpdGxlRm9udEZhbWlseSwgdGhpcy50aXRsZUZvbnRTaXplLCB0aGlzLnRpdGxlRm9udFdlaWdodCkgKyAyIDogMDtcblxuXHRyZXR1cm4gdGl0bGVIZWlnaHQgKyBtYXhMYWJlbEVmZmVjdGl2ZUhlaWdodCArIHRoaXMudGlja0xlbmd0aCArIDU7XG59XG5cbi8vU3RhdGljIE1ldGhvZCB0aGF0IGNvLW9yZGluYXRlcyBiZXR3ZWVuIGF4aXNYLCBheGlzWSBhbmQgcmVuZGVycyB0aGVtXG5BeGlzLnNldExheW91dEFuZFJlbmRlciA9IGZ1bmN0aW9uIChheGlzWCwgYXhpc1ksIGF4aXNZMiwgYXhpc1BsYWNlbWVudCwgZnJlZVNwYWNlKSB7XG5cdHZhciB4MSwgeTEsIHgyLCB5Mjtcblx0dmFyIGNoYXJ0ID0gYXhpc1guY2hhcnQ7XG5cdHZhciBjdHggPSBjaGFydC5jdHg7XG5cblx0YXhpc1guY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMoKTtcblxuXHRpZiAoYXhpc1kpXG5cdFx0YXhpc1kuY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMoKTtcblxuXHRpZiAoYXhpc1kyKVxuXHRcdGF4aXNZMi5jYWxjdWxhdGVBeGlzUGFyYW1ldGVycygpO1xuXG5cdC8vaWYgKGF4aXNZICYmIGF4aXNZMiAmJiB0eXBlb2YgKGF4aXNZLl9vcHRpb25zLnZpZXdwb3J0TWF4aW11bSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChheGlzWS5fb3B0aW9ucy52aWV3cG9ydE1pbmltdW0pID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAoYXhpc1kuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiXG5cdC8vXHRcdCYmIHR5cGVvZiAoYXhpc1kyLl9vcHRpb25zLnZpZXdwb3J0TWF4aW11bSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChheGlzWTIuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGF4aXNZMi5fb3B0aW9ucy5pbnRlcnZhbCkgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuXHQvL1x0dmFyIG5vVGlja3NZID0gKGF4aXNZLnZpZXdwb3J0TWF4aW11bSAtIGF4aXNZLnZpZXdwb3J0TWluaW11bSkgLyBheGlzWS5pbnRlcnZhbDtcblxuXHQvL1x0dmFyIG5vVGlja3NZMiA9IChheGlzWTIudmlld3BvcnRNYXhpbXVtIC0gYXhpc1kyLnZpZXdwb3J0TWluaW11bSkgLyBheGlzWTIuaW50ZXJ2YWw7XG5cblx0Ly9cdGlmIChub1RpY2tzWSA+IG5vVGlja3NZMikge1xuXHQvL1x0XHRheGlzWTIudmlld3BvcnRNYXhpbXVtID0gYXhpc1kyLmludGVydmFsICogbm9UaWNrc1kgKyBheGlzWTIudmlld3BvcnRNaW5pbXVtO1xuXHQvL1x0fSBlbHNlIGlmIChub1RpY2tzWTIgPiBub1RpY2tzWSkge1xuXHQvL1x0XHRheGlzWS52aWV3cG9ydE1heGltdW0gPSBheGlzWS5pbnRlcnZhbCAqIG5vVGlja3NZMiArIGF4aXNZLnZpZXdwb3J0TWluaW11bTtcblx0Ly9cdH1cblx0Ly99XG5cblx0dmFyIGF4aXNZbGluZVRoaWNrbmVzcyA9IGF4aXNZID8gYXhpc1kubGluZVRoaWNrbmVzcyA/IGF4aXNZLmxpbmVUaGlja25lc3MgOiAwIDogMDtcblx0dmFyIGF4aXNZMmxpbmVUaGlja25lc3MgPSBheGlzWTIgPyBheGlzWTIubGluZVRoaWNrbmVzcyA/IGF4aXNZMi5saW5lVGhpY2tuZXNzIDogMCA6IDA7XG5cblx0dmFyIGF4aXNZR3JpZFRoaWNrbmVzcyA9IGF4aXNZID8gYXhpc1kuZ3JpZFRoaWNrbmVzcyA/IGF4aXNZLmdyaWRUaGlja25lc3MgOiAwIDogMDtcblx0dmFyIGF4aXNZMkdyaWRUaGlja25lc3MgPSBheGlzWTIgPyBheGlzWTIuZ3JpZFRoaWNrbmVzcyA/IGF4aXNZMi5ncmlkVGhpY2tuZXNzIDogMCA6IDA7XG5cblx0dmFyIGF4aXNZTWFyZ2luID0gYXhpc1kgPyBheGlzWS5tYXJnaW4gOiAwO1xuXHR2YXIgYXhpc1kyTWFyZ2luID0gYXhpc1kgPyBheGlzWS5tYXJnaW4gOiAwO1xuXG5cdGlmIChheGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cblx0XHRheGlzWC5saW5lQ29vcmRpbmF0ZXMgPSB7XG5cdFx0fTtcblxuXHRcdHZhciBheGlzWVdpZHRoID0gTWF0aC5jZWlsKGF4aXNZID8gYXhpc1kuY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlV2lkdGgoKSA6IDApO1xuXHRcdHgxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWVdpZHRoICsgYXhpc1lNYXJnaW4pO1xuXHRcdGF4aXNYLmxpbmVDb29yZGluYXRlcy54MSA9IHgxO1xuXG5cdFx0dmFyIGF4aXNZMldpZHRoID0gTWF0aC5jZWlsKGF4aXNZMiA/IGF4aXNZMi5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVXaWR0aCgpIDogMCk7XG5cdFx0eDIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS54MiAtIGF4aXNZMldpZHRoID4gYXhpc1guY2hhcnQud2lkdGggLSAxMCA/IGF4aXNYLmNoYXJ0LndpZHRoIC0gMTAgOiBmcmVlU3BhY2UueDIgLSBheGlzWTJXaWR0aCk7XG5cdFx0YXhpc1gubGluZUNvb3JkaW5hdGVzLngyID0geDI7XG5cblx0XHRheGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGggPSBNYXRoLmFicyh4MiAtIHgxKTsgLy8gcmVxdWlyZWQgZWFybHkgb24gaW5zaWRlIGNyZWF0ZUxhYmVscyBvZiBheGlzWFxuXG5cdFx0dmFyIGF4aXNYSGVpZ2h0ID0gTWF0aC5jZWlsKGF4aXNYLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZUhlaWdodCgpKTtcblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNYIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSwgTWFyZ2luIGFuZCBpdHMgaGVpZ2h0XG5cdFx0Ly94MSA9IGZyZWVTcGFjZS54MSArIGF4aXNZV2lkdGggKyBheGlzWU1hcmdpbiArIGF4aXNZbGluZVRoaWNrbmVzcyAvIDI7XG5cdFx0eTEgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNYSGVpZ2h0IC0gYXhpc1gubWFyZ2luKTtcblx0XHR5MiA9IE1hdGgucm91bmQoZnJlZVNwYWNlLnkyIC0gYXhpc1gubWFyZ2luKTtcblxuXHRcdC8vYXhpc1gubGluZUNvb3JkaW5hdGVzID0geyB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTEsIHdpZHRoOiBNYXRoLmFicyh4MiAtIHgxKSB9XG5cdFx0YXhpc1gubGluZUNvb3JkaW5hdGVzLnkxID0geTE7XG5cdFx0YXhpc1gubGluZUNvb3JkaW5hdGVzLnkyID0geTE7XG5cblx0XHRheGlzWC5ib3VuZGluZ1JlY3QgPSB7XG5cdFx0XHR4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHdpZHRoOiB4MiAtIHgxLCBoZWlnaHQ6IHkyIC0geTFcblx0XHR9O1xuXG5cdFx0Ly9pZiAoaXNEZWJ1Z01vZGUpIHtcblx0XHQvL1x0YXhpc1guY3R4LnJlY3QoYXhpc1guYm91bmRpbmdSZWN0LngxLCBheGlzWC5ib3VuZGluZ1JlY3QueTEsIGF4aXNYLmJvdW5kaW5nUmVjdC53aWR0aCwgYXhpc1guYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Ly9cdGF4aXNYLmN0eC5zdHJva2UoKTtcblx0XHQvL31cblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNZIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSwgTWFyZ2luIGFuZCBpdHMgaGVpZ2h0XG5cdFx0aWYgKGF4aXNZKSB7XG5cdFx0XHR4MSA9IE1hdGgucm91bmQoZnJlZVNwYWNlLngxICsgYXhpc1kubWFyZ2luKTtcblx0XHRcdHkxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueTEgPCAxMCA/IDEwIDogZnJlZVNwYWNlLnkxKTtcblx0XHRcdHgyID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWVdpZHRoICsgYXhpc1kubWFyZ2luKTtcblx0XHRcdC8veTIgPSBmcmVlU3BhY2UueTIgLSBheGlzWEhlaWdodCAtIGF4aXNYLm1hcmdpbiAtIGF4aXNYLmxpbmVUaGlja25lc3MgLyAyO1xuXHRcdFx0eTIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNYSGVpZ2h0IC0gYXhpc1gubWFyZ2luKTtcblxuXHRcdFx0YXhpc1kubGluZUNvb3JkaW5hdGVzID0ge1xuXHRcdFx0XHR4MTogeDIsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIGhlaWdodDogTWF0aC5hYnMoeTIgLSB5MSlcblx0XHRcdH1cblxuXHRcdFx0YXhpc1kuYm91bmRpbmdSZWN0ID0ge1xuXHRcdFx0XHR4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHdpZHRoOiB4MiAtIHgxLCBoZWlnaHQ6IHkyIC0geTFcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgYXhpc1kpIHtcblx0XHQvL1x0YXhpc1kuY3R4LnJlY3QoYXhpc1kuYm91bmRpbmdSZWN0LngxLCBheGlzWS5ib3VuZGluZ1JlY3QueTEsIGF4aXNZLmJvdW5kaW5nUmVjdC53aWR0aCwgYXhpc1kuYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Ly9cdGF4aXNZLmN0eC5zdHJva2UoKTtcblx0XHQvL31cblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNZMiBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIGZyZWUgc3BhY2UsIE1hcmdpbiBhbmQgaXRzIGhlaWdodFxuXHRcdGlmIChheGlzWTIpIHtcblx0XHRcdHgxID0gTWF0aC5yb3VuZChheGlzWC5saW5lQ29vcmRpbmF0ZXMueDIpO1xuXHRcdFx0eTEgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MSA8IDEwID8gMTAgOiBmcmVlU3BhY2UueTEpO1xuXHRcdFx0eDIgPSBNYXRoLnJvdW5kKHgxICsgYXhpc1kyV2lkdGggKyBheGlzWTIubWFyZ2luKTtcblx0XHRcdC8veTIgPSBmcmVlU3BhY2UueTIgLSBheGlzWEhlaWdodCAtIGF4aXNYLm1hcmdpbiAtIGF4aXNYLmxpbmVUaGlja25lc3MgLyAyO1xuXHRcdFx0eTIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNYSGVpZ2h0IC0gYXhpc1gubWFyZ2luKTtcblxuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcyA9IHtcblx0XHRcdFx0eDE6IHgxLCB5MTogeTEsIHgyOiB4MSwgeTI6IHkyLCBoZWlnaHQ6IE1hdGguYWJzKHkyIC0geTEpXG5cdFx0XHR9XG5cblx0XHRcdGF4aXNZMi5ib3VuZGluZ1JlY3QgPSB7XG5cdFx0XHRcdHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5Miwgd2lkdGg6IHgyIC0geDEsIGhlaWdodDogeTIgLSB5MVxuXHRcdFx0fTtcblx0XHR9XG5cblxuXHRcdGF4aXNYLmNhbGN1bGF0ZVZhbHVlVG9QaXhlbENvbnZlcnNpb25QYXJhbWV0ZXJzKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycygpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycygpO1xuXG5cblx0XHRjdHguc2F2ZSgpO1xuXHRcdGN0eC5yZWN0KDUsIGF4aXNYLmJvdW5kaW5nUmVjdC55MSwgYXhpc1guY2hhcnQud2lkdGggLSAxMCwgYXhpc1guYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Y3R4LmNsaXAoKTtcblxuXHRcdGF4aXNYLnJlbmRlckxhYmVsc1RpY2tzQW5kVGl0bGUoKTtcblx0XHRjdHgucmVzdG9yZSgpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVyTGFiZWxzVGlja3NBbmRUaXRsZSgpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlKCk7XG5cblxuXHRcdGNoYXJ0LnByZXBhcmVQbG90QXJlYSgpO1xuXHRcdHZhciBwbG90QXJlYSA9IGF4aXNYLmNoYXJ0LnBsb3RBcmVhO1xuXG5cdFx0Y3R4LnNhdmUoKTtcblxuXHRcdGN0eC5yZWN0KHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgTWF0aC5hYnMocGxvdEFyZWEueDIgLSBwbG90QXJlYS54MSksIE1hdGguYWJzKHBsb3RBcmVhLnkyIC0gcGxvdEFyZWEueTEpKTtcblxuXHRcdGN0eC5jbGlwKCk7XG5cblx0XHRheGlzWC5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwidmFsdWVcIik7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwidmFsdWVcIik7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblxuXG5cdFx0YXhpc1gucmVuZGVySW50ZXJsYWNlZENvbG9ycygpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVySW50ZXJsYWNlZENvbG9ycygpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJJbnRlcmxhY2VkQ29sb3JzKCk7XG5cblx0XHRjdHgucmVzdG9yZSgpO1xuXG5cblx0XHRheGlzWC5yZW5kZXJHcmlkKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJHcmlkKCk7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckdyaWQoKTtcblxuXG5cdFx0YXhpc1gucmVuZGVyQXhpc0xpbmUoKTtcblxuXHRcdGlmIChheGlzWSlcblx0XHRcdGF4aXNZLnJlbmRlckF4aXNMaW5lKCk7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckF4aXNMaW5lKCk7XG5cblxuXHRcdC8vTm8gbmVlZCB0byBjbGlwIHRvIHBsb3RBcmVhIGJlY2F1c2Ugc3RyaXBMaW5lcyBuZWVkIHRvIHJlbmRlciBvbiB0b3Agb2YgZ3JpZGxpbmVzXG5cdFx0YXhpc1gucmVuZGVyU3RyaXBMaW5lc09mVGhpY2tuZXNzVHlwZShcInBpeGVsXCIpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVyU3RyaXBMaW5lc09mVGhpY2tuZXNzVHlwZShcInBpeGVsXCIpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cdH1cblx0ZWxzZSB7XG5cdFx0dmFyIGF4aXNYV2lkdGggPSBNYXRoLmNlaWwoYXhpc1guY3JlYXRlTGFiZWxzQW5kQ2FsY3VsYXRlV2lkdGgoKSk7XG5cblx0XHRpZiAoYXhpc1kpIHtcblx0XHRcdGF4aXNZLmxpbmVDb29yZGluYXRlcyA9IHtcblx0XHRcdH07XG5cblx0XHRcdHgxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWFdpZHRoICsgYXhpc1gubWFyZ2luKTtcblx0XHRcdHgyID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDIgPiBheGlzWS5jaGFydC53aWR0aCAtIDEwID8gYXhpc1kuY2hhcnQud2lkdGggLSAxMCA6IGZyZWVTcGFjZS54Mik7XG5cblx0XHRcdGF4aXNZLmxpbmVDb29yZGluYXRlcy54MSA9IHgxO1xuXHRcdFx0YXhpc1kubGluZUNvb3JkaW5hdGVzLngyID0geDI7XG5cdFx0XHRheGlzWS5saW5lQ29vcmRpbmF0ZXMud2lkdGggPSBNYXRoLmFicyh4MiAtIHgxKTtcblx0XHR9XG5cblx0XHRpZiAoYXhpc1kyKSB7XG5cdFx0XHRheGlzWTIubGluZUNvb3JkaW5hdGVzID0ge1xuXHRcdFx0fTtcblx0XHRcdHgxID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDEgKyBheGlzWFdpZHRoICsgYXhpc1gubWFyZ2luKTtcblx0XHRcdHgyID0gTWF0aC5yb3VuZChmcmVlU3BhY2UueDIgPiBheGlzWTIuY2hhcnQud2lkdGggLSAxMCA/IGF4aXNZMi5jaGFydC53aWR0aCAtIDEwIDogZnJlZVNwYWNlLngyKTtcblxuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy54MSA9IHgxO1xuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy54MiA9IHgyO1xuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy53aWR0aCA9IE1hdGguYWJzKHgyIC0geDEpO1xuXHRcdH1cblxuXG5cblx0XHR2YXIgYXhpc1lIZWlnaHQgPSBNYXRoLmNlaWwoYXhpc1kgPyBheGlzWS5jcmVhdGVMYWJlbHNBbmRDYWxjdWxhdGVIZWlnaHQoKSA6IDApO1xuXHRcdHZhciBheGlzWTJIZWlnaHQgPSBNYXRoLmNlaWwoYXhpc1kyID8gYXhpc1kyLmNyZWF0ZUxhYmVsc0FuZENhbGN1bGF0ZUhlaWdodCgpIDogMCk7XG5cblxuXHRcdC8vIFBvc2l0aW9uIGF4aXNZIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSwgTWFyZ2luIGFuZCBpdHMgaGVpZ2h0XG5cdFx0aWYgKGF4aXNZKSB7XG5cdFx0XHQvL3gxID0gZnJlZVNwYWNlLngxICsgYXhpc1hXaWR0aCArIGF4aXNYLm1hcmdpbiArIGF4aXNYLmxpbmVUaGlja25lc3MgLyAyO1xuXHRcdFx0Ly94MiA9IGZyZWVTcGFjZS54MiA+IGF4aXNZLmNoYXJ0LndpZHRoIC0gMTAgPyBheGlzWS5jaGFydC53aWR0aCAtIDEwIDogZnJlZVNwYWNlLngyO1xuXG5cdFx0XHR5MSA9IE1hdGgucm91bmQoZnJlZVNwYWNlLnkyIC0gYXhpc1lIZWlnaHQgLSBheGlzWS5tYXJnaW4pO1xuXHRcdFx0eTIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MiAtIGF4aXNZTWFyZ2luID4gYXhpc1kuY2hhcnQuaGVpZ2h0IC0gMTAgPyBheGlzWS5jaGFydC5oZWlnaHQgLSAxMCA6IGZyZWVTcGFjZS55MiAtIGF4aXNZTWFyZ2luKTtcblxuXHRcdFx0Ly9heGlzWS5saW5lQ29vcmRpbmF0ZXMgPSB7IHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5MSwgd2lkdGg6IE1hdGguYWJzKHgyIC0geDEpIH1cblx0XHRcdGF4aXNZLmxpbmVDb29yZGluYXRlcy55MSA9IHkxO1xuXHRcdFx0YXhpc1kubGluZUNvb3JkaW5hdGVzLnkyID0geTE7XG5cblx0XHRcdGF4aXNZLmJvdW5kaW5nUmVjdCA9IHtcblx0XHRcdFx0eDE6IHgxLCB5MTogeTEsIHgyOiB4MiwgeTI6IHkyLCB3aWR0aDogeDIgLSB4MSwgaGVpZ2h0OiBheGlzWUhlaWdodFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBQb3NpdGlvbiBheGlzWSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIGZyZWUgc3BhY2UsIE1hcmdpbiBhbmQgaXRzIGhlaWdodFxuXHRcdGlmIChheGlzWTIpIHtcblx0XHRcdC8veDEgPSBmcmVlU3BhY2UueDEgKyBheGlzWFdpZHRoICsgYXhpc1gubWFyZ2luICsgYXhpc1gubGluZVRoaWNrbmVzcyAvIDI7XG5cdFx0XHQvL3gyID0gZnJlZVNwYWNlLngyID4gYXhpc1kyLmNoYXJ0LndpZHRoIC0gMTAgPyBheGlzWTIuY2hhcnQud2lkdGggLSAxMCA6IGZyZWVTcGFjZS54MjtcblxuXHRcdFx0eTEgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS55MSArIGF4aXNZMi5tYXJnaW4pO1xuXHRcdFx0eTIgPSAoZnJlZVNwYWNlLnkxICsgYXhpc1kyLm1hcmdpbiArIGF4aXNZMkhlaWdodCk7XG5cblx0XHRcdC8vYXhpc1kyLmxpbmVDb29yZGluYXRlcyA9IHsgeDE6IHgxLCB5MTogeTIsIHgyOiB4MiwgeTI6IHkyLCB3aWR0aDogTWF0aC5hYnMoeDIgLSB4MSkgfVxuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy55MSA9IHkyO1xuXHRcdFx0YXhpc1kyLmxpbmVDb29yZGluYXRlcy55MiA9IHkyO1xuXG5cdFx0XHRheGlzWTIuYm91bmRpbmdSZWN0ID0ge1xuXHRcdFx0XHR4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHdpZHRoOiB4MiAtIHgxLCBoZWlnaHQ6IGF4aXNZMkhlaWdodFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvL2F4aXNZLmN0eC5yZWN0KGF4aXNZLmJvdW5kaW5nUmVjdC54MSwgYXhpc1kuYm91bmRpbmdSZWN0LnkxLCBheGlzWS5ib3VuZGluZ1JlY3Qud2lkdGgsIGF4aXNZLmJvdW5kaW5nUmVjdC5oZWlnaHQpO1xuXHRcdC8vYXhpc1kuY3R4LnN0cm9rZSgpO1xuXG5cdFx0Ly8gUG9zaXRpb24gYXhpc1ggYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBmcmVlIHNwYWNlLCBNYXJnaW4gYW5kIGl0cyBoZWlnaHRcblx0XHR4MSA9IE1hdGgucm91bmQoZnJlZVNwYWNlLngxICsgYXhpc1gubWFyZ2luKTtcblx0XHR5MSA9IE1hdGgucm91bmQoYXhpc1kyID8gYXhpc1kyLmxpbmVDb29yZGluYXRlcy55MiA6IChmcmVlU3BhY2UueTEgPCAxMCA/IDEwIDogZnJlZVNwYWNlLnkxKSk7XG5cdFx0eDIgPSBNYXRoLnJvdW5kKGZyZWVTcGFjZS54MSArIGF4aXNYV2lkdGggKyBheGlzWC5tYXJnaW4pO1xuXHRcdHkyID0gTWF0aC5yb3VuZChheGlzWSA/IGF4aXNZLmxpbmVDb29yZGluYXRlcy55MSA6IChmcmVlU3BhY2UueTIgLSBheGlzWU1hcmdpbiA+IGF4aXNYLmNoYXJ0LmhlaWdodCAtIDEwID8gYXhpc1guY2hhcnQuaGVpZ2h0IC0gMTAgOiBmcmVlU3BhY2UueTIgLSBheGlzWU1hcmdpbikpO1xuXG5cblx0XHRheGlzWC5saW5lQ29vcmRpbmF0ZXMgPSB7XG5cdFx0XHR4MTogeDIsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIGhlaWdodDogTWF0aC5hYnMoeTIgLSB5MSlcblx0XHR9O1xuXG5cdFx0YXhpc1guYm91bmRpbmdSZWN0ID0ge1xuXHRcdFx0eDE6IHgxLCB5MTogeTEsIHgyOiB4MiwgeTI6IHkyLCB3aWR0aDogeDIgLSB4MSwgaGVpZ2h0OiB5MiAtIHkxXG5cdFx0fTtcblxuXHRcdC8vYXhpc1guY3R4LnJlY3QoYXhpc1guYm91bmRpbmdSZWN0LngxLCBheGlzWC5ib3VuZGluZ1JlY3QueTEsIGF4aXNYLmJvdW5kaW5nUmVjdC53aWR0aCwgYXhpc1guYm91bmRpbmdSZWN0LmhlaWdodCk7XG5cdFx0Ly9heGlzWC5jdHguc3Ryb2tlKCk7XG5cblx0XHRheGlzWC5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycygpO1xuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kuY2FsY3VsYXRlVmFsdWVUb1BpeGVsQ29udmVyc2lvblBhcmFtZXRlcnMoKTtcblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLmNhbGN1bGF0ZVZhbHVlVG9QaXhlbENvbnZlcnNpb25QYXJhbWV0ZXJzKCk7XG5cblxuXHRcdC8vY3R4LnNhdmUoKTtcblx0XHQvL2N0eC5yZWN0KGF4aXNZLmJvdW5kaW5nUmVjdC54MSAtIDMwLCBheGlzWS5ib3VuZGluZ1JlY3QueTEsIGF4aXNZLmJvdW5kaW5nUmVjdC53aWR0aCArIDYwLCBheGlzWS5ib3VuZGluZ1JlY3QuaGVpZ2h0KTtcblx0XHQvL2N0eC5jbGlwKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlKCk7XG5cblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckxhYmVsc1RpY2tzQW5kVGl0bGUoKTtcblxuXHRcdC8vY3R4LnJlc3RvcmUoKTtcblxuXHRcdGF4aXNYLnJlbmRlckxhYmVsc1RpY2tzQW5kVGl0bGUoKTtcblxuXHRcdGNoYXJ0LnByZXBhcmVQbG90QXJlYSgpO1xuXHRcdHZhciBwbG90QXJlYSA9IGF4aXNYLmNoYXJ0LnBsb3RBcmVhO1xuXG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIE1hdGguYWJzKHBsb3RBcmVhLngyIC0gcGxvdEFyZWEueDEpLCBNYXRoLmFicyhwbG90QXJlYS55MiAtIHBsb3RBcmVhLnkxKSk7XG5cblx0XHRjdHguY2xpcCgpO1xuXG5cblx0XHQvL05vIG5lZWQgdG8gY2xpcCB0byBwbG90QXJlYSBiZWNhdXNlIHN0cmlwTGluZXMgbmVlZCB0byByZW5kZXIgb24gdG9wIG9mIGdyaWRsaW5lc1xuXHRcdGF4aXNYLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblxuXHRcdGlmIChheGlzWSlcblx0XHRcdGF4aXNZLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUoXCJ2YWx1ZVwiKTtcblxuXHRcdGF4aXNYLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTtcblxuXHRcdGlmIChheGlzWSlcblx0XHRcdGF4aXNZLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTtcblx0XHRpZiAoYXhpc1kyKVxuXHRcdFx0YXhpc1kyLnJlbmRlckludGVybGFjZWRDb2xvcnMoKTtcblxuXHRcdGN0eC5yZXN0b3JlKCk7XG5cblxuXHRcdGF4aXNYLnJlbmRlckdyaWQoKTtcblxuXG5cdFx0aWYgKGF4aXNZKVxuXHRcdFx0YXhpc1kucmVuZGVyR3JpZCgpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJHcmlkKCk7XG5cblxuXHRcdGF4aXNYLnJlbmRlckF4aXNMaW5lKCk7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJBeGlzTGluZSgpO1xuXG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJBeGlzTGluZSgpO1xuXG5cblx0XHRheGlzWC5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cblx0XHRpZiAoYXhpc1kpXG5cdFx0XHRheGlzWS5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cdFx0aWYgKGF4aXNZMilcblx0XHRcdGF4aXNZMi5yZW5kZXJTdHJpcExpbmVzT2ZUaGlja25lc3NUeXBlKFwicGl4ZWxcIik7XG5cdH1cblxufVxuXG5BeGlzLnByb3RvdHlwZS5yZW5kZXJMYWJlbHNUaWNrc0FuZFRpdGxlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBza2lwTGFiZWxzID0gZmFsc2U7XG5cdHZhciB0b3RhbExhYmVsV2lkdGggPSAwO1xuXHR2YXIgdGhyZXNob2xkUmF0aW8gPSAxO1xuXHR2YXIgbGFiZWxDb3VudCA9IDA7XG5cblx0dmFyIGludGVydmFsSW5QaXhlbHMgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIHRoaXMuaW50ZXJ2YWw7XG5cblx0aWYgKHRoaXMubGFiZWxBbmdsZSAhPT0gMCAmJiB0aGlzLmxhYmVsQW5nbGUgIT09IDM2MClcblx0XHR0aHJlc2hvbGRSYXRpbyA9IDEuMjtcblxuXHQvL0Rvbid0IHNraXAgbGFiZWxzIHdoZW4gaW50ZXJ2YWwgaXMgZXhwbGljaXRlbHkgc2V0XG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInRvcFwiKSB7XG5cblx0XHRcdC8vdGhyZXNob2xkUmF0aW8gPSAuOTsvLyBNb3JlIHNwYWNlIGlzIHByZWZlcnJlZCBiZXR3ZWVuIGxhYmVscyB3aGVuIGF4aXMgaXMgaG9yaXpvbnRhbGx5IGFsaWduZWRcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsYWJlbCA9IHRoaXMuX2xhYmVsc1tpXTtcblx0XHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwuc3RyaXBMaW5lKS8vIGRvbid0IGNvbnNpZGVyIHN0cmlwTGluZSdzIGxhYmxlXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIHdpZHRoID0gbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkgKyBsYWJlbC50ZXh0QmxvY2suaGVpZ2h0ICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSk7XG5cblx0XHRcdFx0dG90YWxMYWJlbFdpZHRoICs9IHdpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodG90YWxMYWJlbFdpZHRoID4gdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGggKiB0aHJlc2hvbGRSYXRpbykge1xuXHRcdFx0XHRza2lwTGFiZWxzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsYWJlbCA9IHRoaXMuX2xhYmVsc1tpXTtcblx0XHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwuc3RyaXBMaW5lKS8vIGRvbid0IGNvbnNpZGVyIHN0cmlwTGluZSdzIGxhYmxlXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0dmFyIHdpZHRoID0gbGFiZWwudGV4dEJsb2NrLmhlaWdodCAqIE1hdGguY29zKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpICsgbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSk7XG5cblx0XHRcdFx0dG90YWxMYWJlbFdpZHRoICs9IHdpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodG90YWxMYWJlbFdpZHRoID4gdGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0ICogdGhyZXNob2xkUmF0aW8pIHtcblx0XHRcdFx0c2tpcExhYmVscyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiKSB7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0dmFyIGxhYmVsO1xuXHRcdHZhciB4eTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0bGFiZWwgPSB0aGlzLl9sYWJlbHNbaV07XG5cdFx0XHRpZiAobGFiZWwucG9zaXRpb24gPCB0aGlzLnZpZXdwb3J0TWluaW11bSB8fCBsYWJlbC5wb3NpdGlvbiA+IHRoaXMudmlld3BvcnRNYXhpbXVtKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0eHkgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMobGFiZWwucG9zaXRpb24pO1xuXG5cdFx0XHRpZiAoKHRoaXMudGlja1RoaWNrbmVzcyAmJiAhdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkgfHwgKHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUgJiYgdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZS5fdGhpY2tuZXNzVHlwZSA9PT0gXCJwaXhlbFwiKSkge1xuXG5cdFx0XHRcdGlmICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKSB7XG5cdFx0XHRcdFx0c3RyaXBMaW5lID0gdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZTtcblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jdHgubGluZVdpZHRoID0gdGhpcy50aWNrVGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy50aWNrQ29sb3I7XG5cdFx0XHRcdH1cblxuXG5cdFx0XHRcdHZhciB0aWNrWCA9ICh0aGlzLmN0eC5saW5lV2lkdGggJSAyID09PSAxKSA/ICh4eS54IDw8IDApICsgLjUgOiAoeHkueCA8PCAwKTtcblx0XHRcdFx0dGhpcy5jdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdHRoaXMuY3R4Lm1vdmVUbyh0aWNrWCwgeHkueSA8PCAwKTtcblx0XHRcdFx0dGhpcy5jdHgubGluZVRvKHRpY2tYLCAoeHkueSArIHRoaXMudGlja0xlbmd0aCkgPDwgMCk7XG5cdFx0XHRcdHRoaXMuY3R4LnN0cm9rZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL0Rvbid0IHNraXAgc3RyaXBMaW5lJ3MgbGFiZWxzXG5cdFx0XHRpZiAoc2tpcExhYmVscyAmJiBsYWJlbENvdW50KysgJSAyICE9PSAwICYmICF0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKGxhYmVsLnRleHRCbG9jay5hbmdsZSA9PT0gMCkge1xuXHRcdFx0XHR4eS54IC09IGxhYmVsLnRleHRCbG9jay53aWR0aCAvIDI7XG5cdFx0XHRcdC8veHkueSArPSB0aGlzLnRpY2tMZW5ndGggKyBsYWJlbC50ZXh0QmxvY2suaGVpZ2h0IC8gMjtcblx0XHRcdFx0eHkueSArPSB0aGlzLnRpY2tMZW5ndGggKyBsYWJlbC50ZXh0QmxvY2suZm9udFNpemUgLyAyO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR4eS54IC09ICh0aGlzLmxhYmVsQW5nbGUgPCAwID8gKGxhYmVsLnRleHRCbG9jay53aWR0aCAqIE1hdGguY29zKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpKSA6IDApO1xuXHRcdFx0XHR4eS55ICs9IHRoaXMudGlja0xlbmd0aCArIE1hdGguYWJzKCh0aGlzLmxhYmVsQW5nbGUgPCAwID8gbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkgLSA1IDogNSkpO1xuXHRcdFx0fVxuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnggPSB4eS54O1xuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55O1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnRpdGxlKSB7XG5cblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiB0aGlzLmxpbmVDb29yZGluYXRlcy54MSwvLyBUaGlzIGlzIHJlY2FsY3VsYXRlZCBhZ2FpblxuXHRcdFx0XHR5OiB0aGlzLmJvdW5kaW5nUmVjdC55MiAtIHRoaXMudGl0bGVGb250U2l6ZSAtIDUsLy8gVGhpcyBpcyByZWNhbGN1bGF0ZWQgYWdhaW5cblx0XHRcdFx0bWF4V2lkdGg6IHRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoLFxuXHRcdFx0XHRtYXhIZWlnaHQ6IHRoaXMudGl0bGVGb250U2l6ZSAqIDEuNSxcblx0XHRcdFx0YW5nbGU6IDAsXG5cdFx0XHRcdHRleHQ6IHRoaXMudGl0bGUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdFx0Zm9udFNpemU6IHRoaXMudGl0bGVGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0XHRmb250RmFtaWx5OiB0aGlzLnRpdGxlRm9udEZhbWlseSxcblx0XHRcdFx0Zm9udFdlaWdodDogdGhpcy50aXRsZUZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRcdGZvbnRDb2xvcjogdGhpcy50aXRsZUZvbnRDb2xvcixcblx0XHRcdFx0Zm9udFN0eWxlOiB0aGlzLnRpdGxlRm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0XHR0ZXh0QmFzZWxpbmU6IFwidG9wXCJcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jay5tZWFzdXJlVGV4dCgpO1xuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2sueCA9IHRoaXMubGluZUNvb3JkaW5hdGVzLngxICsgdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGggLyAyIC0gdGhpcy5fdGl0bGVUZXh0QmxvY2sud2lkdGggLyAyO1xuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2sueSA9IHRoaXMuYm91bmRpbmdSZWN0LnkyIC0gdGhpcy5fdGl0bGVUZXh0QmxvY2suaGVpZ2h0IC0gMztcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwidG9wXCIpIHtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHR2YXIgbGFiZWw7XG5cdFx0dmFyIHh5O1xuXHRcdHZhciBzdHJpcExpbmU7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsYWJlbCA9IHRoaXMuX2xhYmVsc1tpXTtcblx0XHRcdGlmIChsYWJlbC5wb3NpdGlvbiA8IHRoaXMudmlld3BvcnRNaW5pbXVtIHx8IGxhYmVsLnBvc2l0aW9uID4gdGhpcy52aWV3cG9ydE1heGltdW0pXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyhsYWJlbC5wb3NpdGlvbik7XG5cblx0XHRcdGlmICgodGhpcy50aWNrVGhpY2tuZXNzICYmICF0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKSB8fCAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSAmJiB0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lLl90aGlja25lc3NUeXBlID09PSBcInBpeGVsXCIpKSB7XG5cblxuXHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkge1xuXHRcdFx0XHRcdHN0cmlwTGluZSA9IHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7XG5cblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5jdHgubGluZVdpZHRoID0gdGhpcy50aWNrVGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy50aWNrQ29sb3I7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdGlja1ggPSAodGhpcy5jdHgubGluZVdpZHRoICUgMiA9PT0gMSkgPyAoeHkueCA8PCAwKSArIC41IDogKHh5LnggPDwgMCk7XG5cdFx0XHRcdHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHR0aGlzLmN0eC5tb3ZlVG8odGlja1gsIHh5LnkgPDwgMCk7XG5cdFx0XHRcdHRoaXMuY3R4LmxpbmVUbyh0aWNrWCwgKHh5LnkgLSB0aGlzLnRpY2tMZW5ndGgpIDw8IDApO1xuXHRcdFx0XHR0aGlzLmN0eC5zdHJva2UoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvL0Rvbid0IHNraXAgc3RyaXBMaW5lJ3MgbGFiZWxzXG5cdFx0XHRpZiAoc2tpcExhYmVscyAmJiBsYWJlbENvdW50KysgJSAyICE9PSAwICYmICF0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKGxhYmVsLnRleHRCbG9jay5hbmdsZSA9PT0gMCkge1xuXHRcdFx0XHR4eS54IC09IGxhYmVsLnRleHRCbG9jay53aWR0aCAvIDI7XG5cdFx0XHRcdHh5LnkgLT0gdGhpcy50aWNrTGVuZ3RoICsgbGFiZWwudGV4dEJsb2NrLmhlaWdodCAvIDI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR4eS54IC09ICh0aGlzLmxhYmVsQW5nbGUgPiAwID8gKGxhYmVsLnRleHRCbG9jay53aWR0aCAqIE1hdGguY29zKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpKSA6IDApO1xuXHRcdFx0XHR4eS55IC09IHRoaXMudGlja0xlbmd0aCArIE1hdGguYWJzKCh0aGlzLmxhYmVsQW5nbGUgPiAwID8gbGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkgKyA1IDogNSkpO1xuXHRcdFx0fVxuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnggPSB4eS54O1xuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55O1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnRpdGxlKSB7XG5cblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiB0aGlzLmxpbmVDb29yZGluYXRlcy54MSwvLyBUaGlzIGlzIHJlY2FsY3VsYXRlZCBhZ2FpblxuXHRcdFx0XHR5OiB0aGlzLmJvdW5kaW5nUmVjdC55MSArIDEsXG5cdFx0XHRcdG1heFdpZHRoOiB0aGlzLmxpbmVDb29yZGluYXRlcy53aWR0aCxcblx0XHRcdFx0bWF4SGVpZ2h0OiB0aGlzLnRpdGxlRm9udFNpemUgKiAxLjUsXG5cdFx0XHRcdGFuZ2xlOiAwLFxuXHRcdFx0XHR0ZXh0OiB0aGlzLnRpdGxlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG5cdFx0XHRcdGZvbnRTaXplOiB0aGlzLnRpdGxlRm9udFNpemUsLy9pbiBwaXhlbHNcblx0XHRcdFx0Zm9udEZhbWlseTogdGhpcy50aXRsZUZvbnRGYW1pbHksXG5cdFx0XHRcdGZvbnRXZWlnaHQ6IHRoaXMudGl0bGVGb250V2VpZ2h0LCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuXHRcdFx0XHRmb250Q29sb3I6IHRoaXMudGl0bGVGb250Q29sb3IsXG5cdFx0XHRcdGZvbnRTdHlsZTogdGhpcy50aXRsZUZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnggPSB0aGlzLmxpbmVDb29yZGluYXRlcy54MSArIHRoaXMubGluZUNvb3JkaW5hdGVzLndpZHRoIC8gMiAtIHRoaXMuX3RpdGxlVGV4dEJsb2NrLndpZHRoIC8gMjtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiKSB7XG5cblxuXHRcdHZhciBsYWJlbDtcblx0XHR2YXIgeHk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxhYmVsID0gdGhpcy5fbGFiZWxzW2ldO1xuXHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwucG9zaXRpb24gPiB0aGlzLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKGxhYmVsLnBvc2l0aW9uKTtcblxuXHRcdFx0aWYgKCh0aGlzLnRpY2tUaGlja25lc3MgJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUpIHx8ICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lICYmIHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUuX3RoaWNrbmVzc1R5cGUgPT09IFwicGl4ZWxcIikpIHtcblxuXHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkge1xuXHRcdFx0XHRcdHN0cmlwTGluZSA9IHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7XG5cblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY3R4LmxpbmVXaWR0aCA9IHRoaXMudGlja1RoaWNrbmVzcztcblx0XHRcdFx0XHR0aGlzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMudGlja0NvbG9yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRpY2tZID0gKHRoaXMuY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpID8gKHh5LnkgPDwgMCkgKyAuNSA6ICh4eS55IDw8IDApO1xuXHRcdFx0XHR0aGlzLmN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0dGhpcy5jdHgubW92ZVRvKHh5LnggPDwgMCwgdGlja1kpO1xuXHRcdFx0XHR0aGlzLmN0eC5saW5lVG8oKHh5LnggLSB0aGlzLnRpY2tMZW5ndGgpIDw8IDAsIHRpY2tZKTtcblx0XHRcdFx0dGhpcy5jdHguc3Ryb2tlKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vRG9uJ3Qgc2tpcCBzdHJpcExpbmUncyBsYWJlbHNcblx0XHRcdGlmIChza2lwTGFiZWxzICYmIGxhYmVsQ291bnQrKyAlIDIgIT09IDAgJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sueCA9IHh5LnggLSAobGFiZWwudGV4dEJsb2NrLndpZHRoICogTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIHRoaXMubGFiZWxBbmdsZSkpIC0gdGhpcy50aWNrTGVuZ3RoIC0gNTtcblxuXHRcdFx0aWYgKHRoaXMubGFiZWxBbmdsZSA9PT0gMCkge1xuXHRcdFx0XHRsYWJlbC50ZXh0QmxvY2sueSA9IHh5Lnk7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55IC0gKGxhYmVsLnRleHRCbG9jay53aWR0aCAqIE1hdGguc2luKE1hdGguUEkgLyAxODAgKiB0aGlzLmxhYmVsQW5nbGUpKTtcblxuXHRcdFx0bGFiZWwudGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy50aXRsZSkge1xuXG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRcdFx0eDogdGhpcy5ib3VuZGluZ1JlY3QueDEgKyAxLFxuXHRcdFx0XHR5OiB0aGlzLmxpbmVDb29yZGluYXRlcy55Mixcblx0XHRcdFx0bWF4V2lkdGg6IHRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodCxcblx0XHRcdFx0bWF4SGVpZ2h0OiB0aGlzLnRpdGxlRm9udFNpemUgKiAxLjUsXG5cdFx0XHRcdGFuZ2xlOiAtOTAsXG5cdFx0XHRcdHRleHQ6IHRoaXMudGl0bGUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogXCJjZW50ZXJcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdFx0Zm9udFNpemU6IHRoaXMudGl0bGVGb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0XHRmb250RmFtaWx5OiB0aGlzLnRpdGxlRm9udEZhbWlseSxcblx0XHRcdFx0Zm9udFdlaWdodDogdGhpcy50aXRsZUZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRcdGZvbnRDb2xvcjogdGhpcy50aXRsZUZvbnRDb2xvcixcblx0XHRcdFx0Zm9udFN0eWxlOiB0aGlzLnRpdGxlRm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0XHR0ZXh0QmFzZWxpbmU6IFwidG9wXCJcblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgc2l6ZSA9IHRoaXMuX3RpdGxlVGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cblx0XHRcdC8vdGhpcy5fdGl0bGVUZXh0QmxvY2sueCAtPSA0O1xuXG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jay55ID0gKHRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodCAvIDIgKyB0aGlzLl90aXRsZVRleHRCbG9jay53aWR0aCAvIDIgKyB0aGlzLmxpbmVDb29yZGluYXRlcy55MSk7XG5cdFx0XHR0aGlzLl90aXRsZVRleHRCbG9jay5yZW5kZXIodHJ1ZSk7XG5cblx0XHRcdC8vaWYgKGlzRGVidWdNb2RlKSB7XG5cdFx0XHQvL1x0d2luZG93LmNvbnNvbGUubG9nKFwidGl0bGVGb250U2l6ZTogXCIgKyB0aGlzLnRpdGxlRm9udFNpemUgKyBcIjsgd2lkdGg6IFwiICsgc2l6ZS53aWR0aCArIFwiOyBoZWlnaHQ6IFwiICsgc2l6ZS5oZWlnaHQpO1xuXHRcdFx0Ly9cdHdpbmRvdy5jb25zb2xlLmxvZyhcInRoaXMuYm91bmRpbmdSZWN0LngxOiBcIiArIHRoaXMuYm91bmRpbmdSZWN0LngxKTtcblxuXHRcdFx0Ly9cdC8vdGhpcy5jdHgucmVjdCh0aGlzLl90aXRsZVRleHRCbG9jay54LCB0aGlzLl90aXRsZVRleHRCbG9jay55LCB0aGlzLl90aXRsZVRleHRCbG9jay5oZWlnaHQsIC10aGlzLl90aXRsZVRleHRCbG9jay53aWR0aCk7XG5cdFx0XHQvL1x0Ly90aGlzLmN0eC5zdHJva2UoKTtcblxuXHRcdFx0Ly99XG5cblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXG5cblx0XHR2YXIgbGFiZWw7XG5cdFx0dmFyIHh5O1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9sYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxhYmVsID0gdGhpcy5fbGFiZWxzW2ldO1xuXHRcdFx0aWYgKGxhYmVsLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgbGFiZWwucG9zaXRpb24gPiB0aGlzLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKGxhYmVsLnBvc2l0aW9uKTtcblxuXHRcdFx0aWYgKCh0aGlzLnRpY2tUaGlja25lc3MgJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUpIHx8ICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lICYmIHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmUuX3RoaWNrbmVzc1R5cGUgPT09IFwicGl4ZWxcIikpIHtcblxuXHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSkge1xuXHRcdFx0XHRcdHN0cmlwTGluZSA9IHRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7XG5cblx0XHRcdFx0XHR0aGlzLmN0eC5saW5lV2lkdGggPSBzdHJpcExpbmUudGhpY2tuZXNzO1xuXHRcdFx0XHRcdHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gc3RyaXBMaW5lLmNvbG9yO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY3R4LmxpbmVXaWR0aCA9IHRoaXMudGlja1RoaWNrbmVzcztcblx0XHRcdFx0XHR0aGlzLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMudGlja0NvbG9yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRpY2tZID0gKHRoaXMuY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpID8gKHh5LnkgPDwgMCkgKyAuNSA6ICh4eS55IDw8IDApO1xuXHRcdFx0XHR0aGlzLmN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0dGhpcy5jdHgubW92ZVRvKHh5LnggPDwgMCwgdGlja1kpO1xuXHRcdFx0XHR0aGlzLmN0eC5saW5lVG8oKHh5LnggKyB0aGlzLnRpY2tMZW5ndGgpIDw8IDAsIHRpY2tZKTtcblx0XHRcdFx0dGhpcy5jdHguc3Ryb2tlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9Eb24ndCBza2lwIHN0cmlwTGluZSdzIGxhYmVsc1xuXHRcdFx0aWYgKHNraXBMYWJlbHMgJiYgbGFiZWxDb3VudCsrICUgMiAhPT0gMCAmJiAhdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSlcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdGxhYmVsLnRleHRCbG9jay54ID0geHkueCArIHRoaXMudGlja0xlbmd0aCArIDU7XG5cdFx0XHQvL2xhYmVsLnRleHRCbG9jay55ID0geHkueSAtIChsYWJlbC50ZXh0QmxvY2sud2lkdGggKiBNYXRoLnNpbihNYXRoLlBJIC8gMTgwICogdGhpcy5sYWJlbEFuZ2xlKSk7XG5cdFx0XHRpZiAodGhpcy5sYWJlbEFuZ2xlID09PSAwKSB7XG5cdFx0XHRcdGxhYmVsLnRleHRCbG9jay55ID0geHkueTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0bGFiZWwudGV4dEJsb2NrLnkgPSB4eS55O1xuXG5cdFx0XHRsYWJlbC50ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnRpdGxlKSB7XG5cblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayh0aGlzLmN0eCwge1xuXHRcdFx0XHR4OiB0aGlzLmJvdW5kaW5nUmVjdC54MiAtIDEsXG5cdFx0XHRcdHk6IHRoaXMubGluZUNvb3JkaW5hdGVzLnkyLFxuXHRcdFx0XHRtYXhXaWR0aDogdGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0LFxuXHRcdFx0XHRtYXhIZWlnaHQ6IHRoaXMudGl0bGVGb250U2l6ZSAqIDEuNSxcblx0XHRcdFx0YW5nbGU6IDkwLFxuXHRcdFx0XHR0ZXh0OiB0aGlzLnRpdGxlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IFwiY2VudGVyXCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG5cdFx0XHRcdGZvbnRTaXplOiB0aGlzLnRpdGxlRm9udFNpemUsLy9pbiBwaXhlbHNcblx0XHRcdFx0Zm9udEZhbWlseTogdGhpcy50aXRsZUZvbnRGYW1pbHksXG5cdFx0XHRcdGZvbnRXZWlnaHQ6IHRoaXMudGl0bGVGb250V2VpZ2h0LCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuXHRcdFx0XHRmb250Q29sb3I6IHRoaXMudGl0bGVGb250Q29sb3IsXG5cdFx0XHRcdGZvbnRTdHlsZTogdGhpcy50aXRsZUZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcblx0XHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5fdGl0bGVUZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnkgPSAodGhpcy5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0IC8gMiAtIHRoaXMuX3RpdGxlVGV4dEJsb2NrLndpZHRoIC8gMiArIHRoaXMubGluZUNvb3JkaW5hdGVzLnkxKTtcblx0XHRcdHRoaXMuX3RpdGxlVGV4dEJsb2NrLnJlbmRlcih0cnVlKTtcblxuXHRcdH1cblx0fVxufVxuXG5BeGlzLnByb3RvdHlwZS5yZW5kZXJJbnRlcmxhY2VkQ29sb3JzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgY3R4ID0gdGhpcy5jaGFydC5wbG90QXJlYS5jdHg7XG5cdC8vcmV0dXJuO1xuXG5cdHZhciBpbnRlcmxhY2VkR3JpZFN0YXJ0UG9pbnQ7XG5cdHZhciBpbnRlcmxhY2VkR3JpZEVuZFBvaW50O1xuXHR2YXIgcGxvdEFyZWFDb29yZGluYXRlcyA9IHRoaXMuY2hhcnQucGxvdEFyZWE7XG5cdHZhciBpID0gMCwgcmVuZGVySW50ZXJsYWNlZEdyaWQgPSB0cnVlO1xuXG5cdGlmICgodGhpcy5fcG9zaXRpb24gPT09IFwiYm90dG9tXCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwidG9wXCIpICYmIHRoaXMuaW50ZXJsYWNlZENvbG9yKSB7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gdGhpcy5pbnRlcmxhY2VkQ29sb3I7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdGlmICh0aGlzLl9sYWJlbHNbaV0uc3RyaXBMaW5lKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKHJlbmRlckludGVybGFjZWRHcmlkKSB7Ly9TbyB0aGF0IHRoZSBpbnRlcmxhY2VkIGNvbG9yIGFsdGVybmF0ZXNcblx0XHRcdFx0aW50ZXJsYWNlZEdyaWRTdGFydFBvaW50ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbik7XG5cblx0XHRcdFx0aWYgKGkgKyAxID49IHRoaXMuX2xhYmVscy5sZW5ndGggLSAxKVxuXHRcdFx0XHRcdGludGVybGFjZWRHcmlkRW5kUG9pbnQgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXModGhpcy52aWV3cG9ydE1heGltdW0pO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0aW50ZXJsYWNlZEdyaWRFbmRQb2ludCA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbaSArIDFdLnBvc2l0aW9uKTtcblxuXHRcdFx0XHRjdHguZmlsbFJlY3QoaW50ZXJsYWNlZEdyaWRTdGFydFBvaW50LngsIHBsb3RBcmVhQ29vcmRpbmF0ZXMueTEsIE1hdGguYWJzKGludGVybGFjZWRHcmlkRW5kUG9pbnQueCAtIGludGVybGFjZWRHcmlkU3RhcnRQb2ludC54KSwgTWF0aC5hYnMocGxvdEFyZWFDb29yZGluYXRlcy55MSAtIHBsb3RBcmVhQ29vcmRpbmF0ZXMueTIpKTtcblx0XHRcdFx0cmVuZGVySW50ZXJsYWNlZEdyaWQgPSBmYWxzZTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHRyZW5kZXJJbnRlcmxhY2VkR3JpZCA9IHRydWU7XG5cblx0XHR9XG5cblx0fSBlbHNlIGlmICgodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpICYmIHRoaXMuaW50ZXJsYWNlZENvbG9yKSB7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gdGhpcy5pbnRlcmxhY2VkQ29sb3I7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ICAgICAgICBpZiAodGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZSlcblx0XHQgICAgICAgICAgICBjb250aW51ZTtcblxuXHRcdFx0aWYgKHJlbmRlckludGVybGFjZWRHcmlkKSB7Ly9TbyB0aGF0IHRoZSBpbnRlcmxhY2VkIGNvbG9yIGFsdGVybmF0ZXNcblxuXHRcdFx0XHRpbnRlcmxhY2VkR3JpZEVuZFBvaW50ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbik7XG5cblx0XHRcdFx0aWYgKGkgKyAxID49IHRoaXMuX2xhYmVscy5sZW5ndGggLSAxKVxuXHRcdFx0XHRcdGludGVybGFjZWRHcmlkU3RhcnRQb2ludCA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLnZpZXdwb3J0TWF4aW11bSk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRpbnRlcmxhY2VkR3JpZFN0YXJ0UG9pbnQgPSB0aGlzLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXModGhpcy5fbGFiZWxzW2kgKyAxXS5wb3NpdGlvbik7XG5cblx0XHRcdFx0Y3R4LmZpbGxSZWN0KHBsb3RBcmVhQ29vcmRpbmF0ZXMueDEsIGludGVybGFjZWRHcmlkU3RhcnRQb2ludC55LCBNYXRoLmFicyhwbG90QXJlYUNvb3JkaW5hdGVzLngxIC0gcGxvdEFyZWFDb29yZGluYXRlcy54MiksIE1hdGguYWJzKGludGVybGFjZWRHcmlkU3RhcnRQb2ludC55IC0gaW50ZXJsYWNlZEdyaWRFbmRQb2ludC55KSk7XG5cdFx0XHRcdHJlbmRlckludGVybGFjZWRHcmlkID0gZmFsc2U7XG5cdFx0XHR9IGVsc2Vcblx0XHRcdFx0cmVuZGVySW50ZXJsYWNlZEdyaWQgPSB0cnVlO1xuXHRcdH1cblx0XHQgICAgLy90aHJvdyBcIjEyM1wiO1xuXHR9XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xufVxuXG4vL1JlbmRlcnMgc3RyaXBMaW5lcyBvZiBnaXZlbiB0aGlja25lc3MgdHlwZS5cbkF4aXMucHJvdG90eXBlLnJlbmRlclN0cmlwTGluZXNPZlRoaWNrbmVzc1R5cGUgPSBmdW5jdGlvbiAodGhpY2tuZXNzVHlwZSkge1xuXG5cdGlmICghKHRoaXMuc3RyaXBMaW5lcyAmJiB0aGlzLnN0cmlwTGluZXMubGVuZ3RoID4gMCkgfHwgIXRoaWNrbmVzc1R5cGUpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0dmFyIGkgPSAwO1xuXHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdHJpcExpbmVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHR2YXIgc3RyaXBMaW5lID0gdGhpcy5zdHJpcExpbmVzW2ldO1xuXG5cdFx0aWYgKHN0cmlwTGluZS5fdGhpY2tuZXNzVHlwZSAhPT0gdGhpY2tuZXNzVHlwZSlcblx0XHRcdGNvbnRpbnVlO1xuXG5cblx0XHQvL1Nob3VsZCBiZSBza2lwcGVkIG9ubHkgaWYgdGhpY2tuZXNzVHlwZSBpcyBcInBpeGVsXCIuIElmIGl0IGlzIFwidmFsdWVcIiB0aGVuIGNsaXBwaW5nIGlzIGF1dG9tYXRpY2FsbHkgYXBwbGllZCBiZWZvcmUgY2FsbGluZy5cblx0XHRpZiAodGhpY2tuZXNzVHlwZSA9PT0gXCJwaXhlbFwiICYmIChzdHJpcExpbmUudmFsdWUgPCB0aGlzLnZpZXdwb3J0TWluaW11bSB8fCBzdHJpcExpbmUudmFsdWUgPiB0aGlzLnZpZXdwb3J0TWF4aW11bSkpXG5cdFx0XHRjb250aW51ZTtcblxuXHRcdGlmIChzdHJpcExpbmUuc2hvd09uVG9wKSB7XG5cdFx0XHR0aGlzLmNoYXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJkYXRhQW5pbWF0aW9uSXRlcmF0aW9uRW5kXCIsIHN0cmlwTGluZS5yZW5kZXIsIHN0cmlwTGluZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHN0cmlwTGluZS5yZW5kZXIoKTtcblx0fVxufTtcblxuQXhpcy5wcm90b3R5cGUucmVuZGVyR3JpZCA9IGZ1bmN0aW9uICgpIHtcblxuXHRpZiAoISh0aGlzLmdyaWRUaGlja25lc3MgJiYgdGhpcy5ncmlkVGhpY2tuZXNzID4gMCkpXG5cdFx0cmV0dXJuO1xuXG5cdC8vdmFyIGN0eCA9IHRoaXMuY2hhcnQucGxvdEFyZWEuY3R4O1xuXHR2YXIgY3R4ID0gdGhpcy5jaGFydC5jdHg7XG5cblx0dmFyIHh5O1xuXHR2YXIgcGxvdEFyZWFDb29yZGluYXRlcyA9IHRoaXMuY2hhcnQucGxvdEFyZWE7XG5cdHZhciBzdHJpcExpbmU7XG5cdHZhciB0ZW1wTGluZVdpZHRoLCB0ZW1wU3Ryb2tlU3R5bGU7XG5cdC8vcmV0dXJuO1xuXG5cdGN0eC5saW5lV2lkdGggPSB0aGlzLmdyaWRUaGlja25lc3M7XG5cdGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuZ3JpZENvbG9yO1xuXG5cdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheSh0aGlzLmdyaWREYXNoVHlwZSwgdGhpcy5ncmlkVGhpY2tuZXNzKSk7XG5cdH1cblxuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX2xhYmVscy5sZW5ndGggJiYgIXRoaXMuX2xhYmVsc1tpXS5zdHJpcExpbmU7IGkrKykge1xuXG5cdFx0XHRpZiAodGhpcy5fbGFiZWxzW2ldLnBvc2l0aW9uIDwgdGhpcy52aWV3cG9ydE1pbmltdW0gfHwgdGhpcy5fbGFiZWxzW2ldLnBvc2l0aW9uID4gdGhpcy52aWV3cG9ydE1heGltdW0pXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cblx0XHRcdHh5ID0gdGhpcy5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbik7XG5cblx0XHRcdHZhciBncmlkWCA9IChjdHgubGluZVdpZHRoICUgMiA9PT0gMSkgPyAoeHkueCA8PCAwKSArIC41IDogKHh5LnggPDwgMCk7XG5cblx0XHRcdGN0eC5tb3ZlVG8oZ3JpZFgsIHBsb3RBcmVhQ29vcmRpbmF0ZXMueTEgPDwgMCk7XG5cdFx0XHRjdHgubGluZVRvKGdyaWRYLCBwbG90QXJlYUNvb3JkaW5hdGVzLnkyIDw8IDApO1xuXG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXG5cdH1cblx0ZWxzZSBpZiAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpIHtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGFiZWxzLmxlbmd0aCAmJiAhdGhpcy5fbGFiZWxzW2ldLnN0cmlwTGluZTsgaSsrKSB7XG5cblx0XHRcdGlmIChpID09PSAwICYmIHRoaXMudHlwZSA9PT0gXCJheGlzWVwiICYmIHRoaXMuY2hhcnQuYXhpc1ggJiYgdGhpcy5jaGFydC5heGlzWC5saW5lVGhpY2tuZXNzKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbiA8IHRoaXMudmlld3BvcnRNaW5pbXVtIHx8IHRoaXMuX2xhYmVsc1tpXS5wb3NpdGlvbiA+IHRoaXMudmlld3BvcnRNYXhpbXVtKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdFx0XHR4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uQXhpcyh0aGlzLl9sYWJlbHNbaV0ucG9zaXRpb24pO1xuXG5cdFx0XHR2YXIgZ3JpZFkgPSAoY3R4LmxpbmVXaWR0aCAlIDIgPT09IDEpID8gKHh5LnkgPDwgMCkgKyAuNSA6ICh4eS55IDw8IDApO1xuXG5cdFx0XHRjdHgubW92ZVRvKHBsb3RBcmVhQ29vcmRpbmF0ZXMueDEgPDwgMCwgZ3JpZFkpO1xuXHRcdFx0Y3R4LmxpbmVUbyhwbG90QXJlYUNvb3JkaW5hdGVzLngyIDw8IDAsIGdyaWRZKTtcblxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdH1cblxuXHR9XG59XG5cbkF4aXMucHJvdG90eXBlLnJlbmRlckF4aXNMaW5lID0gZnVuY3Rpb24gKCkge1xuXHQvL3ZhciBjdHggPSB0aGlzLmNoYXJ0LnBsb3RBcmVhLmN0eDtcblx0dmFyIGN0eCA9IHRoaXMuY2hhcnQuY3R4O1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXHRcdGlmICh0aGlzLmxpbmVUaGlja25lc3MpIHtcblx0XHRcdGN0eC5saW5lV2lkdGggPSB0aGlzLmxpbmVUaGlja25lc3M7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmxpbmVDb2xvciA/IHRoaXMubGluZUNvbG9yIDogXCJibGFja1wiO1xuXG5cdFx0XHRpZiAoY3R4LnNldExpbmVEYXNoKSB7XG5cdFx0XHRcdGN0eC5zZXRMaW5lRGFzaChnZXRMaW5lRGFzaEFycmF5KHRoaXMubGluZURhc2hUeXBlLCB0aGlzLmxpbmVUaGlja25lc3MpKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxpbmVZID0gKHRoaXMubGluZVRoaWNrbmVzcyAlIDIgPT09IDEpID8gKHRoaXMubGluZUNvb3JkaW5hdGVzLnkxIDw8IDApICsgLjUgOiAodGhpcy5saW5lQ29vcmRpbmF0ZXMueTEgPDwgMCk7XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5tb3ZlVG8odGhpcy5saW5lQ29vcmRpbmF0ZXMueDEsIGxpbmVZKTtcblx0XHRcdGN0eC5saW5lVG8odGhpcy5saW5lQ29vcmRpbmF0ZXMueDIsIGxpbmVZKTtcblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHR9XG5cblx0fSBlbHNlIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdGlmICh0aGlzLmxpbmVUaGlja25lc3MpIHtcblx0XHRcdGN0eC5saW5lV2lkdGggPSB0aGlzLmxpbmVUaGlja25lc3M7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmxpbmVDb2xvcjtcblxuXHRcdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0XHRjdHguc2V0TGluZURhc2goZ2V0TGluZURhc2hBcnJheSh0aGlzLmxpbmVEYXNoVHlwZSwgdGhpcy5saW5lVGhpY2tuZXNzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsaW5lWCA9ICh0aGlzLmxpbmVUaGlja25lc3MgJSAyID09PSAxKSA/ICh0aGlzLmxpbmVDb29yZGluYXRlcy54MSA8PCAwKSArIC41IDogKHRoaXMubGluZUNvb3JkaW5hdGVzLngxIDw8IDApO1xuXG5cdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRjdHgubW92ZVRvKGxpbmVYLCB0aGlzLmxpbmVDb29yZGluYXRlcy55MSk7XG5cdFx0XHRjdHgubGluZVRvKGxpbmVYLCB0aGlzLmxpbmVDb29yZGluYXRlcy55Mik7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG59XG5cbkF4aXMucHJvdG90eXBlLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0dmFyIHh5ID0ge1xuXHR9O1xuXHR2YXIgd2lkdGggPSB0aGlzLmxpbmVDb29yZGluYXRlcy53aWR0aDtcblx0dmFyIGhlaWdodCA9IHRoaXMubGluZUNvb3JkaW5hdGVzLmhlaWdodDtcblxuXHRpZiAodGhpcy5fcG9zaXRpb24gPT09IFwiYm90dG9tXCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwidG9wXCIpIHtcblx0XHQvL3ZhciBwaXhlbFBlclVuaXQgPSB3aWR0aCAvIE1hdGguYWJzKHRoaXMudmlld3BvcnRNYXhpbXVtIC0gdGhpcy52aWV3cG9ydE1pbmltdW0pO1xuXHRcdHZhciBwaXhlbFBlclVuaXQgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdDtcblxuXHRcdC8veHkueCA9IHRoaXMubGluZUNvb3JkaW5hdGVzLngxICsgKHBpeGVsUGVyVW5pdCAqICh2YWx1ZSAtIHRoaXMudmlld3BvcnRNaW5pbXVtKSk7XG5cdFx0eHkueCA9IHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgKHBpeGVsUGVyVW5pdCAqICh2YWx1ZSAtIHRoaXMudmlld3BvcnRNaW5pbXVtKSk7XG5cdFx0eHkueSA9IHRoaXMubGluZUNvb3JkaW5hdGVzLnkxO1xuXHR9XG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdC8vdmFyIHBpeGVsUGVyVW5pdCA9IGhlaWdodCAvIE1hdGguYWJzKHRoaXMudmlld3BvcnRNYXhpbXVtIC0gdGhpcy52aWV3cG9ydE1pbmltdW0pO1xuXHRcdHZhciBwaXhlbFBlclVuaXQgPSAtdGhpcy5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQ7XG5cblx0XHQvL3h5LnkgPSB0aGlzLmxpbmVDb29yZGluYXRlcy55MiAtIChwaXhlbFBlclVuaXQgKiAodmFsdWUgLSB0aGlzLnZpZXdwb3J0TWluaW11bSkpO1xuXHRcdHh5LnkgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSAtIChwaXhlbFBlclVuaXQgKiAodmFsdWUgLSB0aGlzLnZpZXdwb3J0TWluaW11bSkpO1xuXHRcdHh5LnggPSB0aGlzLmxpbmVDb29yZGluYXRlcy54Mjtcblx0fVxuXG5cdHJldHVybiB4eTtcbn1cblxuQXhpcy5wcm90b3R5cGUuY29udmVydFBpeGVsVG9WYWx1ZSA9IGZ1bmN0aW9uIChwaXhlbCkge1xuXG5cdGlmICghcGl4ZWwpXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0dmFyIHZhbHVlID0gMDtcblx0dmFyIHAgPSAodGhpcy5fcG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMuX3Bvc2l0aW9uID09PSBcInJpZ2h0XCIpID8gcGl4ZWwueSA6IHBpeGVsLng7XG5cblx0dmFsdWUgPSB0aGlzLmNvbnZlcnNpb25QYXJhbWV0ZXJzLm1pbmltdW0gKyAocCAtIHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlKSAvIHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0O1xuXG5cdHJldHVybiB2YWx1ZTtcbn1cblxuQXhpcy5wcm90b3R5cGUuc2V0Vmlld1BvcnRSYW5nZSA9IGZ1bmN0aW9uICh2aWV3cG9ydE1pbmltdW0sIHZpZXdwb3J0TWF4aW11bSkge1xuXG5cdHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5uZXdWaWV3cG9ydE1pbmltdW0gPSB0aGlzLnZpZXdwb3J0TWluaW11bSA9IE1hdGgubWluKHZpZXdwb3J0TWluaW11bSwgdmlld3BvcnRNYXhpbXVtKTtcblx0dGhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IHRoaXMudmlld3BvcnRNYXhpbXVtID0gTWF0aC5tYXgodmlld3BvcnRNaW5pbXVtLCB2aWV3cG9ydE1heGltdW0pO1xuXG59XG5cbkF4aXMucHJvdG90eXBlLmdldFhWYWx1ZUF0ID0gZnVuY3Rpb24gKHBpeGVsKSB7XG5cdGlmICghcGl4ZWwpXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0dmFyIHh2YWwgPSBudWxsO1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIpIHtcblx0XHR4dmFsID0gKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pIC8gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0ICogKCh0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy55MiAtIHBpeGVsLnkpKSArIHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNaW5pbXVtO1xuXHR9XG5cdGVsc2UgaWYgKHRoaXMuX3Bvc2l0aW9uID09PSBcImJvdHRvbVwiKSB7XG5cdFx0eHZhbCA9ICh0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWF4aW11bSAtIHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNaW5pbXVtKSAvIHRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLndpZHRoICogKHBpeGVsLnggLSB0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy54MSkgKyB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bTtcblx0fVxuXG5cdHJldHVybiB4dmFsO1xufVxuXG5BeGlzLnByb3RvdHlwZS5jYWxjdWxhdGVWYWx1ZVRvUGl4ZWxDb252ZXJzaW9uUGFyYW1ldGVycyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHR0aGlzLnJldmVyc2VkID0gZmFsc2U7XG5cblx0dmFyIGNvbnZlcnNpb25QYXJhbWV0ZXJzID0ge1xuXHRcdHBpeGVsUGVyVW5pdDogbnVsbCwgbWluaW11bTogbnVsbCwgcmVmZXJlbmNlOiBudWxsXG5cdH07XG5cblx0dmFyIHdpZHRoID0gdGhpcy5saW5lQ29vcmRpbmF0ZXMud2lkdGg7XG5cdHZhciBoZWlnaHQgPSB0aGlzLmxpbmVDb29yZGluYXRlcy5oZWlnaHQ7XG5cblx0Y29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSA9IHRoaXMudmlld3BvcnRNaW5pbXVtO1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXHRcdGNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA9ICh0aGlzLnJldmVyc2VkID8gLTEgOiAxKSAqIHdpZHRoIC8gTWF0aC5hYnModGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSk7XG5cdFx0Y29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlID0gKHRoaXMucmV2ZXJzZWQgPyB0aGlzLmxpbmVDb29yZGluYXRlcy54MiA6IHRoaXMubGluZUNvb3JkaW5hdGVzLngxKTtcblx0fVxuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5fcG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuXHRcdGNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA9ICh0aGlzLnJldmVyc2VkID8gMSA6IC0xKSAqIGhlaWdodCAvIE1hdGguYWJzKHRoaXMudmlld3BvcnRNYXhpbXVtIC0gdGhpcy52aWV3cG9ydE1pbmltdW0pO1xuXHRcdGNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSA9ICh0aGlzLnJldmVyc2VkID8gdGhpcy5saW5lQ29vcmRpbmF0ZXMueTEgOiB0aGlzLmxpbmVDb29yZGluYXRlcy55Mik7XG5cdH1cblxuXG5cdHRoaXMuY29udmVyc2lvblBhcmFtZXRlcnMgPSBjb252ZXJzaW9uUGFyYW1ldGVycztcbn1cblxuQXhpcy5wcm90b3R5cGUuY2FsY3VsYXRlQXhpc1BhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGZyZWVTcGFjZSA9IHRoaXMuY2hhcnQubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcblx0dmFyIGF2YWlsYWJsZVdpZHRoID0gMDtcblx0dmFyIGF2YWlsYWJsZUhlaWdodCA9IDA7XG5cdHZhciBpc0xlc3NUaGFuVHdvRGF0YVBvaW50cyA9IGZhbHNlO1xuXG5cdGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gXCJib3R0b21cIiB8fCB0aGlzLl9wb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuXHRcdHRoaXMubWF4V2lkdGggPSBmcmVlU3BhY2Uud2lkdGg7XG5cdFx0dGhpcy5tYXhIZWlnaHQgPSBmcmVlU3BhY2UuaGVpZ2h0O1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMubWF4V2lkdGggPSBmcmVlU3BhY2UuaGVpZ2h0O1xuXHRcdHRoaXMubWF4SGVpZ2h0ID0gZnJlZVNwYWNlLndpZHRoO1xuXHR9XG5cblx0dmFyIG5vVGlja3MgPSB0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiA/ICh0aGlzLm1heFdpZHRoIDwgNTAwID8gOCA6IE1hdGgubWF4KDYsIE1hdGguZmxvb3IodGhpcy5tYXhXaWR0aCAvIDYyKSkpIDogTWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLm1heFdpZHRoIC8gNDApLCAyKTtcblx0dmFyIG1pbiwgbWF4O1xuXHR2YXIgbWluRGlmZjtcblx0dmFyIHJhbmdlO1xuXHR2YXIgcmFuZ2VQYWRkaW5nID0gMDtcblxuXG5cdGlmICh0aGlzLnZpZXdwb3J0TWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkpXG5cdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSB0aGlzLm1pbmltdW07XG5cblx0aWYgKHRoaXMudmlld3BvcnRNYXhpbXVtID09PSBudWxsIHx8IGlzTmFOKHRoaXMudmlld3BvcnRNYXhpbXVtKSlcblx0XHR0aGlzLnZpZXdwb3J0TWF4aW11bSA9IHRoaXMubWF4aW11bTtcblxuXHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpIHtcblx0XHRtaW4gPSAodGhpcy52aWV3cG9ydE1pbmltdW0gIT09IG51bGwpID8gdGhpcy52aWV3cG9ydE1pbmltdW0gOiB0aGlzLmRhdGFJbmZvLnZpZXdQb3J0TWluO1xuXHRcdG1heCA9ICh0aGlzLnZpZXdwb3J0TWF4aW11bSAhPT0gbnVsbCkgPyB0aGlzLnZpZXdwb3J0TWF4aW11bSA6IHRoaXMuZGF0YUluZm8udmlld1BvcnRNYXg7XG5cblx0XHRpZiAobWF4IC0gbWluID09PSAwKSB7XG5cdFx0XHRyYW5nZVBhZGRpbmcgPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiID8gLjQgOiB0aGlzLl9vcHRpb25zLmludGVydmFsO1xuXG5cdFx0XHRtYXggKz0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0bWluIC09IHJhbmdlUGFkZGluZztcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kYXRhSW5mby5taW5EaWZmICE9PSBJbmZpbml0eSlcblx0XHRcdG1pbkRpZmYgPSB0aGlzLmRhdGFJbmZvLm1pbkRpZmY7XG5cdFx0ZWxzZSBpZiAobWF4IC0gbWluID4gMSkge1xuXHRcdFx0bWluRGlmZiA9IE1hdGguYWJzKG1heCAtIG1pbikgKiAuNTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRtaW5EaWZmID0gMTtcblxuXHRcdFx0aWYgKHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIilcblx0XHRcdFx0aXNMZXNzVGhhblR3b0RhdGFQb2ludHMgPSB0cnVlO1xuXHRcdH1cblxuXHR9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gXCJheGlzWVwiKSB7XG5cblx0XHQvL21pbiA9IHR5cGVvZiAodGhpcy5fb3B0aW9ucy52aWV3cG9ydE1pbmltdW0pID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtID09PSBudWxsID8gdGhpcy5kYXRhSW5mby52aWV3UG9ydE1pbiA6IHRoaXMuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtO1xuXHRcdC8vbWF4ID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLnZpZXdwb3J0TWF4aW11bSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5fb3B0aW9ucy52aWV3cG9ydE1heGltdW0gPT09IG51bGwgPyB0aGlzLmRhdGFJbmZvLnZpZXdQb3J0TWF4IDogdGhpcy5fb3B0aW9ucy52aWV3cG9ydE1heGltdW07XG5cdFx0bWluID0gKHRoaXMudmlld3BvcnRNaW5pbXVtICE9PSBudWxsKSA/IHRoaXMudmlld3BvcnRNaW5pbXVtIDogdGhpcy5kYXRhSW5mby52aWV3UG9ydE1pbjtcblx0XHRtYXggPSAodGhpcy52aWV3cG9ydE1heGltdW0gIT09IG51bGwpID8gdGhpcy52aWV3cG9ydE1heGltdW0gOiB0aGlzLmRhdGFJbmZvLnZpZXdQb3J0TWF4O1xuXG5cdFx0aWYgKCFpc0Zpbml0ZShtaW4pICYmICFpc0Zpbml0ZShtYXgpKSB7XG5cdFx0XHRtYXggPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiID8gLUluZmluaXR5IDogdGhpcy5fb3B0aW9ucy5pbnRlcnZhbDtcblx0XHRcdG1pbiA9IDA7XG5cdFx0fSBlbHNlIGlmICghaXNGaW5pdGUobWluKSkge1xuXHRcdFx0bWluID0gbWF4O1xuXHRcdH0gZWxzZSBpZiAoIWlzRmluaXRlKG1heCkpIHtcblx0XHRcdG1heCA9IG1pbjtcblx0XHR9XG5cblx0XHRcdGlmIChtaW4gPT09IDAgJiYgbWF4ID09PSAwKSB7Ly8gV2hlbiBhbGwgZGF0YVBvaW50cyBhcmUgemVyb1xuXHRcdFx0XHRtYXggKz0gOTtcblx0XHRcdFx0bWluID0gMDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG1heCAtIG1pbiA9PT0gMCkgey8vIFdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBkYXRhUG9pbnQgb3Igd2hlbiBhbGwgZGF0YVBvaW50cyBoYXZlIHNhbWUgWSBWYWx1ZVxuXHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXgpICogLjAxKSwgNSk7XG5cdFx0XHRcdG1heCArPSByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdG1pbiAtPSByYW5nZVBhZGRpbmc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChtaW4gPiBtYXgpIHtcblx0XHRcdFx0cmFuZ2VQYWRkaW5nID0gTWF0aC5taW4oTWF0aC5hYnMoTWF0aC5hYnMobWF4IC0gbWluKSAqIC4wMSksIDUpO1xuXG5cdFx0XHRcdGlmIChtYXggPj0gMClcblx0XHRcdFx0XHRtaW4gPSBtYXggLSByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRtYXggPSBtaW4gKyByYW5nZVBhZGRpbmc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblxuXHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXggLSBtaW4pICogLjAxKSwgLjA1KTtcblxuXHRcdFx0XHRpZiAobWF4ICE9PSAwKVxuXHRcdFx0XHRcdG1heCArPSByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdGlmIChtaW4gIT09IDApXG5cdFx0XHRcdFx0bWluIC09IHJhbmdlUGFkZGluZztcblx0XHRcdH1cblxuXHRcdGlmICh0aGlzLmRhdGFJbmZvLm1pbkRpZmYgIT09IEluZmluaXR5KVxuXHRcdFx0bWluRGlmZiA9IHRoaXMuZGF0YUluZm8ubWluRGlmZjtcblx0XHRlbHNlIGlmIChtYXggLSBtaW4gPiAxKSB7XG5cdFx0XHRtaW5EaWZmID0gTWF0aC5hYnMobWF4IC0gbWluKSAqIC41O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdG1pbkRpZmYgPSAxO1xuXHRcdH1cblxuXG5cdFx0Ly9BcHBseSBpbmNsdWRlWmVyb1xuXHRcdGlmICh0aGlzLmluY2x1ZGVaZXJvICYmICh0aGlzLnZpZXdwb3J0TWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkpKSB7XG5cdFx0XHRpZiAobWluID4gMClcblx0XHRcdFx0bWluID0gMDtcblx0XHR9XG5cdFx0aWYgKHRoaXMuaW5jbHVkZVplcm8gJiYgKHRoaXMudmlld3BvcnRNYXhpbXVtID09PSBudWxsIHx8IGlzTmFOKHRoaXMudmlld3BvcnRNYXhpbXVtKSkpIHtcblx0XHRcdGlmIChtYXggPCAwKVxuXHRcdFx0XHRtYXggPSAwO1xuXHRcdH1cblx0fVxuXG5cdHJhbmdlID0gKGlzTmFOKHRoaXMudmlld3BvcnRNYXhpbXVtKSB8fCB0aGlzLnZpZXdwb3J0TWF4aW11bSA9PT0gbnVsbCA/IG1heCA6IHRoaXMudmlld3BvcnRNYXhpbXVtKSAtIChpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkgfHwgdGhpcy52aWV3cG9ydE1pbmltdW0gPT09IG51bGwgPyBtaW4gOiB0aGlzLnZpZXdwb3J0TWluaW11bSk7XG5cblx0aWYgKHRoaXMudHlwZSA9PT0gXCJheGlzWFwiICYmIHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xuXG5cdFx0aWYgKCF0aGlzLmludGVydmFsVHlwZSkge1xuXG5cdFx0XHRpZiAocmFuZ2UgLyAoMSAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaWxsaXNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvICgxICogMikgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbGxpc2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKDEgKiA1KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSA1O1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDEwKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxMDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbGxpc2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKDEgKiAyMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjA7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaWxsaXNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvICgxICogNTApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDUwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDEwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDIwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDI1MCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjUwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDMwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMzAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDQwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNDAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoMSAqIDUwMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNTAwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWlsbGlzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnNlY29uZER1cmF0aW9uICogMSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcInNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuc2Vjb25kRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwic2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5zZWNvbmREdXJhdGlvbiAqIDUpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDU7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnNlY29uZER1cmF0aW9uICogMTApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDEwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwic2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5zZWNvbmREdXJhdGlvbiAqIDE1KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxNTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcInNlY29uZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuc2Vjb25kRHVyYXRpb24gKiAyMCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjA7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJzZWNvbmRcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnNlY29uZER1cmF0aW9uICogMzApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDMwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwic2Vjb25kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5taW51dGVEdXJhdGlvbiAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaW51dGVcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1pbnV0ZUR1cmF0aW9uICogMikgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMjtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbnV0ZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMubWludXRlRHVyYXRpb24gKiA1KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSA1O1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWludXRlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5taW51dGVEdXJhdGlvbiAqIDEwKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxMDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbnV0ZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMubWludXRlRHVyYXRpb24gKiAxNSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTU7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJtaW51dGVcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1pbnV0ZUR1cmF0aW9uICogMjApIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDIwO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibWludXRlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5taW51dGVEdXJhdGlvbiAqIDMwKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAzMDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIm1pbnV0ZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuaG91ckR1cmF0aW9uICogMSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcImhvdXJcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLmhvdXJEdXJhdGlvbiAqIDIpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDI7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJob3VyXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5ob3VyRHVyYXRpb24gKiAzKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAzO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwiaG91clwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuaG91ckR1cmF0aW9uICogNikgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNjtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcImhvdXJcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLmRheUR1cmF0aW9uICogMSkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMTtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcImRheVwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMuZGF5RHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwiZGF5XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy5kYXlEdXJhdGlvbiAqIDQpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDQ7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJkYXlcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLndlZWtEdXJhdGlvbiAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJ3ZWVrXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy53ZWVrRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwid2Vla1wiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMud2Vla0R1cmF0aW9uICogMykgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gMztcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcIndlZWtcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiAxKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAxO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiAzKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAzO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLm1vbnRoRHVyYXRpb24gKiA2KSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSA2O1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibW9udGhcIjtcblx0XHRcdH0gZWxzZSBpZiAocmFuZ2UgLyAoY29uc3RhbnRzLnllYXJEdXJhdGlvbiAqIDEpIDw9IG5vVGlja3MpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJ5ZWFyXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHJhbmdlIC8gKGNvbnN0YW50cy55ZWFyRHVyYXRpb24gKiAyKSA8PSBub1RpY2tzKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSAyO1xuXHRcdFx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwieWVhclwiO1xuXHRcdFx0fSBlbHNlIGlmIChyYW5nZSAvIChjb25zdGFudHMueWVhckR1cmF0aW9uICogNCkgPD0gbm9UaWNrcykge1xuXHRcdFx0XHR0aGlzLmludGVydmFsID0gNDtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbFR5cGUgPSBcInllYXJcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWwgPSBNYXRoLmZsb29yKEF4aXMuZ2V0TmljZU51bWJlcihyYW5nZSAvIChub1RpY2tzIC0gMSksIHRydWUpIC8gY29uc3RhbnRzLnllYXJEdXJhdGlvbik7XG5cdFx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJ5ZWFyXCI7XG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAodGhpcy52aWV3cG9ydE1pbmltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy52aWV3cG9ydE1pbmltdW0pKVxuXHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSBtaW4gLSBtaW5EaWZmIC8gMjtcblxuXHRcdGlmICh0aGlzLnZpZXdwb3J0TWF4aW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWF4aW11bSkpXG5cdFx0XHR0aGlzLnZpZXdwb3J0TWF4aW11bSA9IG1heCArIG1pbkRpZmYgLyAyO1xuXG5cblx0XHRpZiAoIXRoaXMudmFsdWVGb3JtYXRTdHJpbmcpIHtcblx0XHRcdGlmIChpc0xlc3NUaGFuVHdvRGF0YVBvaW50cykge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJNTU0gREQgWVlZWSBISDptbVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJ5ZWFyXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiWVlZWVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJtb250aFwiKSB7XG5cdFx0XHRcdHRoaXMudmFsdWVGb3JtYXRTdHJpbmcgPSBcIk1NTSBZWVlZXCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIndlZWtcIikge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJNTU0gREQgWVlZWVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJkYXlcIikge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJNTU0gREQgWVlZWVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJob3VyXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiaGg6bW0gVFRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwibWludXRlXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiaGg6bW0gVFRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwic2Vjb25kXCIpIHtcblx0XHRcdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiaGg6bW06c3MgVFRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwibWlsbGlzZWNvbmRcIikge1xuXHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nID0gXCJmZmYnbXMnXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmludGVydmFsVHlwZSA9IFwibnVtYmVyXCI7XG5cblx0XHRyYW5nZSA9IEF4aXMuZ2V0TmljZU51bWJlcihyYW5nZSwgZmFsc2UpO1xuXG5cdFx0aWYgKHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5pbnRlcnZhbClcblx0XHRcdHRoaXMuaW50ZXJ2YWwgPSB0aGlzLl9vcHRpb25zLmludGVydmFsO1xuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5pbnRlcnZhbCA9IEF4aXMuZ2V0TmljZU51bWJlcihyYW5nZSAvIChub1RpY2tzIC0gMSksIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnZpZXdwb3J0TWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLnZpZXdwb3J0TWluaW11bSkpIHtcblx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIilcblx0XHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSBtaW4gLSBtaW5EaWZmIC8gMjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gPSBNYXRoLmZsb29yKG1pbiAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52aWV3cG9ydE1heGltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy52aWV3cG9ydE1heGltdW0pKSB7XG5cdFx0XHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpXG5cdFx0XHRcdHRoaXMudmlld3BvcnRNYXhpbXVtID0gbWF4ICsgbWluRGlmZiAvIDI7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMudmlld3BvcnRNYXhpbXVtID0gTWF0aC5jZWlsKG1heCAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52aWV3cG9ydE1heGltdW0gPT09IDAgJiYgdGhpcy52aWV3cG9ydE1pbmltdW0gPT09IDApIHtcblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMudmlld3BvcnRNaW5pbXVtID09PSAwKSB7XG5cdFx0XHRcdHRoaXMudmlld3BvcnRNYXhpbXVtICs9IDEwO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAodGhpcy5fb3B0aW9ucy52aWV3cG9ydE1heGltdW0gPT09IDApIHtcblx0XHRcdFx0dGhpcy52aWV3cG9ydE1pbmltdW0gLT0gMTA7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9vcHRpb25zICYmIHR5cGVvZiAodGhpcy5fb3B0aW9ucy5pbnRlcnZhbCkgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0dGhpcy5pbnRlcnZhbCA9IEF4aXMuZ2V0TmljZU51bWJlcigodGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSkgLyAobm9UaWNrcyAtIDEpLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvL0NhbGN1bGF0ZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgdXNlclxuXHRpZiAodGhpcy5taW5pbXVtID09PSBudWxsIHx8IHRoaXMubWF4aW11bSA9PT0gbnVsbCkge1xuXHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIikge1xuXHRcdFx0bWluID0gKHRoaXMubWluaW11bSAhPT0gbnVsbCkgPyB0aGlzLm1pbmltdW0gOiB0aGlzLmRhdGFJbmZvLm1pbjtcblx0XHRcdG1heCA9ICh0aGlzLm1heGltdW0gIT09IG51bGwpID8gdGhpcy5tYXhpbXVtIDogdGhpcy5kYXRhSW5mby5tYXg7XG5cblx0XHRcdGlmIChtYXggLSBtaW4gPT09IDApIHtcblx0XHRcdFx0cmFuZ2VQYWRkaW5nID0gdHlwZW9mICh0aGlzLl9vcHRpb25zLmludGVydmFsKSA9PT0gXCJ1bmRlZmluZWRcIiA/IC40IDogdGhpcy5fb3B0aW9ucy5pbnRlcnZhbDtcblxuXHRcdFx0XHRtYXggKz0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHRtaW4gLT0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5kYXRhSW5mby5taW5EaWZmICE9PSBJbmZpbml0eSlcblx0XHRcdFx0bWluRGlmZiA9IHRoaXMuZGF0YUluZm8ubWluRGlmZjtcblx0XHRcdGVsc2UgaWYgKG1heCAtIG1pbiA+IDEpIHtcblx0XHRcdFx0bWluRGlmZiA9IE1hdGguYWJzKG1heCAtIG1pbikgKiAuNTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtaW5EaWZmID0gMTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBcImF4aXNZXCIpIHtcblxuXHRcdFx0bWluID0gKHRoaXMubWluaW11bSAhPT0gbnVsbCkgPyB0aGlzLm1pbmltdW0gOiB0aGlzLmRhdGFJbmZvLm1pbjtcblx0XHRcdG1heCA9ICh0aGlzLm1heGltdW0gIT09IG51bGwpID8gdGhpcy5tYXhpbXVtIDogdGhpcy5kYXRhSW5mby5tYXg7XG5cblx0XHRcdGlmICghaXNGaW5pdGUobWluKSAmJiAhaXNGaW5pdGUobWF4KSkge1xuXHRcdFx0XHRtYXggPSB0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW50ZXJ2YWwpID09PSBcInVuZGVmaW5lZFwiID8gLUluZmluaXR5IDogdGhpcy5fb3B0aW9ucy5pbnRlcnZhbDtcblx0XHRcdFx0bWluID0gMDtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0aWYgKG1pbiA9PT0gMCAmJiBtYXggPT09IDApIHsvLyBXaGVuIGFsbCBkYXRhUG9pbnRzIGFyZSB6ZXJvXG5cdFx0XHRcdFx0bWF4ICs9IDk7XG5cdFx0XHRcdFx0bWluID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChtYXggLSBtaW4gPT09IDApIHsvLyBXaGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgZGF0YVBvaW50IG9yIHdoZW4gYWxsIGRhdGFQb2ludHMgaGF2ZSBzYW1lIFkgVmFsdWVcblx0XHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXgpICogLjAxKSwgNSk7XG5cdFx0XHRcdFx0bWF4ICs9IHJhbmdlUGFkZGluZztcblx0XHRcdFx0XHRtaW4gLT0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKG1pbiA+IG1heCkge1xuXHRcdFx0XHRcdHJhbmdlUGFkZGluZyA9IE1hdGgubWluKE1hdGguYWJzKE1hdGguYWJzKG1heCAtIG1pbikgKiAuMDEpLCA1KTtcblxuXHRcdFx0XHRcdGlmIChtYXggPj0gMClcblx0XHRcdFx0XHRcdG1pbiA9IG1heCAtIHJhbmdlUGFkZGluZztcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRtYXggPSBtaW4gKyByYW5nZVBhZGRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cblx0XHRcdFx0XHRyYW5nZVBhZGRpbmcgPSBNYXRoLm1pbihNYXRoLmFicyhNYXRoLmFicyhtYXggLSBtaW4pICogLjAxKSwgLjA1KTtcblxuXHRcdFx0XHRcdGlmIChtYXggIT09IDApXG5cdFx0XHRcdFx0XHRtYXggKz0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHRcdGlmIChtaW4gIT09IDApXG5cdFx0XHRcdFx0XHRtaW4gLT0gcmFuZ2VQYWRkaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRhdGFJbmZvLm1pbkRpZmYgIT09IEluZmluaXR5KVxuXHRcdFx0XHRtaW5EaWZmID0gdGhpcy5kYXRhSW5mby5taW5EaWZmO1xuXHRcdFx0ZWxzZSBpZiAobWF4IC0gbWluID4gMSkge1xuXHRcdFx0XHRtaW5EaWZmID0gTWF0aC5hYnMobWF4IC0gbWluKSAqIC41O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdG1pbkRpZmYgPSAxO1xuXHRcdFx0fVxuXG5cblx0XHRcdC8vQXBwbHkgaW5jbHVkZVplcm9cblx0XHRcdGlmICh0aGlzLmluY2x1ZGVaZXJvICYmICh0aGlzLm1pbmltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy5taW5pbXVtKSkpIHtcblx0XHRcdFx0aWYgKG1pbiA+IDApXG5cdFx0XHRcdFx0bWluID0gMDtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmluY2x1ZGVaZXJvICYmICh0aGlzLm1heGltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy5tYXhpbXVtKSkpIHtcblx0XHRcdFx0aWYgKG1heCA8IDApXG5cdFx0XHRcdFx0bWF4ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyYW5nZSA9IG1heCAtIG1pbjtcblxuXHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpIHtcblxuXHRcdFx0aWYgKHRoaXMubWluaW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLm1pbmltdW0pKVxuXHRcdFx0XHR0aGlzLm1pbmltdW0gPSBtaW4gLSBtaW5EaWZmIC8gMjtcblxuXHRcdFx0aWYgKHRoaXMubWF4aW11bSA9PT0gbnVsbCB8fCBpc05hTih0aGlzLm1heGltdW0pKVxuXHRcdFx0XHR0aGlzLm1heGltdW0gPSBtYXggKyBtaW5EaWZmIC8gMjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuaW50ZXJ2YWxUeXBlID0gXCJudW1iZXJcIjtcblxuXHRcdFx0aWYgKHRoaXMubWluaW11bSA9PT0gbnVsbCkge1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpXG5cdFx0XHRcdFx0dGhpcy5taW5pbXVtID0gbWluIC0gbWluRGlmZiAvIDI7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5taW5pbXVtID0gTWF0aC5mbG9vcihtaW4gLyB0aGlzLmludGVydmFsKSAqIHRoaXMuaW50ZXJ2YWw7XG5cblx0XHRcdFx0dGhpcy5taW5pbXVtID0gTWF0aC5taW4odGhpcy5taW5pbXVtLCB0aGlzLnNlc3Npb25WYXJpYWJsZXMudmlld3BvcnRNaW5pbXVtID09PSBudWxsIHx8IGlzTmFOKHRoaXMuc2Vzc2lvblZhcmlhYmxlcy52aWV3cG9ydE1pbmltdW0pID8gSW5maW5pdHkgOiB0aGlzLnNlc3Npb25WYXJpYWJsZXMudmlld3BvcnRNaW5pbXVtKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMubWF4aW11bSA9PT0gbnVsbCkge1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImF4aXNYXCIpXG5cdFx0XHRcdFx0dGhpcy5tYXhpbXVtID0gbWF4ICsgbWluRGlmZiAvIDI7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5tYXhpbXVtID0gTWF0aC5jZWlsKG1heCAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblxuXHRcdFx0XHR0aGlzLm1heGltdW0gPSBNYXRoLm1heCh0aGlzLm1heGltdW0sIHRoaXMuc2Vzc2lvblZhcmlhYmxlcy52aWV3cG9ydE1heGltdW0gPT09IG51bGwgfHwgaXNOYU4odGhpcy5zZXNzaW9uVmFyaWFibGVzLnZpZXdwb3J0TWF4aW11bSkgPyAtSW5maW5pdHkgOiB0aGlzLnNlc3Npb25WYXJpYWJsZXMudmlld3BvcnRNYXhpbXVtKTtcblx0XHRcdH1cblxuXHRcdC8vdmFyIG5mcmFjID0gTWF0aC5tYXgoLU1hdGguZmxvb3IoTWF0aC5sb2coZCkvTWF0aC5MTjEwKSwgMCk7IC8vbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHRvIHNob3dcblxuXG5cdFx0aWYgKHRoaXMubWF4aW11bSA9PT0gMCAmJiB0aGlzLm1pbmltdW0gPT09IDApIHtcblxuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMubWluaW11bSA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLm1heGltdW0gKz0gMTA7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9vcHRpb25zLm1heGltdW0gPT09IDApIHtcblx0XHRcdFx0dGhpcy5taW5pbXVtIC09IDEwO1xuXHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHR0aGlzLnZpZXdwb3J0TWluaW11bSA9IE1hdGgubWF4KHRoaXMudmlld3BvcnRNaW5pbXVtLCB0aGlzLm1pbmltdW0pO1xuXHR0aGlzLnZpZXdwb3J0TWF4aW11bSA9IE1hdGgubWluKHRoaXMudmlld3BvcnRNYXhpbXVtLCB0aGlzLm1heGltdW0pO1xuXG5cdGlmICh0aGlzLnR5cGUgPT09IFwiYXhpc1hcIiAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpXG5cdFx0dGhpcy5pbnRlcnZhbFN0YXJ0UG9zaXRpb24gPSB0aGlzLmdldExhYmVsU3RhcnRQb2ludChuZXcgRGF0ZSh0aGlzLnZpZXdwb3J0TWluaW11bSksIHRoaXMuaW50ZXJ2YWxUeXBlLCB0aGlzLmludGVydmFsKTtcblx0ZWxzZVxuXHRcdHRoaXMuaW50ZXJ2YWxTdGFydFBvc2l0aW9uID0gTWF0aC5mbG9vcigodGhpcy52aWV3cG9ydE1pbmltdW0gKyAodGhpcy5pbnRlcnZhbCAqIC4yKSkgLyB0aGlzLmludGVydmFsKSAqIHRoaXMuaW50ZXJ2YWw7XG5cblx0Ly9TZXQgdmFsdWVGb3JtYXRTdHJpbmdcblx0aWYgKCF0aGlzLnZhbHVlRm9ybWF0U3RyaW5nKSB7XG5cdFx0dGhpcy52YWx1ZUZvcm1hdFN0cmluZyA9IFwiIywjIzAuIyNcIjtcblxuXHRcdHJhbmdlID0gTWF0aC5hYnModGhpcy52aWV3cG9ydE1heGltdW0gLSB0aGlzLnZpZXdwb3J0TWluaW11bSk7XG5cblx0XHRpZiAocmFuZ2UgPCAxKSB7XG5cdFx0XHR2YXIgbnVtYmVyT2ZEZWNpbWFscyA9IE1hdGguZmxvb3IoTWF0aC5hYnMoTWF0aC5sb2cocmFuZ2UpIC8gTWF0aC5MTjEwKSkgKyAyO1xuXG5cdFx0XHRpZiAoaXNOYU4obnVtYmVyT2ZEZWNpbWFscykgfHwgIWlzRmluaXRlKG51bWJlck9mRGVjaW1hbHMpKVxuXHRcdFx0XHRudW1iZXJPZkRlY2ltYWxzID0gMjtcblxuXHRcdFx0aWYgKG51bWJlck9mRGVjaW1hbHMgPiAyKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZEZWNpbWFscyAtIDI7IGkrKylcblx0XHRcdFx0XHR0aGlzLnZhbHVlRm9ybWF0U3RyaW5nICs9IFwiI1wiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHR9XG5cblx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgd2luZG93LmNvbnNvbGUpIHtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKHRoaXMudHlwZSArIFwiOiBNaW4gPSBcIiArIHRoaXMudmlld3BvcnRNaW5pbXVtKTtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKHRoaXMudHlwZSArIFwiOiBNYXggPSBcIiArIHRoaXMudmlld3BvcnRNYXhpbXVtKTtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKHRoaXMudHlwZSArIFwiOiBJbnRlcnZhbCA9IFwiICsgdGhpcy5pbnRlcnZhbCk7XG5cdC8vfVxufVxuXG5BeGlzLmdldE5pY2VOdW1iZXIgPSBmdW5jdGlvbiAoeCwgcm91bmQpIHtcblxuXHR2YXIgZXhwID0gTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCk7XG5cdHZhciBmID0geCAvIE1hdGgucG93KDEwLCBleHApO1xuXHR2YXIgbmY7XG5cblx0aWYgKHJvdW5kKSB7XG5cdFx0aWYgKGYgPCAxLjUpXG5cdFx0XHRuZiA9IDE7XG5cdFx0ZWxzZSBpZiAoZiA8IDMpXG5cdFx0XHRuZiA9IDI7XG5cdFx0ZWxzZSBpZiAoZiA8IDcpXG5cdFx0XHRuZiA9IDU7XG5cdFx0ZWxzZVxuXHRcdFx0bmYgPSAxMDtcblx0fVxuXHRlbHNlIHtcblx0XHRpZiAoZiA8PSAxKVxuXHRcdFx0bmYgPSAxO1xuXHRcdGVsc2UgaWYgKGYgPD0gMilcblx0XHRcdG5mID0gMjtcblx0XHRlbHNlIGlmIChmIDw9IDUpXG5cdFx0XHRuZiA9IDU7XG5cdFx0ZWxzZSBuZiA9IDEwO1xuXHR9XG5cblx0cmV0dXJuIE51bWJlcigobmYgKiBNYXRoLnBvdygxMCwgZXhwKSkudG9GaXhlZCgyMCkpO1xufVxuXG5BeGlzLnByb3RvdHlwZS5nZXRMYWJlbFN0YXJ0UG9pbnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBjb252ZXJ0VG9OdW1iZXIodGhpcy5pbnRlcnZhbCwgdGhpcy5pbnRlcnZhbFR5cGUpO1xuXHR2YXIgbWluaW11bSA9IE1hdGguZmxvb3IoKHRoaXMudmlld3BvcnRNaW5pbXVtKSAvIGludGVydmFsSW5NaWxsaXNlY29uZHMpICogaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcztcblx0dmFyIGRhdGVUaW1lID0gbmV3IERhdGUobWluaW11bSk7XG5cblx0aWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIm1pbGxpc2Vjb25kXCIpIHtcblx0XHQvL21pbGxpc2Vjb25kID0gZGF0ZVRpbWUuZ2V0TWlsbGlTZWNvbmQoKTtcblx0XHQvL21pbGxpc2Vjb25kID0gTWF0aC5mbG9vcigobWlsbGlzZWNvbmQgKyB0aGlzLmludGVydmFsKSAvIHRoaXMuaW50ZXJ2YWwpICogdGhpcy5pbnRlcnZhbDtcblx0fVxuXHRlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJzZWNvbmRcIikge1xuXHRcdGlmIChkYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKSA+IDApIHtcblx0XHRcdGRhdGVUaW1lLnNldFNlY29uZHMoZGF0ZVRpbWUuZ2V0U2Vjb25kcygpICsgMSk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaWxsaXNlY29uZHMoMCk7XG5cdFx0fVxuXHR9XG5cdGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIm1pbnV0ZVwiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKGRhdGVUaW1lLmdldE1pbnV0ZXMoKSArIDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwiaG91clwiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldE1pbnV0ZXMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0U2Vjb25kcygpID4gMCB8fCBkYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKSA+IDApIHtcblx0XHRcdGRhdGVUaW1lLnNldEhvdXJzKGRhdGVUaW1lLmdldEhvdXJzKCkgKyAxKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbnV0ZXMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRTZWNvbmRzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0TWlsbGlzZWNvbmRzKDApO1xuXHRcdH1cblx0fVxuXHRlbHNlIGlmICh0aGlzLmludGVydmFsVHlwZSA9PT0gXCJkYXlcIikge1xuXHRcdGlmIChkYXRlVGltZS5nZXRIb3VycygpID4gMCB8fCBkYXRlVGltZS5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKGRhdGVUaW1lLmdldERhdGUoKSArIDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0SG91cnMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwid2Vla1wiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldERheSgpID4gMCB8fCBkYXRlVGltZS5nZXRIb3VycygpID4gMCB8fCBkYXRlVGltZS5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKGRhdGVUaW1lLmdldERhdGUoKSArICg3IC0gZGF0ZVRpbWUuZ2V0RGF5KCkpKTtcblx0XHRcdGRhdGVUaW1lLnNldEhvdXJzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0TWludXRlcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldFNlY29uZHMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaWxsaXNlY29uZHMoMCk7XG5cdFx0fVxuXHR9XG5cdGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxUeXBlID09PSBcIm1vbnRoXCIpIHtcblx0XHRpZiAoZGF0ZVRpbWUuZ2V0RGF0ZSgpID4gMSB8fCBkYXRlVGltZS5nZXRIb3VycygpID4gMCB8fCBkYXRlVGltZS5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVUaW1lLmdldFNlY29uZHMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgPiAwKSB7XG5cdFx0XHRkYXRlVGltZS5zZXRNb250aChkYXRlVGltZS5nZXRNb250aCgpICsgMSk7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0SG91cnMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAodGhpcy5pbnRlcnZhbFR5cGUgPT09IFwieWVhclwiKSB7XG5cdFx0aWYgKGRhdGVUaW1lLmdldE1vbnRoKCkgPiAwIHx8IGRhdGVUaW1lLmdldERhdGUoKSA+IDEgfHwgZGF0ZVRpbWUuZ2V0SG91cnMoKSA+IDAgfHwgZGF0ZVRpbWUuZ2V0TWludXRlcygpID4gMCB8fCBkYXRlVGltZS5nZXRTZWNvbmRzKCkgPiAwIHx8IGRhdGVUaW1lLmdldE1pbGxpc2Vjb25kcygpID4gMCkge1xuXHRcdFx0ZGF0ZVRpbWUuc2V0RnVsbFllYXIoZGF0ZVRpbWUuZ2V0RnVsbFllYXIoKSArIDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0TW9udGgoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXREYXRlKDEpO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0SG91cnMoMCk7XG5cdFx0XHRkYXRlVGltZS5zZXRNaW51dGVzKDApO1xuXHRcdFx0ZGF0ZVRpbWUuc2V0U2Vjb25kcygwKTtcblx0XHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZGF0ZVRpbWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF4aXM7XG4iLCJpbXBvcnQge3RoZW1lc30gZnJvbSAnLi4vY29uc3RhbnRzL3RoZW1lcyc7XG5pbXBvcnQge2lzRGVidWdNb2RlLCBkZWZhdWx0T3B0aW9uc30gZnJvbSAnLi4vY29uc3RhbnRzL29wdGlvbnMnO1xuXG5mdW5jdGlvbiBDYW52YXNKU09iamVjdChkZWZhdWx0c0tleSwgb3B0aW9ucywgdGhlbWUsIHBhcmVudCkge1xuICB0aGlzLl9kZWZhdWx0c0tleSA9IGRlZmF1bHRzS2V5O1xuXG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW107Ly9NdWx0aWRpbWVudGlvbmFsIGFycmF5IHdpdGggYW4gYXJyYXkgZm9yIGVhY2ggZXZlbnQgdHlwZVxuXG4gIHZhciBjdXJyZW50VGhlbWVPcHRpb25zID0ge307XG5cbiAgaWYgKHRoZW1lICYmIHRoZW1lc1t0aGVtZV0gJiYgdGhlbWVzW3RoZW1lXVtkZWZhdWx0c0tleV0pXG4gICAgY3VycmVudFRoZW1lT3B0aW9ucyA9IHRoZW1lc1t0aGVtZV1bZGVmYXVsdHNLZXldO1xuXG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zID8gb3B0aW9ucyA6IHt9O1xuICB0aGlzLnNldE9wdGlvbnModGhpcy5fb3B0aW9ucywgY3VycmVudFRoZW1lT3B0aW9ucyk7XG59XG5cbkNhbnZhc0pTT2JqZWN0LnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMsIGN1cnJlbnRUaGVtZU9wdGlvbnMpIHtcblxuICBpZiAoIWRlZmF1bHRPcHRpb25zW3RoaXMuX2RlZmF1bHRzS2V5XSkge1xuICAgIGlmIChpc0RlYnVnTW9kZSAmJiB3aW5kb3cuY29uc29sZSlcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdHMgbm90IHNldFwiKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgZGVmYXVsdHMgPSBkZWZhdWx0T3B0aW9uc1t0aGlzLl9kZWZhdWx0c0tleV07XG5cbiAgICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRzKSB7XG5cbiAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgaWYgKG9wdGlvbnMgJiYgcHJvcCBpbiBvcHRpb25zKVxuICAgICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICAgIGVsc2UgaWYgKGN1cnJlbnRUaGVtZU9wdGlvbnMgJiYgcHJvcCBpbiBjdXJyZW50VGhlbWVPcHRpb25zKVxuICAgICAgICB0aGlzW3Byb3BdID0gY3VycmVudFRoZW1lT3B0aW9uc1twcm9wXTtcbiAgICAgIGVsc2UgdGhpc1twcm9wXSA9IGRlZmF1bHRzW3Byb3BdO1xuXG4gICAgICAvL2lmICh0eXBlb2YgdGhpc1twcm9wXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyAgICBhbGVydChcImZ1bmN0aW9uXCIpO1xuICAgICAgLy8gICAgdGhpc1twcm9wXSA9IHRoaXNbcHJvcF0oKTtcbiAgICAgIC8vfVxuICAgIH1cblxuICB9XG4gIH1cbn07XG5cbi8vIFVwZGF0ZSBvcHRpb25zLiBSZXR1cm5zIHRydWUgaWYgY2hhbmdlZCBvciBlbHNlIGZhbHNlXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUudXBkYXRlT3B0aW9uID0gZnVuY3Rpb24gKHByb3ApIHtcblxuICBpZiAoIWRlZmF1bHRPcHRpb25zW3RoaXMuX2RlZmF1bHRzS2V5XSAmJiBpc0RlYnVnTW9kZSAmJiB3aW5kb3cuY29uc29sZSlcbiAgICBjb25zb2xlLmxvZyhcImRlZmF1bHRzIG5vdCBzZXRcIik7XG5cbiAgdmFyIGRlZmF1bHRzID0gZGVmYXVsdE9wdGlvbnNbdGhpcy5fZGVmYXVsdHNLZXldO1xuICB2YXIgdGhlbWUgPSB0aGlzLl9vcHRpb25zLnRoZW1lID8gdGhpcy5fb3B0aW9ucy50aGVtZSA6ICh0aGlzLmNoYXJ0ICYmIHRoaXMuY2hhcnQuX29wdGlvbnMudGhlbWUpID8gdGhpcy5jaGFydC5fb3B0aW9ucy50aGVtZSA6IFwidGhlbWUxXCI7XG5cbiAgdmFyIGN1cnJlbnRUaGVtZU9wdGlvbnMgPSB7fTtcbiAgdmFyIG5ld1ZhbHVlID0gdGhpc1twcm9wXTtcblxuICBpZiAodGhlbWUgJiYgdGhlbWVzW3RoZW1lXSAmJiB0aGVtZXNbdGhlbWVdW3RoaXMuX2RlZmF1bHRzS2V5XSlcbiAgICBjdXJyZW50VGhlbWVPcHRpb25zID0gdGhlbWVzW3RoZW1lXVt0aGlzLl9kZWZhdWx0c0tleV07XG5cbiAgaWYgKHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICBpZiAocHJvcCBpbiB0aGlzLl9vcHRpb25zKVxuICAgICAgbmV3VmFsdWUgPSB0aGlzLl9vcHRpb25zW3Byb3BdO1xuICAgIGVsc2UgaWYgKGN1cnJlbnRUaGVtZU9wdGlvbnMgJiYgcHJvcCBpbiBjdXJyZW50VGhlbWVPcHRpb25zKVxuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VGhlbWVPcHRpb25zW3Byb3BdO1xuICAgIGVsc2UgbmV3VmFsdWUgPSBkZWZhdWx0c1twcm9wXTtcbiAgfVxuXG4gIGlmIChuZXdWYWx1ZSA9PT0gdGhpc1twcm9wXSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdGhpc1twcm9wXSA9IG5ld1ZhbHVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy9TdG9yZXMgdmFsdWVzIGluIF9vbGRPcHRpb25zIHNvIHRoYXQgaXQgY2FuIGJlIHRyYWNrZWQgZm9yIGFueSBjaGFuZ2VzXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUudHJhY2tDaGFuZ2VzID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICBpZiAoIXRoaXMuc2Vzc2lvblZhcmlhYmxlcylcbiAgICB0aHJvdyBcIlNlc3Npb24gVmFyaWFibGUgU3RvcmUgbm90IHNldFwiO1xuXG4gIHRoaXMuc2Vzc2lvblZhcmlhYmxlc1tvcHRpb25dID0gdGhpcy5fb3B0aW9uc1tvcHRpb25dO1xufTtcblxuQ2FudmFzSlNPYmplY3QucHJvdG90eXBlLmlzQmVpbmdUcmFja2VkID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICBpZiAoIXRoaXMuX29wdGlvbnMuX29sZE9wdGlvbnMpXG4gICAgdGhpcy5fb3B0aW9ucy5fb2xkT3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0aGlzLl9vcHRpb25zLl9vbGRPcHRpb25zW29wdGlvbl0pXG4gICAgcmV0dXJuIHRydWU7XG4gIGVsc2VcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUuaGFzT3B0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgaWYgKCF0aGlzLnNlc3Npb25WYXJpYWJsZXMpXG4gICAgdGhyb3cgXCJTZXNzaW9uIFZhcmlhYmxlIFN0b3JlIG5vdCBzZXRcIjtcblxuICB2YXIgaGFzQ2hhbmdlZCA9ICEodGhpcy5zZXNzaW9uVmFyaWFibGVzW29wdGlvbl0gPT09IHRoaXMuX29wdGlvbnNbb3B0aW9uXSk7XG5cbiAgcmV0dXJuIGhhc0NoYW5nZWQ7XG59O1xuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50SGFuZGxlciwgY29udGV4dCkge1xuICBpZiAoIWV2ZW50TmFtZSB8fCAhZXZlbnRIYW5kbGVyKVxuICAgIHJldHVybjtcblxuICBjb250ZXh0ID0gY29udGV4dCB8fCB0aGlzO1xuXG4gIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0gPSB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdO1xuXG4gIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV0ucHVzaCh7IGNvbnRleHQ6IGNvbnRleHQsIGV2ZW50SGFuZGxlcjogZXZlbnRIYW5kbGVyIH0pO1xufVxuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50SGFuZGxlcikge1xuICBpZiAoIWV2ZW50TmFtZSB8fCAhZXZlbnRIYW5kbGVyIHx8ICF0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudE5hbWVdKVxuICAgIHJldHVybjtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcblxuICAgIGlmIChsaXN0ZW5lcnNbaV0uZXZlbnRIYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuQ2FudmFzSlNPYmplY3QucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9ldmVudExpc3RlbmVycyA9IFtdO1xufVxuXG5DYW52YXNKU09iamVjdC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50UGFyYW1ldGVyLCBjb250ZXh0KSB7XG5cbiAgLy9Gb3IgSW50ZXJuYWwgRXZlbnRzXG4gIGlmIChldmVudE5hbWUgJiYgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnROYW1lXSkge1xuXG4gIGV2ZW50UGFyYW1ldGVyID0gZXZlbnRQYXJhbWV0ZXIgfHwge307XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50TmFtZV07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBsaXN0ZW5lcnNbaV0uZXZlbnRIYW5kbGVyLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGV2ZW50UGFyYW1ldGVyKTtcbiAgfVxufVxuXG4gIC8vRXh0ZXJuYWwgRXZlbnRzIGRvIG5vdCByZXF1aXJlIHJlZ2lzdGVyaW5nIGFzIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHN1ZmZpZW50IHRvIGZpcmUgdGhlIGV2ZW50LlxuICBpZiAodHlwZW9mICh0aGlzW2V2ZW50TmFtZV0pID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGlzW2V2ZW50TmFtZV0uY2FsbChjb250ZXh0IHx8IHRoaXMuY2hhcnQuX3B1YmxpY0NoYXJ0UmVmZXJlbmNlLCBldmVudFBhcmFtZXRlcik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FudmFzSlNPYmplY3Q7XG4iLCJcbmltcG9ydCBDYW52YXNKU09iamVjdCBmcm9tICcuL2NhbnZhc2pzJztcbmltcG9ydCBBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yJztcbmltcG9ydCBEYXRhU2VyaWVzIGZyb20gJy4vZGF0YV9zZXJpZXMnO1xuaW1wb3J0IFRleHRCbG9jayBmcm9tICcuL3RleHRfYmxvY2snO1xuaW1wb3J0IFJlbmRlckhlbHBlciBmcm9tICcuLi9oZWxwZXJzL3JlbmRlcic7XG5pbXBvcnQgTGF5b3V0TWFuYWdlciBmcm9tICcuL2xheW91dF9tYW5hZ2VyJztcbmltcG9ydCBFdmVudE1hbmFnZXIgZnJvbSAnLi9ldmVudF9tYW5hZ2VyJztcbmltcG9ydCBUb29sVGlwIGZyb20gJy4vdG9vbHRpcCc7XG5pbXBvcnQgQ3VsdHVyZUluZm8gZnJvbSAnLi4vY29yZS9jdWx0dXJlX2luZm8nO1xuaW1wb3J0IEF4aXMgZnJvbSAnLi4vY29yZS9heGlzJztcbmltcG9ydCBUaXRsZSBmcm9tICcuLi9jb3JlL3RpdGxlJztcbmltcG9ydCBMZWdlbmQgZnJvbSAnLi4vY29yZS9sZWdlbmQnO1xuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCB7Y29sb3JTZXRzfSBmcm9tICcuLi9jb25zdGFudHMvdGhlbWVzJztcbmltcG9ydCB7aXNEZWJ1Z01vZGUsIGRlZmF1bHRPcHRpb25zfSBmcm9tICcuLi9jb25zdGFudHMvb3B0aW9ucyc7XG4vLyBpbXBvcnQge2luaGVyaXRzfSBmcm9tICd1dGlsJztcblxuaW1wb3J0IHtcblx0YWRkRXZlbnQsXG5cdHNldENhbnZhc1NpemUsXG5cdGFkZEFycmF5SW5kZXhPZixcblx0aGlkZSxcblx0c2hvdyxcblx0Z2V0TW91c2VDb29yZGluYXRlcyxcblx0Z2V0UHJvcGVydHksXG5cdGlzQ2FudmFzU3VwcG9ydGVkLFxuXHRleHRlbmQsXG5cdGNyZWF0ZUNhbnZhcyxcblx0ZXh0ZW5kQ3R4LFxuXHRnZXRPYmplY3RJZCxcblx0ZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyxcblx0dHJpbVN0cmluZyxcblx0bnVtYmVyRm9ybWF0LFxuXHRnZXRMaW5lRGFzaEFycmF5LFxuXHRpbnRUb0hleENvbG9yU3RyaW5nLFxuXHRjb21wYXJlRGF0YVBvaW50WFxufSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuaW1wb3J0IHtcblx0U3BsaW5lQ2hhcnQsXG5cdENvbHVtbkNoYXJ0LFxuXHRTdGFja2VkQ29sdW1uQ2hhcnQsXG5cdFN0YWNrZWRDb2x1bW4xMDBDaGFydCxcblx0QmFyQ2hhcnQsXG5cdFN0YWNrZWRCYXJDaGFydCxcblx0U3RhY2tlZEJhcjEwMENoYXJ0LFxuXHRBcmVhQ2hhcnQsXG5cdFNwbGluZUFyZWFDaGFydCxcblx0U3RlcEFyZWFDaGFydCxcblx0U3RhY2tlZEFyZWFDaGFydCxcblx0U3RhY2tlZEFyZWExMDBDaGFydCxcblx0QnViYmxlQ2hhcnQsXG5cdFNjYXR0ZXJDaGFydCxcblx0Q2FuZGxlc3RpY2tDaGFydCxcblx0UmFuZ2VDb2x1bW5DaGFydCxcblx0UmFuZ2VCYXJDaGFydCxcblx0UmFuZ2VBcmVhQ2hhcnQsXG5cdFJhbmdlU3BsaW5lQXJlYUNoYXJ0LFxuXHRQaWVDaGFydFxufSBmcm9tICcuLi9jaGFydHMvaW5kZXgnO1xuXG5mdW5jdGlvbiBDaGFydChjb250YWluZXJJZCwgb3B0aW9ucywgcHVibGljQ2hhcnRSZWZlcmVuY2UpIHtcblxuXHR0aGlzLl9wdWJsaWNDaGFydFJlZmVyZW5jZSA9IHB1YmxpY0NoYXJ0UmVmZXJlbmNlO1xuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdENoYXJ0LmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkNoYXJ0XCIsIG9wdGlvbnMsIG9wdGlvbnMudGhlbWUgPyBvcHRpb25zLnRoZW1lIDogXCJ0aGVtZTFcIik7XG5cblx0dmFyIF90aGlzID0gdGhpcztcblxuXHR0aGlzLl9jb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuXHR0aGlzLl9vYmplY3RzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0dGhpcy5jdHggPSBudWxsO1xuXHR0aGlzLm92ZXJsYWlkQ2FudmFzQ3R4ID0gbnVsbDtcblx0dGhpcy5faW5kZXhMYWJlbHMgPSBbXTtcblx0dGhpcy5fcGFuVGltZXJJZCA9IDA7XG5cdHRoaXMuX2xhc3RUb3VjaEV2ZW50VHlwZSA9IFwiXCI7XG5cdHRoaXMuX2xhc3RUb3VjaERhdGEgPSBudWxsO1xuXHR0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdHRoaXMucmVuZGVyQ291bnQgPSAwO1xuXHR0aGlzLmFuaW1hdGVkUmVuZGVyID0gZmFsc2U7XG5cdHRoaXMuZGlzYWJsZVRvb2xUaXAgPSBmYWxzZTtcblxuXG5cdHRoaXMucGFuRW5hYmxlZCA9IGZhbHNlO1xuXHR0aGlzLl9kZWZhdWx0Q3Vyc29yID0gXCJkZWZhdWx0XCI7XG5cdHRoaXMucGxvdEFyZWEgPSB7IGNhbnZhczogbnVsbCwgY3R4OiBudWxsLCB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuXHR0aGlzLl9kYXRhSW5SZW5kZXJlZE9yZGVyID0gW107XG5cblx0dGhpcy5fY29udGFpbmVyID0gdHlwZW9mICh0aGlzLl9jb250YWluZXJJZCkgPT09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9jb250YWluZXJJZCkgOiB0aGlzLl9jb250YWluZXJJZDtcblxuXHRpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xuXHRcdGlmICh3aW5kb3cuY29uc29sZSlcblx0XHRcdHdpbmRvdy5jb25zb2xlLmxvZyhcIkNhbnZhc0pTIEVycm9yOiBDaGFydCBDb250YWluZXIgd2l0aCBpZCBcXFwiXCIgKyB0aGlzLl9jb250YWluZXJJZCArIFwiXFxcIiB3YXMgbm90IGZvdW5kXCIpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG5cdHZhciB3aWR0aCA9IDA7XG5cdHZhciBoZWlnaHQgPSAwO1xuXG5cdGlmICh0aGlzLl9vcHRpb25zLndpZHRoKVxuXHRcdHdpZHRoID0gdGhpcy53aWR0aDtcblx0ZWxzZVxuXHRcdHdpZHRoID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCA/IHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aCA6IHRoaXMud2lkdGg7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMuaGVpZ2h0KVxuXHRcdGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRlbHNlXG5cdFx0aGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDAgPyB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0IDogdGhpcy5oZWlnaHQ7XG5cblx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR0aGlzLngxID0gdGhpcy55MSA9IDA7XG5cdHRoaXMueDIgPSB0aGlzLndpZHRoO1xuXHR0aGlzLnkyID0gdGhpcy5oZWlnaHQ7XG5cblxuXHR0aGlzLl9zZWxlY3RlZENvbG9yU2V0ID0gdHlwZW9mIChjb2xvclNldHNbdGhpcy5jb2xvclNldF0pICE9PSBcInVuZGVmaW5lZFwiID8gY29sb3JTZXRzW3RoaXMuY29sb3JTZXRdIDogY29sb3JTZXRzW1wiY29sb3JTZXQxXCJdO1xuXG5cdHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJjYW52YXNqcy1jaGFydC1jb250YWluZXJcIik7XG5cblx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdHRoaXMuX2NhbnZhc0pTQ29udGFpbmVyLnN0eWxlLnRleHRBbGlnbiA9IFwibGVmdFwiO1xuXHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSBcImF1dG9cIjtcblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjsvL0luIElFNiB0b29sVGlwIGRvZXNuJ3Qgc2hvdyBhdCBwcm9wZXIgcG9zaXRpb24gaWYgbm90IHNldC5cblx0fVxuXHR0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzSlNDb250YWluZXIpO1xuXG5cblx0dGhpcy5jYW52YXMgPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cblx0dGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdGlmICh0aGlzLmNhbnZhcy5nZXRDb250ZXh0KSB7XG5cdFx0Ly90cnkge1xuXHRcdC8vXHR0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0Ly99IGNhdGNoIChlKSB7IH1cblx0XHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cdFx0dGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0dGhpcy5jdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcblx0XHRleHRlbmRDdHgodGhpcy5jdHgpO1xuXG5cdH0gZWxzZSByZXR1cm47XG5cblx0Ly90aGlzLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSBcInBvaW50ZXJcIjtcblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5wbG90QXJlYS5jYW52YXMgPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cdFx0dGhpcy5wbG90QXJlYS5jYW52YXMuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0dGhpcy5wbG90QXJlYS5jYW52YXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJwbG90QXJlYUNhbnZhc1wiKTtcblx0XHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBsb3RBcmVhLmNhbnZhcyk7XG5cblx0XHR0aGlzLnBsb3RBcmVhLmN0eCA9IHRoaXMucGxvdEFyZWEuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnBsb3RBcmVhLmN0eCA9IHRoaXMuY3R4O1xuXHR9XG5cblx0dGhpcy5vdmVybGFpZENhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblx0dGhpcy5vdmVybGFpZENhbnZhcy5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0dGhpcy5fY2FudmFzSlNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGFpZENhbnZhcyk7XG5cdHRoaXMub3ZlcmxhaWRDYW52YXNDdHggPSB0aGlzLm92ZXJsYWlkQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0dGhpcy5vdmVybGFpZENhbnZhc0N0eC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xuXG5cdHRoaXMuX2V2ZW50TWFuYWdlciA9IG5ldyBFdmVudE1hbmFnZXIodGhpcyk7XG5cblx0YWRkRXZlbnQod2luZG93LCBcInJlc2l6ZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0Ly90aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTVN1YnRyZWVNb2RpZmllZFwiLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoX3RoaXMuX3VwZGF0ZVNpemUoKSlcblx0XHRcdF90aGlzLnJlbmRlcigpO1xuXHR9KTtcblxuXG5cdHRoaXMuX3Rvb2xCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHR0aGlzLl90b29sQmFyLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiY2FudmFzanMtY2hhcnQtdG9vbGJhclwiKTtcblx0dGhpcy5fdG9vbEJhci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxcHg7IHRvcDogMXB4O1wiO1xuXHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl90b29sQmFyKTtcblxuXG5cdHRoaXMuYm91bmRzID0geyB4MTogMCwgeTE6IDAsIHgyOiB0aGlzLndpZHRoLCB5MjogdGhpcy5oZWlnaHQgfTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuXHRcdF90aGlzLl9tb3VzZUV2ZW50SGFuZGxlcihlKTtcblx0fSk7XG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX21vdXNlRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCAnbW91c2V1cCcsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX21vdXNlRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcblx0XHRfdGhpcy5fbW91c2VFdmVudEhhbmRsZXIoZSk7XG5cdFx0aGlkZShfdGhpcy5fZHJvcGRvd25NZW51KTtcblx0fSk7XG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHtcblx0XHRfdGhpcy5fbW91c2VFdmVudEhhbmRsZXIoZSk7XG5cdH0pO1xuXG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkID8gXCJNU1BvaW50ZXJEb3duXCIgOiBcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRfdGhpcy5fdG91Y2hFdmVudEhhbmRsZXIoZSk7XG5cdH0pO1xuXG5cdGFkZEV2ZW50KHRoaXMub3ZlcmxhaWRDYW52YXMsIHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCA/IFwiTVNQb2ludGVyTW92ZVwiIDogJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX3RvdWNoRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRhZGRFdmVudCh0aGlzLm92ZXJsYWlkQ2FudmFzLCB3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQgPyBcIk1TUG9pbnRlclVwXCIgOiAndG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkge1xuXHRcdF90aGlzLl90b3VjaEV2ZW50SGFuZGxlcihlKTtcblx0fSk7XG5cblx0YWRkRXZlbnQodGhpcy5vdmVybGFpZENhbnZhcywgd2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkID8gXCJNU1BvaW50ZXJDYW5jZWxcIiA6ICd0b3VjaGNhbmNlbCcsIGZ1bmN0aW9uIChlKSB7XG5cdFx0X3RoaXMuX3RvdWNoRXZlbnRIYW5kbGVyKGUpO1xuXHR9KTtcblxuXHRpZiAoIXRoaXMuX2NyZWRpdExpbmspIHtcblxuXHRcdHRoaXMuX2NyZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0XHR0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiY2FudmFzanMtY2hhcnQtY3JlZGl0XCIpO1xuXHRcdHRoaXMuX2NyZWRpdExpbmsuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJvdXRsaW5lOm5vbmU7bWFyZ2luOjBweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDozcHg7dG9wOlwiICsgKHRoaXMuaGVpZ2h0IC0gMTQpICsgXCJweDtjb2xvcjpkaW1ncmV5O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtZmFtaWx5Okx1Y2lkYSBHcmFuZGUsIEx1Y2lkYSBTYW5zIFVuaWNvZGUsIEFyaWFsLCBzYW5zLXNlcmlmXCIpO1xuXG5cdFx0dGhpcy5fY3JlZGl0TGluay5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAtMSk7XG5cblx0XHR0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZShcInRhcmdldFwiLCBcIl9ibGFua1wiKTtcblx0fVxuXG5cdHRoaXMuX3Rvb2xUaXAgPSBuZXcgVG9vbFRpcCh0aGlzLCB0aGlzLl9vcHRpb25zLnRvb2xUaXAsIHRoaXMudGhlbWUpO1xuXG5cdHRoaXMuZGF0YSA9IG51bGw7XG5cdHRoaXMuYXhpc1ggPSBudWxsO1xuXHR0aGlzLmF4aXNZID0gbnVsbDtcblx0dGhpcy5heGlzWTIgPSBudWxsO1xuXG5cdHRoaXMuc2Vzc2lvblZhcmlhYmxlcyA9IHtcblx0XHRheGlzWDoge30sXG5cdFx0YXhpc1k6IHt9LFxuXHRcdGF4aXNZMjoge31cblx0fTtcbn1cblxuZXh0ZW5kKENoYXJ0LCBDYW52YXNKU09iamVjdCk7XG5cbi8vVXBkYXRlIENoYXJ0IFByb3BlcnRpZXNcbkNoYXJ0LnByb3RvdHlwZS5fdXBkYXRlT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdHRoaXMudXBkYXRlT3B0aW9uKFwid2lkdGhcIik7XG5cdHRoaXMudXBkYXRlT3B0aW9uKFwiaGVpZ2h0XCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcImRhdGFQb2ludE1heFdpZHRoXCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcImludGVyYWN0aXZpdHlFbmFibGVkXCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcInRoZW1lXCIpO1xuXG5cdGlmICh0aGlzLnVwZGF0ZU9wdGlvbihcImNvbG9yU2V0XCIpKVxuXHRcdHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQgPSB0eXBlb2YgKGNvbG9yU2V0c1t0aGlzLmNvbG9yU2V0XSkgIT09IFwidW5kZWZpbmVkXCIgPyBjb2xvclNldHNbdGhpcy5jb2xvclNldF0gOiBjb2xvclNldHNbXCJjb2xvclNldDFcIl07XG5cblx0dGhpcy51cGRhdGVPcHRpb24oXCJiYWNrZ3JvdW5kQ29sb3JcIik7XG5cdGlmICghdGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG5cdFx0dGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYmEoMCwwLDAsMClcIjtcblxuXHR0aGlzLnVwZGF0ZU9wdGlvbihcImN1bHR1cmVcIik7XG5cdHRoaXMuX2N1bHR1cmVJbmZvID0gbmV3IEN1bHR1cmVJbmZvKHRoaXMuX29wdGlvbnMuY3VsdHVyZSk7XG5cblx0dGhpcy51cGRhdGVPcHRpb24oXCJhbmltYXRpb25FbmFibGVkXCIpO1xuXHR0aGlzLmFuaW1hdGlvbkVuYWJsZWQgPSB0aGlzLmFuaW1hdGlvbkVuYWJsZWQgJiYgaXNDYW52YXNTdXBwb3J0ZWQ7XG5cdHRoaXMudXBkYXRlT3B0aW9uKFwiYW5pbWF0aW9uRHVyYXRpb25cIik7XG5cblx0dGhpcy51cGRhdGVPcHRpb24oXCJyYW5nZUNoYW5naW5nXCIpO1xuXHR0aGlzLnVwZGF0ZU9wdGlvbihcInJhbmdlQ2hhbmdlZFwiKTtcblxuXHQvL05lZWQgdG8gY2hlY2sgdGhpcy5fb3B0aW9ucy56b29tRW5hYmxlZCBiZWNhdXNlIHRoaXMuem9vbUVuYWJsZWQgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGtlZXAgdHJhY2sgb2Ygc3RhdGUgLSBhbmQgaGVuY2UgY2hhbmdlcy5cblx0aWYgKHRoaXMuX29wdGlvbnMuem9vbUVuYWJsZWQpIHtcblxuXHRcdGlmICghdGhpcy5fem9vbUJ1dHRvbikge1xuXG5cdFx0XHRoaWRlKHRoaXMuX3pvb21CdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpKTtcblxuXHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fem9vbUJ1dHRvbiwgXCJwYW5cIik7XG5cblx0XHRcdHRoaXMuX3Rvb2xCYXIuYXBwZW5kQ2hpbGQodGhpcy5fem9vbUJ1dHRvbik7XG5cdFx0XHRhZGRFdmVudCh0aGlzLl96b29tQnV0dG9uLCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKF90aGlzLnpvb21FbmFibGVkKSB7XG5cdFx0XHRcdFx0X3RoaXMuem9vbUVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRfdGhpcy5wYW5FbmFibGVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdHNldEJ1dHRvblN0YXRlKF90aGlzLCBfdGhpcy5fem9vbUJ1dHRvbiwgXCJ6b29tXCIpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0X3RoaXMuem9vbUVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdF90aGlzLnBhbkVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHNldEJ1dHRvblN0YXRlKF90aGlzLCBfdGhpcy5fem9vbUJ1dHRvbiwgXCJwYW5cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRfdGhpcy5yZW5kZXIoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXG5cdFx0aWYgKCF0aGlzLl9yZXNldEJ1dHRvbikge1xuXHRcdFx0aGlkZSh0aGlzLl9yZXNldEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIikpO1xuXHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fcmVzZXRCdXR0b24sIFwicmVzZXRcIik7XG5cdFx0XHR0aGlzLl90b29sQmFyLmFwcGVuZENoaWxkKHRoaXMuX3Jlc2V0QnV0dG9uKTtcblxuXHRcdFx0YWRkRXZlbnQodGhpcy5fcmVzZXRCdXR0b24sIFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdF90aGlzLl90b29sVGlwLmhpZGUoKTtcblxuXHRcdFx0XHRpZiAoX3RoaXMuem9vbUVuYWJsZWQgfHwgX3RoaXMucGFuRW5hYmxlZCkge1xuXHRcdFx0XHRcdF90aGlzLnpvb21FbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRfdGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0c2V0QnV0dG9uU3RhdGUoX3RoaXMsIF90aGlzLl96b29tQnV0dG9uLCBcInBhblwiKTtcblxuXHRcdFx0XHRcdF90aGlzLl9kZWZhdWx0Q3Vyc29yID0gXCJkZWZhdWx0XCI7XG5cdFx0XHRcdFx0X3RoaXMub3ZlcmxhaWRDYW52YXMuc3R5bGUuY3Vyc29yID0gX3RoaXMuX2RlZmF1bHRDdXJzb3I7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0X3RoaXMuem9vbUVuYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRfdGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9SZXNldCBheGlzWFxuXHRcdFx0XHRpZiAoX3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWCkge1xuXHRcdFx0XHRcdF90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtID0gbnVsbDtcblx0XHRcdFx0XHRfdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWF4aW11bSA9IG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1Jlc2V0IGF4aXNZXG5cdFx0XHRcdGlmIChfdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNZKSB7XG5cdFx0XHRcdFx0X3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWS5uZXdWaWV3cG9ydE1pbmltdW0gPSBudWxsO1xuXHRcdFx0XHRcdF90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1kubmV3Vmlld3BvcnRNYXhpbXVtID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vUmVzZXQgYXhpc1kyXG5cdFx0XHRcdGlmIChfdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNZMikge1xuXHRcdFx0XHRcdF90aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1kyLm5ld1ZpZXdwb3J0TWluaW11bSA9IG51bGw7XG5cdFx0XHRcdFx0X3RoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWTIubmV3Vmlld3BvcnRNYXhpbXVtID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdF90aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG5cblx0XHRcdFx0aGlkZShfdGhpcy5fem9vbUJ1dHRvbiwgX3RoaXMuX3Jlc2V0QnV0dG9uKTtcblxuXHRcdFx0XHRfdGhpcy5fZGlzcGF0Y2hSYW5nZUV2ZW50KFwicmFuZ2VDaGFuZ2luZ1wiLCBcInJlc2V0XCIpO1xuXHRcdFx0XHRfdGhpcy5yZW5kZXIoKTtcblx0XHRcdFx0X3RoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdlZFwiLCBcInJlc2V0XCIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMub3ZlcmxhaWRDYW52YXMuc3R5bGUuY3Vyc29yID0gX3RoaXMuX2RlZmF1bHRDdXJzb3I7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnpvb21FbmFibGVkICYmICF0aGlzLnBhbkVuYWJsZWQpIHtcblx0XHRcdGlmICghdGhpcy5fem9vbUJ1dHRvbikge1xuXHRcdFx0XHR0aGlzLnpvb21FbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmIChfdGhpcy5fem9vbUJ1dHRvbi5nZXRBdHRyaWJ1dGUoXCJzdGF0ZVwiKSA9PT0gX3RoaXMuX2N1bHR1cmVJbmZvLnpvb21UZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5wYW5FbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLnpvb21FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy56b29tRW5hYmxlZCA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzaG93KF90aGlzLl96b29tQnV0dG9uLCBfdGhpcy5fcmVzZXRCdXR0b24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXG5cblx0fSBlbHNlIHtcblx0XHR0aGlzLnpvb21FbmFibGVkID0gZmFsc2U7XG5cdFx0dGhpcy5wYW5FbmFibGVkID0gZmFsc2U7XG5cdH1cblxuXG5cblx0aWYgKHRoaXMuX21lbnVCdXR0b24pIHtcblx0XHRpZiAodGhpcy5leHBvcnRFbmFibGVkKVxuXHRcdFx0c2hvdyh0aGlzLl9tZW51QnV0dG9uKTtcblx0XHRlbHNlXG5cdFx0XHRoaWRlKHRoaXMuX21lbnVCdXR0b24pO1xuXHR9IGVsc2UgaWYgKHRoaXMuZXhwb3J0RW5hYmxlZCAmJiBpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdHRoaXMuX21lbnVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuXHRcdHNldEJ1dHRvblN0YXRlKHRoaXMsIHRoaXMuX21lbnVCdXR0b24sIFwibWVudVwiKTtcblx0XHR0aGlzLl90b29sQmFyLmFwcGVuZENoaWxkKHRoaXMuX21lbnVCdXR0b24pO1xuXG5cdFx0YWRkRXZlbnQodGhpcy5fbWVudUJ1dHRvbiwgXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoX3RoaXMuX2Ryb3Bkb3duTWVudS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuXG5cdFx0XHRcdGlmIChfdGhpcy5fZHJvcERvd25DbG9zZVRpbWUgJiYgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBfdGhpcy5fZHJvcERvd25DbG9zZVRpbWUuZ2V0VGltZSgpIDw9IDUwMCkpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdF90aGlzLl9kcm9wZG93bk1lbnUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0XHRcdFx0X3RoaXMuX21lbnVCdXR0b24uYmx1cigpO1xuXHRcdFx0XHRfdGhpcy5fZHJvcGRvd25NZW51LmZvY3VzKCk7XG5cdFx0XHR9XG5cblx0XHR9LCB0cnVlKTtcblx0fVxuXG5cblx0aWYgKCF0aGlzLl9kcm9wZG93bk1lbnUgJiYgdGhpcy5leHBvcnRFbmFibGVkICYmIGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dGhpcy5fZHJvcGRvd25NZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLl9kcm9wZG93bk1lbnUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgLTEpO1xuXHRcdHRoaXMuX2Ryb3Bkb3duTWVudS5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7IC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7IC1tcy11c2VyLXNlbGVjdDogbm9uZTsgdXNlci1zZWxlY3Q6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjtyaWdodDogMXB4O3RvcDogMjVweDttaW4td2lkdGg6IDEyMHB4O291dGxpbmU6IDA7Ym9yZGVyOiAxcHggc29saWQgc2lsdmVyO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogQ2FsaWJyaSwgVmVyZGFuYSwgc2Fucy1zZXJpZjtwYWRkaW5nOiA1cHggMHB4IDVweCAwcHg7dGV4dC1hbGlnbjogbGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO2xpbmUtaGVpZ2h0OiAyMHB4O2JveC1zaGFkb3c6IDJweCAycHggMTBweCAjODg4ODg4O1wiO1xuXHRcdF90aGlzLl9kcm9wZG93bk1lbnUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdHRoaXMuX3Rvb2xCYXIuYXBwZW5kQ2hpbGQodGhpcy5fZHJvcGRvd25NZW51KTtcblxuXHRcdGFkZEV2ZW50KHRoaXMuX2Ryb3Bkb3duTWVudSwgXCJibHVyXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdGhpZGUoX3RoaXMuX2Ryb3Bkb3duTWVudSk7XG5cblx0XHRcdF90aGlzLl9kcm9wRG93bkNsb3NlVGltZSA9IG5ldyBEYXRlKCk7XG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHR2YXIgZXhwb3J0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRleHBvcnRPcHRpb24uc3R5bGUuY3NzVGV4dCA9IFwicGFkZGluZzogMnB4IDE1cHggMnB4IDEwcHhcIlxuXHRcdGV4cG9ydE9wdGlvbi5pbm5lckhUTUwgPSB0aGlzLl9jdWx0dXJlSW5mby5zYXZlSlBHVGV4dDtcblx0XHR0aGlzLl9kcm9wZG93bk1lbnUuYXBwZW5kQ2hpbGQoZXhwb3J0T3B0aW9uKTtcblxuXHRcdGFkZEV2ZW50KGV4cG9ydE9wdGlvbiwgXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNFRUVFRUVcIjtcblx0XHR9LCB0cnVlKTtcblxuXHRcdGFkZEV2ZW50KGV4cG9ydE9wdGlvbiwgXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwidHJhbnNwYXJlbnRcIjtcblx0XHR9LCB0cnVlKTtcblxuXHRcdGFkZEV2ZW50KGV4cG9ydE9wdGlvbiwgXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRleHBvcnRDYW52YXMoX3RoaXMuY2FudmFzLCBcImpwZ1wiLCBfdGhpcy5leHBvcnRGaWxlTmFtZSk7XG5cdFx0XHRoaWRlKF90aGlzLl9kcm9wZG93bk1lbnUpO1xuXHRcdH0sIHRydWUpO1xuXG5cdFx0dmFyIGV4cG9ydE9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0ZXhwb3J0T3B0aW9uLnN0eWxlLmNzc1RleHQgPSBcInBhZGRpbmc6IDJweCAxNXB4IDJweCAxMHB4XCJcblx0XHRleHBvcnRPcHRpb24uaW5uZXJIVE1MID0gdGhpcy5fY3VsdHVyZUluZm8uc2F2ZVBOR1RleHQ7XG5cdFx0dGhpcy5fZHJvcGRvd25NZW51LmFwcGVuZENoaWxkKGV4cG9ydE9wdGlvbik7XG5cblx0XHRhZGRFdmVudChleHBvcnRPcHRpb24sIFwibW91c2VvdmVyXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjRUVFRUVFXCI7XG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHRhZGRFdmVudChleHBvcnRPcHRpb24sIFwibW91c2VvdXRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInRyYW5zcGFyZW50XCI7XG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHRhZGRFdmVudChleHBvcnRPcHRpb24sIFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0ZXhwb3J0Q2FudmFzKF90aGlzLmNhbnZhcywgXCJwbmdcIiwgX3RoaXMuZXhwb3J0RmlsZU5hbWUpO1xuXHRcdFx0aGlkZShfdGhpcy5fZHJvcGRvd25NZW51KTtcblx0XHR9LCB0cnVlKTtcblx0fVxuXG5cblx0aWYgKHRoaXMuX3Rvb2xCYXIuc3R5bGUuZGlzcGxheSAhPT0gXCJub25lXCIgJiYgdGhpcy5fem9vbUJ1dHRvbikge1xuXG5cdFx0dGhpcy5wYW5FbmFibGVkID8gc2V0QnV0dG9uU3RhdGUoX3RoaXMsIF90aGlzLl96b29tQnV0dG9uLCBcInpvb21cIikgOiBzZXRCdXR0b25TdGF0ZShfdGhpcywgX3RoaXMuX3pvb21CdXR0b24sIFwicGFuXCIpO1xuXG5cblx0XHRpZiAoX3RoaXMuX3Jlc2V0QnV0dG9uLmdldEF0dHJpYnV0ZShcInN0YXRlXCIpICE9PSBfdGhpcy5fY3VsdHVyZUluZm8ucmVzZXRUZXh0KVxuXHRcdFx0c2V0QnV0dG9uU3RhdGUoX3RoaXMsIF90aGlzLl9yZXNldEJ1dHRvbiwgXCJyZXNldFwiKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgKGRlZmF1bHRPcHRpb25zLkNoYXJ0LmNyZWRpdEhyZWYpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0dGhpcy5jcmVkaXRIcmVmID0gXCJodHRwOi8vY2FudmFzanMuY29tL1wiO1xuXHRcdHRoaXMuY3JlZGl0VGV4dCA9IFwiQ2FudmFzSlMuY29tXCI7XG5cdH0gZWxzZSB7XG5cdFx0dmFyIGNyZWRpdFRleHRDaGFuZ2VkID0gdGhpcy51cGRhdGVPcHRpb24oXCJjcmVkaXRUZXh0XCIpO1xuXHRcdHZhciBjcmVkaXRIcmVmQ2hhbmdlZCA9IHRoaXMudXBkYXRlT3B0aW9uKFwiY3JlZGl0SHJlZlwiKTtcblx0fVxuXG5cdGlmICh0aGlzLnJlbmRlckNvdW50ID09PSAwIHx8IChjcmVkaXRUZXh0Q2hhbmdlZCB8fCBjcmVkaXRIcmVmQ2hhbmdlZCkpIHtcblx0XHR0aGlzLl9jcmVkaXRMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdGhpcy5jcmVkaXRIcmVmKTtcblx0XHR0aGlzLl9jcmVkaXRMaW5rLmlubmVySFRNTCA9IHRoaXMuY3JlZGl0VGV4dDtcblx0fVxuXG5cdGlmICh0aGlzLmNyZWRpdEhyZWYgJiYgdGhpcy5jcmVkaXRUZXh0KSB7XG5cdFx0aWYgKCF0aGlzLl9jcmVkaXRMaW5rLnBhcmVudEVsZW1lbnQpXG5cdFx0XHR0aGlzLl9jYW52YXNKU0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jcmVkaXRMaW5rKTtcblx0fVxuXHRlbHNlIGlmICh0aGlzLl9jcmVkaXRMaW5rLnBhcmVudEVsZW1lbnQpXG5cdFx0dGhpcy5fY2FudmFzSlNDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fY3JlZGl0TGluayk7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMudG9vbFRpcCAmJiB0aGlzLl90b29sVGlwLl9vcHRpb25zICE9PSB0aGlzLl9vcHRpb25zLnRvb2xUaXApXG5cdFx0dGhpcy5fdG9vbFRpcC5fb3B0aW9ucyA9IHRoaXMuX29wdGlvbnMudG9vbFRpcFxuXG5cdGZvciAodmFyIHByb3AgaW4gdGhpcy5fdG9vbFRpcC5fb3B0aW9ucykge1xuXG5cdFx0aWYgKHRoaXMuX3Rvb2xUaXAuX29wdGlvbnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcblx0XHRcdHRoaXMuX3Rvb2xUaXAudXBkYXRlT3B0aW9uKHByb3ApO1xuXHRcdH1cblx0fVxuXG59XG5cbkNoYXJ0LnByb3RvdHlwZS5fdXBkYXRlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHdpZHRoID0gMDtcblx0dmFyIGhlaWdodCA9IDA7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMud2lkdGgpXG5cdFx0d2lkdGggPSB0aGlzLndpZHRoO1xuXHRlbHNlXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoID4gMCA/IHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aCA6IHRoaXMud2lkdGg7XG5cblx0aWYgKHRoaXMuX29wdGlvbnMuaGVpZ2h0KVxuXHRcdGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRlbHNlXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0ID4gMCA/IHRoaXMuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgOiB0aGlzLmhlaWdodDtcblxuXHRpZiAodGhpcy5jYW52YXMud2lkdGggIT09IHdpZHRoICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyB8fCB0aGlzLmNhbnZhcy5oZWlnaHQgIT09IGhlaWdodCAqIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pIHtcblx0XHRzZXRDYW52YXNTaXplKHRoaXMuY2FudmFzLCB3aWR0aCwgaGVpZ2h0KTtcblxuXHRcdHNldENhbnZhc1NpemUodGhpcy5vdmVybGFpZENhbnZhcywgd2lkdGgsIGhlaWdodCk7XG5cdFx0c2V0Q2FudmFzU2l6ZSh0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDYW52YXMsIHdpZHRoLCBoZWlnaHQpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIGluaXRpYWxpemUgY2hhcnQgb2JqZWN0c1xuQ2hhcnQucHJvdG90eXBlLl9pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xuXHQvLy88c2lnbmF0dXJlPlxuXHQvLy88c3VtbWFyeT5Jbml0aWFsaXplcyBDaGFydCBvYmplY3RzL3N0YXRlLiBDcmVhdGVzIERhdGFTZXJpZXMgY2xhc3MgaW5zdGFuY2UgZm9yIGVhY2ggRGF0YVNlcmllcyBwcm92aWRlZCBieSB0aGVyIHVzZXIuIFNldHMgdGhlIEF4aXMgVHlwZSBiYXNlZCBvbiB0aGUgdXNlciBkYXRhPC9zdW1tYXJ5PlxuXHQvLy88L3NpZ25hdHVyZT5cblx0Ly90aGlzLndpZHRoID0gdGhpcy53aWR0aDtcblxuXHRpZiAoIXRoaXMuX2FuaW1hdG9yKVxuXHRcdHRoaXMuX2FuaW1hdG9yID0gbmV3IEFuaW1hdG9yKHRoaXMpO1xuXHRlbHNlIHtcblx0XHR0aGlzLl9hbmltYXRvci5jYW5jZWxBbGxBbmltYXRpb25zKCk7XG5cdH1cblxuXHR0aGlzLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7XG5cblx0dGhpcy5kaXNhYmxlVG9vbFRpcCA9IGZhbHNlO1xuXG5cdHRoaXMuX2F4ZXMgPSBbXTtcblxuXHR0aGlzLnBpZURvdWdobnV0Q2xpY2tIYW5kbGVyID0gbnVsbDtcblx0Ly90aGlzLl90b3VjaEN1cnJlbnRDb29yZGluYXRlcyA9IG51bGw7XG5cblx0aWYgKHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkKVxuXHRcdHRoaXMuY2FuY2VsUmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgdGhpcy5hbmltYXRpb25SZXF1ZXN0SWQpO1xuXG5cdHRoaXMuX3VwZGF0ZU9wdGlvbnMoKTtcblxuXHR0aGlzLmFuaW1hdGVkUmVuZGVyID0gaXNDYW52YXNTdXBwb3J0ZWQgJiYgdGhpcy5hbmltYXRpb25FbmFibGVkICYmICh0aGlzLnJlbmRlckNvdW50ID09PSAwKTtcblxuXHR0aGlzLl91cGRhdGVTaXplKCk7XG5cblx0Ly90aGlzLl9zZWxlY3RlZENvbG9yU2V0ID0gY29sb3JTZXRzW1wiY29sb3JTZXQyXCJdO1xuXG5cdC8vdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0dGhpcy5jbGVhckNhbnZhcygpO1xuXHR0aGlzLmN0eC5iZWdpblBhdGgoKTtcblxuXHR0aGlzLmF4aXNYID0gbnVsbDtcblx0dGhpcy5heGlzWSA9IG51bGw7XG5cdHRoaXMuYXhpc1kyID0gbnVsbDtcblx0dGhpcy5faW5kZXhMYWJlbHMgPSBbXTtcblx0dGhpcy5fZGF0YUluUmVuZGVyZWRPcmRlciA9IFtdO1xuXG5cdHRoaXMuX2V2ZW50cyA9IFtdO1xuXHRpZiAodGhpcy5fZXZlbnRNYW5hZ2VyKVxuXHRcdHRoaXMuX2V2ZW50TWFuYWdlci5yZXNldCgpO1xuXG5cdHRoaXMucGxvdEluZm8gPSB7XG5cdFx0YXhpc1BsYWNlbWVudDogbnVsbCxcblx0XHRheGlzWFZhbHVlVHlwZTogbnVsbCxcblx0XHRwbG90VHlwZXM6IFtdLy9hcnJheSBvZiBwbG90VHlwZToge3R5cGU6XCJcIiwgYXhpc1lUeXBlOiBcInByaW1hcnlcIiwgZGF0YVNlcmllc0luZGV4ZXM6W119XG5cdH07XG5cblx0dGhpcy5sYXlvdXRNYW5hZ2VyID0gbmV3IExheW91dE1hbmFnZXIoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDIpO1xuXG5cdGlmICh0aGlzLnBsb3RBcmVhLmxheW91dE1hbmFnZXIpXG5cdFx0dGhpcy5wbG90QXJlYS5sYXlvdXRNYW5hZ2VyLnJlc2V0KCk7XG5cblxuXHR0aGlzLmRhdGEgPSBbXTtcblx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IDA7XG5cblx0Zm9yICh2YXIgc2VyaWVzID0gMDsgc2VyaWVzIDwgdGhpcy5fb3B0aW9ucy5kYXRhLmxlbmd0aDsgc2VyaWVzKyspIHtcblx0XHQvL2ZvciAoc2VyaWVzIGluIHRoaXMuX29wdGlvbnMuZGF0YSkge1xuXG5cdFx0ZGF0YVNlcmllc0luZGV4Kys7XG5cblx0XHRpZiAoISghdGhpcy5fb3B0aW9ucy5kYXRhW3Nlcmllc10udHlwZSB8fCBDaGFydC5fc3VwcG9ydGVkQ2hhcnRUeXBlcy5pbmRleE9mKHRoaXMuX29wdGlvbnMuZGF0YVtzZXJpZXNdLnR5cGUpID49IDApKVxuXHRcdFx0Y29udGludWU7XG5cblx0XHR2YXIgZGF0YVNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHRoaXMsIHRoaXMuX29wdGlvbnMuZGF0YVtzZXJpZXNdLCB0aGlzLnRoZW1lLCBkYXRhU2VyaWVzSW5kZXggLSAxLCArK3RoaXMuX2V2ZW50TWFuYWdlci5sYXN0T2JqZWN0SWQpO1xuXHRcdGlmIChkYXRhU2VyaWVzLm5hbWUgPT09IG51bGwpXG5cdFx0XHRkYXRhU2VyaWVzLm5hbWUgPSBcIkRhdGFTZXJpZXMgXCIgKyAoZGF0YVNlcmllc0luZGV4KTtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmNvbG9yID09PSBudWxsKSB7XG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5kYXRhLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0ZGF0YVNlcmllcy5fY29sb3JTZXQgPSBbdGhpcy5fc2VsZWN0ZWRDb2xvclNldFtkYXRhU2VyaWVzLmluZGV4ICUgdGhpcy5fc2VsZWN0ZWRDb2xvclNldC5sZW5ndGhdXTtcblx0XHRcdFx0ZGF0YVNlcmllcy5jb2xvciA9IHRoaXMuX3NlbGVjdGVkQ29sb3JTZXRbZGF0YVNlcmllcy5pbmRleCAlIHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQubGVuZ3RoXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYXJlYVwiXG5cdFx0XHRcdFx0fHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZUFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIlxuXHRcdFx0XHRcdHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikge1xuXHRcdFx0XHRcdGRhdGFTZXJpZXMuX2NvbG9yU2V0ID0gW3RoaXMuX3NlbGVjdGVkQ29sb3JTZXRbMF1dO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRkYXRhU2VyaWVzLl9jb2xvclNldCA9IHRoaXMuX3NlbGVjdGVkQ29sb3JTZXQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGFTZXJpZXMuX2NvbG9yU2V0ID0gW2RhdGFTZXJpZXMuY29sb3JdO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhU2VyaWVzLm1hcmtlclNpemUgPT09IG51bGwpIHtcblx0XHRcdGlmICgoKGRhdGFTZXJpZXMudHlwZSA9PT0gXCJsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0ZXBMaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZVwiKSAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aCA8IHRoaXMud2lkdGggLyAxNikgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIikge1xuXHRcdFx0XHQvL2lmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiKSB7XG5cdFx0XHRcdGRhdGFTZXJpZXMubWFya2VyU2l6ZSA9IDg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKChkYXRhU2VyaWVzLnR5cGUgPT09IFwiYnViYmxlXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIikgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzKSB7XG5cdFx0XHRkYXRhU2VyaWVzLmRhdGFQb2ludHMuc29ydChjb21wYXJlRGF0YVBvaW50WClcblx0XHR9XG5cblx0XHQvL2lmIChkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyA9PT0gbnVsbCAmJiBkYXRhU2VyaWVzLnR5cGUgPT09IFwic2NhdHRlclwiKSB7XG5cdFx0Ly8gICAgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPSAyO1xuXHRcdC8vfVxuXG5cdFx0Ly9pZiAoZGF0YVNlcmllcy5tYXJrZXJUeXBlID09PSBudWxsKSB7XG5cdFx0Ly8gICAgaWYgKGRhdGFTZXJpZXMudHlwZSA9PT0gXCJsaW5lXCIgJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoIDwgNTAwKSB7XG5cdFx0Ly8gICAgICAgIGRhdGFTZXJpZXMubWFya2VyVHlwZSA9IFwiY2lyY2xlXCI7XG5cdFx0Ly8gICAgfVxuXHRcdC8vfVxuXG5cdFx0dGhpcy5kYXRhLnB1c2goZGF0YVNlcmllcyk7XG5cblx0XHR2YXIgc2VyaWVzQXhpc1BsYWNlbWVudCA9IGRhdGFTZXJpZXMuYXhpc1BsYWNlbWVudDtcblxuXHRcdC8vaWYgKGlzRGVidWdNb2RlICYmIHdpbmRvdy5jb25zb2xlKVxuXHRcdC8vICAgIHdpbmRvdy5jb25zb2xlLmxvZyhkYXRhU2VyaWVzLnR5cGUpO1xuXG5cdFx0dmFyIGVycm9yTWVzc2FnZTtcblxuXHRcdGlmIChzZXJpZXNBeGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cblx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggYmFyIGNoYXJ0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub25lXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggcGllIGNoYXJ0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID0gXCJub3JtYWxcIjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoc2VyaWVzQXhpc1BsYWNlbWVudCA9PT0gXCJ4eVN3YXBwZWRcIikge1xuXG5cdFx0XHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cdFx0XHRcdGVycm9yTWVzc2FnZSA9IFwiWW91IGNhbm5vdCBjb21iaW5lIFxcXCJcIiArIGRhdGFTZXJpZXMudHlwZSArIFwiXFxcIiB3aXRoIGxpbmUsIGFyZWEsIGNvbHVtbiBvciBwaWUgY2hhcnRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vbmVcIikge1xuXHRcdFx0XHRlcnJvck1lc3NhZ2UgPSBcIllvdSBjYW5ub3QgY29tYmluZSBcXFwiXCIgKyBkYXRhU2VyaWVzLnR5cGUgKyBcIlxcXCIgd2l0aCBwaWUgY2hhcnRcIjtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBudWxsKVxuXHRcdFx0XHR0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPSBcInh5U3dhcHBlZFwiO1xuXHRcdH1cblx0XHRlbHNlIGlmIChzZXJpZXNBeGlzUGxhY2VtZW50ID09IFwibm9uZVwiKSB7XG5cblx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggbGluZSwgYXJlYSwgY29sdW1uIG9yIGJhciBjaGFydFwiO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0ZXJyb3JNZXNzYWdlID0gXCJZb3UgY2Fubm90IGNvbWJpbmUgXFxcIlwiICsgZGF0YVNlcmllcy50eXBlICsgXCJcXFwiIHdpdGggYmFyIGNoYXJ0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID0gXCJub25lXCI7XG5cdFx0fVxuXG5cdFx0aWYgKGVycm9yTWVzc2FnZSAmJiB3aW5kb3cuY29uc29sZSkge1xuXHRcdFx0d2luZG93LmNvbnNvbGUubG9nKGVycm9yTWVzc2FnZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0Ly9pZiAoaXNEZWJ1Z01vZGUgJiYgd2luZG93LmNvbnNvbGUpIHtcblx0Ly8gICAgd2luZG93LmNvbnNvbGUubG9nKFwieE1pbjogXCIgKyB0aGlzLnBsb3RJbmZvLnZpZXdQb3J0WE1pbiArIFwiOyB4TWF4OiBcIiArIHRoaXMucGxvdEluZm8udmlld1BvcnRYTWF4ICsgXCI7IHlNaW46IFwiICsgdGhpcy5wbG90SW5mby55TWluICsgXCI7IHlNYXg6IFwiICsgdGhpcy5wbG90SW5mby55TWF4KTtcblx0Ly99XG5cblx0dGhpcy5fb2JqZWN0c0luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuLy9pbmRleE9mIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSUU4LVxuQ2hhcnQuX3N1cHBvcnRlZENoYXJ0VHlwZXMgPSBhZGRBcnJheUluZGV4T2YoW1wibGluZVwiLCBcInN0ZXBMaW5lXCIsIFwic3BsaW5lXCIsIFwiY29sdW1uXCIsIFwiYXJlYVwiLCBcInN0ZXBBcmVhXCIsIFwic3BsaW5lQXJlYVwiLCBcImJhclwiLCBcImJ1YmJsZVwiLCBcInNjYXR0ZXJcIixcblx0XCJzdGFja2VkQ29sdW1uXCIsIFwic3RhY2tlZENvbHVtbjEwMFwiLCBcInN0YWNrZWRCYXJcIiwgXCJzdGFja2VkQmFyMTAwXCIsXG5cdFwic3RhY2tlZEFyZWFcIiwgXCJzdGFja2VkQXJlYTEwMFwiLFxuXHRcImNhbmRsZXN0aWNrXCIsXG5cdFwib2hsY1wiLFxuXHRcInJhbmdlQ29sdW1uXCIsXG5cdFwicmFuZ2VCYXJcIixcblx0XCJyYW5nZUFyZWFcIixcblx0XCJyYW5nZVNwbGluZUFyZWFcIixcblx0XCJwaWVcIiwgXCJkb3VnaG51dFwiLCBcImZ1bm5lbFwiXG5dKTtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cblx0aWYgKG9wdGlvbnMpXG5cdFx0dGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0dGhpcy5faW5pdGlhbGl6ZSgpO1xuXHR2YXIgcGxvdEFyZWFFbGVtZW50cyA9IFtdOyAvL0VsZW1lbnRzIHRvIGJlIHJlbmRlcmVkIGluc2lkZSB0aGUgcGxvdEFyZWFcblxuXHQvL0NyZWF0ZSBQcmltYXJ5IGFuZCBTZWNvbmRhcnkgYXhpcyBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHNlcmllc1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXG5cdFx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIiB8fCB0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdGlmICghdGhpcy5kYXRhW2ldLmF4aXNZVHlwZSB8fCB0aGlzLmRhdGFbaV0uYXhpc1lUeXBlID09PSBcInByaW1hcnlcIikge1xuXHRcdFx0XHRpZiAoIXRoaXMuYXhpc1kpIHtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2F4ZXMucHVzaCh0aGlzLmF4aXNZID0gbmV3IEF4aXModGhpcywgdGhpcy5fb3B0aW9ucy5heGlzWSwgXCJheGlzWVwiLCBcImxlZnRcIikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2F4ZXMucHVzaCh0aGlzLmF4aXNZID0gbmV3IEF4aXModGhpcywgdGhpcy5fb3B0aW9ucy5heGlzWSwgXCJheGlzWVwiLCBcImJvdHRvbVwiKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZGF0YVtpXS5heGlzWSA9IHRoaXMuYXhpc1k7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLmRhdGFbaV0uYXhpc1lUeXBlID09PSBcInNlY29uZGFyeVwiKSB7XG5cdFx0XHRcdGlmICghdGhpcy5heGlzWTIpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9heGVzLnB1c2godGhpcy5heGlzWTIgPSBuZXcgQXhpcyh0aGlzLCB0aGlzLl9vcHRpb25zLmF4aXNZMiwgXCJheGlzWVwiLCBcInJpZ2h0XCIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9heGVzLnB1c2godGhpcy5heGlzWTIgPSBuZXcgQXhpcyh0aGlzLCB0aGlzLl9vcHRpb25zLmF4aXNZMiwgXCJheGlzWVwiLCBcInRvcFwiKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZGF0YVtpXS5heGlzWSA9IHRoaXMuYXhpc1kyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuYXhpc1gpIHtcblx0XHRcdFx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIikge1xuXHRcdFx0XHRcdHRoaXMuX2F4ZXMucHVzaCh0aGlzLmF4aXNYID0gbmV3IEF4aXModGhpcywgdGhpcy5fb3B0aW9ucy5heGlzWCwgXCJheGlzWFwiLCBcImJvdHRvbVwiKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXhlcy5wdXNoKHRoaXMuYXhpc1ggPSBuZXcgQXhpcyh0aGlzLCB0aGlzLl9vcHRpb25zLmF4aXNYLCBcImF4aXNYXCIsIFwibGVmdFwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5kYXRhW2ldLmF4aXNYID0gdGhpcy5heGlzWDtcblx0XHR9XG5cdH1cblxuXHQvL0lmIEJvdGggUHJpbWFyeSBhbmQgU2Vjb25kYXJ5IGF4aXMgYXJlIHByZXNlbnQsIGRpc2FibGUgZ3JpZGxpbmVzIGZvciBvbmUgb2YgdGhlbSB1bmxlc3MgdGhlIHVzZXIgaGFzIHNldCB2YWx1ZSBmb3IgYm90aFxuXHRpZiAodGhpcy5heGlzWSAmJiB0aGlzLmF4aXNZMikge1xuXHRcdGlmICh0aGlzLmF4aXNZLmdyaWRUaGlja25lc3MgPiAwICYmIHR5cGVvZiAodGhpcy5heGlzWTIuX29wdGlvbnMuZ3JpZFRoaWNrbmVzcykgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHR0aGlzLmF4aXNZMi5ncmlkVGhpY2tuZXNzID0gMDtcblx0XHRlbHNlIGlmICh0aGlzLmF4aXNZMi5ncmlkVGhpY2tuZXNzID4gMCAmJiB0eXBlb2YgKHRoaXMuYXhpc1kuX29wdGlvbnMuZ3JpZFRoaWNrbmVzcykgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0XHR0aGlzLmF4aXNZLmdyaWRUaGlja25lc3MgPSAwO1xuXHR9XG5cblxuXHQvL1Nob3cgdG9vbEJhciB3aGVuIHZpZXdwb3J0TWluaW11bS92aWV3cG9ydE1heGltdW0gYXJlIHNldFxuXHR2YXIgc2hvd1Rvb2xCYXIgPSBmYWxzZTtcblx0aWYgKHRoaXMuX2F4ZXMubGVuZ3RoID4gMCAmJiAodGhpcy56b29tRW5hYmxlZCB8fCB0aGlzLnBhbkVuYWJsZWQpKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9heGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy5fYXhlc1tpXS52aWV3cG9ydE1pbmltdW0gIT09IG51bGwgfHwgdGhpcy5fYXhlc1tpXS52aWV3cG9ydE1heGltdW0gIT09IG51bGwpIHtcblx0XHRcdFx0c2hvd1Rvb2xCYXIgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoc2hvd1Rvb2xCYXIpIHtcblx0XHRzaG93KHRoaXMuX3pvb21CdXR0b24sIHRoaXMuX3Jlc2V0QnV0dG9uKTtcblx0fSBlbHNlIHtcblx0XHRoaWRlKHRoaXMuX3pvb21CdXR0b24sIHRoaXMuX3Jlc2V0QnV0dG9uKTtcblx0fVxuXG5cblx0dGhpcy5fcHJvY2Vzc0RhdGEoKTsvLyBDYXRlZ29yaXNlcyB0aGUgZGF0YVNlcmllcyBhbmQgY2FsY3VsYXRlcyBtaW4sIG1heCBhbmQgb3RoZXIgdmFsdWVzXG5cblx0aWYgKHRoaXMuX29wdGlvbnMudGl0bGUpIHtcblx0XHR0aGlzLl90aXRsZSA9IG5ldyBUaXRsZSh0aGlzLCB0aGlzLl9vcHRpb25zLnRpdGxlKTtcblxuXHRcdGlmICghdGhpcy5fdGl0bGUuZG9ja0luc2lkZVBsb3RBcmVhKVxuXHRcdFx0dGhpcy5fdGl0bGUucmVuZGVyKCk7XG5cdFx0ZWxzZVxuXHRcdFx0cGxvdEFyZWFFbGVtZW50cy5wdXNoKHRoaXMuX3RpdGxlKTtcblx0fVxuXG5cdGlmICh0aGlzLl9vcHRpb25zLnN1YnRpdGxlcykge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3B0aW9ucy5zdWJ0aXRsZXMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0dGhpcy5zdWJ0aXRsZXMgPSBbXTtcblxuXHRcdFx0dmFyIHN1YnRpdGxlID0gbmV3IFN1YnRpdGxlKHRoaXMsIHRoaXMuX29wdGlvbnMuc3VidGl0bGVzW2ldKTtcblx0XHRcdHRoaXMuc3VidGl0bGVzLnB1c2goc3VidGl0bGUpO1xuXG5cdFx0XHRpZiAoIXN1YnRpdGxlLmRvY2tJbnNpZGVQbG90QXJlYSlcblx0XHRcdFx0c3VidGl0bGUucmVuZGVyKCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHBsb3RBcmVhRWxlbWVudHMucHVzaChzdWJ0aXRsZSk7XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5sZWdlbmQgPSBuZXcgTGVnZW5kKHRoaXMsIHRoaXMuX29wdGlvbnMubGVnZW5kLCB0aGlzLnRoZW1lKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAodGhpcy5kYXRhW2ldLnNob3dJbkxlZ2VuZCB8fCB0aGlzLmRhdGFbaV0udHlwZSA9PT0gXCJwaWVcIiB8fCB0aGlzLmRhdGFbaV0udHlwZSA9PT0gXCJkb3VnaG51dFwiKSB7XG5cdFx0XHR0aGlzLmxlZ2VuZC5kYXRhU2VyaWVzLnB1c2godGhpcy5kYXRhW2ldKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXRoaXMubGVnZW5kLmRvY2tJbnNpZGVQbG90QXJlYSlcblx0XHR0aGlzLmxlZ2VuZC5yZW5kZXIoKTtcblx0ZWxzZVxuXHRcdHBsb3RBcmVhRWxlbWVudHMucHVzaCh0aGlzLmxlZ2VuZCk7XG5cblx0Ly9UQkk6IFJldmlzaXQgYW5kIGNoZWNrIGlmIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGVub3VnaC5cblx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIiB8fCB0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblxuXHRcdC8vdmFyIGZyZWVTcGFjZSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcblxuXHRcdEF4aXMuc2V0TGF5b3V0QW5kUmVuZGVyKHRoaXMuYXhpc1gsIHRoaXMuYXhpc1ksIHRoaXMuYXhpc1kyLCB0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQsIHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKSk7XG5cdH0gZWxzZSBpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcIm5vbmVcIikge1xuXHRcdC8vSW4gY2FzZSBvZiBjaGFydHMgd2l0aCBheGlzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbnNpZGUgc2V0TGF5b3V0QW5kUmVuZGVyXG5cdFx0dGhpcy5wcmVwYXJlUGxvdEFyZWEoKTtcblx0fVxuXHRlbHNlIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgaW5kZXggPSAwO1xuXHRmb3IgKGluZGV4IGluIHBsb3RBcmVhRWxlbWVudHMpIHtcblx0XHRpZihwbG90QXJlYUVsZW1lbnRzLmhhc093blByb3BlcnR5KGluZGV4KSlcblx0XHRwbG90QXJlYUVsZW1lbnRzW2luZGV4XS5yZW5kZXIoKTtcblx0fVxuXG5cdHZhciBhbmltYXRpb25zID0gW107XG5cdGlmICh0aGlzLmFuaW1hdGVkUmVuZGVyKSB7XG5cdFx0dmFyIGluaXRpYWxTdGF0ZSA9IGNyZWF0ZUNhbnZhcyh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cdFx0dmFyIGluaXRpYWxTdGF0ZUN0eCA9IGluaXRpYWxTdGF0ZS5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0aW5pdGlhbFN0YXRlQ3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhcywgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoOyBqKyspIHtcblxuXHRcdFx0dmFyIHBsb3RVbml0ID0gcGxvdFR5cGUucGxvdFVuaXRzW2pdO1xuXHRcdFx0dmFyIGFuaW1hdGlvbkluZm8gPSBudWxsO1xuXG5cdFx0XHRwbG90VW5pdC50YXJnZXRDYW52YXMgPSBudWxsOyAvL0luIGNhc2UgY2hhcnQgdXBkYXRlcyBiZWZvcmUgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZSwgcHJldmlvdXMgY2FudmFzZXMgbmVlZCB0byBiZSByZW1vdmVkXG5cblx0XHRcdGlmICh0aGlzLmFuaW1hdGVkUmVuZGVyKSB7XG5cdFx0XHRcdHBsb3RVbml0LnRhcmdldENhbnZhcyA9IGNyZWF0ZUNhbnZhcyh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cdFx0XHRcdHBsb3RVbml0LnRhcmdldENhbnZhc0N0eCA9IHBsb3RVbml0LnRhcmdldENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwbG90VW5pdC50eXBlID09PSBcImxpbmVcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyTGluZShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInN0ZXBMaW5lXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0ZXBMaW5lKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwic3BsaW5lXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclNwbGluZShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcImNvbHVtblwiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJDb2x1bW4ocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJiYXJcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyQmFyKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwiYXJlYVwiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJBcmVhKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwic3RlcEFyZWFcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyU3RlcEFyZWEocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclNwbGluZUFyZWEocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRDb2x1bW4ocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRDb2x1bW4xMDAocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQmFyXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRCYXIocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQmFyMTAwXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRCYXIxMDAocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJTdGFja2VkQXJlYShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRBcmVhMTAwXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclN0YWNrZWRBcmVhMTAwKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwiYnViYmxlXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSBhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJCdWJibGUocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzY2F0dGVyXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclNjYXR0ZXIocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJwaWVcIilcblx0XHRcdFx0dGhpcy5yZW5kZXJQaWUocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJkb3VnaG51dFwiKVxuXHRcdFx0XHR0aGlzLnJlbmRlclBpZShwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcImNhbmRsZXN0aWNrXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlckNhbmRsZXN0aWNrKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwib2hsY1wiKVxuXHRcdFx0XHRhbmltYXRpb25JbmZvID0gdGhpcy5yZW5kZXJDYW5kbGVzdGljayhwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInJhbmdlQ29sdW1uXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclJhbmdlQ29sdW1uKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwicmFuZ2VCYXJcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyUmFuZ2VCYXIocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJyYW5nZUFyZWFcIilcblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IHRoaXMucmVuZGVyUmFuZ2VBcmVhKHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIpXG5cdFx0XHRcdGFuaW1hdGlvbkluZm8gPSB0aGlzLnJlbmRlclJhbmdlU3BsaW5lQXJlYShwbG90VW5pdCk7XG5cblx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0dGhpcy5fZGF0YUluUmVuZGVyZWRPcmRlci5wdXNoKHRoaXMuZGF0YVtwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1trXV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5hbmltYXRlZFJlbmRlciAmJiBhbmltYXRpb25JbmZvKVxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goYW5pbWF0aW9uSW5mbyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHRoaXMuYW5pbWF0ZWRSZW5kZXIgJiYgdGhpcy5faW5kZXhMYWJlbHMubGVuZ3RoID4gMCkge1xuXHRcdHZhciBpbmRleExhYmVsQ2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0XHR2YXIgaW5kZXhMYWJlbENhbnZhc0N0eCA9IGluZGV4TGFiZWxDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdGFuaW1hdGlvbnMucHVzaCh0aGlzLnJlbmRlckluZGV4TGFiZWxzKGluZGV4TGFiZWxDYW52YXNDdHgpKTtcblx0fVxuXG5cdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0aWYgKGFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdC8vdmFyIGFuaW1hdGlvbkNvdW50ID0gMDtcblx0XHRfdGhpcy5kaXNhYmxlVG9vbFRpcCA9IHRydWU7XG5cdFx0X3RoaXMuX2FuaW1hdG9yLmFuaW1hdGUoMjAwLCBfdGhpcy5hbmltYXRpb25EdXJhdGlvbiwgZnVuY3Rpb24gKGZyYWN0aW9uQ29tcGxldGUpIHtcblxuXHRcdFx0Ly9jb25zb2xlLmxvZyhmcmFjdGlvbkNvbXBsZXRlKTtcblx0XHRcdC8vYW5pbWF0aW9uQ291bnQrKztcblxuXHRcdFx0X3RoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCBfdGhpcy53aWR0aCwgX3RoaXMuaGVpZ2h0KTtcblxuXG5cdFx0XHQvLyAgX3RoaXMuY3R4LmRyYXdJbWFnZShpbml0aWFsU3RhdGUsIDAsIDAsIF90aGlzLndpZHRoICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbywgX3RoaXMuaGVpZ2h0ICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbywgMCwgMCwgX3RoaXMud2lkdGgsIF90aGlzLmhlaWdodCk7XG5cdFx0XHRfdGhpcy5jdHguZHJhd0ltYWdlKGluaXRpYWxTdGF0ZSwgMCwgMCwgTWF0aC5mbG9vcihfdGhpcy53aWR0aCAqIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pLCBNYXRoLmZsb29yKF90aGlzLmhlaWdodCAqIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pLCAwLCAwLCBfdGhpcy53aWR0aCwgX3RoaXMuaGVpZ2h0KTtcblxuXHRcdFx0Zm9yICh2YXIgbCA9IDA7IGwgPCBhbmltYXRpb25zLmxlbmd0aDsgbCsrKSB7XG5cblx0XHRcdFx0YW5pbWF0aW9uSW5mbyA9IGFuaW1hdGlvbnNbbF07XG5cblx0XHRcdFx0aWYgKGZyYWN0aW9uQ29tcGxldGUgPCAxICYmIHR5cGVvZiAoYW5pbWF0aW9uSW5mby5zdGFydFRpbWVQZXJjZW50KSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGlmIChmcmFjdGlvbkNvbXBsZXRlID49IGFuaW1hdGlvbkluZm8uc3RhcnRUaW1lUGVyY2VudCkge1xuXHRcdFx0XHRcdFx0Ly9hbmltYXRpb25JbmZvLmFuaW1hdGlvbkNhbGxiYWNrKEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyKGZyYWN0aW9uQ29tcGxldGUgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQsIDAsIDEsIDEgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQpLCBhbmltYXRpb25JbmZvKTtcblxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uSW5mby5hbmltYXRpb25DYWxsYmFjayhhbmltYXRpb25JbmZvLmVhc2luZ0Z1bmN0aW9uKGZyYWN0aW9uQ29tcGxldGUgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQsIDAsIDEsIDEgLSBhbmltYXRpb25JbmZvLnN0YXJ0VGltZVBlcmNlbnQpLCBhbmltYXRpb25JbmZvKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25JbmZvLmFuaW1hdGlvbkNhbGxiYWNrKGFuaW1hdGlvbkluZm8uZWFzaW5nRnVuY3Rpb24oZnJhY3Rpb25Db21wbGV0ZSwgMCwgMSwgMSksIGFuaW1hdGlvbkluZm8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdF90aGlzLmRpc3BhdGNoRXZlbnQoXCJkYXRhQW5pbWF0aW9uSXRlcmF0aW9uRW5kXCIsXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhcnQ6IF90aGlzXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHR9LCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0dmFyIGNvdW50ID0gMDtcblxuXHRcdFx0Ly9EZWxldGUgYWxsIHJlbmRlciB0YXJnZXQgY2FudmFzZXMgdXNlZCBmb3IgYW5pbWF0aW9uLlxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy5wbG90SW5mby5wbG90VHlwZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHBsb3RUeXBlID0gX3RoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0dmFyIHBsb3RVbml0ID0gcGxvdFR5cGUucGxvdFVuaXRzW2pdO1xuXHRcdFx0XHRcdHBsb3RVbml0LnRhcmdldENhbnZhcyA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aW5pdGlhbFN0YXRlID0gbnVsbDtcblx0XHRcdF90aGlzLmRpc2FibGVUb29sVGlwID0gZmFsc2U7XG5cdFx0XHQvL2NvbnNvbGUubG9nKFwiKioqKioqKioqKiogQW5pbWF0aW9uIENvbXBsZXRlIC0gXCIgKyBhbmltYXRpb25Db3VudCArIFwiICoqKioqKioqKioqXCIpO1xuXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKF90aGlzLl9pbmRleExhYmVscy5sZW5ndGggPiAwKVxuXHRcdFx0X3RoaXMucmVuZGVySW5kZXhMYWJlbHMoKTtcblxuXHRcdF90aGlzLmRpc3BhdGNoRXZlbnQoXCJkYXRhQW5pbWF0aW9uSXRlcmF0aW9uRW5kXCIsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjaGFydDogX3RoaXNcblx0XHRcdFx0fSk7XG5cdH1cblxuXHR0aGlzLmF0dGFjaFBsb3RBcmVhRXZlbnRIYW5kbGVycygpO1xuXG5cdGlmICghdGhpcy56b29tRW5hYmxlZCAmJiAhdGhpcy5wYW5FbmFibGVkICYmIHRoaXMuX3pvb21CdXR0b24gJiYgdGhpcy5fem9vbUJ1dHRvbi5zdHlsZS5kaXNwbGF5ICE9PSBcIm5vbmVcIikge1xuXHRcdGhpZGUodGhpcy5fem9vbUJ1dHRvbiwgdGhpcy5fcmVzZXRCdXR0b24pO1xuXHR9XG5cblx0dGhpcy5fdG9vbFRpcC5fdXBkYXRlVG9vbFRpcCgpO1xuXG5cdHRoaXMucmVuZGVyQ291bnQrKztcblxuXHQvL2lmICh3aW5kb3cuY29uc29sZSkge1xuXHQvLyAgICB3aW5kb3cuY29uc29sZS5sb2cobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkdCk7XG5cdC8vfVxuXG5cdGlmIChpc0RlYnVnTW9kZSkge1xuXG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBnaG9zdENhbnZhc0NvcHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdob3N0Q2FudmFzQ29weVwiKTtcblxuXHRcdFx0aWYgKGdob3N0Q2FudmFzQ29weSkge1xuXHRcdFx0XHQvL2NvbnNvbGUubG9nKGdob3N0Q2FudmFzQ29weS5jbGllbnRXaWR0aCk7XG5cdFx0XHRcdHNldENhbnZhc1NpemUoZ2hvc3RDYW52YXNDb3B5LCBfdGhpcy53aWR0aCwgX3RoaXMuaGVpZ2h0KTtcblx0XHRcdFx0dmFyIGdob3N0Q2FudmFzQ29weUN0eCA9IGdob3N0Q2FudmFzQ29weS5nZXRDb250ZXh0KFwiMmRcIik7XG5cblx0XHRcdFx0Ly9naG9zdENhbnZhc0NvcHlDdHguc2NhbGUoMSwgMSk7XG5cdFx0XHRcdC8vdmFyIGltYWdlRGF0YSA9IHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0KTtcblx0XHRcdFx0Ly90aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHguZHJhd0ltYWdlKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcywgMCwgMCk7XG5cdFx0XHRcdC8vdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcywgMCwgMCk7XG5cblx0XHRcdFx0Z2hvc3RDYW52YXNDb3B5Q3R4LmRyYXdJbWFnZShfdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q2FudmFzLCAwLCAwKTtcblx0XHRcdFx0Ly9fdGhpcy5fY2FudmFzSlNDb250YWluZXIuYXBwZW5kQ2hpbGQoX3RoaXMuX2V2ZW50TWFuYWdlci5naG9zdENhbnZhcyk7XG5cdFx0XHRcdC8vX3RoaXMub3ZlcmxhaWRDYW52YXNDdHguZHJhd0ltYWdlKF90aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDYW52YXMsIDAsIDApO1xuXHRcdFx0fVxuXHRcdH0sIDIwMDApO1xuXHR9XG59XG5cbkNoYXJ0LnByb3RvdHlwZS5hdHRhY2hQbG90QXJlYUV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Ly90aGlzLl90b29sQmFyLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuXG5cdHRoaXMuYXR0YWNoRXZlbnQoe1xuXHRcdGNvbnRleHQ6IHRoaXMsXG5cdFx0Y2hhcnQ6IHRoaXMsXG5cdFx0bW91c2Vkb3duOiB0aGlzLl9wbG90QXJlYU1vdXNlRG93bixcblx0XHRtb3VzZXVwOiB0aGlzLl9wbG90QXJlYU1vdXNlVXAsXG5cdFx0bW91c2Vtb3ZlOiB0aGlzLl9wbG90QXJlYU1vdXNlTW92ZSxcblx0XHRjdXJzb3I6IHRoaXMuem9vbUVuYWJsZWQgPyBcImNvbC1yZXNpemVcIiA6IFwibW92ZVwiLFxuXHRcdGN1cnNvcjogdGhpcy5wYW5FbmFibGVkID8gXCJtb3ZlXCIgOiBcImRlZmF1bHRcIixcblx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdGJvdW5kczogdGhpcy5wbG90QXJlYVxuXHR9KTtcblxufVxuXG5DaGFydC5wcm90b3R5cGUuY2F0ZWdvcmlzZURhdGFTZXJpZXMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBkYXRhU2VyaWVzID0gXCJcIjtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbaV1cblx0XHRpZiAoIWRhdGFTZXJpZXMuZGF0YVBvaW50cyB8fCBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoID09PSAwIHx8ICFkYXRhU2VyaWVzLnZpc2libGUpXG5cdFx0XHRjb250aW51ZTtcblxuXHRcdGlmIChDaGFydC5fc3VwcG9ydGVkQ2hhcnRUeXBlcy5pbmRleE9mKGRhdGFTZXJpZXMudHlwZSkgPj0gMCkge1xuXG5cdFx0XHR2YXIgcGxvdFR5cGUgPSBudWxsO1xuXHRcdFx0dmFyIHBsb3RUeXBlRXhpc3RzID0gZmFsc2U7XG5cblx0XHRcdHZhciBwbG90VW5pdCA9IG51bGw7XG5cdFx0XHR2YXIgcGxvdFVuaXRFeGlzdHMgPSBmYWxzZTtcblxuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRpZiAodGhpcy5wbG90SW5mby5wbG90VHlwZXNbal0udHlwZSA9PT0gZGF0YVNlcmllcy50eXBlKSB7XG5cdFx0XHRcdFx0cGxvdFR5cGVFeGlzdHMgPSB0cnVlO1xuXHRcdFx0XHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2pdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghcGxvdFR5cGVFeGlzdHMpIHtcblx0XHRcdFx0cGxvdFR5cGUgPSB7XG5cdFx0XHRcdFx0dHlwZTogZGF0YVNlcmllcy50eXBlLFxuXHRcdFx0XHRcdHRvdGFsRGF0YVNlcmllczogMCxcblx0XHRcdFx0XHRwbG90VW5pdHM6IFtdXG5cdFx0XHRcdH07XG5cdFx0XHRcdHRoaXMucGxvdEluZm8ucGxvdFR5cGVzLnB1c2gocGxvdFR5cGUpXG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGlmIChwbG90VHlwZS5wbG90VW5pdHNbal0uYXhpc1lUeXBlID09PSBkYXRhU2VyaWVzLmF4aXNZVHlwZSkge1xuXHRcdFx0XHRcdHBsb3RVbml0RXhpc3RzID0gdHJ1ZTtcblx0XHRcdFx0XHR2YXIgcGxvdFVuaXQgPSBwbG90VHlwZS5wbG90VW5pdHNbal07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFwbG90VW5pdEV4aXN0cykge1xuXHRcdFx0XHRwbG90VW5pdCA9IHtcblx0XHRcdFx0XHR0eXBlOiBkYXRhU2VyaWVzLnR5cGUsXG5cdFx0XHRcdFx0cHJldmlvdXNEYXRhU2VyaWVzQ291bnQ6IDAsIC8vdG8gYmUgc2V0IG5leHRcblx0XHRcdFx0XHRpbmRleDogcGxvdFR5cGUucGxvdFVuaXRzLmxlbmd0aCxcblx0XHRcdFx0XHRwbG90VHlwZTogcGxvdFR5cGUsXG5cdFx0XHRcdFx0YXhpc1lUeXBlOiBkYXRhU2VyaWVzLmF4aXNZVHlwZSxcblx0XHRcdFx0XHRheGlzWTogZGF0YVNlcmllcy5heGlzWVR5cGUgPT09IFwicHJpbWFyeVwiID8gdGhpcy5heGlzWSA6IHRoaXMuYXhpc1kyLFxuXHRcdFx0XHRcdGF4aXNYOiB0aGlzLmF4aXNYLFxuXHRcdFx0XHRcdGRhdGFTZXJpZXNJbmRleGVzOiBbXSwgLy9pbmRleCBvZiBkYXRhU2VyaWVzXG5cdFx0XHRcdFx0eVRvdGFsczogW11cblx0XHRcdFx0fVxuXHRcdFx0XHRwbG90VHlwZS5wbG90VW5pdHMucHVzaChwbG90VW5pdCk7XG5cdFx0XHR9XG5cblx0XHRcdHBsb3RUeXBlLnRvdGFsRGF0YVNlcmllcysrO1xuXG5cdFx0XHRwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5wdXNoKGkpO1xuXG5cdFx0XHRkYXRhU2VyaWVzLnBsb3RVbml0ID0gcGxvdFVuaXQ7XG5cdFx0fVxuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXHRcdHZhciBwcmV2aW91c0RhdGFTZXJpZXNDb3VudCA9IDA7XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RUeXBlLnBsb3RVbml0cy5sZW5ndGg7IGorKykge1xuXG5cdFx0XHRwbG90VHlwZS5wbG90VW5pdHNbal0ucHJldmlvdXNEYXRhU2VyaWVzQ291bnQgPSBwcmV2aW91c0RhdGFTZXJpZXNDb3VudDtcblxuXHRcdFx0cHJldmlvdXNEYXRhU2VyaWVzQ291bnQgKz0gcGxvdFR5cGUucGxvdFVuaXRzW2pdLmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblx0XHR9XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLmFzc2lnbklkVG9EYXRhUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbaV07XG5cblx0XHRpZiAoIWRhdGFTZXJpZXMuZGF0YVBvaW50cylcblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0dmFyIGxlbmd0aCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGg7XG5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7XG5cdFx0XHRkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tqXSA9ICsrdGhpcy5fZXZlbnRNYW5hZ2VyLmxhc3RPYmplY3RJZDtcblx0XHR9XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wcm9jZXNzRGF0YSA9IGZ1bmN0aW9uICgpIHtcblx0dGhpcy5hc3NpZ25JZFRvRGF0YVBvaW50cygpO1xuXHR0aGlzLmNhdGVnb3Jpc2VEYXRhU2VyaWVzKCk7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsb3RJbmZvLnBsb3RUeXBlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBwbG90VHlwZSA9IHRoaXMucGxvdEluZm8ucGxvdFR5cGVzW2ldO1xuXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VHlwZS5wbG90VW5pdHMubGVuZ3RoOyBqKyspIHtcblxuXHRcdFx0dmFyIHBsb3RVbml0ID0gcGxvdFR5cGUucGxvdFVuaXRzW2pdO1xuXG5cdFx0XHRpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJsaW5lXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IHBsb3RVbml0LnR5cGUgPT09IFwic3BsaW5lXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJjb2x1bW5cIiB8fCBwbG90VW5pdC50eXBlID09PSBcImFyZWFcIiB8fCBwbG90VW5pdC50eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJiYXJcIiB8fCBwbG90VW5pdC50eXBlID09PSBcImJ1YmJsZVwiIHx8IHBsb3RVbml0LnR5cGUgPT09IFwic2NhdHRlclwiKVxuXHRcdFx0XHR0aGlzLl9wcm9jZXNzTXVsdGlzZXJpZXNQbG90VW5pdChwbG90VW5pdCk7XG5cdFx0XHRlbHNlIGlmIChwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRDb2x1bW5cIiB8fCBwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBwbG90VW5pdC50eXBlID09PSBcInN0YWNrZWRBcmVhXCIpXG5cdFx0XHRcdHRoaXMuX3Byb2Nlc3NTdGFja2VkUGxvdFVuaXQocGxvdFVuaXQpO1xuXHRcdFx0ZWxzZSBpZiAocGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQmFyMTAwXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJzdGFja2VkQXJlYTEwMFwiKVxuXHRcdFx0XHR0aGlzLl9wcm9jZXNzU3RhY2tlZDEwMFBsb3RVbml0KHBsb3RVbml0KTtcblx0XHRcdGVsc2UgaWYgKHBsb3RVbml0LnR5cGUgPT09IFwiY2FuZGxlc3RpY2tcIiB8fCBwbG90VW5pdC50eXBlID09PSBcIm9obGNcIiB8fCBwbG90VW5pdC50eXBlID09PSBcInJhbmdlQ29sdW1uXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJyYW5nZUJhclwiIHx8IHBsb3RVbml0LnR5cGUgPT09IFwicmFuZ2VBcmVhXCIgfHwgcGxvdFVuaXQudHlwZSA9PT0gXCJyYW5nZVNwbGluZUFyZWFcIilcblx0XHRcdFx0dGhpcy5fcHJvY2Vzc011bHRpWVBsb3RVbml0KHBsb3RVbml0KTtcblx0XHR9XG5cdH1cblxufVxuXG5DaGFydC5wcm90b3R5cGUuX3Byb2Nlc3NNdWx0aXNlcmllc1Bsb3RVbml0ID0gZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdGlmICghcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMgfHwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoIDwgMSlcblx0XHRyZXR1cm47XG5cblx0dmFyIGF4aXNZRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWS5kYXRhSW5mbztcblx0dmFyIGF4aXNYRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWC5kYXRhSW5mbztcblx0dmFyIGRhdGFQb2ludFgsIGRhdGFQb2ludFk7XG5cdHZhciBpc0RhdGVUaW1lID0gZmFsc2U7XG5cblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal1dO1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgaXNGaXJzdERQSW5WaWV3UG9ydCA9IGZhbHNlO1xuXHRcdHZhciBpc0xhc3REUEluVmlld1BvcnQgPSBmYWxzZTtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIgfHwgZGF0YVNlcmllcy5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cblx0XHRcdHZhciBwbG90QXJlYVhNaW4gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtID8gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWluaW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSA/XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtKSA/IHRoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bSA6IC1JbmZpbml0eTtcblxuXHRcdFx0dmFyIHBsb3RBcmVhWE1heCA9IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1heGltdW0gPyB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNYXhpbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0pID9cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0pID8gdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtIDogSW5maW5pdHk7XG5cdFx0fVxuXG5cblx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSB8fCBkYXRhU2VyaWVzLnhWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xuXHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHRpZiAodHlwZW9mIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID0gaTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUpIHtcblx0XHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCk7Ly9kYXRhUG9pbnRYIGlzIHVzZWQgc28gdGhhdCBnZXRUaW1lIGlzIGNhbGxlZCBvbmx5IG9uY2UgaW4gY2FzZSBvZiBkYXRlVGltZSB2YWx1ZXNcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRkYXRhUG9pbnRZID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnk7XG5cblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLm1pbilcblx0XHRcdFx0YXhpc1hEYXRhSW5mby5taW4gPSBkYXRhUG9pbnRYO1xuXHRcdFx0aWYgKGRhdGFQb2ludFggPiBheGlzWERhdGFJbmZvLm1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby5tYXggPSBkYXRhUG9pbnRYO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA8IGF4aXNZRGF0YUluZm8ubWluKVxuXHRcdFx0XHRheGlzWURhdGFJbmZvLm1pbiA9IGRhdGFQb2ludFk7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID4gYXhpc1lEYXRhSW5mby5tYXgpXG5cdFx0XHRcdGF4aXNZRGF0YUluZm8ubWF4ID0gZGF0YVBvaW50WTtcblxuXG5cdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0dmFyIHhEaWZmID0gZGF0YVBvaW50WCAtIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpIC0gMV0ueDtcblx0XHRcdFx0eERpZmYgPCAwICYmICh4RGlmZiA9IHhEaWZmICogLTEpOyAvL0lmIENvbmRpdGlvbiBzaG9ydGN1dFxuXG5cdFx0XHRcdGlmIChheGlzWERhdGFJbmZvLm1pbkRpZmYgPiB4RGlmZiAmJiB4RGlmZiAhPT0gMCkge1xuXHRcdFx0XHRcdGF4aXNYRGF0YUluZm8ubWluRGlmZiA9IHhEaWZmO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFkgIT09IG51bGwgJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS55ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0dmFyIHlEaWZmID0gZGF0YVBvaW50WSAtIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpIC0gMV0ueTtcblx0XHRcdFx0XHR5RGlmZiA8IDAgJiYgKHlEaWZmID0geURpZmYgKiAtMSk7IC8vSWYgQ29uZGl0aW9uIHNob3J0Y3V0XG5cblx0XHRcdFx0XHRpZiAoYXhpc1lEYXRhSW5mby5taW5EaWZmID4geURpZmYgJiYgeURpZmYgIT09IDApIHtcblx0XHRcdFx0XHRcdGF4aXNZRGF0YUluZm8ubWluRGlmZiA9IHlEaWZmO1xuXHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoaXMgc2VjdGlvbiBtYWtlcyBzdXJlIHRoYXQgcGFydGlhbGx5IHZpc2libGUgZGF0YVBvaW50cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGJlZ2luaW5nXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RBcmVhWE1pbiAmJiAhaXNGaXJzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH0gZWxzZSBpZiAoIWlzRmlyc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0aXNGaXJzdERQSW5WaWV3UG9ydCA9IHRydWU7XG5cblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0aSAtPSAyO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoaXMgc2VjdGlvbiBtYWtlcyBzdXJlIHRoYXQgcGFydGlhbGx5IHZpc2libGUgZGF0YVBvaW50cyBhcmUgaW5jbHVkZWQgYXQgdGhlIGVuZFxuXHRcdFx0aWYgKGRhdGFQb2ludFggPiBwbG90QXJlYVhNYXggJiYgIWlzTGFzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRpc0xhc3REUEluVmlld1BvcnQgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhUG9pbnRYID4gcGxvdEFyZWFYTWF4ICYmIGlzTGFzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS5sYWJlbClcblx0XHRcdFx0cGxvdFVuaXQuYXhpc1gubGFiZWxzW2RhdGFQb2ludFhdID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLmxhYmVsO1xuXG5cblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgYXhpc1hEYXRhSW5mby52aWV3UG9ydE1pbilcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1pbiA9IGRhdGFQb2ludFg7XG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IGF4aXNYRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRcdGF4aXNYRGF0YUluZm8udmlld1BvcnRNYXggPSBkYXRhUG9pbnRYO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA9PT0gbnVsbClcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZIDwgYXhpc1lEYXRhSW5mby52aWV3UG9ydE1pbilcblx0XHRcdFx0YXhpc1lEYXRhSW5mby52aWV3UG9ydE1pbiA9IGRhdGFQb2ludFk7XG5cdFx0XHRpZiAoZGF0YVBvaW50WSA+IGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRcdGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXggPSBkYXRhUG9pbnRZO1xuXHRcdH1cblxuXHRcdHRoaXMucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPSBkYXRhU2VyaWVzLnhWYWx1ZVR5cGUgPSBpc0RhdGVUaW1lID8gXCJkYXRlVGltZVwiIDogXCJudW1iZXJcIjtcblx0fVxuXG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoY29tcGFyZURhdGFQb2ludFgpO1xuXHQvL3RoaXMuZGF0YVBvaW50cy5zb3J0KGZ1bmN0aW9uIChkYXRhUG9pbnQxLCBkYXRhUG9pbnQyKSB7IHJldHVybiBkYXRhUG9pbnQxLnggLSBkYXRhUG9pbnQyLng7IH0pO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3Byb2Nlc3NTdGFja2VkUGxvdFVuaXQgPSBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblxuXHRpZiAoIXBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzIHx8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCA8IDEpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBheGlzWURhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1kuZGF0YUluZm87XG5cdHZhciBheGlzWERhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm87XG5cblx0dmFyIGRhdGFQb2ludFgsIGRhdGFQb2ludFk7XG5cdHZhciBpc0RhdGVUaW1lID0gZmFsc2U7XG5cblx0dmFyIGRhdGFQb2ludFlQb3NpdGl2ZVN1bXMgPSBbXTtcblx0dmFyIGRhdGFQb2ludFlOZWdhdGl2ZVN1bXMgPSBbXTtcblxuXHRmb3IgKHZhciBqID0gMDsgaiA8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXNbal1dO1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgaXNGaXJzdERQSW5WaWV3UG9ydCA9IGZhbHNlO1xuXHRcdHZhciBpc0xhc3REUEluVmlld1BvcnQgPSBmYWxzZTtcblxuXHRcdGlmIChkYXRhU2VyaWVzLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIgfHwgZGF0YVNlcmllcy5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cblx0XHRcdHZhciBwbG90QXJlYVhNaW4gPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtID8gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWluaW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSA/XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNaW5pbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtKSA/IHRoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bSA6IC1JbmZpbml0eTtcblxuXHRcdFx0dmFyIHBsb3RBcmVhWE1heCA9IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1heGltdW0gPyB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNYXhpbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0pID9cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1heGltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0pID8gdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtIDogSW5maW5pdHk7XG5cdFx0fVxuXG5cblx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggJiYgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSB8fCBkYXRhU2VyaWVzLnhWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xuXHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFTZXJpZXMuZGF0YVBvaW50cy5sZW5ndGg7IGkrKykge1xuXG5cdFx0XHQvLyBSZXF1aXJkIHdoZW4gbm8geCB2YWx1ZXMgYXJlIHByb3ZpZGVkXG5cdFx0XHRpZiAodHlwZW9mIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ID0gaTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUpIHtcblx0XHRcdFx0aXNEYXRlVGltZSA9IHRydWU7XG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCk7Ly9kYXRhUG9pbnRYIGlzIHVzZWQgc28gdGhhdCBnZXRUaW1lIGlzIGNhbGxlZCBvbmx5IG9uY2UgaW4gY2FzZSBvZiBkYXRlVGltZSB2YWx1ZXNcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54O1xuXG5cdFx0XHRkYXRhUG9pbnRZID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnk7XG5cblxuXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA8IGF4aXNYRGF0YUluZm8ubWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1pbiA9IGRhdGFQb2ludFg7XG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IGF4aXNYRGF0YUluZm8ubWF4KVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHR2YXIgeERpZmYgPSBkYXRhUG9pbnRYIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS54O1xuXHRcdFx0XHR4RGlmZiA8IDAgJiYgKHhEaWZmID0geERpZmYgKiAtMSk7IC8vSWYgQ29uZGl0aW9uIHNob3J0Y3V0XG5cblx0XHRcdFx0aWYgKGF4aXNYRGF0YUluZm8ubWluRGlmZiA+IHhEaWZmICYmIHhEaWZmICE9PSAwKSB7XG5cdFx0XHRcdFx0YXhpc1hEYXRhSW5mby5taW5EaWZmID0geERpZmY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WSAhPT0gbnVsbCAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLnkgIT09IG51bGwpIHtcblx0XHRcdFx0XHR2YXIgeURpZmYgPSBkYXRhUG9pbnRZIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS55O1xuXHRcdFx0XHRcdHlEaWZmIDwgMCAmJiAoeURpZmYgPSB5RGlmZiAqIC0xKTsgLy9JZiBDb25kaXRpb24gc2hvcnRjdXRcblxuXHRcdFx0XHRcdGlmIChheGlzWURhdGFJbmZvLm1pbkRpZmYgPiB5RGlmZiAmJiB5RGlmZiAhPT0gMCkge1xuXHRcdFx0XHRcdFx0YXhpc1lEYXRhSW5mby5taW5EaWZmID0geURpZmY7XG5cdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYmVnaW5pbmdcblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdEFyZWFYTWluICYmICFpc0ZpcnN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmICghaXNGaXJzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRpc0ZpcnN0RFBJblZpZXdQb3J0ID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRpIC09IDI7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBhdCB0aGUgZW5kXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IHBsb3RBcmVhWE1heCAmJiAhaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGlzTGFzdERQSW5WaWV3UG9ydCA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludFggPiBwbG90QXJlYVhNYXggJiYgaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ubGFiZWwpXG5cdFx0XHRcdHBsb3RVbml0LmF4aXNYLmxhYmVsc1tkYXRhUG9pbnRYXSA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS5sYWJlbDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID09PSBudWxsKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0cGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA9ICghcGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA/IDAgOiBwbG90VW5pdC55VG90YWxzW2RhdGFQb2ludFhdKSArIE1hdGguYWJzKGRhdGFQb2ludFkpO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA+PSAwKSB7XG5cdFx0XHRcdGlmIChkYXRhUG9pbnRZUG9zaXRpdmVTdW1zW2RhdGFQb2ludFhdKVxuXHRcdFx0XHRcdGRhdGFQb2ludFlQb3NpdGl2ZVN1bXNbZGF0YVBvaW50WF0gKz0gZGF0YVBvaW50WTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRhdGFQb2ludFlQb3NpdGl2ZVN1bXNbZGF0YVBvaW50WF0gPSBkYXRhUG9pbnRZO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGRhdGFQb2ludFlOZWdhdGl2ZVN1bXNbZGF0YVBvaW50WF0pXG5cdFx0XHRcdFx0ZGF0YVBvaW50WU5lZ2F0aXZlU3Vtc1tkYXRhUG9pbnRYXSArPSBkYXRhUG9pbnRZO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZGF0YVBvaW50WU5lZ2F0aXZlU3Vtc1tkYXRhUG9pbnRYXSA9IGRhdGFQb2ludFk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5wbG90SW5mby5heGlzWFZhbHVlVHlwZSA9IGRhdGFTZXJpZXMueFZhbHVlVHlwZSA9IGlzRGF0ZVRpbWUgPyBcImRhdGVUaW1lXCIgOiBcIm51bWJlclwiO1xuXHR9XG5cblx0Zm9yIChpIGluIGRhdGFQb2ludFlQb3NpdGl2ZVN1bXMpIHtcblx0XHRpZiAoZGF0YVBvaW50WVBvc2l0aXZlU3Vtcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdGlmIChpc05hTihpKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdHZhciB5U3VtID0gZGF0YVBvaW50WVBvc2l0aXZlU3Vtc1tpXTtcblxuXHRcdGlmICh5U3VtIDwgYXhpc1lEYXRhSW5mby5taW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLm1pbiA9IHlTdW07XG5cblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8ubWF4KVxuXHRcdFx0YXhpc1lEYXRhSW5mby5tYXggPSB5U3VtO1xuXG5cdFx0aWYgKGkgPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGkgPiBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWF4KVxuXHRcdFx0Y29udGludWU7XG5cblx0XHRpZiAoeVN1bSA8IGF4aXNZRGF0YUluZm8udmlld1BvcnRNaW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluID0geVN1bTtcblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWF4ID0geVN1bTtcblx0fVxuXG5cdH1cblxuXHRmb3IgKGkgaW4gZGF0YVBvaW50WU5lZ2F0aXZlU3Vtcykge1xuXG5cdFx0aWYgKGRhdGFQb2ludFlOZWdhdGl2ZVN1bXMuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRpZiAoaXNOYU4oaSkpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhciB5U3VtID0gZGF0YVBvaW50WU5lZ2F0aXZlU3Vtc1tpXTtcblxuXHRcdGlmICh5U3VtIDwgYXhpc1lEYXRhSW5mby5taW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLm1pbiA9IHlTdW07XG5cblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8ubWF4KVxuXHRcdFx0YXhpc1lEYXRhSW5mby5tYXggPSB5U3VtO1xuXG5cdFx0aWYgKGkgPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGkgPiBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWF4KVxuXHRcdFx0Y29udGludWU7XG5cblx0XHRpZiAoeVN1bSA8IGF4aXNZRGF0YUluZm8udmlld1BvcnRNaW4pXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluID0geVN1bTtcblx0XHRpZiAoeVN1bSA+IGF4aXNZRGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWF4ID0geVN1bTtcblx0fVxuXG5cdH1cblxuXG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoY29tcGFyZURhdGFQb2ludFgpO1xuXHQvL3RoaXMuZGF0YVBvaW50cy5zb3J0KGZ1bmN0aW9uIChkYXRhUG9pbnQxLCBkYXRhUG9pbnQyKSB7IHJldHVybiBkYXRhUG9pbnQxLnggLSBkYXRhUG9pbnQyLng7IH0pO1xuXG5cdC8vd2luZG93LmNvbnNvbGUubG9nKFwidmlld1BvcnRZTWluOiBcIiArIHBsb3RJbmZvLnZpZXdQb3J0WU1pbiArIFwiOyB2aWV3UG9ydFlNYXg6IFwiICsgcGxvdEluZm8udmlld1BvcnRZTWF4KTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wcm9jZXNzU3RhY2tlZDEwMFBsb3RVbml0ID0gZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdGlmICghcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMgfHwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoIDwgMSlcblx0XHRyZXR1cm47XG5cblx0dmFyIGF4aXNZRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWS5kYXRhSW5mbztcblx0dmFyIGF4aXNYRGF0YUluZm8gPSBwbG90VW5pdC5heGlzWC5kYXRhSW5mbztcblxuXHR2YXIgZGF0YVBvaW50WCwgZGF0YVBvaW50WTtcblx0dmFyIGlzRGF0ZVRpbWUgPSBmYWxzZTtcblx0dmFyIGNvbnRhaW5zUG9zaXRpdmVZID0gZmFsc2U7XG5cdHZhciBjb250YWluc05lZ2F0aXZlWSA9IGZhbHNlO1xuXG5cdHZhciBkYXRhUG9pbnRZU3VtcyA9IFtdO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuZGF0YVtwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXV07XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHZhciBpc0ZpcnN0RFBJblZpZXdQb3J0ID0gZmFsc2U7XG5cdFx0dmFyIGlzTGFzdERQSW5WaWV3UG9ydCA9IGZhbHNlO1xuXG5cdFx0aWYgKGRhdGFTZXJpZXMuYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIiB8fCBkYXRhU2VyaWVzLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblxuXHRcdFx0dmFyIHBsb3RBcmVhWE1pbiA9IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1pbmltdW0gPyB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNaW5pbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1pbmltdW0pID9cblx0XHRcdFx0dGhpcy5fb3B0aW9ucy5heGlzWC52aWV3cG9ydE1pbmltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW0pID8gdGhpcy5fb3B0aW9ucy5heGlzWC5taW5pbXVtIDogLUluZmluaXR5O1xuXG5cdFx0XHR2YXIgcGxvdEFyZWFYTWF4ID0gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWF4aW11bSA/IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1heGltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWF4aW11bSkgP1xuXHRcdFx0XHR0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWF4aW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gubWF4aW11bSkgPyB0aGlzLl9vcHRpb25zLmF4aXNYLm1heGltdW0gOiBJbmZpbml0eTtcblx0XHR9XG5cblxuXHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueCAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lIHx8IGRhdGFTZXJpZXMueFZhbHVlVHlwZSA9PT0gXCJkYXRlVGltZVwiKSB7XG5cdFx0XHRpc0RhdGVUaW1lID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdC8vIFJlcXVpcmQgd2hlbiBubyB4IHZhbHVlcyBhcmUgcHJvdmlkZWRcblx0XHRcdGlmICh0eXBlb2YgZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0ZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnggPSBpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSkge1xuXHRcdFx0XHRpc0RhdGVUaW1lID0gdHJ1ZTtcblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKTsvL2RhdGFQb2ludFggaXMgdXNlZCBzbyB0aGF0IGdldFRpbWUgaXMgY2FsbGVkIG9ubHkgb25jZSBpbiBjYXNlIG9mIGRhdGVUaW1lIHZhbHVlc1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdGRhdGFQb2ludFkgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueTtcblxuXG5cblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgYXhpc1hEYXRhSW5mby5taW4pXG5cdFx0XHRcdGF4aXNYRGF0YUluZm8ubWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby5tYXgpXG5cdFx0XHRcdGF4aXNYRGF0YUluZm8ubWF4ID0gZGF0YVBvaW50WDtcblxuXHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdHZhciB4RGlmZiA9IGRhdGFQb2ludFggLSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLng7XG5cdFx0XHRcdHhEaWZmIDwgMCAmJiAoeERpZmYgPSB4RGlmZiAqIC0xKTsgLy9JZiBDb25kaXRpb24gc2hvcnRjdXRcblxuXHRcdFx0XHRpZiAoYXhpc1hEYXRhSW5mby5taW5EaWZmID4geERpZmYgJiYgeERpZmYgIT09IDApIHtcblx0XHRcdFx0XHRheGlzWERhdGFJbmZvLm1pbkRpZmYgPSB4RGlmZjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRZICE9PSBudWxsICYmIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpIC0gMV0ueSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHZhciB5RGlmZiA9IGRhdGFQb2ludFkgLSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLnk7XG5cdFx0XHRcdFx0eURpZmYgPCAwICYmICh5RGlmZiA9IHlEaWZmICogLTEpOyAvL0lmIENvbmRpdGlvbiBzaG9ydGN1dFxuXG5cdFx0XHRcdFx0aWYgKGF4aXNZRGF0YUluZm8ubWluRGlmZiA+IHlEaWZmICYmIHlEaWZmICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRheGlzWURhdGFJbmZvLm1pbkRpZmYgPSB5RGlmZjtcblx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGlzIHNlY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHBhcnRpYWxseSB2aXNpYmxlIGRhdGFQb2ludHMgYXJlIGluY2x1ZGVkIGluIHRoZSBiZWdpbmluZ1xuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90QXJlYVhNaW4gJiYgIWlzRmlyc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKCFpc0ZpcnN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGlzRmlyc3REUEluVmlld1BvcnQgPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRcdGkgLT0gMjtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGlzIHNlY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHBhcnRpYWxseSB2aXNpYmxlIGRhdGFQb2ludHMgYXJlIGluY2x1ZGVkIGF0IHRoZSBlbmRcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gcGxvdEFyZWFYTWF4ICYmICFpc0xhc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0aXNMYXN0RFBJblZpZXdQb3J0ID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YVBvaW50WCA+IHBsb3RBcmVhWE1heCAmJiBpc0xhc3REUEluVmlld1BvcnQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ubGFiZWwpXG5cdFx0XHRcdHBsb3RVbml0LmF4aXNYLmxhYmVsc1tkYXRhUG9pbnRYXSA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS5sYWJlbDtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID09PSBudWxsKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0cGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA9ICghcGxvdFVuaXQueVRvdGFsc1tkYXRhUG9pbnRYXSA/IDAgOiBwbG90VW5pdC55VG90YWxzW2RhdGFQb2ludFhdKSArIE1hdGguYWJzKGRhdGFQb2ludFkpO1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSA+PSAwKSB7XG5cdFx0XHRcdGNvbnRhaW5zUG9zaXRpdmVZID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnRhaW5zTmVnYXRpdmVZID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRhdGFQb2ludFlTdW1zW2RhdGFQb2ludFhdKVxuXHRcdFx0XHRkYXRhUG9pbnRZU3Vtc1tkYXRhUG9pbnRYXSArPSBNYXRoLmFicyhkYXRhUG9pbnRZKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YVBvaW50WVN1bXNbZGF0YVBvaW50WF0gPSBNYXRoLmFicyhkYXRhUG9pbnRZKTtcblx0XHR9XG5cblx0XHR0aGlzLnBsb3RJbmZvLmF4aXNYVmFsdWVUeXBlID0gZGF0YVNlcmllcy54VmFsdWVUeXBlID0gaXNEYXRlVGltZSA/IFwiZGF0ZVRpbWVcIiA6IFwibnVtYmVyXCI7XG5cdH1cblxuXG5cdGlmIChjb250YWluc1Bvc2l0aXZlWSAmJiAhY29udGFpbnNOZWdhdGl2ZVkpIHtcblx0XHRheGlzWURhdGFJbmZvLm1heCA9IDk5O1xuXHRcdGF4aXNZRGF0YUluZm8ubWluID0gMTtcblx0fSBlbHNlIGlmIChjb250YWluc1Bvc2l0aXZlWSAmJiBjb250YWluc05lZ2F0aXZlWSkge1xuXHRcdGF4aXNZRGF0YUluZm8ubWF4ID0gOTk7XG5cdFx0YXhpc1lEYXRhSW5mby5taW4gPSAtOTk7XG5cdH0gZWxzZSBpZiAoIWNvbnRhaW5zUG9zaXRpdmVZICYmIGNvbnRhaW5zTmVnYXRpdmVZKSB7XG5cdFx0YXhpc1lEYXRhSW5mby5tYXggPSAtMTtcblx0XHRheGlzWURhdGFJbmZvLm1pbiA9IC05OTtcblx0fVxuXG5cdGF4aXNZRGF0YUluZm8udmlld1BvcnRNaW4gPSBheGlzWURhdGFJbmZvLm1pbjtcblx0YXhpc1lEYXRhSW5mby52aWV3UG9ydE1heCA9IGF4aXNZRGF0YUluZm8ubWF4O1xuXG5cdHBsb3RVbml0LmRhdGFQb2ludFlTdW1zID0gZGF0YVBvaW50WVN1bXM7XG5cblx0Ly90aGlzLmRhdGFQb2ludHMuc29ydChjb21wYXJlRGF0YVBvaW50WCk7XG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoZnVuY3Rpb24gKGRhdGFQb2ludDEsIGRhdGFQb2ludDIpIHsgcmV0dXJuIGRhdGFQb2ludDEueCAtIGRhdGFQb2ludDIueDsgfSk7XG5cblx0Ly93aW5kb3cuY29uc29sZS5sb2coXCJ2aWV3UG9ydFlNaW46IFwiICsgcGxvdEluZm8udmlld1BvcnRZTWluICsgXCI7IHZpZXdQb3J0WU1heDogXCIgKyBwbG90SW5mby52aWV3UG9ydFlNYXgpO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3Byb2Nlc3NNdWx0aVlQbG90VW5pdCA9IGZ1bmN0aW9uIChwbG90VW5pdCkge1xuXHRpZiAoIXBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzIHx8IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aCA8IDEpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBheGlzWURhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1kuZGF0YUluZm87XG5cdHZhciBheGlzWERhdGFJbmZvID0gcGxvdFVuaXQuYXhpc1guZGF0YUluZm87XG5cdHZhciBkYXRhUG9pbnRYLCBkYXRhUG9pbnRZLCBkYXRhUG9pbnRZTWluLCBkYXRhUG9pbnRZTWF4O1xuXHR2YXIgaXNEYXRlVGltZSA9IGZhbHNlO1xuXG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW3Bsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdXTtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIGlzRmlyc3REUEluVmlld1BvcnQgPSBmYWxzZTtcblx0XHR2YXIgaXNMYXN0RFBJblZpZXdQb3J0ID0gZmFsc2U7XG5cblx0XHRpZiAoZGF0YVNlcmllcy5heGlzUGxhY2VtZW50ID09PSBcIm5vcm1hbFwiIHx8IGRhdGFTZXJpZXMuYXhpc1BsYWNlbWVudCA9PT0gXCJ4eVN3YXBwZWRcIikge1xuXG5cdFx0XHR2YXIgcGxvdEFyZWFYTWluID0gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWluaW11bSA/IHRoaXMuc2Vzc2lvblZhcmlhYmxlcy5heGlzWC5uZXdWaWV3cG9ydE1pbmltdW0gOiAodGhpcy5fb3B0aW9ucy5heGlzWCAmJiB0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWluaW11bSkgP1xuXHRcdFx0XHR0aGlzLl9vcHRpb25zLmF4aXNYLnZpZXdwb3J0TWluaW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gubWluaW11bSkgPyB0aGlzLl9vcHRpb25zLmF4aXNYLm1pbmltdW0gOiAtSW5maW5pdHk7XG5cblx0XHRcdHZhciBwbG90QXJlYVhNYXggPSB0aGlzLnNlc3Npb25WYXJpYWJsZXMuYXhpc1gubmV3Vmlld3BvcnRNYXhpbXVtID8gdGhpcy5zZXNzaW9uVmFyaWFibGVzLmF4aXNYLm5ld1ZpZXdwb3J0TWF4aW11bSA6ICh0aGlzLl9vcHRpb25zLmF4aXNYICYmIHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNYXhpbXVtKSA/XG5cdFx0XHRcdHRoaXMuX29wdGlvbnMuYXhpc1gudmlld3BvcnRNYXhpbXVtIDogKHRoaXMuX29wdGlvbnMuYXhpc1ggJiYgdGhpcy5fb3B0aW9ucy5heGlzWC5tYXhpbXVtKSA/IHRoaXMuX29wdGlvbnMuYXhpc1gubWF4aW11bSA6IEluZmluaXR5O1xuXHRcdH1cblxuXG5cdFx0aWYgKGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54ICYmIGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS54LmdldFRpbWUgfHwgZGF0YVNlcmllcy54VmFsdWVUeXBlID09PSBcImRhdGVUaW1lXCIpIHtcblx0XHRcdGlzRGF0ZVRpbWUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0aWYgKHR5cGVvZiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueCA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueCA9IGk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKSB7XG5cdFx0XHRcdGlzRGF0ZVRpbWUgPSB0cnVlO1xuXHRcdFx0XHRkYXRhUG9pbnRYID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLnguZ2V0VGltZSgpOy8vZGF0YVBvaW50WCBpcyB1c2VkIHNvIHRoYXQgZ2V0VGltZSBpcyBjYWxsZWQgb25seSBvbmNlIGluIGNhc2Ugb2YgZGF0ZVRpbWUgdmFsdWVzXG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGRhdGFQb2ludFggPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0ZGF0YVBvaW50WSA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tpXS55O1xuXG5cdFx0XHRpZiAoZGF0YVBvaW50WSAmJiBkYXRhUG9pbnRZLmxlbmd0aCkge1xuXHRcdFx0XHRkYXRhUG9pbnRZTWluID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZGF0YVBvaW50WSk7XG5cdFx0XHRcdGRhdGFQb2ludFlNYXggPSBNYXRoLm1heC5hcHBseShudWxsLCBkYXRhUG9pbnRZKTtcblx0XHRcdH1cblxuXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA8IGF4aXNYRGF0YUluZm8ubWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1pbiA9IGRhdGFQb2ludFg7XG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IGF4aXNYRGF0YUluZm8ubWF4KVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLm1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZTWluIDwgYXhpc1lEYXRhSW5mby5taW4pXG5cdFx0XHRcdGF4aXNZRGF0YUluZm8ubWluID0gZGF0YVBvaW50WU1pbjtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFlNYXggPiBheGlzWURhdGFJbmZvLm1heClcblx0XHRcdFx0YXhpc1lEYXRhSW5mby5tYXggPSBkYXRhUG9pbnRZTWF4O1xuXG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHR2YXIgeERpZmYgPSBkYXRhUG9pbnRYIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS54O1xuXHRcdFx0XHR4RGlmZiA8IDAgJiYgKHhEaWZmID0geERpZmYgKiAtMSk7IC8vSWYgQ29uZGl0aW9uIHNob3J0Y3V0XG5cblx0XHRcdFx0aWYgKGF4aXNYRGF0YUluZm8ubWluRGlmZiA+IHhEaWZmICYmIHhEaWZmICE9PSAwKSB7XG5cdFx0XHRcdFx0YXhpc1hEYXRhSW5mby5taW5EaWZmID0geERpZmY7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WVswXSAhPT0gbnVsbCAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaSAtIDFdLnlbMF0gIT09IG51bGwpIHtcblx0XHRcdFx0XHR2YXIgeURpZmYgPSBkYXRhUG9pbnRZWzBdIC0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2kgLSAxXS55WzBdO1xuXHRcdFx0XHRcdHlEaWZmIDwgMCAmJiAoeURpZmYgPSB5RGlmZiAqIC0xKTsgLy9JZiBDb25kaXRpb24gc2hvcnRjdXRcblxuXHRcdFx0XHRcdGlmIChheGlzWURhdGFJbmZvLm1pbkRpZmYgPiB5RGlmZiAmJiB5RGlmZiAhPT0gMCkge1xuXHRcdFx0XHRcdFx0YXhpc1lEYXRhSW5mby5taW5EaWZmID0geURpZmY7XG5cdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYmVnaW5pbmdcblx0XHRcdGlmIChkYXRhUG9pbnRYIDwgcGxvdEFyZWFYTWluICYmICFpc0ZpcnN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIGlmICghaXNGaXJzdERQSW5WaWV3UG9ydCkge1xuXHRcdFx0XHRpc0ZpcnN0RFBJblZpZXdQb3J0ID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRpIC09IDI7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhpcyBzZWN0aW9uIG1ha2VzIHN1cmUgdGhhdCBwYXJ0aWFsbHkgdmlzaWJsZSBkYXRhUG9pbnRzIGFyZSBpbmNsdWRlZCBhdCB0aGUgZW5kXG5cdFx0XHRpZiAoZGF0YVBvaW50WCA+IHBsb3RBcmVhWE1heCAmJiAhaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGlzTGFzdERQSW5WaWV3UG9ydCA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFQb2ludFggPiBwbG90QXJlYVhNYXggJiYgaXNMYXN0RFBJblZpZXdQb3J0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGF0YVNlcmllcy5kYXRhUG9pbnRzW2ldLmxhYmVsKVxuXHRcdFx0XHRwbG90VW5pdC5heGlzWC5sYWJlbHNbZGF0YVBvaW50WF0gPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbaV0ubGFiZWw7XG5cblxuXHRcdFx0aWYgKGRhdGFQb2ludFggPCBheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWERhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WDtcblx0XHRcdGlmIChkYXRhUG9pbnRYID4gYXhpc1hEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1hEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFg7XG5cblx0XHRcdGlmIChkYXRhUG9pbnRZID09PSBudWxsKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0aWYgKGRhdGFQb2ludFlNaW4gPCBheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluKVxuXHRcdFx0XHRheGlzWURhdGFJbmZvLnZpZXdQb3J0TWluID0gZGF0YVBvaW50WU1pbjtcblx0XHRcdGlmIChkYXRhUG9pbnRZTWF4ID4gYXhpc1lEYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0YXhpc1lEYXRhSW5mby52aWV3UG9ydE1heCA9IGRhdGFQb2ludFlNYXg7XG5cdFx0fVxuXG5cdFx0dGhpcy5wbG90SW5mby5heGlzWFZhbHVlVHlwZSA9IGRhdGFTZXJpZXMueFZhbHVlVHlwZSA9IGlzRGF0ZVRpbWUgPyBcImRhdGVUaW1lXCIgOiBcIm51bWJlclwiO1xuXHR9XG5cblx0Ly90aGlzLmRhdGFQb2ludHMuc29ydChjb21wYXJlRGF0YVBvaW50WCk7XG5cdC8vdGhpcy5kYXRhUG9pbnRzLnNvcnQoZnVuY3Rpb24gKGRhdGFQb2ludDEsIGRhdGFQb2ludDIpIHsgcmV0dXJuIGRhdGFQb2ludDEueCAtIGRhdGFQb2ludDIueDsgfSk7XG59XG5cbi8vZ2V0Q2xvc2VzdCByZXR1cm5zIG9iamVjdHMgbmVhcmJ5IGFuZCBoZW5jZSBzaG91bGRuJ3QgYmUgdXNlZCBmb3IgZXZlbnRzIGxpa2UgY2xpY2ssIG1vdXNlb3ZlciwgbW91c2Vtb3ZlLCBldGMgd2hpY2ggcmVxdWlyZSBvYmplY3QgdGhhdCBpcyBleGFjdGx5IHVuZGVyIHRoZSBtb3VzZS5cbkNoYXJ0LnByb3RvdHlwZS5nZXREYXRhUG9pbnRBdFhZID0gZnVuY3Rpb24gKG1vdXNlWCwgbW91c2VZLCBnZXRDbG9zZXN0KSB7XG5cblx0Z2V0Q2xvc2VzdCA9IGdldENsb3Nlc3QgfHwgZmFsc2U7XG5cdHZhciByZXN1bHRzID0gW107XG5cblx0Zm9yICh2YXIgaSA9IHRoaXMuX2RhdGFJblJlbmRlcmVkT3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHR2YXIgZGF0YVNlcmllcyA9IHRoaXMuX2RhdGFJblJlbmRlcmVkT3JkZXJbaV07XG5cblx0XHR2YXIgcmVzdWx0ID0gbnVsbDtcblxuXHRcdHJlc3VsdCA9IGRhdGFTZXJpZXMuZ2V0RGF0YVBvaW50QXRYWShtb3VzZVgsIG1vdXNlWSwgZ2V0Q2xvc2VzdCk7XG5cdFx0aWYgKHJlc3VsdClcblx0XHRcdHJlc3VsdHMucHVzaChyZXN1bHQpO1xuXHR9XG5cblx0dmFyIGNsb3Nlc3RSZXN1bHQgPSBudWxsO1xuXHR2YXIgb25seUxpbmVBcmVhVHlwZXMgPSBmYWxzZTtcblxuXHRmb3IgKHZhciBtID0gMDsgbSA8IHJlc3VsdHMubGVuZ3RoOyBtKyspIHtcblxuXHRcdGlmIChyZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJsaW5lXCIgfHwgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCByZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJhcmVhXCIgfHwgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIikge1xuXHRcdFx0dmFyIG1hcmtlclNpemUgPSBnZXRQcm9wZXJ0eShcIm1hcmtlclNpemVcIiwgcmVzdWx0c1ttXS5kYXRhUG9pbnQsIHJlc3VsdHNbbV0uZGF0YVNlcmllcykgfHwgODtcblx0XHRcdGlmIChyZXN1bHRzW21dLmRpc3RhbmNlIDw9IG1hcmtlclNpemUgLyAyKSB7XG5cdFx0XHRcdG9ubHlMaW5lQXJlYVR5cGVzID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChtID0gMDsgbSA8IHJlc3VsdHMubGVuZ3RoOyBtKyspIHtcblxuXHRcdGlmIChvbmx5TGluZUFyZWFUeXBlcyAmJiByZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSAhPT0gXCJsaW5lXCIgJiYgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgIT09IFwic3RlcExpbmVcIiAmJiByZXN1bHRzW21dLmRhdGFTZXJpZXMudHlwZSAhPT0gXCJhcmVhXCIgJiYgcmVzdWx0c1ttXS5kYXRhU2VyaWVzLnR5cGUgIT09IFwic3RlcEFyZWFcIilcblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0aWYgKCFjbG9zZXN0UmVzdWx0KSB7XG5cdFx0XHRjbG9zZXN0UmVzdWx0ID0gcmVzdWx0c1ttXTtcblx0XHR9IGVsc2UgaWYgKHJlc3VsdHNbbV0uZGlzdGFuY2UgPD0gY2xvc2VzdFJlc3VsdC5kaXN0YW5jZSkge1xuXHRcdFx0Y2xvc2VzdFJlc3VsdCA9IHJlc3VsdHNbbV07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNsb3Nlc3RSZXN1bHQ7XG59XG5cbkNoYXJ0LnByb3RvdHlwZS5nZXRPYmplY3RBdFhZID0gZnVuY3Rpb24gKG1vdXNlWCwgbW91c2VZLCBnZXRDbG9zZXN0KSB7XG5cdGdldENsb3Nlc3QgPSBnZXRDbG9zZXN0IHx8IGZhbHNlO1xuXG5cdHZhciBpZCA9IG51bGw7XG5cblx0dmFyIGRhdGFQb2ludEluZm8gPSB0aGlzLmdldERhdGFQb2ludEF0WFkobW91c2VYLCBtb3VzZVksIGdldENsb3Nlc3QpO1xuXG5cdGlmIChkYXRhUG9pbnRJbmZvKSB7XG5cdFx0aWQgPSBkYXRhUG9pbnRJbmZvLmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2RhdGFQb2ludEluZm8uZGF0YVBvaW50SW5kZXhdO1xuXHR9IGVsc2UgaWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7Ly9JRTkrXG5cdFx0aWQgPSBnZXRPYmplY3RJZChtb3VzZVgsIG1vdXNlWSwgdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4KTtcblx0fVxuXHRlbHNlIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVnZW5kLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHRoaXMubGVnZW5kLml0ZW1zW2ldO1xuXG5cdFx0XHRpZiAobW91c2VYID49IGl0ZW0ueDEgJiYgbW91c2VYIDw9IGl0ZW0ueDIgJiYgbW91c2VZID49IGl0ZW0ueTEgJiYgbW91c2VZIDw9IGl0ZW0ueTIpIHtcblx0XHRcdFx0aWQgPSBpdGVtLmlkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpZDtcbn1cblxuLy8vIDxzdW1tYXJ5PkNhbGN1bGF0ZXMgRm9udCBTaXplIGJhc2VkIG9uIHN0YW5kYXJkU2l6ZSBhbmQgQ2hhcnQgU2l6ZTwvc3VtbWFyeT5cbi8vLyA8cGFyYW0gbmFtZT1cInN0YW5kYXJkU2l6ZVwiIHR5cGU9XCJOdW1iZXJcIj5TdGFuZGFyZCBmb250IHNpemUgZm9yIGEgQ2hhcnQgd2l0aCBtaW4od2lkdGgsaGVpZ2h0KSA9IDQwMHB4PC9wYXJhbT5cbi8vLyA8cmV0dXJucyB0eXBlPVwiTnVtYmVyXCI+VGhlIGFyZWEuPC9yZXR1cm5zPlxuQ2hhcnQucHJvdG90eXBlLmdldEF1dG9Gb250U2l6ZSA9IGZ1bmN0aW9uIChzdGFuZGFyZFNpemUsIHdpZHRoLCBoZWlnaHQpIHtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IHRoaXMud2lkdGg7XG5cdGhlaWdodCA9IGhlaWdodCB8fCB0aGlzLmhlaWdodDtcblxuXHR2YXIgZm9udFNpemVTY2FsZUZhY3RvciA9IHN0YW5kYXJkU2l6ZSAvIDQwMDtcblxuXHRyZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkgKiBmb250U2l6ZVNjYWxlRmFjdG9yKTtcbn1cblxuLy8jcmVnaW9uIEV2ZW50c1xuXG5DaGFydC5wcm90b3R5cGUucmVzZXRPdmVybGF5ZWRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG5cdC8vdmFyIHdpZHRoID0gdGhpcy5vdmVybGFpZENhbnZhcy53aWR0aDtcblx0Ly90aGlzLm92ZXJsYWlkQ2FudmFzLndpZHRoID0gMDtcblx0Ly90aGlzLm92ZXJsYWlkQ2FudmFzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMub3ZlcmxhaWRDYW52YXNDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLmNsZWFyQ2FudmFzID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXG5cdGlmICh0aGlzLmJhY2tncm91bmRDb2xvcikge1xuXHRcdHRoaXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuXHRcdHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0fVxufVxuXG5DaGFydC5wcm90b3R5cGUuYXR0YWNoRXZlbnQgPSBmdW5jdGlvbiAocGFyYW0pIHtcblx0dGhpcy5fZXZlbnRzLnB1c2gocGFyYW0pO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3RvdWNoRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG5cdGlmICghZXYuY2hhbmdlZFRvdWNoZXMgfHwgIXRoaXMuaW50ZXJhY3Rpdml0eUVuYWJsZWQpXG5cdFx0cmV0dXJuO1xuXG5cdHZhciBtb3VzZUV2ZW50cyA9IFtdO1xuXHR2YXIgdG91Y2hlcyA9IGV2LmNoYW5nZWRUb3VjaGVzO1xuXHR2YXIgZmlyc3QgPSB0b3VjaGVzID8gdG91Y2hlc1swXSA6IGV2O1xuXHR2YXIgdG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMgPSBudWxsO1xuXG5cdC8vd2luZG93LmNvbnNvbGUubG9nKHRvdWNoZXMubGVuZ3RoKTtcblxuXHRzd2l0Y2ggKGV2LnR5cGUpIHtcblx0XHRjYXNlIFwidG91Y2hzdGFydFwiOiBjYXNlIFwiTVNQb2ludGVyRG93blwiOlxuXHRcdFx0bW91c2VFdmVudHMgPSBbXCJtb3VzZW1vdmVcIiwgXCJtb3VzZWRvd25cIl07XG5cdFx0XHR0aGlzLl9sYXN0VG91Y2hEYXRhID0gZ2V0TW91c2VDb29yZGluYXRlcyhmaXJzdCk7XG5cdFx0XHR0aGlzLl9sYXN0VG91Y2hEYXRhLnRpbWUgPSBuZXcgRGF0ZSgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcInRvdWNobW92ZVwiOiBjYXNlIFwiTVNQb2ludGVyTW92ZVwiOiBtb3VzZUV2ZW50cyA9IFtcIm1vdXNlbW92ZVwiXTsgYnJlYWs7XG5cdFx0Y2FzZSBcInRvdWNoZW5kXCI6IGNhc2UgXCJNU1BvaW50ZXJVcFwiOiBtb3VzZUV2ZW50cyA9ICh0aGlzLl9sYXN0VG91Y2hFdmVudFR5cGUgPT09IFwidG91Y2hzdGFydFwiIHx8IHRoaXMuX2xhc3RUb3VjaEV2ZW50VHlwZSA9PT0gXCJNU1BvaW50ZXJEb3duXCIpID8gW1wibW91c2V1cFwiLCBcImNsaWNrXCJdIDogW1wibW91c2V1cFwiXTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHJldHVybjtcblx0fVxuXG5cdGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG5cblx0dG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMgPSBnZXRNb3VzZUNvb3JkaW5hdGVzKGZpcnN0KTtcblx0dG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMudGltZSA9IG5ldyBEYXRlKCk7XG5cdHRyeSB7XG5cdFx0dmFyIGR5ID0gdG91Y2hDdXJyZW50Q29vcmRpbmF0ZXMueSAtIHRoaXMuX2xhc3RUb3VjaERhdGEueTtcblx0XHR2YXIgZHggPSB0b3VjaEN1cnJlbnRDb29yZGluYXRlcy54IC0gdGhpcy5fbGFzdFRvdWNoRGF0YS54O1xuXHRcdHZhciBkdCA9IHRvdWNoQ3VycmVudENvb3JkaW5hdGVzLnRpbWUgLSB0aGlzLl9sYXN0VG91Y2hEYXRhLnRpbWU7XG5cblx0XHRpZiAoTWF0aC5hYnMoZHkpID4gMTUgJiYgKCEhdGhpcy5fbGFzdFRvdWNoRGF0YS5zY3JvbGwgfHwgZHQgPCAyMDApKSB7XG5cdFx0XHQvL3RoaXMuX2xhc3RUb3VjaERhdGEueSA9IHRvdWNoQ3VycmVudENvb3JkaW5hdGVzLnk7XG5cdFx0XHR0aGlzLl9sYXN0VG91Y2hEYXRhLnNjcm9sbCA9IHRydWU7XG5cblx0XHRcdHZhciB3aW4gPSB3aW5kb3cucGFyZW50IHx8IHdpbmRvdztcblx0XHRcdGlmICh3aW4gJiYgd2luLnNjcm9sbEJ5KVxuXHRcdFx0XHR3aW4uc2Nyb2xsQnkoMCwgLWR5KTtcblx0XHR9XG5cdH0gY2F0Y2ggKGUpIHsgfTtcblxuXHR0aGlzLl9sYXN0VG91Y2hFdmVudFR5cGUgPSBldi50eXBlO1xuXG5cdGlmICghIXRoaXMuX2xhc3RUb3VjaERhdGEuc2Nyb2xsICYmIHRoaXMuem9vbUVuYWJsZWQpIHtcblx0XHRpZiAodGhpcy5pc0RyYWcpXG5cdFx0XHR0aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG5cblx0XHR0aGlzLmlzRHJhZyA9IGZhbHNlO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbW91c2VFdmVudHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdHZhciB0eXBlID0gbW91c2VFdmVudHNbaV07XG5cdFx0dmFyIHNpbXVsYXRlZEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50XCIpO1xuXHRcdHNpbXVsYXRlZEV2ZW50LmluaXRNb3VzZUV2ZW50KHR5cGUsIHRydWUsIHRydWUsIHdpbmRvdywgMSxcblx0XHRcdFx0XHRcdFx0XHQgIGZpcnN0LnNjcmVlblgsIGZpcnN0LnNjcmVlblksXG5cdFx0XHRcdFx0XHRcdFx0ICBmaXJzdC5jbGllbnRYLCBmaXJzdC5jbGllbnRZLCBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHQgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuXG5cdFx0Zmlyc3QudGFyZ2V0LmRpc3BhdGNoRXZlbnQoc2ltdWxhdGVkRXZlbnQpO1xuXG5cdFx0aWYgKGV2LnByZXZlbnRNYW5pcHVsYXRpb24pIHtcblx0XHRcdC8vYWxlcnQoXCJwcmV2ZW50TWFuaXB1bGF0aW9uXCIpO1xuXHRcdFx0ZXYucHJldmVudE1hbmlwdWxhdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmIChldi5wcmV2ZW50RGVmYXVsdCkge1xuXHRcdFx0Ly9hbGVydChcInByZXZlbnREZWZhdWx0XCIpO1xuXHRcdFx0ZXYucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLl9kaXNwYXRjaFJhbmdlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCB0cmlnZ2VyU291cmNlKSB7XG5cdHZhciBldmVudFBhcmFtZXRlciA9IHt9O1xuXG5cdGV2ZW50UGFyYW1ldGVyLmNoYXJ0ID0gdGhpcy5fcHVibGljQ2hhcnRSZWZlcmVuY2U7XG5cdGV2ZW50UGFyYW1ldGVyLnR5cGUgPSBldmVudE5hbWU7XG5cdGV2ZW50UGFyYW1ldGVyLnRyaWdnZXIgPSB0cmlnZ2VyU291cmNlO1xuXG5cdHZhciBheGVzID0gW107XG5cblx0aWYgKHRoaXMuYXhpc1gpXG5cdFx0YXhlcy5wdXNoKFwiYXhpc1hcIik7XG5cdGlmICh0aGlzLmF4aXNZKVxuXHRcdGF4ZXMucHVzaChcImF4aXNZXCIpO1xuXHRpZiAodGhpcy5heGlzWTIpXG5cdFx0YXhlcy5wdXNoKFwiYXhpc1kyXCIpO1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7IGkrKykge1xuXHRcdGV2ZW50UGFyYW1ldGVyW2F4ZXNbaV1dID0ge1xuXHRcdFx0dmlld3BvcnRNaW5pbXVtOiB0aGlzW2F4ZXNbaV1dLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtLFxuXHRcdFx0dmlld3BvcnRNYXhpbXVtOiB0aGlzW2F4ZXNbaV1dLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNYXhpbXVtXG5cdFx0fVxuXHR9XG5cblx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50TmFtZSwgZXZlbnRQYXJhbWV0ZXIsIHRoaXMuX3B1YmxpY0NoYXJ0UmVmZXJlbmNlKTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLl9tb3VzZUV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChldikge1xuXG5cdGlmICghdGhpcy5pbnRlcmFjdGl2aXR5RW5hYmxlZClcblx0XHRyZXR1cm47XG5cblx0aWYgKHRoaXMuX2lnbm9yZU5leHRFdmVudCkge1xuXHRcdHRoaXMuX2lnbm9yZU5leHRFdmVudCA9IGZhbHNlO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIHN0b3AgcGFubmluZyBhbmQgem9vbWluZyBzbyB3ZSBjYW4gZHJhd1xuXHRpZiAoZXYucHJldmVudE1hbmlwdWxhdGlvbikge1xuXHRcdC8vYWxlcnQoXCJwcmV2ZW50TWFuaXB1bGF0aW9uXCIpO1xuXHRcdGV2LnByZXZlbnRNYW5pcHVsYXRpb24oKTtcblx0fVxuXG5cdC8vIHdlIGFyZSBoYW5kbGluZyB0aGlzIGV2ZW50XG5cdGlmIChldi5wcmV2ZW50RGVmYXVsdCkge1xuXHRcdC8vYWxlcnQoXCJwcmV2ZW50RGVmYXVsdFwiKTtcblx0XHRldi5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9XG5cblx0Ly9JRTgtIHVzZXMgc3JjRWxlbWVudCBpbnN0ZWFkIG9mIHRhcmdldC4gU28gaW5zdGVhZCBvZiBjaGVja2luZyB0aGlzIGNvbmRpdGlvbiBldmVyeXRpbWUsIGl0cyBiZXR0ZXIgdG8gY3JlYXRlIGEgcmVmZXJlbmNlIGNhbGxlZCB0YXJnZXQuXG5cdGlmICh0eXBlb2YgKGV2LnRhcmdldCkgPT09IFwidW5kZWZpbmVkXCIgJiYgZXYuc3JjRWxlbWVudClcblx0XHRldi50YXJnZXQgPSBldi5zcmNFbGVtZW50O1xuXG5cdC8vY29uc29sZS5sb2coZXYudHlwZSk7XG5cblx0dmFyIHh5ID0gZ2V0TW91c2VDb29yZGluYXRlcyhldik7XG5cdHZhciB0eXBlID0gZXYudHlwZTtcblx0dmFyIGV2ZW50UGFyYW07XG5cdHZhciByaWdodGNsaWNrO1xuXG5cdGlmICghZXYpIHZhciBlID0gd2luZG93LmV2ZW50O1xuXHRpZiAoZXYud2hpY2gpIHJpZ2h0Y2xpY2sgPSAoZXYud2hpY2ggPT0gMyk7XG5cdGVsc2UgaWYgKGV2LmJ1dHRvbikgcmlnaHRjbGljayA9IChldi5idXR0b24gPT0gMik7XG5cblx0Ly93aW5kb3cuY29uc29sZS5sb2codHlwZSArIFwiIC0tPiB4OiBcIiArIHh5LnggKyBcIjsgeTpcIiArIHh5LnkpO1xuXG5cdC8vaWYgKHR5cGUgPT09IFwibW91c2VvdXRcIikge1xuXHQvLyAgICB0aGlzLl90b29sVGlwLmhpZGUoKTtcblx0Ly99XG5cblx0aWYgKGlzRGVidWdNb2RlICYmIHdpbmRvdy5jb25zb2xlKSB7XG5cdFx0d2luZG93LmNvbnNvbGUubG9nKHR5cGUgKyBcIiAtLT4geDogXCIgKyB4eS54ICsgXCI7IHk6XCIgKyB4eS55KTtcblx0XHRpZiAocmlnaHRjbGljaylcblx0XHRcdHdpbmRvdy5jb25zb2xlLmxvZyhldi53aGljaCk7XG5cblx0XHRpZiAodHlwZSA9PT0gXCJtb3VzZXVwXCIpXG5cdFx0XHR3aW5kb3cuY29uc29sZS5sb2coXCJtb3VzZXVwXCIpO1xuXHR9XG5cblx0aWYgKHJpZ2h0Y2xpY2spXG5cdFx0cmV0dXJuO1xuXG5cdC8vaWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJ4eVN3YXBwZWRcIikge1xuXHQvLyAgICAvL3ZhciB0ZW1wID0geHkueDtcblx0Ly8gICAgLy94eS54ID0geHkueTtcblx0Ly8gICAgLy94eS55ID0gdGVtcDtcblx0Ly8gICAgeHkgPSB7eDogeHkueSwgeTogeHkueH07XG5cdC8vfVxuXG5cdGlmIChDaGFydC5jYXB0dXJlZEV2ZW50UGFyYW0pIHtcblx0XHRldmVudFBhcmFtID0gQ2hhcnQuY2FwdHVyZWRFdmVudFBhcmFtO1xuXG5cdFx0aWYgKHR5cGUgPT09IFwibW91c2V1cFwiKSB7XG5cdFx0XHRDaGFydC5jYXB0dXJlZEV2ZW50UGFyYW0gPSBudWxsO1xuXG5cdFx0XHRpZiAoZXZlbnRQYXJhbS5jaGFydC5vdmVybGFpZENhbnZhcy5yZWxlYXNlQ2FwdHVyZSlcblx0XHRcdFx0ZXZlbnRQYXJhbS5jaGFydC5vdmVybGFpZENhbnZhcy5yZWxlYXNlQ2FwdHVyZSgpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGV2ZW50UGFyYW0uY2hhcnQuX21vdXNlRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG5cblx0XHR9XG5cblx0XHRpZiAoZXZlbnRQYXJhbS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSlcblx0XHRcdGV2ZW50UGFyYW1bdHlwZV0uY2FsbChldmVudFBhcmFtLmNvbnRleHQsIHh5LngsIHh5LnkpO1xuXG5cblxuXHR9XG5cdGVsc2UgaWYgKHRoaXMuX2V2ZW50cykge1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9ldmVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICghdGhpcy5fZXZlbnRzW2ldLmhhc093blByb3BlcnR5KHR5cGUpKVxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0ZXZlbnRQYXJhbSA9IHRoaXMuX2V2ZW50c1tpXTtcblx0XHRcdHZhciBib3VuZHMgPSBldmVudFBhcmFtLmJvdW5kcztcblxuXHRcdFx0aWYgKHh5LnggPj0gYm91bmRzLngxICYmIHh5LnggPD0gYm91bmRzLngyICYmIHh5LnkgPj0gYm91bmRzLnkxICYmIHh5LnkgPD0gYm91bmRzLnkyKSB7XG5cdFx0XHRcdGV2ZW50UGFyYW1bdHlwZV0uY2FsbChldmVudFBhcmFtLmNvbnRleHQsIHh5LngsIHh5LnkpO1xuXG5cdFx0XHRcdGlmICh0eXBlID09PSBcIm1vdXNlZG93blwiICYmIGV2ZW50UGFyYW0uY2FwdHVyZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdENoYXJ0LmNhcHR1cmVkRXZlbnRQYXJhbSA9IGV2ZW50UGFyYW07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5vdmVybGFpZENhbnZhcy5zZXRDYXB0dXJlKVxuXHRcdFx0XHRcdFx0dGhpcy5vdmVybGFpZENhbnZhcy5zZXRDYXB0dXJlKCk7XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuX21vdXNlRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHQvL2FkZEV2ZW50KGRvY3VtZW50LmJvZHksIFwibW91c2V1cFwiLCB0aGlzLl9tb3VzZUV2ZW50SGFuZGxlcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IFwibW91c2V1cFwiKSB7XG5cdFx0XHRcdFx0aWYgKGV2ZW50UGFyYW0uY2hhcnQub3ZlcmxhaWRDYW52YXMucmVsZWFzZUNhcHR1cmUpXG5cdFx0XHRcdFx0XHRldmVudFBhcmFtLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLnJlbGVhc2VDYXB0dXJlKCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLl9tb3VzZUV2ZW50SGFuZGxlciwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGV2ZW50UGFyYW0gPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChldmVudFBhcmFtICYmIGV2ZW50UGFyYW0uY3Vyc29yKSB7XG5cdFx0XHRldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gZXZlbnRQYXJhbS5jdXJzb3I7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdGV2LnRhcmdldC5zdHlsZS5jdXJzb3IgPSB0aGlzLl9kZWZhdWx0Q3Vyc29yO1xuXG5cdFx0Ly9ldmVudFBhcmFtID1cblx0fVxuXG5cdGlmICh0aGlzLl90b29sVGlwICYmIHRoaXMuX3Rvb2xUaXAuZW5hYmxlZCkge1xuXG5cdFx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHRcdGlmICh4eS54IDwgcGxvdEFyZWEueDEgfHwgeHkueCA+IHBsb3RBcmVhLngyIHx8IHh5LnkgPCBwbG90QXJlYS55MSB8fCB4eS55ID4gcGxvdEFyZWEueTIpXG5cdFx0XHR0aGlzLl90b29sVGlwLmhpZGUoKTtcblx0fVxuXG5cblx0aWYgKCghdGhpcy5pc0RyYWcgfHwgIXRoaXMuem9vbUVuYWJsZWQpICYmIHRoaXMuX2V2ZW50TWFuYWdlcikge1xuXG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm1vdXNlRXZlbnRIYW5kbGVyKGV2KTtcblx0XHQvL3RoaXMuX3VwZGF0ZVRvb2xUaXAoZXYueCwgZXYueSk7XG5cdH1cblxuXHQvL2lmICh0aGlzLl90b29sVGlwLmVuYWJsZWQpXG5cdC8vICAgIHRoaXMuX3Rvb2xUaXAubW91c2VNb3ZlSGFuZGxlcihldi54LCBldi55KTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wbG90QXJlYU1vdXNlRG93biA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdHRoaXMuaXNEcmFnID0gdHJ1ZTtcblxuXHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ICE9PSBcIm5vbmVcIikge1xuXHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQgPSB7IHg6IHgsIHk6IHkgfTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLmRyYWdTdGFydFBvaW50ID0geyB4OiB4LCB5OiB5IH07XG5cdH1cbn1cblxuQ2hhcnQucHJvdG90eXBlLl9wbG90QXJlYU1vdXNlVXAgPSBmdW5jdGlvbiAoeCwgeSkge1xuXG5cdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwibm9ybWFsXCIgfHwgdGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0aWYgKHRoaXMuaXNEcmFnKSB7XG5cdFx0XHR2YXIgZHJhZ0RlbHRhID0gMCxcblx0XHRcdFx0ZHJhZ0RlbHRhUFkgPSB5IC0gdGhpcy5kcmFnU3RhcnRQb2ludC55LFxuXHRcdFx0XHRkcmFnRGVsdGFQWCA9IHggLSB0aGlzLmRyYWdTdGFydFBvaW50LngsXG5cdFx0XHRcdHpvb21QWCA9IHRoaXMuem9vbVR5cGUuaW5kZXhPZihcInhcIikgPj0gMCwgLy9XaGV0aGVyIHRvIHpvb20gaG9yaXpvbnRhbGx5XG5cdFx0XHRcdHpvb21QWSA9IHRoaXMuem9vbVR5cGUuaW5kZXhPZihcInlcIikgPj0gMCwgLy9XaGV0aGVyIHRvIHpvb20gdmVydGljYWxseVxuXHRcdFx0XHRyZVJlbmRlciA9IGZhbHNlO1xuXG5cdFx0XHR0aGlzLnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG5cblx0XHRcdGlmICh0aGlzLnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcblx0XHRcdFx0dmFyIHRlbXAgPSB6b29tUFk7XG5cdFx0XHRcdHpvb21QWSA9IHpvb21QWDtcblx0XHRcdFx0em9vbVBYID0gdGVtcDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMucGFuRW5hYmxlZCB8fCB0aGlzLnpvb21FbmFibGVkKSB7XG5cdFx0XHRcdGlmICh0aGlzLnBhbkVuYWJsZWQpIHtcblxuXHRcdFx0XHRcdHZhciBvdmVyZmxvdyA9IDA7XG5cblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2F4ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdHZhciBheGlzID0gdGhpcy5fYXhlc1tpXTtcblxuXHRcdFx0XHRcdFx0aWYgKGF4aXMudmlld3BvcnRNaW5pbXVtIDwgYXhpcy5taW5pbXVtKSB7XG5cblx0XHRcdFx0XHRcdFx0b3ZlcmZsb3cgPSBheGlzLm1pbmltdW0gLSBheGlzLnZpZXdwb3J0TWluaW11bTtcblxuXHRcdFx0XHRcdFx0XHRheGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtID0gYXhpcy52aWV3cG9ydE1pbmltdW0gKyBvdmVyZmxvdztcblx0XHRcdFx0XHRcdFx0YXhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IGF4aXMudmlld3BvcnRNYXhpbXVtICsgb3ZlcmZsb3c7XG5cblx0XHRcdFx0XHRcdHJlUmVuZGVyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYXhpcy52aWV3cG9ydE1heGltdW0gPiBheGlzLm1heGltdW0pIHtcblxuXHRcdFx0XHRcdFx0XHRvdmVyZmxvdyA9IGF4aXMudmlld3BvcnRNYXhpbXVtIC0gYXhpcy5tYXhpbXVtO1xuXHRcdFx0XHRcdFx0XHRheGlzLnNlc3Npb25WYXJpYWJsZXMubmV3Vmlld3BvcnRNaW5pbXVtID0gYXhpcy52aWV3cG9ydE1pbmltdW0gLSBvdmVyZmxvdztcblx0XHRcdFx0XHRcdFx0YXhpcy5zZXNzaW9uVmFyaWFibGVzLm5ld1ZpZXdwb3J0TWF4aW11bSA9IGF4aXMudmlld3BvcnRNYXhpbXVtIC0gb3ZlcmZsb3c7XG5cblx0XHRcdFx0XHRcdHJlUmVuZGVyID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoKCghem9vbVBYIHx8IE1hdGguYWJzKGRyYWdEZWx0YVBYKSA+IDIpICYmICghem9vbVBZIHx8IE1hdGguYWJzKGRyYWdEZWx0YVBZKSA+IDIpKSAmJiB0aGlzLnpvb21FbmFibGVkKSB7XG5cblx0XHRcdFx0XHRpZiAoIXRoaXMuZHJhZ1N0YXJ0UG9pbnQpXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRSZWdpb24gPSB7XG5cdFx0XHRcdFx0XHR4MTogem9vbVBYID8gdGhpcy5kcmFnU3RhcnRQb2ludC54IDogdGhpcy5wbG90QXJlYS54MSxcblx0XHRcdFx0XHRcdHkxOiB6b29tUFkgPyB0aGlzLmRyYWdTdGFydFBvaW50LnkgOiB0aGlzLnBsb3RBcmVhLnkxLFxuXHRcdFx0XHRcdFx0eDI6IHpvb21QWCA/IHggOiB0aGlzLnBsb3RBcmVhLngyLFxuXHRcdFx0XHRcdFx0eTI6IHpvb21QWSA/IHkgOiB0aGlzLnBsb3RBcmVhLnkyXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChNYXRoLmFicyhzZWxlY3RlZFJlZ2lvbi54MSAtIHNlbGVjdGVkUmVnaW9uLngyKSA+IDIgJiYgTWF0aC5hYnMoc2VsZWN0ZWRSZWdpb24ueTEgLSBzZWxlY3RlZFJlZ2lvbi55MikgPiAyKSB7XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLl96b29tUGFuVG9TZWxlY3RlZFJlZ2lvbihzZWxlY3RlZFJlZ2lvbi54MSwgc2VsZWN0ZWRSZWdpb24ueTEsIHNlbGVjdGVkUmVnaW9uLngyLCBzZWxlY3RlZFJlZ2lvbi55MikpIHtcblxuXHRcdFx0XHRcdFx0XHRyZVJlbmRlciA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVSZW5kZXIpIHtcblx0XHRcdFx0XHR0aGlzLl9pZ25vcmVOZXh0RXZlbnQgPSB0cnVlOy8vUmVxdWlyZWQgc28gdGhhdCBjbGljayBldmVudCBkb2Vzbid0IGZpcmUgYWZ0ZXIgem9vbWluZyBpbnRvIGEgc2VjdGlvbiBvZiB0aGUgY2hhcnQuXG5cblx0XHRcdFx0XHR0aGlzLl9kaXNwYXRjaFJhbmdlRXZlbnQoXCJyYW5nZUNoYW5naW5nXCIsIFwiem9vbVwiKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdFx0XHRcdHRoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdlZFwiLCBcInpvb21cIik7XG5cblx0XHRcdFx0XHRpZiAocmVSZW5kZXIgJiYgdGhpcy56b29tRW5hYmxlZCAmJiB0aGlzLl96b29tQnV0dG9uLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiKSB7XG5cdFx0XHRcdFx0c2hvdyh0aGlzLl96b29tQnV0dG9uLCB0aGlzLl9yZXNldEJ1dHRvbik7XG5cdFx0XHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fem9vbUJ1dHRvbiwgXCJwYW5cIik7XG5cdFx0XHRcdFx0c2V0QnV0dG9uU3RhdGUodGhpcywgdGhpcy5fcmVzZXRCdXR0b24sIFwicmVzZXRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLmlzRHJhZyA9IGZhbHNlO1xufVxuXG5DaGFydC5wcm90b3R5cGUuX3Bsb3RBcmVhTW91c2VNb3ZlID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0aWYgKHRoaXMuaXNEcmFnICYmIHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCAhPT0gXCJub25lXCIpIHtcblxuXHRcdHZhciBkcmFnRGVsdGFQWCA9IDAsXG5cdFx0XHRkcmFnRGVsdGFQWSA9IDAsXG5cdFx0XHRhbHBoYSA9IG51bGwsXG5cdFx0XHRzZWxlY3RlZFJlZ2lvbiA9IG51bGwsXG5cdFx0XHR6b29tUFggPSB0aGlzLnpvb21UeXBlLmluZGV4T2YoXCJ4XCIpID49IDAsIC8vV2hldGhlciB0byB6b29tIGhvcml6b250YWxseVxuXHRcdFx0em9vbVBZID0gdGhpcy56b29tVHlwZS5pbmRleE9mKFwieVwiKSA+PSAwLCAvL1doZXRoZXIgdG8gem9vbSB2ZXJ0aWNhbGx5XG5cdFx0XHRfdGhpcyA9IHRoaXM7XG5cblx0XHRpZiAodGhpcy5wbG90SW5mby5heGlzUGxhY2VtZW50ID09PSBcInh5U3dhcHBlZFwiKSB7XG5cdFx0XHR2YXIgdGVtcCA9IHpvb21QWTtcblx0XHRcdHpvb21QWSA9IHpvb21QWDtcblx0XHRcdHpvb21QWCA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0ZHJhZ0RlbHRhUFggPSB0aGlzLmRyYWdTdGFydFBvaW50LnggLSB4O1xuXHRcdGRyYWdEZWx0YVBZID0gdGhpcy5kcmFnU3RhcnRQb2ludC55IC0geTtcblxuXHRcdGlmIChNYXRoLmFicyhkcmFnRGVsdGFQWCkgPiAyICYmIE1hdGguYWJzKGRyYWdEZWx0YVBYKSA8IDggJiYgKHRoaXMucGFuRW5hYmxlZCB8fCB0aGlzLnpvb21FbmFibGVkKSkge1xuXHRcdFx0dGhpcy5fdG9vbFRpcC5oaWRlKCk7XG5cdFx0fSBlbHNlIGlmICghdGhpcy5wYW5FbmFibGVkICYmICF0aGlzLnpvb21FbmFibGVkKSB7XG5cdFx0XHR0aGlzLl90b29sVGlwLm1vdXNlTW92ZUhhbmRsZXIoeCwgeSk7XG5cdFx0fVxuXG5cdFx0aWYgKCgoIXpvb21QWCB8fCBNYXRoLmFicyhkcmFnRGVsdGFQWCkgPiAyKSB8fCAoIXpvb21QWSB8fCBNYXRoLmFicyhkcmFnRGVsdGFQWSkgPiAyKSkgJiYgKHRoaXMucGFuRW5hYmxlZCB8fCB0aGlzLnpvb21FbmFibGVkKSkge1xuXHRcdFx0aWYgKHRoaXMucGFuRW5hYmxlZCkge1xuXG5cdFx0XHRcdHNlbGVjdGVkUmVnaW9uID1cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR4MTogem9vbVBYID8gdGhpcy5wbG90QXJlYS54MSArIGRyYWdEZWx0YVBYIDogdGhpcy5wbG90QXJlYS54MSxcblx0XHRcdFx0XHRcdHkxOiB6b29tUFkgPyB0aGlzLnBsb3RBcmVhLnkxICsgZHJhZ0RlbHRhUFkgOiB0aGlzLnBsb3RBcmVhLnkxLFxuXHRcdFx0XHRcdFx0eDI6IHpvb21QWCA/IHRoaXMucGxvdEFyZWEueDIgKyBkcmFnRGVsdGFQWCA6IHRoaXMucGxvdEFyZWEueDIsXG5cdFx0XHRcdFx0XHR5Mjogem9vbVBZID8gdGhpcy5wbG90QXJlYS55MiArIGRyYWdEZWx0YVBZIDogdGhpcy5wbG90QXJlYS55MlxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKHRoaXMuX3pvb21QYW5Ub1NlbGVjdGVkUmVnaW9uKHNlbGVjdGVkUmVnaW9uLngxLCBzZWxlY3RlZFJlZ2lvbi55MSwgc2VsZWN0ZWRSZWdpb24ueDIsIHNlbGVjdGVkUmVnaW9uLnkyLCB0cnVlKSkge1xuXHRcdFx0XHRcdHRoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdpbmdcIiwgXCJwYW5cIik7XG5cdFx0XHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHRcdFx0XHR0aGlzLl9kaXNwYXRjaFJhbmdlRXZlbnQoXCJyYW5nZUNoYW5nZWRcIiwgXCJwYW5cIik7XG5cblx0XHRcdFx0XHR0aGlzLmRyYWdTdGFydFBvaW50LnggPSB4O1xuXHRcdFx0XHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQueSA9IHk7XG5cblx0XHRcdFx0XHQvL2NsZWFyVGltZW91dCh0aGlzLl9wYW5UaW1lcklkKTtcblx0XHRcdFx0XHQvL3RoaXMuX3BhblRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvL1x0X3RoaXMuX2Rpc3BhdGNoUmFuZ2VFdmVudChcInJhbmdlQ2hhbmdpbmdcIiwgXCJwYW5cIik7XG5cdFx0XHRcdFx0Ly9cdF90aGlzLnJlbmRlcigpO1xuXHRcdFx0XHRcdC8vXHRfdGhpcy5fZGlzcGF0Y2hSYW5nZUV2ZW50KFwicmFuZ2VDaGFuZ2VkXCIsIFwicGFuXCIpO1xuXHRcdFx0XHRcdC8vfSwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnpvb21FbmFibGVkKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNldE92ZXJsYXllZENhbnZhcygpO1xuXG5cdFx0XHRcdGFscGhhID0gdGhpcy5vdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYTtcblxuXHRcdFx0XHR0aGlzLm92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gLjc7XG5cdFx0XHRcdHRoaXMub3ZlcmxhaWRDYW52YXNDdHguZmlsbFN0eWxlID0gXCIjQTBBQkI4XCI7XG5cblx0XHRcdFx0dmFyIHJlY3QgPSB7XG5cdFx0XHRcdFx0eDE6IHpvb21QWCA/IHRoaXMuZHJhZ1N0YXJ0UG9pbnQueCA6IHRoaXMucGxvdEFyZWEueDEsXG5cdFx0XHRcdFx0eTE6IHpvb21QWSA/IHRoaXMuZHJhZ1N0YXJ0UG9pbnQueSA6IHRoaXMucGxvdEFyZWEueTEsXG5cdFx0XHRcdFx0eDI6IHpvb21QWCA/IHggLSB0aGlzLmRyYWdTdGFydFBvaW50LnggOiB0aGlzLnBsb3RBcmVhLngyIC0gdGhpcy5wbG90QXJlYS54MSxcblx0XHRcdFx0XHR5Mjogem9vbVBZID8geSAtIHRoaXMuZHJhZ1N0YXJ0UG9pbnQueSA6IHRoaXMucGxvdEFyZWEueTIgLSB0aGlzLnBsb3RBcmVhLnkxXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5vdmVybGFpZENhbnZhc0N0eC5maWxsUmVjdChyZWN0LngxLCByZWN0LnkxLCByZWN0LngyLCByZWN0LnkyKTtcblxuXHRcdFx0XHR0aGlzLm92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gZWxzZVxuXHRcdHRoaXMuX3Rvb2xUaXAubW91c2VNb3ZlSGFuZGxlcih4LCB5KTtcbn1cblxuLy8jZW5kcmVnaW9uIEV2ZW50c1xuXG4vL1NldHMgdGhlIHZpZXdwb3J0IHJhbmdlIG9mIEF4aXMgYmFzZWQgb24gdGhlIGdpdmVuIHJlY3QgYm91bmRzIChwaXhlbHMpLiBBbHNvIGxpbWl0cyB0aGUgem9vbWluZy9wYW5uaW5nIGJhc2VkIG9uIGF4aXMgYm91bmRzLiBSZXR1cm5zIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IHdhcyBzdWNjZXNmdWwgb3Igbm90IGJhc2VkIG9uIHRoZSBzZWxlY3RlZCByZWdpb24uXG5DaGFydC5wcm90b3R5cGUuX3pvb21QYW5Ub1NlbGVjdGVkUmVnaW9uID0gZnVuY3Rpb24gKHB4MSwgcHkxLCBweDIsIHB5Miwga2VlcEF4aXNJbmRlcGVuZGVudCkge1xuXG5cdGtlZXBBeGlzSW5kZXBlbmRlbnQgPSBrZWVwQXhpc0luZGVwZW5kZW50IHx8IGZhbHNlO1xuXG5cdHZhciB6b29tUFggPSB0aGlzLnpvb21UeXBlLmluZGV4T2YoXCJ4XCIpID49IDAsIC8vV2hldGhlciB0byB6b29tIGhvcml6b250YWxseVxuXHRcdHpvb21QWSA9IHRoaXMuem9vbVR5cGUuaW5kZXhPZihcInlcIikgPj0gMCwgLy9XaGV0aGVyIHRvIHpvb20gdmVydGljYWxseVxuXHRcdHZhbGlkUmVnaW9uID0gZmFsc2U7XG5cblx0dmFyIGF4ZXMgPSBbXSwgYXhlc1dpdGhWYWxpZFJhbmdlID0gW107XG5cdGlmICh0aGlzLmF4aXNYICYmIHpvb21QWClcblx0XHRheGVzLnB1c2godGhpcy5heGlzWCk7XG5cdGlmICh0aGlzLmF4aXNZICYmIHpvb21QWSlcblx0XHRheGVzLnB1c2godGhpcy5heGlzWSk7XG5cdGlmICh0aGlzLmF4aXNZMiAmJiB6b29tUFkpXG5cdFx0YXhlcy5wdXNoKHRoaXMuYXhpc1kyKTtcblxuXHR2YXIgcGFyYW1zID0gW107XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBheGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGF4aXMgPSBheGVzW2ldO1xuXHRcdC8vdmFyIHJhbmdlID0gTWF0aC5hYnMoYXhpcy52aWV3cG9ydE1heGltdW0gLSBheGlzLnZpZXdwb3J0TWluaW11bSk7XG5cblx0XHR2YXIgdmFsMSA9IGF4aXMuY29udmVydFBpeGVsVG9WYWx1ZSh7IHg6IHB4MSwgeTogcHkxIH0pO1xuXHRcdHZhciB2YWwyID0gYXhpcy5jb252ZXJ0UGl4ZWxUb1ZhbHVlKHsgeDogcHgyLCB5OiBweTIgfSk7XG5cblx0XHRpZiAodmFsMSA+IHZhbDIpIHtcblx0XHRcdHZhciB0ZW1wID0gdmFsMjtcblx0XHRcdHZhbDIgPSB2YWwxO1xuXHRcdFx0dmFsMSA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0aWYgKGlzRmluaXRlKGF4aXMuZGF0YUluZm8ubWluRGlmZikpIHtcblx0XHRcdGlmICghKE1hdGguYWJzKHZhbDIgLSB2YWwxKSA8IDMgKiBNYXRoLmFicyhheGlzLmRhdGFJbmZvLm1pbkRpZmYpXG5cdFx0XHR8fCAodmFsMSA8IGF4aXMubWluaW11bSkgfHwgKHZhbDIgPiBheGlzLm1heGltdW0pKSkge1xuXHRcdFx0XHRheGVzV2l0aFZhbGlkUmFuZ2UucHVzaChheGlzKTtcblx0XHRcdFx0cGFyYW1zLnB1c2goeyB2YWwxOiB2YWwxLCB2YWwyOiB2YWwyIH0pO1xuXG5cdFx0XHRcdHZhbGlkUmVnaW9uID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIWtlZXBBeGlzSW5kZXBlbmRlbnQpIHtcblx0XHRcdFx0dmFsaWRSZWdpb24gPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKHZhbGlkUmVnaW9uKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBheGVzV2l0aFZhbGlkUmFuZ2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBheGlzID0gYXhlc1dpdGhWYWxpZFJhbmdlW2ldO1xuXHRcdFx0dmFyIHBhcmFtID0gcGFyYW1zW2ldO1xuXG5cdFx0XHRheGlzLnNldFZpZXdQb3J0UmFuZ2UocGFyYW0udmFsMSwgcGFyYW0udmFsMik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbGlkUmVnaW9uO1xufVxuXG5DaGFydC5wcm90b3R5cGUucHJlcGFyZVBsb3RBcmVhID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0dmFyIHlBeGlzID0gdGhpcy5heGlzWSA/IHRoaXMuYXhpc1kgOiB0aGlzLmF4aXNZMjtcblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkICYmIChwbG90QXJlYS54MSA+IDAgfHwgcGxvdEFyZWEueTEgPiAwKSkge1xuXHRcdHBsb3RBcmVhLmN0eC50cmFuc2xhdGUocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxKTtcblx0fVxuXG5cdGlmICh0aGlzLmF4aXNYICYmIHlBeGlzKSB7XG5cdFx0cGxvdEFyZWEueDEgPSB0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy54MSA8IHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyID8gdGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEgOiB5QXhpcy5saW5lQ29vcmRpbmF0ZXMueDE7XG5cdFx0cGxvdEFyZWEueTEgPSAodGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTEgPCB5QXhpcy5saW5lQ29vcmRpbmF0ZXMueTEgPyB0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MSA6IHlBeGlzLmxpbmVDb29yZGluYXRlcy55MSk7XG5cblx0XHRwbG90QXJlYS54MiA9ICh0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy54MiA+IHlBeGlzLmxpbmVDb29yZGluYXRlcy54MiA/IHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLngyIDogeUF4aXMubGluZUNvb3JkaW5hdGVzLngyKTtcblx0XHRwbG90QXJlYS55MiA9IHRoaXMuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyID4gdGhpcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMueTEgPyB0aGlzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MiA6IHlBeGlzLmxpbmVDb29yZGluYXRlcy55MjtcblxuXHRcdHBsb3RBcmVhLndpZHRoID0gcGxvdEFyZWEueDIgLSBwbG90QXJlYS54MTtcblx0XHRwbG90QXJlYS5oZWlnaHQgPSBwbG90QXJlYS55MiAtIHBsb3RBcmVhLnkxO1xuXHRcdC8vcGxvdEFyZWEgPSB7IHgxOiB4MSwgeTE6IHkxLCB4MjogeDIsIHkyOiB5Miwgd2lkdGg6IHgyIC0geDEsIGhlaWdodDogeTIgLSB5MSB9O1xuXHR9IGVsc2Uge1xuXHRcdC8vVG9EbzogQHN1bmlsXG5cdFx0dmFyIGZyZWVTcGFjZSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcblx0XHRwbG90QXJlYS54MSA9IGZyZWVTcGFjZS54MTtcblx0XHRwbG90QXJlYS54MiA9IGZyZWVTcGFjZS54Mjtcblx0XHRwbG90QXJlYS55MSA9IGZyZWVTcGFjZS55MTtcblx0XHRwbG90QXJlYS55MiA9IGZyZWVTcGFjZS55MjtcblxuXHRcdHBsb3RBcmVhLndpZHRoID0gZnJlZVNwYWNlLndpZHRoO1xuXHRcdHBsb3RBcmVhLmhlaWdodCA9IGZyZWVTcGFjZS5oZWlnaHQ7XG5cdH1cblxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cblx0XHRwbG90QXJlYS5jYW52YXMud2lkdGggPSBwbG90QXJlYS53aWR0aDtcblx0XHRwbG90QXJlYS5jYW52YXMuaGVpZ2h0ID0gcGxvdEFyZWEuaGVpZ2h0O1xuXG5cdFx0cGxvdEFyZWEuY2FudmFzLnN0eWxlLmxlZnQgPSBwbG90QXJlYS54MSArIFwicHhcIjtcblx0XHRwbG90QXJlYS5jYW52YXMuc3R5bGUudG9wID0gcGxvdEFyZWEueTEgKyBcInB4XCI7XG5cblx0XHRpZiAocGxvdEFyZWEueDEgPiAwIHx8IHBsb3RBcmVhLnkxID4gMCkge1xuXHRcdFx0cGxvdEFyZWEuY3R4LnRyYW5zbGF0ZSgtcGxvdEFyZWEueDEsIC1wbG90QXJlYS55MSk7XG5cdFx0fVxuXHR9XG5cblx0cGxvdEFyZWEubGF5b3V0TWFuYWdlciA9IG5ldyBMYXlvdXRNYW5hZ2VyKHBsb3RBcmVhLngxLCBwbG90QXJlYS55MSwgcGxvdEFyZWEueDIsIHBsb3RBcmVhLnkyLCAyKTtcbn1cblxuQ2hhcnQucHJvdG90eXBlLmdldFBpeGVsQ29vcmRpbmF0ZXNPblBsb3RBcmVhID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0cmV0dXJuIHtcblx0XHR4OiB0aGlzLmF4aXNYLmdldFBpeGVsQ29vcmRpbmF0ZXNPbkF4aXMoeCkueCwgeTogdGhpcy5heGlzWS5nZXRQaXhlbENvb3JkaW5hdGVzT25BeGlzKHkpLnlcblx0fVxuXHQvL3JldHVybiB7IHg6IDUsIHk6IDEwIH07XG59XG5cbi8vI3JlZ2lvbiBSZW5kZXIgTWV0aG9kc1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVySW5kZXhMYWJlbHMgPSBmdW5jdGlvbiAodGFyZ2V0Q3R4KSB7XG5cdHZhciBjdHggPSB0YXJnZXRDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHBsb3RBcmVhID0gdGhpcy5wbG90QXJlYTtcblxuXHR2YXIgbWlkID0gMDtcblx0dmFyIHlNaW5MaW1pdCA9IDA7XG5cdHZhciB5TWF4TGltaXQgPSAwO1xuXHR2YXIgeE1pbkxpbWl0ID0gMDtcblx0dmFyIHhNYXhMaW1pdCA9IDA7XG5cdHZhciBtYXJnaW5YID0gMCwgbWFyZ2luWSA9IDA7IC8vIE1hcmdpbiBiZXR3ZWVuIGxhYmVsIGFuZCBkYXRhUG9pbnQgLyBQbG90QXJlYVxuXHR2YXIgb2ZmU2V0WCA9IDAsIG9mZlNldFkgPSAwOyAvLyBEaXN0YW5jZSB0byBvZmZTZXQgdGV4dEJsb2NrICh0b3ApIGZyb20gZGF0YVBvaW50IGlub3JkZXIgdG8gcG9zaXRpb24gaXRcblx0dmFyIHZpc2libGVXaWR0aCA9IDA7XG5cdHZhciB2aXNpYmxlSGVpZ2h0ID0gMDtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2luZGV4TGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHR2YXIgaW5kZXhMYWJlbCA9IHRoaXMuX2luZGV4TGFiZWxzW2ldO1xuXHRcdHZhciBjaGFydFR5cGVMb3dlciA9IGluZGV4TGFiZWwuY2hhcnRUeXBlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHR2YXIgeCwgeSwgYW5nbGU7XG5cblx0XHR2YXIgZm9udENvbG9yID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udENvbG9yXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBmb250U2l6ZSA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbEZvbnRTaXplXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBmb250RmFtaWx5ID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udEZhbWlseVwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgZm9udFN0eWxlID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udFN0eWxlXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBmb250V2VpZ2h0ID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsRm9udFdlaWdodFwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgYmFja2dyb3VuZENvbG9yID0gZ2V0UHJvcGVydHkoXCJpbmRleExhYmVsQmFja2dyb3VuZENvbG9yXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBtYXhXaWR0aCA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbE1heFdpZHRoXCIsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMpO1xuXHRcdHZhciBpbmRleExhYmVsV3JhcCA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbFdyYXBcIiwgaW5kZXhMYWJlbC5kYXRhUG9pbnQsIGluZGV4TGFiZWwuZGF0YVNlcmllcyk7XG5cblx0XHR2YXIgcGVyY2VudEFuZFRvdGFsID0ge1xuXHRcdFx0cGVyY2VudDogbnVsbCwgdG90YWw6IG51bGxcblx0XHR9O1xuXHRcdHZhciBmb3JtYXR0ZXJQYXJhbWV0ZXIgPSBudWxsO1xuXG5cdFx0aWYgKGluZGV4TGFiZWwuZGF0YVNlcmllcy50eXBlLmluZGV4T2YoXCJzdGFja2VkXCIpID49IDAgfHwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgfHwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzLnR5cGUgPT09IFwiZG91Z2hudXRcIilcblx0XHRcdHBlcmNlbnRBbmRUb3RhbCA9IHRoaXMuZ2V0UGVyY2VudEFuZFRvdGFsKGluZGV4TGFiZWwuZGF0YVNlcmllcywgaW5kZXhMYWJlbC5kYXRhUG9pbnQpO1xuXG5cdFx0aWYgKGluZGV4TGFiZWwuZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGluZGV4TGFiZWwuZGF0YVBvaW50LmluZGV4TGFiZWxGb3JtYXR0ZXIpXG5cdFx0XHRmb3JtYXR0ZXJQYXJhbWV0ZXIgPSB7XG5cdFx0XHRcdGNoYXJ0OiB0aGlzLl9vcHRpb25zLCBkYXRhU2VyaWVzOiBpbmRleExhYmVsLmRhdGFTZXJpZXMsIGRhdGFQb2ludDogaW5kZXhMYWJlbC5kYXRhUG9pbnQsIGluZGV4OiBpbmRleExhYmVsLmluZGV4S2V5d29yZCwgdG90YWw6IHBlcmNlbnRBbmRUb3RhbC50b3RhbCwgcGVyY2VudDogcGVyY2VudEFuZFRvdGFsLnBlcmNlbnRcblx0XHRcdH07XG5cblxuXHRcdHZhciBpbmRleExhYmVsVGV4dCA9IGluZGV4TGFiZWwuZGF0YVBvaW50LmluZGV4TGFiZWxGb3JtYXR0ZXIgPyBpbmRleExhYmVsLmRhdGFQb2ludC5pbmRleExhYmVsRm9ybWF0dGVyKGZvcm1hdHRlclBhcmFtZXRlcilcblx0XHRcdDogaW5kZXhMYWJlbC5kYXRhUG9pbnQuaW5kZXhMYWJlbCA/IHRoaXMucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKGluZGV4TGFiZWwuZGF0YVBvaW50LmluZGV4TGFiZWwsIGluZGV4TGFiZWwuZGF0YVBvaW50LCBpbmRleExhYmVsLmRhdGFTZXJpZXMsIG51bGwsIGluZGV4TGFiZWwuaW5kZXhLZXl3b3JkKVxuXHRcdFx0OiBpbmRleExhYmVsLmRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlciA/IGluZGV4TGFiZWwuZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKGZvcm1hdHRlclBhcmFtZXRlcilcblx0XHRcdDogaW5kZXhMYWJlbC5kYXRhU2VyaWVzLmluZGV4TGFiZWwgPyB0aGlzLnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZShpbmRleExhYmVsLmRhdGFTZXJpZXMuaW5kZXhMYWJlbCwgaW5kZXhMYWJlbC5kYXRhUG9pbnQsIGluZGV4TGFiZWwuZGF0YVNlcmllcywgbnVsbCwgaW5kZXhMYWJlbC5pbmRleEtleXdvcmQpIDogbnVsbDtcblxuXHRcdGlmIChpbmRleExhYmVsVGV4dCA9PT0gbnVsbCB8fCBpbmRleExhYmVsVGV4dCA9PT0gXCJcIilcblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0dmFyIHBsYWNlbWVudCA9IGdldFByb3BlcnR5KFwiaW5kZXhMYWJlbFBsYWNlbWVudFwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgb3JpZW50YXRpb24gPSBnZXRQcm9wZXJ0eShcImluZGV4TGFiZWxPcmllbnRhdGlvblwiLCBpbmRleExhYmVsLmRhdGFQb2ludCwgaW5kZXhMYWJlbC5kYXRhU2VyaWVzKTtcblx0XHR2YXIgYW5nbGUgPSAwO1xuXG5cdFx0dmFyIGRpcmVjdGlvbiA9IGluZGV4TGFiZWwuZGlyZWN0aW9uOyAvLyArMSBmb3IgYWJvdmUgdGhlIHBvaW50IGFuZCAtMSBmb3IgYmVsb3cgdGhlIHBvaW50XG5cblx0XHR2YXIgYXhpc1ggPSBpbmRleExhYmVsLmRhdGFTZXJpZXMuYXhpc1g7XG5cdFx0dmFyIGF4aXNZID0gaW5kZXhMYWJlbC5kYXRhU2VyaWVzLmF4aXNZO1xuXG5cblx0XHR2YXIgdGV4dEJsb2NrID0gbmV3IFRleHRCbG9jayhjdHgsIHtcblx0XHRcdHg6IDAsXG5cdFx0XHR5OiAwLFxuXHRcdFx0bWF4V2lkdGg6IG1heFdpZHRoID8gbWF4V2lkdGggOiB0aGlzLndpZHRoICogLjUsXG5cdFx0XHRtYXhIZWlnaHQ6IGluZGV4TGFiZWxXcmFwID8gZm9udFNpemUgKiA1IDogZm9udFNpemUgKiAxLjUsXG5cdFx0XHRhbmdsZTogb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiID8gMCA6IC05MCxcblx0XHRcdHRleHQ6IGluZGV4TGFiZWxUZXh0LFxuXHRcdFx0cGFkZGluZzogMCxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuXHRcdFx0aG9yaXpvbnRhbEFsaWduOiBcImxlZnRcIiwvL2xlZnQsIGNlbnRlciwgcmlnaHRcblx0XHRcdGZvbnRTaXplOiBmb250U2l6ZSwvL2luIHBpeGVsc1xuXHRcdFx0Zm9udEZhbWlseTogZm9udEZhbWlseSxcblx0XHRcdGZvbnRXZWlnaHQ6IGZvbnRXZWlnaHQsIC8vbm9ybWFsLCBib2xkLCBib2xkZXIsIGxpZ2h0ZXIsXG5cdFx0XHRmb250Q29sb3I6IGZvbnRDb2xvcixcblx0XHRcdGZvbnRTdHlsZTogZm9udFN0eWxlLCAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuXHRcdFx0dGV4dEJhc2VsaW5lOiBcInRvcFwiXG5cdFx0fSk7XG5cblx0XHR2YXIgdGV4dFNpemUgPSB0ZXh0QmxvY2subWVhc3VyZVRleHQoKTtcblxuXHRcdC8vaWYgKGluZGV4TGFiZWwuZGF0YVBvaW50LnggPCBheGlzWC52aWV3cG9ydE1pbmltdW0gfHwgaW5kZXhMYWJlbC5kYXRhUG9pbnQueCA+IGF4aXNYLnZpZXdwb3J0TWF4aW11bSB8fCBpbmRleExhYmVsLmRhdGFQb2ludC55IDwgYXhpc1kudmlld3BvcnRNaW5pbXVtIHx8IGluZGV4TGFiZWwuZGF0YVBvaW50LnkgPiBheGlzWS52aWV3cG9ydE1heGltdW0pXG5cdFx0Ly9cdGNvbnRpbnVlO1xuXG5cdFx0aWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJsaW5lXCIpID49IDAgfHwgY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcImFyZWFcIikgPj0gMFxuXHRcdFx0XHR8fCBjaGFydFR5cGVMb3dlci5pbmRleE9mKFwiYnViYmxlXCIpID49IDAgfHwgY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcInNjYXR0ZXJcIikgPj0gMCkge1xuXG5cdFx0XHRpZiAoaW5kZXhMYWJlbC5kYXRhUG9pbnQueCA8IGF4aXNYLnZpZXdwb3J0TWluaW11bSB8fCBpbmRleExhYmVsLmRhdGFQb2ludC54ID4gYXhpc1gudmlld3BvcnRNYXhpbXVtIHx8IGluZGV4TGFiZWwuZGF0YVBvaW50LnkgPCBheGlzWS52aWV3cG9ydE1pbmltdW0gfHwgaW5kZXhMYWJlbC5kYXRhUG9pbnQueSA+IGF4aXNZLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKGluZGV4TGFiZWwuZGF0YVBvaW50LnggPCBheGlzWC52aWV3cG9ydE1pbmltdW0gfHwgaW5kZXhMYWJlbC5kYXRhUG9pbnQueCA+IGF4aXNYLnZpZXdwb3J0TWF4aW11bSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0bWFyZ2luWSA9IDI7XG5cdFx0bWFyZ2luWCA9IDI7XG5cblx0XHRpZiAob3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiKSB7XG5cdFx0XHR2aXNpYmxlV2lkdGggPSB0ZXh0QmxvY2sud2lkdGg7XG5cdFx0XHR2aXNpYmxlSGVpZ2h0ID0gdGV4dEJsb2NrLmhlaWdodDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmlzaWJsZUhlaWdodCA9IHRleHRCbG9jay53aWR0aDtcblx0XHRcdHZpc2libGVXaWR0aCA9IHRleHRCbG9jay5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucGxvdEluZm8uYXhpc1BsYWNlbWVudCA9PT0gXCJub3JtYWxcIikge1xuXG5cdFx0XHRpZiAoY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcImxpbmVcIikgPj0gMCB8fCBjaGFydFR5cGVMb3dlci5pbmRleE9mKFwiYXJlYVwiKSA+PSAwKSB7XG5cblx0XHRcdFx0cGxhY2VtZW50ID0gXCJhdXRvXCI7XG5cdFx0XHRcdG1hcmdpblkgPSA0O1xuXG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJzdGFja2VkXCIpID49IDApIHtcblxuXHRcdFx0XHRpZiAocGxhY2VtZW50ID09PSBcImF1dG9cIilcblx0XHRcdFx0XHRwbGFjZW1lbnQgPSBcImluc2lkZVwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJ0VHlwZUxvd2VyID09PSBcImJ1YmJsZVwiIHx8IGNoYXJ0VHlwZUxvd2VyID09PSBcInNjYXR0ZXJcIikge1xuXG5cdFx0XHRcdHBsYWNlbWVudCA9IFwiaW5zaWRlXCI7XG5cblx0XHRcdH1cblxuXHRcdFx0eCA9IGluZGV4TGFiZWwucG9pbnQueCAtIHZpc2libGVXaWR0aCAvIDI7XG5cblx0XHRcdGlmIChwbGFjZW1lbnQgIT09IFwiaW5zaWRlXCIpIHtcdC8vb3V0c2lkZSBvciBhdXRvXG5cblx0XHRcdFx0eU1pbkxpbWl0ID0gcGxvdEFyZWEueTE7XG5cdFx0XHRcdHlNYXhMaW1pdCA9IHBsb3RBcmVhLnkyO1xuXG5cdFx0XHRcdGlmIChkaXJlY3Rpb24gPiAwKSB7XG5cdFx0XHRcdFx0eSA9IGluZGV4TGFiZWwucG9pbnQueSAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZO1xuXG5cdFx0XHRcdFx0aWYgKHkgPCB5TWluTGltaXQpIHtcblx0XHRcdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHkgPSBNYXRoLm1heChpbmRleExhYmVsLnBvaW50LnksIHlNaW5MaW1pdCkgKyBtYXJnaW5ZO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHkgPSB5TWluTGltaXQgKyBtYXJnaW5ZO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR5ID0gaW5kZXhMYWJlbC5wb2ludC55ICsgbWFyZ2luWTtcblxuXHRcdFx0XHRcdGlmICh5ID4geU1heExpbWl0IC0gdmlzaWJsZUhlaWdodCAtIG1hcmdpblkpIHtcblx0XHRcdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHkgPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LnksIHlNYXhMaW1pdCkgLSB2aXNpYmxlSGVpZ2h0IC0gbWFyZ2luWTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR5ID0geU1heExpbWl0IC0gdmlzaWJsZUhlaWdodCAtIG1hcmdpblk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblxuXHRcdFx0XHR5TWluTGltaXQgPSBNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy55MSwgcGxvdEFyZWEueTEpO1xuXHRcdFx0XHR5TWF4TGltaXQgPSBNYXRoLm1pbihpbmRleExhYmVsLmJvdW5kcy55MiwgcGxvdEFyZWEueTIpO1xuXG5cblx0XHRcdFx0aWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJyYW5nZVwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRpcmVjdGlvbiA+IDApXG5cdFx0XHRcdFx0XHRtaWQgPSBNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy55MSwgcGxvdEFyZWEueTEpICsgdmlzaWJsZUhlaWdodCAvIDIgKyBtYXJnaW5ZO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdG1pZCA9IE1hdGgubWluKGluZGV4TGFiZWwuYm91bmRzLnkyLCBwbG90QXJlYS55MikgLSB2aXNpYmxlSGVpZ2h0IC8gMiAtIG1hcmdpblk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdG1pZCA9IChNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy55MSwgcGxvdEFyZWEueTEpICsgTWF0aC5taW4oaW5kZXhMYWJlbC5ib3VuZHMueTIsIHBsb3RBcmVhLnkyKSkgLyAyXG5cblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA+IDApIHtcblx0XHRcdFx0XHR5ID0gTWF0aC5tYXgoaW5kZXhMYWJlbC5wb2ludC55LCBtaWQpIC0gdmlzaWJsZUhlaWdodCAvIDI7XG5cblx0XHRcdFx0XHRpZiAoeSA8IHlNaW5MaW1pdCAmJiAoY2hhcnRUeXBlTG93ZXIgPT09IFwiYnViYmxlXCIgfHwgY2hhcnRUeXBlTG93ZXIgPT09IFwic2NhdHRlclwiKSkge1xuXHRcdFx0XHRcdFx0eSA9IE1hdGgubWF4KGluZGV4TGFiZWwucG9pbnQueSAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZLCBwbG90QXJlYS55MSArIG1hcmdpblkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR5ID0gTWF0aC5taW4oaW5kZXhMYWJlbC5wb2ludC55LCBtaWQpIC0gdmlzaWJsZUhlaWdodCAvIDI7XG5cblx0XHRcdFx0XHRpZiAoeSA+IHlNYXhMaW1pdCAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZICYmIChjaGFydFR5cGVMb3dlciA9PT0gXCJidWJibGVcIiB8fCBjaGFydFR5cGVMb3dlciA9PT0gXCJzY2F0dGVyXCIpKSB7XG5cdFx0XHRcdFx0XHR5ID0gTWF0aC5taW4oaW5kZXhMYWJlbC5wb2ludC55ICsgbWFyZ2luWSwgcGxvdEFyZWEueTIgLSB2aXNpYmxlSGVpZ2h0IC0gbWFyZ2luWSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cbiAgICAgICAgICAgICAgICAgIC8vIE1ha2UgU3VyZSB0aGF0IGl0IGRvZXMgbm90IG92ZXJsYXAgdGhlIGF4aXMgbGluZVxuXHRcdFx0XHR5ID0gTWF0aC5taW4oeSwgeU1heExpbWl0IC0gdmlzaWJsZUhlaWdodCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXG5cdFx0XHRpZiAoY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcImxpbmVcIikgPj0gMCB8fCBjaGFydFR5cGVMb3dlci5pbmRleE9mKFwiYXJlYVwiKSA+PSAwXG5cdFx0XHRcdHx8IGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJzY2F0dGVyXCIpID49IDApIHtcblxuXHRcdFx0XHRwbGFjZW1lbnQgPSBcImF1dG9cIjtcblx0XHRcdFx0bWFyZ2luWCA9IDQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoY2hhcnRUeXBlTG93ZXIuaW5kZXhPZihcInN0YWNrZWRcIikgPj0gMCkge1xuXG5cdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKVxuXHRcdFx0XHRcdHBsYWNlbWVudCA9IFwiaW5zaWRlXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoY2hhcnRUeXBlTG93ZXIgPT09IFwiYnViYmxlXCIpIHtcblxuXHRcdFx0XHRwbGFjZW1lbnQgPSBcImluc2lkZVwiO1xuXG5cdFx0XHR9XG5cblx0XHRcdHkgPSBpbmRleExhYmVsLnBvaW50LnkgLSB2aXNpYmxlSGVpZ2h0IC8gMjtcblxuXHRcdFx0aWYgKHBsYWNlbWVudCAhPT0gXCJpbnNpZGVcIikge1x0Ly9vdXRzaWRlIG9yIGF1dG9cblxuXHRcdFx0XHR4TWluTGltaXQgPSBwbG90QXJlYS54MTtcblx0XHRcdFx0eE1heExpbWl0ID0gcGxvdEFyZWEueDI7XG5cblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA8IDApIHtcblx0XHRcdFx0XHR4ID0gaW5kZXhMYWJlbC5wb2ludC54IC0gdmlzaWJsZVdpZHRoIC0gbWFyZ2luWDtcblxuXHRcdFx0XHRcdGlmICh4IDwgeE1pbkxpbWl0KSB7XG5cdFx0XHRcdFx0XHRpZiAocGxhY2VtZW50ID09PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdFx0XHR4ID0gTWF0aC5tYXgoaW5kZXhMYWJlbC5wb2ludC54LCB4TWluTGltaXQpICsgbWFyZ2luWDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR4ID0geE1pbkxpbWl0ICsgbWFyZ2luWDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0eCA9IGluZGV4TGFiZWwucG9pbnQueCArIG1hcmdpblg7XG5cblx0XHRcdFx0XHRpZiAoeCA+IHhNYXhMaW1pdCAtIHZpc2libGVXaWR0aCAtIG1hcmdpblgpIHtcblx0XHRcdFx0XHRcdGlmIChwbGFjZW1lbnQgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHggPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LngsIHhNYXhMaW1pdCkgLSB2aXNpYmxlV2lkdGggLSBtYXJnaW5YO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHggPSB4TWF4TGltaXQgLSB2aXNpYmxlV2lkdGggLSBtYXJnaW5YO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHhNaW5MaW1pdCA9IE1hdGgubWF4KGluZGV4TGFiZWwuYm91bmRzLngxLCBwbG90QXJlYS54MSk7XG5cdFx0XHRcdHhNYXhMaW1pdCA9IE1hdGgubWluKGluZGV4TGFiZWwuYm91bmRzLngyLCBwbG90QXJlYS54Mik7XG5cblx0XHRcdFx0aWYgKGNoYXJ0VHlwZUxvd2VyLmluZGV4T2YoXCJyYW5nZVwiKSA+PSAwKSB7XG5cdFx0XHRcdFx0aWYgKGRpcmVjdGlvbiA8IDApXG5cdFx0XHRcdFx0XHRtaWQgPSBNYXRoLm1heChpbmRleExhYmVsLmJvdW5kcy54MSwgcGxvdEFyZWEueDEpICsgdmlzaWJsZVdpZHRoIC8gMiArIG1hcmdpblg7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0bWlkID0gTWF0aC5taW4oaW5kZXhMYWJlbC5ib3VuZHMueDIsIHBsb3RBcmVhLngyKSAtIHZpc2libGVXaWR0aCAvIDIgLSBtYXJnaW5YO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YXIgbWlkID0gKE1hdGgubWF4KGluZGV4TGFiZWwuYm91bmRzLngxLCBwbG90QXJlYS54MSkgKyBNYXRoLm1pbihpbmRleExhYmVsLmJvdW5kcy54MiwgcGxvdEFyZWEueDIpKSAvIDI7XG5cblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA8IDApIHtcblx0XHRcdFx0XHR4ID0gTWF0aC5tYXgoaW5kZXhMYWJlbC5wb2ludC54LCBtaWQpIC0gdmlzaWJsZVdpZHRoIC8gMjtcblxuXHRcdFx0XHRcdC8vaWYgKHkgPCB4TWluTGltaXQpIHtcblx0XHRcdFx0XHQvL1x0eSA9IE1hdGgubWF4KGluZGV4TGFiZWwucG9pbnQueSAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZLCBwbG90QXJlYS55MSArIG1hcmdpblkpO1xuXHRcdFx0XHRcdC8vfVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHggPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LngsIG1pZCkgLSB2aXNpYmxlV2lkdGggLyAyO1xuXG5cdFx0XHRcdFx0Ly9pZiAoeSA+IHhNYXhMaW1pdCAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZKSB7XG5cdFx0XHRcdFx0Ly9cdHkgPSBNYXRoLm1pbihpbmRleExhYmVsLnBvaW50LnkgKyBtYXJnaW5ZLCBwbG90QXJlYS55MiAtIHZpc2libGVIZWlnaHQgLSBtYXJnaW5ZKTtcblx0XHRcdFx0XHQvL31cblx0XHRcdFx0fVxuXG5cdFx0XHQgICAgLy8gTWFrZSBTdXJlIHRoYXQgaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgYXhpcyBsaW5lXG5cdFx0XHQgICAgeCA9IE1hdGgubWF4KHgsIHhNaW5MaW1pdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cblx0XHRpZiAob3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIikge1xuXHRcdFx0eSArPSB2aXNpYmxlSGVpZ2h0O1xuXHRcdH1cblxuXHRcdHRleHRCbG9jay54ID0geDtcblx0XHR0ZXh0QmxvY2sueSA9IHk7XG5cblx0XHQvL2NvbnNvbGUubG9nKHRleHRCbG9jay50ZXh0ICsgXCI6IFwiICsgdGV4dEJsb2NrLnggKyBcIjsgXCIgKyB0ZXh0QmxvY2sueSk7XG5cblx0XHR0ZXh0QmxvY2sucmVuZGVyKHRydWUpO1xuXHR9XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIuZmFkZUluQW5pbWF0aW9uLCBlYXNpbmdGdW5jdGlvbjogQW5pbWF0aW9uSGVscGVyLmVhc2luZy5lYXNlSW5RdWFkLCBhbmltYXRpb25CYXNlOiAwLCBzdGFydFRpbWVQZXJjZW50OiAuN1xuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckxpbmUgPSBmdW5jdGlvbiAocGxvdFVuaXQpIHtcblxuXHR2YXIgY3R4ID0gcGxvdFVuaXQudGFyZ2V0Q2FudmFzQ3R4IHx8IHRoaXMucGxvdEFyZWEuY3R4O1xuXG5cdHZhciB0b3RhbERhdGFTZXJpZXMgPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7XG5cdGlmICh0b3RhbERhdGFTZXJpZXMgPD0gMClcblx0XHRyZXR1cm47XG5cblx0dmFyIGdob3N0Q3R4ID0gdGhpcy5fZXZlbnRNYW5hZ2VyLmdob3N0Q3R4O1xuXHQvL3ZhciBnaG9zdEN0eCA9IHRoaXMub3ZlcmxhaWRDYW52YXNDdHg7XG5cblx0Y3R4LnNhdmUoKTtcblxuXHR2YXIgcGxvdEFyZWEgPSB0aGlzLnBsb3RBcmVhO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblx0Y3R4LnJlY3QocGxvdEFyZWEueDEsIHBsb3RBcmVhLnkxLCBwbG90QXJlYS53aWR0aCwgcGxvdEFyZWEuaGVpZ2h0KTtcblx0Y3R4LmNsaXAoKTtcblxuXHR2YXIgbWFya2VycyA9IFtdO1xuXG5cdGZvciAodmFyIGogPSAwOyBqIDwgcGxvdFVuaXQuZGF0YVNlcmllc0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcblxuXHRcdHZhciBkYXRhU2VyaWVzSW5kZXggPSBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlc1tqXTtcblxuXHRcdHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhW2RhdGFTZXJpZXNJbmRleF07XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcztcblx0XHR2YXIgZGF0YVBvaW50cyA9IGRhdGFTZXJpZXMuZGF0YVBvaW50cztcblxuXG5cdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdH1cblxuXHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzZXJpZXNJZF0gPSB7XG5cdFx0XHRvYmplY3RUeXBlOiBcImRhdGFTZXJpZXNcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXhcblx0XHR9O1xuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LnN0cm9rZVN0eWxlID0gaGV4Q29sb3I7XG5cdFx0Ly9naG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0Z2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMCA/IE1hdGgubWF4KGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcywgNCkgOiAwO1xuXG5cdFx0dmFyIGNvbG9yU2V0ID0gZGF0YVNlcmllcy5fY29sb3JTZXQ7XG5cdFx0dmFyIGNvbG9yID0gY29sb3JTZXRbMF07XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0Ly9pZiAoIWRhdGFTZXJpZXMuX29wdGlvbnMubWFya2VyU2l6ZSAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoIDwgMTAwMClcblx0XHQvLyAgICBkYXRhU2VyaWVzLm1hcmtlclNpemUgPSA4O1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXG5cdFx0XHQvL2RhdGFTZXJpZXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYSA9IDBcblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSBmYWxzZTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lID8gZGF0YVBvaW50c1tpXS54LmdldFRpbWUoKSA6IGRhdGFQb2ludHNbaV0ueDtcblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50WCA8IHBsb3RVbml0LmF4aXNYLmRhdGFJbmZvLnZpZXdQb3J0TWluIHx8IGRhdGFQb2ludFggPiBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1heClcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHQvL2lmICghaXNGaW5pdGUoZGF0YVBvaW50c1tpXS55KSlcblx0XHRcdFx0Ly8gICAgY29udGludWU7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiAoZGF0YVBvaW50c1tpXS55KSAhPT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdGlmIChpID4gMCkgey8vIGlmIGZpcnN0IGRhdGFQb2ludCBpcyBudWxsIHRoZW4gbm8gbmVlZCB0byBjYWxsIHN0cm9rZSBtZXRob2Rcblx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LnN0cm9rZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gdHJ1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHggPSAocGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0ICogKGRhdGFQb2ludFggLSBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXHRcdFx0XHR5ID0gKHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRzW2ldLnkgLSBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSArIC41KSA8PCAwO1xuXG5cdFx0XHRcdHZhciBpZCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2ldO1xuXHRcdFx0XHR0aGlzLl9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSA9IHtcblx0XHRcdFx0XHRpZDogaWQsIG9iamVjdFR5cGU6IFwiZGF0YVBvaW50XCIsIGRhdGFTZXJpZXNJbmRleDogZGF0YVNlcmllc0luZGV4LCBkYXRhUG9pbnRJbmRleDogaSwgeDE6IHgsIHkxOiB5XG5cdFx0XHRcdH07XG5cblxuXHRcdFx0XHQvL2RhdGFTZXJpZXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYSsrO1xuXG5cdFx0XHRcdGlmIChpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSB8fCBwcmV2RGF0YU51bGwpIHtcblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4LCB5KTtcblxuXG5cdFx0XHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpc0ZpcnN0RGF0YVBvaW50SW5QbG90QXJlYSA9IGZhbHNlO1xuXHRcdFx0XHRcdHByZXZEYXRhTnVsbCA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmxpbmVUbyh4LCB5KTtcblxuXHRcdFx0XHRcdGlmIChpICUgNTAwID09IDApIHtcblx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL1JlbmRlciBNYXJrZXJcblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0ubWFya2VyU2l6ZSA+IDAgfHwgZGF0YVNlcmllcy5tYXJrZXJTaXplID4gMCkge1xuXG5cdFx0XHRcdFx0dmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGksIHgsIHksIGN0eCk7XG5cdFx0XHRcdFx0bWFya2Vycy5wdXNoKG1hcmtlclByb3BzKTtcblxuXHRcdFx0XHRcdC8vaWYgKCFkYXRhU2VyaWVzLm1heFdpZHRoSW5YIHx8IG1hcmtlclByb3BzLnNpemUgPiBkYXRhU2VyaWVzLm1heFdpZHRoSW5YKSB7XG5cdFx0XHRcdFx0Ly9cdGRhdGFTZXJpZXMubWF4V2lkdGhJblggPSBtYXJrZXJQcm9wcy5zaXplIC8gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCA+IDEgPyBwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgLSAxIDogcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0KTtcblx0XHRcdFx0XHQvL31cblxuXHRcdFx0XHRcdHZhciBtYXJrZXJDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoaWQpO1xuXG5cdFx0XHRcdFx0Ly93aW5kb3cuY29uc29sZS5sb2coXCJpbmRleDogXCIgKyBpICsgXCI7IGlkOiBcIiArIGlkICsgXCI7IGhleDogXCIgKyBtYXJrZXJDb2xvcik7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdG1hcmtlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHksIGN0eDogZ2hvc3RDdHgsXG5cdFx0XHRcdFx0XHRcdHR5cGU6IG1hcmtlclByb3BzLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHNpemU6IG1hcmtlclByb3BzLnNpemUsXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBtYXJrZXJDb2xvcixcblx0XHRcdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJUaGlja25lc3M6IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzc1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludHNbaV0uaW5kZXhMYWJlbCB8fCBkYXRhU2VyaWVzLmluZGV4TGFiZWwgfHwgZGF0YVBvaW50c1tpXS5pbmRleExhYmVsRm9ybWF0dGVyIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbEZvcm1hdHRlcikge1xuXG5cdFx0XHRcdFx0dGhpcy5faW5kZXhMYWJlbHMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFydFR5cGU6IFwibGluZVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zdHJva2UoKTtcblxuXHRcdFx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkKVxuXHRcdFx0XHRnaG9zdEN0eC5zdHJva2UoKTtcblx0XHR9XG5cblx0fVxuXG5cblx0UmVuZGVySGVscGVyLmRyYXdNYXJrZXJzKG1hcmtlcnMpO1xuXHRjdHgucmVzdG9yZSgpO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblxuXHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0Z2hvc3RDdHguYmVnaW5QYXRoKCk7XG5cblx0Ly9zb3VyY2UgYW5kIGRlc3Qgd291bGQgYmUgc2FtZSB3aGVuIGFuaW1hdGlvbiBpcyBub3QgZW5hYmxlZFxuXHR2YXIgYW5pbWF0aW9uSW5mbyA9IHtcblx0XHRzb3VyY2U6IGN0eCwgZGVzdDogdGhpcy5wbG90QXJlYS5jdHgsIGFuaW1hdGlvbkNhbGxiYWNrOiBBbmltYXRpb25IZWxwZXIueENsaXBBbmltYXRpb24sIGVhc2luZ0Z1bmN0aW9uOiBBbmltYXRpb25IZWxwZXIuZWFzaW5nLmxpbmVhciwgYW5pbWF0aW9uQmFzZTogMFxuXHR9O1xuXHRyZXR1cm4gYW5pbWF0aW9uSW5mbztcbn1cblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0ZXBMaW5lID0gZnVuY3Rpb24gKHBsb3RVbml0KSB7XG5cdHZhciBjdHggPSBwbG90VW5pdC50YXJnZXRDYW52YXNDdHggfHwgdGhpcy5wbG90QXJlYS5jdHg7XG5cblx0dmFyIHRvdGFsRGF0YVNlcmllcyA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzLmxlbmd0aDtcblx0aWYgKHRvdGFsRGF0YVNlcmllcyA8PSAwKVxuXHRcdHJldHVybjtcblxuXHR2YXIgZ2hvc3RDdHggPSB0aGlzLl9ldmVudE1hbmFnZXIuZ2hvc3RDdHg7XG5cdC8vdmFyIGdob3N0Q3R4ID0gdGhpcy5vdmVybGFpZENhbnZhc0N0eDtcblxuXHRjdHguc2F2ZSgpO1xuXG5cdHZhciBwbG90QXJlYSA9IHRoaXMucGxvdEFyZWE7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLndpZHRoLCBwbG90QXJlYS5oZWlnaHQpO1xuXHRjdHguY2xpcCgpO1xuXG5cdHZhciBtYXJrZXJzID0gW107XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBwbG90VW5pdC5kYXRhU2VyaWVzSW5kZXhlcy5sZW5ndGg7IGorKykge1xuXG5cdFx0dmFyIGRhdGFTZXJpZXNJbmRleCA9IHBsb3RVbml0LmRhdGFTZXJpZXNJbmRleGVzW2pdO1xuXG5cdFx0dmFyIGRhdGFTZXJpZXMgPSB0aGlzLmRhdGFbZGF0YVNlcmllc0luZGV4XTtcblx0XHRjdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzO1xuXHRcdHZhciBkYXRhUG9pbnRzID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzO1xuXG5cdFx0aWYgKGN0eC5zZXRMaW5lRGFzaCkge1xuXHRcdFx0Y3R4LnNldExpbmVEYXNoKGdldExpbmVEYXNoQXJyYXkoZGF0YVNlcmllcy5saW5lRGFzaFR5cGUsIGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcykpO1xuXHRcdH1cblxuXHRcdHZhciBzZXJpZXNJZCA9IGRhdGFTZXJpZXMuaWQ7XG5cdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtzZXJpZXNJZF0gPSB7XG5cdFx0XHRvYmplY3RUeXBlOiBcImRhdGFTZXJpZXNcIiwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzSW5kZXhcblx0XHR9O1xuXHRcdHZhciBoZXhDb2xvciA9IGludFRvSGV4Q29sb3JTdHJpbmcoc2VyaWVzSWQpO1xuXHRcdGdob3N0Q3R4LnN0cm9rZVN0eWxlID0gaGV4Q29sb3I7XG5cdFx0Ly9naG9zdEN0eC5saW5lV2lkdGggPSBkYXRhU2VyaWVzLmxpbmVUaGlja25lc3M7XG5cdFx0Z2hvc3RDdHgubGluZVdpZHRoID0gZGF0YVNlcmllcy5saW5lVGhpY2tuZXNzID4gMCA/IE1hdGgubWF4KGRhdGFTZXJpZXMubGluZVRoaWNrbmVzcywgNCkgOiAwO1xuXG5cdFx0dmFyIGNvbG9yU2V0ID0gZGF0YVNlcmllcy5fY29sb3JTZXQ7XG5cdFx0dmFyIGNvbG9yID0gY29sb3JTZXRbMF07XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cblx0XHR2YXIgaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgPSB0cnVlO1xuXHRcdHZhciBpID0gMCwgeCwgeTtcblx0XHR2YXIgZGF0YVBvaW50WDsgLy9Vc2VkIHNvIHRoYXQgd2hlbiBkYXRhUG9pbnQueCBpcyBhIERhdGVUaW1lIHZhbHVlLCBpdCBkb2Vzbid0IGdldCBjb252ZXJ0ZWQgdG8gbnVtYmVyIGJhY2sgYW5kIGZvcnRoLlxuXG5cdFx0Ly9pZiAoIWRhdGFTZXJpZXMuX29wdGlvbnMubWFya2VyU2l6ZSAmJiBkYXRhU2VyaWVzLmRhdGFQb2ludHMubGVuZ3RoIDwgMTAwMClcblx0XHQvLyAgICBkYXRhU2VyaWVzLm1hcmtlclNpemUgPSA4O1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRpZiAoZGF0YVBvaW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL3ZhciB4eSA9IHRoaXMuZ2V0UGl4ZWxDb29yZGluYXRlc09uUGxvdEFyZWEoZGF0YVBvaW50c1swXS54LCBkYXRhUG9pbnRzWzBdLnkpO1xuXG5cdFx0XHQvL2RhdGFTZXJpZXMubm9EYXRhUG9pbnRzSW5QbG90QXJlYSA9IDBcblx0XHRcdHZhciBwcmV2RGF0YU51bGwgPSBmYWxzZTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0ZGF0YVBvaW50WCA9IGRhdGFQb2ludHNbaV0uZ2V0VGltZSA/IGRhdGFQb2ludHNbaV0ueC5nZXRUaW1lKCkgOiBkYXRhUG9pbnRzW2ldLng7XG5cblx0XHRcdFx0aWYgKGRhdGFQb2ludFggPCBwbG90VW5pdC5heGlzWC5kYXRhSW5mby52aWV3UG9ydE1pbiB8fCBkYXRhUG9pbnRYID4gcGxvdFVuaXQuYXhpc1guZGF0YUluZm8udmlld1BvcnRNYXgpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0Ly9pZiAoIWlzRmluaXRlKGRhdGFQb2ludHNbaV0ueSkpXG5cdFx0XHRcdC8vICAgIGNvbnRpbnVlO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgKGRhdGFQb2ludHNbaV0ueSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRpZiAoaSA+IDApIHsvLyBpZiBmaXJzdCBkYXRhUG9pbnQgaXMgbnVsbCB0aGVuIG5vIG5lZWQgdG8gY2FsbCBzdHJva2UgbWV0aG9kXG5cdFx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cblx0XHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwcmV2RGF0YU51bGwgPSB0cnVlO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHByZXZZID0geTtcblxuXHRcdFx0XHR4ID0gKHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChkYXRhUG9pbnRYIC0gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblx0XHRcdFx0eSA9IChwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5yZWZlcmVuY2UgKyBwbG90VW5pdC5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZGF0YVBvaW50c1tpXS55IC0gcGxvdFVuaXQuYXhpc1kuY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSkgKyAuNSkgPDwgMDtcblxuXHRcdFx0XHR2YXIgaWQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludElkc1tpXTtcblx0XHRcdFx0dGhpcy5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF0gPSB7XG5cdFx0XHRcdFx0aWQ6IGlkLCBvYmplY3RUeXBlOiBcImRhdGFQb2ludFwiLCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGksIHgxOiB4LCB5MTogeVxuXHRcdFx0XHR9O1xuXG5cblx0XHRcdFx0Ly9kYXRhU2VyaWVzLm5vRGF0YVBvaW50c0luUGxvdEFyZWErKztcblxuXHRcdFx0XHRpZiAoaXNGaXJzdERhdGFQb2ludEluUGxvdEFyZWEgfHwgcHJldkRhdGFOdWxsKSB7XG5cdFx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0Z2hvc3RDdHgubW92ZVRvKHgsIHkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlzRmlyc3REYXRhUG9pbnRJblBsb3RBcmVhID0gZmFsc2U7XG5cdFx0XHRcdFx0cHJldkRhdGFOdWxsID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjdHgubGluZVRvKHgsIHByZXZZKTtcblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeCwgcHJldlkpO1xuXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4LCB5KTtcblx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpXG5cdFx0XHRcdFx0XHRnaG9zdEN0eC5saW5lVG8oeCwgeSk7XG5cblx0XHRcdFx0XHRpZiAoaSAlIDUwMCA9PSAwKSB7XG5cdFx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0XHRcdFx0XHRcdGdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuXHRcdFx0XHRcdFx0XHRnaG9zdEN0eC5tb3ZlVG8oeCwgeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly9SZW5kZXIgTWFya2VyXG5cdFx0XHRcdGlmIChkYXRhUG9pbnRzW2ldLm1hcmtlclNpemUgPiAwIHx8IGRhdGFTZXJpZXMubWFya2VyU2l6ZSA+IDApIHtcblxuXHRcdFx0XHRcdHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpLCB4LCB5LCBjdHgpO1xuXHRcdFx0XHRcdG1hcmtlcnMucHVzaChtYXJrZXJQcm9wcyk7XG5cblx0XHRcdFx0XHQvL2lmICghZGF0YVNlcmllcy5tYXhXaWR0aEluWCB8fCBtYXJrZXJQcm9wcy5zaXplID4gZGF0YVNlcmllcy5tYXhXaWR0aEluWCkge1xuXHRcdFx0XHRcdC8vXHRkYXRhU2VyaWVzLm1heFdpZHRoSW5YID0gbWFya2VyUHJvcHMuc2l6ZSAvIChwbG90VW5pdC5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgPiAxID8gcGxvdFVuaXQuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucGl4ZWxQZXJVbml0IC0gMSA6IHBsb3RVbml0LmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCk7XG5cdFx0XHRcdFx0Ly99XG5cblx0XHRcdFx0XHR2YXIgbWFya2VyQ29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGlkKTtcblxuXHRcdFx0XHRcdC8vd2luZG93LmNvbnNvbGUubG9nKFwiaW5kZXg6IFwiICsgaSArIFwiOyBpZDogXCIgKyBpZCArIFwiOyBoZXg6IFwiICsgbWFya2VyQ29sb3IpO1xuXHRcdFx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0bWFya2Vycy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0eDogeCwgeTogeSwgY3R4OiBnaG9zdEN0eCxcblx0XHRcdFx0XHRcdFx0dHlwZTogbWFya2VyUHJvcHMudHlwZSxcblx0XHRcdFx0XHRcdFx0c2l6ZTogbWFya2VyUHJvcHMuc2l6ZSxcblx0XHRcdFx0XHRcdFx0Y29sb3I6IG1hcmtlckNvbG9yLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJDb2xvcjogbWFya2VyQ29sb3IsXG5cdFx0XHRcdFx0XHRcdGJvcmRlclRoaWNrbmVzczogbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZGF0YVBvaW50c1tpXS5pbmRleExhYmVsIHx8IGRhdGFTZXJpZXMuaW5kZXhMYWJlbCB8fCBkYXRhUG9pbnRzW2ldLmluZGV4TGFiZWxGb3JtYXR0ZXIgfHwgZGF0YVNlcmllcy5pbmRleExhYmVsRm9ybWF0dGVyKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9pbmRleExhYmVscy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYXJ0VHlwZTogXCJzdGVwTGluZVwiLFxuXHRcdFx0XHRcdFx0ZGF0YVBvaW50OiBkYXRhUG9pbnRzW2ldLFxuXHRcdFx0XHRcdFx0ZGF0YVNlcmllczogZGF0YVNlcmllcyxcblx0XHRcdFx0XHRcdHBvaW50OiB7XG5cdFx0XHRcdFx0XHRcdHg6IHgsIHk6IHlcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRhdGFQb2ludHNbaV0ueSA+PSAwID8gMSA6IC0xLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRcdFx0Z2hvc3RDdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG5cblxuXHRSZW5kZXJIZWxwZXIuZHJhd01hcmtlcnMobWFya2Vycyk7XG5cdGN0eC5yZXN0b3JlKCk7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXG5cdGlmIChpc0NhbnZhc1N1cHBvcnRlZClcblx0XHRnaG9zdEN0eC5iZWdpblBhdGgoKTtcblxuXHQvL3NvdXJjZSBhbmQgZGVzdCB3b3VsZCBiZSBzYW1lIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBlbmFibGVkXG5cdHZhciBhbmltYXRpb25JbmZvID0ge1xuXHRcdHNvdXJjZTogY3R4LCBkZXN0OiB0aGlzLnBsb3RBcmVhLmN0eCwgYW5pbWF0aW9uQ2FsbGJhY2s6IEFuaW1hdGlvbkhlbHBlci54Q2xpcEFuaW1hdGlvbiwgZWFzaW5nRnVuY3Rpb246IEFuaW1hdGlvbkhlbHBlci5lYXNpbmcubGluZWFyLCBhbmltYXRpb25CYXNlOiAwXG5cdH07XG5cdHJldHVybiBhbmltYXRpb25JbmZvO1xufVxuXG5DaGFydC5wcm90b3R5cGUuYW5pbWF0aW9uUmVxdWVzdElkID0gbnVsbDtcblxuQ2hhcnQucHJvdG90eXBlLnJlcXVlc3RBbmltRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0ZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuXHRcdFx0fTtcbn0pKCk7XG5cbkNoYXJ0LnByb3RvdHlwZS5jYW5jZWxSZXF1ZXN0QW5pbUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdHdpbmRvdy53ZWJraXRDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHR3aW5kb3cubW96Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0d2luZG93Lm9DYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHR3aW5kb3cubXNDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRjbGVhclRpbWVvdXRcbn0pKCk7XG5cbkNoYXJ0LnByb3RvdHlwZS5nZXRQZXJjZW50QW5kVG90YWwgPSBmdW5jdGlvbiAoZHMsIGRwKSB7XG5cblx0dmFyIGRwWCA9IG51bGw7XG5cdHZhciB0b3RhbCA9IG51bGw7XG5cdHZhciBwZXJjZW50ID0gbnVsbDtcblxuXHRpZiAoZHMudHlwZS5pbmRleE9mKFwic3RhY2tlZFwiKSA+PSAwKSB7XG5cdFx0dG90YWwgPSAwO1xuXHRcdGRwWCA9IGRwLnguZ2V0VGltZSA/IGRwLnguZ2V0VGltZSgpIDogZHAueDtcblx0XHRpZiAoZHBYIGluIGRzLnBsb3RVbml0LnlUb3RhbHMpIHtcblx0XHRcdHRvdGFsID0gZHMucGxvdFVuaXQueVRvdGFsc1tkcFhdO1xuXG5cdFx0XHRpZiAoIWlzTmFOKGRwLnkpKSB7XG5cdFx0XHQgICAgaWYgKHRvdGFsID09PSAwKVxuXHRcdFx0ICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICAgIGVsc2Vcblx0XHRcdCAgICAgICAgcGVyY2VudCA9IChkcC55IC8gdG90YWwpICogMTAwO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0ICAgIHBlcmNlbnQgPSAwO1xuXHRcdH1cblx0fSBlbHNlIGlmIChkcy50eXBlID09PSBcInBpZVwiIHx8IGRzLnR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuXHRcdHRvdGFsID0gMDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRzLmRhdGFQb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdFx0aWYgKCFpc05hTihkcy5kYXRhUG9pbnRzW2ldLnkpKVxuXHRcdFx0XHR0b3RhbCArPSBkcy5kYXRhUG9pbnRzW2ldLnk7XG5cdFx0fVxuXG5cdFx0aWYgKCFpc05hTihkcC55KSlcblx0XHRcdHBlcmNlbnQgPSAoZHAueSAvIHRvdGFsKSAqIDEwMDtcblx0XHRlbHNlXG5cdFx0XHRwZXJjZW50ID0gMDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cGVyY2VudDogcGVyY2VudCwgdG90YWw6IHRvdGFsXG5cdH07XG59XG5cbkNoYXJ0LnByb3RvdHlwZS5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUgPSBmdW5jdGlvbiAoc3RyLCBkcCwgZHMsIGRwSW5kZXgsIGluZGV4S2V5d29yZFZhbHVlKSB7XG5cdC8vdmFyIHJlZ2V4ID0gL1xce1xccypbYS16QS1aXStcXHMqXFx9fFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuXHR2YXIgcmVnZXggPSAvXFx7Lio/XFx9fFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuXHR2YXIgY2hhcnQgPSB0aGlzO1xuXHRpbmRleEtleXdvcmRWYWx1ZSA9IHR5cGVvZiAoaW5kZXhLZXl3b3JkVmFsdWUpID09PSBcInVuZGVmaW5lZFwiID8gMCA6IGluZGV4S2V5d29yZFZhbHVlO1xuXG5cdGlmICgoZHMudHlwZS5pbmRleE9mKFwic3RhY2tlZFwiKSA+PSAwIHx8IChkcy50eXBlID09PSBcInBpZVwiIHx8IGRzLnR5cGUgPT09IFwiZG91Z2hudXRcIikpICYmIChzdHIuaW5kZXhPZihcIiNwZXJjZW50XCIpID49IDAgfHwgc3RyLmluZGV4T2YoXCIjdG90YWxcIikgPj0gMCkpIHtcblx0XHR2YXIgcGVyY2VudCA9IFwiI3BlcmNlbnRcIjtcblx0XHR2YXIgdG90YWwgPSBcIiN0b3RhbFwiO1xuXHRcdHZhciBkcFggPSBudWxsO1xuXG5cdFx0dmFyIHBlcmNlbnRBbmRUb3RhbCA9IHRoaXMuZ2V0UGVyY2VudEFuZFRvdGFsKGRzLCBkcCk7XG5cblx0XHR0b3RhbCA9IGlzTmFOKHBlcmNlbnRBbmRUb3RhbC50b3RhbCkgPyB0b3RhbCA6IHBlcmNlbnRBbmRUb3RhbC50b3RhbDtcblx0XHRwZXJjZW50ID0gaXNOYU4ocGVyY2VudEFuZFRvdGFsLnBlcmNlbnQpID8gcGVyY2VudCA6IHBlcmNlbnRBbmRUb3RhbC5wZXJjZW50O1xuXG5cdFx0ZG8ge1xuXHRcdFx0dmFyIHBlcmNlbnRGb3JtYXRTdHJpbmcgPSBcIlwiO1xuXHRcdFx0aWYgKGRzLnBlcmNlbnRGb3JtYXRTdHJpbmcpXG5cdFx0XHRcdHBlcmNlbnRGb3JtYXRTdHJpbmcgPSBkcy5wZXJjZW50Rm9ybWF0U3RyaW5nO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHBlcmNlbnRGb3JtYXRTdHJpbmcgPSBcIiMsIyMwLlwiO1xuXHRcdFx0XHR2YXIgbnVtYmVyT2ZEZWNpbWFscyA9IE1hdGgubWF4KE1hdGguY2VpbChNYXRoLmxvZygxIC8gTWF0aC5hYnMocGVyY2VudCkpIC8gTWF0aC5MTjEwKSwgMik7XG5cblx0XHRcdFx0aWYgKGlzTmFOKG51bWJlck9mRGVjaW1hbHMpIHx8ICFpc0Zpbml0ZShudW1iZXJPZkRlY2ltYWxzKSlcblx0XHRcdFx0XHRudW1iZXJPZkRlY2ltYWxzID0gMjtcblxuXHRcdFx0XHRmb3IgKHZhciBuID0gMDsgbiA8IG51bWJlck9mRGVjaW1hbHM7IG4rKykge1xuXHRcdFx0XHRcdHBlcmNlbnRGb3JtYXRTdHJpbmcgKz0gXCIjXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0c3RyID0gc3RyLnJlcGxhY2UoXCIjcGVyY2VudFwiLCBudW1iZXJGb3JtYXQocGVyY2VudCwgcGVyY2VudEZvcm1hdFN0cmluZywgY2hhcnQuX2N1bHR1cmVJbmZvKSk7XG5cdFx0XHRzdHIgPSBzdHIucmVwbGFjZShcIiN0b3RhbFwiLCBudW1iZXJGb3JtYXQodG90YWwsIGRzLnlWYWx1ZUZvcm1hdFN0cmluZyA/IGRzLnlWYWx1ZUZvcm1hdFN0cmluZyA6IFwiIywjIzAuIyMjIyMjIyNcIikpO1xuXHRcdH0gd2hpbGUgKHN0ci5pbmRleE9mKFwiI3BlcmNlbnRcIikgPj0gMCB8fCBzdHIuaW5kZXhPZihcIiN0b3RhbFwiKSA+PSAwKTtcblx0fVxuXG5cblx0dmFyIGZjbiA9IGZ1bmN0aW9uICgkMCkge1xuXHRcdGlmICgoJDBbMF0gPT09IFwiXFxcIlwiICYmICQwWyQwLmxlbmd0aCAtIDFdID09PSBcIlxcXCJcIikgfHwgKCQwWzBdID09PSBcIlxcJ1wiICYmICQwWyQwLmxlbmd0aCAtIDFdID09PSBcIlxcJ1wiKSlcblx0XHRcdHJldHVybiAkMC5zbGljZSgxLCAkMC5sZW5ndGggLSAxKTtcblxuXHRcdHZhciBrZXkgPSB0cmltU3RyaW5nKCQwLnNsaWNlKDEsICQwLmxlbmd0aCAtIDEpKTtcblx0XHRrZXkgPSBrZXkucmVwbGFjZShcIiNpbmRleFwiLCBpbmRleEtleXdvcmRWYWx1ZSk7XG5cblx0XHR2YXIgaW5kZXggPSBudWxsO1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciBtYXRjaCA9IGtleS5tYXRjaCgvKC4qPylcXHMqXFxbXFxzKiguKj8pXFxzKlxcXS8pO1xuXHRcdFx0aWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aW5kZXggPSB0cmltU3RyaW5nKG1hdGNoWzJdKTtcblx0XHRcdFx0a2V5ID0gdHJpbVN0cmluZyhtYXRjaFsxXSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdH07XG5cblxuXHRcdHZhciBvYmogPSBudWxsO1xuXG5cdFx0aWYgKGtleSA9PT0gXCJjb2xvclwiKSB7XG5cdFx0XHRyZXR1cm4gZHAuY29sb3IgPyBkcC5jb2xvciA6IGRzLmNvbG9yID8gZHMuY29sb3IgOiBkcy5fY29sb3JTZXRbZHBJbmRleCAlIGRzLl9jb2xvclNldC5sZW5ndGhdO1xuXHRcdH1cblxuXHRcdGlmIChkcC5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuXHRcdFx0b2JqID0gZHA7XG5cdFx0ZWxzZSBpZiAoZHMuaGFzT3duUHJvcGVydHkoa2V5KSlcblx0XHRcdG9iaiA9IGRzO1xuXHRcdGVsc2UgcmV0dXJuIFwiXCI7XG5cblx0XHR2YXIgdmFsdWUgPSBvYmpba2V5XTtcblx0XHRpZiAoaW5kZXggIT09IG51bGwpXG5cdFx0XHR2YWx1ZSA9IHZhbHVlW2luZGV4XTtcblxuXHRcdGlmIChrZXkgPT09IFwieFwiKSB7XG5cdFx0XHRpZiAoY2hhcnQuYXhpc1ggJiYgY2hhcnQucGxvdEluZm8uYXhpc1hWYWx1ZVR5cGUgPT09IFwiZGF0ZVRpbWVcIilcblx0XHRcdFx0cmV0dXJuIGRhdGVGb3JtYXQodmFsdWUsIGRwLnhWYWx1ZUZvcm1hdFN0cmluZyA/IGRwLnhWYWx1ZUZvcm1hdFN0cmluZyA6IGRzLnhWYWx1ZUZvcm1hdFN0cmluZyA/IGRzLnhWYWx1ZUZvcm1hdFN0cmluZyA6IGNoYXJ0LmF4aXNYICYmIGNoYXJ0LmF4aXNYLnZhbHVlRm9ybWF0U3RyaW5nID8gY2hhcnQuYXhpc1gudmFsdWVGb3JtYXRTdHJpbmcgOiBcIkREIE1NTSBZWVwiLCBjaGFydC5fY3VsdHVyZUluZm8pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gbnVtYmVyRm9ybWF0KHZhbHVlLCBkcC54VmFsdWVGb3JtYXRTdHJpbmcgPyBkcC54VmFsdWVGb3JtYXRTdHJpbmcgOiBkcy54VmFsdWVGb3JtYXRTdHJpbmcgPyBkcy54VmFsdWVGb3JtYXRTdHJpbmcgOiBcIiMsIyMwLiMjIyMjIyMjXCIsIGNoYXJ0Ll9jdWx0dXJlSW5mbyk7XG5cdFx0fSBlbHNlIGlmIChrZXkgPT09IFwieVwiKVxuXHRcdFx0cmV0dXJuIG51bWJlckZvcm1hdCh2YWx1ZSwgZHAueVZhbHVlRm9ybWF0U3RyaW5nID8gZHAueVZhbHVlRm9ybWF0U3RyaW5nIDogZHMueVZhbHVlRm9ybWF0U3RyaW5nID8gZHMueVZhbHVlRm9ybWF0U3RyaW5nIDogXCIjLCMjMC4jIyMjIyMjI1wiLCBjaGFydC5fY3VsdHVyZUluZm8pO1xuXHRcdGVsc2UgaWYgKGtleSA9PT0gXCJ6XCIpXG5cdFx0XHRyZXR1cm4gbnVtYmVyRm9ybWF0KHZhbHVlLCBkcC56VmFsdWVGb3JtYXRTdHJpbmcgPyBkcC56VmFsdWVGb3JtYXRTdHJpbmcgOiBkcy56VmFsdWVGb3JtYXRTdHJpbmcgPyBkcy56VmFsdWVGb3JtYXRTdHJpbmcgOiBcIiMsIyMwLiMjIyMjIyMjXCIsIGNoYXJ0Ll9jdWx0dXJlSW5mbyk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHN0ci5yZXBsYWNlKHJlZ2V4LCBmY24pO1xufVxuXG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJTcGxpbmUgPSBTcGxpbmVDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckNvbHVtbiA9IENvbHVtbkNoYXJ0XG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJTdGFja2VkQ29sdW1uID0gU3RhY2tlZENvbHVtbkNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU3RhY2tlZENvbHVtbjEwMCA9IFN0YWNrZWRDb2x1bW4xMDBDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckJhciA9IEJhckNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU3RhY2tlZEJhciA9IFN0YWNrZWRCYXJDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0YWNrZWRCYXIxMDAgPSBTdGFja2VkQmFyMTAwQ2hhcnQ7XG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJBcmVhID0gQXJlYUNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU3BsaW5lQXJlYSA9IFNwbGluZUFyZWFDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0ZXBBcmVhID0gU3RlcEFyZWFDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0YWNrZWRBcmVhID0gU3RhY2tlZEFyZWFDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclN0YWNrZWRBcmVhMTAwID0gU3RhY2tlZEFyZWExMDBDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckJ1YmJsZSA9IEJ1YmJsZUNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyU2NhdHRlciA9IFNjYXR0ZXJDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlckNhbmRsZXN0aWNrID0gQ2FuZGxlc3RpY2tDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclJhbmdlQ29sdW1uID0gUmFuZ2VDb2x1bW5DaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclJhbmdlQmFyID0gUmFuZ2VCYXJDaGFydDtcblxuQ2hhcnQucHJvdG90eXBlLnJlbmRlclJhbmdlQXJlYSA9IFJhbmdlQXJlYUNoYXJ0O1xuXG5DaGFydC5wcm90b3R5cGUucmVuZGVyUmFuZ2VTcGxpbmVBcmVhID0gUmFuZ2VTcGxpbmVBcmVhQ2hhcnQ7XG5cbkNoYXJ0LnByb3RvdHlwZS5yZW5kZXJQaWUgPSBQaWVDaGFydDtcblxuZXhwb3J0IGRlZmF1bHQgQ2hhcnQ7XG4iLCJcbmltcG9ydCBDYW52YXNKU09iamVjdCBmcm9tICcuL2NhbnZhc2pzJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7Y3VsdHVyZXN9IGZyb20gJy4uL2NvbnN0YW50cy9jdWx0dXJlJztcblxuZnVuY3Rpb24gQ3VsdHVyZUluZm8oY3VsdHVyZSkge1xuXG4gIHZhciBjdWx0dXJlSW5mbztcblxuICBpZiAoY3VsdHVyZSAmJiBjdWx0dXJlc1tjdWx0dXJlXSkgY3VsdHVyZUluZm8gPSBjdWx0dXJlc1tjdWx0dXJlXTtcblxuICBDdWx0dXJlSW5mby5iYXNlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgXCJDdWx0dXJlSW5mb1wiLCBjdWx0dXJlSW5mbyk7XG5cbn1cblxuZXh0ZW5kKEN1bHR1cmVJbmZvLCBDYW52YXNKU09iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IEN1bHR1cmVJbmZvO1xuIiwiXG5pbXBvcnQgQ2FudmFzSlNPYmplY3QgZnJvbSAnLi9jYW52YXNqcyc7XG5pbXBvcnQge2V4dGVuZCwgZ2V0UHJvcGVydHl9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5mdW5jdGlvbiBEYXRhU2VyaWVzKGNoYXJ0LCBvcHRpb25zLCB0aGVtZSwgaW5kZXgsIGlkKSB7XG4gIERhdGFTZXJpZXMuYmFzZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIFwiRGF0YVNlcmllc1wiLCBvcHRpb25zLCB0aGVtZSk7XG5cbiAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB0aGlzLmNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgdGhpcy5fY3R4ID0gY2hhcnQuY2FudmFzLmN0eDtcbiAgdGhpcy5pbmRleCA9IGluZGV4O1xuICB0aGlzLm5vRGF0YVBvaW50c0luUGxvdEFyZWEgPSAwO1xuICAvL3RoaXMubWF4V2lkdGhJblggPSAwO1xuICB0aGlzLmlkID0gaWQ7XG4gIHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaWRdID0ge1xuICAgIGlkOiBpZCwgb2JqZWN0VHlwZTogXCJkYXRhU2VyaWVzXCIsIGRhdGFTZXJpZXNJbmRleDogaW5kZXhcbiAgfVxuICB0aGlzLmRhdGFQb2ludElkcyA9IFtdO1xuICB0aGlzLnBsb3RVbml0ID0gW107XG5cbiAgdGhpcy5heGlzWCA9IG51bGw7XG4gIHRoaXMuYXhpc1kgPSBudWxsO1xuXG4gIGlmICh0aGlzLmZpbGxPcGFjaXR5ID09PSBudWxsKSB7XG4gICAgaWYgKHRoaXMudHlwZS5tYXRjaCgvYXJlYS9pKSlcbiAgICAgIHRoaXMuZmlsbE9wYWNpdHkgPSAuNztcbiAgICBlbHNlXG4gICAgICB0aGlzLmZpbGxPcGFjaXR5ID0gMTtcbiAgfVxuXG5cbiAgdGhpcy5heGlzUGxhY2VtZW50ID0gdGhpcy5nZXREZWZhdWx0QXhpc1BsYWNlbWVudCgpO1xuXG4gIGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMuaW5kZXhMYWJlbEZvbnRTaXplKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgdGhpcy5pbmRleExhYmVsRm9udFNpemUgPSB0aGlzLmNoYXJ0LmdldEF1dG9Gb250U2l6ZSh0aGlzLmluZGV4TGFiZWxGb250U2l6ZSk7XG4gIH1cbn1cblxuZXh0ZW5kKERhdGFTZXJpZXMsIENhbnZhc0pTT2JqZWN0KTtcblxuLy9TdGF0aWMgTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYXhpc1BsYWNlbWVudCBmb3IgYSBnaXZlbiBDaGFydFR5cGUuIFJldHVybnMgb25lIG9mIFwibm9ybWFsXCIsIFwieHlTd2FwcGVkXCIsIFwibm9uZVwiXG5EYXRhU2VyaWVzLnByb3RvdHlwZS5nZXREZWZhdWx0QXhpc1BsYWNlbWVudCA9IGZ1bmN0aW9uICgpIHtcblxuICAvL2lmICghdGhpcy52aXNpYmxlKVxuICAvL1x0cmV0dXJuIFwibm9uZVwiO1xuXG4gIC8vdHlwZSA9IHRoaXMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuICBpZiAodHlwZSA9PT0gXCJjb2x1bW5cIiB8fCB0eXBlID09PSBcImxpbmVcIiB8fCB0eXBlID09PSBcInN0ZXBMaW5lXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVcIiB8fCB0eXBlID09PSBcImFyZWFcIiB8fCB0eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkTGluZVwiIHx8IHR5cGUgPT09IFwiYnViYmxlXCIgfHwgdHlwZSA9PT0gXCJzY2F0dGVyXCJcbiAgICB8fCB0eXBlID09PSBcInN0YWNrZWRBcmVhXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkTGluZTEwMFwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIlxuICAgIHx8IHR5cGUgPT09IFwiY2FuZGxlc3RpY2tcIiB8fCB0eXBlID09PSBcIm9obGNcIiB8fCB0eXBlID09PSBcInJhbmdlQ29sdW1uXCIgfHwgdHlwZSA9PT0gXCJyYW5nZUFyZWFcIiB8fCB0eXBlID09PSBcInJhbmdlU3BsaW5lQXJlYVwiKSB7XG4gICAgcmV0dXJuIFwibm9ybWFsXCI7XG4gIH1cbiAgZWxzZSBpZiAodHlwZSA9PT0gXCJiYXJcIiB8fCB0eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCB0eXBlID09PSBcInN0YWNrZWRCYXIxMDBcIiB8fCB0eXBlID09PSBcInJhbmdlQmFyXCIpIHtcblxuICAgIHJldHVybiBcInh5U3dhcHBlZFwiO1xuICB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwicGllXCIgfHwgdHlwZSA9PT0gXCJkb3VnaG51dFwiIHx8IHR5cGUgPT09IFwiZnVubmVsXCIpIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmNvbnNvbGUubG9nKFwiVW5rbm93biBDaGFydCBUeXBlOiBcIiArIHR5cGUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbkRhdGFTZXJpZXMuZ2V0RGVmYXVsdExlZ2VuZE1hcmtlciA9IGZ1bmN0aW9uICh0eXBlKSB7XG5cbiAgLy90eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICh0eXBlID09PSBcImNvbHVtblwiIHx8IHR5cGUgPT09IFwic3RhY2tlZENvbHVtblwiIHx8IHR5cGUgPT09IFwic3RhY2tlZExpbmVcIiB8fCB0eXBlID09PSBcImJhclwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEJhclwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgfHwgdHlwZSA9PT0gXCJidWJibGVcIiB8fCB0eXBlID09PSBcInNjYXR0ZXJcIlxuICAgIHx8IHR5cGUgPT09IFwic3RhY2tlZENvbHVtbjEwMFwiIHx8IHR5cGUgPT09IFwic3RhY2tlZExpbmUxMDBcIiB8fCB0eXBlID09PSBcInN0ZXBBcmVhXCJcbiAgICB8fCB0eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgdHlwZSA9PT0gXCJvaGxjXCIgfHwgdHlwZSA9PT0gXCJyYW5nZUNvbHVtblwiIHx8IHR5cGUgPT09IFwicmFuZ2VCYXJcIiB8fCB0eXBlID09PSBcInJhbmdlQXJlYVwiIHx8IHR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIpIHtcbiAgICByZXR1cm4gXCJzcXVhcmVcIjtcbiAgfVxuICBlbHNlIGlmICh0eXBlID09PSBcImxpbmVcIiB8fCB0eXBlID09PSBcInN0ZXBMaW5lXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVcIiB8fCB0eXBlID09PSBcInBpZVwiIHx8IHR5cGUgPT09IFwiZG91Z2hudXRcIiB8fCB0eXBlID09PSBcImZ1bm5lbFwiKSB7XG4gICAgcmV0dXJuIFwiY2lyY2xlXCI7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJhcmVhXCIgfHwgdHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgdHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IHR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIikge1xuICAgIHJldHVybiBcInRyaWFuZ2xlXCJcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuY29uc29sZS5sb2coXCJVbmtub3duIENoYXJ0IFR5cGU6IFwiICsgdHlwZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy9GaW5kcyBkYXRhUG9pbnQgd2l0aCB0aGUgZ2l2ZW4geCB2YWx1ZS4gSWYgZmluZENsb3Nlc3QgaXMgc2V0LCBmaW5kcyBkYXRhUG9pbnQgd2l0aCBjbG9zZXN0IHggdmFsdWUuXG4vL1JldHVybnMgc2VhcmNoUmVzdWx0IG9iamVjdCBpZiBmb3VuZCwgZWxzZSByZXR1cm5zIG51bGxcbkRhdGFTZXJpZXMucHJvdG90eXBlLmdldERhdGFQb2ludEF0WCA9IGZ1bmN0aW9uICh4LCBmaW5kQ2xvc2VzdCkge1xuXG4gIGlmICghdGhpcy5kYXRhUG9pbnRzIHx8IHRoaXMuZGF0YVBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciBzZWFyY2hSZXN1bHQgPSB7XG4gICAgZGF0YVBvaW50OiBudWxsLCBkaXN0YW5jZTogSW5maW5pdHksIGluZGV4OiBOYU5cbiAgfTtcbiAgdmFyIGRhdGFQb2ludCA9IG51bGw7XG5cbiAgdmFyIGogPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciBkaXJlY3Rpb24gPSAxOyAvLyArMSBmb3IgZm93YXJkIGFuZCAtMSBmb3IgYmFja3dhcmQuXG5cbiAgdmFyIG1pbmltdW1YRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgdmFyIGZvcndhcmRNaXNzQ291bnQgPSAwLCBiYWNrd2FyZE1pc3NDb3VudCA9IDA7XG4gIHZhciBtYXhNaXNzQ291bnQgPSAxMDAwO1xuICB2YXIgc2VhcmNoU3RhcnRJbmRleCA9IDA7XG5cbiAgaWYgKHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1BsYWNlbWVudCAhPT0gXCJub25lXCIpIHtcblxuICAgIC8vdmFyIHhSYW5nZSA9ICh0aGlzLmRhdGFQb2ludHNbdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDFdLnggLSB0aGlzLmRhdGFQb2ludHNbMF0ueCk7XG5cbiAgICAvL2lmICh4UmFuZ2UgPiAwKVxuICAgIC8vXHRzZWFyY2hTdGFydEluZGV4ID0gKCh0aGlzLmRhdGFQb2ludHMubGVuZ3RoIC0gMSkgLyB4UmFuZ2UgKiAoeCAtIHRoaXMuZGF0YVBvaW50c1swXS54KSkgPj4gMDtcbiAgICAvL2Vsc2VcbiAgICAvL1x0c2VhcmNoU3RhcnRJbmRleCA9IDA7XG5cbiAgICB2YXIgeFJhbmdlID0gKHRoaXMuZGF0YVBvaW50c1t0aGlzLmRhdGFQb2ludHMubGVuZ3RoIC0gMV0ueCAtIHRoaXMuZGF0YVBvaW50c1swXS54KTtcblxuICAgIGlmICh4UmFuZ2UgPiAwKVxuICAgICAgc2VhcmNoU3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDEpIC8geFJhbmdlICogKHggLSB0aGlzLmRhdGFQb2ludHNbMF0ueCkpID4+IDAsIDApLCB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKTtcbiAgICBlbHNlXG4gICAgICBzZWFyY2hTdGFydEluZGV4ID0gMDtcblxuICAgIC8vc2VhcmNoU3RhcnRJbmRleCA9ICgodGhpcy5kYXRhUG9pbnRzW3RoaXMuZGF0YVBvaW50cy5sZW5ndGggLSAxXS54IC0gdGhpcy5kYXRhUG9pbnRzWzBdLngpIC8gdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAqICh4IC0gdGhpcy5kYXRhUG9pbnRzWzBdLngpKSA+PiAwO1xuICB9XG5cbiAgd2hpbGUgKHRydWUpIHtcblxuICAgIGkgPSAoZGlyZWN0aW9uID4gMCkgPyBzZWFyY2hTdGFydEluZGV4ICsgaiA6IHNlYXJjaFN0YXJ0SW5kZXggLSBqO1xuXG4gICAgaWYgKGkgPj0gMCAmJiBpIDwgdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCkge1xuXG4gICAgICBkYXRhUG9pbnQgPSB0aGlzLmRhdGFQb2ludHNbaV07XG5cbiAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguYWJzKGRhdGFQb2ludC54IC0geCk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA8IHNlYXJjaFJlc3VsdC5kaXN0YW5jZSkge1xuICAgICAgICBzZWFyY2hSZXN1bHQuZGF0YVBvaW50ID0gZGF0YVBvaW50O1xuICAgICAgICBzZWFyY2hSZXN1bHQuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2VhcmNoUmVzdWx0LmluZGV4ID0gaTtcbiAgICAgIH1cblxuICAgICAgdmFyIHhEaXN0YW5jZSA9IE1hdGguYWJzKGRhdGFQb2ludC54IC0geCk7XG4gICAgICBpZiAoeERpc3RhbmNlIDw9IG1pbmltdW1YRGlzdGFuY2UpXG4gICAgICAgIG1pbmltdW1YRGlzdGFuY2UgPSB4RGlzdGFuY2U7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApXG4gICAgICAgICAgZm9yd2FyZE1pc3NDb3VudCsrO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgYmFja3dhcmRNaXNzQ291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcndhcmRNaXNzQ291bnQgPiBtYXhNaXNzQ291bnQgJiYgYmFja3dhcmRNaXNzQ291bnQgPiBtYXhNaXNzQ291bnQpXG4gICAgICAgIGJyZWFrO1xuXG5cbiAgICB9IGVsc2UgaWYgKHNlYXJjaFN0YXJ0SW5kZXggLSBqIDwgMCAmJiBzZWFyY2hTdGFydEluZGV4ICsgaiA+PSB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKVxuICAgICAgYnJlYWs7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgaisrO1xuICAgICAgZGlyZWN0aW9uID0gMTtcbiAgICB9IGVsc2VcbiAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICB9XG5cblxuICBpZiAoIWZpbmRDbG9zZXN0ICYmIHNlYXJjaFJlc3VsdC5kYXRhUG9pbnQueCA9PT0geClcbiAgICByZXR1cm4gc2VhcmNoUmVzdWx0O1xuICBlbHNlIGlmIChmaW5kQ2xvc2VzdCAmJiBzZWFyY2hSZXN1bHQuZGF0YVBvaW50ICE9PSBudWxsKVxuICAgIHJldHVybiBzZWFyY2hSZXN1bHQ7XG4gIGVsc2VcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLy8geCAmIHkgc2hvdWxkIGJlIGluIHBpeGVscy4gQ2FuIGJlIHVzZWQgb25seSBhZnRlciByZW5kZXJpbmcgdGhlIGNoYXJ0LlxuRGF0YVNlcmllcy5wcm90b3R5cGUuZ2V0RGF0YVBvaW50QXRYWSA9IGZ1bmN0aW9uICh4LCB5LCBnZXRDbG9zZXN0KSB7XG5cbiAgaWYgKCF0aGlzLmRhdGFQb2ludHMgfHwgdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgZ2V0Q2xvc2VzdCA9IGdldENsb3Nlc3QgfHwgZmFsc2U7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBqID0gMCwgaSA9IDA7XG4gIHZhciBkaXJlY3Rpb24gPSAxOyAvLyArMSBmb3IgZm93YXJkIGFuZCAtMSBmb3IgYmFja3dhcmQuXG4gIHZhciBmb3VuZERhdGFQb2ludCA9IGZhbHNlO1xuICB2YXIgbWluaW11bVhEaXN0YW5jZSA9IEluZmluaXR5O1xuICB2YXIgZm9yd2FyZE1pc3NDb3VudCA9IDAsIGJhY2t3YXJkTWlzc0NvdW50ID0gMDtcbiAgdmFyIG1heE1pc3NDb3VudCA9IDEwMDA7XG4gIHZhciBzZWFyY2hTdGFydEluZGV4ID0gMDtcblxuICBpZiAodGhpcy5jaGFydC5wbG90SW5mby5heGlzUGxhY2VtZW50ICE9PSBcIm5vbmVcIikge1xuICAgIHZhciB4dmFsID0gdGhpcy5jaGFydC5heGlzWC5nZXRYVmFsdWVBdCh7IHg6IHgsIHk6IHkgfSk7XG5cbiAgICB2YXIgeFJhbmdlID0gKHRoaXMuZGF0YVBvaW50c1t0aGlzLmRhdGFQb2ludHMubGVuZ3RoIC0gMV0ueCAtIHRoaXMuZGF0YVBvaW50c1swXS54KTtcblxuICAgIGlmICh4UmFuZ2UgPiAwKVxuICAgICAgc2VhcmNoU3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDEpIC8geFJhbmdlICogKHh2YWwgLSB0aGlzLmRhdGFQb2ludHNbMF0ueCkpID4+IDAsIDApLCB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKTtcbiAgICBlbHNlXG4gICAgICBzZWFyY2hTdGFydEluZGV4ID0gMDtcblxuICAgIC8vdmFyIHhSYW5nZSA9ICh0aGlzLmF4aXNYLl9hYnNvbHV0ZU1heGltdW0gLSB0aGlzLmF4aXNYLl9hYnNvbHV0ZU1pbmltdW0pO1xuXG4gICAgLy9pZiAoeFJhbmdlID4gMClcbiAgICAvL1x0c2VhcmNoU3RhcnRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KCgodGhpcy5kYXRhUG9pbnRzLmxlbmd0aCAtIDEpIC8geFJhbmdlICogKHh2YWwgLSB0aGlzLmF4aXNYLl9hYnNvbHV0ZU1pbmltdW0pKSA+PiAwLCAwKSwgdGhpcy5kYXRhUG9pbnRzLmxlbmd0aCk7XG4gICAgLy9lbHNlXG4gICAgLy9cdHNlYXJjaFN0YXJ0SW5kZXggPSAwO1xuICB9XG5cbiAgd2hpbGUgKHRydWUpIHtcblxuICAgIC8vaSA9IHNlYXJjaFN0YXJ0SW5kZXggKyAoaiAqIGRpcmVjdGlvbik7XG4gICAgaSA9IChkaXJlY3Rpb24gPiAwKSA/IHNlYXJjaFN0YXJ0SW5kZXggKyBqIDogc2VhcmNoU3RhcnRJbmRleCAtIGo7XG5cbiAgICBpZiAoaSA+PSAwICYmIGkgPCB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKSB7XG5cbiAgICAgIHZhciBpZCA9IHRoaXMuZGF0YVBvaW50SWRzW2ldO1xuICAgICAgdmFyIHZpc3VhbEluZm8gPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXTtcbiAgICAgIHZhciBkYXRhUG9pbnQgPSB0aGlzLmRhdGFQb2ludHNbaV07XG4gICAgICB2YXIgZGlzdGFuY2UgPSBudWxsO1xuXG4gICAgICBpZiAodmlzdWFsSW5mbykge1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG5cbiAgICAgICAgICBjYXNlIFwiY29sdW1uXCI6XG4gICAgICAgICAgY2FzZSBcInN0YWNrZWRDb2x1bW5cIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZENvbHVtbjEwMFwiOlxuICAgICAgICAgIGNhc2UgXCJiYXJcIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZEJhclwiOlxuICAgICAgICAgIGNhc2UgXCJzdGFja2VkQmFyMTAwXCI6XG4gICAgICAgICAgY2FzZSBcInJhbmdlQ29sdW1uXCI6XG4gICAgICAgICAgY2FzZSBcInJhbmdlQmFyXCI6XG5cbiAgICAgICAgICAgIGlmICh4ID49IHZpc3VhbEluZm8ueDEgJiYgeCA8PSB2aXN1YWxJbmZvLngyICYmIHkgPj0gdmlzdWFsSW5mby55MSAmJiB5IDw9IHZpc3VhbEluZm8ueTIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBNYXRoLm1pbihNYXRoLmFicyh2aXN1YWxJbmZvLngxIC0geCksIE1hdGguYWJzKHZpc3VhbEluZm8ueDIgLSB4KSwgTWF0aC5hYnModmlzdWFsSW5mby55MSAtIHkpLCBNYXRoLmFicyh2aXN1YWxJbmZvLnkyIC0geSkpXG4gICAgICAgICAgICAgICAgLy9kaXN0YW5jZTowXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGZvdW5kRGF0YVBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgICBjYXNlIFwic3RlcExpbmVcIjpcbiAgICAgICAgICBjYXNlIFwic3BsaW5lXCI6XG4gICAgICAgICAgY2FzZSBcImFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwic3RlcEFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZEFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwic3RhY2tlZEFyZWExMDBcIjpcbiAgICAgICAgICBjYXNlIFwic3BsaW5lQXJlYVwiOlxuICAgICAgICAgIGNhc2UgXCJzY2F0dGVyXCI6XG4gICAgICAgICAgICB2YXIgbWFya2VyU2l6ZSA9IGdldFByb3BlcnR5KFwibWFya2VyU2l6ZVwiLCBkYXRhUG9pbnQsIHRoaXMpIHx8IDQ7XG4gICAgICAgICAgICB2YXIgc25hcERpc3RhbmNlID0gZ2V0Q2xvc2VzdCA/IDIwIDogbWFya2VyU2l6ZTtcblxuICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3codmlzdWFsSW5mby54MSAtIHgsIDIpICsgTWF0aC5wb3codmlzdWFsSW5mby55MSAtIHksIDIpKTtcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8PSBzbmFwRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHhEaXN0YW5jZSA9IE1hdGguYWJzKHZpc3VhbEluZm8ueDEgLSB4KTtcbiAgICAgICAgICAgIGlmICh4RGlzdGFuY2UgPD0gbWluaW11bVhEaXN0YW5jZSlcbiAgICAgICAgICAgICAgbWluaW11bVhEaXN0YW5jZSA9IHhEaXN0YW5jZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID4gMClcbiAgICAgICAgICAgICAgICBmb3J3YXJkTWlzc0NvdW50Kys7XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBiYWNrd2FyZE1pc3NDb3VudCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbWFya2VyU2l6ZSAvIDIpIHtcbiAgICAgICAgICAgICAgZm91bmREYXRhUG9pbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJyYW5nZUFyZWFcIjpcbiAgICAgICAgICBjYXNlIFwicmFuZ2VTcGxpbmVBcmVhXCI6XG5cbiAgICAgICAgICAgIHZhciBtYXJrZXJTaXplID0gZ2V0UHJvcGVydHkoXCJtYXJrZXJTaXplXCIsIGRhdGFQb2ludCwgdGhpcykgfHwgNDtcbiAgICAgICAgICAgIHZhciBzbmFwRGlzdGFuY2UgPSBnZXRDbG9zZXN0ID8gMjAgOiBtYXJrZXJTaXplO1xuXG4gICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGgubWluKE1hdGguc3FydChNYXRoLnBvdyh2aXN1YWxJbmZvLngxIC0geCwgMikgKyBNYXRoLnBvdyh2aXN1YWxJbmZvLnkxIC0geSwgMikpLCBNYXRoLnNxcnQoTWF0aC5wb3codmlzdWFsSW5mby54MSAtIHgsIDIpICsgTWF0aC5wb3codmlzdWFsSW5mby55MiAtIHksIDIpKSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gc25hcERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YVBvaW50OiBkYXRhUG9pbnQsXG4gICAgICAgICAgICAgICAgZGF0YVBvaW50SW5kZXg6IGksXG4gICAgICAgICAgICAgICAgZGF0YVNlcmllczogdGhpcyxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGlzdGFuY2VcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB4RGlzdGFuY2UgPSBNYXRoLmFicyh2aXN1YWxJbmZvLngxIC0geCk7XG4gICAgICAgICAgICBpZiAoeERpc3RhbmNlIDw9IG1pbmltdW1YRGlzdGFuY2UpXG4gICAgICAgICAgICAgIG1pbmltdW1YRGlzdGFuY2UgPSB4RGlzdGFuY2U7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApXG4gICAgICAgICAgICAgICAgZm9yd2FyZE1pc3NDb3VudCsrO1xuICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYmFja3dhcmRNaXNzQ291bnQrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IG1hcmtlclNpemUgLyAyKSB7XG4gICAgICAgICAgICAgIGZvdW5kRGF0YVBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYnViYmxlXCI6XG4gICAgICAgICAgICB2YXIgbWFya2VyU2l6ZSA9IHZpc3VhbEluZm8uc2l6ZTtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5zcXJ0KE1hdGgucG93KHZpc3VhbEluZm8ueDEgLSB4LCAyKSArIE1hdGgucG93KHZpc3VhbEluZm8ueTEgLSB5LCAyKSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbWFya2VyU2l6ZSAvIDIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBmb3VuZERhdGFQb2ludCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJwaWVcIjpcbiAgICAgICAgICBjYXNlIFwiZG91Z2hudXRcIjpcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB2aXN1YWxJbmZvLmNlbnRlcjtcbiAgICAgICAgICAgIHZhciBpbm5lclJhZGl1cyA9IHRoaXMudHlwZSA9PT0gXCJkb3VnaG51dFwiID8gdmlzdWFsSW5mby5wZXJjZW50SW5uZXJSYWRpdXMgKiB2aXN1YWxJbmZvLnJhZGl1cyA6IDA7XG5cbiAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5zcXJ0KE1hdGgucG93KGNlbnRlci54IC0geCwgMikgKyBNYXRoLnBvdyhjZW50ZXIueSAtIHksIDIpKTtcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IHZpc3VhbEluZm8ucmFkaXVzICYmIGRpc3RhbmNlID4gaW5uZXJSYWRpdXMpIHtcblxuICAgICAgICAgICAgICB2YXIgZGVsdGFZID0geSAtIGNlbnRlci55O1xuICAgICAgICAgICAgICB2YXIgZGVsdGFYID0geCAtIGNlbnRlci54O1xuICAgICAgICAgICAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGRlbHRhWSwgZGVsdGFYKTtcblxuICAgICAgICAgICAgICBpZiAoYW5nbGUgPCAwKVxuICAgICAgICAgICAgICAgIGFuZ2xlICs9IE1hdGguUEkgKiAyO1xuXG4gICAgICAgICAgICAgIGFuZ2xlID0gTnVtYmVyKCgoKGFuZ2xlIC8gTWF0aC5QSSAqIDE4MCAlIDM2MCkgKyAzNjApICUgMzYwKS50b0ZpeGVkKDEyKSk7XG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYW5nbGUpO1xuXG5cbiAgICAgICAgICAgICAgdmFyIHN0YXJ0QW5nbGUgPSBOdW1iZXIoKCgodmlzdWFsSW5mby5zdGFydEFuZ2xlIC8gTWF0aC5QSSAqIDE4MCAlIDM2MCkgKyAzNjApICUgMzYwKS50b0ZpeGVkKDEyKSk7XG4gICAgICAgICAgICAgIHZhciBlbmRBbmdsZSA9IE51bWJlcigoKCh2aXN1YWxJbmZvLmVuZEFuZ2xlIC8gTWF0aC5QSSAqIDE4MCAlIDM2MCkgKyAzNjApICUgMzYwKS50b0ZpeGVkKDEyKSk7XG5cbiAgICAgICAgICAgICAgLy9TbyB0aGF0IGRhdGEgcG9pbnQgaXMgZGV0ZWN0ZWQgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBkYXRhUG9pbnRcbiAgICAgICAgICAgICAgaWYgKGVuZEFuZ2xlID09PSAwICYmIHZpc3VhbEluZm8uZW5kQW5nbGUgPiAxKSB7XG4gICAgICAgICAgICAgICAgZW5kQW5nbGUgPSAzNjA7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc3RhcnRBbmdsZSA+PSBlbmRBbmdsZSAmJiBkYXRhUG9pbnQueSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGVuZEFuZ2xlICs9IDM2MDtcblxuICAgICAgICAgICAgICAgIGlmIChhbmdsZSA8IHN0YXJ0QW5nbGUpXG4gICAgICAgICAgICAgICAgICBhbmdsZSArPSAzNjA7XG4gICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgIGlmIChhbmdsZSA+IHN0YXJ0QW5nbGUgJiYgYW5nbGUgPCBlbmRBbmdsZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICAgIGRhdGFQb2ludEluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgZGF0YVNlcmllczogdGhpcyxcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmb3VuZERhdGFQb2ludCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJjYW5kbGVzdGlja1wiOlxuICAgICAgICAgICAgaWYgKCgoeCA+PSAodmlzdWFsSW5mby54MSAtIHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzIC8gMikpICYmICh4IDw9ICh2aXN1YWxJbmZvLngyICsgdmlzdWFsSW5mby5ib3JkZXJUaGlja25lc3MgLyAyKSlcbiAgICAgICAgICAgICAgJiYgKHkgPj0gdmlzdWFsSW5mby55MiAtIHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzIC8gMikgJiYgKHkgPD0gdmlzdWFsSW5mby55MyArIHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzIC8gMikpXG4gICAgICAgICAgICAgIHx8IChNYXRoLmFicyh2aXN1YWxJbmZvLngyIC0geCArIHZpc3VhbEluZm8ueDEgLSB4KSA8IHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzICYmICh5ID49IHZpc3VhbEluZm8ueTEgJiYgeSA8PSB2aXN1YWxJbmZvLnk0KSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgICAgICAgICBkYXRhUG9pbnRJbmRleDogaSxcbiAgICAgICAgICAgICAgICBkYXRhU2VyaWVzOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBNYXRoLm1pbihNYXRoLmFicyh2aXN1YWxJbmZvLngxIC0geCksIE1hdGguYWJzKHZpc3VhbEluZm8ueDIgLSB4KSwgTWF0aC5hYnModmlzdWFsSW5mby55MiAtIHkpLCBNYXRoLmFicyh2aXN1YWxJbmZvLnkzIC0geSkpXG4gICAgICAgICAgICAgICAgLy9kaXN0YW5jZTowXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGZvdW5kRGF0YVBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIm9obGNcIjpcblxuICAgICAgICAgICAgaWYgKChNYXRoLmFicyh2aXN1YWxJbmZvLngyIC0geCArIHZpc3VhbEluZm8ueDEgLSB4KSA8IHZpc3VhbEluZm8uYm9yZGVyVGhpY2tuZXNzICYmICh5ID49IHZpc3VhbEluZm8ueTIgJiYgeSA8PSB2aXN1YWxJbmZvLnkzKSlcblxuICAgICAgICAgICAgICB8fCAoeCA+PSB2aXN1YWxJbmZvLngxICYmICh4IDw9ICh2aXN1YWxJbmZvLngyICsgdmlzdWFsSW5mby54MSkgLyAyKVxuICAgICAgICAgICAgICAgICYmICh5ID49IHZpc3VhbEluZm8ueTEgLSB2aXN1YWxJbmZvLmJvcmRlclRoaWNrbmVzcyAvIDIpICYmICh5IDw9IHZpc3VhbEluZm8ueTEgKyB2aXN1YWxJbmZvLmJvcmRlclRoaWNrbmVzcyAvIDIpKVxuXG4gICAgICAgICAgICAgIHx8ICgoeCA+PSAodmlzdWFsSW5mby54MSArIHZpc3VhbEluZm8ueDIpIC8gMikgJiYgKHggPD0gdmlzdWFsSW5mby54MilcbiAgICAgICAgICAgICAgICAmJiAoeSA+PSB2aXN1YWxJbmZvLnk0IC0gdmlzdWFsSW5mby5ib3JkZXJUaGlja25lc3MgLyAyKSAmJiAoeSA8PSB2aXN1YWxJbmZvLnk0ICsgdmlzdWFsSW5mby5ib3JkZXJUaGlja25lc3MgLyAyKSkpIHtcblxuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGFQb2ludDogZGF0YVBvaW50LFxuICAgICAgICAgICAgICAgIGRhdGFQb2ludEluZGV4OiBpLFxuICAgICAgICAgICAgICAgIGRhdGFTZXJpZXM6IHRoaXMsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IE1hdGgubWluKE1hdGguYWJzKHZpc3VhbEluZm8ueDEgLSB4KSwgTWF0aC5hYnModmlzdWFsSW5mby54MiAtIHgpLCBNYXRoLmFicyh2aXN1YWxJbmZvLnkyIC0geSksIE1hdGguYWJzKHZpc3VhbEluZm8ueTMgLSB5KSlcbiAgICAgICAgICAgICAgICAvL2Rpc3RhbmNlOjBcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZm91bmREYXRhUG9pbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3VuZERhdGFQb2ludCB8fCAoZm9yd2FyZE1pc3NDb3VudCA+IG1heE1pc3NDb3VudCAmJiBiYWNrd2FyZE1pc3NDb3VudCA+IG1heE1pc3NDb3VudCkpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHNlYXJjaFN0YXJ0SW5kZXggLSBqIDwgMCAmJiBzZWFyY2hTdGFydEluZGV4ICsgaiA+PSB0aGlzLmRhdGFQb2ludHMubGVuZ3RoKVxuICAgICAgYnJlYWs7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgaisrO1xuICAgICAgZGlyZWN0aW9uID0gMTtcbiAgICB9IGVsc2VcbiAgICAgIGRpcmVjdGlvbiA9IC0xO1xuXG4gIH1cblxuXG5cbiAgdmFyIGNsb3Nlc3RSZXN1bHQgPSBudWxsO1xuXG4gIGZvciAodmFyIG0gPSAwOyBtIDwgcmVzdWx0cy5sZW5ndGg7IG0rKykge1xuICAgIGlmICghY2xvc2VzdFJlc3VsdCkge1xuICAgICAgY2xvc2VzdFJlc3VsdCA9IHJlc3VsdHNbbV07XG4gICAgfSBlbHNlIGlmIChyZXN1bHRzW21dLmRpc3RhbmNlIDw9IGNsb3Nlc3RSZXN1bHQuZGlzdGFuY2UpIHtcbiAgICAgIGNsb3Nlc3RSZXN1bHQgPSByZXN1bHRzW21dO1xuICAgIH1cbiAgfVxuXG4gIC8vaWYgKHdpbmRvdy5jb25zb2xlKVxuICAvL1x0d2luZG93LmNvbnNvbGUubG9nKFwiZm9yd2FyZE1pc3NDb3VudDogXCIgKyBmb3J3YXJkTWlzc0NvdW50ICsgXCI7IGJhY2t3YXJkTWlzc0NvdW50OiBcIiArIGJhY2t3YXJkTWlzc0NvdW50ICsgXCI7IGdldENsb3Nlc3Q6IFwiICsgZ2V0Q2xvc2VzdCk7XG5cbiAgLy9pZiAod2luZG93LmNvbnNvbGUgJiYgY2xvc2VzdFJlc3VsdClcbiAgLy8gICAgd2luZG93LmNvbnNvbGUubG9nKGogKyBcIjogZGlzdGFuY2UgPSBcIiArIGNsb3Nlc3RSZXN1bHQuZGlzdGFuY2UpO1xuXG4gIHJldHVybiBjbG9zZXN0UmVzdWx0O1xufVxuXG5EYXRhU2VyaWVzLnByb3RvdHlwZS5nZXRNYXJrZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGluZGV4LCB4LCB5LCBjdHgpIHtcbiAgdmFyIGRhdGFQb2ludHMgPSB0aGlzLmRhdGFQb2ludHM7XG4gIHZhciBkYXRhU2VyaWVzID0gdGhpcztcblxuICB2YXIgbWFya2VyQ29sb3IgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJDb2xvciA/IGRhdGFQb2ludHNbaW5kZXhdLm1hcmtlckNvbG9yIDogZGF0YVNlcmllcy5tYXJrZXJDb2xvciA/IGRhdGFTZXJpZXMubWFya2VyQ29sb3IgOiBkYXRhUG9pbnRzW2luZGV4XS5jb2xvciA/IGRhdGFQb2ludHNbaW5kZXhdLmNvbG9yIDogZGF0YVNlcmllcy5jb2xvciA/IGRhdGFTZXJpZXMuY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtpbmRleCAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG4gIHZhciBtYXJrZXJCb3JkZXJDb2xvciA9IGRhdGFQb2ludHNbaW5kZXhdLm1hcmtlckJvcmRlckNvbG9yID8gZGF0YVBvaW50c1tpbmRleF0ubWFya2VyQm9yZGVyQ29sb3IgOiBkYXRhU2VyaWVzLm1hcmtlckJvcmRlckNvbG9yID8gZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvciA6IG51bGw7XG4gIHZhciBtYXJrZXJCb3JkZXJUaGlja25lc3MgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJCb3JkZXJUaGlja25lc3MgOiBkYXRhU2VyaWVzLm1hcmtlckJvcmRlclRoaWNrbmVzcyA/IGRhdGFTZXJpZXMubWFya2VyQm9yZGVyVGhpY2tuZXNzIDogbnVsbDtcbiAgdmFyIG1hcmtlclR5cGUgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJUeXBlID8gZGF0YVBvaW50c1tpbmRleF0ubWFya2VyVHlwZSA6IGRhdGFTZXJpZXMubWFya2VyVHlwZTtcbiAgdmFyIG1hcmtlclNpemUgPSBkYXRhUG9pbnRzW2luZGV4XS5tYXJrZXJTaXplID8gZGF0YVBvaW50c1tpbmRleF0ubWFya2VyU2l6ZSA6IGRhdGFTZXJpZXMubWFya2VyU2l6ZTtcblxuXG4gIHJldHVybiB7XG4gICAgeDogeCwgeTogeSwgY3R4OiBjdHgsXG4gICAgdHlwZTogbWFya2VyVHlwZSxcbiAgICBzaXplOiBtYXJrZXJTaXplLFxuICAgIGNvbG9yOiBtYXJrZXJDb2xvcixcbiAgICBib3JkZXJDb2xvcjogbWFya2VyQm9yZGVyQ29sb3IsXG4gICAgYm9yZGVyVGhpY2tuZXNzOiBtYXJrZXJCb3JkZXJUaGlja25lc3NcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRhU2VyaWVzO1xuIiwiXG5pbXBvcnQge2NyZWF0ZUNhbnZhcywgZ2V0TW91c2VDb29yZGluYXRlcywgaXNDYW52YXNTdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5mdW5jdGlvbiBFdmVudE1hbmFnZXIoY2hhcnQpIHtcbiAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB0aGlzLmxhc3RPYmplY3RJZCA9IDA7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMub2JqZWN0TWFwID0gW107XG4gIHRoaXMucmVjdGFuZ3VsYXJSZWdpb25FdmVudFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgdGhpcy5wcmV2aW91c0RhdGFQb2ludEV2ZW50T2JqZWN0ID0gbnVsbDtcbiAgLy90aGlzLnByZXZpb3VzRGF0YVNlcmllc0V2ZW50T2JqZWN0ID0gbnVsbDtcblxuICB0aGlzLmdob3N0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMuY2hhcnQud2lkdGgsIHRoaXMuY2hhcnQuaGVpZ2h0KTtcbiAgLy90aGlzLmdob3N0Q2FudmFzLndpZHRoID0gdGhpcy5jaGFydC53aWR0aDtcbiAgLy90aGlzLmdob3N0Q2FudmFzLmhlaWdodCA9IHRoaXMuY2hhcnQuaGVpZ2h0O1xuXG4gIHRoaXMuZ2hvc3RDdHggPSB0aGlzLmdob3N0Q2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICB2YXIgZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgX3RoaXMubW91c2VFdmVudEhhbmRsZXIuY2FsbChfdGhpcywgZXYpO1xuICB9O1xuXG4gIHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzID0gW107XG4gIC8vdGhpcy5jaGFydC5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBldmVudEhhbmRsZXIpO1xuICAvL3RoaXMuY2hhcnQuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgZXZlbnRIYW5kbGVyKTtcbiAgLy90aGlzLmNoYXJ0LmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgZXZlbnRIYW5kbGVyKTtcbiAgLy90aGlzLmNoYXJ0LmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZXZlbnRIYW5kbGVyKTtcbn1cblxuRXZlbnRNYW5hZ2VyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5sYXN0T2JqZWN0SWQgPSAwO1xuICB0aGlzLm9iamVjdE1hcCA9IFtdO1xuICB0aGlzLnJlY3Rhbmd1bGFyUmVnaW9uRXZlbnRTdWJzY3JpcHRpb25zID0gW107XG4gIHRoaXMucHJldmlvdXNEYXRhUG9pbnRFdmVudE9iamVjdCA9IG51bGw7XG5cbiAgdGhpcy5ldmVudE9iamVjdHMgPSBbXTtcbiAgLy90aGlzLmdob3N0Q2FudmFzLndpZHRoID0gdGhpcy5jaGFydC53aWR0aDtcbiAgLy90aGlzLmdob3N0Q2FudmFzLmhlaWdodCA9IHRoaXMuY2hhcnQuaGVpZ2h0O1xuXG4gIGlmIChpc0NhbnZhc1N1cHBvcnRlZCkge1xuICAgIHRoaXMuZ2hvc3RDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2hhcnQud2lkdGgsIHRoaXMuY2hhcnQuaGVpZ2h0KTtcbiAgICB0aGlzLmdob3N0Q3R4LmJlZ2luUGF0aCgpO1xuICB9XG59XG5cbkV2ZW50TWFuYWdlci5wcm90b3R5cGUuZ2V0TmV3T2JqZWN0VHJhY2tpbmdJZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICsrdGhpcy5sYXN0T2JqZWN0SWQ7XG59XG5cbkV2ZW50TWFuYWdlci5wcm90b3R5cGUubW91c2VFdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoZXYpIHtcblxuICBpZiAoZXYudHlwZSAhPT0gXCJtb3VzZW1vdmVcIiAmJiBldi50eXBlICE9PSBcImNsaWNrXCIpXG4gICAgcmV0dXJuO1xuXG4gIHZhciBldmVudE9iamVjdE1hcHMgPSBbXTtcbiAgdmFyIHh5ID0gZ2V0TW91c2VDb29yZGluYXRlcyhldik7XG4gIHZhciBpZCA9IG51bGw7XG5cbiAgLy92YXIgZGF0YVBvaW50SW5mbyA9IHRoaXMuY2hhcnQuZ2V0RGF0YVBvaW50QXRYWSh4eS54LCB4eS55LCBmYWxzZSk7XG5cbiAgLy9pZiAoZGF0YVBvaW50SW5mbykge1xuICAvL1x0aWQgPSBkYXRhUG9pbnRJbmZvLmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2RhdGFQb2ludEluZm8uZGF0YVBvaW50SW5kZXhdO1xuICAvL30gZWxzZSBpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHsvL0lFOStcbiAgLy9cdGlkID0gZ2V0T2JqZWN0SWQoeHkueCwgeHkueSwgdGhpcy5naG9zdEN0eCk7XG4gIC8vfVxuICBpZCA9IHRoaXMuY2hhcnQuZ2V0T2JqZWN0QXRYWSh4eS54LCB4eS55LCBmYWxzZSk7XG5cbiAgaWYgKGlkICYmIHR5cGVvZiAodGhpcy5vYmplY3RNYXBbaWRdKSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgdmFyIGV2ZW50T2JqZWN0TWFwID0gdGhpcy5vYmplY3RNYXBbaWRdO1xuXG4gICAgaWYgKGV2ZW50T2JqZWN0TWFwLm9iamVjdFR5cGUgPT09IFwiZGF0YVBvaW50XCIpIHtcbiAgICAgIHZhciBkYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW2V2ZW50T2JqZWN0TWFwLmRhdGFTZXJpZXNJbmRleF07XG4gICAgICB2YXIgZGF0YVBvaW50ID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW2V2ZW50T2JqZWN0TWFwLmRhdGFQb2ludEluZGV4XTtcbiAgICAgIHZhciBkYXRhUG9pbnRJbmRleCA9IGV2ZW50T2JqZWN0TWFwLmRhdGFQb2ludEluZGV4O1xuXG4gICAgICAvL0V2ZW50IFBhcmFtZXRlciBzaG91bGQgbm90IGNvbnRhaW4gcmVmZXJlbmNlIHRvIGRhdGFTZXJpZXMgZGlyZWN0bHkuIEJ1dCB0byBpdHMgb3B0aW9ucy5cbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50UGFyYW1ldGVyID0ge1xuICAgICAgICB4OiB4eS54LCB5OiB4eS55LCBkYXRhUG9pbnQ6IGRhdGFQb2ludCxcbiAgICAgICAgZGF0YVNlcmllczogZGF0YVNlcmllcy5fb3B0aW9ucywgZGF0YVBvaW50SW5kZXg6IGRhdGFQb2ludEluZGV4LCBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXMuaW5kZXgsXG4gICAgICAgIGNoYXJ0OiB0aGlzLmNoYXJ0Ll9wdWJsaWNDaGFydFJlZmVyZW5jZVxuICAgICAgfTtcbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dCA9IHtcbiAgICAgICAgY29udGV4dDogZGF0YVBvaW50LCB1c2VyQ29udGV4dDogZGF0YVBvaW50LCBtb3VzZW92ZXI6IFwibW91c2VvdmVyXCIsIG1vdXNlbW92ZTogXCJtb3VzZW1vdmVcIiwgbW91c2VvdXQ6IFwibW91c2VvdXRcIiwgY2xpY2s6IFwiY2xpY2tcIlxuICAgICAgfTtcbiAgICAgIGV2ZW50T2JqZWN0TWFwcy5wdXNoKGV2ZW50T2JqZWN0TWFwKTtcblxuICAgICAgLy9BZGQgRGF0YXNlcmllcyB0b28gYmVjYXVzZSBtb3VzZSBldmVudCBvbiBkYXRhUG9pbnQgYWxzbyBtZWFucyB0aGVyZSBpcyBhbiBldmVudCBvbiBkYXRhU2VyaWVzLiBEYXRhU2VyaWVzIGlzIG5vdCBwcmVzZW50IG9uIGdob3N0IGNhbnZhc1xuICAgICAgZXZlbnRPYmplY3RNYXAgPSB0aGlzLm9iamVjdE1hcFtkYXRhU2VyaWVzLmlkXTtcblxuICAgICAgLy9FdmVudCBQYXJhbWV0ZXIgc2hvdWxkIG5vdCBjb250YWluIHJlZmVyZW5jZSB0byBkYXRhU2VyaWVzIGRpcmVjdGx5LiBCdXQgdG8gaXRzIG9wdGlvbnMuXG4gICAgICBldmVudE9iamVjdE1hcC5ldmVudFBhcmFtZXRlciA9IHtcbiAgICAgICAgeDogeHkueCwgeTogeHkueSxcbiAgICAgICAgZGF0YVBvaW50OiBkYXRhUG9pbnQsIGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMuX29wdGlvbnMsIGRhdGFQb2ludEluZGV4OiBkYXRhUG9pbnRJbmRleCwgZGF0YVNlcmllc0luZGV4OiBkYXRhU2VyaWVzLmluZGV4LFxuICAgICAgICBjaGFydDogdGhpcy5jaGFydC5fcHVibGljQ2hhcnRSZWZlcmVuY2VcbiAgICAgIH07XG5cbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dCA9IHtcbiAgICAgICAgY29udGV4dDogZGF0YVNlcmllcywgdXNlckNvbnRleHQ6IGRhdGFTZXJpZXMuX29wdGlvbnMsIG1vdXNlb3ZlcjogXCJtb3VzZW92ZXJcIiwgbW91c2Vtb3ZlOiBcIm1vdXNlbW92ZVwiLCBtb3VzZW91dDogXCJtb3VzZW91dFwiLCBjbGljazogXCJjbGlja1wiXG4gICAgICB9O1xuICAgICAgZXZlbnRPYmplY3RNYXBzLnB1c2godGhpcy5vYmplY3RNYXBbZGF0YVNlcmllcy5pZF0pO1xuICAgIH1cbiAgICAgIC8vZWxzZSBpZiAoZXZlbnRPYmplY3RNYXAub2JqZWN0VHlwZSA9PT0gXCJzdHJpcExpbmVcIikge1xuXG4gICAgICAvL1x0Ly9FdmVudCBQYXJhbWV0ZXIgc2hvdWxkIG5vdCBjb250YWluIHJlZmVyZW5jZSB0byBzdHJpcExpbmUgZGlyZWN0bHkuIEJ1dCB0byBpdHMgb3B0aW9ucy5cbiAgICAgIC8vXHRldmVudE9iamVjdE1hcC5ldmVudFBhcmFtZXRlciA9IHsgeDogeHkueCwgeTogeHkueSwgc3RyaXBMaW5lOiBldmVudE9iamVjdE1hcC5zdHJpcExpbmUuX29wdGlvbnMsIGF4aXM6IGV2ZW50T2JqZWN0TWFwLmF4aXMuX29wdGlvbnMsIHN0cmlwTGluZUluZGV4OiBldmVudE9iamVjdE1hcC5zdHJpcExpbmVJbmRleCB9O1xuICAgICAgLy9cdGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dCA9IHsgY29udGV4dDogZXZlbnRPYmplY3RNYXAuc3RyaXBMaW5lLCB1c2VyQ29udGV4dDogZXZlbnRPYmplY3RNYXAuc3RyaXBMaW5lLl9vcHRpb25zLCBtb3VzZW92ZXI6IFwibW91c2VvdmVyXCIsIG1vdXNlbW92ZTogXCJtb3VzZW1vdmVcIiwgbW91c2VvdXQ6IFwibW91c2VvdXRcIiwgY2xpY2s6IFwiY2xpY2tcIiB9O1xuXG4gICAgICAvL1x0ZXZlbnRPYmplY3RNYXBzLnB1c2goZXZlbnRPYmplY3RNYXApO1xuICAgICAgLy99XG4gICAgZWxzZSBpZiAoZXZlbnRPYmplY3RNYXAub2JqZWN0VHlwZSA9PT0gXCJsZWdlbmRJdGVtXCIpIHtcblxuICAgICAgdmFyIGRhdGFTZXJpZXMgPSB0aGlzLmNoYXJ0LmRhdGFbZXZlbnRPYmplY3RNYXAuZGF0YVNlcmllc0luZGV4XTtcbiAgICAgIHZhciBkYXRhUG9pbnQgPSBldmVudE9iamVjdE1hcC5kYXRhUG9pbnRJbmRleCAhPT0gbnVsbCA/IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tldmVudE9iamVjdE1hcC5kYXRhUG9pbnRJbmRleF0gOiBudWxsO1xuXG4gICAgICAvL0V2ZW50IFBhcmFtZXRlciBzaG91bGQgbm90IGNvbnRhaW4gcmVmZXJlbmNlIHRvIERhdGFTZXJpZXMgZGlyZWN0bHkuIEJ1dCB0byBpdHMgb3B0aW9ucy5cbiAgICAgIGV2ZW50T2JqZWN0TWFwLmV2ZW50UGFyYW1ldGVyID0ge1xuICAgICAgICB4OiB4eS54LCB5OiB4eS55LFxuICAgICAgICBkYXRhU2VyaWVzOiBkYXRhU2VyaWVzLl9vcHRpb25zLCBkYXRhUG9pbnQ6IGRhdGFQb2ludCwgZGF0YVBvaW50SW5kZXg6IGV2ZW50T2JqZWN0TWFwLmRhdGFQb2ludEluZGV4LCBkYXRhU2VyaWVzSW5kZXg6IGV2ZW50T2JqZWN0TWFwLmRhdGFTZXJpZXNJbmRleCxcbiAgICAgICAgY2hhcnQ6IHRoaXMuY2hhcnQuX3B1YmxpY0NoYXJ0UmVmZXJlbmNlXG4gICAgICB9O1xuICAgICAgZXZlbnRPYmplY3RNYXAuZXZlbnRDb250ZXh0ID0ge1xuICAgICAgICBjb250ZXh0OiB0aGlzLmNoYXJ0LmxlZ2VuZCwgdXNlckNvbnRleHQ6IHRoaXMuY2hhcnQubGVnZW5kLl9vcHRpb25zLCBtb3VzZW92ZXI6IFwiaXRlbW1vdXNlb3ZlclwiLCBtb3VzZW1vdmU6IFwiaXRlbW1vdXNlbW92ZVwiLCBtb3VzZW91dDogXCJpdGVtbW91c2VvdXRcIiwgY2xpY2s6IFwiaXRlbWNsaWNrXCJcbiAgICAgIH07XG4gICAgICBldmVudE9iamVjdE1hcHMucHVzaChldmVudE9iamVjdE1hcCk7XG4gICAgfVxuICB9XG5cbiAgLy9GaXJlIG1vdXNlb3V0IGlmIGV4aXN0aW5nIG1vdXNlb3ZlcmVkIG9iamVjdHMgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvYmplY3RtYXAuXG4gIHZhciBtb3VzZU91dE9iamVjdE1hcHNFeGNsdWRlZCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1vdXNlT3V0ID0gdHJ1ZTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZXZlbnRPYmplY3RNYXBzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoZXZlbnRPYmplY3RNYXBzW2pdLmlkID09PSB0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tpXS5pZCkge1xuICAgICAgICBtb3VzZU91dCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91c2VPdXQpIHtcbiAgICAgIHRoaXMuZmlyZUV2ZW50KHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzW2ldLCBcIm1vdXNlb3V0XCIsIGV2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW91c2VPdXRPYmplY3RNYXBzRXhjbHVkZWQucHVzaCh0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHMgPSBtb3VzZU91dE9iamVjdE1hcHNFeGNsdWRlZDtcblxuICAvL1Byb2Nlc3MgbmV3IGV2ZW50T2JlY3RNYXBzXG4gIC8vSWYgdGhleSBhbHJlYWR5IGRvbid0IGV4aXN0LCBhZGQgdGhlbSBhbmQgZmlyZSBtb3VzZW92ZXJcbiAgLy9JZiBldi50eXBlIGlzIG1vdXNlbW92ZSwgdGhlbiBqdXN0IGZpcmUgbW91c2Vtb3ZlXG4gIC8vSWYgZXYudHlwZSBpcyBjbGljaywgdGhlbiBmaXJlIHR3byBldmVudHMgLSBjbGljayBmb2xsb3dlZCBieSBtb3VzZW1vdmVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudE9iamVjdE1hcHMubGVuZ3RoOyBpKyspIHtcblxuICAgIHZhciBleGlzdGluZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLm1vdXNlb3ZlcmVkT2JqZWN0TWFwcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGV2ZW50T2JqZWN0TWFwc1tpXS5pZCA9PT0gdGhpcy5tb3VzZW92ZXJlZE9iamVjdE1hcHNbal0uaWQpIHtcbiAgICAgICAgZXhpc3RpbmcgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICB0aGlzLmZpcmVFdmVudChldmVudE9iamVjdE1hcHNbaV0sIFwibW91c2VvdmVyXCIsIGV2KTtcbiAgICAgIHRoaXMubW91c2VvdmVyZWRPYmplY3RNYXBzLnB1c2goZXZlbnRPYmplY3RNYXBzW2ldKTtcbiAgICB9XG5cbiAgICBpZiAoZXYudHlwZSA9PT0gXCJjbGlja1wiKSB7XG4gICAgICB0aGlzLmZpcmVFdmVudChldmVudE9iamVjdE1hcHNbaV0sIFwiY2xpY2tcIiwgZXYpO1xuICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PT0gXCJtb3VzZW1vdmVcIikge1xuICAgICAgdGhpcy5maXJlRXZlbnQoZXZlbnRPYmplY3RNYXBzW2ldLCBcIm1vdXNlbW92ZVwiLCBldik7XG4gICAgfVxuICB9XG59XG5cbkV2ZW50TWFuYWdlci5wcm90b3R5cGUuZmlyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50T2JqZWN0TWFwLCBldmVudFR5cGUsIGV2KSB7XG5cbiAgaWYgKCFldmVudE9iamVjdE1hcCB8fCAhZXZlbnRUeXBlKVxuICAgIHJldHVybjtcblxuICB2YXIgZXZlbnRQYXJhbWV0ZXIgPSBldmVudE9iamVjdE1hcC5ldmVudFBhcmFtZXRlcjtcbiAgdmFyIGV2ZW50Q29udGV4dCA9IGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dDtcbiAgLy92YXIgY29udGV4dCA9IGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dC5jb250ZXh0O1xuICB2YXIgdXNlckNvbnRleHQgPSBldmVudE9iamVjdE1hcC5ldmVudENvbnRleHQudXNlckNvbnRleHRcblxuICBpZiAodXNlckNvbnRleHQgJiYgZXZlbnRDb250ZXh0ICYmIHVzZXJDb250ZXh0W2V2ZW50Q29udGV4dFtldmVudFR5cGVdXSlcbiAgICB1c2VyQ29udGV4dFtldmVudENvbnRleHRbZXZlbnRUeXBlXV0uY2FsbCh1c2VyQ29udGV4dCwgZXZlbnRQYXJhbWV0ZXIpO1xuXG4gIGlmIChldmVudFR5cGUgIT09IFwibW91c2VvdXRcIikge1xuICAgIGlmICh1c2VyQ29udGV4dC5jdXJzb3IgJiYgdXNlckNvbnRleHQuY3Vyc29yICE9PSBldi50YXJnZXQuc3R5bGUuY3Vyc29yKSB7XG4gICAgICBldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gdXNlckNvbnRleHQuY3Vyc29yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gdGhpcy5jaGFydC5fZGVmYXVsdEN1cnNvcjtcbiAgICBkZWxldGUgZXZlbnRPYmplY3RNYXAuZXZlbnRQYXJhbWV0ZXI7IC8vIHJlZmVyZW5jZSBubyBsb25nZXIgcmVxdWlyZWQuXG4gICAgZGVsZXRlIGV2ZW50T2JqZWN0TWFwLmV2ZW50Q29udGV4dDsgLy8gcmVmZXJlbmNlIG5vIGxvbmdlciByZXF1aXJlZC5cbiAgfVxuXG4gIC8vVGhpcyBpcyBqdXN0IGEgcXVpY2sgZml4LiBOZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGNhbGxpbmcgaW50ZXJuYWwgZXZlbnQgaGFuZGxlcnMuXG4gIGlmIChldmVudFR5cGUgPT09IFwiY2xpY2tcIiAmJiBldmVudE9iamVjdE1hcC5vYmplY3RUeXBlID09PSBcImRhdGFQb2ludFwiICYmIHRoaXMuY2hhcnQucGllRG91Z2hudXRDbGlja0hhbmRsZXIpIHtcbiAgICB0aGlzLmNoYXJ0LnBpZURvdWdobnV0Q2xpY2tIYW5kbGVyLmNhbGwodGhpcy5jaGFydC5kYXRhW2V2ZW50T2JqZWN0TWFwLmRhdGFTZXJpZXNJbmRleF0sIGV2ZW50UGFyYW1ldGVyKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudE1hbmFnZXI7XG4iLCJmdW5jdGlvbiBMYXlvdXRNYW5hZ2VyKHgxLCB5MSwgeDIsIHkyLCBwYWRkaW5nKSB7XG5cbiAgaWYgKHR5cGVvZiAocGFkZGluZykgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgcGFkZGluZyA9IDA7XG5cbiAgdGhpcy5fcGFkZGluZyA9IHBhZGRpbmc7XG5cbiAgdGhpcy5feDEgPSB4MTtcbiAgdGhpcy5feTEgPSB5MTtcbiAgdGhpcy5feDIgPSB4MjtcbiAgdGhpcy5feTIgPSB5MjtcblxuICB0aGlzLl90b3BPY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG4gIHRoaXMuX2JvdHRvbU9jY3VwaWVkID0gdGhpcy5fcGFkZGluZztcbiAgdGhpcy5fbGVmdE9jY3VwaWVkID0gdGhpcy5fcGFkZGluZztcbiAgdGhpcy5fcmlnaHRPY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG59XG5cbkxheW91dE1hbmFnZXIucHJvdG90eXBlLnJlZ2lzdGVyU3BhY2UgPSBmdW5jdGlvbiAocG9zaXRpb24sIHNpemUpIHtcbiAgaWYgKHBvc2l0aW9uID09PSBcInRvcFwiKSB7XG4gICAgdGhpcy5fdG9wT2NjdXBpZWQgKz0gc2l6ZS5oZWlnaHQ7XG4gIH1cbiAgZWxzZSBpZiAocG9zaXRpb24gPT09IFwiYm90dG9tXCIpIHtcbiAgICB0aGlzLl9ib3R0b21PY2N1cGllZCArPSBzaXplLmhlaWdodDtcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICB0aGlzLl9sZWZ0T2NjdXBpZWQgKz0gc2l6ZS53aWR0aDsgLy8gdGhpcyBpcyB3aWR0aCB3aGVuIHNlZW4gdXByaWdodC92ZXJ0aWNhbGx5XG4gIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuICAgIHRoaXMuX3JpZ2h0T2NjdXBpZWQgKz0gc2l6ZS53aWR0aDsvLyB0aGlzIGlzIHdpZHRoIHdoZW4gc2VlbiB1cHJpZ2h0L3ZlcnRpY2FsbHlcbiAgfVxufVxuXG5MYXlvdXRNYW5hZ2VyLnByb3RvdHlwZS51blJlZ2lzdGVyU3BhY2UgPSBmdW5jdGlvbiAocG9zaXRpb24sIHNpemUpIHtcbiAgaWYgKHBvc2l0aW9uID09PSBcInRvcFwiKSB7XG4gICAgdGhpcy5fdG9wT2NjdXBpZWQgLT0gc2l6ZS5oZWlnaHQ7XG4gIH1cbiAgZWxzZSBpZiAocG9zaXRpb24gPT09IFwiYm90dG9tXCIpIHtcbiAgICB0aGlzLl9ib3R0b21PY2N1cGllZCAtPSBzaXplLmhlaWdodDtcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICB0aGlzLl9sZWZ0T2NjdXBpZWQgLT0gc2l6ZS53aWR0aDsvLyB0aGlzIGlzIHdpZHRoIHdoZW4gc2VlbiB1cHJpZ2h0L3ZlcnRpY2FsbHlcbiAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgdGhpcy5fcmlnaHRPY2N1cGllZCAtPSBzaXplLndpZHRoOy8vIHRoaXMgaXMgd2lkdGggd2hlbiBzZWVuIHVwcmlnaHQvdmVydGljYWxseVxuICB9XG59XG5cbkxheW91dE1hbmFnZXIucHJvdG90eXBlLmdldEZyZWVTcGFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8vPHNpZ25hdHVyZT5cbiAgLy8vPHN1bW1hcnk+UmV0dXJucyBhdmFpbGFibGUgZnJlZSBzcGFjZSB7eDE6bnVtYmVyLCB5MTpudW1iZXIsIHgyOm51bWJlciwgeTI6bnVtYmVyfTwvc3VtbWFyeT5cbiAgLy8vPC9zaWduYXR1cmU+XG5cbiAgcmV0dXJuIHtcbiAgICB4MTogdGhpcy5feDEgKyB0aGlzLl9sZWZ0T2NjdXBpZWQsXG4gICAgeTE6IHRoaXMuX3kxICsgdGhpcy5fdG9wT2NjdXBpZWQsXG4gICAgeDI6IHRoaXMuX3gyIC0gdGhpcy5fcmlnaHRPY2N1cGllZCxcbiAgICB5MjogdGhpcy5feTIgLSB0aGlzLl9ib3R0b21PY2N1cGllZCxcbiAgICB3aWR0aDogKHRoaXMuX3gyIC0gdGhpcy5feDEpIC0gdGhpcy5fcmlnaHRPY2N1cGllZCAtIHRoaXMuX2xlZnRPY2N1cGllZCxcbiAgICBoZWlnaHQ6ICh0aGlzLl95MiAtIHRoaXMuX3kxKSAtIHRoaXMuX2JvdHRvbU9jY3VwaWVkIC0gdGhpcy5fdG9wT2NjdXBpZWRcbiAgfTtcbn1cblxuTGF5b3V0TWFuYWdlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vc28gdGhhdCB0aGVyZSBpcyBlbm91Z2ggcGFkZGluZy5cbiAgdGhpcy5fdG9wT2NjdXBpZWQgPSB0aGlzLl9wYWRkaW5nO1xuICB0aGlzLl9ib3R0b21PY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG4gIHRoaXMuX2xlZnRPY2N1cGllZCA9IHRoaXMuX3BhZGRpbmc7XG4gIHRoaXMuX3JpZ2h0T2NjdXBpZWQgPSB0aGlzLl9wYWRkaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMYXlvdXRNYW5hZ2VyO1xuIiwiXG5pbXBvcnQgRGF0YVNlcmllcyBmcm9tICcuL2RhdGFfc2VyaWVzJztcbmltcG9ydCBDYW52YXNKU09iamVjdCBmcm9tICcuL2NhbnZhc2pzJztcbmltcG9ydCBUZXh0QmxvY2sgZnJvbSAnLi90ZXh0X2Jsb2NrJztcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IHtleHRlbmQsIGdldEZvbnRIZWlnaHRJblBpeGVsc30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmZ1bmN0aW9uIExlZ2VuZChjaGFydCwgb3B0aW9ucywgdGhlbWUpIHtcbiAgTGVnZW5kLmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkxlZ2VuZFwiLCBvcHRpb25zLCB0aGVtZSk7XG5cbiAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB0aGlzLmNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcbiAgdGhpcy5jdHggPSB0aGlzLmNoYXJ0LmN0eDtcbiAgdGhpcy5naG9zdEN0eCA9IHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5naG9zdEN0eDtcbiAgdGhpcy5pdGVtcyA9IFtdO1xuXG4gIHRoaXMud2lkdGggPSAwLFxuICAvL3RoaXMuZm9udFNpemUgPSAxMixcbiAgdGhpcy5oZWlnaHQgPSAwLFxuICB0aGlzLm9yaWVudGF0aW9uID0gbnVsbCxcbiAgdGhpcy5kYXRhU2VyaWVzID0gW107XG4gIHRoaXMuYm91bmRzID0ge1xuICAgIHgxOiBudWxsLCB5MTogbnVsbCwgeDI6IG51bGwsIHkyOiBudWxsXG4gIH07XG5cbiAgaWYgKHR5cGVvZiAodGhpcy5fb3B0aW9ucy5mb250U2l6ZSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aGlzLmZvbnRTaXplID0gdGhpcy5jaGFydC5nZXRBdXRvRm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgLy93aW5kb3cuY29uc29sZS5sb2coXCJmb250U2l6ZTogXCIgKyB0aGlzLmZvbnRTaXplKTtcbiAgfVxuXG4gIHRoaXMubGluZUhlaWdodCA9IGdldEZvbnRIZWlnaHRJblBpeGVscyh0aGlzLmZvbnRGYW1pbHksIHRoaXMuZm9udFNpemUsIHRoaXMuZm9udFdlaWdodCk7XG5cbiAgdGhpcy5ob3Jpem9udGFsU3BhY2luZyA9IHRoaXMuZm9udFNpemU7XG59XG5cbmV4dGVuZChMZWdlbmQsIENhbnZhc0pTT2JqZWN0KTtcblxuTGVnZW5kLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG5cbiAgdmFyIGNvbnRhaW5lciA9ICghdGhpcy5kb2NrSW5zaWRlUGxvdEFyZWEgPyB0aGlzLmNoYXJ0IDogdGhpcy5jaGFydC5wbG90QXJlYSk7XG4gIHZhciBmcmVlU3BhY2UgPSBjb250YWluZXIubGF5b3V0TWFuYWdlci5nZXRGcmVlU3BhY2UoKTtcbiAgdmFyIHBvc2l0aW9uID0gbnVsbDtcbiAgdmFyIHRvcCA9IDA7XG4gIHZhciBsZWZ0ID0gMDtcbiAgdmFyIG1heFdpZHRoID0gMDtcbiAgdmFyIG1heEhlaWdodCA9IDA7XG4gIHZhciBpdGVtTWFyZ2luID0gNTtcblxuICB2YXIgaXRlbXMgPSBbXTtcbiAgdmFyIHJvd3MgPSBbXTtcblxuICAvL3RoaXMuY3R4LmZvbnQgPSBnZXRGb250U3RyaW5nKFwiXCIsIHRoaXMsIG51bGwpO1xuICAvL3RoaXMuY3R4LmZvbnRDb2xvciA9IHRoaXMuZm9udENvbG9yO1xuXG4gIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwidG9wXCIgfHwgdGhpcy52ZXJ0aWNhbEFsaWduID09PSBcImJvdHRvbVwiKSB7XG4gICAgdGhpcy5vcmllbnRhdGlvbiA9IFwiaG9yaXpvbnRhbFwiO1xuICAgIHBvc2l0aW9uID0gdGhpcy52ZXJ0aWNhbEFsaWduO1xuXG4gICAgbWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICE9PSBudWxsID8gdGhpcy5tYXhXaWR0aCA6IGZyZWVTcGFjZS53aWR0aCAqIC43O1xuICAgIG1heEhlaWdodCA9IHRoaXMubWF4SGVpZ2h0ICE9PSBudWxsID8gdGhpcy5tYXhIZWlnaHQgOiBmcmVlU3BhY2UuaGVpZ2h0ICogLjU7XG4gIH1cbiAgZWxzZSBpZiAodGhpcy52ZXJ0aWNhbEFsaWduID09PSBcImNlbnRlclwiKSB7XG4gICAgdGhpcy5vcmllbnRhdGlvbiA9IFwidmVydGljYWxcIjtcbiAgICBwb3NpdGlvbiA9IHRoaXMuaG9yaXpvbnRhbEFsaWduO1xuXG4gICAgbWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICE9PSBudWxsID8gdGhpcy5tYXhXaWR0aCA6IGZyZWVTcGFjZS53aWR0aCAqIC41O1xuICAgIG1heEhlaWdodCA9IHRoaXMubWF4SGVpZ2h0ICE9PSBudWxsID8gdGhpcy5tYXhIZWlnaHQgOiBmcmVlU3BhY2UuaGVpZ2h0ICogLjc7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YVNlcmllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkYXRhU2VyaWVzID0gdGhpcy5kYXRhU2VyaWVzW2ldO1xuXG5cbiAgICBpZiAoZGF0YVNlcmllcy50eXBlICE9PSBcInBpZVwiICYmIGRhdGFTZXJpZXMudHlwZSAhPT0gXCJkb3VnaG51dFwiICYmIGRhdGFTZXJpZXMudHlwZSAhPT0gXCJmdW5uZWxcIikge1xuXG4gICAgICB2YXIgbWFya2VyVHlwZSA9IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA6IChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic2NhdHRlclwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJidWJibGVcIikgJiYgZGF0YVNlcmllcy5tYXJrZXJUeXBlID8gZGF0YVNlcmllcy5tYXJrZXJUeXBlIDogRGF0YVNlcmllcy5nZXREZWZhdWx0TGVnZW5kTWFya2VyKGRhdGFTZXJpZXMudHlwZSk7XG4gICAgICB2YXIgbGVnZW5kVGV4dCA9IGRhdGFTZXJpZXMubGVnZW5kVGV4dCA/IGRhdGFTZXJpZXMubGVnZW5kVGV4dCA6IHRoaXMuaXRlbVRleHRGb3JtYXR0ZXIgPyB0aGlzLml0ZW1UZXh0Rm9ybWF0dGVyKHsgY2hhcnQ6IHRoaXMuY2hhcnQsIGxlZ2VuZDogdGhpcy5fb3B0aW9ucywgZGF0YVNlcmllczogZGF0YVNlcmllcywgZGF0YVBvaW50OiBudWxsIH0pXG4gICAgICAgIDogZGF0YVNlcmllcy5uYW1lO1xuICAgICAgdmFyIG1hcmtlckNvbG9yID0gZGF0YVNlcmllcy5sZWdlbmRNYXJrZXJDb2xvciA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQ29sb3IgOiBkYXRhU2VyaWVzLm1hcmtlckNvbG9yID8gZGF0YVNlcmllcy5tYXJrZXJDb2xvciA6IGRhdGFTZXJpZXMuX2NvbG9yU2V0WzBdO1xuICAgICAgdmFyIG1hcmtlclNpemUgPSAoIWRhdGFTZXJpZXMubWFya2VyU2l6ZSAmJiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIpKSA/IDAgOiB0aGlzLmxpbmVIZWlnaHQgKiAuNjtcbiAgICAgIHZhciBtYXJrZXJCb3JkZXJDb2xvciA9IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQm9yZGVyQ29sb3IgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlckNvbG9yIDogZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvcjtcbiAgICAgIHZhciBtYXJrZXJCb3JkZXJUaGlja25lc3MgPSBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzcyA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzIDogZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKG1hcmtlclNpemUgKiAuMikpIDogMDtcbiAgICAgIHZhciBsaW5lQ29sb3IgPSBkYXRhU2VyaWVzLl9jb2xvclNldFswXTtcblxuICAgICAgbGVnZW5kVGV4dCA9IHRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKGxlZ2VuZFRleHQsIGRhdGFTZXJpZXMuZGF0YVBvaW50c1swXSwgZGF0YVNlcmllcywgaSk7XG4gICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgbWFya2VyVHlwZTogbWFya2VyVHlwZSwgbWFya2VyQ29sb3I6IG1hcmtlckNvbG9yLCB0ZXh0OiBsZWdlbmRUZXh0LCB0ZXh0QmxvY2s6IG51bGwsIGNoYXJ0VHlwZTogZGF0YVNlcmllcy50eXBlLCBtYXJrZXJTaXplOiBtYXJrZXJTaXplLCBsaW5lQ29sb3I6IGRhdGFTZXJpZXMuX2NvbG9yU2V0WzBdLFxuICAgICAgICBkYXRhU2VyaWVzSW5kZXg6IGRhdGFTZXJpZXMuaW5kZXgsIGRhdGFQb2ludEluZGV4OiBudWxsLCBtYXJrZXJCb3JkZXJDb2xvcjogbWFya2VyQm9yZGVyQ29sb3IsIG1hcmtlckJvcmRlclRoaWNrbmVzczogbWFya2VyQm9yZGVyVGhpY2tuZXNzXG4gICAgICB9O1xuXG4gICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBkYXRhUG9pbnRJbmRleCA9IDA7IGRhdGFQb2ludEluZGV4IDwgZGF0YVNlcmllcy5kYXRhUG9pbnRzLmxlbmd0aDsgZGF0YVBvaW50SW5kZXgrKykge1xuXG4gICAgICAgIHZhciBkYXRhUG9pbnQgPSBkYXRhU2VyaWVzLmRhdGFQb2ludHNbZGF0YVBvaW50SW5kZXhdO1xuXG4gICAgICAgIHZhciBtYXJrZXJUeXBlID0gZGF0YVBvaW50LmxlZ2VuZE1hcmtlclR5cGUgPyBkYXRhUG9pbnQubGVnZW5kTWFya2VyVHlwZSA6IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA/IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyVHlwZSA6IERhdGFTZXJpZXMuZ2V0RGVmYXVsdExlZ2VuZE1hcmtlcihkYXRhU2VyaWVzLnR5cGUpO1xuICAgICAgICB2YXIgbGVnZW5kVGV4dCA9IGRhdGFQb2ludC5sZWdlbmRUZXh0ID8gZGF0YVBvaW50LmxlZ2VuZFRleHQgOiBkYXRhU2VyaWVzLmxlZ2VuZFRleHQgPyBkYXRhU2VyaWVzLmxlZ2VuZFRleHQgOiB0aGlzLml0ZW1UZXh0Rm9ybWF0dGVyID8gdGhpcy5pdGVtVGV4dEZvcm1hdHRlcih7IGNoYXJ0OiB0aGlzLmNoYXJ0LCBsZWdlbmQ6IHRoaXMuX29wdGlvbnMsIGRhdGFTZXJpZXM6IGRhdGFTZXJpZXMsIGRhdGFQb2ludDogZGF0YVBvaW50IH0pXG4gICAgICAgICAgOiBkYXRhUG9pbnQubmFtZSA/IGRhdGFQb2ludC5uYW1lIDogXCJEYXRhUG9pbnQ6IFwiICsgKGRhdGFQb2ludEluZGV4ICsgMSk7XG4gICAgICAgIHZhciBtYXJrZXJDb2xvciA9IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJDb2xvciA/IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJDb2xvciA6IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQ29sb3IgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckNvbG9yIDogZGF0YVBvaW50LmNvbG9yID8gZGF0YVBvaW50LmNvbG9yIDogZGF0YVNlcmllcy5jb2xvciA/IGRhdGFTZXJpZXMuY29sb3IgOiBkYXRhU2VyaWVzLl9jb2xvclNldFtkYXRhUG9pbnRJbmRleCAlIGRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG4gICAgICAgIHZhciBtYXJrZXJTaXplID0gdGhpcy5saW5lSGVpZ2h0ICogLjY7XG4gICAgICAgIHZhciBtYXJrZXJCb3JkZXJDb2xvciA9IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJCb3JkZXJDb2xvciA/IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJCb3JkZXJDb2xvciA6IGRhdGFTZXJpZXMubGVnZW5kTWFya2VyQm9yZGVyQ29sb3IgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlckNvbG9yIDogZGF0YVBvaW50Lm1hcmtlckJvcmRlckNvbG9yID8gZGF0YVBvaW50Lm1hcmtlckJvcmRlckNvbG9yIDogZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJDb2xvcjtcbiAgICAgICAgdmFyIG1hcmtlckJvcmRlclRoaWNrbmVzcyA9IGRhdGFQb2ludC5sZWdlbmRNYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhUG9pbnQubGVnZW5kTWFya2VyQm9yZGVyVGhpY2tuZXNzIDogZGF0YVNlcmllcy5sZWdlbmRNYXJrZXJCb3JkZXJUaGlja25lc3MgPyBkYXRhU2VyaWVzLmxlZ2VuZE1hcmtlckJvcmRlclRoaWNrbmVzcyA6IGRhdGFQb2ludC5tYXJrZXJCb3JkZXJUaGlja25lc3MgfHwgZGF0YVNlcmllcy5tYXJrZXJCb3JkZXJUaGlja25lc3MgPyBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKG1hcmtlclNpemUgKiAuMikpIDogMDtcblxuICAgICAgICBsZWdlbmRUZXh0ID0gdGhpcy5jaGFydC5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUobGVnZW5kVGV4dCwgZGF0YVBvaW50LCBkYXRhU2VyaWVzLCBkYXRhUG9pbnRJbmRleCk7XG5cbiAgICAgICAgdmFyIGl0ZW0gPSB7XG4gICAgICAgICAgbWFya2VyVHlwZTogbWFya2VyVHlwZSwgbWFya2VyQ29sb3I6IG1hcmtlckNvbG9yLCB0ZXh0OiBsZWdlbmRUZXh0LCB0ZXh0QmxvY2s6IG51bGwsIGNoYXJ0VHlwZTogZGF0YVNlcmllcy50eXBlLCBtYXJrZXJTaXplOiBtYXJrZXJTaXplLFxuICAgICAgICAgIGRhdGFTZXJpZXNJbmRleDogaSwgZGF0YVBvaW50SW5kZXg6IGRhdGFQb2ludEluZGV4LCBtYXJrZXJCb3JkZXJDb2xvcjogbWFya2VyQm9yZGVyQ29sb3IsIG1hcmtlckJvcmRlclRoaWNrbmVzczogbWFya2VyQm9yZGVyVGhpY2tuZXNzXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRhdGFQb2ludC5zaG93SW5MZWdlbmQgfHwgKGRhdGFTZXJpZXMuc2hvd0luTGVnZW5kICYmIGRhdGFQb2ludC5zaG93SW5MZWdlbmQgIT09IGZhbHNlKSkge1xuICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaXRlbSA9IG51bGw7XG4gIH1cbiAgaWYgKHRoaXMucmV2ZXJzZWQgPT09IHRydWUpIHtcbiAgICBpdGVtcy5yZXZlcnNlKCk7XG4gIH1cblxuICAvLyBGaW5kIG91dCB0aGUgcmVxdWlyZWQgd2lkdGggYW5kIGhlaWdodCBvZiBMZWdlbmQgYW5kIHBvc2l0aW9uIHRoZSBpdGVtcyByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyXG4gIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHJvdyA9IG51bGw7XG4gICAgdmFyIHJvd0luZGV4ID0gMDsgLy8gcmVxdWlyZWQgZm9yIHZlcnRpY2FsIG9yaWVudGF0aW9uXG4gICAgdmFyIHRleHRNYXhXaWR0aCA9IDA7XG4gICAgdmFyIGNvbHVtbkhlaWdodCA9IDA7XG5cbiAgICBpZiAodGhpcy5pdGVtV2lkdGggIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLml0ZW1NYXhXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICB0ZXh0TWF4V2lkdGggPSBNYXRoLm1pbih0aGlzLml0ZW1XaWR0aCwgdGhpcy5pdGVtTWF4V2lkdGgsIG1heFdpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRNYXhXaWR0aCA9IE1hdGgubWluKHRoaXMuaXRlbVdpZHRoLCBtYXhXaWR0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLml0ZW1NYXhXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICB0ZXh0TWF4V2lkdGggPSBNYXRoLm1pbih0aGlzLml0ZW1NYXhXaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dE1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFya2VyU2l6ZSA9IChtYXJrZXJTaXplID09PSAwID8gdGhpcy5saW5lSGVpZ2h0ICogLjYgOiBtYXJrZXJTaXplKTtcbiAgICB0ZXh0TWF4V2lkdGggPSB0ZXh0TWF4V2lkdGggLSAobWFya2VyU2l6ZSArIHRoaXMuaG9yaXpvbnRhbFNwYWNpbmcgKiAuMSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuXG4gICAgICBpZiAoaXRlbS5jaGFydFR5cGUgPT09IFwibGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInNwbGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInN0ZXBMaW5lXCIpIHtcbiAgICAgICAgdGV4dE1heFdpZHRoID0gdGV4dE1heFdpZHRoIC0gMiAqICh0aGlzLmxpbmVIZWlnaHQgKiAuMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhIZWlnaHQgPD0gMCB8fCB0eXBlb2YgKG1heEhlaWdodCkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGV4dE1heFdpZHRoIDw9IDAgfHwgdHlwZW9mICh0ZXh0TWF4V2lkdGgpID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIpIHtcblxuICAgICAgICBpdGVtLnRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsLy9UQklcbiAgICAgICAgICBtYXhXaWR0aDogdGV4dE1heFdpZHRoLFxuICAgICAgICAgIG1heEhlaWdodDogdGhpcy5pdGVtV3JhcCA/IG1heEhlaWdodCA6IHRoaXMubGluZUhlaWdodCwgLy9UQkk6IEZvbnRTaXplXG4gICAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgICAgdGV4dDogaXRlbS50ZXh0LFxuICAgICAgICAgIGhvcml6b250YWxBbGlnbjogXCJsZWZ0XCIsLy9sZWZ0LCBjZW50ZXIsIHJpZ2h0XG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuZm9udFNpemUsLy9pbiBwaXhlbHNcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHksXG4gICAgICAgICAgZm9udFdlaWdodDogdGhpcy5mb250V2VpZ2h0LCAvL25vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLFxuICAgICAgICAgIGZvbnRDb2xvcjogdGhpcy5mb250Q29sb3IsXG4gICAgICAgICAgZm9udFN0eWxlOiB0aGlzLmZvbnRTdHlsZSwgLy8gbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgICB0ZXh0QmFzZWxpbmU6IFwidG9wXCJcbiAgICAgICAgfSk7XG4gICAgICAgIGl0ZW0udGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgaXRlbS50ZXh0QmxvY2sud2lkdGggPSB0aGlzLml0ZW1XaWR0aCAtIChtYXJrZXJTaXplICsgdGhpcy5ob3Jpem9udGFsU3BhY2luZyAqIC4xICsgKChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIikgPyAyICogKHRoaXMubGluZUhlaWdodCAqIC4xKSA6IDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcm93IHx8IHJvdy53aWR0aCArIE1hdGgucm91bmQoaXRlbS50ZXh0QmxvY2sud2lkdGggKyB0aGlzLmhvcml6b250YWxTcGFjaW5nICogLjEgKyBtYXJrZXJTaXplICsgKHJvdy53aWR0aCA9PT0gMCA/IDAgOiAodGhpcy5ob3Jpem9udGFsU3BhY2luZykpICsgKChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIikgPyAyICogKHRoaXMubGluZUhlaWdodCAqIC4xKSA6IDApKSA+IG1heFdpZHRoKSB7XG4gICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgaXRlbXM6IFtdLCB3aWR0aDogMFxuICAgICAgICAgIH07XG4gICAgICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgKz0gY29sdW1uSGVpZ2h0O1xuICAgICAgICAgIGNvbHVtbkhlaWdodCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb2x1bW5IZWlnaHQgPSBNYXRoLm1heChjb2x1bW5IZWlnaHQsIGl0ZW0udGV4dEJsb2NrLmhlaWdodCk7XG5cbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueCA9IHJvdy53aWR0aDtcbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueSA9IDA7XG5cbiAgICAgICAgcm93LndpZHRoICs9IE1hdGgucm91bmQoaXRlbS50ZXh0QmxvY2sud2lkdGggKyB0aGlzLmhvcml6b250YWxTcGFjaW5nICogLjEgKyBtYXJrZXJTaXplICsgKHJvdy53aWR0aCA9PT0gMCA/IDAgOiB0aGlzLmhvcml6b250YWxTcGFjaW5nKSArICgoaXRlbS5jaGFydFR5cGUgPT09IFwibGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInNwbGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInN0ZXBMaW5lXCIpID8gMiAqICh0aGlzLmxpbmVIZWlnaHQgKiAuMSkgOiAwKSk7XG4gICAgICAgIHJvdy5pdGVtcy5wdXNoKGl0ZW0pO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSBNYXRoLm1heChyb3cud2lkdGgsIHRoaXMud2lkdGgpO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpdGVtLnRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsLy9UQklcbiAgICAgICAgICBtYXhXaWR0aDogdGV4dE1heFdpZHRoLFxuICAgICAgICAgIG1heEhlaWdodDogdGhpcy5pdGVtV3JhcCA9PT0gdHJ1ZSA/IG1heEhlaWdodCA6IHRoaXMuZm9udFNpemUgKiAxLjUsIC8vVEJJOiBGb250U2l6ZVxuICAgICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICAgIHRleHQ6IGl0ZW0udGV4dCxcbiAgICAgICAgICBob3Jpem9udGFsQWxpZ246IFwibGVmdFwiLC8vbGVmdCwgY2VudGVyLCByaWdodFxuICAgICAgICAgIGZvbnRTaXplOiB0aGlzLmZvbnRTaXplLC8vaW4gcGl4ZWxzXG4gICAgICAgICAgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5LFxuICAgICAgICAgIGZvbnRXZWlnaHQ6IHRoaXMuZm9udFdlaWdodCwgLy9ub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlcixcbiAgICAgICAgICBmb250Q29sb3I6IHRoaXMuZm9udENvbG9yLFxuICAgICAgICAgIGZvbnRTdHlsZTogdGhpcy5mb250U3R5bGUsIC8vIG5vcm1hbCwgaXRhbGljLCBvYmxpcXVlXG4gICAgICAgICAgdGV4dEJhc2VsaW5lOiBcInRvcFwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW0udGV4dEJsb2NrLm1lYXN1cmVUZXh0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgaXRlbS50ZXh0QmxvY2sud2lkdGggPSB0aGlzLml0ZW1XaWR0aCAtIChtYXJrZXJTaXplICsgdGhpcy5ob3Jpem9udGFsU3BhY2luZyAqIC4xICsgKChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIikgPyAyICogKHRoaXMubGluZUhlaWdodCAqIC4xKSA6IDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA8PSBtYXhIZWlnaHQpIHtcbiAgICAgICAgICByb3cgPSB7XG4gICAgICAgICAgICBpdGVtczogW10sIHdpZHRoOiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb3cgPSByb3dzW3Jvd0luZGV4XTtcbiAgICAgICAgICByb3dJbmRleCA9IChyb3dJbmRleCArIDEpICUgcm93cy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlaWdodCArPSBpdGVtLnRleHRCbG9jay5oZWlnaHQ7XG5cbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueCA9IHJvdy53aWR0aDsgLy8gcmVsYXRpdmUgdG8gdGhlIHJvd1xuICAgICAgICBpdGVtLnRleHRCbG9jay55ID0gMDsgLy8gcmVsYXRpdmUgdG8gdGhlIHJvd1xuXG4gICAgICAgIHJvdy53aWR0aCArPSBNYXRoLnJvdW5kKGl0ZW0udGV4dEJsb2NrLndpZHRoICsgdGhpcy5ob3Jpem9udGFsU3BhY2luZyAqIC4xICsgbWFya2VyU2l6ZSArIChyb3cud2lkdGggPT09IDAgPyAwIDogdGhpcy5ob3Jpem9udGFsU3BhY2luZykgKyAoKGl0ZW0uY2hhcnRUeXBlID09PSBcImxpbmVcIiB8fCBpdGVtLmNoYXJ0VHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBpdGVtLmNoYXJ0VHlwZSA9PT0gXCJzdGVwTGluZVwiKSA/IDIgKiAodGhpcy5saW5lSGVpZ2h0ICogLjEpIDogMCkpO1xuICAgICAgICByb3cuaXRlbXMucHVzaChpdGVtKTtcblxuICAgICAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgocm93LndpZHRoLCB0aGlzLndpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pdGVtV3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gcm93cy5sZW5ndGggKiAodGhpcy5saW5lSGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWlnaHQgKz0gY29sdW1uSGVpZ2h0O1xuICAgIH1cblxuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCB0aGlzLmhlaWdodCk7XG4gICAgdGhpcy53aWR0aCA9IE1hdGgubWluKG1heFdpZHRoLCB0aGlzLndpZHRoKTtcbiAgfVxuXG4gIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwidG9wXCIpIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwibGVmdFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MTtcbiAgICBlbHNlIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJyaWdodFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MiAtIHRoaXMud2lkdGg7XG4gICAgZWxzZVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MSArIGZyZWVTcGFjZS53aWR0aCAvIDIgLSB0aGlzLndpZHRoIC8gMjtcblxuICAgIHRvcCA9IGZyZWVTcGFjZS55MTtcbiAgfSBlbHNlIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwibGVmdFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MTtcbiAgICBlbHNlIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJyaWdodFwiKVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MiAtIHRoaXMud2lkdGg7XG4gICAgZWxzZVxuICAgICAgbGVmdCA9IGZyZWVTcGFjZS54MSArIGZyZWVTcGFjZS53aWR0aCAvIDIgLSB0aGlzLndpZHRoIC8gMjtcblxuICAgIHRvcCA9IGZyZWVTcGFjZS55MSArIGZyZWVTcGFjZS5oZWlnaHQgLyAyIC0gdGhpcy5oZWlnaHQgLyAyO1xuICB9IGVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJib3R0b21cIikge1xuICAgIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJsZWZ0XCIpXG4gICAgICBsZWZ0ID0gZnJlZVNwYWNlLngxO1xuICAgIGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcInJpZ2h0XCIpXG4gICAgICBsZWZ0ID0gZnJlZVNwYWNlLngyIC0gdGhpcy53aWR0aDtcbiAgICBlbHNlXG4gICAgICBsZWZ0ID0gZnJlZVNwYWNlLngxICsgZnJlZVNwYWNlLndpZHRoIC8gMiAtIHRoaXMud2lkdGggLyAyO1xuXG4gICAgdG9wID0gZnJlZVNwYWNlLnkyIC0gdGhpcy5oZWlnaHQ7XG4gIH1cblxuICB0aGlzLml0ZW1zID0gaXRlbXM7XG5cbiAgLy9Bc3NpZ24gaWRzIHRvIGFsbCBsZWdlbmRJdGVtc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcblxuICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG5cbiAgICBpdGVtLmlkID0gKyt0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIubGFzdE9iamVjdElkO1xuICAgIHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaXRlbS5pZF0gPSB7XG4gICAgICBpZDogaXRlbS5pZCwgb2JqZWN0VHlwZTogXCJsZWdlbmRJdGVtXCIsIGxlZ2VuZEl0ZW1JbmRleDogaSwgZGF0YVNlcmllc0luZGV4OiBpdGVtLmRhdGFTZXJpZXNJbmRleCwgZGF0YVBvaW50SW5kZXg6IGl0ZW0uZGF0YVBvaW50SW5kZXhcbiAgICB9O1xuICAgIC8vZGVsZXRlIGl0ZW0udGV4dEJsb2NrOy8vIE5vdCBSZXF1aXJlZCBhbnltb3JlXG4gIH1cblxuICB2YXIgcm93SGVpZ2h0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgdmFyIGNvbHVtbkhlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgcm93Lml0ZW1zLmxlbmd0aDsgaXRlbUluZGV4KyspIHtcbiAgICAgIHZhciBpdGVtID0gcm93Lml0ZW1zW2l0ZW1JbmRleF07XG5cbiAgICAgIHZhciBpdGVtWCA9IGl0ZW0udGV4dEJsb2NrLnggKyBsZWZ0ICsgKGl0ZW1JbmRleCA9PT0gMCA/IG1hcmtlclNpemUgKiAuMiA6IHRoaXMuaG9yaXpvbnRhbFNwYWNpbmcpO1xuICAgICAgdmFyIGl0ZW1ZID0gdG9wICsgcm93SGVpZ2h0O1xuXG4gICAgICB2YXIgZ2hvc3RYID0gaXRlbVg7XG5cbiAgICAgIGlmICghdGhpcy5jaGFydC5kYXRhW2l0ZW0uZGF0YVNlcmllc0luZGV4XS52aXNpYmxlKVxuICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IC41O1xuXG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5yZWN0KGxlZnQsIHRvcCwgbWF4V2lkdGgsIG1heEhlaWdodCk7XG4gICAgICB0aGlzLmN0eC5jbGlwKCk7XG5cbiAgICAgIGlmIChpdGVtLmNoYXJ0VHlwZSA9PT0gXCJsaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBpdGVtLmNoYXJ0VHlwZSA9PT0gXCJzcGxpbmVcIikge1xuICAgICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGl0ZW0ubGluZUNvbG9yO1xuICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSBNYXRoLmNlaWwodGhpcy5saW5lSGVpZ2h0IC8gOCk7XG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICB0aGlzLmN0eC5tb3ZlVG8oaXRlbVggLSB0aGlzLmxpbmVIZWlnaHQgKiAuMSwgaXRlbVkgKyB0aGlzLmxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgdGhpcy5jdHgubGluZVRvKGl0ZW1YICsgdGhpcy5saW5lSGVpZ2h0ICogLjcsIGl0ZW1ZICsgdGhpcy5saW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuXG4gICAgICAgIGdob3N0WCAtPSB0aGlzLmxpbmVIZWlnaHQgKiAuMTtcbiAgICAgIH1cblxuICAgICAgUmVuZGVySGVscGVyLmRyYXdNYXJrZXIoaXRlbVggKyBtYXJrZXJTaXplIC8gMiwgaXRlbVkgKyAodGhpcy5saW5lSGVpZ2h0IC8gMiksIHRoaXMuY3R4LCBpdGVtLm1hcmtlclR5cGUsIGl0ZW0ubWFya2VyU2l6ZSwgaXRlbS5tYXJrZXJDb2xvciwgaXRlbS5tYXJrZXJCb3JkZXJDb2xvciwgaXRlbS5tYXJrZXJCb3JkZXJUaGlja25lc3MpO1xuXG4gICAgICBpdGVtLnRleHRCbG9jay54ID0gaXRlbVggKyB0aGlzLmhvcml6b250YWxTcGFjaW5nICogLjEgKyBtYXJrZXJTaXplO1xuXG4gICAgICBpZiAoaXRlbS5jaGFydFR5cGUgPT09IFwibGluZVwiIHx8IGl0ZW0uY2hhcnRUeXBlID09PSBcInN0ZXBMaW5lXCIgfHwgaXRlbS5jaGFydFR5cGUgPT09IFwic3BsaW5lXCIpIHtcbiAgICAgICAgaXRlbS50ZXh0QmxvY2sueCA9IGl0ZW0udGV4dEJsb2NrLnggKyB0aGlzLmxpbmVIZWlnaHQgKiAuMTtcbiAgICAgIH1cblxuICAgICAgaXRlbS50ZXh0QmxvY2sueSA9IGl0ZW1ZO1xuXG4gICAgICBpdGVtLnRleHRCbG9jay5yZW5kZXIodHJ1ZSk7XG5cbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblxuICAgICAgaWYgKGl0ZW1JbmRleCA+IDApIHtcbiAgICAgICAgY29sdW1uSGVpZ2h0ID0gTWF0aC5tYXgoY29sdW1uSGVpZ2h0LCBpdGVtLnRleHRCbG9jay5oZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sdW1uSGVpZ2h0ID0gaXRlbS50ZXh0QmxvY2suaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuY2hhcnQuZGF0YVtpdGVtLmRhdGFTZXJpZXNJbmRleF0udmlzaWJsZSlcbiAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICB2YXIgaGV4Q29sb3IgPSBpbnRUb0hleENvbG9yU3RyaW5nKGl0ZW0uaWQpO1xuICAgICAgdGhpcy5naG9zdEN0eC5maWxsU3R5bGUgPSBoZXhDb2xvcjtcbiAgICAgIHRoaXMuZ2hvc3RDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLmdob3N0Q3R4LmZpbGxSZWN0KGdob3N0WCwgaXRlbS50ZXh0QmxvY2sueSwgaXRlbS50ZXh0QmxvY2sueCArIGl0ZW0udGV4dEJsb2NrLndpZHRoIC0gZ2hvc3RYLCBpdGVtLnRleHRCbG9jay5oZWlnaHQpO1xuXG4gICAgICBpdGVtLngxID0gdGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpdGVtLmlkXS54MSA9IGdob3N0WDtcbiAgICAgIGl0ZW0ueTEgPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2l0ZW0uaWRdLnkxID0gaXRlbS50ZXh0QmxvY2sueTtcbiAgICAgIGl0ZW0ueDIgPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2l0ZW0uaWRdLngyID0gaXRlbS50ZXh0QmxvY2sueCArIGl0ZW0udGV4dEJsb2NrLndpZHRoO1xuICAgICAgaXRlbS55MiA9IHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5vYmplY3RNYXBbaXRlbS5pZF0ueTIgPSBpdGVtLnRleHRCbG9jay55ICsgaXRlbS50ZXh0QmxvY2suaGVpZ2h0O1xuICAgIH1cbiAgICByb3dIZWlnaHQgPSByb3dIZWlnaHQgKyBjb2x1bW5IZWlnaHQ7XG4gIH1cblxuICAvL3RoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAvL3RoaXMuY3R4LmxpbmVXaWR0aCA9IDI7XG4gIC8vdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBcInJlZFwiO1xuICAvL3RoaXMuY3R4LnJlY3QobGVmdCwgdG9wLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIC8vdGhpcy5jdHguc3Ryb2tlKCk7XG5cbiAgY29udGFpbmVyLmxheW91dE1hbmFnZXIucmVnaXN0ZXJTcGFjZShwb3NpdGlvbiwgeyB3aWR0aDogdGhpcy53aWR0aCArIDIgKyAyLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICsgNSArIDUgfSk7XG5cbiAgdGhpcy5ib3VuZHMgPSB7XG4gICAgeDE6IGxlZnQsIHkxOiB0b3AsIHgyOiBsZWZ0ICsgdGhpcy53aWR0aCwgeTI6IHRvcCArIHRoaXMuaGVpZ2h0XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExlZ2VuZDtcbiIsIlxuaW1wb3J0IENhbnZhc0pTT2JqZWN0IGZyb20gJy4vY2FudmFzanMnO1xuaW1wb3J0IHtleHRlbmQsIGdldEZvbnRIZWlnaHRJblBpeGVscywgdHJpbVN0cmluZywgZ2V0Rm9udFN0cmluZ30gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmZ1bmN0aW9uIFRleHRCbG9jayhjdHgsIG9wdGlvbnMpIHtcblxuICBUZXh0QmxvY2suYmFzZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIFwiVGV4dEJsb2NrXCIsIG9wdGlvbnMpO1xuXG4gIHRoaXMuY3R4ID0gY3R4O1xuICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgdGhpcy5fd3JhcHBlZFRleHQgPSBudWxsO1xuICB0aGlzLl9saW5lSGVpZ2h0ID0gZ2V0Rm9udEhlaWdodEluUGl4ZWxzKHRoaXMuZm9udEZhbWlseSwgdGhpcy5mb250U2l6ZSwgdGhpcy5mb250V2VpZ2h0KTtcbn1cblxuZXh0ZW5kKFRleHRCbG9jaywgQ2FudmFzSlNPYmplY3QpO1xuXG5UZXh0QmxvY2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChwcmVzZXJ2ZUNvbnRleHQpIHtcbiAgaWYgKHByZXNlcnZlQ29udGV4dClcbiAgICB0aGlzLmN0eC5zYXZlKCk7XG5cbiAgdmFyIGZvbnQgPSB0aGlzLmN0eC5mb250O1xuICB0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICB2YXIgb2Zmc2V0WSA9IDA7XG5cbiAgaWYgKHRoaXMuX2lzRGlydHkpXG4gICAgdGhpcy5tZWFzdXJlVGV4dCh0aGlzLmN0eCk7XG5cbiAgdGhpcy5jdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55ICsgb2Zmc2V0WSk7XG5cbiAgaWYgKHRoaXMudGV4dEJhc2VsaW5lID09PSBcIm1pZGRsZVwiKSB7XG4gICAgb2Zmc2V0WSA9IC10aGlzLl9saW5lSGVpZ2h0IC8gMjtcbiAgfVxuXG4gIHRoaXMuY3R4LmZvbnQgPSB0aGlzLl9nZXRGb250U3RyaW5nKCk7XG5cbiAgdGhpcy5jdHgucm90YXRlKE1hdGguUEkgLyAxODAgKiB0aGlzLmFuZ2xlKTtcblxuICB2YXIgdGV4dExlZnQgPSAwO1xuICB2YXIgdGV4dFRvcCA9IHRoaXMucGFkZGluZztcbiAgLy92YXIgdGV4dFRvcCA9IHRoaXMucGFkZGluZztcbiAgdmFyIGxpbmUgPSBudWxsO1xuXG4gIGlmICgodGhpcy5ib3JkZXJUaGlja25lc3MgPiAwICYmIHRoaXMuYm9yZGVyQ29sb3IpIHx8IHRoaXMuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgdGhpcy5jdHgucm91bmRSZWN0KDAsIG9mZnNldFksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLmNvcm5lclJhZGl1cywgdGhpcy5ib3JkZXJUaGlja25lc3MsIHRoaXMuYmFja2dyb3VuZENvbG9yLCB0aGlzLmJvcmRlckNvbG9yKTtcblxuICAgIC8vaWYgKHRoaXMudGV4dEJhc2VsaW5lID09PSBcIm1pZGRsZVwiKSB7XG4gICAgLy9cdC8vdGV4dFRvcCArPSB0aGlzLmZvbnRTaXplIC8gMjtcbiAgICAvL1x0dGV4dFRvcCArPSB0aGlzLl9saW5lSGVpZ2h0IC8gMjtcbiAgICAvL31cbiAgfVxuXG4gIHRoaXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMuZm9udENvbG9yO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fd3JhcHBlZFRleHQubGluZXMubGVuZ3RoOyBpKyspIHtcblxuICAgIGxpbmUgPSB0aGlzLl93cmFwcGVkVGV4dC5saW5lc1tpXTtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwicmlnaHRcIilcbiAgICAgIHRleHRMZWZ0ID0gdGhpcy53aWR0aCAtIGxpbmUud2lkdGggLSB0aGlzLnBhZGRpbmc7XG4gICAgZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwibGVmdFwiKVxuICAgICAgdGV4dExlZnQgPSB0aGlzLnBhZGRpbmc7XG4gICAgZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIpXG4gICAgICB0ZXh0TGVmdCA9ICh0aGlzLndpZHRoIC0gdGhpcy5wYWRkaW5nICogMikgLyAyIC0gbGluZS53aWR0aCAvIDIgKyB0aGlzLnBhZGRpbmc7XG5cbiAgICB0aGlzLmN0eC5maWxsVGV4dChsaW5lLnRleHQsIHRleHRMZWZ0LCB0ZXh0VG9wKTtcblxuICAgIHRleHRUb3AgKz0gbGluZS5oZWlnaHQ7XG4gIH1cblxuICB0aGlzLmN0eC5mb250ID0gZm9udDtcblxuICBpZiAocHJlc2VydmVDb250ZXh0KVxuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5zZXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gIHRoaXMuX3dyYXBwZWRUZXh0ID0gbnVsbDtcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5tZWFzdXJlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubWF4V2lkdGggPT09IG51bGwpIHtcbiAgICB0aHJvdyAoXCJQbGVhc2Ugc2V0IG1heFdpZHRoIGFuZCBoZWlnaHQgZm9yIFRleHRCbG9ja1wiKTtcbiAgfVxuXG4gIHRoaXMuX3dyYXBUZXh0KHRoaXMuY3R4KTtcbiAgdGhpcy5faXNEaXJ0eSA9IGZhbHNlO1xuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHRcbiAgfVxufVxuXG5UZXh0QmxvY2sucHJvdG90eXBlLl9nZXRMaW5lV2l0aFdpZHRoID0gZnVuY3Rpb24gKHRleHQsIHdpZHRoLCBjbGlwV29yZCkge1xuICB0ZXh0ID0gU3RyaW5nKHRleHQpO1xuICBjbGlwV29yZCA9IGNsaXBXb3JkIHx8IGZhbHNlO1xuXG4gIGlmICghdGV4dClcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogXCJcIiwgd2lkdGg6IDBcbiAgICB9O1xuXG4gIHZhciB0ZXh0V2lkdGggPSAwLFxuICAgIG1pbiA9IDAsXG4gICAgbWF4ID0gdGV4dC5sZW5ndGggLSAxLFxuICAgIG1pZCA9IEluZmluaXR5O1xuXG4gIHRoaXMuY3R4LmZvbnQgPSB0aGlzLl9nZXRGb250U3RyaW5nKCk7XG5cbiAgd2hpbGUgKG1pbiA8PSBtYXgpIHtcbiAgICBtaWQgPSBNYXRoLmZsb29yKChtaW4gKyBtYXgpIC8gMik7XG4gICAgdmFyIHRlbXBUZXh0ID0gdGV4dC5zdWJzdHIoMCwgbWlkICsgMSk7XG5cbiAgICB0ZXh0V2lkdGggPSB0aGlzLmN0eC5tZWFzdXJlVGV4dCh0ZW1wVGV4dCkud2lkdGg7XG5cbiAgICBpZiAodGV4dFdpZHRoIDwgd2lkdGgpIHtcbiAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgfSBlbHNlIGlmICh0ZXh0V2lkdGggPiB3aWR0aCkge1xuICAgICAgbWF4ID0gbWlkIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9lZGdlIGNhc2VzXG4gIGlmICh0ZXh0V2lkdGggPiB3aWR0aCAmJiB0ZW1wVGV4dC5sZW5ndGggPiAxKSB7XG4gICAgdGVtcFRleHQgPSB0ZW1wVGV4dC5zdWJzdHIoMCwgdGVtcFRleHQubGVuZ3RoIC0gMSk7XG4gICAgdGV4dFdpZHRoID0gdGhpcy5jdHgubWVhc3VyZVRleHQodGVtcFRleHQpLndpZHRoO1xuICB9XG5cbiAgdmFyIGlzQ2xpcHBlZCA9IHRydWU7XG5cbiAgaWYgKHRlbXBUZXh0Lmxlbmd0aCA9PT0gdGV4dC5sZW5ndGggfHwgdGV4dFt0ZW1wVGV4dC5sZW5ndGhdID09PSBcIiBcIilcbiAgICBpc0NsaXBwZWQgPSBmYWxzZTtcblxuICBpZiAoaXNDbGlwcGVkKSB7XG4gICAgdmFyIHJlc3VsdFdvcmRzID0gdGVtcFRleHQuc3BsaXQoXCIgXCIpO1xuICAgIGlmIChyZXN1bHRXb3Jkcy5sZW5ndGggPiAxKVxuICAgICAgcmVzdWx0V29yZHMucG9wKCk7XG5cbiAgICB0ZW1wVGV4dCA9IHJlc3VsdFdvcmRzLmpvaW4oXCIgXCIpO1xuICAgIHRleHRXaWR0aCA9IHRoaXMuY3R4Lm1lYXN1cmVUZXh0KHRlbXBUZXh0KS53aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGV4dDogdGVtcFRleHQsIHdpZHRoOiB0ZXh0V2lkdGhcbiAgfTtcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5fd3JhcFRleHQgPSBmdW5jdGlvbiB3cmFwVGV4dCgpIHtcbiAgLy90aGlzLmN0eC5zYXZlKCk7XG4gIHZhciB0ZXh0ID0gbmV3IFN0cmluZyh0cmltU3RyaW5nKFN0cmluZyh0aGlzLnRleHQpKSk7XG4gIHZhciBsaW5lcyA9IFtdO1xuICB2YXIgZm9udCA9IHRoaXMuY3R4LmZvbnQ7IC8vIFNhdmUgdGhlIGN1cnJlbnQgRm9udFxuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIHdpZHRoID0gMDtcblxuICB0aGlzLmN0eC5mb250ID0gdGhpcy5fZ2V0Rm9udFN0cmluZygpO1xuXG4gIHdoaWxlICh0ZXh0Lmxlbmd0aCA+IDApIHtcblxuICAgIHZhciBtYXhXaWR0aCA9IHRoaXMubWF4V2lkdGggLSB0aGlzLnBhZGRpbmcgKiAyO1xuICAgIHZhciBtYXhIZWlnaHQgPSB0aGlzLm1heEhlaWdodCAtIHRoaXMucGFkZGluZyAqIDI7XG5cbiAgICB2YXIgbGluZSA9IHRoaXMuX2dldExpbmVXaXRoV2lkdGgodGV4dCwgbWF4V2lkdGgsIGZhbHNlKTtcbiAgICBsaW5lLmhlaWdodCA9IHRoaXMuX2xpbmVIZWlnaHQ7XG5cbiAgICBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbGluZS53aWR0aCk7XG4gICAgaGVpZ2h0ICs9IGxpbmUuaGVpZ2h0O1xuICAgIHRleHQgPSB0cmltU3RyaW5nKHRleHQuc2xpY2UobGluZS50ZXh0Lmxlbmd0aCwgdGV4dC5sZW5ndGgpKTtcblxuICAgIGlmIChtYXhIZWlnaHQgJiYgaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzLnBvcCgpO1xuICAgICAgaGVpZ2h0IC09IGxpbmUuaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX3dyYXBwZWRUZXh0ID0ge1xuICAgIGxpbmVzOiBsaW5lcywgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodFxuICB9O1xuICB0aGlzLndpZHRoID0gd2lkdGggKyB0aGlzLnBhZGRpbmcgKiAyO1xuICB0aGlzLmhlaWdodCA9IGhlaWdodCArIHRoaXMucGFkZGluZyAqIDI7XG5cbiAgdGhpcy5jdHguZm9udCA9IGZvbnQ7IC8vIFJlc3RvcmUgdGhlIGZvbnRcbn1cblxuVGV4dEJsb2NrLnByb3RvdHlwZS5fZ2V0Rm9udFN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgLy9yZXR1cm4gdGhpcy5mb250U3R5bGUgKyBcIiBcIiArIHRoaXMuZm9udFdlaWdodCArIFwiIFwiICsgdGhpcy5mb250U2l6ZSArIFwicHggXCIgKyB0aGlzLmZvbnRGYW1pbHlcbiAgcmV0dXJuIGdldEZvbnRTdHJpbmcoXCJcIiwgdGhpcywgbnVsbCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRCbG9jaztcbiIsIlxuaW1wb3J0IENhbnZhc0pTT2JqZWN0IGZyb20gJy4vY2FudmFzanMnO1xuaW1wb3J0IFRleHRCbG9jayBmcm9tICcuL3RleHRfYmxvY2snO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5mdW5jdGlvbiBUaXRsZShjaGFydCwgb3B0aW9ucykge1xuXHRUaXRsZS5iYXNlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgXCJUaXRsZVwiLCBvcHRpb25zLCBjaGFydC50aGVtZSk7XG5cblx0dGhpcy5jaGFydCA9IGNoYXJ0O1xuXHR0aGlzLmNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblx0dGhpcy5jdHggPSB0aGlzLmNoYXJ0LmN0eDtcblxuXG5cdGlmICh0eXBlb2YgKHRoaXMuX29wdGlvbnMuZm9udFNpemUpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cblx0XHR0aGlzLmZvbnRTaXplID0gdGhpcy5jaGFydC5nZXRBdXRvRm9udFNpemUodGhpcy5mb250U2l6ZSk7XG5cblx0XHQvL3dpbmRvdy5jb25zb2xlLmxvZyhcIkNoYXJ0IFRpdGxlIGZvbnRTaXplOiBcIiArIHRoaXMuZm9udFNpemUpO1xuXHR9XG5cblx0dGhpcy53aWR0aCA9IG51bGwsLy9yZWFkIG9ubHlcblx0dGhpcy5oZWlnaHQgPSBudWxsLy9yZWFkIG9ubHlcblx0dGhpcy5ib3VuZHMgPSB7XG5cdFx0eDE6IG51bGwsIHkxOiBudWxsLCB4MjogbnVsbCwgeTI6IG51bGxcblx0fTtcbn1cblxuZXh0ZW5kKFRpdGxlLCBDYW52YXNKU09iamVjdCk7XG5cblRpdGxlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0aWYgKCF0aGlzLnRleHQpIHJldHVybjtcblxuXHR2YXIgY29udGFpbmVyID0gKCF0aGlzLmRvY2tJbnNpZGVQbG90QXJlYSA/IHRoaXMuY2hhcnQgOiB0aGlzLmNoYXJ0LnBsb3RBcmVhKTtcblx0dmFyIGZyZWVzcGFjZSA9IGNvbnRhaW5lci5sYXlvdXRNYW5hZ2VyLmdldEZyZWVTcGFjZSgpO1xuXHR2YXIgbGVmdCA9IGZyZWVzcGFjZS54MTtcblx0dmFyIHRvcCA9IGZyZWVzcGFjZS55MTtcblx0dmFyIGFuZ2xlID0gMDtcblx0dmFyIG1heEhlaWdodCA9IDA7XG5cdHZhciBjb250YWluZXJNYXJnaW4gPSAyOyAvL01hcmdpbiB0b3dhcmRzIHRoZSBjb250YWluZXJcblx0dmFyIHJpZ2h0T2Zmc2V0ID0gdGhpcy5jaGFydC5fbWVudUJ1dHRvbiAmJiB0aGlzLmNoYXJ0LmV4cG9ydEVuYWJsZWQgJiYgdGhpcy52ZXJ0aWNhbEFsaWduID09PSBcInRvcFwiID8gMjIgOiAwOyAvL1NvIHRoYXQgVGl0bGUgZG9lc24ndCBvdmVybGFwIG1lbnUgYnV0dG9uLlxuXG5cdHZhciB0ZXh0QmxvY2tIb3Jpem9udGFsQWxpZ247XG5cdHZhciBwb3NpdGlvbjtcblxuXHRpZiAodGhpcy52ZXJ0aWNhbEFsaWduID09PSBcInRvcFwiIHx8IHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJib3R0b21cIikge1xuXHRcdGlmICh0aGlzLm1heFdpZHRoID09PSBudWxsKVxuXHRcdFx0dGhpcy5tYXhXaWR0aCA9IGZyZWVzcGFjZS53aWR0aCAtIGNvbnRhaW5lck1hcmdpbiAqIDIgLSByaWdodE9mZnNldCAqICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJjZW50ZXJcIiA/IDIgOiAxKTtcblxuXHRcdG1heEhlaWdodCA9IGZyZWVzcGFjZS5oZWlnaHQgKiAuNSAtIHRoaXMubWFyZ2luIC0gY29udGFpbmVyTWFyZ2luO1xuXHRcdGFuZ2xlID0gMDtcblx0fVxuXHRlbHNlIGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcblxuXHRcdGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwicmlnaHRcIikge1xuXHRcdFx0aWYgKHRoaXMubWF4V2lkdGggPT09IG51bGwpXG5cdFx0XHRcdHRoaXMubWF4V2lkdGggPSBmcmVlc3BhY2UuaGVpZ2h0IC0gY29udGFpbmVyTWFyZ2luICogMjtcblxuXHRcdFx0bWF4SGVpZ2h0ID0gZnJlZXNwYWNlLndpZHRoICogLjUgLSB0aGlzLm1hcmdpbiAtIGNvbnRhaW5lck1hcmdpbjtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcImNlbnRlclwiKSB7XG5cdFx0XHRpZiAodGhpcy5tYXhXaWR0aCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5tYXhXaWR0aCA9IGZyZWVzcGFjZS53aWR0aCAtIGNvbnRhaW5lck1hcmdpbiAqIDI7XG5cblx0XHRcdG1heEhlaWdodCA9IGZyZWVzcGFjZS5oZWlnaHQgKiAuNSAtIGNvbnRhaW5lck1hcmdpbiAqIDI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCF0aGlzLndyYXApXG5cdFx0bWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCBNYXRoLm1heCh0aGlzLmZvbnRTaXplICogMS41LCB0aGlzLmZvbnRTaXplICsgdGhpcy5wYWRkaW5nICogMi41KSk7XG5cdC8vY29uc29sZS5sb2codGhpcy5tYXhXaWR0aCk7XG5cblx0dmFyIHRleHRCbG9jayA9IG5ldyBUZXh0QmxvY2sodGhpcy5jdHgsIHtcblx0XHRmb250U2l6ZTogdGhpcy5mb250U2l6ZSwgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5LCBmb250Q29sb3I6IHRoaXMuZm9udENvbG9yLFxuXHRcdGZvbnRTdHlsZTogdGhpcy5mb250U3R5bGUsIGZvbnRXZWlnaHQ6IHRoaXMuZm9udFdlaWdodCxcblx0XHRob3Jpem9udGFsQWxpZ246IHRoaXMuaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduOiB0aGlzLnZlcnRpY2FsQWxpZ24sXG5cdFx0Ym9yZGVyQ29sb3I6IHRoaXMuYm9yZGVyQ29sb3IsIGJvcmRlclRoaWNrbmVzczogdGhpcy5ib3JkZXJUaGlja25lc3MsXG5cdFx0YmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvcixcblx0XHRtYXhXaWR0aDogdGhpcy5tYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQsXG5cdFx0Y29ybmVyUmFkaXVzOiB0aGlzLmNvcm5lclJhZGl1cyxcblx0XHR0ZXh0OiB0aGlzLnRleHQsXG5cdFx0cGFkZGluZzogdGhpcy5wYWRkaW5nLFxuXHRcdHRleHRCYXNlbGluZTogXCJ0b3BcIlxuXHR9KTtcblxuXHR2YXIgdGV4dEJsb2NrU2l6ZSA9IHRleHRCbG9jay5tZWFzdXJlVGV4dCgpO1xuXG5cdGlmICh0aGlzLnZlcnRpY2FsQWxpZ24gPT09IFwidG9wXCIgfHwgdGhpcy52ZXJ0aWNhbEFsaWduID09PSBcImJvdHRvbVwiKSB7XG5cblx0XHRpZiAodGhpcy52ZXJ0aWNhbEFsaWduID09PSBcInRvcFwiKSB7XG5cdFx0XHR0b3AgPSBmcmVlc3BhY2UueTEgKyBjb250YWluZXJNYXJnaW47XG5cdFx0XHRwb3NpdGlvbiA9IFwidG9wXCI7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJib3R0b21cIikge1xuXHRcdFx0dG9wID0gZnJlZXNwYWNlLnkyIC0gY29udGFpbmVyTWFyZ2luIC0gdGV4dEJsb2NrU2l6ZS5oZWlnaHQ7XG5cdFx0XHRwb3NpdGlvbiA9IFwiYm90dG9tXCI7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcImxlZnRcIikge1xuXHRcdFx0bGVmdCA9IGZyZWVzcGFjZS54MSArIGNvbnRhaW5lck1hcmdpbjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcblx0XHRcdGxlZnQgPSBmcmVlc3BhY2UueDEgKyBmcmVlc3BhY2Uud2lkdGggLyAyIC0gdGV4dEJsb2NrU2l6ZS53aWR0aCAvIDI7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcInJpZ2h0XCIpIHtcblx0XHRcdGxlZnQgPSBmcmVlc3BhY2UueDIgLSBjb250YWluZXJNYXJnaW4gLSB0ZXh0QmxvY2tTaXplLndpZHRoIC0gcmlnaHRPZmZzZXQ7XG5cdFx0fVxuXG5cdFx0dGV4dEJsb2NrSG9yaXpvbnRhbEFsaWduID0gdGhpcy5ob3Jpem9udGFsQWxpZ247XG5cblx0XHR0aGlzLndpZHRoID0gdGV4dEJsb2NrU2l6ZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHRleHRCbG9ja1NpemUuaGVpZ2h0O1xuXHR9XG5cdGVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PT0gXCJjZW50ZXJcIikge1xuXG5cdFx0aWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcImxlZnRcIikge1xuXG5cdFx0XHRsZWZ0ID0gZnJlZXNwYWNlLngxICsgY29udGFpbmVyTWFyZ2luO1xuXHRcdFx0dG9wID0gZnJlZXNwYWNlLnkyIC0gY29udGFpbmVyTWFyZ2luIC0gKHRoaXMubWF4V2lkdGggLyAyIC0gdGV4dEJsb2NrU2l6ZS53aWR0aCAvIDIpO1xuXHRcdFx0YW5nbGUgPSAtOTA7XG5cblx0XHRcdHBvc2l0aW9uID0gXCJsZWZ0XCI7XG5cdFx0XHR0aGlzLndpZHRoID0gdGV4dEJsb2NrU2l6ZS5oZWlnaHQ7XG5cdFx0XHR0aGlzLmhlaWdodCA9IHRleHRCbG9ja1NpemUud2lkdGg7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuaG9yaXpvbnRhbEFsaWduID09PSBcInJpZ2h0XCIpIHtcblx0XHRcdGxlZnQgPSBmcmVlc3BhY2UueDIgLSBjb250YWluZXJNYXJnaW47XG5cdFx0XHR0b3AgPSBmcmVlc3BhY2UueTEgKyBjb250YWluZXJNYXJnaW4gKyAodGhpcy5tYXhXaWR0aCAvIDIgLSB0ZXh0QmxvY2tTaXplLndpZHRoIC8gMik7XG5cdFx0XHRhbmdsZSA9IDkwO1xuXG5cdFx0XHRwb3NpdGlvbiA9IFwicmlnaHRcIjtcblx0XHRcdHRoaXMud2lkdGggPSB0ZXh0QmxvY2tTaXplLmhlaWdodDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gdGV4dEJsb2NrU2l6ZS53aWR0aDtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09IFwiY2VudGVyXCIpIHtcblx0XHRcdHRvcCA9IGNvbnRhaW5lci55MSArIChjb250YWluZXIuaGVpZ2h0IC8gMiAtIHRleHRCbG9ja1NpemUuaGVpZ2h0IC8gMik7XG5cdFx0XHRsZWZ0ID0gY29udGFpbmVyLngxICsgKGNvbnRhaW5lci53aWR0aCAvIDIgLSB0ZXh0QmxvY2tTaXplLndpZHRoIC8gMik7XG5cblx0XHRcdHBvc2l0aW9uID0gXCJjZW50ZXJcIjtcblx0XHRcdHRoaXMud2lkdGggPSB0ZXh0QmxvY2tTaXplLndpZHRoO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSB0ZXh0QmxvY2tTaXplLmhlaWdodDtcblx0XHR9XG5cblx0XHR0ZXh0QmxvY2tIb3Jpem9udGFsQWxpZ24gPSBcImNlbnRlclwiO1xuXHR9XG5cblx0dGV4dEJsb2NrLnggPSBsZWZ0O1xuXHR0ZXh0QmxvY2sueSA9IHRvcDtcblx0dGV4dEJsb2NrLmFuZ2xlID0gYW5nbGU7XG5cdHRleHRCbG9jay5ob3Jpem9udGFsQWxpZ24gPSB0ZXh0QmxvY2tIb3Jpem9udGFsQWxpZ247XG5cdHRleHRCbG9jay5yZW5kZXIodHJ1ZSk7XG5cblx0Y29udGFpbmVyLmxheW91dE1hbmFnZXIucmVnaXN0ZXJTcGFjZShwb3NpdGlvbiwge1xuXHRcdHdpZHRoOiB0aGlzLndpZHRoICsgKHBvc2l0aW9uID09PSBcImxlZnRcIiB8fCBwb3NpdGlvbiA9PT0gXCJyaWdodFwiID8gdGhpcy5tYXJnaW4gKyBjb250YWluZXJNYXJnaW4gOiAwKSxcblx0XHRoZWlnaHQ6IHRoaXMuaGVpZ2h0ICsgKHBvc2l0aW9uID09PSBcInRvcFwiIHx8IHBvc2l0aW9uID09PSBcImJvdHRvbVwiID8gdGhpcy5tYXJnaW4gKyBjb250YWluZXJNYXJnaW4gOiAwKVxuXHR9KTtcblxuXHR0aGlzLmJvdW5kcyA9IHtcblx0XHR4MTogbGVmdCwgeTE6IHRvcCwgeDI6IGxlZnQgKyB0aGlzLndpZHRoLCB5MjogdG9wICsgdGhpcy5oZWlnaHRcblx0fTtcblxuXHR0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xufVxuXG5leHBvcnQgZGVmYXVsdCBUaXRsZTtcbiIsIlxuaW1wb3J0IEFuaW1hdGlvbkhlbHBlciBmcm9tICcuLi9oZWxwZXJzL2FuaW1hdG9yJztcbmltcG9ydCBSZW5kZXJIZWxwZXIgZnJvbSAnLi4vaGVscGVycy9yZW5kZXInO1xuaW1wb3J0IENhbnZhc0pTT2JqZWN0IGZyb20gJy4vY2FudmFzanMnO1xuaW1wb3J0IHtleHRlbmQsIGlzQ2FudmFzU3VwcG9ydGVkLCBnZXRPYmplY3RJZCwgZHJhd1JlY3QsIGRyYXdTZWdtZW50fSBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcblxuZnVuY3Rpb24gVG9vbFRpcChjaGFydCwgb3B0aW9ucywgdGhlbWUpIHtcblxuICBUb29sVGlwLmJhc2UuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIlRvb2xUaXBcIiwgb3B0aW9ucywgdGhlbWUpO1xuXG4gIHRoaXMuY2hhcnQgPSBjaGFydDtcbiAgdGhpcy5jYW52YXMgPSBjaGFydC5jYW52YXM7XG4gIHRoaXMuY3R4ID0gdGhpcy5jaGFydC5jdHg7XG4gIHRoaXMuY3VycmVudFNlcmllc0luZGV4ID0gLTE7XG4gIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID0gLTE7XG4gIHRoaXMuX3RpbWVySWQgPSAwO1xuICB0aGlzLl9wcmV2WCA9IE5hTjtcbiAgdGhpcy5fcHJldlkgPSBOYU47XG5cbiAgdGhpcy5faW5pdGlhbGl6ZSgpO1xufVxuXG5leHRlbmQoVG9vbFRpcCwgQ2FudmFzSlNPYmplY3QpO1xuXG5Ub29sVGlwLnByb3RvdHlwZS5faW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcblxuICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiY2FudmFzanMtY2hhcnQtdG9vbHRpcFwiKTtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3hTaGFkb3cgPSBcIjFweCAxcHggMnB4IDJweCByZ2JhKDAsMCwwLDAuMSlcIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBcIjEwMDBcIjtcbiAgICAvL3RoaXMuY29udGFpbmVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJuby13cmFwXCI7XG5cbiAgICB2YXIgdG9vbFRpcEh0bWwgPSBcIjxkaXYgc3R5bGU9XFxcIiB3aWR0aDogYXV0bztcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImhlaWdodDogYXV0bztcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcIm1pbi13aWR0aDogNTBweDtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImxpbmUtaGVpZ2h0OiBhdXRvO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwibWFyZ2luOiAwcHggMHB4IDBweCAwcHg7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJwYWRkaW5nOiA1cHg7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJmb250LWZhbWlseTogQ2FsaWJyaSwgQXJpYWwsIEdlb3JnaWEsIHNlcmlmO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiZm9udC13ZWlnaHQ6IG5vcm1hbDtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImZvbnQtc3R5bGU6IFwiICsgKGlzQ2FudmFzU3VwcG9ydGVkID8gXCJpdGFsaWM7XCIgOiBcIm5vcm1hbDtcIik7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJmb250LXNpemU6IDE0cHg7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJjb2xvcjogIzAwMDAwMDtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcInRleHQtc2hhZG93OiAxcHggMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMSk7XCI7XG4gICAgdG9vbFRpcEh0bWwgKz0gXCJ0ZXh0LWFsaWduOiBsZWZ0O1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiYm9yZGVyOiAycHggc29saWQgZ3JheTtcIjtcblxuICAgIC8vT2xkZXIgYnJvd3NlcnMgbGlrZSBJRTgtIGRvbid0IHN1cHBvcnQgYWxwaGEgdmFsdWVzXG4gICAgdG9vbFRpcEh0bWwgKz0gaXNDYW52YXNTdXBwb3J0ZWQgPyBcImJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsLjkpO1wiIDogXCJiYWNrZ3JvdW5kOiByZ2IoMjU1LDI1NSwyNTUpO1wiO1xuXG4gICAgdG9vbFRpcEh0bWwgKz0gXCJ0ZXh0LWluZGVudDogMHB4O1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIjtcbiAgICAvL3Rvb2xUaXBIdG1sICs9IFwicG9pbnRlci1ldmVudHM6bm9uZTtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcImJvcmRlci1yYWRpdXM6IDVweDtcIjtcblxuICAgIC8vRGlzYWJsZSBUZXh0IFNlbGVjdGlvblxuICAgIHRvb2xUaXBIdG1sICs9IFwiLW1vei11c2VyLXNlbGVjdDpub25lO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiLWtodG1sLXVzZXItc2VsZWN0OiBub25lO1wiO1xuICAgIHRvb2xUaXBIdG1sICs9IFwiLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcIi1tcy11c2VyLXNlbGVjdDogbm9uZTtcIjtcbiAgICB0b29sVGlwSHRtbCArPSBcInVzZXItc2VsZWN0OiBub25lO1wiO1xuXG4gICAgLy90b29sVGlwSHRtbCArPSBcIm9wYWNpdHk6IDA7XCI7XG4gICAgLy90b29sVGlwSHRtbCArPSBcImZpbHRlcjogcHJvZ2lkOiBEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGUgPSAwLCBzdGFydENvbG9yc3RyID0gJyM0Y2ZmZmZmZicsIGVuZENvbG9yc3RyID0gJyM0Y2ZmZmZmZicpO1wiO1xuXG4gICAgaWYgKCFpc0NhbnZhc1N1cHBvcnRlZCkge1xuICAgICAgLy90b29sVGlwSHRtbCArPSBcIi1tcy1maWx0ZXI6J3Byb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTkwKSdcIjtcbiAgICAgIC8vLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuU2hhZG93KFN0cmVuZ3RoPTQsIERpcmVjdGlvbj0xMzUsIENvbG9yPScjMDAwMDAwJylcIjtcbiAgICAgIC8qIEZvciBJRSA1LjUgLSA3ICovXG4gICAgICB0b29sVGlwSHRtbCArPSBcImZpbHRlcjogYWxwaGEob3BhY2l0eSA9IDkwKTtcIjtcbiAgICAgIHRvb2xUaXBIdG1sICs9IFwiZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuU2hhZG93KFN0cmVuZ3RoPTMsIERpcmVjdGlvbj0xMzUsIENvbG9yPScjNjY2NjY2Jyk7XCI7XG4gICAgfVxuXG4gICAgdG9vbFRpcEh0bWwgKz0gXCJ9IFxcXCI+IFNhbXBsZSBUb29sdGlwPC9kaXY+XCI7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSB0b29sVGlwSHRtbDtcbiAgICB0aGlzLmNvbnRlbnREaXYgPSB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkO1xuXG5cbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyUmFkaXVzO1xuICAgIHRoaXMuY2hhcnQuX2NhbnZhc0pTQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgfVxufVxuXG5Ub29sVGlwLnByb3RvdHlwZS5tb3VzZU1vdmVIYW5kbGVyID0gZnVuY3Rpb24gKHgsIHkpIHtcblxuICBpZiAoISh0aGlzLl9sYXN0VXBkYXRlZCAmJiAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLl9sYXN0VXBkYXRlZCkgPCA0MCkpIHtcbiAgICB0aGlzLl9sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVRvb2xUaXAoeCwgeSk7XG4gIH1cbn1cblxuVG9vbFRpcC5wcm90b3R5cGUuX3VwZGF0ZVRvb2xUaXAgPSBmdW5jdGlvbiAobW91c2VYLCBtb3VzZVkpIHtcbiAgLy9yZXR1cm47XG5cbiAgaWYgKHRoaXMuY2hhcnQuZGlzYWJsZVRvb2xUaXApIC8vIERpc2FibGVkIGR1cmluZyBhbmltYXRpb24sIGV0Y1xuICAgIHJldHVybjtcblxuICBpZiAodHlwZW9mIChtb3VzZVgpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiAobW91c2VZKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmIChpc05hTih0aGlzLl9wcmV2WCkgfHwgaXNOYU4odGhpcy5fcHJldlkpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2Uge1xuICAgICAgbW91c2VYID0gdGhpcy5fcHJldlg7XG4gICAgICBtb3VzZVkgPSB0aGlzLl9wcmV2WTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fcHJldlggPSBtb3VzZVg7XG4gICAgdGhpcy5fcHJldlkgPSBtb3VzZVk7XG4gIH1cblxuXG4gIHZhciBkYXRhUG9pbnQgPSBudWxsO1xuICB2YXIgZGF0YVNlcmllcyA9IG51bGw7XG4gIHZhciB0b29sVGlwQ29udGVudCA9IFwiXCI7XG4gIHZhciBlbnRyaWVzID0gW107XG4gIHZhciB0b29sVGlwUmlnaHQ7XG4gIHZhciB0b29sVGlwQm90dG9tO1xuICB2YXIgeCA9IDA7XG5cbiAgaWYgKHRoaXMuc2hhcmVkICYmIHRoaXMuZW5hYmxlZCAmJiB0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgIT09IFwibm9uZVwiKSB7XG4gICAgLy8gJiYgdGhpcy5jaGFydC5wbG90SW5mby5heGlzUGxhY2VtZW50ICE9PSBcIm5vbmVcIlxuICAgIGlmICh0aGlzLmNoYXJ0LnBsb3RJbmZvLmF4aXNQbGFjZW1lbnQgPT09IFwieHlTd2FwcGVkXCIpIHtcbiAgICAgIHggPSAodGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1heGltdW0gLSB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkgLyB0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy5oZWlnaHQgKiAoKHRoaXMuY2hhcnQuYXhpc1gubGluZUNvb3JkaW5hdGVzLnkyIC0gbW91c2VZKSkgKyB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB4ID0gKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pIC8gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGggKiAobW91c2VYIC0gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEpICsgdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW07XG4gICAgfVxuXG4gICAgdmFyIG5lYXJieUVudHJpZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGFydC5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmNoYXJ0LmRhdGFbaV0uZ2V0RGF0YVBvaW50QXRYKHgsIHRydWUpO1xuXG4gICAgICBpZiAoZW50cnkgJiYgZW50cnkuaW5kZXggPj0gMCkge1xuICAgICAgICBlbnRyeS5kYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW2ldO1xuXG4gICAgICAgIGlmIChlbnRyeS5kYXRhUG9pbnQueSAhPT0gbnVsbClcbiAgICAgICAgICBuZWFyYnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWFyYnlFbnRyaWVzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybjtcblxuICAgIG5lYXJieUVudHJpZXMuc29ydChmdW5jdGlvbiAoZW50cnkxLCBlbnRyeTIpIHtcbiAgICAgIHJldHVybiBlbnRyeTEuZGlzdGFuY2UgLSBlbnRyeTIuZGlzdGFuY2U7XG4gICAgfSk7XG5cbiAgICB2YXIgY2xvc2VzdCA9IG5lYXJieUVudHJpZXNbMF07XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbmVhcmJ5RW50cmllcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICBpZiAobmVhcmJ5RW50cmllc1tpXS5kYXRhUG9pbnQueC52YWx1ZU9mKCkgPT09IGNsb3Nlc3QuZGF0YVBvaW50LngudmFsdWVPZigpKVxuICAgICAgICBlbnRyaWVzLnB1c2gobmVhcmJ5RW50cmllc1tpXSk7XG4gICAgfVxuXG4gICAgbmVhcmJ5RW50cmllcyA9IG51bGw7XG5cbiAgfSBlbHNlIHtcblxuICAgIHZhciBkYXRhUG9pbnRJbmZvID0gdGhpcy5jaGFydC5nZXREYXRhUG9pbnRBdFhZKG1vdXNlWCwgbW91c2VZLCB0cnVlKTtcbiAgICAvL2RhdGFQb2ludEluZm8gPSBudWxsO1xuXG4gICAgaWYgKGRhdGFQb2ludEluZm8pIHtcbiAgICAgIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID0gZGF0YVBvaW50SW5mby5kYXRhUG9pbnRJbmRleDtcbiAgICAgIHRoaXMuY3VycmVudFNlcmllc0luZGV4ID0gZGF0YVBvaW50SW5mby5kYXRhU2VyaWVzLmluZGV4O1xuICAgIH0gZWxzZSBpZiAoaXNDYW52YXNTdXBwb3J0ZWQpIHtcblxuICAgICAgdmFyIGlkID0gZ2V0T2JqZWN0SWQobW91c2VYLCBtb3VzZVksIHRoaXMuY2hhcnQuX2V2ZW50TWFuYWdlci5naG9zdEN0eCk7XG4gICAgICBpZiAoaWQgPiAwICYmIHR5cGVvZiB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2lkXSAhPT0gXCJ1bmRlZmluZWRcIikgey8vRGF0YVBvaW50L0RhdGFTZXJpZXMgZXZlbnRcbiAgICAgICAgdmFyIGV2ZW50T2JqZWN0ID0gdGhpcy5jaGFydC5fZXZlbnRNYW5hZ2VyLm9iamVjdE1hcFtpZF07XG5cbiAgICAgICAgaWYgKGV2ZW50T2JqZWN0Lm9iamVjdFR5cGUgPT09IFwibGVnZW5kSXRlbVwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvL2lmICh0aGlzLmN1cnJlbnRTZXJpZXNJbmRleCA9PT0gZXZlbnRPYmplY3QuZGF0YVNlcmllc0luZGV4ICYmIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID09PSBldmVudE9iamVjdC5kYXRhUG9pbnRJbmRleClcbiAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgLy9lbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VyaWVzSW5kZXggPSBldmVudE9iamVjdC5kYXRhU2VyaWVzSW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID0gZXZlbnRPYmplY3QuZGF0YVBvaW50SW5kZXggPj0gMCA/IGV2ZW50T2JqZWN0LmRhdGFQb2ludEluZGV4IDogLTE7XG4gICAgICAgIC8vfVxuXG4gICAgICAgIC8vd2luZG93LmNvbnNvbGUubG9nKFwiaWQ6IFwiICsgaWQgKyBcIjsgaGV4OiBcIiArIGludFRvSGV4Q29sb3JTdHJpbmcoaWQpKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCA9IC0xO1xuXG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCA9IC0xO1xuXG5cbiAgICBpZiAodGhpcy5jdXJyZW50U2VyaWVzSW5kZXggPj0gMCkge1xuXG4gICAgICBkYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW3RoaXMuY3VycmVudFNlcmllc0luZGV4XTtcblxuICAgICAgdmFyIGVudHJ5ID0ge1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4ID49IDApIHtcbiAgICAgICAgZGF0YVBvaW50ID0gZGF0YVNlcmllcy5kYXRhUG9pbnRzW3RoaXMuY3VycmVudERhdGFQb2ludEluZGV4XTtcblxuICAgICAgICBlbnRyeS5kYXRhU2VyaWVzID0gZGF0YVNlcmllcztcbiAgICAgICAgZW50cnkuZGF0YVBvaW50ID0gZGF0YVBvaW50O1xuICAgICAgICBlbnRyeS5pbmRleCA9IHRoaXMuY3VycmVudERhdGFQb2ludEluZGV4O1xuICAgICAgICBlbnRyeS5kaXN0YW5jZSA9IE1hdGguYWJzKGRhdGFQb2ludC54IC0geCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZW5hYmxlZCAmJiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIlxuICAgICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRBcmVhMTAwXCJcbiAgICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlU3BsaW5lQXJlYVwiXG4gICAgICAgICAgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikpIHtcblxuICAgICAgICAvL3ZhciB4ID0gKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pIC8gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMud2lkdGggKiAobW91c2VYIC0gdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEpICsgdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0udmFsdWVPZigpO1xuICAgICAgICB2YXIgeCA9IGRhdGFTZXJpZXMuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMubWluaW11bSArIChtb3VzZVggLSBkYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSkgLyBkYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdDtcblxuXG4gICAgICAgIGVudHJ5ID0gZGF0YVNlcmllcy5nZXREYXRhUG9pbnRBdFgoeCwgdHJ1ZSk7XG4gICAgICAgIGVudHJ5LmRhdGFTZXJpZXMgPSBkYXRhU2VyaWVzO1xuICAgICAgICB0aGlzLmN1cnJlbnREYXRhUG9pbnRJbmRleCA9IGVudHJ5LmluZGV4O1xuICAgICAgICBkYXRhUG9pbnQgPSBlbnRyeS5kYXRhUG9pbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvL3RoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnRyeS5kYXRhUG9pbnQueSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZW50cnkuZGF0YVNlcmllcy5heGlzWSkge1xuICAgICAgICAgIGlmIChlbnRyeS5kYXRhUG9pbnQueS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgdW5ib3VuZFRvVmlld3BvcnQgPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5kYXRhUG9pbnQueS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGFQb2ludC55W2ldIDwgZW50cnkuZGF0YVNlcmllcy5heGlzWS52aWV3cG9ydE1pbmltdW0pXG4gICAgICAgICAgICAgICAgdW5ib3VuZFRvVmlld3BvcnQtLTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuZGF0YVBvaW50LnlbaV0gPiBlbnRyeS5kYXRhU2VyaWVzLmF4aXNZLnZpZXdwb3J0TWF4aW11bSlcbiAgICAgICAgICAgICAgICB1bmJvdW5kVG9WaWV3cG9ydCsrO1xuICAgICAgICAgICAgaWYgKHVuYm91bmRUb1ZpZXdwb3J0IDwgZW50cnkuZGF0YVBvaW50LnkubGVuZ3RoICYmIHVuYm91bmRUb1ZpZXdwb3J0ID4gLWVudHJ5LmRhdGFQb2ludC55Lmxlbmd0aClcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGFQb2ludC55ID49IGVudHJ5LmRhdGFTZXJpZXMuYXhpc1kudmlld3BvcnRNaW5pbXVtICYmIGVudHJ5LmRhdGFQb2ludC55IDw9IGVudHJ5LmRhdGFTZXJpZXMuYXhpc1kudmlld3BvcnRNYXhpbXVtKVxuICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlXG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuXG4gICAgfVxuICB9XG5cblxuICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG5cbiAgICB0aGlzLmhpZ2hsaWdodE9iamVjdHMoZW50cmllcyk7XG5cbiAgICBpZiAodGhpcy5lbmFibGVkKSB7XG5cbiAgICAgIHZhciB0b29sVGlwSW5uZXJIdG1sID0gXCJcIjtcblxuICAgICAgdG9vbFRpcElubmVySHRtbCA9IHRoaXMuZ2V0VG9vbFRpcElubmVySFRNTCh7IGVudHJpZXM6IGVudHJpZXMgfSk7XG5cbiAgICAgIGlmICh0b29sVGlwSW5uZXJIdG1sICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29udGVudERpdi5pbm5lckhUTUwgPSB0b29sVGlwSW5uZXJIdG1sO1xuXG4gICAgICAgIHRoaXMuY29udGVudERpdi5pbm5lckhUTUwgPSB0b29sVGlwSW5uZXJIdG1sO1xuXG4gICAgICAgIHZhciBwcmV2aW91c2x5SGlkZGVuID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgICAgIHByZXZpb3VzbHlIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuY29udGVudERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPyB0aGlzLmJhY2tncm91bmRDb2xvciA6IGlzQ2FudmFzU3VwcG9ydGVkID8gXCJyZ2JhKDI1NSwyNTUsMjU1LC45KVwiIDogXCJyZ2IoMjU1LDI1NSwyNTUpXCI7XG5cbiAgICAgICAgICB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyUmlnaHRDb2xvciA9IHRoaXMuY29udGVudERpdi5zdHlsZS5ib3JkZXJMZWZ0Q29sb3IgPSB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLmJvcmRlckNvbG9yID8gdGhpcy5ib3JkZXJDb2xvciA6IGVudHJpZXNbMF0uZGF0YVBvaW50LmNvbG9yID8gZW50cmllc1swXS5kYXRhUG9pbnQuY29sb3IgOiBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuY29sb3IgPyBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuY29sb3IgOiBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuX2NvbG9yU2V0W2VudHJpZXNbMF0uaW5kZXggJSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuX2NvbG9yU2V0Lmxlbmd0aF07XG5cbiAgICAgICAgICB0aGlzLmNvbnRlbnREaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAodGhpcy5ib3JkZXJUaGlja25lc3MgfHwgdGhpcy5ib3JkZXJUaGlja25lc3MgPT09IDApID8gdGhpcy5ib3JkZXJUaGlja25lc3MgKyBcInB4XCIgOiAyICsgXCJweFwiO1xuXG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmJvcmRlclJhZGl1cyA9ICh0aGlzLmNvcm5lclJhZGl1cyB8fCB0aGlzLmNvcm5lclJhZGl1cyA9PT0gMCkgPyB0aGlzLmNvcm5lclJhZGl1cyArIFwicHhcIiA6IDUgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gdGhpcy5jb250ZW50RGl2LnN0eWxlLmJvcmRlclJhZGl1cztcblxuXG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmZvbnRTaXplID0gKHRoaXMuZm9udFNpemUgfHwgdGhpcy5mb250U2l6ZSA9PT0gMCkgPyB0aGlzLmZvbnRTaXplICsgXCJweFwiIDogMTQgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmNvbG9yID0gdGhpcy5mb250Q29sb3IgPyB0aGlzLmZvbnRDb2xvciA6IFwiIzAwMDAwMFwiO1xuICAgICAgICAgIHRoaXMuY29udGVudERpdi5zdHlsZS5mb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5ID8gdGhpcy5mb250RmFtaWx5IDogXCJDYWxpYnJpLCBBcmlhbCwgR2VvcmdpYSwgc2VyaWY7XCI7XG4gICAgICAgICAgdGhpcy5jb250ZW50RGl2LnN0eWxlLmZvbnRXZWlnaHQgPSB0aGlzLmZvbnRXZWlnaHQgPyB0aGlzLmZvbnRXZWlnaHQgOiBcIm5vcm1hbFwiO1xuICAgICAgICAgIHRoaXMuY29udGVudERpdi5zdHlsZS5mb250U3R5bGUgPSB0aGlzLmZvbnRTdHlsZSA/IHRoaXMuZm9udFN0eWxlIDogaXNDYW52YXNTdXBwb3J0ZWQgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcblxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG9vbFRpcExlZnQ7XG5cbiAgICAgICAgaWYgKGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInBpZVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcImRvdWdobnV0XCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwiZnVubmVsXCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VCYXJcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQmFyXCIgfHwgZW50cmllc1swXS5kYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiKSB7XG4gICAgICAgICAgdG9vbFRpcExlZnQgPSBtb3VzZVggLSAxMCAtIHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vdG9vbFRpcExlZnQgPSAoKCh0aGlzLmNoYXJ0LmF4aXNYLmxpbmVDb29yZGluYXRlcy53aWR0aCAvIE1hdGguYWJzKHRoaXMuY2hhcnQuYXhpc1gudmlld3BvcnRNYXhpbXVtIC0gdGhpcy5jaGFydC5heGlzWC52aWV3cG9ydE1pbmltdW0pKSAqIE1hdGguYWJzKGVudHJpZXNbMF0uZGF0YVBvaW50LnggLSB0aGlzLmNoYXJ0LmF4aXNYLnZpZXdwb3J0TWluaW11bSkpICsgdGhpcy5jaGFydC5heGlzWC5saW5lQ29vcmRpbmF0ZXMueDEgKyAuNSkgLSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCA8PCAwO1xuICAgICAgICAgIHRvb2xUaXBMZWZ0ID0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZW50cmllc1swXS5kYXRhUG9pbnQueCAtIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWC5jb252ZXJzaW9uUGFyYW1ldGVycy5taW5pbXVtKSAtIHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoIDw8IDA7XG4gICAgICAgICAgdG9vbFRpcExlZnQgLT0gMTA7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0b29sVGlwTGVmdCA8IDApIHtcbiAgICAgICAgICB0b29sVGlwTGVmdCArPSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCArIDIwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvb2xUaXBMZWZ0ICsgdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggPiB0aGlzLmNoYXJ0Ll9jb250YWluZXIuY2xpZW50V2lkdGgpXG4gICAgICAgICAgdG9vbFRpcExlZnQgPSBNYXRoLm1heCgwLCB0aGlzLmNoYXJ0Ll9jb250YWluZXIuY2xpZW50V2lkdGggLSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCk7XG5cbiAgICAgICAgdG9vbFRpcExlZnQgKz0gXCJweFwiO1xuXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zaGFyZWQgJiYgKGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwQXJlYVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZUFyZWFcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRBcmVhMTAwXCIpKSB7XG4gICAgICAgICAgLy90b29sVGlwQm90dG9tID0gKGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS5saW5lQ29vcmRpbmF0ZXMueTIgLSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1kubGluZUNvb3JkaW5hdGVzLmhlaWdodCAvIE1hdGguYWJzKGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS5tYXhpbXVtIC0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKiBNYXRoLmFicyhlbnRyaWVzWzBdLmRhdGFQb2ludC55IC0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNZLnZpZXdwb3J0TWluaW11bSkgKyAuNSkgPDwgMDtcbiAgICAgICAgICB0b29sVGlwQm90dG9tID0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNZLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnJlZmVyZW5jZSArIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS5jb252ZXJzaW9uUGFyYW1ldGVycy5waXhlbFBlclVuaXQgKiAoZW50cmllc1swXS5kYXRhUG9pbnQueSAtIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWS52aWV3cG9ydE1pbmltdW0pICsgLjUgPDwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJiYXJcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUJhclwiIHx8IGVudHJpZXNbMF0uZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBlbnRyaWVzWzBdLmRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQmFyMTAwXCIpIHtcbiAgICAgICAgICAvL3Rvb2xUaXBCb3R0b20gPSAoZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLmxpbmVDb29yZGluYXRlcy55MiAtIGVudHJpZXNbMF0uZGF0YVNlcmllcy5heGlzWC5saW5lQ29vcmRpbmF0ZXMuaGVpZ2h0IC8gTWF0aC5hYnMoZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLm1heGltdW0gLSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSAqIE1hdGguYWJzKGVudHJpZXNbMF0uZGF0YVBvaW50LnggLSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1gudmlld3BvcnRNaW5pbXVtKSArIC41KSA8PCAwO1xuICAgICAgICAgIHRvb2xUaXBCb3R0b20gPSBlbnRyaWVzWzBdLmRhdGFTZXJpZXMuYXhpc1guY29udmVyc2lvblBhcmFtZXRlcnMucmVmZXJlbmNlICsgZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLmNvbnZlcnNpb25QYXJhbWV0ZXJzLnBpeGVsUGVyVW5pdCAqIChlbnRyaWVzWzBdLmRhdGFQb2ludC54IC0gZW50cmllc1swXS5kYXRhU2VyaWVzLmF4aXNYLnZpZXdwb3J0TWluaW11bSkgKyAuNSA8PCAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRvb2xUaXBCb3R0b20gPSBtb3VzZVk7XG4gICAgICAgIH1cblxuICAgICAgICB0b29sVGlwQm90dG9tID0gKC10b29sVGlwQm90dG9tICsgMTApO1xuXG4gICAgICAgIGlmICh0b29sVGlwQm90dG9tICsgdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0ICsgNSA+IDApIHtcbiAgICAgICAgICB0b29sVGlwQm90dG9tIC09IHRvb2xUaXBCb3R0b20gKyB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyA1IC0gMFxuICAgICAgICB9XG5cbiAgICAgICAgdG9vbFRpcEJvdHRvbSArPSBcInB4XCI7XG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9IHRvb2xUaXBSaWdodDtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IHRvb2xUaXBMZWZ0O1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSB0b29sVGlwQm90dG9tO1xuXG4gICAgICAgIGlmICghdGhpcy5hbmltYXRpb25FbmFibGVkIHx8IHByZXZpb3VzbHlIaWRkZW4pIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5lbmFibGVBbmltYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZShmYWxzZSk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICAvL2lmIChpc0RlYnVnTW9kZSlcbiAgICAvLyAgY29uc29sZS5sb2coXCJzZWFyY2hYOiBcIiArIHggKyBcIiB4OiBcIiArIHNlYXJjaFJlc3VsdC5kYXRhUG9pbnQueCArIFwiOyB5OiBcIiArIHNlYXJjaFJlc3VsdC5kYXRhUG9pbnQueSArIFwiOyBkaXN0YW5jZTogXCIgKyBzZWFyY2hSZXN1bHQuZGlzdGFuY2UgKyBcIjsgc3RlcHM6IFwiICsgc3RlcHMpO1xuICB9XG59XG5cblxuVG9vbFRpcC5wcm90b3R5cGUuaGlnaGxpZ2h0T2JqZWN0cyA9IGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gIC8vaWYgKCF0aGlzLmVuYWJsZWQpXG4gIC8vXHRyZXR1cm47XG5cbiAgLy90aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLndpZHRoLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLmhlaWdodCk7XG4gIHZhciBvdmVybGFpZENhbnZhc0N0eCA9IHRoaXMuY2hhcnQub3ZlcmxhaWRDYW52YXNDdHg7XG4gIHRoaXMuY2hhcnQucmVzZXRPdmVybGF5ZWRDYW52YXMoKTtcblxuICBvdmVybGFpZENhbnZhc0N0eC5jbGVhclJlY3QoMCwwLHRoaXMuY2hhcnQud2lkdGgsIHRoaXMuY2hhcnQuaGVpZ2h0KTtcbiAgb3ZlcmxhaWRDYW52YXNDdHguc2F2ZSgpO1xuXG5cbiAgdmFyIHBsb3RBcmVhID0gdGhpcy5jaGFydC5wbG90QXJlYTtcbiAgdmFyIG9mZnNldCA9IDA7XG5cbiAgb3ZlcmxhaWRDYW52YXNDdHgucmVjdChwbG90QXJlYS54MSwgcGxvdEFyZWEueTEsIHBsb3RBcmVhLngyIC0gcGxvdEFyZWEueDEsIHBsb3RBcmVhLnkyIC0gcGxvdEFyZWEueTEpO1xuICBvdmVybGFpZENhbnZhc0N0eC5jbGlwKCk7XG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcblxuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaV07XG5cbiAgICB2YXIgZXZlbnRPYmplY3QgPSB0aGlzLmNoYXJ0Ll9ldmVudE1hbmFnZXIub2JqZWN0TWFwW2VudHJ5LmRhdGFTZXJpZXMuZGF0YVBvaW50SWRzW2VudHJ5LmluZGV4XV07XG5cbiAgICBpZiAoIWV2ZW50T2JqZWN0IHx8ICFldmVudE9iamVjdC5vYmplY3RUeXBlIHx8IGV2ZW50T2JqZWN0Lm9iamVjdFR5cGUgIT09IFwiZGF0YVBvaW50XCIpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBkYXRhU2VyaWVzID0gdGhpcy5jaGFydC5kYXRhW2V2ZW50T2JqZWN0LmRhdGFTZXJpZXNJbmRleF07XG4gICAgdmFyIGRhdGFQb2ludCA9IGRhdGFTZXJpZXMuZGF0YVBvaW50c1tldmVudE9iamVjdC5kYXRhUG9pbnRJbmRleF07XG4gICAgdmFyIGluZGV4ID0gZXZlbnRPYmplY3QuZGF0YVBvaW50SW5kZXg7XG5cbiAgICBpZiAoZGF0YVBvaW50LmhpZ2hsaWdodEVuYWJsZWQgIT09IGZhbHNlICYmIChkYXRhU2VyaWVzLmhpZ2hsaWdodEVuYWJsZWQgPT09IHRydWUgfHwgZGF0YVBvaW50LmhpZ2hsaWdodEVuYWJsZWQgPT09IHRydWUpKSB7XG5cbiAgICAgIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwibGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGVwTGluZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzcGxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic2NhdHRlclwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJhcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0ZXBBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNwbGluZUFyZWFcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEFyZWExMDBcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VBcmVhXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlU3BsaW5lQXJlYVwiKSB7XG4gICAgICAgIHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpbmRleCwgZXZlbnRPYmplY3QueDEsIGV2ZW50T2JqZWN0LnkxLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4KTtcbiAgICAgICAgbWFya2VyUHJvcHMuc2l6ZSA9IE1hdGgubWF4KG1hcmtlclByb3BzLnNpemUgKiAxLjUgPDwgMCwgMTApO1xuXG4gICAgICAgIG1hcmtlclByb3BzLmJvcmRlckNvbG9yID0gbWFya2VyUHJvcHMuYm9yZGVyQ29sb3IgfHwgXCIjRkZGRkZGXCI7XG4gICAgICAgIG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzcyA9IG1hcmtlclByb3BzLmJvcmRlclRoaWNrbmVzcyB8fCBNYXRoLmNlaWwobWFya2VyUHJvcHMuc2l6ZSAqIC4xKTtcblxuICAgICAgICAvL292ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gLjg7XG4gICAgICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhbbWFya2VyUHJvcHNdKTtcbiAgICAgICAgLy9vdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IC44O1xuXG4gICAgICAgIGlmICh0eXBlb2YgKGV2ZW50T2JqZWN0LnkyKSAhPT0gXCJ1bmRlZmluZWRcIikge1xuXG4gICAgICAgICAgdmFyIG1hcmtlclByb3BzID0gZGF0YVNlcmllcy5nZXRNYXJrZXJQcm9wZXJ0aWVzKGluZGV4LCBldmVudE9iamVjdC54MSwgZXZlbnRPYmplY3QueTIsIHRoaXMuY2hhcnQub3ZlcmxhaWRDYW52YXNDdHgpO1xuICAgICAgICAgIG1hcmtlclByb3BzLnNpemUgPSBNYXRoLm1heChtYXJrZXJQcm9wcy5zaXplICogMS41IDw8IDAsIDEwKTtcblxuICAgICAgICAgIG1hcmtlclByb3BzLmJvcmRlckNvbG9yID0gbWFya2VyUHJvcHMuYm9yZGVyQ29sb3IgfHwgXCIjRkZGRkZGXCI7XG4gICAgICAgICAgbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzID0gbWFya2VyUHJvcHMuYm9yZGVyVGhpY2tuZXNzIHx8IE1hdGguY2VpbChtYXJrZXJQcm9wcy5zaXplICogLjEpO1xuXG4gICAgICAgICAgLy9vdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IC44O1xuICAgICAgICAgIFJlbmRlckhlbHBlci5kcmF3TWFya2VycyhbbWFya2VyUHJvcHNdKTtcbiAgICAgICAgICAvL292ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gLjg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImJ1YmJsZVwiKSB7XG4gICAgICAgIHZhciBtYXJrZXJQcm9wcyA9IGRhdGFTZXJpZXMuZ2V0TWFya2VyUHJvcGVydGllcyhpbmRleCwgZXZlbnRPYmplY3QueDEsIGV2ZW50T2JqZWN0LnkxLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4KTtcbiAgICAgICAgbWFya2VyUHJvcHMuc2l6ZSA9IGV2ZW50T2JqZWN0LnNpemU7XG4gICAgICAgIG1hcmtlclByb3BzLmNvbG9yID0gXCJ3aGl0ZVwiO1xuICAgICAgICBtYXJrZXJQcm9wcy5ib3JkZXJDb2xvciA9IFwid2hpdGVcIjtcbiAgICAgICAgLy9tYXJrZXJQcm9wcy5ib3JkZXJUaGlja25lc3MgPSAyO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IC4zO1xuICAgICAgICBSZW5kZXJIZWxwZXIuZHJhd01hcmtlcnMoW21hcmtlclByb3BzXSk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRDb2x1bW4xMDBcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUNvbHVtblwiKSB7XG4gICAgICAgIGRyYXdSZWN0KG92ZXJsYWlkQ2FudmFzQ3R4LCBldmVudE9iamVjdC54MSwgZXZlbnRPYmplY3QueTEsIGV2ZW50T2JqZWN0LngyLCBldmVudE9iamVjdC55MiwgXCJ3aGl0ZVwiLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgLjMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcInBpZVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJkb3VnaG51dFwiKSB7XG4gICAgICAgIGRyYXdTZWdtZW50KG92ZXJsYWlkQ2FudmFzQ3R4LCBldmVudE9iamVjdC5jZW50ZXIsIGV2ZW50T2JqZWN0LnJhZGl1cywgXCJ3aGl0ZVwiLCBkYXRhU2VyaWVzLnR5cGUsIGV2ZW50T2JqZWN0LnN0YXJ0QW5nbGUsIGV2ZW50T2JqZWN0LmVuZEFuZ2xlLCAuMywgZXZlbnRPYmplY3QucGVyY2VudElubmVyUmFkaXVzKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIpIHtcblxuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LnN0cm9rZVN0eWxlID0gZXZlbnRPYmplY3QuY29sb3I7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LmxpbmVXaWR0aCA9IGV2ZW50T2JqZWN0LmJvcmRlclRoaWNrbmVzcyAqIDI7XG4gICAgICAgIG9mZnNldCA9IChvdmVybGFpZENhbnZhc0N0eC5saW5lV2lkdGgpICUgMiA9PT0gMCA/IDAgOiAuNTtcblxuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHgubW92ZVRvKGV2ZW50T2JqZWN0LngzIC0gb2Zmc2V0LCBldmVudE9iamVjdC55Mik7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LmxpbmVUbyhldmVudE9iamVjdC54MyAtIG9mZnNldCwgTWF0aC5taW4oZXZlbnRPYmplY3QueTEsIGV2ZW50T2JqZWN0Lnk0KSk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LnN0cm9rZSgpO1xuXG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5tb3ZlVG8oZXZlbnRPYmplY3QueDMgLSBvZmZzZXQsIE1hdGgubWF4KGV2ZW50T2JqZWN0LnkxLCBldmVudE9iamVjdC55NCkpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDMgLSBvZmZzZXQsIGV2ZW50T2JqZWN0LnkzKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgZHJhd1JlY3Qob3ZlcmxhaWRDYW52YXNDdHgsIGV2ZW50T2JqZWN0LngxLCBNYXRoLm1pbihldmVudE9iamVjdC55MSwgZXZlbnRPYmplY3QueTQpLCBldmVudE9iamVjdC54MiwgTWF0aC5tYXgoZXZlbnRPYmplY3QueTEsIGV2ZW50T2JqZWN0Lnk0KSwgXCJ0cmFuc3BhcmVudFwiLCBldmVudE9iamVjdC5ib3JkZXJUaGlja25lc3MgKiAyLCBldmVudE9iamVjdC5jb2xvciwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikge1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlU3R5bGUgPSBldmVudE9iamVjdC5jb2xvcjtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHgubGluZVdpZHRoID0gZXZlbnRPYmplY3QuYm9yZGVyVGhpY2tuZXNzICogMjtcblxuICAgICAgICBvZmZzZXQgPSAob3ZlcmxhaWRDYW52YXNDdHgubGluZVdpZHRoKSAlIDIgPT09IDAgPyAwIDogLjU7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lm1vdmVUbyhldmVudE9iamVjdC54MyAtIG9mZnNldCwgZXZlbnRPYmplY3QueTIpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDMgLSBvZmZzZXQsIGV2ZW50T2JqZWN0LnkzKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lm1vdmVUbyhldmVudE9iamVjdC54MywgZXZlbnRPYmplY3QueTEpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDEsIGV2ZW50T2JqZWN0LnkxKTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIG92ZXJsYWlkQ2FudmFzQ3R4Lm1vdmVUbyhldmVudE9iamVjdC54MywgZXZlbnRPYmplY3QueTQpO1xuICAgICAgICBvdmVybGFpZENhbnZhc0N0eC5saW5lVG8oZXZlbnRPYmplY3QueDIsIGV2ZW50T2JqZWN0Lnk0KTtcbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgb3ZlcmxhaWRDYW52YXNDdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcmxhaWRDYW52YXNDdHgucmVzdG9yZSgpO1xuICBvdmVybGFpZENhbnZhc0N0eC5nbG9iYWxBbHBoYSA9IDE7XG4gIG92ZXJsYWlkQ2FudmFzQ3R4LmJlZ2luUGF0aCgpO1xuXG4gIHJldHVybjtcbn1cblxuVG9vbFRpcC5wcm90b3R5cGUuZ2V0VG9vbFRpcElubmVySFRNTCA9IGZ1bmN0aW9uIChlKSB7XG4gIHZhciBlbnRyaWVzID0gZS5lbnRyaWVzO1xuICB2YXIgdG9vbFRpcElubmVySHRtbCA9IG51bGw7XG4gIHZhciBkYXRhU2VyaWVzID0gbnVsbDtcbiAgdmFyIGRhdGFQb2ludCA9IG51bGw7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjb2xvciA9IG51bGw7XG4gIHZhciB0b29sVGlwQ29udGVudCA9IFwiXCI7XG5cbiAgdmFyIGlzVG9vbFRpcERlZmluZWRJbkRhdGEgPSB0cnVlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5kYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50IHx8IGVudHJpZXNbaV0uZGF0YVBvaW50LnRvb2xUaXBDb250ZW50KSB7XG4gICAgICBpc1Rvb2xUaXBEZWZpbmVkSW5EYXRhID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNUb29sVGlwRGVmaW5lZEluRGF0YSAmJiAoKHRoaXMuY29udGVudCAmJiB0eXBlb2YgKHRoaXMuY29udGVudCkgPT09IFwiZnVuY3Rpb25cIikgfHwgdGhpcy5jb250ZW50Rm9ybWF0dGVyKSkge1xuXG4gICAgdmFyIHBhcmFtID0ge1xuICAgICAgY2hhcnQ6IHRoaXMuY2hhcnQsIHRvb2xUaXA6IHRoaXMuX29wdGlvbnMsIGVudHJpZXM6IGVudHJpZXNcbiAgICB9O1xuICAgIHRvb2xUaXBJbm5lckh0bWwgPSB0aGlzLmNvbnRlbnRGb3JtYXR0ZXIgPyB0aGlzLmNvbnRlbnRGb3JtYXR0ZXIocGFyYW0pIDogdGhpcy5jb250ZW50KHBhcmFtKTtcblxuICB9IGVsc2Uge1xuXG4gICAgaWYgKHRoaXMuc2hhcmVkICYmIHRoaXMuY2hhcnQucGxvdEluZm8uYXhpc1BsYWNlbWVudCAhPT0gXCJub25lXCIpIHtcblxuICAgICAgdmFyIHRvb2xUaXBJbm5lckh0bWxQcmVmaXggPSBcIlwiO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGF0YVNlcmllcyA9IGVudHJpZXNbaV0uZGF0YVNlcmllcztcbiAgICAgICAgZGF0YVBvaW50ID0gZW50cmllc1tpXS5kYXRhUG9pbnQ7XG4gICAgICAgIGluZGV4ID0gZW50cmllc1tpXS5pbmRleDtcblxuICAgICAgICB0b29sVGlwQ29udGVudCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKGkgPT09IDAgJiYgaXNUb29sVGlwRGVmaW5lZEluRGF0YSAmJiAhdGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgdG9vbFRpcElubmVySHRtbFByZWZpeCArPSB0eXBlb2YgKHRoaXMuY2hhcnQuYXhpc1gubGFiZWxzW2RhdGFQb2ludC54XSkgIT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLmNoYXJ0LmF4aXNYLmxhYmVsc1tkYXRhUG9pbnQueF0gOiBcInt4fVwiO1xuICAgICAgICAgIHRvb2xUaXBJbm5lckh0bWxQcmVmaXggKz0gXCI8L2JyPlwiO1xuICAgICAgICAgIHRvb2xUaXBJbm5lckh0bWxQcmVmaXggPSB0aGlzLmNoYXJ0LnJlcGxhY2VLZXl3b3Jkc1dpdGhWYWx1ZSh0b29sVGlwSW5uZXJIdG1sUHJlZml4LCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQWxsb3dzIGRpc2FibGluZyBvZiB0b29sVGlwIGZvciBpbmRpdmlkdWFsIGRhdGFQb2ludHMvZGF0YVNlcmllc1xuICAgICAgICBpZiAoZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID09PSBudWxsIHx8ICh0eXBlb2YgKGRhdGFQb2ludC50b29sVGlwQ29udGVudCkgPT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YVNlcmllcy5fb3B0aW9ucy50b29sVGlwQ29udGVudCA9PT0gbnVsbCkpXG4gICAgICAgICAgY29udGludWU7XG5cblxuICAgICAgICBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJjb2x1bW5cIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZENvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYTEwMFwiKSB7XG4gICAgICAgICAgdG9vbFRpcENvbnRlbnQgKz0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPntuYW1lfTo8L3NwYW4+Jm5ic3A7Jm5ic3A7e3l9XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImJ1YmJsZVwiKSB7XG4gICAgICAgICAgdG9vbFRpcENvbnRlbnQgKz0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPntuYW1lfTo8L3NwYW4+Jm5ic3A7Jm5ic3A7e3l9LCAmbmJzcDsmbmJzcDt7en1cIjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImRvdWdobnV0XCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImZ1bm5lbFwiKSB7XG4gICAgICAgICAgdG9vbFRpcENvbnRlbnQgKz0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIiZuYnNwOyZuYnNwO3t5fVwiO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUNvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUJhclwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZUFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwicmFuZ2VTcGxpbmVBcmVhXCIpIHtcbiAgICAgICAgICB0b29sVGlwQ29udGVudCArPSBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgPyBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgOiBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50ID8gZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA6IHRoaXMuY29udGVudCAmJiB0eXBlb2YgKHRoaXMuY29udGVudCkgIT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29udGVudCA6IFwiPHNwYW4gc3R5bGU9J1xcXCInY29sb3I6e2NvbG9yfTsnXFxcIic+e25hbWV9Ojwvc3Bhbj4mbmJzcDsmbmJzcDt7eVswXX0sJm5ic3A7e3lbMV19XCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImNhbmRsZXN0aWNrXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcIm9obGNcIikge1xuICAgICAgICAgIHRvb2xUaXBDb250ZW50ICs9IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA/IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA6IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgPyBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50IDogdGhpcy5jb250ZW50ICYmIHR5cGVvZiAodGhpcy5jb250ZW50KSAhPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb250ZW50IDogXCI8c3BhbiBzdHlsZT0nXFxcIidjb2xvcjp7Y29sb3J9OydcXFwiJz57bmFtZX06PC9zcGFuPlwiXG4gICAgICAgICAgICAgICAgICArIFwiPGJyLz5PcGVuOiAmbmJzcDsmbmJzcDt7eVswXX1cIlxuICAgICAgICAgICAgICAgICAgKyBcIjxici8+SGlnaDogJm5ic3A7Jm5ic3A7Jm5ic3A7e3lbMV19XCJcbiAgICAgICAgICAgICAgICAgICsgXCI8YnIvPkxvdzombmJzcDsmbmJzcDsmbmJzcDt7eVsyXX1cIlxuICAgICAgICAgICAgICAgICAgKyBcIjxici8+Q2xvc2U6ICZuYnNwOyZuYnNwO3t5WzNdfVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvb2xUaXBJbm5lckh0bWwgPT09IG51bGwpXG4gICAgICAgICAgdG9vbFRpcElubmVySHRtbCA9IFwiXCI7XG5cblxuICAgICAgICBpZiAodGhpcy5yZXZlcnNlZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgdG9vbFRpcElubmVySHRtbCA9IHRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKHRvb2xUaXBDb250ZW50LCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGluZGV4KSArIHRvb2xUaXBJbm5lckh0bWw7XG5cbiAgICAgICAgICBpZiAoaSA8IGVudHJpZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHRvb2xUaXBJbm5lckh0bWwgPSBcIjwvYnI+XCIgKyB0b29sVGlwSW5uZXJIdG1sO1xuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICB0b29sVGlwSW5uZXJIdG1sICs9IHRoaXMuY2hhcnQucmVwbGFjZUtleXdvcmRzV2l0aFZhbHVlKHRvb2xUaXBDb250ZW50LCBkYXRhUG9pbnQsIGRhdGFTZXJpZXMsIGluZGV4KTtcblxuICAgICAgICAgIGlmIChpIDwgZW50cmllcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgdG9vbFRpcElubmVySHRtbCArPSBcIjwvYnI+XCI7XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICAgIGlmICh0b29sVGlwSW5uZXJIdG1sICE9PSBudWxsKVxuICAgICAgICB0b29sVGlwSW5uZXJIdG1sID0gdG9vbFRpcElubmVySHRtbFByZWZpeCArIHRvb2xUaXBJbm5lckh0bWw7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICBkYXRhU2VyaWVzID0gZW50cmllc1swXS5kYXRhU2VyaWVzO1xuICAgICAgZGF0YVBvaW50ID0gZW50cmllc1swXS5kYXRhUG9pbnQ7XG4gICAgICBpbmRleCA9IGVudHJpZXNbMF0uaW5kZXg7XG5cbiAgICAgIC8vQWxsb3dzIGRpc2FibGluZyBvZiB0b29sVGlwIGZvciBpbmRpdmlkdWFsIGRhdGFQb2ludHMvZGF0YVNlcmllc1xuICAgICAgaWYgKGRhdGFQb2ludC50b29sVGlwQ29udGVudCA9PT0gbnVsbCB8fCAodHlwZW9mIChkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQpID09PSBcInVuZGVmaW5lZFwiICYmIGRhdGFTZXJpZXMuX29wdGlvbnMudG9vbFRpcENvbnRlbnQgPT09IG51bGwpKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuXG4gICAgICBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcImxpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcExpbmVcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RlcEFyZWFcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3BsaW5lQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJjb2x1bW5cIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwiYmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInNjYXR0ZXJcIlxuICAgICAgICB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZENvbHVtblwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQ29sdW1uMTAwXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInN0YWNrZWRCYXJcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwic3RhY2tlZEJhcjEwMFwiXG4gICAgICAgIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJzdGFja2VkQXJlYTEwMFwiKSB7XG4gICAgICAgIHRvb2xUaXBDb250ZW50ID0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPlwiICsgKGRhdGFQb2ludC5sYWJlbCA/IFwie2xhYmVsfVwiIDogXCJ7eH1cIikgKyBcIiA6PC9zcGFuPiZuYnNwOyZuYnNwO3t5fVwiO1xuICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwiYnViYmxlXCIpIHtcbiAgICAgICAgdG9vbFRpcENvbnRlbnQgPSBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgPyBkYXRhUG9pbnQudG9vbFRpcENvbnRlbnQgOiBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50ID8gZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA6IHRoaXMuY29udGVudCAmJiB0eXBlb2YgKHRoaXMuY29udGVudCkgIT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29udGVudCA6IFwiPHNwYW4gc3R5bGU9J1xcXCInY29sb3I6e2NvbG9yfTsnXFxcIic+XCIgKyAoZGF0YVBvaW50LmxhYmVsID8gXCJ7bGFiZWx9XCIgOiBcInt4fVwiKSArIFwiOjwvc3Bhbj4mbmJzcDsmbmJzcDt7eX0sICZuYnNwOyZuYnNwO3t6fVwiO1xuICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwicGllXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImRvdWdobnV0XCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcImZ1bm5lbFwiKSB7XG4gICAgICAgIHRvb2xUaXBDb250ZW50ID0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiAoZGF0YVBvaW50Lm5hbWUgPyBcIntuYW1lfTombmJzcDsmbmJzcDtcIiA6IGRhdGFQb2ludC5sYWJlbCA/IFwie2xhYmVsfTombmJzcDsmbmJzcDtcIiA6IFwiXCIpICsgXCJ7eX1cIjtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQ29sdW1uXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQmFyXCIgfHwgZGF0YVNlcmllcy50eXBlID09PSBcInJhbmdlQXJlYVwiIHx8IGRhdGFTZXJpZXMudHlwZSA9PT0gXCJyYW5nZVNwbGluZUFyZWFcIikge1xuICAgICAgICB0b29sVGlwQ29udGVudCA9IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA/IGRhdGFQb2ludC50b29sVGlwQ29udGVudCA6IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgPyBkYXRhU2VyaWVzLnRvb2xUaXBDb250ZW50IDogdGhpcy5jb250ZW50ICYmIHR5cGVvZiAodGhpcy5jb250ZW50KSAhPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb250ZW50IDogXCI8c3BhbiBzdHlsZT0nXFxcIidjb2xvcjp7Y29sb3J9OydcXFwiJz5cIiArIChkYXRhUG9pbnQubGFiZWwgPyBcIntsYWJlbH1cIiA6IFwie3h9XCIpICsgXCIgOjwvc3Bhbj4mbmJzcDsmbmJzcDt7eVswXX0sICZuYnNwO3t5WzFdfVwiO1xuICAgICAgfSBlbHNlIGlmIChkYXRhU2VyaWVzLnR5cGUgPT09IFwiY2FuZGxlc3RpY2tcIiB8fCBkYXRhU2VyaWVzLnR5cGUgPT09IFwib2hsY1wiKSB7XG4gICAgICAgIHRvb2xUaXBDb250ZW50ID0gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50ID8gZGF0YVBvaW50LnRvb2xUaXBDb250ZW50IDogZGF0YVNlcmllcy50b29sVGlwQ29udGVudCA/IGRhdGFTZXJpZXMudG9vbFRpcENvbnRlbnQgOiB0aGlzLmNvbnRlbnQgJiYgdHlwZW9mICh0aGlzLmNvbnRlbnQpICE9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQgOiBcIjxzcGFuIHN0eWxlPSdcXFwiJ2NvbG9yOntjb2xvcn07J1xcXCInPlwiICsgKGRhdGFQb2ludC5sYWJlbCA/IFwie2xhYmVsfVwiIDogXCJ7eH1cIikgKyBcIjwvc3Bhbj5cIlxuICAgICAgICAgICsgXCI8YnIvPk9wZW46ICZuYnNwOyZuYnNwO3t5WzBdfVwiXG4gICAgICAgICAgKyBcIjxici8+SGlnaDogJm5ic3A7Jm5ic3A7Jm5ic3A7e3lbMV19XCJcbiAgICAgICAgICArIFwiPGJyLz5Mb3c6ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3t5WzJdfVwiXG4gICAgICAgICAgKyBcIjxici8+Q2xvc2U6ICZuYnNwOyZuYnNwO3t5WzNdfVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9vbFRpcElubmVySHRtbCA9PT0gbnVsbClcbiAgICAgICAgdG9vbFRpcElubmVySHRtbCA9IFwiXCI7XG5cbiAgICAgIHRvb2xUaXBJbm5lckh0bWwgKz0gdGhpcy5jaGFydC5yZXBsYWNlS2V5d29yZHNXaXRoVmFsdWUodG9vbFRpcENvbnRlbnQsIGRhdGFQb2ludCwgZGF0YVNlcmllcywgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b29sVGlwSW5uZXJIdG1sO1xufVxuXG5Ub29sVGlwLnByb3RvdHlwZS5lbmFibGVBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lci5zdHlsZS5XZWJraXRUcmFuc2l0aW9uKVxuICAgIHJldHVybjtcblxuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5XZWJraXRUcmFuc2l0aW9uID0gXCJsZWZ0IC4ycyBlYXNlLW91dCwgYm90dG9tIC4ycyBlYXNlLW91dFwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5Nb3pUcmFuc2l0aW9uID0gXCJsZWZ0IC4ycyBlYXNlLW91dCwgYm90dG9tIC4ycyBlYXNlLW91dFwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5Nc1RyYW5zaXRpb24gPSBcImxlZnQgLjJzIGVhc2Utb3V0LCBib3R0b20gLjJzIGVhc2Utb3V0XCI7XG4gIHRoaXMuY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBcImxlZnQgLjJzIGVhc2Utb3V0LCBib3R0b20gLjJzIGVhc2Utb3V0XCI7XG59XG5cblRvb2xUaXAucHJvdG90eXBlLmRpc2FibGVBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5jb250YWluZXIuc3R5bGUuV2Via2l0VHJhbnNpdGlvbilcbiAgICByZXR1cm47XG5cbiAgdGhpcy5jb250YWluZXIuc3R5bGUuV2Via2l0VHJhbnNpdGlvbiA9IFwiXCI7XG4gIHRoaXMuY29udGFpbmVyLnN0eWxlLk1velRyYW5zaXRpb24gPSBcIlwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5Nc1RyYW5zaXRpb24gPSBcIlwiO1xuICB0aGlzLmNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gXCJcIjtcbn1cblxuVG9vbFRpcC5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uIChyZXNldE92ZXJsYXllZENhbnZhcykge1xuICBpZiAoIXRoaXMuZW5hYmxlZClcbiAgICByZXR1cm47XG5cbiAgcmVzZXRPdmVybGF5ZWRDYW52YXMgPSB0eXBlb2YgKHJlc2V0T3ZlcmxheWVkQ2FudmFzKSA9PT0gXCJ1bmRlZmluZWRcIiA/IHRydWUgOiByZXNldE92ZXJsYXllZENhbnZhcztcblxuICB0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIHRoaXMuY3VycmVudFNlcmllc0luZGV4ID0gLTE7XG4gIHRoaXMuX3ByZXZYID0gTmFOO1xuICB0aGlzLl9wcmV2WSA9IE5hTjtcbiAgLy90aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzQ3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLndpZHRoLCB0aGlzLmNoYXJ0Lm92ZXJsYWlkQ2FudmFzLmhlaWdodCk7XG4gIGlmIChyZXNldE92ZXJsYXllZENhbnZhcylcbiAgICB0aGlzLmNoYXJ0LnJlc2V0T3ZlcmxheWVkQ2FudmFzKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2xUaXA7XG4iLCJcbmZ1bmN0aW9uIHlTY2FsZUFuaW1hdGlvbihmcmFjdGlvbkNvbXBsZXRlLCBhbmltYXRpb25JbmZvKSB7XG5cbiAgaWYgKGZyYWN0aW9uQ29tcGxldGUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBjdHggPSBhbmltYXRpb25JbmZvLmRlc3Q7XG4gIGNvbnN0IHNvdXJjZUNhbnZhcyA9IGFuaW1hdGlvbkluZm8uc291cmNlLmNhbnZhcztcbiAgY29uc3QgYmFzZSA9IGFuaW1hdGlvbkluZm8uYW5pbWF0aW9uQmFzZTtcblxuICBjb25zdCBvZmZzZXRZID0gKGJhc2UgLSBiYXNlICogZnJhY3Rpb25Db21wbGV0ZSk7XG5cbiAgY3R4LmRyYXdJbWFnZShzb3VyY2VDYW52YXMsIDAsIDAsIHNvdXJjZUNhbnZhcy53aWR0aCwgc291cmNlQ2FudmFzLmhlaWdodCwgMCwgb2Zmc2V0WSxcbiAgICAgY3R4LmNhbnZhcy53aWR0aCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8sIGZyYWN0aW9uQ29tcGxldGUgKiBjdHguY2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xufVxuXG5mdW5jdGlvbiB4U2NhbGVBbmltYXRpb24oZnJhY3Rpb25Db21wbGV0ZSwgYW5pbWF0aW9uSW5mbykge1xuXG4gIGlmIChmcmFjdGlvbkNvbXBsZXRlID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY3R4ID0gYW5pbWF0aW9uSW5mby5kZXN0O1xuICBjb25zdCBzb3VyY2VDYW52YXMgPSBhbmltYXRpb25JbmZvLnNvdXJjZS5jYW52YXM7XG4gIGNvbnN0IGJhc2UgPSBhbmltYXRpb25JbmZvLmFuaW1hdGlvbkJhc2U7XG5cbiAgY29uc3Qgb2Zmc2V0WCA9IChiYXNlIC0gYmFzZSAqIGZyYWN0aW9uQ29tcGxldGUpO1xuXG4gIGN0eC5kcmF3SW1hZ2Uoc291cmNlQ2FudmFzLCAwLCAwLCBzb3VyY2VDYW52YXMud2lkdGgsIHNvdXJjZUNhbnZhcy5oZWlnaHQsIG9mZnNldFgsIDAsXG4gICAgZnJhY3Rpb25Db21wbGV0ZSAqIGN0eC5jYW52YXMud2lkdGggLyBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvLCBjdHguY2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xufVxuXG5mdW5jdGlvbiB4Q2xpcEFuaW1hdGlvbihmcmFjdGlvbkNvbXBsZXRlLCBhbmltYXRpb25JbmZvKSB7XG5cbiAgaWYgKGZyYWN0aW9uQ29tcGxldGUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBjdHggPSBhbmltYXRpb25JbmZvLmRlc3Q7XG4gIGNvbnN0IHNvdXJjZUNhbnZhcyA9IGFuaW1hdGlvbkluZm8uc291cmNlLmNhbnZhcztcblxuICBjdHguc2F2ZSgpO1xuXG4gIGlmIChmcmFjdGlvbkNvbXBsZXRlID4gMClcbiAgICBjdHguZHJhd0ltYWdlKHNvdXJjZUNhbnZhcywgMCwgMCwgc291cmNlQ2FudmFzLndpZHRoICogZnJhY3Rpb25Db21wbGV0ZSwgc291cmNlQ2FudmFzLmhlaWdodCwgMCwgMCxcbiAgICAgIHNvdXJjZUNhbnZhcy53aWR0aCAqIGZyYWN0aW9uQ29tcGxldGUgLyBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvLCBzb3VyY2VDYW52YXMuaGVpZ2h0IC8gZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyk7XG5cbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gZmFkZUluQW5pbWF0aW9uKGZyYWN0aW9uQ29tcGxldGUsIGFuaW1hdGlvbkluZm8pIHtcblxuICBpZiAoZnJhY3Rpb25Db21wbGV0ZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eCA9IGFuaW1hdGlvbkluZm8uZGVzdDtcbiAgY29uc3Qgc291cmNlQ2FudmFzID0gYW5pbWF0aW9uSW5mby5zb3VyY2UuY2FudmFzO1xuXG4gIGN0eC5zYXZlKCk7XG5cbiAgY3R4Lmdsb2JhbEFscGhhID0gZnJhY3Rpb25Db21wbGV0ZTtcblxuICBjdHguZHJhd0ltYWdlKHNvdXJjZUNhbnZhcywgMCwgMCwgc291cmNlQ2FudmFzLndpZHRoLCBzb3VyY2VDYW52YXMuaGVpZ2h0LCAwLCAwLFxuICAgIGN0eC5jYW52YXMud2lkdGggLyBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvLCBjdHguY2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xuXG4gIGN0eC5yZXN0b3JlKCk7XG5cbn1cblxuY29uc3QgZWFzaW5nID0ge1xuXG4gIGxpbmVhcih0LCBiLCBjLCBkKSB7XG4gICAgcmV0dXJuIGMgKiB0IC8gZCArIGI7XG4gIH0sXG5cbiAgZWFzZU91dFF1YWQodCwgYiwgYywgZCkge1xuICAgIHJldHVybiAtYyAqICh0IC89IGQpICogKHQgLSAyKSArIGI7XG4gIH0sXG5cbiAgZWFzZU91dFF1YXJ0ICh0LCBiLCBjLCBkKSB7XG4gICAgcmV0dXJuIC1jICogKCh0ID0gdCAvIGQgLSAxKSAqIHQgKiB0ICogdCAtIDEpICsgYjtcbiAgfSxcblxuICBlYXNlSW5RdWFkKHQsIGIsIGMsIGQpIHtcbiAgICByZXR1cm4gYyAqICh0IC89IGQpICogdCArIGI7XG4gIH0sXG5cbiAgZWFzZUluUXVhcnQodCwgYiwgYywgZCkge1xuICAgIHJldHVybiBjICogKHQgLz0gZCkgKiB0ICogdCAqIHQgKyBiO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICB5U2NhbGVBbmltYXRpb24sXG4gIHhTY2FsZUFuaW1hdGlvbixcbiAgeENsaXBBbmltYXRpb24sXG4gIGZhZGVJbkFuaW1hdGlvbixcbiAgZWFzaW5nXG5cbn1cbiIsImNvbnN0IFJlbmRlckhlbHBlciA9IHtcblxuICBkcmF3TWFya2VyOiBmdW5jdGlvbiAoeCwgeSwgY3R4LCBtYXJrZXJUeXBlLCBtYXJrZXJTaXplLCBtYXJrZXJDb2xvciwgbWFya2VyQm9yZGVyQ29sb3IsIG1hcmtlckJvcmRlclRoaWNrbmVzcykge1xuXG4gICAgaWYgKCFjdHgpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgYWxwaGEgPSAxO1xuXG4gICAgY3R4LmZpbGxTdHlsZSA9IG1hcmtlckNvbG9yID8gbWFya2VyQ29sb3IgOiBcIiMwMDAwMDBcIjtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBtYXJrZXJCb3JkZXJDb2xvciA/IG1hcmtlckJvcmRlckNvbG9yIDogXCIjMDAwMDAwXCI7XG4gICAgY3R4LmxpbmVXaWR0aCA9IG1hcmtlckJvcmRlclRoaWNrbmVzcyA/IG1hcmtlckJvcmRlclRoaWNrbmVzcyA6IDA7XG5cblxuICAgIGlmIChtYXJrZXJUeXBlID09PSBcImNpcmNsZVwiKSB7XG5cbiAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAvL3JldHVybjtcblxuICAgICAgY3R4LmFyYyh4LCB5LCBtYXJrZXJTaXplIC8gMiwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcblxuICAgICAgaWYgKG1hcmtlckNvbG9yKVxuICAgICAgICBjdHguZmlsbCgpO1xuXG4gICAgICBpZiAobWFya2VyQm9yZGVyVGhpY2tuZXNzKSB7XG5cbiAgICAgICAgaWYgKCFtYXJrZXJCb3JkZXJDb2xvcikge1xuICAgICAgICAgIGFscGhhID0gY3R4Lmdsb2JhbEFscGhhO1xuICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IC4xNTtcbiAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcImJsYWNrXCI7XG4gICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGFscGhhO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobWFya2VyVHlwZSA9PT0gXCJzcXVhcmVcIikge1xuXG4gICAgICAvL2N0eC5tb3ZlVG8oeCAtIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4LnJlY3QoeCAtIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIsIG1hcmtlclNpemUsIG1hcmtlclNpemUpO1xuXG4gICAgICBpZiAobWFya2VyQ29sb3IpXG4gICAgICAgIGN0eC5maWxsKCk7XG5cbiAgICAgIGlmIChtYXJrZXJCb3JkZXJUaGlja25lc3MpIHtcblxuICAgICAgICBpZiAoIW1hcmtlckJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgYWxwaGEgPSBjdHguZ2xvYmFsQWxwaGE7XG4gICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gLjE1O1xuICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwiYmxhY2tcIjtcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGN0eC5zdHJva2UoKTtcblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFya2VyVHlwZSA9PT0gXCJ0cmlhbmdsZVwiKSB7XG5cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oeCAtIG1hcmtlclNpemUgLyAyLCB5ICsgbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyh4ICsgbWFya2VyU2l6ZSAvIDIsIHkgKyBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHgubGluZVRvKHgsIHkgLSBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICAgIGlmIChtYXJrZXJDb2xvcilcbiAgICAgICAgY3R4LmZpbGwoKTtcblxuICAgICAgaWYgKG1hcmtlckJvcmRlclRoaWNrbmVzcykge1xuXG4gICAgICAgIGlmICghbWFya2VyQm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICBhbHBoYSA9IGN0eC5nbG9iYWxBbHBoYTtcbiAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAuMTU7XG4gICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gXCJibGFja1wiO1xuICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBhbHBoYTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgY3R4LnN0cm9rZSgpO1xuXG4gICAgICB9XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgfSBlbHNlIGlmIChtYXJrZXJUeXBlID09PSBcImNyb3NzXCIpIHtcblxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbWFya2VyQ29sb3I7XG4gICAgICBtYXJrZXJCb3JkZXJUaGlja25lc3MgPSBtYXJrZXJTaXplIC8gNDtcbiAgICAgIGN0eC5saW5lV2lkdGggPSBtYXJrZXJCb3JkZXJUaGlja25lc3M7XG5cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8oeCAtIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyh4ICsgbWFya2VyU2l6ZSAvIDIsIHkgKyBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgIGN0eC5tb3ZlVG8oeCArIG1hcmtlclNpemUgLyAyLCB5IC0gbWFya2VyU2l6ZSAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyh4IC0gbWFya2VyU2l6ZSAvIDIsIHkgKyBtYXJrZXJTaXplIC8gMik7XG4gICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICB9XG5cblxuICB9LFxuICBkcmF3TWFya2VyczogZnVuY3Rpb24gKG1hcmtlcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2ldO1xuXG4gICAgICBSZW5kZXJIZWxwZXIuZHJhd01hcmtlcihtYXJrZXIueCwgbWFya2VyLnksIG1hcmtlci5jdHgsIG1hcmtlci50eXBlLCBtYXJrZXIuc2l6ZSwgbWFya2VyLmNvbG9yLCBtYXJrZXIuYm9yZGVyQ29sb3IsIG1hcmtlci5ib3JkZXJUaGlja25lc3MpO1xuICAgIH1cbiAgfVxuICAvLyxcbiAgLy9kcmF3MXB4TGluZTogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgY3R4KSB7XG4gIC8vXHRjdHguYmVnaW5QYXRoKCk7XG4gIC8vXHRjdHguZHJhd1JlY3QoeDEsIHkxLCB4MiAtIHgxLCB5MiAtIHkxKTtcbiAgLy9cdGN0eC5zdHJva2UoKTtcbiAgLy99XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlckhlbHBlcjtcbiIsIlxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChkZXJpdmVkLCBiYXNlKSB7XG5cdGRlcml2ZWQucHJvdG90eXBlID0gaW5oZXJpdChiYXNlLnByb3RvdHlwZSk7XG5cdGRlcml2ZWQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZGVyaXZlZDtcblx0ZGVyaXZlZC5iYXNlID0gYmFzZS5wcm90b3R5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmhlcml0KHByb3RvKSB7XG5cdGZ1bmN0aW9uIEYoKSB7IH1cblx0Ri5wcm90b3R5cGUgPSBwcm90bztcblx0cmV0dXJuIG5ldyBGKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRUb0RhdGVUaW1lKGRhdGVUaW1lLCBudW0sIHR5cGUpIHtcblxuXHRpZiAodHlwZSA9PT0gXCJtaWxsaXNlY29uZFwiKVxuXHRcdGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kcyhkYXRlVGltZS5nZXRNaWxsaXNlY29uZHMoKSArIDEgKiBudW0pO1xuXHRlbHNlIGlmICh0eXBlID09PSBcInNlY29uZFwiKVxuXHRcdGRhdGVUaW1lLnNldFNlY29uZHMoZGF0ZVRpbWUuZ2V0U2Vjb25kcygpICsgMSAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwibWludXRlXCIpXG5cdFx0ZGF0ZVRpbWUuc2V0TWludXRlcyhkYXRlVGltZS5nZXRNaW51dGVzKCkgKyAxICogbnVtKTtcblx0ZWxzZSBpZiAodHlwZSA9PT0gXCJob3VyXCIpXG5cdFx0ZGF0ZVRpbWUuc2V0SG91cnMoZGF0ZVRpbWUuZ2V0SG91cnMoKSArIDEgKiBudW0pO1xuXHRlbHNlIGlmICh0eXBlID09PSBcImRheVwiKVxuXHRcdGRhdGVUaW1lLnNldERhdGUoZGF0ZVRpbWUuZ2V0RGF0ZSgpICsgMSAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwid2Vla1wiKVxuXHRcdGRhdGVUaW1lLnNldERhdGUoZGF0ZVRpbWUuZ2V0RGF0ZSgpICsgNyAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwibW9udGhcIilcblx0XHRkYXRlVGltZS5zZXRNb250aChkYXRlVGltZS5nZXRNb250aCgpICsgMSAqIG51bSk7XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwieWVhclwiKVxuXHRcdGRhdGVUaW1lLnNldEZ1bGxZZWFyKGRhdGVUaW1lLmdldEZ1bGxZZWFyKCkgKyAxICogbnVtKTtcblxuXHRyZXR1cm4gZGF0ZVRpbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9OdW1iZXIobnVtLCB0eXBlKSB7XG5cdHJldHVybiBjb25zdGFudHNbdHlwZSArIFwiRHVyYXRpb25cIl0gKiBudW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWQodmFsdWUsIGxlbmd0aCkge1xuXHR2YXIgaXNOZWdhdGl2ZSA9IGZhbHNlO1xuXHRpZiAodmFsdWUgPCAwKSB7XG5cdFx0aXNOZWdhdGl2ZSA9IHRydWU7XG5cdFx0dmFsdWUgKj0gLTE7XG5cdH1cblxuXHR2YWx1ZSA9IFwiXCIgKyB2YWx1ZTtcblx0bGVuZ3RoID0gIWxlbmd0aCA/IDEgOiBsZW5ndGg7XG5cblx0d2hpbGUgKHZhbHVlLmxlbmd0aCA8IGxlbmd0aCkgdmFsdWUgPSBcIjBcIiArIHZhbHVlO1xuXG5cdHJldHVybiBpc05lZ2F0aXZlID8gXCItXCIgKyB2YWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpbVN0cmluZyhzdHIpIHtcblx0aWYgKCFzdHIpXG5cdFx0cmV0dXJuIHN0cjtcblxuXHRzdHIgPSBzdHIucmVwbGFjZSgvXlxcc1xccyovLCAnJyk7XG5cdHZhciB3cyA9IC9cXHMvO1xuXHR2YXIgaSA9IHN0ci5sZW5ndGg7XG5cdHdoaWxlICh3cy50ZXN0KHN0ci5jaGFyQXQoLS1pKSkpIHsgfVxuXHRyZXR1cm4gc3RyLnNsaWNlKDAsIGkgKyAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEN0eChjb250ZXh0KSB7XG5cdGNvbnRleHQucm91bmRSZWN0ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgYm9yZGVyVGhpY2tuZXNzLCBiYWNrZ3JvdW5kQ29sb3IsIGJvcmRlckNvbG9yKSB7XG5cdFx0Ly8vPHNpZ25hdHVyZT5cblx0XHQvLy88c3VtbWFyeT5DcmVhdGVzIGEgcm91bmRlZCByZWN0YW5nbGUgd2l0aCBnaXZlbiBmaWxsL3N0cm9rZSBwYXJhbWV0ZXJzPC9zdW1tYXJ5PlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwieFwiIHR5cGU9XCJudW1iZXJcIj54IHZhbHVlPC9wYXJhbT5cblx0XHQvLy88cGFyYW0gbmFtZT1cInlcIiB0eXBlPVwibnVtYmVyXCI+eSB2YWx1ZTwvcGFyYW0+XG5cdFx0Ly8vPHBhcmFtIG5hbWU9XCJ3aWR0aFwiIHR5cGU9XCJudW1iZXJcIj5Cb3JkZXIgV2lkdGg8L3BhcmFtPlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwiaGVpZ2h0XCIgdHlwZT1cIm51bWJlclwiPkJvcmRlciBIZWlnaHQ8L3BhcmFtPlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwicmFkaXVzXCIgdHlwZT1cIm51bWJlclwiPkJvcmRlciBDb3JuZXJSYWRpdXM8L3BhcmFtPlxuXHRcdC8vLzxwYXJhbSBuYW1lPVwiYm9yZGVyVGhpY2tuZXNzXCIgdHlwZT1cIm51bWJlclwiPkJvcmRlciBUaGlja2VzczwvcGFyYW0+XG5cdFx0Ly8vPHBhcmFtIG5hbWU9XCJiYWNrZ3JvdW5kQ29sb3JcIiB0eXBlPVwibnVtYmVyXCI+QmFja2dyb3VuZCBDb2xvcjwvcGFyYW0+XG5cdFx0Ly8vPHBhcmFtIG5hbWU9XCJib3JkZXJDb2xvclwiIHR5cGU9XCJudW1iZXJcIj5Cb3JkZXIgQ29sb3I8L3BhcmFtPlxuXHRcdC8vLzwvc2lnbmF0dXJlPlxuXG5cdFx0aWYgKGJhY2tncm91bmRDb2xvcikge1xuXHRcdFx0dGhpcy5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG5cdFx0fVxuXG5cdFx0aWYgKGJvcmRlckNvbG9yKSB7XG5cdFx0XHR0aGlzLnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG5cdFx0fVxuXG5cdFx0Ly9pZiAodHlwZW9mIHN0cm9rZSA9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0Ly9cdHN0cm9rZSA9IHRydWU7XG5cdFx0Ly99XG5cblx0XHRpZiAodHlwZW9mIHJhZGl1cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0cmFkaXVzID0gNTtcblx0XHR9XG5cblx0XHR0aGlzLmxpbmVXaWR0aCA9IGJvcmRlclRoaWNrbmVzcztcblxuXHRcdHRoaXMuYmVnaW5QYXRoKCk7XG5cdFx0dGhpcy5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XG5cdFx0dGhpcy5saW5lVG8oeCArIHdpZHRoIC0gcmFkaXVzLCB5KTtcblx0XHR0aGlzLnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xuXHRcdHRoaXMubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG5cdFx0dGhpcy5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHR0aGlzLmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHR0aGlzLnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XG5cdFx0dGhpcy5saW5lVG8oeCwgeSArIHJhZGl1cyk7XG5cdFx0dGhpcy5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyByYWRpdXMsIHkpO1xuXHRcdHRoaXMuY2xvc2VQYXRoKCk7XG5cblx0XHRpZiAoYmFja2dyb3VuZENvbG9yKSB7XG5cdFx0XHR0aGlzLmZpbGwoKTtcblx0XHR9XG5cblx0XHRpZiAoYm9yZGVyQ29sb3IgJiYgYm9yZGVyVGhpY2tuZXNzID4gMCkge1xuXHRcdFx0dGhpcy5zdHJva2UoKTtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlTnVtYmVycyhhLCBiKSB7XG5cdHJldHVybiBhIC0gYjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEYXRhUG9pbnRYKGRhdGFQb2ludDEsIGRhdGFQb2ludDIpIHtcblx0cmV0dXJuIGRhdGFQb2ludDEueCAtIGRhdGFQb2ludDIueDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludFRvSGV4Q29sb3JTdHJpbmcobnVtKSB7XG5cdHZhciByID0gKChudW0gJiAweEZGMDAwMCkgPj4gMTYpLnRvU3RyaW5nKDE2KTtcblx0dmFyIGcgPSAoKG51bSAmIDB4MDBGRjAwKSA+PiA4KS50b1N0cmluZygxNik7XG5cdHZhciBiID0gKChudW0gJiAweDAwMDBGRikgPj4gMCkudG9TdHJpbmcoMTYpO1xuXG5cdHIgPSByLmxlbmd0aCA8IDIgPyBcIjBcIiArIHIgOiByO1xuXHRnID0gZy5sZW5ndGggPCAyID8gXCIwXCIgKyBnIDogZztcblx0YiA9IGIubGVuZ3RoIDwgMiA/IFwiMFwiICsgYiA6IGI7XG5cblx0cmV0dXJuIFwiI1wiICsgciArIGcgKyBiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUkdCVG9JbnQociwgZywgYikge1xuXHR2YXIgbnVtID0gKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7XG5cblx0cmV0dXJuIG51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludFRvUkdCKG51bSkge1xuXHR2YXIgcmdiID0gW107XG5cdHZhciByID0gKChudW0gJiAweEZGMDAwMCkgPj4gMTYpO1xuXHR2YXIgZyA9ICgobnVtICYgMHgwMEZGMDApID4+IDgpO1xuXHR2YXIgYiA9ICgobnVtICYgMHgwMDAwRkYpID4+IDApO1xuXG5cdC8vciA9IHIubGVuZ3RoIDwgMiA/IFwiMFwiICsgciA6IHI7XG5cdC8vZyA9IGcubGVuZ3RoIDwgMiA/IFwiMFwiICsgZyA6IGc7XG5cdC8vYiA9IGIubGVuZ3RoIDwgMiA/IFwiMFwiICsgYiA6IGI7XG5cblx0cmdiWzBdID0gcjtcblx0cmdiWzFdID0gZztcblx0cmdiWzJdID0gYjtcblxuXHRyZXR1cm4gcmdiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlJbmRleE9mKGVsdCAvKiwgZnJvbSovKSB7XG5cdHZhciBsZW4gPSB0aGlzLmxlbmd0aCA+Pj4gMDtcblxuXHR2YXIgZnJvbSA9IE51bWJlcihhcmd1bWVudHNbMV0pIHx8IDA7XG5cdGZyb20gPSAoZnJvbSA8IDApXG5cdFx0ID8gTWF0aC5jZWlsKGZyb20pXG5cdFx0IDogTWF0aC5mbG9vcihmcm9tKTtcblx0aWYgKGZyb20gPCAwKVxuXHRcdGZyb20gKz0gbGVuO1xuXG5cdGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspIHtcblx0XHRpZiAoZnJvbSBpbiB0aGlzICYmXG5cdFx0XHR0aGlzW2Zyb21dID09PSBlbHQpXG5cdFx0XHRyZXR1cm4gZnJvbTtcblx0fVxuXHRyZXR1cm4gLTE7XG59O1xuXG4vL0lFOC0gRml4OiBpbmRleE9mIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSUU4LSBmb3IgYXJyYXlzXG5leHBvcnQgZnVuY3Rpb24gYWRkQXJyYXlJbmRleE9mKG9iaikge1xuaWYgKCFvYmouaW5kZXhPZikge1xuXHRvYmouaW5kZXhPZiA9IGFycmF5SW5kZXhPZjtcbn1cblxucmV0dXJuIG9iajtcbn1cblxudmFyIGZvbnRIZWlnaHRJblBpeGVscyA9IHt9O1xudmFyIHRleHRNZWFzdXJlRWwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9udEhlaWdodEluUGl4ZWxzKGZvbnRGYW1pbHksIGZvbnRTaXplLCBmb250V2VpZ2h0KSB7XG5cblx0Ly9yZXR1cm4gZm9udFNpemU7XG5cblx0Zm9udFdlaWdodCA9IGZvbnRXZWlnaHQgfHwgXCJub3JtYWxcIjtcblxuXHR2YXIgZW50cnkgPSBmb250RmFtaWx5ICsgXCJfXCIgKyBmb250U2l6ZSArIFwiX1wiICsgZm9udFdlaWdodDtcblx0dmFyIGhlaWdodCA9IGZvbnRIZWlnaHRJblBpeGVsc1tlbnRyeV07XG5cblx0aWYgKGlzTmFOKGhlaWdodCkpIHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIHN0eWxlID0gXCJwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDowcHg7IHRvcDotMjAwMDBweDsgcGFkZGluZzowcHg7bWFyZ2luOjBweDtib3JkZXI6bm9uZTt3aGl0ZS1zcGFjZTpwcmU7bGluZS1oZWlnaHQ6bm9ybWFsO1wiICsgXCJmb250LWZhbWlseTpcIiArIGZvbnRGYW1pbHkgKyBcIjsgXCIgKyBcImZvbnQtc2l6ZTpcIiArIGZvbnRTaXplICsgXCJweDsgZm9udC13ZWlnaHQ6XCIgKyBmb250V2VpZ2h0ICsgXCI7XCI7XG5cdFx0XHQvL2NvbnNvbGUubG9nKHN0eWxlKTtcblx0XHRcdGlmICghdGV4dE1lYXN1cmVFbCkge1xuXHRcdFx0XHR2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdFx0XHRcdHRleHRNZWFzdXJlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0XHRcdFx0dGV4dE1lYXN1cmVFbC5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdFx0XHR2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIk1wZ3lpXCIpO1xuXHRcdFx0XHR0ZXh0TWVhc3VyZUVsLmFwcGVuZENoaWxkKHRleHROb2RlKTtcblx0XHRcdFx0Ym9keS5hcHBlbmRDaGlsZCh0ZXh0TWVhc3VyZUVsKTtcblx0XHRcdH1cblxuXHRcdFx0dGV4dE1lYXN1cmVFbC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdHRleHRNZWFzdXJlRWwuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgc3R5bGUpO1xuXG5cdFx0XHRoZWlnaHQgPSBNYXRoLnJvdW5kKHRleHRNZWFzdXJlRWwub2Zmc2V0SGVpZ2h0KTtcblx0XHRcdHRleHRNZWFzdXJlRWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0Ly9ib2R5LnJlbW92ZUNoaWxkKHRlbXBEaXYpO1xuXG5cdFx0XHQvL2lmICh3aW5kb3cuY29uc29sZSlcblx0XHRcdC8vXHR3aW5kb3cuY29uc29sZS5sb2coZm9udFNpemUgKyBcIjogXCIgKyBoZWlnaHQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZSkge1xuXHRcdFx0aGVpZ2h0ID0gTWF0aC5jZWlsKGZvbnRTaXplICogMS4xKTtcblx0XHR9XG5cblx0XHRoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGZvbnRTaXplKTtcblxuXHRcdGZvbnRIZWlnaHRJblBpeGVsc1tlbnRyeV0gPSBoZWlnaHQ7XG5cdH1cblxuXHRyZXR1cm4gaGVpZ2h0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZURhc2hBcnJheShsaW5lRGFzaFR5cGUsIGxpbmVUaGlja25lc3MpIHtcblx0bGluZURhc2hUeXBlID0gbGluZURhc2hUeXBlIHx8IFwic29saWRcIjtcblxuXHR2YXIgbGluZURhc2hBcnJheSA9IFtdO1xuXG5cdHZhciBsaW5lRGFzaFR5cGVNYXAgPSB7XG5cdFx0XCJzb2xpZFwiOiBbXSxcblx0XHRcInNob3J0RGFzaFwiOiBbMywgMV0sXG5cdFx0XCJzaG9ydERvdFwiOiBbMSwgMV0sXG5cdFx0XCJzaG9ydERhc2hEb3RcIjogWzMsIDEsIDEsIDFdLFxuXHRcdFwic2hvcnREYXNoRG90RG90XCI6IFszLCAxLCAxLCAxLCAxLCAxXSxcblx0XHRcImRvdFwiOiBbMSwgMl0sXG5cdFx0XCJkYXNoXCI6IFs0LCAyXSxcblx0XHRcImRhc2hEb3RcIjogWzQsIDIsIDEsIDJdLFxuXHRcdFwibG9uZ0Rhc2hcIjogWzgsIDJdLFxuXHRcdFwibG9uZ0Rhc2hEb3RcIjogWzgsIDIsIDEsIDJdLFxuXHRcdFwibG9uZ0Rhc2hEb3REb3RcIjogWzgsIDIsIDEsIDIsIDEsIDJdXG5cdH07XG5cblx0bGluZURhc2hBcnJheSA9IGxpbmVEYXNoVHlwZU1hcFtsaW5lRGFzaFR5cGVdO1xuXG5cdGlmIChsaW5lRGFzaEFycmF5KSB7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVEYXNoQXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxpbmVEYXNoQXJyYXlbaV0gKj0gbGluZVRoaWNrbmVzcztcblx0XHR9XG5cdH0gZWxzZVxuXHRcdGxpbmVEYXNoQXJyYXkgPSBbXTtcblxuXHRyZXR1cm4gbGluZURhc2hBcnJheTtcbn1cblxuLy91c2VyQ2FwdHVyZSBpcyBvcHRpb25hbC4gRGVmYXVsdHMgdG8gZmFsc2VcbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudChvYmosIGV2ZW50VHlwZSwgZm4sIHVzZUNhcHR1cmUpIHtcblx0aWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7XG5cdFx0b2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBmbiwgdXNlQ2FwdHVyZSB8fCBmYWxzZSk7XG5cdH1cblx0ZWxzZSBpZiAob2JqLmF0dGFjaEV2ZW50KSB7XG5cdFx0b2JqLmF0dGFjaEV2ZW50KFwib25cIiArIGV2ZW50VHlwZSwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcblx0XHRcdGUucHJldmVudERlZmF1bHQgPSBlLnByZXZlbnREZWZhdWx0IHx8IGZ1bmN0aW9uICgpIHsgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOyB9O1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24gPSBlLnN0b3BQcm9wYWdhdGlvbiB8fCBmdW5jdGlvbiAoKSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfTtcblx0XHRcdGZuLmNhbGwob2JqLCBlKTtcblx0XHR9KTtcblx0fSBlbHNlXG5cdFx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyNyZWdpb24gZm9ybWF0dGluZyBmdW5jdGlvbnMvbWV0aG9kc1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVGb3JtYXQoKSB7XG5cblx0dmFyIHJlZyA9IC9EezEsNH18TXsxLDR9fFl7MSw0fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18ZnsxLDN9fHR7MSwyfXxUezEsMn18S3x6ezEsM318XCJbXlwiXSpcInwnW14nXSonL2c7XG5cblx0dmFyIGRlZkRheXMgPSBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXTtcblx0dmFyIGRlZlNob3J0RGF5cyA9IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXTtcblxuXHR2YXIgZGVmTW9udGhzID0gW1wiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIl07XG5cdHZhciBkZWZTaG9ydE1vbnRocyA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcblxuXHR2YXIgdGltZXpvbmUgPSAvXFxiKD86W1BNQ0VBXVtTRFBdVHwoPzpQYWNpZmljfE1vdW50YWlufENlbnRyYWx8RWFzdGVybnxBdGxhbnRpYykgKD86U3RhbmRhcmR8RGF5bGlnaHR8UHJldmFpbGluZykgVGltZXwoPzpHTVR8VVRDKSg/OlstK11cXGR7NH0pPylcXGIvZztcblx0dmFyIHRpbWV6b25lQ2xpcCA9IC9bXi0rXFxkQS1aXS9nO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoZHQsIGZvcm1hdFN0cmluZywgY3VsdHVyZUluZm8pIHtcblxuXHRcdHZhciBkYXlzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5kYXlzIDogZGVmRGF5cztcblx0XHR2YXIgbW9udGhzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5tb250aHMgOiBkZWZNb250aHM7XG5cblx0XHR2YXIgc2hvcnREYXlzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5zaG9ydERheXMgOiBkZWZTaG9ydERheXM7XG5cdFx0dmFyIHNob3J0TW9udGhzID0gY3VsdHVyZUluZm8gPyBjdWx0dXJlSW5mby5zaG9ydE1vbnRocyA6IGRlZlNob3J0TW9udGhzO1xuXG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0dmFyIHV0YyA9IGZhbHNlO1xuXG5cdFx0ZHQgPSBkdCAmJiBkdC5nZXRUaW1lID8gZHQgOiBkdCA/IG5ldyBEYXRlKGR0KSA6IG5ldyBEYXRlO1xuXHRcdGlmIChpc05hTihkdCkpIHRocm93IFN5bnRheEVycm9yKFwiaW52YWxpZCBkYXRlXCIpO1xuXG5cdFx0aWYgKGZvcm1hdFN0cmluZy5zbGljZSgwLCA0KSA9PT0gXCJVVEM6XCIpIHtcblx0XHRcdGZvcm1hdFN0cmluZyA9IGZvcm1hdFN0cmluZy5zbGljZSg0KTtcblx0XHRcdHV0YyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIHByZSA9IHV0YyA/IFwiZ2V0VVRDXCIgOiBcImdldFwiO1xuXHRcdHZhciBkYXRlID0gZHRbcHJlICsgXCJEYXRlXCJdKCk7XG5cdFx0dmFyIGRheSA9IGR0W3ByZSArIFwiRGF5XCJdKCk7XG5cdFx0dmFyIG1vbnRoID0gZHRbcHJlICsgXCJNb250aFwiXSgpO1xuXHRcdHZhciB5ZWFyID0gZHRbcHJlICsgXCJGdWxsWWVhclwiXSgpO1xuXHRcdHZhciBob3VycyA9IGR0W3ByZSArIFwiSG91cnNcIl0oKTtcblx0XHR2YXIgbWludXRlcyA9IGR0W3ByZSArIFwiTWludXRlc1wiXSgpO1xuXHRcdHZhciBzZWNvbmRzID0gZHRbcHJlICsgXCJTZWNvbmRzXCJdKCk7XG5cdFx0dmFyIG1pbGxpc2Vjb25kcyA9IGR0W3ByZSArIFwiTWlsbGlzZWNvbmRzXCJdKCk7XG5cdFx0dmFyIG9mZnNldCA9IHV0YyA/IDAgOiBkdC5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG5cdFx0cmVzdWx0ID0gZm9ybWF0U3RyaW5nLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAoa2V5KSB7XG5cblx0XHRcdHN3aXRjaCAoa2V5KSB7XG5cblx0XHRcdFx0Y2FzZSBcIkRcIjpcblx0XHRcdFx0XHRyZXR1cm4gZGF0ZTtcblx0XHRcdFx0Y2FzZSBcIkREXCI6XG5cdFx0XHRcdFx0cmV0dXJuIHBhZChkYXRlLCAyKTtcblx0XHRcdFx0Y2FzZSBcIkRERFwiOlxuXHRcdFx0XHRcdHJldHVybiBzaG9ydERheXNbZGF5XTtcblx0XHRcdFx0Y2FzZSBcIkRERERcIjpcblx0XHRcdFx0XHRyZXR1cm4gZGF5c1tkYXldO1xuXG5cblx0XHRcdFx0Y2FzZSBcIk1cIjpcblx0XHRcdFx0XHRyZXR1cm4gbW9udGggKyAxO1xuXHRcdFx0XHRjYXNlIFwiTU1cIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKG1vbnRoICsgMSwgMik7XG5cdFx0XHRcdGNhc2UgXCJNTU1cIjpcblx0XHRcdFx0XHRyZXR1cm4gc2hvcnRNb250aHNbbW9udGhdO1xuXHRcdFx0XHRjYXNlIFwiTU1NTVwiOlxuXHRcdFx0XHRcdHJldHVybiBtb250aHNbbW9udGhdO1xuXG5cblx0XHRcdFx0Y2FzZSBcIllcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoU3RyaW5nKHllYXIpLnNsaWNlKC0yKSk7XG5cdFx0XHRcdGNhc2UgXCJZWVwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoU3RyaW5nKHllYXIpLnNsaWNlKC0yKSwgMik7XG5cdFx0XHRcdGNhc2UgXCJZWVlcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKFN0cmluZyh5ZWFyKS5zbGljZSgtMyksIDMpO1xuXHRcdFx0XHRjYXNlIFwiWVlZWVwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoeWVhciwgNCk7XG5cblxuXHRcdFx0XHRjYXNlIFwiaFwiOlxuXHRcdFx0XHRcdHJldHVybiBob3VycyAlIDEyIHx8IDEyO1xuXHRcdFx0XHRjYXNlIFwiaGhcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKGhvdXJzICUgMTIgfHwgMTIsIDIpO1xuXG5cblx0XHRcdFx0Y2FzZSBcIkhcIjpcblx0XHRcdFx0XHRyZXR1cm4gaG91cnM7XG5cdFx0XHRcdGNhc2UgXCJISFwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoaG91cnMsIDIpO1xuXG5cdFx0XHRcdGNhc2UgXCJtXCI6XG5cdFx0XHRcdFx0cmV0dXJuIG1pbnV0ZXM7XG5cdFx0XHRcdGNhc2UgXCJtbVwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQobWludXRlcywgMik7XG5cblxuXHRcdFx0XHRjYXNlIFwic1wiOlxuXHRcdFx0XHRcdHJldHVybiBzZWNvbmRzO1xuXHRcdFx0XHRjYXNlIFwic3NcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKHNlY29uZHMsIDIpO1xuXG5cdFx0XHRcdGNhc2UgXCJmXCI6XG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhtaWxsaXNlY29uZHMpLnNsaWNlKDAsIDEpO1xuXHRcdFx0XHRjYXNlIFwiZmZcIjpcblx0XHRcdFx0XHRyZXR1cm4gcGFkKFN0cmluZyhtaWxsaXNlY29uZHMpLnNsaWNlKDAsIDIpLCAyKTtcblx0XHRcdFx0Y2FzZSBcImZmZlwiOlxuXHRcdFx0XHRcdHJldHVybiBwYWQoU3RyaW5nKG1pbGxpc2Vjb25kcykuc2xpY2UoMCwgMyksIDMpO1xuXG5cblx0XHRcdFx0Y2FzZSBcInRcIjpcblx0XHRcdFx0XHRyZXR1cm4gaG91cnMgPCAxMiA/IFwiYVwiIDogXCJwXCI7XG5cdFx0XHRcdGNhc2UgXCJ0dFwiOlxuXHRcdFx0XHRcdHJldHVybiBob3VycyA8IDEyID8gXCJhbVwiIDogXCJwbVwiO1xuXHRcdFx0XHRjYXNlIFwiVFwiOlxuXHRcdFx0XHRcdHJldHVybiBob3VycyA8IDEyID8gXCJBXCIgOiBcIlBcIjtcblx0XHRcdFx0Y2FzZSBcIlRUXCI6XG5cdFx0XHRcdFx0cmV0dXJuIGhvdXJzIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCI7XG5cblxuXHRcdFx0XHRjYXNlIFwiS1wiOlxuXHRcdFx0XHRcdHJldHVybiB1dGMgPyBcIlVUQ1wiIDogKFN0cmluZyhkdCkubWF0Y2godGltZXpvbmUpIHx8IFtcIlwiXSkucG9wKCkucmVwbGFjZSh0aW1lem9uZUNsaXAsIFwiXCIpOyAvLyBUaW1lIFpvbmU7XG5cdFx0XHRcdGNhc2UgXCJ6XCI6XG5cdFx0XHRcdFx0cmV0dXJuIChvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIikgKyBNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCk7IC8vIEhvdXIgT2Zmc2V0IGZyb20gVVRDIHdpdGhvdXQgcGFkZGluZ1xuXHRcdFx0XHRjYXNlIFwienpcIjpcblx0XHRcdFx0XHRyZXR1cm4gKG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiKSArIHBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCksIDIpOyAvLyBIb3VyIE9mZnNldCBmcm9tIFVUQyB3aXRoIHBhZGRpbmdcblx0XHRcdFx0Y2FzZSBcInp6elwiOlxuXHRcdFx0XHRcdHJldHVybiAob2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCIpICsgcGFkKE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKSwgMikgKyBwYWQoTWF0aC5hYnMob2Zmc2V0KSAlIDYwLCAyKTsgLy8gSG91ciBhbmQgTWludXRlIE9mZnNldCBmcm9tIFVUQyB3aXRoIHBhZGRpbmdcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJldHVybiBrZXkuc2xpY2UoMSwga2V5Lmxlbmd0aCAtIDEpO1xuXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZvcm1hdCh2LCBmcywgY3VsdHVyZUluZm8pIHtcblx0aWYgKHYgPT09IG51bGwpXG5cdFx0cmV0dXJuIFwiXCI7XG5cblx0diA9IE51bWJlcih2KTtcblx0dmFyIGlzTmVnYXRpdmUgPSB2IDwgMCA/IHRydWUgOiBmYWxzZTtcblx0aWYgKGlzTmVnYXRpdmUpIHYgKj0gLTE7XG5cblx0dmFyIGRlY2ltYWxTZXBhcmF0b3IgPSBjdWx0dXJlSW5mbyA/IGN1bHR1cmVJbmZvLmRlY2ltYWxTZXBhcmF0b3IgOiBcIi5cIjtcblx0dmFyIGRpZ2l0R3JvdXBTZXBhcmF0b3IgPSBjdWx0dXJlSW5mbyA/IGN1bHR1cmVJbmZvLmRpZ2l0R3JvdXBTZXBhcmF0b3IgOiBcIixcIjtcblxuXHR2YXIgdlN0cmluZyA9IFwiXCI7XG5cdGZzID0gU3RyaW5nKGZzKTtcblx0dmFyIG11bHRpcGxpZXIgPSAxO1xuXHR2YXIgdGVtcDtcblx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cblx0dmFyIG1hdGNoZXMgPSBcIlwiO1xuXHR2YXIgZGVjaW1hbFBvc2l0aW9uID0gLTE7XG5cdHZhciBmc0JlZm9yZURlY2ltYWwgPSBbXTtcblx0dmFyIGZzQWZ0ZXJEZWNpbWFsID0gW107XG5cdHZhciBub1BoQmVmb3JlRGVjaW1hbCA9IDA7IC8vIE51bWJlciBvZiBQbGFjZWhvbGRlcnMgYmVmb3JlIERlY2ltYWxcblx0dmFyIG5vUGhBZnRlckRlY2ltYWwgPSAwOyAvLyBOdW1iZXIgb2YgUGxhY2Vob2xkZXJzIGFmdGVyIERlY2ltYWxcblx0dmFyIG5vQ29tbWEgPSAwO1xuXHR2YXIgaXNTY2llbnRpZmljTm90YXRpb24gPSBmYWxzZTtcblx0dmFyIGV4cG9uZW50ID0gMDtcblxuXHRtYXRjaGVzID0gZnMubWF0Y2goL1wiW15cIl0qXCJ8J1teJ10qJ3xbZUVdWystXSpbMF0rfFssXStbLl184oCwfC4vZyk7XG5cdC8vd2luZG93LmNvbnNvbGUubG9nKG1hdGNoZXMgKyBcIiA9IFwiICsgbWF0Y2hlcy5sZW5ndGgpO1xuXHR2YXIgbWF0Y2ggPSBudWxsO1xuXG5cdGZvciAodmFyIGkgPSAwOyBtYXRjaGVzICYmIGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0bWF0Y2ggPSBtYXRjaGVzW2ldO1xuXG5cdFx0aWYgKG1hdGNoID09PSBcIi5cIiAmJiBkZWNpbWFsUG9zaXRpb24gPCAwKSB7XG5cdFx0XHRkZWNpbWFsUG9zaXRpb24gPSBpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmIChtYXRjaCA9PT0gXCIlXCIpIHtcblx0XHRcdG11bHRpcGxpZXIgKj0gMTAwO1xuXHRcdH0gZWxzZSBpZiAobWF0Y2ggPT09IFwi4oCwXCIpIHtcblx0XHRcdG11bHRpcGxpZXIgKj0gMTAwMDtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0gZWxzZSBpZiAobWF0Y2hbMF0gPT09IFwiLFwiICYmIG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09PSBcIi5cIikge1xuXHRcdFx0bXVsdGlwbGllciAvPSBNYXRoLnBvdygxMDAwLCBtYXRjaC5sZW5ndGggLSAxKTtcblx0XHRcdGRlY2ltYWxQb3NpdGlvbiA9IGkgKyBtYXRjaC5sZW5ndGggLSAxO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmICgobWF0Y2hbMF0gPT09IFwiRVwiIHx8IG1hdGNoWzBdID09PSBcImVcIikgJiYgbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0gPT09IFwiMFwiKSB7XG5cdFx0XHRpc1NjaWVudGlmaWNOb3RhdGlvbiA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGRlY2ltYWxQb3NpdGlvbiA8IDApIHtcblx0XHRcdGZzQmVmb3JlRGVjaW1hbC5wdXNoKG1hdGNoKTtcblx0XHRcdGlmIChtYXRjaCA9PT0gXCIjXCIgfHwgbWF0Y2ggPT09IFwiMFwiKVxuXHRcdFx0XHRub1BoQmVmb3JlRGVjaW1hbCsrO1xuXHRcdFx0ZWxzZSBpZiAobWF0Y2ggPT09IFwiLFwiKVxuXHRcdFx0XHRub0NvbW1hKys7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZnNBZnRlckRlY2ltYWwucHVzaChtYXRjaCk7XG5cdFx0XHRpZiAobWF0Y2ggPT09IFwiI1wiIHx8IG1hdGNoID09PSBcIjBcIilcblx0XHRcdFx0bm9QaEFmdGVyRGVjaW1hbCsrO1xuXHRcdH1cblx0fVxuXG5cdGlmIChpc1NjaWVudGlmaWNOb3RhdGlvbikge1xuXHRcdHZhciBpbnRlZ2VyID0gTWF0aC5mbG9vcih2KTtcblx0XHRleHBvbmVudCA9IChpbnRlZ2VyID09PSAwID8gXCJcIiA6IFN0cmluZyhpbnRlZ2VyKSkubGVuZ3RoIC0gbm9QaEJlZm9yZURlY2ltYWw7XG5cdFx0bXVsdGlwbGllciAvPSBNYXRoLnBvdygxMCwgZXhwb25lbnQpO1xuXHR9XG5cblx0diAqPSBtdWx0aXBsaWVyO1xuXG5cdGlmIChkZWNpbWFsUG9zaXRpb24gPCAwKVxuXHRcdGRlY2ltYWxQb3NpdGlvbiA9IGk7XG5cblx0dlN0cmluZyA9IHYudG9GaXhlZChub1BoQWZ0ZXJEZWNpbWFsKTtcblx0dmFyIHNwbGl0ID0gdlN0cmluZy5zcGxpdChcIi5cIik7XG5cdC8vd2luZG93LmNvbnNvbGUubG9nKHNwbGl0KTtcblx0dmFyIHZTdHJpbmdCZWZvcmVEZWNpbWFsID0gKHNwbGl0WzBdICsgXCJcIikuc3BsaXQoXCJcIik7XG5cdHZhciB2U3RyaW5nQWZ0ZXJEZWNpbWFsID0gKHNwbGl0WzFdICsgXCJcIikuc3BsaXQoXCJcIik7XG5cblx0aWYgKHZTdHJpbmdCZWZvcmVEZWNpbWFsICYmIHZTdHJpbmdCZWZvcmVEZWNpbWFsWzBdID09PSBcIjBcIilcblx0XHR2U3RyaW5nQmVmb3JlRGVjaW1hbC5zaGlmdCgpO1xuXG5cdC8vd2luZG93LmNvbnNvbGUubG9nKGZzQmVmb3JlRGVjaW1hbCArIFwiPC0tLS0tLS0tLS0+XCIgKyBmc0FmdGVyRGVjaW1hbCArIFwiICYgICAgICAgIFwiICsgdlN0cmluZ0JlZm9yZURlY2ltYWwgKyBcIjwtLS0tLS0tLS0tPlwiICsgdlN0cmluZ0FmdGVyRGVjaW1hbCk7XG5cblx0dmFyIG5vUGhQcm9jZXNzZWQgPSAwO1xuXHR2YXIgbm9EaWdpdHNBZGRlZCA9IDA7XG5cdHZhciBub0NvbW1hQWRkZWQgPSAwO1xuXHR2YXIgY29tbWFEaXN0YW5jZSA9IDA7XG5cdHZhciBkaXN0YW5jZUZyb21MYXN0Q29tbWEgPSAwO1xuXG5cdHdoaWxlIChmc0JlZm9yZURlY2ltYWwubGVuZ3RoID4gMCkge1xuXHRcdG1hdGNoID0gZnNCZWZvcmVEZWNpbWFsLnBvcCgpO1xuXG5cdFx0aWYgKG1hdGNoID09PSBcIiNcIiB8fCBtYXRjaCA9PT0gXCIwXCIpIHtcblx0XHRcdG5vUGhQcm9jZXNzZWQrKztcblxuXHRcdFx0aWYgKG5vUGhQcm9jZXNzZWQgPT09IG5vUGhCZWZvcmVEZWNpbWFsKSB7XG5cdFx0XHRcdHZhciBkaWdpdHMgPSB2U3RyaW5nQmVmb3JlRGVjaW1hbDtcblx0XHRcdFx0dlN0cmluZ0JlZm9yZURlY2ltYWwgPSBbXTtcblxuXHRcdFx0XHRpZiAobWF0Y2ggPT09IFwiMFwiKSB7XG5cdFx0XHRcdFx0Ly92YXIgdG90YWxEaWdpdHMgPSByZXN1bHQubWF0Y2goL1swLTldL2cpLmxlbmd0aDtcblx0XHRcdFx0XHR2YXIgdG9QYWQgPSBub1BoQmVmb3JlRGVjaW1hbCAtIG5vRGlnaXRzQWRkZWQgLSAoZGlnaXRzID8gZGlnaXRzLmxlbmd0aCA6IDApO1xuXG5cdFx0XHRcdFx0d2hpbGUgKHRvUGFkID4gMCkge1xuXHRcdFx0XHRcdFx0ZGlnaXRzLnVuc2hpZnQoXCIwXCIpO1xuXHRcdFx0XHRcdFx0dG9QYWQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3aGlsZSAoZGlnaXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBkaWdpdHMucG9wKCkgKyByZXN1bHQ7XG5cdFx0XHRcdFx0ZGlzdGFuY2VGcm9tTGFzdENvbW1hKys7XG5cblx0XHRcdFx0XHRpZiAoZGlzdGFuY2VGcm9tTGFzdENvbW1hICUgY29tbWFEaXN0YW5jZSA9PT0gMCAmJiBub0NvbW1hQWRkZWQgPT09IG5vQ29tbWEgJiYgZGlnaXRzLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBkaWdpdEdyb3VwU2VwYXJhdG9yICsgcmVzdWx0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzTmVnYXRpdmUpXG5cdFx0XHRcdFx0cmVzdWx0ID0gXCItXCIgKyByZXN1bHQ7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh2U3RyaW5nQmVmb3JlRGVjaW1hbC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gdlN0cmluZ0JlZm9yZURlY2ltYWwucG9wKCkgKyByZXN1bHQ7XG5cdFx0XHRcdFx0bm9EaWdpdHNBZGRlZCsrO1xuXHRcdFx0XHRcdGRpc3RhbmNlRnJvbUxhc3RDb21tYSsrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKG1hdGNoID09PSBcIjBcIikge1xuXHRcdFx0XHRcdHJlc3VsdCA9IFwiMFwiICsgcmVzdWx0O1xuXHRcdFx0XHRcdG5vRGlnaXRzQWRkZWQrKztcblx0XHRcdFx0XHRkaXN0YW5jZUZyb21MYXN0Q29tbWErKztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkaXN0YW5jZUZyb21MYXN0Q29tbWEgJSBjb21tYURpc3RhbmNlID09PSAwICYmIG5vQ29tbWFBZGRlZCA9PT0gbm9Db21tYSAmJiB2U3RyaW5nQmVmb3JlRGVjaW1hbC5sZW5ndGggPiAwKVxuXHRcdFx0XHRcdHJlc3VsdCA9IGRpZ2l0R3JvdXBTZXBhcmF0b3IgKyByZXN1bHQ7XG5cdFx0XHR9XG5cblxuXHRcdH0gZWxzZSBpZiAoKG1hdGNoWzBdID09PSBcIkVcIiB8fCBtYXRjaFswXSA9PT0gXCJlXCIpICYmIG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09PSBcIjBcIiAmJiAvW2VFXVsrLV0qWzBdKy8udGVzdChtYXRjaCkpIHtcblx0XHRcdGlmIChleHBvbmVudCA8IDApXG5cdFx0XHRcdG1hdGNoID0gbWF0Y2gucmVwbGFjZShcIitcIiwgXCJcIikucmVwbGFjZShcIi1cIiwgXCJcIik7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG1hdGNoID0gbWF0Y2gucmVwbGFjZShcIi1cIiwgXCJcIik7XG5cblx0XHRcdHJlc3VsdCArPSBtYXRjaC5yZXBsYWNlKC9bMF0rLywgZnVuY3Rpb24gKCQwKSB7XG5cdFx0XHRcdHJldHVybiBwYWQoZXhwb25lbnQsICQwLmxlbmd0aCk7XG5cdFx0XHR9KTtcblxuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChtYXRjaCA9PT0gXCIsXCIpIHtcblx0XHRcdFx0bm9Db21tYUFkZGVkKys7XG5cdFx0XHRcdGNvbW1hRGlzdGFuY2UgPSBkaXN0YW5jZUZyb21MYXN0Q29tbWE7XG5cdFx0XHRcdGRpc3RhbmNlRnJvbUxhc3RDb21tYSA9IDA7XG5cblx0XHRcdFx0aWYgKHZTdHJpbmdCZWZvcmVEZWNpbWFsLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0cmVzdWx0ID0gZGlnaXRHcm91cFNlcGFyYXRvciArIHJlc3VsdDtcblx0XHRcdH0gZWxzZSBpZiAobWF0Y2gubGVuZ3RoID4gMSAmJiAoKG1hdGNoWzBdID09PSBcIlxcXCJcIiAmJiBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gXCJcXFwiXCIpIHx8IChtYXRjaFswXSA9PT0gXCInXCIgJiYgbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0gPT09IFwiJ1wiKSkpIHtcblx0XHRcdFx0cmVzdWx0ID0gbWF0Y2guc2xpY2UoMSwgbWF0Y2gubGVuZ3RoIC0gMSkgKyByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJlc3VsdCA9IG1hdGNoICsgcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdHZhciBjaGFyQ291bnQgPSAwO1xuXHR2YXIgcmVzdWx0QWZ0ZXJEZWNpbWFsID0gXCJcIjtcblx0dmFyIGFkZERlY2ltYWxTZXBhcmF0b3IgPSBmYWxzZTtcblxuXHR3aGlsZSAoZnNBZnRlckRlY2ltYWwubGVuZ3RoID4gMCkge1xuXHRcdG1hdGNoID0gZnNBZnRlckRlY2ltYWwuc2hpZnQoKTtcblxuXHRcdGlmIChtYXRjaCA9PT0gXCIjXCIgfHwgbWF0Y2ggPT09IFwiMFwiKSB7XG5cdFx0XHRpZiAodlN0cmluZ0FmdGVyRGVjaW1hbC5sZW5ndGggPiAwICYmIE51bWJlcih2U3RyaW5nQWZ0ZXJEZWNpbWFsLmpvaW4oXCJcIikpICE9PSAwKSB7XG5cdFx0XHRcdHJlc3VsdEFmdGVyRGVjaW1hbCArPSB2U3RyaW5nQWZ0ZXJEZWNpbWFsLnNoaWZ0KCk7XG5cdFx0XHRcdGFkZERlY2ltYWxTZXBhcmF0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAobWF0Y2ggPT09IFwiMFwiKSB7XG5cdFx0XHRcdHJlc3VsdEFmdGVyRGVjaW1hbCArPSBcIjBcIjtcblx0XHRcdFx0YWRkRGVjaW1hbFNlcGFyYXRvciA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChtYXRjaC5sZW5ndGggPiAxICYmICgobWF0Y2hbMF0gPT09IFwiXFxcIlwiICYmIG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09PSBcIlxcXCJcIikgfHwgKG1hdGNoWzBdID09PSBcIidcIiAmJiBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gXCInXCIpKSkge1xuXHRcdFx0cmVzdWx0QWZ0ZXJEZWNpbWFsICs9IG1hdGNoLnNsaWNlKDEsIG1hdGNoLmxlbmd0aCAtIDEpO1xuXHRcdFx0Ly9hZGREZWNpbWFsU2VwYXJhdG9yID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKChtYXRjaFswXSA9PT0gXCJFXCIgfHwgbWF0Y2hbMF0gPT09IFwiZVwiKSAmJiBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gXCIwXCIgJiYgL1tlRV1bKy1dKlswXSsvLnRlc3QobWF0Y2gpKSB7XG5cdFx0XHRpZiAoZXhwb25lbnQgPCAwKVxuXHRcdFx0XHRtYXRjaCA9IG1hdGNoLnJlcGxhY2UoXCIrXCIsIFwiXCIpLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRtYXRjaCA9IG1hdGNoLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xuXHRcdFx0cmVzdWx0QWZ0ZXJEZWNpbWFsICs9IG1hdGNoLnJlcGxhY2UoL1swXSsvLCBmdW5jdGlvbiAoJDApIHtcblx0XHRcdFx0cmV0dXJuIHBhZChleHBvbmVudCwgJDAubGVuZ3RoKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRBZnRlckRlY2ltYWwgKz0gbWF0Y2g7XG5cdFx0XHQvL2FkZERlY2ltYWxTZXBhcmF0b3IgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJlc3VsdCArPSAoYWRkRGVjaW1hbFNlcGFyYXRvciA/IGRlY2ltYWxTZXBhcmF0b3IgOiBcIlwiKSArIHJlc3VsdEFmdGVyRGVjaW1hbDtcblx0Ly93aW5kb3cuY29uc29sZS5sb2cocmVzdWx0KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vI2VuZHJlZ2lvbiBmb3JtYXR0aW5nIGZ1bmN0aW9ucy9tZXRob2RzXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RJZCh4LCB5LCBjdHgpIHtcblx0eCAqPSBkZXZpY2VQaXhlbEJhY2tpbmdTdG9yZVJhdGlvO1xuXHR5ICo9IGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW87XG5cdHZhciBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKHgsIHksIDIsIDIpLmRhdGE7XG5cdHZhciBpc09iamVjdCA9IHRydWU7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblxuXHRcdGlmIChwaXhlbHNbaV0gIT09IHBpeGVsc1tpICsgNF0gfCBwaXhlbHNbaV0gIT09IHBpeGVsc1tpICsgOF0gfCBwaXhlbHNbaV0gIT09IHBpeGVsc1tpICsgMTJdKSB7XG5cdFx0XHRpc09iamVjdCA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGlzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIFJHQlRvSW50KHBpeGVsc1swXSwgcGl4ZWxzWzFdLCBwaXhlbHNbMl0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Ly93aW5kb3cuY29uc29sZS5sb2cocGl4ZWxzKTtcbn1cblxuLy9leHRyYWN0cyBtb3VzZSBjb29yZGluYXRlcyBmcm9tIHRoZSBldmVudCBwYXJhbWV0ZXJzXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW91c2VDb29yZGluYXRlcyhldikge1xuXHR2YXIgeCA9IDA7XG5cdHZhciB5ID0gMDtcblxuXHRldiA9IGV2IHx8IHdpbmRvdy5ldmVudDtcblxuXHRpZiAoZXYub2Zmc2V0WCB8fCBldi5vZmZzZXRYID09PSAwKSB7XG5cdFx0eCA9IGV2Lm9mZnNldFg7XG5cdFx0eSA9IGV2Lm9mZnNldFk7XG5cdH0gZWxzZSBpZiAoZXYubGF5ZXJYIHx8IGV2LmxheWVyWCA9PSAwKSB7IC8vIEZpcmVmb3hcblx0XHR4ID0gZXYubGF5ZXJYO1xuXHRcdHkgPSBldi5sYXllclk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0eCA9IGV2LnBhZ2VYIC0gZXYudGFyZ2V0Lm9mZnNldExlZnQ7XG5cdFx0eSA9IGV2LnBhZ2VZIC0gZXYudGFyZ2V0Lm9mZnNldFRvcDtcblx0fVxuXG5cdHJldHVybiB7IHg6IHgsIHk6IHkgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250U3RyaW5nKHByZWZpeCwgb2JqZWN0LCBmYWxsYmFja09iamVjdCkge1xuXHR2YXIgZm9udFN0cmluZyA9IFwiXCI7XG5cblx0dmFyIGZvbnRTdHlsZVN0cmluZyA9IHByZWZpeCA/IHByZWZpeCArIFwiRm9udFN0eWxlXCIgOiBcImZvbnRTdHlsZVwiO1xuXHR2YXIgZm9udFdlaWdodFN0cmluZyA9IHByZWZpeCA/IHByZWZpeCArIFwiRm9udFdlaWdodFwiIDogXCJmb250V2VpZ2h0XCI7XG5cdHZhciBmb250U2l6ZVN0cmluZyA9IHByZWZpeCA/IHByZWZpeCArIFwiRm9udFNpemVcIiA6IFwiZm9udFNpemVcIjtcblx0dmFyIGZvbnRGYW1pbHlTdHJpbmcgPSBwcmVmaXggPyBwcmVmaXggKyBcIkZvbnRGYW1pbHlcIiA6IFwiZm9udEZhbWlseVwiO1xuXG5cblxuXHRmb250U3RyaW5nICs9IG9iamVjdFtmb250U3R5bGVTdHJpbmddID8gb2JqZWN0W2ZvbnRTdHlsZVN0cmluZ10gKyBcIiBcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250U3R5bGVTdHJpbmddKSA/IChmYWxsYmFja09iamVjdFtmb250U3R5bGVTdHJpbmddICsgXCIgXCIpIDogXCJcIjtcblx0Zm9udFN0cmluZyArPSBvYmplY3RbZm9udFdlaWdodFN0cmluZ10gPyBvYmplY3RbZm9udFdlaWdodFN0cmluZ10gKyBcIiBcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250V2VpZ2h0U3RyaW5nXSkgPyAoZmFsbGJhY2tPYmplY3RbZm9udFdlaWdodFN0cmluZ10gKyBcIiBcIikgOiBcIlwiO1xuXHRmb250U3RyaW5nICs9IG9iamVjdFtmb250U2l6ZVN0cmluZ10gPyBvYmplY3RbZm9udFNpemVTdHJpbmddICsgXCJweCBcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250U2l6ZVN0cmluZ10pID8gKGZhbGxiYWNrT2JqZWN0W2ZvbnRTaXplU3RyaW5nXSArIFwicHggXCIpIDogXCJcIjtcblxuXG5cdHZhciBmb250RmFtaWx5ID0gb2JqZWN0W2ZvbnRGYW1pbHlTdHJpbmddID8gb2JqZWN0W2ZvbnRGYW1pbHlTdHJpbmddICsgXCJcIiA6IChmYWxsYmFja09iamVjdCAmJiBmYWxsYmFja09iamVjdFtmb250RmFtaWx5U3RyaW5nXSkgPyAoZmFsbGJhY2tPYmplY3RbZm9udEZhbWlseVN0cmluZ10gKyBcIlwiKSA6IFwiXCI7XG5cblx0aWYgKCFpc0NhbnZhc1N1cHBvcnRlZCAmJiBmb250RmFtaWx5KSB7XG5cdFx0dmFyIGZpcnN0Rm9udEZhbWlseSA9IGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdO1xuXG5cdFx0aWYgKGZpcnN0Rm9udEZhbWlseVswXSAhPT0gXCInXCIgJiYgZmlyc3RGb250RmFtaWx5WzBdICE9PSBcIlxcXCJcIilcblx0XHRcdGZpcnN0Rm9udEZhbWlseSA9IFwiJ1wiICsgZmlyc3RGb250RmFtaWx5ICsgXCInXCI7XG5cblx0XHRmb250U3RyaW5nICs9IGZpcnN0Rm9udEZhbWlseTtcblx0fSBlbHNlXG5cdFx0Zm9udFN0cmluZyArPSBmb250RmFtaWx5O1xuXG5cdHJldHVybiBmb250U3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBvYmplY3QsIGZhbGxiYWNrT2JqZWN0KSB7XG5cblx0dmFyIHZhbHVlID0gcHJvcGVydHlOYW1lIGluIG9iamVjdCA/IG9iamVjdFtwcm9wZXJ0eU5hbWVdIDogZmFsbGJhY2tPYmplY3RbcHJvcGVydHlOYW1lXTtcblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbnZhciBvcHRpbWl6ZUZvckhpRFBJID0gdHJ1ZTtcbi8vb3B0aW1pemVGb3JIaURQSSA9IGZhbHNlO1xuXG52YXIgZGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG52YXIgYmFja2luZ1N0b3JlUmF0aW8gPSAxO1xudmFyIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8gPSBvcHRpbWl6ZUZvckhpRFBJID8gZGV2aWNlUGl4ZWxSYXRpbyAvIGJhY2tpbmdTdG9yZVJhdGlvIDogMTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldENhbnZhc1NpemUoY2FudmFzLCB3aWR0aCwgaGVpZ2h0KSB7XG5cblx0aWYgKGlzQ2FudmFzU3VwcG9ydGVkICYmICEhb3B0aW1pemVGb3JIaURQSSkge1xuXHRcdHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdGJhY2tpbmdTdG9yZVJhdGlvID0gY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRcdFx0XHRcdFx0Y3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRcdFx0XHRcdFx0Y3R4Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuXHRcdFx0XHRcdFx0XHRjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRcdFx0XHRcdFx0Y3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMTtcblxuXG5cdFx0ZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbyA9IGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcblxuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbztcblx0XHRjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogZGV2aWNlUGl4ZWxCYWNraW5nU3RvcmVSYXRpbztcblxuXHRcdGlmIChkZXZpY2VQaXhlbFJhdGlvICE9PSBiYWNraW5nU3RvcmVSYXRpbykge1xuXG5cdFx0XHRjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcblxuXHRcdFx0Y3R4LnNjYWxlKGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8sIGRldmljZVBpeGVsQmFja2luZ1N0b3JlUmF0aW8pO1xuXG5cdFx0fVxuXG5cdFx0Ly93aW5kb3cuYWxlcnQoYmFja2luZ1N0b3JlUmF0aW8pO1xuXHRcdC8vd2luZG93LmFsZXJ0KGRldmljZVBpeGVsUmF0aW8pO1xuXG5cdH0gZWxzZSB7XG5cdFx0Y2FudmFzLndpZHRoID0gd2lkdGg7XG5cdFx0Y2FudmFzLmhlaWdodCA9IGhlaWdodDtcblx0fVxuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG5cdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHRjYW52YXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJjYW52YXNqcy1jaGFydC1jYW52YXNcIik7XG5cblx0c2V0Q2FudmFzU2l6ZShjYW52YXMsIHdpZHRoLCBoZWlnaHQpO1xuXG5cdGlmICghaXNDYW52YXNTdXBwb3J0ZWQgJiYgdHlwZW9mIChHX3ZtbENhbnZhc01hbmFnZXIpICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0R192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KGNhbnZhcyk7XG5cdH1cblxuXHRyZXR1cm4gY2FudmFzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Q2FudmFzKGNhbnZhcywgZm9ybWF0LCBmaWxlTmFtZSkge1xuXHRpZiAoIWNhbnZhcyB8fCAhZm9ybWF0IHx8ICFmaWxlTmFtZSlcblx0XHRyZXR1cm47XG5cblx0dmFyIGZ1bGxGaWxlTmFtZSA9IGZpbGVOYW1lICsgXCIuXCIgKyAoZm9ybWF0ID09PSBcImpwZWdcIiA/IFwianBnXCIgOiBmb3JtYXQpO1xuXHR2YXIgbWltZVR5cGUgPSBcImltYWdlL1wiICsgZm9ybWF0O1xuXHR2YXIgaW1nID0gY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSk7XG5cdHZhciBzYXZlZCA9IGZhbHNlO1xuXG5cdHZhciBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0ZG93bmxvYWRMaW5rLmRvd25sb2FkID0gZnVsbEZpbGVOYW1lO1xuXHRkb3dubG9hZExpbmsuaHJlZiA9IGltZztcblx0ZG93bmxvYWRMaW5rLnRhcmdldCA9IFwiX2JsYW5rXCI7XG5cdHZhciBlO1xuXG5cblx0aWYgKHR5cGVvZiAoQmxvYikgIT09IFwidW5kZWZpbmVkXCIgJiYgISFuZXcgQmxvYigpKSB7XG5cblx0XHQvL2FsZXJ0KFwiYmxvYlwiKTtcblx0XHR2YXIgaW1nRGF0YSA9IGltZy5yZXBsYWNlKC9eZGF0YTpbYS16L10qO2Jhc2U2NCwvLCAnJyk7XG5cblx0XHR2YXIgYnl0ZVN0cmluZyA9IGF0b2IoaW1nRGF0YSk7XG5cdFx0dmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG5cdFx0dmFyIGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRcdGludEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXHRcdH1cblxuXHRcdHZhciBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogXCJpbWFnZS9cIiArIGZvcm1hdCB9KTtcblxuXHRcdC8vIFNhdmUgdGhlIGJsb2Jcblx0XHR0cnkge1xuXHRcdFx0d2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZ1bGxGaWxlTmFtZSk7XG5cdFx0XHRzYXZlZCA9IHRydWU7XG5cdFx0fVxuXHRcdGNhdGNoIChlKSB7XG5cdFx0XHRkb3dubG9hZExpbmsuZGF0YXNldC5kb3dubG9hZHVybCA9IFttaW1lVHlwZSwgZG93bmxvYWRMaW5rLmRvd25sb2FkLCBkb3dubG9hZExpbmsuaHJlZl0uam9pbignOicpO1xuXHRcdFx0ZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIXNhdmVkKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7XG5cblx0XHRcdGV2ZW50LmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwgdHJ1ZSwgZmFsc2UsIHdpbmRvdyxcblx0XHRcdFx0XHRcdFx0IDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsXG5cdFx0XHRcdFx0XHRcdCBmYWxzZSwgMCwgbnVsbCk7XG5cblx0XHRcdGlmIChkb3dubG9hZExpbmsuZGlzcGF0Y2hFdmVudCkge1xuXHRcdFx0XHQvL2FsZXJ0KFwiZGlzcGF0Y2hFdmVudFwiKTtcblx0XHRcdFx0ZG93bmxvYWRMaW5rLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoZG93bmxvYWRMaW5rLmZpcmVFdmVudCkge1xuXHRcdFx0XHQvL2FsZXJ0KFwiZmlyZUV2ZW50XCIpO1xuXHRcdFx0XHRkb3dubG9hZExpbmsuZmlyZUV2ZW50KFwib25jbGlja1wiKTtcblx0XHRcdH1cblxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHZhciB3aW4gPSB3aW5kb3cub3BlbigpO1xuXHRcdFx0Ly9hbGVydChcIjxJRTEwXCIpO1xuXHRcdFx0Ly93aW5kb3cuY29uc29sZS5sb2coXCJJRVwiKTtcblx0XHRcdHdpbi5kb2N1bWVudC53cml0ZShcIjxpbWcgc3JjPSdcIiArIGltZyArIFwiJz48L2ltZz48ZGl2PlBsZWFzZSByaWdodCBjbGljayBvbiB0aGUgaW1hZ2UgYW5kIHNhdmUgaXQgdG8geW91ciBkZXZpY2U8L2Rpdj5cIik7XG5cdFx0XHR3aW4uZG9jdW1lbnQuY2xvc2UoKTtcblx0XHR9XG5cdH1cbn1cblxudmFyIGJhc2U2NEltYWdlcyA9IHtcblx0cmVzZXQ6IHtcblx0XHRpbWFnZTogXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWNDQVlBQUFBQXdyMGlBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFZ0FBQ3hJQjB0MSsvQUFBQUJ4MFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1JtbHlaWGR2Y210eklFTlROdWk4c293QUFBS1JTVVJCVkVpSnJkWS9pRjFGRk1meHp3blpyR0lTVVNSL0pMR0lob2gvUWlSTkJMV3hNTElXRWt3YmdpQW9GZ29XMm1obFk2ZGdwWTJJbFJCUnhCU0toU0FLSWtsV0pSWXVNWktBaGl5b3BBaWFUWTdGdlJ0bVorL2VkOS96SFJqZXpMdzV2L085ZDg2Y3VaR1pwbVVSQWZkbjVvOURmZFpOTFhwanorTHppUGd5SWw2TWlHMGpQVEp6WkJ1eURyUDRCVm0wUC9BS2JsalRiNFRvWS9nR2V3WUE3S3lDbCsxYjNEVVlBTnZ3YmlIdzBnQ0FHUnpCT3pqVEFYRU91MGNDNENoK3I1eC9IcnBkcmNabXZJREZTdWNNdG5ZQ1lDKys2SG1ORHc4RktEVDM0RVRyZjYzOS9hek9yNXZ3UmsvZzVmYmV1QUJ0Z0MwNFhXazlWUUxjaU1QNEVILzNBRnpFclJOQzdNWGxRbXNlc1NvSHNHUEUyM2htRW9CVys2MUs2NkhNWEZtSU12TjhteWlsWFMzNlIwMXViK0tmWXZ3NDNaWHdZRFgrQUhQNEJBY2k0cEZKb21mbXIvaWhtTm9mRVNzQkltSkdrN21sbmNyTTQ1bjVKUGJoejBrQVdwc3YranV4YVgyMVlJUG1WSlMydU56Sk1TNlpOZXhDMGQrSTdmVVdYTEZ5ejJrU1pscFdQdkFTbG1xQWYvRlhOWGYzRkFGMkYvMUx1RmlmQWxpb25CNmRSdVNJMkl3SGk2bHptWG1wNnhSOFhZMGZpSWg3cHNBd2grM0Z1RGtSSFFWamwrYThsa1hqbzBrTFVLSDdYYVY1b084NlBtWjFGVHp5UDRLL1hHbDl2L3p3ZmJXN0JyaWl1RVRHQ1A1Y2g5YmM5Zjk3SEYvdmNGekNhNWdkRVBnV3ErdC80djBWNjNvRTF1RjRoMERpRko3SG5TV01wcERkaDFkeHRzUHZKMndjQk5BS2JzSlhhMENrNW9wZGFCUHNSTnUvdXNiYTA5aTFLc2FBVnptTHQzc2doclJqdUsxVGY0eGtlZ0lueHd5OGdLZjdkS01WSDJRUnNWNXpYUi9DZnR5dSthS2FLYmJrUXJzZEgrUFR6THpjcXprT1FBVnpNKzdGSGRpcXFlMi9ZVDR6Ri90OFMvc1BtYXd5dkM5NzR2Y0FBQUFBU1VWT1JLNUNZSUk9XCJcblx0fSxcblx0cGFuOiB7XG5cdFx0aW1hZ2U6IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRWdBQUN4SUIwdDErL0FBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQUpWU1VSQlZGaUZ2WmU3YTFSQkdNVi94MmhXSTRKcGZLQ0lpU0JLT29PQ2tJRC93UDRCRnFJSUZrRTAyQ2hJaUM4UURLbFNpSTNZcVJCc0JWR3dVTkFVZGlJRVVnamlBelFJSXN1S0pzZml6c1hyNXQ3ZCs4am13TERmekh6M25MT3pjNytaeFRabEd5RGdaaVdPQ3VKOXdIMmdDVXl1cVFGZ0YvQUdjS0pOcllrQllCajQwQ0lldCttdUdRaS85NmtNNFdTN0MvVG01VlVnN3doSmc4QmtFR2tDUjRCRFlmb2RzQURVZ1A2d0VyTzVpQ3Rzd3N1SmIzMmhkYlh5OHF6TDVUSWRtekppbkhkWm9aSUJaY1NGa0dsQUtzMVozWUNrZXRaY0J0b3V1YVFOa3JibE1pQnBCcmhtZTdtQWdVNHdNQ3ZwY0ZzRGtxNEM1NERGVlJUSDloK2k2dmxFMHI1VUE1SW1nQ3VoMjhqQjI4aUlzN0JJVkNPZVN0b1pENjRQNHVQQWpVVHlnS1N4MkZzSzJUSXdrdWdmazlRa2ZkL0UreU1XSFFDZVNScXgvUjNnT3AzTGF6ZmFTMkM0QjVnSERnRDdVOXgzRTN1QUg3S05wQzNBSEhBd1RMNEZIZ005R1E4dkFhUEEwZEIvQWJ4cWsyL2dCTEE5TVhiYTlyMWsvZDRMZkEzSnR3dWVCZU01OHVjUytlZFhuQVcyM3dQMTBOM2FkdkVpOUNYaXpUbnlONGJQUzdabjRzSC9kcTN0MThBWTRlMVlMWVN5M2cvY3NqMlZuRnNoWlB1T3BPZVNLSENvZFVJTnVHajdZZXRFNmplMVBWOVFvTlBKOVN0TkhLb2R4N25SYmlXckdIQkdYQWk1RFVpcXRRd3RwY1dLMEp1YnQ4Q2x0QTVNRVYxSWZ3TzcrVmZmUHdHZmlhNW0zNENUNGJYdWpJSVgwUW5hMS9jR01OcVYvd1VKRTJjenhEOENRNFg1U2w3Sno3U0lMd0NEcGJqS1BCUk1IQWQrRXRYNEhXVjVTcGRjMnc4a0RRR1BiSDhweS9NWE15Z002OS9GS3o0QUFBQUFTVVZPUks1Q1lJST1cIlxuXHR9LFxuXHR6b29tOiB7XG5cdFx0aW1hZ2U6IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFLNndBQUN1c0Jnb3NOV2dBQUFCeDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdSbWx5WlhkdmNtdHpJRU5UTnVpOHNvd0FBQU1xU1VSQlZGaUZ2ZGZiajkxVEZNRHh6NTdVNkdVRU1TMWFZenlNdENTU0RoV2pDWk1JbnBBSTNraEUvUUh0Z3pkUmtYZ1NDUzhTRVM5ZXBLTGkwb1JLTkVUalJhaFJFcTJLUzFzdGRSdWp0RFB0YkE5N241emRuOSs1ekp4VEs5azV2M1BPWG10OTkxcDdyNzErSWNhb0d3a2hUT0llYk1ScXpPQlR2SUczWTR6VFhSbXFTb3l4NWNBS2JNSk9ITUZKbk1aOC9qeUZhWHlNUjdHNm5iMWFIMjJjUDRCdmNCeHppRzNHS2Z5VElSOUQ2QllnMUtVZ2hQQkNEdmVGbGIvMjRBdjhpdVVZdzQxWVZzejVHN3V4S2NaNGFNRXB3R3Q1TlkzVi9ZYkhzUTZyY0FIT3cva1l4aWdld3I1Q1p3NGZZR3hCS2NDTE9GRVllaFhyTWRSaHI1eUxFVHhWU2NzT0xPa0tBUGZuMVRZTVBJdkxGclNoVWxTMkZEWm04WFJIQUN6RkFXbDNSMnhicVBNQ1lobWVMQ0FPWUVNbmdBY3piY1R2dUhZeHpndUl5L0Zlc1I5ZTZnU3dVL09vUFlIQkhnSGd2aUlLWDJGbHE3azM0S2htY1ZuYmkvUEM4Slg0TWdNY3hiMTE4d1p3ZHo1YUlTc2NxeDdWUmNveDdNclBRN2krYnRJQUpyQWtmOStiSTlFUG1aWTJJQXhpVFN1QWxkTHE0WTkrQWNTVWg3OEtQMHRiQWN3VTM1Y1hNRDFKQ0lGVW9HaWVobHFBejZUTkIxZjFDMERLKzBoK25zTlByUUMyYTRicUdtbEQ5a09HY1d0K1BvNnBWZ0R2U3hmSmFTa0ZkNFVRQnZvQXNCWWJDb0IzYTJmbE03c2xBMFI4aXl0NnJBRkRlRFBibThlT1RwVndHRDlxVnE3bkxiSWFabm1rc1BVMUp0c0NaTVhObXBkUnhGYXNXSVR6aDZYajNMQ3pyYTFPeGNEMlFqSGlHVnpkcGZPUm5NcVppbzJQY0YyM0FCZEpGMU5wNEJQcHRseVBpNld6UFlCenBKWnRIZTdBNnhXOWNueVA4VHFBLy9TRUlZUkw4Qnh1bDdyaWh2d2d0Vm43OFdjR0daWGE5SEdkNVREdWpESHVPZVBYTmlIZEtqV2daWC9ZYnN4THgva3RxYmpWelRsY2pVU252STVKcmRsVVZwNldlc1paNlIxaFJycHE5K0VWVEdTOWpUallBdUtJb3VHcGJjdXJFa0lZeEMwNTFLTlNhbWF6c2MreEs4YjRTMFZuRWkvajBocVRQK00yN08yNThlZ1F3WnV6czdwSTdNZjRXUVhJRURjNXM5c3V4KzUrMVB5MkVtUDhVT3E2R3ZXaElTY3hmZFlqVUVSaUF0OUpkODRKNmExNnpmOEpFS1QzeUNtOGcxVXhSdjhDQzRweVJoelIxdVVBQUFBQVNVVk9SSzVDWUlJPVwiXG5cdH0sXG5cdG1lbnU6IHtcblx0XHRpbWFnZTogXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQWdDQVlBQUFBYmlmak1BQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUs2d0FBQ3VzQmdvc05XZ0FBQUJ4MFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1JtbHlaWGR2Y210eklFTlROdWk4c293QUFBQVdkRVZZZEVOeVpXRjBhVzl1SUZScGJXVUFNRGN2TVRVdk1UVFBzdlUwQUFBQVAwbEVRVlJJaWUyU01Rb0FJQkREVXZIL1g2NjdnOHNKSjlLT2hZWU9rVzBxR2FVMU1QZEMwdkdTYlYxOUVBQ28zWU1QQUZINUJVQlVqc3FmQVBwVlh0TmdHRGZ4RURDdEFBQUFBRWxGVGtTdVFtQ0NcIlxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRCdXR0b25TdGF0ZShjaGFydCwgYnV0dG9uLCBzdGF0ZSkge1xuXHRpZiAoYnV0dG9uLmdldEF0dHJpYnV0ZShcInN0YXRlXCIpICE9PSBzdGF0ZSkge1xuXG5cdFx0YnV0dG9uLnNldEF0dHJpYnV0ZShcInN0YXRlXCIsIHN0YXRlKTtcblx0XHRidXR0b24uc2V0QXR0cmlidXRlKFwidHlwZVwiLCAnYnV0dG9uJyk7XG5cdFx0YnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdGJ1dHRvbi5zdHlsZS5tYXJnaW4gPSBcIjBweCAwcHggMHB4IDBweFwiO1xuXHQgICAgYnV0dG9uLnN0eWxlLnBhZGRpbmcgPSBcIjNweCA0cHggMHB4IDRweFwiO1xuXHQgICAgYnV0dG9uLnN0eWxlLmNzc0Zsb2F0ID0gXCJsZWZ0XCI7XG5cdFx0YnV0dG9uLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIGNoYXJ0Ll9jdWx0dXJlSW5mb1tzdGF0ZSArIFwiVGV4dFwiXSk7XG5cdCAgICBidXR0b24uaW5uZXJIVE1MID0gXCI8aW1nIHN0eWxlPSdoZWlnaHQ6MTZweDsnIHNyYz0nXCIgKyBiYXNlNjRJbWFnZXNbc3RhdGVdLmltYWdlICsgXCInIGFsdD0nXCIgKyBjaGFydC5fY3VsdHVyZUluZm9bc3RhdGUgKyBcIlRleHRcIl0gKyBcIicgLz5cIjtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdygpIHtcblxuXHR2YXIgZWxlbWVudCA9IG51bGw7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRlbGVtZW50ID0gYXJndW1lbnRzW2ldO1xuXHRcdGlmIChlbGVtZW50LnN0eWxlKVxuXHRcdFx0ZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZSgpIHtcblxuXHR2YXIgZWxlbWVudCA9IG51bGw7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRlbGVtZW50ID0gYXJndW1lbnRzW2ldO1xuXHRcdGlmIChlbGVtZW50ICYmIGVsZW1lbnQuc3R5bGUpXG5cdFx0XHRlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNDYW52YXNTdXBwb3J0ZWQgPSAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJlemllclBvaW50cyhwb2ludHMsIHRlbnNpb24pIHtcblxuXHR2YXIgYmV6aWVyUG9pbnRzID0gW107XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdGlmIChpID09IDApIHtcblx0XHRcdGJlemllclBvaW50cy5wdXNoKHBvaW50c1swXSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2YXIgaTEsIGkyLCBwb2ludEluZGV4O1xuXG5cdFx0cG9pbnRJbmRleCA9IGkgLSAxO1xuXHRcdGkxID0gcG9pbnRJbmRleCA9PT0gMCA/IDAgOiBwb2ludEluZGV4IC0gMTtcblx0XHRpMiA9IHBvaW50SW5kZXggPT09IHBvaW50cy5sZW5ndGggLSAxID8gcG9pbnRJbmRleCA6IHBvaW50SW5kZXggKyAxO1xuXG5cdFx0dmFyIGRydjEgPSB7XG5cdFx0XHR4OiAocG9pbnRzW2kyXS54IC0gcG9pbnRzW2kxXS54KSAvIHRlbnNpb24sIHk6IChwb2ludHNbaTJdLnkgLSBwb2ludHNbaTFdLnkpIC8gdGVuc2lvblxuXHRcdH1cblx0XHR2YXIgY3AxID0ge1xuXHRcdFx0eDogcG9pbnRzW3BvaW50SW5kZXhdLnggKyBkcnYxLnggLyAzLCB5OiBwb2ludHNbcG9pbnRJbmRleF0ueSArIGRydjEueSAvIDNcblx0XHR9XG5cdFx0YmV6aWVyUG9pbnRzW2JlemllclBvaW50cy5sZW5ndGhdID0gY3AxO1xuXG5cblx0XHRwb2ludEluZGV4ID0gaTtcblx0XHRpMSA9IHBvaW50SW5kZXggPT09IDAgPyAwIDogcG9pbnRJbmRleCAtIDE7XG5cdFx0aTIgPSBwb2ludEluZGV4ID09PSBwb2ludHMubGVuZ3RoIC0gMSA/IHBvaW50SW5kZXggOiBwb2ludEluZGV4ICsgMTtcblxuXHRcdHZhciBkcnYyID0ge1xuXHRcdFx0eDogKHBvaW50c1tpMl0ueCAtIHBvaW50c1tpMV0ueCkgLyB0ZW5zaW9uLCB5OiAocG9pbnRzW2kyXS55IC0gcG9pbnRzW2kxXS55KSAvIHRlbnNpb25cblx0XHR9XG5cdFx0dmFyIGNwMiA9IHtcblx0XHRcdHg6IHBvaW50c1twb2ludEluZGV4XS54IC0gZHJ2Mi54IC8gMywgeTogcG9pbnRzW3BvaW50SW5kZXhdLnkgLSBkcnYyLnkgLyAzXG5cdFx0fVxuXHRcdGJlemllclBvaW50c1tiZXppZXJQb2ludHMubGVuZ3RoXSA9IGNwMjtcblxuXHRcdGJlemllclBvaW50c1tiZXppZXJQb2ludHMubGVuZ3RoXSA9IHBvaW50c1tpXTtcblx0fVxuXG5cdHJldHVybiBiZXppZXJQb2ludHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UGVyY2VudFRvVmFsdWUoaW5wdXQsIHJlZmVyZW5jZVZhbHVlKSB7XG5cdC8vaW5wdXQgY2FuIGJlIGEgbnVtYmVyIG9yIHN0cmluZ1xuXHRpZiAoaW5wdXQgPT09IG51bGwgfHwgdHlwZW9mIChpbnB1dCkgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0cmV0dXJuIHJlZmVyZW5jZVZhbHVlO1xuXG5cdHZhciByZXN1bHQgPSBwYXJzZUZsb2F0KGlucHV0LnRvU3RyaW5nKCkpICogKGlucHV0LnRvU3RyaW5nKCkuaW5kZXhPZihcIiVcIikgPj0gMCA/IHJlZmVyZW5jZVZhbHVlIC8gMTAwIDogMSk7XG5cblx0Ly8gbGltaXQgdG8gcGxvdCBhcmVhXG5cdGlmICghaXNOYU4ocmVzdWx0KSAmJiByZXN1bHQgPD0gcmVmZXJlbmNlVmFsdWUgJiYgcmVzdWx0ID49IDApXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRyZXR1cm4gcmVmZXJlbmNlVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3UmVjdChjdHgsIHgxLCB5MSwgeDIsIHkyLCBjb2xvciwgYm9yZGVyVGhpY2tuZXNzLCBib3JkZXJDb2xvciwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBmaWxsT3BhY2l0eSkge1xuXHRpZiAodHlwZW9mIChmaWxsT3BhY2l0eSkgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0ZmlsbE9wYWNpdHkgPSAxO1xuXG5cdGJvcmRlclRoaWNrbmVzcyA9IGJvcmRlclRoaWNrbmVzcyB8fCAwO1xuXHRib3JkZXJDb2xvciA9IGJvcmRlckNvbG9yIHx8IFwiYmxhY2tcIjtcblx0Ly9hbGVydChcInRvcFwiKyB0b3AgKyBcImJvdHRvbVwiICsgYm90dG9tICsgXCIgbHRcIiArIGxlZnQrIFwicnRcIiArIHJpZ2h0IClcblx0dmFyIGExID0geDEsIGEyID0geDIsIGIxID0geTEsIGIyID0geTIsIGVkZ2VZLCBlZGdlWDtcblx0aWYgKHgyIC0geDEgPiAxNSAmJiB5MiAtIHkxID4gMTUpXG5cdFx0dmFyIGJldmVsRGVwdGggPSA4O1xuXHRlbHNlXG5cdFx0dmFyIGJldmVsRGVwdGggPSAwLjM1ICogTWF0aC5taW4oKHgyIC0geDEpLCAoeTIgLSB5MSkpO1xuXHQvL2FsZXJ0KGExICsgXCJcIiArIGEyKTtcblx0dmFyIGNvbG9yMiA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAuNClcIjtcblx0dmFyIGNvbG9yMyA9IFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpXCI7XG5cdC8vY29sb3IxID0gXCJyZ2JhKFwiICsgciArIFwiLFwiICsgZyArIFwiLCBcIiArIGIgKyBcIiwxKVwiO1xuXHR2YXIgY29sb3IxID0gY29sb3I7XG5cblx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRjdHgubW92ZVRvKHgxLCB5MSk7XG5cdGN0eC5zYXZlKCk7XG5cdGN0eC5maWxsU3R5bGUgPSBjb2xvcjE7XG5cblx0Y3R4Lmdsb2JhbEFscGhhID0gZmlsbE9wYWNpdHk7XG5cdGN0eC5maWxsUmVjdCh4MSwgeTEsIHgyIC0geDEsIHkyIC0geTEpO1xuXHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdGlmIChib3JkZXJUaGlja25lc3MgPiAwKSB7XG5cdFx0dmFyIG9mZnNldCA9IGJvcmRlclRoaWNrbmVzcyAlIDIgPT09IDAgPyAwIDogLjU7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5saW5lV2lkdGggPSBib3JkZXJUaGlja25lc3M7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG5cdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdGN0eC5yZWN0KHgxIC0gb2Zmc2V0LCB5MSAtIG9mZnNldCwgeDIgLSB4MSArIDIgKiBvZmZzZXQsIHkyIC0geTEgKyAyICogb2Zmc2V0KTtcblx0XHRjdHguc3Ryb2tlKCk7XG5cdH1cblxuXHRjdHgucmVzdG9yZSgpO1xuXHQvLyAgIGN0eC5iZWdpblBhdGgoKTtcblx0aWYgKHRvcCA9PT0gdHJ1ZSkge1xuXHRcdC8vIGFsZXJ0KHgxICsgXCJcIiArIHgyICsgXCIgXCIgKyBiZXZlbERlcHRoKTtcblx0XHRjdHguc2F2ZSgpO1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHgxLCB5MSk7XG5cdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiwgeTEpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHR2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KCh4MiArIHgxKSAvIDIsIGIxICsgYmV2ZWxEZXB0aCwgKHgyICsgeDEpIC8gMiwgYjEpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMik7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRjdHguZmlsbCgpO1xuXHRcdC8vICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxuXG5cblx0aWYgKGJvdHRvbSA9PT0gdHJ1ZSkge1xuXHRcdGN0eC5zYXZlKCk7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oeDEsIHkyKTtcblx0XHRjdHgubGluZVRvKHgxICsgYmV2ZWxEZXB0aCwgeTIgLSBiZXZlbERlcHRoKTtcblx0XHRjdHgubGluZVRvKHgyIC0gYmV2ZWxEZXB0aCwgeTIgLSBiZXZlbERlcHRoKTtcblx0XHRjdHgubGluZVRvKHgyLCB5Mik7XG5cdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoKHgyICsgeDEpIC8gMiwgYjIgLSBiZXZlbERlcHRoLCAoeDIgKyB4MSkgLyAyLCBiMik7XG5cdFx0Z3JkLmFkZENvbG9yU3RvcCgwLCBjb2xvcjEpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMSwgY29sb3IyKTtcblx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdC8vICAgICAgIGN0eC5zdHJva2UoKTtcblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH1cblxuXHRpZiAobGVmdCA9PT0gdHJ1ZSkge1xuXHRcdC8vICAgYWxlcnQoeDEpXG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4MSwgeTEpXG5cdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MSArIGJldmVsRGVwdGgsIHkyIC0gYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MSwgeTIpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHR2YXIgZ3JkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KGExICsgYmV2ZWxEZXB0aCwgKHkyICsgeTEpIC8gMiwgYTEsICh5MiArIHkxKSAvIDIpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRjdHguZmlsbCgpO1xuXHRcdC8vICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxuXG5cblx0aWYgKHJpZ2h0ID09PSB0cnVlKSB7XG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyh4MiwgeTEpXG5cdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkxICsgYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiAtIGJldmVsRGVwdGgsIHkyIC0gYmV2ZWxEZXB0aCk7XG5cdFx0Y3R4LmxpbmVUbyh4MiwgeTIpO1xuXHRcdHZhciBncmQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoYTIgLSBiZXZlbERlcHRoLCAoeTIgKyB5MSkgLyAyLCBhMiwgKHkyICsgeTEpIC8gMik7XG5cdFx0Z3JkLmFkZENvbG9yU3RvcCgwLCBjb2xvcjEpO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMSwgY29sb3IzKTtcblx0XHRjdHguZmlsbFN0eWxlID0gZ3JkO1xuXHRcdGdyZC5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcblx0XHRncmQuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMyk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGdyZDtcblx0XHRjdHguZmlsbCgpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHQvLyAgICAgICAgICBjdHguc3Ryb2tlKCk7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fVxuXHQvL1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3U2VnbWVudChjdHgsIGNlbnRlciwgcmFkaXVzLCBjb2xvciwgdHlwZSwgdGhldGExLCB0aGV0YTIsIGZpbGxPcGFjaXR5LCBwZXJjZW50SW5uZXJSYWRpdXMpIHtcblxuXHRpZiAodHlwZW9mIChmaWxsT3BhY2l0eSkgPT09IFwidW5kZWZpbmVkXCIpXG5cdFx0ZmlsbE9wYWNpdHkgPSAxO1xuXG5cdC8vSUU4LSBGSVg6IEluIElFOC0gc2VnbWVudCBkb2Vzbid0IGdldCBkcmF3IGlmIHRoZXRhMiBpcyBlcXVhbCB0byB0aGV0YTEgKyAyKlBJLlxuXHRpZiAoIWlzQ2FudmFzU3VwcG9ydGVkKSB7XG5cdFx0dmFyIHRoZXRhMk1vZCA9IE51bWJlcigodGhldGEyICUgKDIgKiBNYXRoLlBJKSkudG9GaXhlZCg4KSk7XG5cdFx0dmFyIHRoZXRhMU1vZCA9IE51bWJlcigodGhldGExICUgKDIgKiBNYXRoLlBJKSkudG9GaXhlZCg4KSk7XG5cdFx0aWYgKHRoZXRhMU1vZCA9PT0gdGhldGEyTW9kKVxuXHRcdFx0dGhldGEyIC09IC4wMDAxO1xuXHR9XG5cblx0Y3R4LnNhdmUoKTtcblx0Y3R4Lmdsb2JhbEFscGhhID0gZmlsbE9wYWNpdHk7XG5cblx0aWYgKHR5cGUgPT09IFwicGllXCIpIHtcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0Y3R4Lm1vdmVUbyhjZW50ZXIueCwgY2VudGVyLnkpO1xuXHRcdGN0eC5hcmMoY2VudGVyLngsIGNlbnRlci55LCByYWRpdXMsIHRoZXRhMSwgdGhldGEyLCBmYWxzZSk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IFwid2hpdGVcIjtcblx0XHRjdHgubGluZVdpZHRoID0gMjtcblx0XHQvLyAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDI7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd09mZnNldFkgPSAxO1xuXHRcdC8vICAgICBjdHguc2hhZG93Qmx1ciA9IDI7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd0NvbG9yID0gJyNCRkJGQkYnO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHQvL2N0eC5zdHJva2UoKTtcblx0XHRjdHguZmlsbCgpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGUgPT09IFwiZG91Z2hudXRcIikge1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHguYXJjKGNlbnRlci54LCBjZW50ZXIueSwgcmFkaXVzLCB0aGV0YTEsIHRoZXRhMiwgZmFsc2UpO1xuXHRcdGN0eC5hcmMoY2VudGVyLngsIGNlbnRlci55LCBwZXJjZW50SW5uZXJSYWRpdXMgKiByYWRpdXMsIHRoZXRhMiwgdGhldGExLCB0cnVlKTtcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IFwid2hpdGVcIjtcblx0XHRjdHgubGluZVdpZHRoID0gMjtcblx0XHQvLyBzaGFkb3cgcHJvcGVydGllc1xuXHRcdC8vICAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDE7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd09mZnNldFkgPSAxO1xuXHRcdC8vICAgICBjdHguc2hhZG93Qmx1ciA9IDE7XG5cdFx0Ly8gICAgY3R4LnNoYWRvd0NvbG9yID0gJyNCRkJGQkYnOyAgLy9ncmV5IHNoYWRvd1xuXHRcdC8vY3R4LnN0cm9rZSgpO1xuXHRcdGN0eC5maWxsKCk7XG5cdH1cblxuXHRjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXG5cdGN0eC5yZXN0b3JlKCk7XG59O1xuIiwiLyoqXG4qIEBwcmVzZXJ2ZSBDYW52YXNKUyBIVE1MNSAmIEphdmFTY3JpcHQgQ2hhcnRzIC0gdjEuOC4wIEJldGEgMiAtIGh0dHA6Ly9jYW52YXNqcy5jb20vXG4qIENhbnZhc0pTIENoYXJ0cyBmb2xsb3dzIER1YWwgTGljZW5zaW5nIE1vZGVsIGFzIG1lbnRpb25lZCBiZWxvdy5cbipcbiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tRnJlZSBmb3IgTm9uLUNvbW1lcmNpYWwgVXNlLS0tLS0tLS0tLS0tLS0tLS0tLS1cbipcbiogRm9yIG5vbi1jb21tZXJjaWFsIHB1cnBvc2VzIHlvdSBjYW4gdXNlIHRoZSBzb2Z0d2FyZSBmb3IgZnJlZSB1bmRlciBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIExpY2Vuc2UuIFJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoZSBzYW1lLlxuKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvZGVlZC5lbl9VU1xuKlxuKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1Db21tZXJjaWFsIExpY2Vuc2UtLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBDb21tZXJjaWFsIHVzZSBvZiBDYW52YXNKUyByZXF1aXJlcyB5b3UgdG8gcHVyY2hhc2UgYSBsaWNlbnNlLiBXaXRob3V0IGEgY29tbWVyY2lhbCBsaWNlbnNlIHlvdSBjYW4gdXNlIGl0IGZvciBldmFsdWF0aW9uIHB1cnBvc2VzIG9ubHkuIFBsZWFzZSByZWZlciB0byB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGZ1cnRoZXIgZGV0YWlscy5cbiogaHR0cDovL2NhbnZhc2pzLmNvbS9cbipcbioqL1xuaW1wb3J0IENoYXJ0cyBmcm9tICcuLi9jb3JlL2NoYXJ0cyc7XG5pbXBvcnQgQ3VsdHVyZUluZm8gZnJvbSAnLi4vY29yZS9jdWx0dXJlX2luZm8nO1xuaW1wb3J0IHtjb2xvclNldHN9IGZyb20gJy4uL2NvbnN0YW50cy90aGVtZXMnO1xuaW1wb3J0IHtjdWx0dXJlc30gZnJvbSAnLi4vY29uc3RhbnRzL2N1bHR1cmUnO1xuaW1wb3J0IHtudW1iZXJGb3JtYXQsIGRhdGVGb3JtYXR9IGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2hhcnQoY29udGFpbmVySWQsIG9wdGlvbnMpIHtcblxuICBjb25zdCBfY2hhcnQgPSBuZXcgQ2hhcnRzKGNvbnRhaW5lcklkLCBvcHRpb25zLCB0aGlzKTtcblxuICB0aGlzLnJlbmRlciA9ICgpID0+ICBfY2hhcnQucmVuZGVyKHRoaXMub3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gX2NoYXJ0Ll9vcHRpb25zO1xufTtcblxuXG5leHBvcnQgY29uc3QgYWRkQ29sb3JTZXQgPSAobmFtZSwgY29sb3JTZXQpID0+IHtcblxuICAgIGNvbG9yU2V0c1tuYW1lXSA9IGNvbG9yU2V0O1xuXG59O1xuXG5leHBvcnQgY29uc3QgYWRkQ3VsdHVyZUluZm8gPSAobmFtZSwgY3VsdHVyZUluZm8pID0+IHtcblxuICAgIGN1bHR1cmVzW25hbWVdID0gY3VsdHVyZUluZm87XG5cbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXROdW1iZXIgPSAobnVtYmVyLCBmb3JtYXRTdHJpbmcsIGN1bHR1cmUpID0+IHtcblxuICAgIGN1bHR1cmUgPSBjdWx0dXJlIHx8IFwiZW5cIjtcbiAgICBmb3JtYXRTdHJpbmcgPSBmb3JtYXRTdHJpbmcgfHwgXCIjLCMjMC4jI1wiO1xuXG4gICAgaWYgKCFjdWx0dXJlc1tjdWx0dXJlXSl0aHJvdyBcIlVua25vd24gQ3VsdHVyZSBOYW1lXCI7XG4gICAgZWxzZSBudW1iZXJGb3JtYXQobnVtYmVyLCBmb3JtYXRTdHJpbmcsIG5ldyBDdWx0dXJlSW5mbyhjdWx0dXJlKSk7XG5cbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREYXRlID0gKGRhdGUsIGZvcm1hdFN0cmluZywgY3VsdHVyZSkgPT4ge1xuXG4gICAgY3VsdHVyZSA9IGN1bHR1cmUgfHwgXCJlblwiO1xuICAgIGZvcm1hdFN0cmluZyA9IGZvcm1hdFN0cmluZyB8fCBcIkREIE1NTSBZWVlZXCI7XG5cbiAgICBpZiAoIWN1bHR1cmVzW2N1bHR1cmVdKXRocm93IFwiVW5rbm93biBDdWx0dXJlIE5hbWVcIjtcbiAgICBlbHNlIGRhdGVGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyaW5nLCBuZXcgQ3VsdHVyZUluZm8oY3VsdHVyZSkpO1xuXG59O1xuXG5DaGFydC52ZXJzaW9uID0gXCJ2MS44LjJcIjtcbiJdfQ==

:: Command execute ::

Enter:
 
Select:
 

:: Shadow's tricks :D ::

Useful Commands
 
Warning. Kernel may be alerted using higher levels
Kernel Info:

:: Preddy's tricks :D ::

Php Safe-Mode Bypass (Read Files)

File:

eg: /etc/passwd

Php Safe-Mode Bypass (List Directories):

Dir:

eg: /etc/

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c999shell v. 1.0 pre-release build #16 Modded by Shadow & Preddy | RootShell Security Group | r57 c99 shell | Generation time: 0.076 ]--