(self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_gopd_index_js-node_modules_has-symbols_index_js-node_modules_hasown_inde-de185c"],{
/***/ "../../../node_modules/gopd/gOPD.js"
/*!******************************************!*\
!*** ../../../node_modules/gopd/gOPD.js ***!
\******************************************/
(module) {
"use strict";
/** @type {import('./gOPD')} */
module.exports = Object.getOwnPropertyDescriptor;
/***/ },
/***/ "../../../node_modules/gopd/index.js"
/*!*******************************************!*\
!*** ../../../node_modules/gopd/index.js ***!
\*******************************************/
(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
/** @type {import('.')} */
var $gOPD = __webpack_require__(/*! ./gOPD */ "../../../node_modules/gopd/gOPD.js");
if ($gOPD) {
try {
$gOPD([], 'length');
} catch (e) {
// IE 8 has a broken gOPD
$gOPD = null;
}
}
module.exports = $gOPD;
/***/ },
/***/ "../../../node_modules/has-symbols/index.js"
/*!**************************************************!*\
!*** ../../../node_modules/has-symbols/index.js ***!
\**************************************************/
(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = __webpack_require__(/*! ./shams */ "../../../node_modules/has-symbols/shams.js");
/** @type {import('.')} */
module.exports = function hasNativeSymbols() {
if (typeof origSymbol !== 'function') { return false; }
if (typeof Symbol !== 'function') { return false; }
if (typeof origSymbol('foo') !== 'symbol') { return false; }
if (typeof Symbol('bar') !== 'symbol') { return false; }
return hasSymbolSham();
};
/***/ },
/***/ "../../../node_modules/has-symbols/shams.js"
/*!**************************************************!*\
!*** ../../../node_modules/has-symbols/shams.js ***!
\**************************************************/
(module) {
"use strict";
/** @type {import('./shams')} */
/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
if (typeof Symbol.iterator === 'symbol') { return true; }
/** @type {{ [k in symbol]?: unknown }} */
var obj = {};
var sym = Symbol('test');
var symObj = Object(sym);
if (typeof sym === 'string') { return false; }
if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
// temp disabled per https://github.com/ljharb/object.assign/issues/17
// if (sym instanceof Symbol) { return false; }
// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
// if (!(symObj instanceof Symbol)) { return false; }
// if (typeof Symbol.prototype.toString !== 'function') { return false; }
// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
var symVal = 42;
obj[sym] = symVal;
for (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
var syms = Object.getOwnPropertySymbols(obj);
if (syms.length !== 1 || syms[0] !== sym) { return false; }
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
if (typeof Object.getOwnPropertyDescriptor === 'function') {
// eslint-disable-next-line no-extra-parens
var descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));
if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
}
return true;
};
/***/ },
/***/ "../../../node_modules/hasown/index.js"
/*!*********************************************!*\
!*** ../../../node_modules/hasown/index.js ***!
\*********************************************/
(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
var call = Function.prototype.call;
var $hasOwn = Object.prototype.hasOwnProperty;
var bind = __webpack_require__(/*! function-bind */ "../../../node_modules/function-bind/index.js");
/** @type {import('.')} */
module.exports = bind.call(call, $hasOwn);
/***/ },
/***/ "../../../node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.js"
/*!****************************************************************************!*\
!*** ../../../node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.js ***!
\****************************************************************************/
(module, __unused_webpack_exports, __webpack_require__) {
/*!
*
* jsPDF AutoTable plugin v3.8.4
*
* Copyright (c) 2024 Simon Bengtsson, https://github.com/simonbengtsson/jsPDF-AutoTable
* Licensed under the MIT License.
* http://opensource.org/licenses/mit-license
*
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(true)
module.exports = factory((function webpackLoadOptionalExternalModule() { try { return __webpack_require__(/*! jspdf */ "../../../node_modules/jspdf/dist/jspdf.es.min.js"); } catch(e) {} }()));
else // removed by dead control flow
{ var i, a; }
})(typeof globalThis !== 'undefined' ? globalThis : typeof this !== 'undefined' ? this : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : __webpack_require__.g , function(__WEBPACK_EXTERNAL_MODULE__964__) {
return /******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 172:
/***/ (function(__unused_webpack_module, exports) {
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.CellHookData = exports.HookData = void 0;
var HookData = /** @class */ (function () {
function HookData(doc, table, cursor) {
this.table = table;
this.pageNumber = table.pageNumber;
this.pageCount = this.pageNumber;
this.settings = table.settings;
this.cursor = cursor;
this.doc = doc.getDocument();
}
return HookData;
}());
exports.HookData = HookData;
var CellHookData = /** @class */ (function (_super) {
__extends(CellHookData, _super);
function CellHookData(doc, table, cell, row, column, cursor) {
var _this = _super.call(this, doc, table, cursor) || this;
_this.cell = cell;
_this.row = row;
_this.column = column;
_this.section = row.section;
return _this;
}
return CellHookData;
}(HookData));
exports.CellHookData = CellHookData;
/***/ }),
/***/ 340:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_3043__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
var htmlParser_1 = __nested_webpack_require_3043__(4);
var autoTableText_1 = __nested_webpack_require_3043__(136);
var documentHandler_1 = __nested_webpack_require_3043__(744);
var inputParser_1 = __nested_webpack_require_3043__(776);
var tableDrawer_1 = __nested_webpack_require_3043__(664);
var tableCalculator_1 = __nested_webpack_require_3043__(972);
function default_1(jsPDF) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
jsPDF.API.autoTable = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var options;
if (args.length === 1) {
options = args[0];
}
else {
console.error('Use of deprecated autoTable initiation');
options = args[2] || {};
options.columns = args[0];
options.body = args[1];
}
var input = (0, inputParser_1.parseInput)(this, options);
var table = (0, tableCalculator_1.createTable)(this, input);
(0, tableDrawer_1.drawTable)(this, table);
return this;
};
// Assign false to enable `doc.lastAutoTable.finalY || 40` sugar
jsPDF.API.lastAutoTable = false;
jsPDF.API.previousAutoTable = false; // deprecated in v3
jsPDF.API.autoTable.previous = false; // deprecated in v3
jsPDF.API.autoTableText = function (text, x, y, styles) {
(0, autoTableText_1.default)(text, x, y, styles, this);
};
jsPDF.API.autoTableSetDefaults = function (defaults) {
documentHandler_1.DocHandler.setDefaults(defaults, this);
return this;
};
jsPDF.autoTableSetDefaults = function (defaults, doc) {
documentHandler_1.DocHandler.setDefaults(defaults, doc);
};
jsPDF.API.autoTableHtmlToJson = function (tableElem, includeHiddenElements) {
var _a;
if (includeHiddenElements === void 0) { includeHiddenElements = false; }
if (typeof window === 'undefined') {
console.error('Cannot run autoTableHtmlToJson in non browser environment');
return null;
}
var doc = new documentHandler_1.DocHandler(this);
var _b = (0, htmlParser_1.parseHtml)(doc, tableElem, window, includeHiddenElements, false), head = _b.head, body = _b.body;
var columns = ((_a = head[0]) === null || _a === void 0 ? void 0 : _a.map(function (c) { return c.content; })) || [];
return { columns: columns, rows: body, data: body };
};
/**
* @deprecated
*/
jsPDF.API.autoTableEndPosY = function () {
console.error('Use of deprecated function: autoTableEndPosY. Use doc.lastAutoTable.finalY instead.');
var prev = this.lastAutoTable;
if (prev && prev.finalY) {
return prev.finalY;
}
else {
return 0;
}
};
/**
* @deprecated
*/
jsPDF.API.autoTableAddPageContent = function (hook) {
console.error('Use of deprecated function: autoTableAddPageContent. Use jsPDF.autoTableSetDefaults({didDrawPage: () => {}}) instead.');
if (!jsPDF.API.autoTable.globalDefaults) {
jsPDF.API.autoTable.globalDefaults = {};
}
jsPDF.API.autoTable.globalDefaults.addPageContent = hook;
return this;
};
/**
* @deprecated
*/
jsPDF.API.autoTableAddPage = function () {
console.error('Use of deprecated function: autoTableAddPage. Use doc.addPage()');
this.addPage();
return this;
};
}
exports["default"] = default_1;
/***/ }),
/***/ 136:
/***/ (function(__unused_webpack_module, exports) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
/**
* Improved text function with halign and valign support
* Inspiration from: http://stackoverflow.com/questions/28327510/align-text-right-using-jspdf/28433113#28433113
*/
function default_1(text, x, y, styles, doc) {
styles = styles || {};
var PHYSICAL_LINE_HEIGHT = 1.15;
var k = doc.internal.scaleFactor;
var fontSize = doc.internal.getFontSize() / k;
var lineHeightFactor = doc.getLineHeightFactor
? doc.getLineHeightFactor()
: PHYSICAL_LINE_HEIGHT;
var lineHeight = fontSize * lineHeightFactor;
var splitRegex = /\r\n|\r|\n/g;
var splitText = '';
var lineCount = 1;
if (styles.valign === 'middle' ||
styles.valign === 'bottom' ||
styles.halign === 'center' ||
styles.halign === 'right') {
splitText = typeof text === 'string' ? text.split(splitRegex) : text;
lineCount = splitText.length || 1;
}
// Align the top
y += fontSize * (2 - PHYSICAL_LINE_HEIGHT);
if (styles.valign === 'middle')
y -= (lineCount / 2) * lineHeight;
else if (styles.valign === 'bottom')
y -= lineCount * lineHeight;
if (styles.halign === 'center' || styles.halign === 'right') {
var alignSize = fontSize;
if (styles.halign === 'center')
alignSize *= 0.5;
if (splitText && lineCount >= 1) {
for (var iLine = 0; iLine < splitText.length; iLine++) {
doc.text(splitText[iLine], x - doc.getStringUnitWidth(splitText[iLine]) * alignSize, y);
y += lineHeight;
}
return doc;
}
x -= doc.getStringUnitWidth(text) * alignSize;
}
if (styles.halign === 'justify') {
doc.text(text, x, y, {
maxWidth: styles.maxWidth || 100,
align: 'justify',
});
}
else {
doc.text(text, x, y);
}
return doc;
}
exports["default"] = default_1;
/***/ }),
/***/ 420:
/***/ (function(__unused_webpack_module, exports) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getPageAvailableWidth = exports.parseSpacing = exports.getFillStyle = exports.addTableBorder = exports.getStringWidth = void 0;
function getStringWidth(text, styles, doc) {
doc.applyStyles(styles, true);
var textArr = Array.isArray(text) ? text : [text];
var widestLineWidth = textArr
.map(function (text) { return doc.getTextWidth(text); })
.reduce(function (a, b) { return Math.max(a, b); }, 0);
return widestLineWidth;
}
exports.getStringWidth = getStringWidth;
function addTableBorder(doc, table, startPos, cursor) {
var lineWidth = table.settings.tableLineWidth;
var lineColor = table.settings.tableLineColor;
doc.applyStyles({ lineWidth: lineWidth, lineColor: lineColor });
var fillStyle = getFillStyle(lineWidth, false);
if (fillStyle) {
doc.rect(startPos.x, startPos.y, table.getWidth(doc.pageSize().width), cursor.y - startPos.y, fillStyle);
}
}
exports.addTableBorder = addTableBorder;
function getFillStyle(lineWidth, fillColor) {
var drawLine = lineWidth > 0;
var drawBackground = fillColor || fillColor === 0;
if (drawLine && drawBackground) {
return 'DF'; // Fill then stroke
}
else if (drawLine) {
return 'S'; // Only stroke (transparent background)
}
else if (drawBackground) {
return 'F'; // Only fill, no stroke
}
else {
return null;
}
}
exports.getFillStyle = getFillStyle;
function parseSpacing(value, defaultValue) {
var _a, _b, _c, _d;
value = value || defaultValue;
if (Array.isArray(value)) {
if (value.length >= 4) {
return {
top: value[0],
right: value[1],
bottom: value[2],
left: value[3],
};
}
else if (value.length === 3) {
return {
top: value[0],
right: value[1],
bottom: value[2],
left: value[1],
};
}
else if (value.length === 2) {
return {
top: value[0],
right: value[1],
bottom: value[0],
left: value[1],
};
}
else if (value.length === 1) {
value = value[0];
}
else {
value = defaultValue;
}
}
if (typeof value === 'object') {
if (typeof value.vertical === 'number') {
value.top = value.vertical;
value.bottom = value.vertical;
}
if (typeof value.horizontal === 'number') {
value.right = value.horizontal;
value.left = value.horizontal;
}
return {
left: (_a = value.left) !== null && _a !== void 0 ? _a : defaultValue,
top: (_b = value.top) !== null && _b !== void 0 ? _b : defaultValue,
right: (_c = value.right) !== null && _c !== void 0 ? _c : defaultValue,
bottom: (_d = value.bottom) !== null && _d !== void 0 ? _d : defaultValue,
};
}
if (typeof value !== 'number') {
value = defaultValue;
}
return { top: value, right: value, bottom: value, left: value };
}
exports.parseSpacing = parseSpacing;
function getPageAvailableWidth(doc, table) {
var margins = parseSpacing(table.settings.margin, 0);
return doc.pageSize().width - (margins.left + margins.right);
}
exports.getPageAvailableWidth = getPageAvailableWidth;
/***/ }),
/***/ 796:
/***/ (function(__unused_webpack_module, exports) {
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getTheme = exports.defaultStyles = exports.HtmlRowInput = void 0;
var HtmlRowInput = /** @class */ (function (_super) {
__extends(HtmlRowInput, _super);
function HtmlRowInput(element) {
var _this = _super.call(this) || this;
_this._element = element;
return _this;
}
return HtmlRowInput;
}(Array));
exports.HtmlRowInput = HtmlRowInput;
// Base style for all themes
function defaultStyles(scaleFactor) {
return {
font: 'helvetica', // helvetica, times, courier
fontStyle: 'normal', // normal, bold, italic, bolditalic
overflow: 'linebreak', // linebreak, ellipsize, visible or hidden
fillColor: false, // Either false for transparent, rbg array e.g. [255, 255, 255] or gray level e.g 200
textColor: 20,
halign: 'left', // left, center, right, justify
valign: 'top', // top, middle, bottom
fontSize: 10,
cellPadding: 5 / scaleFactor, // number or {top,left,right,left,vertical,horizontal}
lineColor: 200,
lineWidth: 0,
cellWidth: 'auto', // 'auto'|'wrap'|number
minCellHeight: 0,
minCellWidth: 0,
};
}
exports.defaultStyles = defaultStyles;
function getTheme(name) {
var themes = {
striped: {
table: { fillColor: 255, textColor: 80, fontStyle: 'normal' },
head: { textColor: 255, fillColor: [41, 128, 185], fontStyle: 'bold' },
body: {},
foot: { textColor: 255, fillColor: [41, 128, 185], fontStyle: 'bold' },
alternateRow: { fillColor: 245 },
},
grid: {
table: {
fillColor: 255,
textColor: 80,
fontStyle: 'normal',
lineWidth: 0.1,
},
head: {
textColor: 255,
fillColor: [26, 188, 156],
fontStyle: 'bold',
lineWidth: 0,
},
body: {},
foot: {
textColor: 255,
fillColor: [26, 188, 156],
fontStyle: 'bold',
lineWidth: 0,
},
alternateRow: {},
},
plain: {
head: { fontStyle: 'bold' },
foot: { fontStyle: 'bold' },
},
};
return themes[name];
}
exports.getTheme = getTheme;
/***/ }),
/***/ 903:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_15650__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.parseCss = void 0;
// Limitations
// - No support for border spacing
// - No support for transparency
var common_1 = __nested_webpack_require_15650__(420);
function parseCss(supportedFonts, element, scaleFactor, style, window) {
var result = {};
var pxScaleFactor = 96 / 72;
var backgroundColor = parseColor(element, function (elem) {
return window.getComputedStyle(elem)['backgroundColor'];
});
if (backgroundColor != null)
result.fillColor = backgroundColor;
var textColor = parseColor(element, function (elem) {
return window.getComputedStyle(elem)['color'];
});
if (textColor != null)
result.textColor = textColor;
var padding = parsePadding(style, scaleFactor);
if (padding)
result.cellPadding = padding;
var borderColorSide = 'borderTopColor';
var finalScaleFactor = pxScaleFactor * scaleFactor;
var btw = style.borderTopWidth;
if (style.borderBottomWidth === btw &&
style.borderRightWidth === btw &&
style.borderLeftWidth === btw) {
var borderWidth = (parseFloat(btw) || 0) / finalScaleFactor;
if (borderWidth)
result.lineWidth = borderWidth;
}
else {
result.lineWidth = {
top: (parseFloat(style.borderTopWidth) || 0) / finalScaleFactor,
right: (parseFloat(style.borderRightWidth) || 0) / finalScaleFactor,
bottom: (parseFloat(style.borderBottomWidth) || 0) / finalScaleFactor,
left: (parseFloat(style.borderLeftWidth) || 0) / finalScaleFactor,
};
// Choose border color of first available side
// could be improved by supporting object as lineColor
if (!result.lineWidth.top) {
if (result.lineWidth.right) {
borderColorSide = 'borderRightColor';
}
else if (result.lineWidth.bottom) {
borderColorSide = 'borderBottomColor';
}
else if (result.lineWidth.left) {
borderColorSide = 'borderLeftColor';
}
}
}
var borderColor = parseColor(element, function (elem) {
return window.getComputedStyle(elem)[borderColorSide];
});
if (borderColor != null)
result.lineColor = borderColor;
var accepted = ['left', 'right', 'center', 'justify'];
if (accepted.indexOf(style.textAlign) !== -1) {
result.halign = style.textAlign;
}
accepted = ['middle', 'bottom', 'top'];
if (accepted.indexOf(style.verticalAlign) !== -1) {
result.valign = style.verticalAlign;
}
var res = parseInt(style.fontSize || '');
if (!isNaN(res))
result.fontSize = res / pxScaleFactor;
var fontStyle = parseFontStyle(style);
if (fontStyle)
result.fontStyle = fontStyle;
var font = (style.fontFamily || '').toLowerCase();
if (supportedFonts.indexOf(font) !== -1) {
result.font = font;
}
return result;
}
exports.parseCss = parseCss;
function parseFontStyle(style) {
var res = '';
if (style.fontWeight === 'bold' ||
style.fontWeight === 'bolder' ||
parseInt(style.fontWeight) >= 700) {
res = 'bold';
}
if (style.fontStyle === 'italic' || style.fontStyle === 'oblique') {
res += 'italic';
}
return res;
}
function parseColor(element, styleGetter) {
var cssColor = realColor(element, styleGetter);
if (!cssColor)
return null;
var rgba = cssColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d*\.?\d*))?\)$/);
if (!rgba || !Array.isArray(rgba)) {
return null;
}
var color = [
parseInt(rgba[1]),
parseInt(rgba[2]),
parseInt(rgba[3]),
];
var alpha = parseInt(rgba[4]);
if (alpha === 0 || isNaN(color[0]) || isNaN(color[1]) || isNaN(color[2])) {
return null;
}
return color;
}
function realColor(elem, styleGetter) {
var bg = styleGetter(elem);
if (bg === 'rgba(0, 0, 0, 0)' ||
bg === 'transparent' ||
bg === 'initial' ||
bg === 'inherit') {
if (elem.parentElement == null) {
return null;
}
return realColor(elem.parentElement, styleGetter);
}
else {
return bg;
}
}
function parsePadding(style, scaleFactor) {
var val = [
style.paddingTop,
style.paddingRight,
style.paddingBottom,
style.paddingLeft,
];
var pxScaleFactor = 96 / (72 / scaleFactor);
var linePadding = (parseInt(style.lineHeight) - parseInt(style.fontSize)) / scaleFactor / 2;
var inputPadding = val.map(function (n) {
return parseInt(n || '0') / pxScaleFactor;
});
var padding = (0, common_1.parseSpacing)(inputPadding, 0);
if (linePadding > padding.top) {
padding.top = linePadding;
}
if (linePadding > padding.bottom) {
padding.bottom = linePadding;
}
return padding;
}
/***/ }),
/***/ 744:
/***/ (function(__unused_webpack_module, exports) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.DocHandler = void 0;
var globalDefaults = {};
var DocHandler = /** @class */ (function () {
function DocHandler(jsPDFDocument) {
this.jsPDFDocument = jsPDFDocument;
this.userStyles = {
// Black for versions of jspdf without getTextColor
textColor: jsPDFDocument.getTextColor
? this.jsPDFDocument.getTextColor()
: 0,
fontSize: jsPDFDocument.internal.getFontSize(),
fontStyle: jsPDFDocument.internal.getFont().fontStyle,
font: jsPDFDocument.internal.getFont().fontName,
// 0 for versions of jspdf without getLineWidth
lineWidth: jsPDFDocument.getLineWidth
? this.jsPDFDocument.getLineWidth()
: 0,
// Black for versions of jspdf without getDrawColor
lineColor: jsPDFDocument.getDrawColor
? this.jsPDFDocument.getDrawColor()
: 0,
};
}
DocHandler.setDefaults = function (defaults, doc) {
if (doc === void 0) { doc = null; }
if (doc) {
doc.__autoTableDocumentDefaults = defaults;
}
else {
globalDefaults = defaults;
}
};
DocHandler.unifyColor = function (c) {
if (Array.isArray(c)) {
return c;
}
else if (typeof c === 'number') {
return [c, c, c];
}
else if (typeof c === 'string') {
return [c];
}
else {
return null;
}
};
DocHandler.prototype.applyStyles = function (styles, fontOnly) {
// Font style needs to be applied before font
// https://github.com/simonbengtsson/jsPDF-AutoTable/issues/632
var _a, _b, _c;
if (fontOnly === void 0) { fontOnly = false; }
if (styles.fontStyle)
this.jsPDFDocument.setFontStyle &&
this.jsPDFDocument.setFontStyle(styles.fontStyle);
var _d = this.jsPDFDocument.internal.getFont(), fontStyle = _d.fontStyle, fontName = _d.fontName;
if (styles.font)
fontName = styles.font;
if (styles.fontStyle) {
fontStyle = styles.fontStyle;
var availableFontStyles = this.getFontList()[fontName];
if (availableFontStyles &&
availableFontStyles.indexOf(fontStyle) === -1) {
// Common issue was that the default bold in headers
// made custom fonts not work. For example:
// https://github.com/simonbengtsson/jsPDF-AutoTable/issues/653
this.jsPDFDocument.setFontStyle &&
this.jsPDFDocument.setFontStyle(availableFontStyles[0]);
fontStyle = availableFontStyles[0];
}
}
this.jsPDFDocument.setFont(fontName, fontStyle);
if (styles.fontSize)
this.jsPDFDocument.setFontSize(styles.fontSize);
if (fontOnly) {
return; // Performance improvement
}
var color = DocHandler.unifyColor(styles.fillColor);
if (color)
(_a = this.jsPDFDocument).setFillColor.apply(_a, color);
color = DocHandler.unifyColor(styles.textColor);
if (color)
(_b = this.jsPDFDocument).setTextColor.apply(_b, color);
color = DocHandler.unifyColor(styles.lineColor);
if (color)
(_c = this.jsPDFDocument).setDrawColor.apply(_c, color);
if (typeof styles.lineWidth === 'number') {
this.jsPDFDocument.setLineWidth(styles.lineWidth);
}
};
DocHandler.prototype.splitTextToSize = function (text, size, opts) {
return this.jsPDFDocument.splitTextToSize(text, size, opts);
};
/**
* Adds a rectangle to the PDF
* @param x Coordinate (in units declared at inception of PDF document) against left edge of the page
* @param y Coordinate (in units declared at inception of PDF document) against upper edge of the page
* @param width Width (in units declared at inception of PDF document)
* @param height Height (in units declared at inception of PDF document)
* @param fillStyle A string specifying the painting style or null. Valid styles include: 'S' [default] - stroke, 'F' - fill, and 'DF' (or 'FD') - fill then stroke.
*/
DocHandler.prototype.rect = function (x, y, width, height, fillStyle) {
// null is excluded from fillStyle possible values because it isn't needed
// and is prone to bugs as it's used to postpone setting the style
// https://rawgit.com/MrRio/jsPDF/master/docs/jsPDF.html#rect
return this.jsPDFDocument.rect(x, y, width, height, fillStyle);
};
DocHandler.prototype.getLastAutoTable = function () {
return this.jsPDFDocument.lastAutoTable || null;
};
DocHandler.prototype.getTextWidth = function (text) {
return this.jsPDFDocument.getTextWidth(text);
};
DocHandler.prototype.getDocument = function () {
return this.jsPDFDocument;
};
DocHandler.prototype.setPage = function (page) {
this.jsPDFDocument.setPage(page);
};
DocHandler.prototype.addPage = function () {
return this.jsPDFDocument.addPage();
};
DocHandler.prototype.getFontList = function () {
return this.jsPDFDocument.getFontList();
};
DocHandler.prototype.getGlobalOptions = function () {
return globalDefaults || {};
};
DocHandler.prototype.getDocumentOptions = function () {
return this.jsPDFDocument.__autoTableDocumentDefaults || {};
};
DocHandler.prototype.pageSize = function () {
var pageSize = this.jsPDFDocument.internal.pageSize;
// JSPDF 1.4 uses get functions instead of properties on pageSize
if (pageSize.width == null) {
pageSize = {
width: pageSize.getWidth(),
height: pageSize.getHeight(),
};
}
return pageSize;
};
DocHandler.prototype.scaleFactor = function () {
return this.jsPDFDocument.internal.scaleFactor;
};
DocHandler.prototype.getLineHeightFactor = function () {
var doc = this.jsPDFDocument;
return doc.getLineHeightFactor ? doc.getLineHeightFactor() : 1.15;
};
DocHandler.prototype.getLineHeight = function (fontSize) {
return (fontSize / this.scaleFactor()) * this.getLineHeightFactor();
};
DocHandler.prototype.pageNumber = function () {
var pageInfo = this.jsPDFDocument.internal.getCurrentPageInfo();
if (!pageInfo) {
// Only recent versions of jspdf has pageInfo
return this.jsPDFDocument.internal.getNumberOfPages();
}
return pageInfo.pageNumber;
};
return DocHandler;
}());
exports.DocHandler = DocHandler;
/***/ }),
/***/ 4:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_27704__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.parseHtml = void 0;
var cssParser_1 = __nested_webpack_require_27704__(903);
var config_1 = __nested_webpack_require_27704__(796);
function parseHtml(doc, input, window, includeHiddenHtml, useCss) {
var _a, _b;
if (includeHiddenHtml === void 0) { includeHiddenHtml = false; }
if (useCss === void 0) { useCss = false; }
var tableElement;
if (typeof input === 'string') {
tableElement = window.document.querySelector(input);
}
else {
tableElement = input;
}
var supportedFonts = Object.keys(doc.getFontList());
var scaleFactor = doc.scaleFactor();
var head = [], body = [], foot = [];
if (!tableElement) {
console.error('Html table could not be found with input: ', input);
return { head: head, body: body, foot: foot };
}
for (var i = 0; i < tableElement.rows.length; i++) {
var element = tableElement.rows[i];
var tagName = (_b = (_a = element === null || element === void 0 ? void 0 : element.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase();
var row = parseRowContent(supportedFonts, scaleFactor, window, element, includeHiddenHtml, useCss);
if (!row)
continue;
if (tagName === 'thead') {
head.push(row);
}
else if (tagName === 'tfoot') {
foot.push(row);
}
else {
// Add to body both if parent is tbody or table
body.push(row);
}
}
return { head: head, body: body, foot: foot };
}
exports.parseHtml = parseHtml;
function parseRowContent(supportedFonts, scaleFactor, window, row, includeHidden, useCss) {
var resultRow = new config_1.HtmlRowInput(row);
for (var i = 0; i < row.cells.length; i++) {
var cell = row.cells[i];
var style_1 = window.getComputedStyle(cell);
if (includeHidden || style_1.display !== 'none') {
var cellStyles = void 0;
if (useCss) {
cellStyles = (0, cssParser_1.parseCss)(supportedFonts, cell, scaleFactor, style_1, window);
}
resultRow.push({
rowSpan: cell.rowSpan,
colSpan: cell.colSpan,
styles: cellStyles,
_element: cell,
content: parseCellContent(cell),
});
}
}
var style = window.getComputedStyle(row);
if (resultRow.length > 0 && (includeHidden || style.display !== 'none')) {
return resultRow;
}
}
function parseCellContent(orgCell) {
// Work on cloned node to make sure no changes are applied to html table
var cell = orgCell.cloneNode(true);
// Remove extra space and line breaks in markup to make it more similar to
// what would be shown in html
cell.innerHTML = cell.innerHTML.replace(/\n/g, '').replace(/ +/g, ' ');
// Preserve
tags as line breaks in the pdf
cell.innerHTML = cell.innerHTML
.split(//) //start with '
'.
.map(function (part) { return part.trim(); })
.join('\n');
// innerText for ie
return cell.innerText || cell.textContent || '';
}
/***/ }),
/***/ 776:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_31057__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.parseInput = void 0;
var htmlParser_1 = __nested_webpack_require_31057__(4);
var polyfills_1 = __nested_webpack_require_31057__(356);
var common_1 = __nested_webpack_require_31057__(420);
var documentHandler_1 = __nested_webpack_require_31057__(744);
var inputValidator_1 = __nested_webpack_require_31057__(792);
function parseInput(d, current) {
var doc = new documentHandler_1.DocHandler(d);
var document = doc.getDocumentOptions();
var global = doc.getGlobalOptions();
(0, inputValidator_1.default)(doc, global, document, current);
var options = (0, polyfills_1.assign)({}, global, document, current);
var win;
if (typeof window !== 'undefined') {
win = window;
}
var styles = parseStyles(global, document, current);
var hooks = parseHooks(global, document, current);
var settings = parseSettings(doc, options);
var content = parseContent(doc, options, win);
return {
id: current.tableId,
content: content,
hooks: hooks,
styles: styles,
settings: settings,
};
}
exports.parseInput = parseInput;
function parseStyles(gInput, dInput, cInput) {
var styleOptions = {
styles: {},
headStyles: {},
bodyStyles: {},
footStyles: {},
alternateRowStyles: {},
columnStyles: {},
};
var _loop_1 = function (prop) {
if (prop === 'columnStyles') {
var global_1 = gInput[prop];
var document_1 = dInput[prop];
var current = cInput[prop];
styleOptions.columnStyles = (0, polyfills_1.assign)({}, global_1, document_1, current);
}
else {
var allOptions = [gInput, dInput, cInput];
var styles = allOptions.map(function (opts) { return opts[prop] || {}; });
styleOptions[prop] = (0, polyfills_1.assign)({}, styles[0], styles[1], styles[2]);
}
};
for (var _i = 0, _a = Object.keys(styleOptions); _i < _a.length; _i++) {
var prop = _a[_i];
_loop_1(prop);
}
return styleOptions;
}
function parseHooks(global, document, current) {
var allOptions = [global, document, current];
var result = {
didParseCell: [],
willDrawCell: [],
didDrawCell: [],
willDrawPage: [],
didDrawPage: [],
};
for (var _i = 0, allOptions_1 = allOptions; _i < allOptions_1.length; _i++) {
var options = allOptions_1[_i];
if (options.didParseCell)
result.didParseCell.push(options.didParseCell);
if (options.willDrawCell)
result.willDrawCell.push(options.willDrawCell);
if (options.didDrawCell)
result.didDrawCell.push(options.didDrawCell);
if (options.willDrawPage)
result.willDrawPage.push(options.willDrawPage);
if (options.didDrawPage)
result.didDrawPage.push(options.didDrawPage);
}
return result;
}
function parseSettings(doc, options) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
var margin = (0, common_1.parseSpacing)(options.margin, 40 / doc.scaleFactor());
var startY = (_a = getStartY(doc, options.startY)) !== null && _a !== void 0 ? _a : margin.top;
var showFoot;
if (options.showFoot === true) {
showFoot = 'everyPage';
}
else if (options.showFoot === false) {
showFoot = 'never';
}
else {
showFoot = (_b = options.showFoot) !== null && _b !== void 0 ? _b : 'everyPage';
}
var showHead;
if (options.showHead === true) {
showHead = 'everyPage';
}
else if (options.showHead === false) {
showHead = 'never';
}
else {
showHead = (_c = options.showHead) !== null && _c !== void 0 ? _c : 'everyPage';
}
var useCss = (_d = options.useCss) !== null && _d !== void 0 ? _d : false;
var theme = options.theme || (useCss ? 'plain' : 'striped');
var horizontalPageBreak = !!options.horizontalPageBreak;
var horizontalPageBreakRepeat = (_e = options.horizontalPageBreakRepeat) !== null && _e !== void 0 ? _e : null;
return {
includeHiddenHtml: (_f = options.includeHiddenHtml) !== null && _f !== void 0 ? _f : false,
useCss: useCss,
theme: theme,
startY: startY,
margin: margin,
pageBreak: (_g = options.pageBreak) !== null && _g !== void 0 ? _g : 'auto',
rowPageBreak: (_h = options.rowPageBreak) !== null && _h !== void 0 ? _h : 'auto',
tableWidth: (_j = options.tableWidth) !== null && _j !== void 0 ? _j : 'auto',
showHead: showHead,
showFoot: showFoot,
tableLineWidth: (_k = options.tableLineWidth) !== null && _k !== void 0 ? _k : 0,
tableLineColor: (_l = options.tableLineColor) !== null && _l !== void 0 ? _l : 200,
horizontalPageBreak: horizontalPageBreak,
horizontalPageBreakRepeat: horizontalPageBreakRepeat,
horizontalPageBreakBehaviour: (_m = options.horizontalPageBreakBehaviour) !== null && _m !== void 0 ? _m : 'afterAllRows',
};
}
function getStartY(doc, userStartY) {
var previous = doc.getLastAutoTable();
var sf = doc.scaleFactor();
var currentPage = doc.pageNumber();
var isSamePageAsPreviousTable = false;
if (previous && previous.startPageNumber) {
var endingPage = previous.startPageNumber + previous.pageNumber - 1;
isSamePageAsPreviousTable = endingPage === currentPage;
}
if (typeof userStartY === 'number') {
return userStartY;
}
else if (userStartY == null || userStartY === false) {
if (isSamePageAsPreviousTable && (previous === null || previous === void 0 ? void 0 : previous.finalY) != null) {
// Some users had issues with overlapping tables when they used multiple
// tables without setting startY so setting it here to a sensible default.
return previous.finalY + 20 / sf;
}
}
return null;
}
function parseContent(doc, options, window) {
var head = options.head || [];
var body = options.body || [];
var foot = options.foot || [];
if (options.html) {
var hidden = options.includeHiddenHtml;
if (window) {
var htmlContent = (0, htmlParser_1.parseHtml)(doc, options.html, window, hidden, options.useCss) || {};
head = htmlContent.head || head;
body = htmlContent.body || head;
foot = htmlContent.foot || head;
}
else {
console.error('Cannot parse html in non browser environment');
}
}
var columns = options.columns || parseColumns(head, body, foot);
return {
columns: columns,
head: head,
body: body,
foot: foot,
};
}
function parseColumns(head, body, foot) {
var firstRow = head[0] || body[0] || foot[0] || [];
var result = [];
Object.keys(firstRow)
.filter(function (key) { return key !== '_element'; })
.forEach(function (key) {
var colSpan = 1;
var input;
if (Array.isArray(firstRow)) {
input = firstRow[parseInt(key)];
}
else {
input = firstRow[key];
}
if (typeof input === 'object' && !Array.isArray(input)) {
colSpan = (input === null || input === void 0 ? void 0 : input.colSpan) || 1;
}
for (var i = 0; i < colSpan; i++) {
var id = void 0;
if (Array.isArray(firstRow)) {
id = result.length;
}
else {
id = key + (i > 0 ? "_".concat(i) : '');
}
var rowResult = { dataKey: id };
result.push(rowResult);
}
});
return result;
}
/***/ }),
/***/ 792:
/***/ (function(__unused_webpack_module, exports) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
function default_1(doc, global, document, current) {
var _loop_1 = function (options) {
if (options && typeof options !== 'object') {
console.error('The options parameter should be of type object, is: ' + typeof options);
}
if (typeof options.extendWidth !== 'undefined') {
options.tableWidth = options.extendWidth ? 'auto' : 'wrap';
console.error('Use of deprecated option: extendWidth, use tableWidth instead.');
}
if (typeof options.margins !== 'undefined') {
if (typeof options.margin === 'undefined')
options.margin = options.margins;
console.error('Use of deprecated option: margins, use margin instead.');
}
if (options.startY && typeof options.startY !== 'number') {
console.error('Invalid value for startY option', options.startY);
delete options.startY;
}
if (!options.didDrawPage &&
(options.afterPageContent ||
options.beforePageContent ||
options.afterPageAdd)) {
console.error('The afterPageContent, beforePageContent and afterPageAdd hooks are deprecated. Use didDrawPage instead');
options.didDrawPage = function (data) {
doc.applyStyles(doc.userStyles);
if (options.beforePageContent)
options.beforePageContent(data);
doc.applyStyles(doc.userStyles);
if (options.afterPageContent)
options.afterPageContent(data);
doc.applyStyles(doc.userStyles);
if (options.afterPageAdd && data.pageNumber > 1) {
;
data.afterPageAdd(data);
}
doc.applyStyles(doc.userStyles);
};
}
;
[
'createdHeaderCell',
'drawHeaderRow',
'drawRow',
'drawHeaderCell',
].forEach(function (name) {
if (options[name]) {
console.error("The \"".concat(name, "\" hook has changed in version 3.0, check the changelog for how to migrate."));
}
});
[
['showFoot', 'showFooter'],
['showHead', 'showHeader'],
['didDrawPage', 'addPageContent'],
['didParseCell', 'createdCell'],
['headStyles', 'headerStyles'],
].forEach(function (_a) {
var current = _a[0], deprecated = _a[1];
if (options[deprecated]) {
console.error("Use of deprecated option ".concat(deprecated, ". Use ").concat(current, " instead"));
options[current] = options[deprecated];
}
});
[
['padding', 'cellPadding'],
['lineHeight', 'rowHeight'],
'fontSize',
'overflow',
].forEach(function (o) {
var deprecatedOption = typeof o === 'string' ? o : o[0];
var style = typeof o === 'string' ? o : o[1];
if (typeof options[deprecatedOption] !== 'undefined') {
if (typeof options.styles[style] === 'undefined') {
options.styles[style] = options[deprecatedOption];
}
console.error('Use of deprecated option: ' +
deprecatedOption +
', use the style ' +
style +
' instead.');
}
});
for (var _b = 0, _c = [
'styles',
'bodyStyles',
'headStyles',
'footStyles',
]; _b < _c.length; _b++) {
var styleProp = _c[_b];
checkStyles(options[styleProp] || {});
}
var columnStyles = options['columnStyles'] || {};
for (var _d = 0, _e = Object.keys(columnStyles); _d < _e.length; _d++) {
var key = _e[_d];
checkStyles(columnStyles[key] || {});
}
};
for (var _i = 0, _a = [global, document, current]; _i < _a.length; _i++) {
var options = _a[_i];
_loop_1(options);
}
}
exports["default"] = default_1;
function checkStyles(styles) {
if (styles.rowHeight) {
console.error('Use of deprecated style rowHeight. It is renamed to minCellHeight.');
if (!styles.minCellHeight) {
styles.minCellHeight = styles.rowHeight;
}
}
else if (styles.columnWidth) {
console.error('Use of deprecated style columnWidth. It is renamed to cellWidth.');
if (!styles.cellWidth) {
styles.cellWidth = styles.columnWidth;
}
}
}
/***/ }),
/***/ 260:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_43707__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.Column = exports.Cell = exports.Row = exports.Table = void 0;
var config_1 = __nested_webpack_require_43707__(796);
var HookData_1 = __nested_webpack_require_43707__(172);
var common_1 = __nested_webpack_require_43707__(420);
var Table = /** @class */ (function () {
function Table(input, content) {
this.pageNumber = 1;
// Deprecated, use pageNumber instead
// Not using getter since:
// https://github.com/simonbengtsson/jsPDF-AutoTable/issues/596
this.pageCount = 1;
this.id = input.id;
this.settings = input.settings;
this.styles = input.styles;
this.hooks = input.hooks;
this.columns = content.columns;
this.head = content.head;
this.body = content.body;
this.foot = content.foot;
}
Table.prototype.getHeadHeight = function (columns) {
return this.head.reduce(function (acc, row) { return acc + row.getMaxCellHeight(columns); }, 0);
};
Table.prototype.getFootHeight = function (columns) {
return this.foot.reduce(function (acc, row) { return acc + row.getMaxCellHeight(columns); }, 0);
};
Table.prototype.allRows = function () {
return this.head.concat(this.body).concat(this.foot);
};
Table.prototype.callCellHooks = function (doc, handlers, cell, row, column, cursor) {
for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) {
var handler = handlers_1[_i];
var data = new HookData_1.CellHookData(doc, this, cell, row, column, cursor);
var result = handler(data) === false;
// Make sure text is always string[] since user can assign string
cell.text = Array.isArray(cell.text) ? cell.text : [cell.text];
if (result) {
return false;
}
}
return true;
};
Table.prototype.callEndPageHooks = function (doc, cursor) {
doc.applyStyles(doc.userStyles);
for (var _i = 0, _a = this.hooks.didDrawPage; _i < _a.length; _i++) {
var handler = _a[_i];
handler(new HookData_1.HookData(doc, this, cursor));
}
};
Table.prototype.callWillDrawPageHooks = function (doc, cursor) {
for (var _i = 0, _a = this.hooks.willDrawPage; _i < _a.length; _i++) {
var handler = _a[_i];
handler(new HookData_1.HookData(doc, this, cursor));
}
};
Table.prototype.getWidth = function (pageWidth) {
if (typeof this.settings.tableWidth === 'number') {
return this.settings.tableWidth;
}
else if (this.settings.tableWidth === 'wrap') {
var wrappedWidth = this.columns.reduce(function (total, col) { return total + col.wrappedWidth; }, 0);
return wrappedWidth;
}
else {
var margin = this.settings.margin;
return pageWidth - margin.left - margin.right;
}
};
return Table;
}());
exports.Table = Table;
var Row = /** @class */ (function () {
function Row(raw, index, section, cells, spansMultiplePages) {
if (spansMultiplePages === void 0) { spansMultiplePages = false; }
this.height = 0;
this.raw = raw;
if (raw instanceof config_1.HtmlRowInput) {
this.raw = raw._element;
this.element = raw._element;
}
this.index = index;
this.section = section;
this.cells = cells;
this.spansMultiplePages = spansMultiplePages;
}
Row.prototype.getMaxCellHeight = function (columns) {
var _this = this;
return columns.reduce(function (acc, column) { var _a; return Math.max(acc, ((_a = _this.cells[column.index]) === null || _a === void 0 ? void 0 : _a.height) || 0); }, 0);
};
Row.prototype.hasRowSpan = function (columns) {
var _this = this;
return (columns.filter(function (column) {
var cell = _this.cells[column.index];
if (!cell)
return false;
return cell.rowSpan > 1;
}).length > 0);
};
Row.prototype.canEntireRowFit = function (height, columns) {
return this.getMaxCellHeight(columns) <= height;
};
Row.prototype.getMinimumRowHeight = function (columns, doc) {
var _this = this;
return columns.reduce(function (acc, column) {
var cell = _this.cells[column.index];
if (!cell)
return 0;
var lineHeight = doc.getLineHeight(cell.styles.fontSize);
var vPadding = cell.padding('vertical');
var oneRowHeight = vPadding + lineHeight;
return oneRowHeight > acc ? oneRowHeight : acc;
}, 0);
};
return Row;
}());
exports.Row = Row;
var Cell = /** @class */ (function () {
function Cell(raw, styles, section) {
var _a, _b;
this.contentHeight = 0;
this.contentWidth = 0;
this.wrappedWidth = 0;
this.minReadableWidth = 0;
this.minWidth = 0;
this.width = 0;
this.height = 0;
this.x = 0;
this.y = 0;
this.styles = styles;
this.section = section;
this.raw = raw;
var content = raw;
if (raw != null && typeof raw === 'object' && !Array.isArray(raw)) {
this.rowSpan = raw.rowSpan || 1;
this.colSpan = raw.colSpan || 1;
content = (_b = (_a = raw.content) !== null && _a !== void 0 ? _a : raw.title) !== null && _b !== void 0 ? _b : raw;
if (raw._element) {
this.raw = raw._element;
}
}
else {
this.rowSpan = 1;
this.colSpan = 1;
}
// Stringify 0 and false, but not undefined or null
var text = content != null ? '' + content : '';
var splitRegex = /\r\n|\r|\n/g;
this.text = text.split(splitRegex);
}
Cell.prototype.getTextPos = function () {
var y;
if (this.styles.valign === 'top') {
y = this.y + this.padding('top');
}
else if (this.styles.valign === 'bottom') {
y = this.y + this.height - this.padding('bottom');
}
else {
var netHeight = this.height - this.padding('vertical');
y = this.y + netHeight / 2 + this.padding('top');
}
var x;
if (this.styles.halign === 'right') {
x = this.x + this.width - this.padding('right');
}
else if (this.styles.halign === 'center') {
var netWidth = this.width - this.padding('horizontal');
x = this.x + netWidth / 2 + this.padding('left');
}
else {
x = this.x + this.padding('left');
}
return { x: x, y: y };
};
// TODO (v4): replace parameters with only (lineHeight)
Cell.prototype.getContentHeight = function (scaleFactor, lineHeightFactor) {
if (lineHeightFactor === void 0) { lineHeightFactor = 1.15; }
var lineCount = Array.isArray(this.text) ? this.text.length : 1;
var lineHeight = (this.styles.fontSize / scaleFactor) * lineHeightFactor;
var height = lineCount * lineHeight + this.padding('vertical');
return Math.max(height, this.styles.minCellHeight);
};
Cell.prototype.padding = function (name) {
var padding = (0, common_1.parseSpacing)(this.styles.cellPadding, 0);
if (name === 'vertical') {
return padding.top + padding.bottom;
}
else if (name === 'horizontal') {
return padding.left + padding.right;
}
else {
return padding[name];
}
};
return Cell;
}());
exports.Cell = Cell;
var Column = /** @class */ (function () {
function Column(dataKey, raw, index) {
this.wrappedWidth = 0;
this.minReadableWidth = 0;
this.minWidth = 0;
this.width = 0;
this.dataKey = dataKey;
this.raw = raw;
this.index = index;
}
Column.prototype.getMaxCustomCellWidth = function (table) {
var max = 0;
for (var _i = 0, _a = table.allRows(); _i < _a.length; _i++) {
var row = _a[_i];
var cell = row.cells[this.index];
if (cell && typeof cell.styles.cellWidth === 'number') {
max = Math.max(max, cell.styles.cellWidth);
}
}
return max;
};
return Column;
}());
exports.Column = Column;
/***/ }),
/***/ 356:
/***/ (function(__unused_webpack_module, exports) {
/* eslint-disable @typescript-eslint/no-unused-vars */
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.assign = void 0;
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
function assign(target, s, s1, s2, s3) {
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
// eslint-disable-next-line prefer-rest-params
var nextSource = arguments[index];
if (nextSource != null) {
// Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
}
exports.assign = assign;
/***/ }),
/***/ 972:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_53379__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createTable = void 0;
var documentHandler_1 = __nested_webpack_require_53379__(744);
var models_1 = __nested_webpack_require_53379__(260);
var widthCalculator_1 = __nested_webpack_require_53379__(324);
var config_1 = __nested_webpack_require_53379__(796);
var polyfills_1 = __nested_webpack_require_53379__(356);
function createTable(jsPDFDoc, input) {
var doc = new documentHandler_1.DocHandler(jsPDFDoc);
var content = parseContent(input, doc.scaleFactor());
var table = new models_1.Table(input, content);
(0, widthCalculator_1.calculateWidths)(doc, table);
doc.applyStyles(doc.userStyles);
return table;
}
exports.createTable = createTable;
function parseContent(input, sf) {
var content = input.content;
var columns = createColumns(content.columns);
// If no head or foot is set, try generating it with content from columns
if (content.head.length === 0) {
var sectionRow = generateSectionRow(columns, 'head');
if (sectionRow)
content.head.push(sectionRow);
}
if (content.foot.length === 0) {
var sectionRow = generateSectionRow(columns, 'foot');
if (sectionRow)
content.foot.push(sectionRow);
}
var theme = input.settings.theme;
var styles = input.styles;
return {
columns: columns,
head: parseSection('head', content.head, columns, styles, theme, sf),
body: parseSection('body', content.body, columns, styles, theme, sf),
foot: parseSection('foot', content.foot, columns, styles, theme, sf),
};
}
function parseSection(sectionName, sectionRows, columns, styleProps, theme, scaleFactor) {
var rowSpansLeftForColumn = {};
var result = sectionRows.map(function (rawRow, rowIndex) {
var skippedRowForRowSpans = 0;
var cells = {};
var colSpansAdded = 0;
var columnSpansLeft = 0;
for (var _i = 0, columns_1 = columns; _i < columns_1.length; _i++) {
var column = columns_1[_i];
if (rowSpansLeftForColumn[column.index] == null ||
rowSpansLeftForColumn[column.index].left === 0) {
if (columnSpansLeft === 0) {
var rawCell = void 0;
if (Array.isArray(rawRow)) {
rawCell =
rawRow[column.index - colSpansAdded - skippedRowForRowSpans];
}
else {
rawCell = rawRow[column.dataKey];
}
var cellInputStyles = {};
if (typeof rawCell === 'object' && !Array.isArray(rawCell)) {
cellInputStyles = (rawCell === null || rawCell === void 0 ? void 0 : rawCell.styles) || {};
}
var styles = cellStyles(sectionName, column, rowIndex, theme, styleProps, scaleFactor, cellInputStyles);
var cell = new models_1.Cell(rawCell, styles, sectionName);
// dataKey is not used internally no more but keep for
// backwards compat in hooks
cells[column.dataKey] = cell;
cells[column.index] = cell;
columnSpansLeft = cell.colSpan - 1;
rowSpansLeftForColumn[column.index] = {
left: cell.rowSpan - 1,
times: columnSpansLeft,
};
}
else {
columnSpansLeft--;
colSpansAdded++;
}
}
else {
rowSpansLeftForColumn[column.index].left--;
columnSpansLeft = rowSpansLeftForColumn[column.index].times;
skippedRowForRowSpans++;
}
}
return new models_1.Row(rawRow, rowIndex, sectionName, cells);
});
return result;
}
function generateSectionRow(columns, section) {
var sectionRow = {};
columns.forEach(function (col) {
if (col.raw != null) {
var title = getSectionTitle(section, col.raw);
if (title != null)
sectionRow[col.dataKey] = title;
}
});
return Object.keys(sectionRow).length > 0 ? sectionRow : null;
}
function getSectionTitle(section, column) {
if (section === 'head') {
if (typeof column === 'object') {
return column.header || column.title || null;
}
else if (typeof column === 'string' || typeof column === 'number') {
return column;
}
}
else if (section === 'foot' && typeof column === 'object') {
return column.footer;
}
return null;
}
function createColumns(columns) {
return columns.map(function (input, index) {
var _a, _b;
var key;
if (typeof input === 'object') {
key = (_b = (_a = input.dataKey) !== null && _a !== void 0 ? _a : input.key) !== null && _b !== void 0 ? _b : index;
}
else {
key = index;
}
return new models_1.Column(key, input, index);
});
}
function cellStyles(sectionName, column, rowIndex, themeName, styles, scaleFactor, cellInputStyles) {
var theme = (0, config_1.getTheme)(themeName);
var sectionStyles;
if (sectionName === 'head') {
sectionStyles = styles.headStyles;
}
else if (sectionName === 'body') {
sectionStyles = styles.bodyStyles;
}
else if (sectionName === 'foot') {
sectionStyles = styles.footStyles;
}
var otherStyles = (0, polyfills_1.assign)({}, theme.table, theme[sectionName], styles.styles, sectionStyles);
var columnStyles = styles.columnStyles[column.dataKey] ||
styles.columnStyles[column.index] ||
{};
var colStyles = sectionName === 'body' ? columnStyles : {};
var rowStyles = sectionName === 'body' && rowIndex % 2 === 0
? (0, polyfills_1.assign)({}, theme.alternateRow, styles.alternateRowStyles)
: {};
var defaultStyle = (0, config_1.defaultStyles)(scaleFactor);
var themeStyles = (0, polyfills_1.assign)({}, defaultStyle, otherStyles, rowStyles, colStyles);
return (0, polyfills_1.assign)(themeStyles, cellInputStyles);
}
/***/ }),
/***/ 664:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_59731__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.addPage = exports.drawTable = void 0;
var common_1 = __nested_webpack_require_59731__(420);
var models_1 = __nested_webpack_require_59731__(260);
var documentHandler_1 = __nested_webpack_require_59731__(744);
var polyfills_1 = __nested_webpack_require_59731__(356);
var autoTableText_1 = __nested_webpack_require_59731__(136);
var tablePrinter_1 = __nested_webpack_require_59731__(224);
function drawTable(jsPDFDoc, table) {
var settings = table.settings;
var startY = settings.startY;
var margin = settings.margin;
var cursor = {
x: margin.left,
y: startY,
};
var sectionsHeight = table.getHeadHeight(table.columns) + table.getFootHeight(table.columns);
var minTableBottomPos = startY + margin.bottom + sectionsHeight;
if (settings.pageBreak === 'avoid') {
var rows = table.body;
var tableHeight = rows.reduce(function (acc, row) { return acc + row.height; }, 0);
minTableBottomPos += tableHeight;
}
var doc = new documentHandler_1.DocHandler(jsPDFDoc);
if (settings.pageBreak === 'always' ||
(settings.startY != null && minTableBottomPos > doc.pageSize().height)) {
nextPage(doc);
cursor.y = margin.top;
}
table.callWillDrawPageHooks(doc, cursor);
var startPos = (0, polyfills_1.assign)({}, cursor);
table.startPageNumber = doc.pageNumber();
if (settings.horizontalPageBreak) {
// managed flow for split columns
printTableWithHorizontalPageBreak(doc, table, startPos, cursor);
}
else {
// normal flow
doc.applyStyles(doc.userStyles);
if (settings.showHead === 'firstPage' ||
settings.showHead === 'everyPage') {
table.head.forEach(function (row) {
return printRow(doc, table, row, cursor, table.columns);
});
}
doc.applyStyles(doc.userStyles);
table.body.forEach(function (row, index) {
var isLastRow = index === table.body.length - 1;
printFullRow(doc, table, row, isLastRow, startPos, cursor, table.columns);
});
doc.applyStyles(doc.userStyles);
if (settings.showFoot === 'lastPage' || settings.showFoot === 'everyPage') {
table.foot.forEach(function (row) {
return printRow(doc, table, row, cursor, table.columns);
});
}
}
(0, common_1.addTableBorder)(doc, table, startPos, cursor);
table.callEndPageHooks(doc, cursor);
table.finalY = cursor.y;
jsPDFDoc.lastAutoTable = table;
jsPDFDoc.previousAutoTable = table; // Deprecated
if (jsPDFDoc.autoTable)
jsPDFDoc.autoTable.previous = table; // Deprecated
doc.applyStyles(doc.userStyles);
}
exports.drawTable = drawTable;
function printTableWithHorizontalPageBreak(doc, table, startPos, cursor) {
// calculate width of columns and render only those which can fit into page
var allColumnsCanFitResult = (0, tablePrinter_1.calculateAllColumnsCanFitInPage)(doc, table);
var settings = table.settings;
if (settings.horizontalPageBreakBehaviour === 'afterAllRows') {
allColumnsCanFitResult.forEach(function (colsAndIndexes, index) {
doc.applyStyles(doc.userStyles);
// add page to print next columns in new page
if (index > 0) {
// When adding a page here, make sure not to print the footers
// because they were already printed before on this same loop
addPage(doc, table, startPos, cursor, colsAndIndexes.columns, true);
}
else {
// print head for selected columns
printHead(doc, table, cursor, colsAndIndexes.columns);
}
// print body & footer for selected columns
printBody(doc, table, startPos, cursor, colsAndIndexes.columns);
printFoot(doc, table, cursor, colsAndIndexes.columns);
});
}
else {
var lastRowIndexOfLastPage_1 = -1;
var firstColumnsToFitResult = allColumnsCanFitResult[0];
var _loop_1 = function () {
// Print the first columns, taking note of the last row printed
var lastPrintedRowIndex = lastRowIndexOfLastPage_1;
if (firstColumnsToFitResult) {
doc.applyStyles(doc.userStyles);
var firstColumnsToFit = firstColumnsToFitResult.columns;
if (lastRowIndexOfLastPage_1 >= 0) {
// When adding a page here, make sure not to print the footers
// because they were already printed before on this same loop
addPage(doc, table, startPos, cursor, firstColumnsToFit, true);
}
else {
printHead(doc, table, cursor, firstColumnsToFit);
}
lastPrintedRowIndex = printBodyWithoutPageBreaks(doc, table, lastRowIndexOfLastPage_1 + 1, cursor, firstColumnsToFit);
printFoot(doc, table, cursor, firstColumnsToFit);
}
// Check how many rows were printed, so that the next columns would not print more rows than that
var maxNumberOfRows = lastPrintedRowIndex - lastRowIndexOfLastPage_1;
// Print the next columns, never exceding maxNumberOfRows
allColumnsCanFitResult.slice(1).forEach(function (colsAndIndexes) {
doc.applyStyles(doc.userStyles);
// When adding a page here, make sure not to print the footers
// because they were already printed before on this same loop
addPage(doc, table, startPos, cursor, colsAndIndexes.columns, true);
printBodyWithoutPageBreaks(doc, table, lastRowIndexOfLastPage_1 + 1, cursor, colsAndIndexes.columns, maxNumberOfRows);
printFoot(doc, table, cursor, colsAndIndexes.columns);
});
lastRowIndexOfLastPage_1 = lastPrintedRowIndex;
};
while (lastRowIndexOfLastPage_1 < table.body.length - 1) {
_loop_1();
}
}
}
function printHead(doc, table, cursor, columns) {
var settings = table.settings;
doc.applyStyles(doc.userStyles);
if (settings.showHead === 'firstPage' || settings.showHead === 'everyPage') {
table.head.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });
}
}
function printBody(doc, table, startPos, cursor, columns) {
doc.applyStyles(doc.userStyles);
table.body.forEach(function (row, index) {
var isLastRow = index === table.body.length - 1;
printFullRow(doc, table, row, isLastRow, startPos, cursor, columns);
});
}
function printBodyWithoutPageBreaks(doc, table, startRowIndex, cursor, columns, maxNumberOfRows) {
doc.applyStyles(doc.userStyles);
maxNumberOfRows = maxNumberOfRows !== null && maxNumberOfRows !== void 0 ? maxNumberOfRows : table.body.length;
var endRowIndex = Math.min(startRowIndex + maxNumberOfRows, table.body.length);
var lastPrintedRowIndex = -1;
table.body.slice(startRowIndex, endRowIndex).forEach(function (row, index) {
var isLastRow = startRowIndex + index === table.body.length - 1;
var remainingSpace = getRemainingPageSpace(doc, table, isLastRow, cursor);
if (row.canEntireRowFit(remainingSpace, columns)) {
printRow(doc, table, row, cursor, columns);
lastPrintedRowIndex = startRowIndex + index;
}
});
return lastPrintedRowIndex;
}
function printFoot(doc, table, cursor, columns) {
var settings = table.settings;
doc.applyStyles(doc.userStyles);
if (settings.showFoot === 'lastPage' || settings.showFoot === 'everyPage') {
table.foot.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });
}
}
function getRemainingLineCount(cell, remainingPageSpace, doc) {
var lineHeight = doc.getLineHeight(cell.styles.fontSize);
var vPadding = cell.padding('vertical');
var remainingLines = Math.floor((remainingPageSpace - vPadding) / lineHeight);
return Math.max(0, remainingLines);
}
function modifyRowToFit(row, remainingPageSpace, table, doc) {
var cells = {};
row.spansMultiplePages = true;
row.height = 0;
var rowHeight = 0;
for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {
var column = _a[_i];
var cell = row.cells[column.index];
if (!cell)
continue;
if (!Array.isArray(cell.text)) {
cell.text = [cell.text];
}
var remainderCell = new models_1.Cell(cell.raw, cell.styles, cell.section);
remainderCell = (0, polyfills_1.assign)(remainderCell, cell);
remainderCell.text = [];
var remainingLineCount = getRemainingLineCount(cell, remainingPageSpace, doc);
if (cell.text.length > remainingLineCount) {
remainderCell.text = cell.text.splice(remainingLineCount, cell.text.length);
}
var scaleFactor = doc.scaleFactor();
var lineHeightFactor = doc.getLineHeightFactor();
cell.contentHeight = cell.getContentHeight(scaleFactor, lineHeightFactor);
if (cell.contentHeight >= remainingPageSpace) {
cell.contentHeight = remainingPageSpace;
remainderCell.styles.minCellHeight -= remainingPageSpace;
}
if (cell.contentHeight > row.height) {
row.height = cell.contentHeight;
}
remainderCell.contentHeight = remainderCell.getContentHeight(scaleFactor, lineHeightFactor);
if (remainderCell.contentHeight > rowHeight) {
rowHeight = remainderCell.contentHeight;
}
cells[column.index] = remainderCell;
}
var remainderRow = new models_1.Row(row.raw, -1, row.section, cells, true);
remainderRow.height = rowHeight;
for (var _b = 0, _c = table.columns; _b < _c.length; _b++) {
var column = _c[_b];
var remainderCell = remainderRow.cells[column.index];
if (remainderCell) {
remainderCell.height = remainderRow.height;
}
var cell = row.cells[column.index];
if (cell) {
cell.height = row.height;
}
}
return remainderRow;
}
function shouldPrintOnCurrentPage(doc, row, remainingPageSpace, table) {
var pageHeight = doc.pageSize().height;
var margin = table.settings.margin;
var marginHeight = margin.top + margin.bottom;
var maxRowHeight = pageHeight - marginHeight;
if (row.section === 'body') {
// Should also take into account that head and foot is not
// on every page with some settings
maxRowHeight -=
table.getHeadHeight(table.columns) + table.getFootHeight(table.columns);
}
var minRowHeight = row.getMinimumRowHeight(table.columns, doc);
var minRowFits = minRowHeight < remainingPageSpace;
if (minRowHeight > maxRowHeight) {
console.error("Will not be able to print row ".concat(row.index, " correctly since it's minimum height is larger than page height"));
return true;
}
if (!minRowFits) {
return false;
}
var rowHasRowSpanCell = row.hasRowSpan(table.columns);
var rowHigherThanPage = row.getMaxCellHeight(table.columns) > maxRowHeight;
if (rowHigherThanPage) {
if (rowHasRowSpanCell) {
console.error("The content of row ".concat(row.index, " will not be drawn correctly since drawing rows with a height larger than the page height and has cells with rowspans is not supported."));
}
return true;
}
if (rowHasRowSpanCell) {
// Currently a new page is required whenever a rowspan row don't fit a page.
return false;
}
if (table.settings.rowPageBreak === 'avoid') {
return false;
}
// In all other cases print the row on current page
return true;
}
function printFullRow(doc, table, row, isLastRow, startPos, cursor, columns) {
var remainingSpace = getRemainingPageSpace(doc, table, isLastRow, cursor);
if (row.canEntireRowFit(remainingSpace, columns)) {
// The row fits in the current page
printRow(doc, table, row, cursor, columns);
}
else if (shouldPrintOnCurrentPage(doc, row, remainingSpace, table)) {
// The row gets split in two here, each piece in one page
var remainderRow = modifyRowToFit(row, remainingSpace, table, doc);
printRow(doc, table, row, cursor, columns);
addPage(doc, table, startPos, cursor, columns);
printFullRow(doc, table, remainderRow, isLastRow, startPos, cursor, columns);
}
else {
// The row get printed entirelly on the next page
addPage(doc, table, startPos, cursor, columns);
printFullRow(doc, table, row, isLastRow, startPos, cursor, columns);
}
}
function printRow(doc, table, row, cursor, columns) {
cursor.x = table.settings.margin.left;
for (var _i = 0, columns_1 = columns; _i < columns_1.length; _i++) {
var column = columns_1[_i];
var cell = row.cells[column.index];
if (!cell) {
cursor.x += column.width;
continue;
}
doc.applyStyles(cell.styles);
cell.x = cursor.x;
cell.y = cursor.y;
var result = table.callCellHooks(doc, table.hooks.willDrawCell, cell, row, column, cursor);
if (result === false) {
cursor.x += column.width;
continue;
}
drawCellRect(doc, cell, cursor);
var textPos = cell.getTextPos();
(0, autoTableText_1.default)(cell.text, textPos.x, textPos.y, {
halign: cell.styles.halign,
valign: cell.styles.valign,
maxWidth: Math.ceil(cell.width - cell.padding('left') - cell.padding('right')),
}, doc.getDocument());
table.callCellHooks(doc, table.hooks.didDrawCell, cell, row, column, cursor);
cursor.x += column.width;
}
cursor.y += row.height;
}
function drawCellRect(doc, cell, cursor) {
var cellStyles = cell.styles;
// https://github.com/simonbengtsson/jsPDF-AutoTable/issues/774
// TODO (v4): better solution?
doc.getDocument().setFillColor(doc.getDocument().getFillColor());
if (typeof cellStyles.lineWidth === 'number') {
// Draw cell background with normal borders
var fillStyle = (0, common_1.getFillStyle)(cellStyles.lineWidth, cellStyles.fillColor);
if (fillStyle) {
doc.rect(cell.x, cursor.y, cell.width, cell.height, fillStyle);
}
}
else if (typeof cellStyles.lineWidth === 'object') {
// Draw cell background
if (cellStyles.fillColor) {
doc.rect(cell.x, cursor.y, cell.width, cell.height, 'F');
}
// Draw cell individual borders
drawCellBorders(doc, cell, cursor, cellStyles.lineWidth);
}
}
/**
* Draw all specified borders. Borders are centered on cell's edge and lengthened
* to overlap with neighbours to create sharp corners.
* @param doc
* @param cell
* @param cursor
* @param fillColor
* @param lineWidth
*/
function drawCellBorders(doc, cell, cursor, lineWidth) {
var x1, y1, x2, y2;
if (lineWidth.top) {
x1 = cursor.x;
y1 = cursor.y;
x2 = cursor.x + cell.width;
y2 = cursor.y;
if (lineWidth.right) {
x2 += 0.5 * lineWidth.right;
}
if (lineWidth.left) {
x1 -= 0.5 * lineWidth.left;
}
drawLine(lineWidth.top, x1, y1, x2, y2);
}
if (lineWidth.bottom) {
x1 = cursor.x;
y1 = cursor.y + cell.height;
x2 = cursor.x + cell.width;
y2 = cursor.y + cell.height;
if (lineWidth.right) {
x2 += 0.5 * lineWidth.right;
}
if (lineWidth.left) {
x1 -= 0.5 * lineWidth.left;
}
drawLine(lineWidth.bottom, x1, y1, x2, y2);
}
if (lineWidth.left) {
x1 = cursor.x;
y1 = cursor.y;
x2 = cursor.x;
y2 = cursor.y + cell.height;
if (lineWidth.top) {
y1 -= 0.5 * lineWidth.top;
}
if (lineWidth.bottom) {
y2 += 0.5 * lineWidth.bottom;
}
drawLine(lineWidth.left, x1, y1, x2, y2);
}
if (lineWidth.right) {
x1 = cursor.x + cell.width;
y1 = cursor.y;
x2 = cursor.x + cell.width;
y2 = cursor.y + cell.height;
if (lineWidth.top) {
y1 -= 0.5 * lineWidth.top;
}
if (lineWidth.bottom) {
y2 += 0.5 * lineWidth.bottom;
}
drawLine(lineWidth.right, x1, y1, x2, y2);
}
function drawLine(width, x1, y1, x2, y2) {
doc.getDocument().setLineWidth(width);
doc.getDocument().line(x1, y1, x2, y2, 'S');
}
}
function getRemainingPageSpace(doc, table, isLastRow, cursor) {
var bottomContentHeight = table.settings.margin.bottom;
var showFoot = table.settings.showFoot;
if (showFoot === 'everyPage' || (showFoot === 'lastPage' && isLastRow)) {
bottomContentHeight += table.getFootHeight(table.columns);
}
return doc.pageSize().height - cursor.y - bottomContentHeight;
}
function addPage(doc, table, startPos, cursor, columns, suppressFooter) {
if (columns === void 0) { columns = []; }
if (suppressFooter === void 0) { suppressFooter = false; }
doc.applyStyles(doc.userStyles);
if (table.settings.showFoot === 'everyPage' && !suppressFooter) {
table.foot.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });
}
// Add user content just before adding new page ensure it will
// be drawn above other things on the page
table.callEndPageHooks(doc, cursor);
var margin = table.settings.margin;
(0, common_1.addTableBorder)(doc, table, startPos, cursor);
nextPage(doc);
table.pageNumber++;
table.pageCount++;
cursor.x = margin.left;
cursor.y = margin.top;
startPos.y = margin.top;
// call didAddPage hooks before any content is added to the page
table.callWillDrawPageHooks(doc, cursor);
if (table.settings.showHead === 'everyPage') {
table.head.forEach(function (row) { return printRow(doc, table, row, cursor, columns); });
doc.applyStyles(doc.userStyles);
}
}
exports.addPage = addPage;
function nextPage(doc) {
var current = doc.pageNumber();
doc.setPage(current + 1);
var newCurrent = doc.pageNumber();
if (newCurrent === current) {
doc.addPage();
return true;
}
return false;
}
/***/ }),
/***/ 224:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_78376__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.calculateAllColumnsCanFitInPage = void 0;
var common_1 = __nested_webpack_require_78376__(420);
// get columns can be fit into page
function getColumnsCanFitInPage(doc, table, config) {
var _a;
if (config === void 0) { config = {}; }
// Get page width
var remainingWidth = (0, common_1.getPageAvailableWidth)(doc, table);
// Get column data key to repeat
var repeatColumnsMap = new Map();
var colIndexes = [];
var columns = [];
var horizontalPageBreakRepeat = [];
table.settings.horizontalPageBreakRepeat;
if (Array.isArray(table.settings.horizontalPageBreakRepeat)) {
horizontalPageBreakRepeat = table.settings.horizontalPageBreakRepeat;
// It can be a single value of type string or number (even number: 0)
}
else if (typeof table.settings.horizontalPageBreakRepeat === 'string' ||
typeof table.settings.horizontalPageBreakRepeat === 'number') {
horizontalPageBreakRepeat = [table.settings.horizontalPageBreakRepeat];
}
// Code to repeat the given column in split pages
horizontalPageBreakRepeat.forEach(function (field) {
var col = table.columns.find(function (item) { return item.dataKey === field || item.index === field; });
if (col && !repeatColumnsMap.has(col.index)) {
repeatColumnsMap.set(col.index, true);
colIndexes.push(col.index);
columns.push(table.columns[col.index]);
remainingWidth -= col.wrappedWidth;
}
});
var first = true;
var i = (_a = config === null || config === void 0 ? void 0 : config.start) !== null && _a !== void 0 ? _a : 0; // make sure couter is initiated outside the loop
while (i < table.columns.length) {
// Prevent duplicates
if (repeatColumnsMap.has(i)) {
i++;
continue;
}
var colWidth = table.columns[i].wrappedWidth;
// Take at least one column even if it doesn't fit
if (first || remainingWidth >= colWidth) {
first = false;
colIndexes.push(i);
columns.push(table.columns[i]);
remainingWidth -= colWidth;
}
else {
break;
}
i++;
}
return { colIndexes: colIndexes, columns: columns, lastIndex: i - 1 };
}
function calculateAllColumnsCanFitInPage(doc, table) {
var allResults = [];
for (var i = 0; i < table.columns.length; i++) {
var result = getColumnsCanFitInPage(doc, table, { start: i });
if (result.columns.length) {
allResults.push(result);
i = result.lastIndex;
}
}
return allResults;
}
exports.calculateAllColumnsCanFitInPage = calculateAllColumnsCanFitInPage;
/***/ }),
/***/ 324:
/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_81264__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ellipsize = exports.resizeColumns = exports.calculateWidths = void 0;
var common_1 = __nested_webpack_require_81264__(420);
/**
* Calculate the column widths
*/
function calculateWidths(doc, table) {
calculate(doc, table);
var resizableColumns = [];
var initialTableWidth = 0;
table.columns.forEach(function (column) {
var customWidth = column.getMaxCustomCellWidth(table);
if (customWidth) {
// final column width
column.width = customWidth;
}
else {
// initial column width (will be resized)
column.width = column.wrappedWidth;
resizableColumns.push(column);
}
initialTableWidth += column.width;
});
// width difference that needs to be distributed
var resizeWidth = table.getWidth(doc.pageSize().width) - initialTableWidth;
// first resize attempt: with respect to minReadableWidth and minWidth
if (resizeWidth) {
resizeWidth = resizeColumns(resizableColumns, resizeWidth, function (column) {
return Math.max(column.minReadableWidth, column.minWidth);
});
}
// second resize attempt: ignore minReadableWidth but respect minWidth
if (resizeWidth) {
resizeWidth = resizeColumns(resizableColumns, resizeWidth, function (column) { return column.minWidth; });
}
resizeWidth = Math.abs(resizeWidth);
if (!table.settings.horizontalPageBreak &&
resizeWidth > 0.1 / doc.scaleFactor()) {
// Table can't get smaller due to custom-width or minWidth restrictions
// We can't really do much here. Up to user to for example
// reduce font size, increase page size or remove custom cell widths
// to allow more columns to be reduced in size
resizeWidth = resizeWidth < 1 ? resizeWidth : Math.round(resizeWidth);
console.warn("Of the table content, ".concat(resizeWidth, " units width could not fit page"));
}
applyColSpans(table);
fitContent(table, doc);
applyRowSpans(table);
}
exports.calculateWidths = calculateWidths;
function calculate(doc, table) {
var sf = doc.scaleFactor();
var horizontalPageBreak = table.settings.horizontalPageBreak;
var availablePageWidth = (0, common_1.getPageAvailableWidth)(doc, table);
table.allRows().forEach(function (row) {
for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {
var column = _a[_i];
var cell = row.cells[column.index];
if (!cell)
continue;
var hooks = table.hooks.didParseCell;
table.callCellHooks(doc, hooks, cell, row, column, null);
var padding = cell.padding('horizontal');
cell.contentWidth = (0, common_1.getStringWidth)(cell.text, cell.styles, doc) + padding;
// Using [^\S\u00A0] instead of \s ensures that we split the text on all
// whitespace except non-breaking spaces (\u00A0). We need to preserve
// them in the split process to ensure correct word separation and width
// calculation.
var longestWordWidth = (0, common_1.getStringWidth)(cell.text.join(' ').split(/[^\S\u00A0]+/), cell.styles, doc);
cell.minReadableWidth = longestWordWidth + cell.padding('horizontal');
if (typeof cell.styles.cellWidth === 'number') {
cell.minWidth = cell.styles.cellWidth;
cell.wrappedWidth = cell.styles.cellWidth;
}
else if (cell.styles.cellWidth === 'wrap' ||
horizontalPageBreak === true) {
// cell width should not be more than available page width
if (cell.contentWidth > availablePageWidth) {
cell.minWidth = availablePageWidth;
cell.wrappedWidth = availablePageWidth;
}
else {
cell.minWidth = cell.contentWidth;
cell.wrappedWidth = cell.contentWidth;
}
}
else {
// auto
var defaultMinWidth = 10 / sf;
cell.minWidth = cell.styles.minCellWidth || defaultMinWidth;
cell.wrappedWidth = cell.contentWidth;
if (cell.minWidth > cell.wrappedWidth) {
cell.wrappedWidth = cell.minWidth;
}
}
}
});
table.allRows().forEach(function (row) {
for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {
var column = _a[_i];
var cell = row.cells[column.index];
// For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.
// Could probably be improved upon however.
if (cell && cell.colSpan === 1) {
column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);
column.minWidth = Math.max(column.minWidth, cell.minWidth);
column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);
}
else {
// Respect cellWidth set in columnStyles even if there is no cells for this column
// or if the column only have colspan cells. Since the width of colspan cells
// does not affect the width of columns, setting columnStyles cellWidth enables the
// user to at least do it manually.
// Note that this is not perfect for now since for example row and table styles are
// not accounted for
var columnStyles = table.styles.columnStyles[column.dataKey] ||
table.styles.columnStyles[column.index] ||
{};
var cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;
if (cellWidth && typeof cellWidth === 'number') {
column.minWidth = cellWidth;
column.wrappedWidth = cellWidth;
}
}
if (cell) {
// Make sure all columns get at least min width even though width calculations are not based on them
if (cell.colSpan > 1 && !column.minWidth) {
column.minWidth = cell.minWidth;
}
if (cell.colSpan > 1 && !column.wrappedWidth) {
column.wrappedWidth = cell.minWidth;
}
}
}
});
}
/**
* Distribute resizeWidth on passed resizable columns
*/
function resizeColumns(columns, resizeWidth, getMinWidth) {
var initialResizeWidth = resizeWidth;
var sumWrappedWidth = columns.reduce(function (acc, column) { return acc + column.wrappedWidth; }, 0);
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
var ratio = column.wrappedWidth / sumWrappedWidth;
var suggestedChange = initialResizeWidth * ratio;
var suggestedWidth = column.width + suggestedChange;
var minWidth = getMinWidth(column);
var newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;
resizeWidth -= newWidth - column.width;
column.width = newWidth;
}
resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;
// Run the resizer again if there's remaining width needs
// to be distributed and there're columns that can be resized
if (resizeWidth) {
var resizableColumns = columns.filter(function (column) {
return resizeWidth < 0
? column.width > getMinWidth(column) // check if column can shrink
: true; // check if column can grow
});
if (resizableColumns.length) {
resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);
}
}
return resizeWidth;
}
exports.resizeColumns = resizeColumns;
function applyRowSpans(table) {
var rowSpanCells = {};
var colRowSpansLeft = 1;
var all = table.allRows();
for (var rowIndex = 0; rowIndex < all.length; rowIndex++) {
var row = all[rowIndex];
for (var _i = 0, _a = table.columns; _i < _a.length; _i++) {
var column = _a[_i];
var data = rowSpanCells[column.index];
if (colRowSpansLeft > 1) {
colRowSpansLeft--;
delete row.cells[column.index];
}
else if (data) {
data.cell.height += row.height;
colRowSpansLeft = data.cell.colSpan;
delete row.cells[column.index];
data.left--;
if (data.left <= 1) {
delete rowSpanCells[column.index];
}
}
else {
var cell = row.cells[column.index];
if (!cell) {
continue;
}
cell.height = row.height;
if (cell.rowSpan > 1) {
var remaining = all.length - rowIndex;
var left = cell.rowSpan > remaining ? remaining : cell.rowSpan;
rowSpanCells[column.index] = { cell: cell, left: left, row: row };
}
}
}
}
}
function applyColSpans(table) {
var all = table.allRows();
for (var rowIndex = 0; rowIndex < all.length; rowIndex++) {
var row = all[rowIndex];
var colSpanCell = null;
var combinedColSpanWidth = 0;
var colSpansLeft = 0;
for (var columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {
var column = table.columns[columnIndex];
// Width and colspan
colSpansLeft -= 1;
if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {
combinedColSpanWidth += column.width;
delete row.cells[column.index];
}
else if (colSpanCell) {
var cell = colSpanCell;
delete row.cells[column.index];
colSpanCell = null;
cell.width = column.width + combinedColSpanWidth;
}
else {
var cell = row.cells[column.index];
if (!cell)
continue;
colSpansLeft = cell.colSpan;
combinedColSpanWidth = 0;
if (cell.colSpan > 1) {
colSpanCell = cell;
combinedColSpanWidth += column.width;
continue;
}
cell.width = column.width + combinedColSpanWidth;
}
}
}
}
function fitContent(table, doc) {
var rowSpanHeight = { count: 0, height: 0 };
for (var _i = 0, _a = table.allRows(); _i < _a.length; _i++) {
var row = _a[_i];
for (var _b = 0, _c = table.columns; _b < _c.length; _b++) {
var column = _c[_b];
var cell = row.cells[column.index];
if (!cell)
continue;
doc.applyStyles(cell.styles, true);
var textSpace = cell.width - cell.padding('horizontal');
if (cell.styles.overflow === 'linebreak') {
// Add one pt to textSpace to fix rounding error
cell.text = doc.splitTextToSize(cell.text, textSpace + 1 / doc.scaleFactor(), { fontSize: cell.styles.fontSize });
}
else if (cell.styles.overflow === 'ellipsize') {
cell.text = ellipsize(cell.text, textSpace, cell.styles, doc, '...');
}
else if (cell.styles.overflow === 'hidden') {
cell.text = ellipsize(cell.text, textSpace, cell.styles, doc, '');
}
else if (typeof cell.styles.overflow === 'function') {
var result = cell.styles.overflow(cell.text, textSpace);
if (typeof result === 'string') {
cell.text = [result];
}
else {
cell.text = result;
}
}
cell.contentHeight = cell.getContentHeight(doc.scaleFactor(), doc.getLineHeightFactor());
var realContentHeight = cell.contentHeight / cell.rowSpan;
if (cell.rowSpan > 1 &&
rowSpanHeight.count * rowSpanHeight.height <
realContentHeight * cell.rowSpan) {
rowSpanHeight = { height: realContentHeight, count: cell.rowSpan };
}
else if (rowSpanHeight && rowSpanHeight.count > 0) {
if (rowSpanHeight.height > realContentHeight) {
realContentHeight = rowSpanHeight.height;
}
}
if (realContentHeight > row.height) {
row.height = realContentHeight;
}
}
rowSpanHeight.count--;
}
}
function ellipsize(text, width, styles, doc, overflow) {
return text.map(function (str) { return ellipsizeStr(str, width, styles, doc, overflow); });
}
exports.ellipsize = ellipsize;
function ellipsizeStr(text, width, styles, doc, overflow) {
var precision = 10000 * doc.scaleFactor();
width = Math.ceil(width * precision) / precision;
if (width >= (0, common_1.getStringWidth)(text, styles, doc)) {
return text;
}
while (width < (0, common_1.getStringWidth)(text + overflow, styles, doc)) {
if (text.length <= 1) {
break;
}
text = text.substring(0, text.length - 1);
}
return text.trim() + overflow;
}
/***/ }),
/***/ 964:
/***/ (function(module) {
if(typeof __WEBPACK_EXTERNAL_MODULE__964__ === 'undefined') { var e = new Error("Cannot find module 'undefined'"); e.code = 'MODULE_NOT_FOUND'; throw e; }
module.exports = __WEBPACK_EXTERNAL_MODULE__964__;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __nested_webpack_require_95387__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_95387__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
var __nested_webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
!function() {
var exports = __nested_webpack_exports__;
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.Cell = exports.Column = exports.Row = exports.Table = exports.CellHookData = exports.__drawTable = exports.__createTable = exports.applyPlugin = void 0;
var applyPlugin_1 = __nested_webpack_require_95387__(340);
var inputParser_1 = __nested_webpack_require_95387__(776);
var tableDrawer_1 = __nested_webpack_require_95387__(664);
var tableCalculator_1 = __nested_webpack_require_95387__(972);
var models_1 = __nested_webpack_require_95387__(260);
Object.defineProperty(exports, "Table", ({ enumerable: true, get: function () { return models_1.Table; } }));
var HookData_1 = __nested_webpack_require_95387__(172);
Object.defineProperty(exports, "CellHookData", ({ enumerable: true, get: function () { return HookData_1.CellHookData; } }));
var models_2 = __nested_webpack_require_95387__(260);
Object.defineProperty(exports, "Cell", ({ enumerable: true, get: function () { return models_2.Cell; } }));
Object.defineProperty(exports, "Column", ({ enumerable: true, get: function () { return models_2.Column; } }));
Object.defineProperty(exports, "Row", ({ enumerable: true, get: function () { return models_2.Row; } }));
// export { applyPlugin } didn't export applyPlugin
// to index.d.ts for some reason
function applyPlugin(jsPDF) {
(0, applyPlugin_1.default)(jsPDF);
}
exports.applyPlugin = applyPlugin;
function autoTable(d, options) {
var input = (0, inputParser_1.parseInput)(d, options);
var table = (0, tableCalculator_1.createTable)(d, input);
(0, tableDrawer_1.drawTable)(d, table);
}
// Experimental export
function __createTable(d, options) {
var input = (0, inputParser_1.parseInput)(d, options);
return (0, tableCalculator_1.createTable)(d, input);
}
exports.__createTable = __createTable;
function __drawTable(d, table) {
(0, tableDrawer_1.drawTable)(d, table);
}
exports.__drawTable = __drawTable;
try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
var jsPDF = __nested_webpack_require_95387__(964);
// Webpack imported jspdf instead of jsPDF for some reason
// while it seemed to work everywhere else.
if (jsPDF.jsPDF)
jsPDF = jsPDF.jsPDF;
applyPlugin(jsPDF);
}
catch (error) {
// Importing jspdf in nodejs environments does not work as of jspdf
// 1.5.3 so we need to silence potential errors to support using for example
// the nodejs jspdf dist files with the exported applyPlugin
}
exports["default"] = autoTable;
}();
/******/ return __nested_webpack_exports__;
/******/ })()
;
});
/***/ },
/***/ "../../../node_modules/immer/dist/immer.mjs"
/*!**************************************************!*\
!*** ../../../node_modules/immer/dist/immer.mjs ***!
\**************************************************/
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ Immer: () => (/* binding */ Immer2),
/* harmony export */ applyPatches: () => (/* binding */ applyPatches),
/* harmony export */ castDraft: () => (/* binding */ castDraft),
/* harmony export */ castImmutable: () => (/* binding */ castImmutable),
/* harmony export */ createDraft: () => (/* binding */ createDraft),
/* harmony export */ current: () => (/* binding */ current),
/* harmony export */ enableArrayMethods: () => (/* binding */ enableArrayMethods),
/* harmony export */ enableMapSet: () => (/* binding */ enableMapSet),
/* harmony export */ enablePatches: () => (/* binding */ enablePatches),
/* harmony export */ finishDraft: () => (/* binding */ finishDraft),
/* harmony export */ freeze: () => (/* binding */ freeze),
/* harmony export */ immerable: () => (/* binding */ DRAFTABLE),
/* harmony export */ isDraft: () => (/* binding */ isDraft),
/* harmony export */ isDraftable: () => (/* binding */ isDraftable),
/* harmony export */ nothing: () => (/* binding */ NOTHING),
/* harmony export */ original: () => (/* binding */ original),
/* harmony export */ produce: () => (/* binding */ produce),
/* harmony export */ produceWithPatches: () => (/* binding */ produceWithPatches),
/* harmony export */ setAutoFreeze: () => (/* binding */ setAutoFreeze),
/* harmony export */ setUseStrictIteration: () => (/* binding */ setUseStrictIteration),
/* harmony export */ setUseStrictShallowCopy: () => (/* binding */ setUseStrictShallowCopy)
/* harmony export */ });
// src/utils/env.ts
var NOTHING = Symbol.for("immer-nothing");
var DRAFTABLE = Symbol.for("immer-draftable");
var DRAFT_STATE = Symbol.for("immer-state");
// src/utils/errors.ts
var errors = true ? [
// All error codes, starting by 0:
function(plugin) {
return `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \`enable${plugin}()\` when initializing your application.`;
},
function(thing) {
return `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`;
},
"This object has been frozen and should not be mutated",
function(data) {
return "Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? " + data;
},
"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.",
"Immer forbids circular references",
"The first or second argument to `produce` must be a function",
"The third argument to `produce` must be a function or undefined",
"First argument to `createDraft` must be a plain object, an array, or an immerable object",
"First argument to `finishDraft` must be a draft returned by `createDraft`",
function(thing) {
return `'current' expects a draft, got: ${thing}`;
},
"Object.defineProperty() cannot be used on an Immer draft",
"Object.setPrototypeOf() cannot be used on an Immer draft",
"Immer only supports deleting array indices",
"Immer only supports setting array indices and the 'length' property",
function(thing) {
return `'original' expects a draft, got: ${thing}`;
}
// Note: if more errors are added, the errorOffset in Patches.ts should be increased
// See Patches.ts for additional errors
] : 0;
function die(error, ...args) {
if (true) {
const e = errors[error];
const msg = isFunction(e) ? e.apply(null, args) : e;
throw new Error(`[Immer] ${msg}`);
}
// removed by dead control flow
}
// src/utils/common.ts
var O = Object;
var getPrototypeOf = O.getPrototypeOf;
var CONSTRUCTOR = "constructor";
var PROTOTYPE = "prototype";
var CONFIGURABLE = "configurable";
var ENUMERABLE = "enumerable";
var WRITABLE = "writable";
var VALUE = "value";
var isDraft = (value) => !!value && !!value[DRAFT_STATE];
function isDraftable(value) {
if (!value)
return false;
return isPlainObject(value) || isArray(value) || !!value[DRAFTABLE] || !!value[CONSTRUCTOR]?.[DRAFTABLE] || isMap(value) || isSet(value);
}
var objectCtorString = O[PROTOTYPE][CONSTRUCTOR].toString();
var cachedCtorStrings = /* @__PURE__ */ new WeakMap();
function isPlainObject(value) {
if (!value || !isObjectish(value))
return false;
const proto = getPrototypeOf(value);
if (proto === null || proto === O[PROTOTYPE])
return true;
const Ctor = O.hasOwnProperty.call(proto, CONSTRUCTOR) && proto[CONSTRUCTOR];
if (Ctor === Object)
return true;
if (!isFunction(Ctor))
return false;
let ctorString = cachedCtorStrings.get(Ctor);
if (ctorString === void 0) {
ctorString = Function.toString.call(Ctor);
cachedCtorStrings.set(Ctor, ctorString);
}
return ctorString === objectCtorString;
}
function original(value) {
if (!isDraft(value))
die(15, value);
return value[DRAFT_STATE].base_;
}
function each(obj, iter, strict = true) {
if (getArchtype(obj) === 0 /* Object */) {
const keys = strict ? Reflect.ownKeys(obj) : O.keys(obj);
keys.forEach((key) => {
iter(key, obj[key], obj);
});
} else {
obj.forEach((entry, index) => iter(index, entry, obj));
}
}
function getArchtype(thing) {
const state = thing[DRAFT_STATE];
return state ? state.type_ : isArray(thing) ? 1 /* Array */ : isMap(thing) ? 2 /* Map */ : isSet(thing) ? 3 /* Set */ : 0 /* Object */;
}
var has = (thing, prop, type = getArchtype(thing)) => type === 2 /* Map */ ? thing.has(prop) : O[PROTOTYPE].hasOwnProperty.call(thing, prop);
var get = (thing, prop, type = getArchtype(thing)) => (
// @ts-ignore
type === 2 /* Map */ ? thing.get(prop) : thing[prop]
);
var set = (thing, propOrOldValue, value, type = getArchtype(thing)) => {
if (type === 2 /* Map */)
thing.set(propOrOldValue, value);
else if (type === 3 /* Set */) {
thing.add(value);
} else
thing[propOrOldValue] = value;
};
function is(x, y) {
if (x === y) {
return x !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
var isArray = Array.isArray;
var isMap = (target) => target instanceof Map;
var isSet = (target) => target instanceof Set;
var isObjectish = (target) => typeof target === "object";
var isFunction = (target) => typeof target === "function";
var isBoolean = (target) => typeof target === "boolean";
function isArrayIndex(value) {
const n = +value;
return Number.isInteger(n) && String(n) === value;
}
var getProxyDraft = (value) => {
if (!isObjectish(value))
return null;
return value?.[DRAFT_STATE];
};
var latest = (state) => state.copy_ || state.base_;
var getValue = (value) => {
const proxyDraft = getProxyDraft(value);
return proxyDraft ? proxyDraft.copy_ ?? proxyDraft.base_ : value;
};
var getFinalValue = (state) => state.modified_ ? state.copy_ : state.base_;
function shallowCopy(base, strict) {
if (isMap(base)) {
return new Map(base);
}
if (isSet(base)) {
return new Set(base);
}
if (isArray(base))
return Array[PROTOTYPE].slice.call(base);
const isPlain = isPlainObject(base);
if (strict === true || strict === "class_only" && !isPlain) {
const descriptors = O.getOwnPropertyDescriptors(base);
delete descriptors[DRAFT_STATE];
let keys = Reflect.ownKeys(descriptors);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const desc = descriptors[key];
if (desc[WRITABLE] === false) {
desc[WRITABLE] = true;
desc[CONFIGURABLE] = true;
}
if (desc.get || desc.set)
descriptors[key] = {
[CONFIGURABLE]: true,
[WRITABLE]: true,
// could live with !!desc.set as well here...
[ENUMERABLE]: desc[ENUMERABLE],
[VALUE]: base[key]
};
}
return O.create(getPrototypeOf(base), descriptors);
} else {
const proto = getPrototypeOf(base);
if (proto !== null && isPlain) {
return { ...base };
}
const obj = O.create(proto);
return O.assign(obj, base);
}
}
function freeze(obj, deep = false) {
if (isFrozen(obj) || isDraft(obj) || !isDraftable(obj))
return obj;
if (getArchtype(obj) > 1) {
O.defineProperties(obj, {
set: dontMutateMethodOverride,
add: dontMutateMethodOverride,
clear: dontMutateMethodOverride,
delete: dontMutateMethodOverride
});
}
O.freeze(obj);
if (deep)
each(
obj,
(_key, value) => {
freeze(value, true);
},
false
);
return obj;
}
function dontMutateFrozenCollections() {
die(2);
}
var dontMutateMethodOverride = {
[VALUE]: dontMutateFrozenCollections
};
function isFrozen(obj) {
if (obj === null || !isObjectish(obj))
return true;
return O.isFrozen(obj);
}
// src/utils/plugins.ts
var PluginMapSet = "MapSet";
var PluginPatches = "Patches";
var PluginArrayMethods = "ArrayMethods";
var plugins = {};
function getPlugin(pluginKey) {
const plugin = plugins[pluginKey];
if (!plugin) {
die(0, pluginKey);
}
return plugin;
}
var isPluginLoaded = (pluginKey) => !!plugins[pluginKey];
function loadPlugin(pluginKey, implementation) {
if (!plugins[pluginKey])
plugins[pluginKey] = implementation;
}
// src/core/scope.ts
var currentScope;
var getCurrentScope = () => currentScope;
var createScope = (parent_, immer_) => ({
drafts_: [],
parent_,
immer_,
// Whenever the modified draft contains a draft from another scope, we
// need to prevent auto-freezing so the unowned draft can be finalized.
canAutoFreeze_: true,
unfinalizedDrafts_: 0,
handledSet_: /* @__PURE__ */ new Set(),
processedForPatches_: /* @__PURE__ */ new Set(),
mapSetPlugin_: isPluginLoaded(PluginMapSet) ? getPlugin(PluginMapSet) : void 0,
arrayMethodsPlugin_: isPluginLoaded(PluginArrayMethods) ? getPlugin(PluginArrayMethods) : void 0
});
function usePatchesInScope(scope, patchListener) {
if (patchListener) {
scope.patchPlugin_ = getPlugin(PluginPatches);
scope.patches_ = [];
scope.inversePatches_ = [];
scope.patchListener_ = patchListener;
}
}
function revokeScope(scope) {
leaveScope(scope);
scope.drafts_.forEach(revokeDraft);
scope.drafts_ = null;
}
function leaveScope(scope) {
if (scope === currentScope) {
currentScope = scope.parent_;
}
}
var enterScope = (immer2) => currentScope = createScope(currentScope, immer2);
function revokeDraft(draft) {
const state = draft[DRAFT_STATE];
if (state.type_ === 0 /* Object */ || state.type_ === 1 /* Array */)
state.revoke_();
else
state.revoked_ = true;
}
// src/core/finalize.ts
function processResult(result, scope) {
scope.unfinalizedDrafts_ = scope.drafts_.length;
const baseDraft = scope.drafts_[0];
const isReplaced = result !== void 0 && result !== baseDraft;
if (isReplaced) {
if (baseDraft[DRAFT_STATE].modified_) {
revokeScope(scope);
die(4);
}
if (isDraftable(result)) {
result = finalize(scope, result);
}
const { patchPlugin_ } = scope;
if (patchPlugin_) {
patchPlugin_.generateReplacementPatches_(
baseDraft[DRAFT_STATE].base_,
result,
scope
);
}
} else {
result = finalize(scope, baseDraft);
}
maybeFreeze(scope, result, true);
revokeScope(scope);
if (scope.patches_) {
scope.patchListener_(scope.patches_, scope.inversePatches_);
}
return result !== NOTHING ? result : void 0;
}
function finalize(rootScope, value) {
if (isFrozen(value))
return value;
const state = value[DRAFT_STATE];
if (!state) {
const finalValue = handleValue(value, rootScope.handledSet_, rootScope);
return finalValue;
}
if (!isSameScope(state, rootScope)) {
return value;
}
if (!state.modified_) {
return state.base_;
}
if (!state.finalized_) {
const { callbacks_ } = state;
if (callbacks_) {
while (callbacks_.length > 0) {
const callback = callbacks_.pop();
callback(rootScope);
}
}
generatePatchesAndFinalize(state, rootScope);
}
return state.copy_;
}
function maybeFreeze(scope, value, deep = false) {
if (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {
freeze(value, deep);
}
}
function markStateFinalized(state) {
state.finalized_ = true;
state.scope_.unfinalizedDrafts_--;
}
var isSameScope = (state, rootScope) => state.scope_ === rootScope;
var EMPTY_LOCATIONS_RESULT = [];
function updateDraftInParent(parent, draftValue, finalizedValue, originalKey) {
const parentCopy = latest(parent);
const parentType = parent.type_;
if (originalKey !== void 0) {
const currentValue = get(parentCopy, originalKey, parentType);
if (currentValue === draftValue) {
set(parentCopy, originalKey, finalizedValue, parentType);
return;
}
}
if (!parent.draftLocations_) {
const draftLocations = parent.draftLocations_ = /* @__PURE__ */ new Map();
each(parentCopy, (key, value) => {
if (isDraft(value)) {
const keys = draftLocations.get(value) || [];
keys.push(key);
draftLocations.set(value, keys);
}
});
}
const locations = parent.draftLocations_.get(draftValue) ?? EMPTY_LOCATIONS_RESULT;
for (const location of locations) {
set(parentCopy, location, finalizedValue, parentType);
}
}
function registerChildFinalizationCallback(parent, child, key) {
parent.callbacks_.push(function childCleanup(rootScope) {
const state = child;
if (!state || !isSameScope(state, rootScope)) {
return;
}
rootScope.mapSetPlugin_?.fixSetContents(state);
const finalizedValue = getFinalValue(state);
updateDraftInParent(parent, state.draft_ ?? state, finalizedValue, key);
generatePatchesAndFinalize(state, rootScope);
});
}
function generatePatchesAndFinalize(state, rootScope) {
const shouldFinalize = state.modified_ && !state.finalized_ && (state.type_ === 3 /* Set */ || state.type_ === 1 /* Array */ && state.allIndicesReassigned_ || (state.assigned_?.size ?? 0) > 0);
if (shouldFinalize) {
const { patchPlugin_ } = rootScope;
if (patchPlugin_) {
const basePath = patchPlugin_.getPath(state);
if (basePath) {
patchPlugin_.generatePatches_(state, basePath, rootScope);
}
}
markStateFinalized(state);
}
}
function handleCrossReference(target, key, value) {
const { scope_ } = target;
if (isDraft(value)) {
const state = value[DRAFT_STATE];
if (isSameScope(state, scope_)) {
state.callbacks_.push(function crossReferenceCleanup() {
prepareCopy(target);
const finalizedValue = getFinalValue(state);
updateDraftInParent(target, value, finalizedValue, key);
});
}
} else if (isDraftable(value)) {
target.callbacks_.push(function nestedDraftCleanup() {
const targetCopy = latest(target);
if (target.type_ === 3 /* Set */) {
if (targetCopy.has(value)) {
handleValue(value, scope_.handledSet_, scope_);
}
} else {
if (get(targetCopy, key, target.type_) === value) {
if (scope_.drafts_.length > 1 && (target.assigned_.get(key) ?? false) === true && target.copy_) {
handleValue(
get(target.copy_, key, target.type_),
scope_.handledSet_,
scope_
);
}
}
}
});
}
}
function handleValue(target, handledSet, rootScope) {
if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {
return target;
}
if (isDraft(target) || handledSet.has(target) || !isDraftable(target) || isFrozen(target)) {
return target;
}
handledSet.add(target);
each(target, (key, value) => {
if (isDraft(value)) {
const state = value[DRAFT_STATE];
if (isSameScope(state, rootScope)) {
const updatedValue = getFinalValue(state);
set(target, key, updatedValue, target.type_);
markStateFinalized(state);
}
} else if (isDraftable(value)) {
handleValue(value, handledSet, rootScope);
}
});
return target;
}
// src/core/proxy.ts
function createProxyProxy(base, parent) {
const baseIsArray = isArray(base);
const state = {
type_: baseIsArray ? 1 /* Array */ : 0 /* Object */,
// Track which produce call this is associated with.
scope_: parent ? parent.scope_ : getCurrentScope(),
// True for both shallow and deep changes.
modified_: false,
// Used during finalization.
finalized_: false,
// Track which properties have been assigned (true) or deleted (false).
// actually instantiated in `prepareCopy()`
assigned_: void 0,
// The parent draft state.
parent_: parent,
// The base state.
base_: base,
// The base proxy.
draft_: null,
// set below
// The base copy with any updated values.
copy_: null,
// Called by the `produce` function.
revoke_: null,
isManual_: false,
// `callbacks` actually gets assigned in `createProxy`
callbacks_: void 0
};
let target = state;
let traps = objectTraps;
if (baseIsArray) {
target = [state];
traps = arrayTraps;
}
const { revoke, proxy } = Proxy.revocable(target, traps);
state.draft_ = proxy;
state.revoke_ = revoke;
return [proxy, state];
}
var objectTraps = {
get(state, prop) {
if (prop === DRAFT_STATE)
return state;
let arrayPlugin = state.scope_.arrayMethodsPlugin_;
const isArrayWithStringProp = state.type_ === 1 /* Array */ && typeof prop === "string";
if (isArrayWithStringProp) {
if (arrayPlugin?.isArrayOperationMethod(prop)) {
return arrayPlugin.createMethodInterceptor(state, prop);
}
}
const source = latest(state);
if (!has(source, prop, state.type_)) {
return readPropFromProto(state, source, prop);
}
const value = source[prop];
if (state.finalized_ || !isDraftable(value)) {
return value;
}
if (isArrayWithStringProp && state.operationMethod && arrayPlugin?.isMutatingArrayMethod(
state.operationMethod
) && isArrayIndex(prop)) {
return value;
}
if (value === peek(state.base_, prop)) {
prepareCopy(state);
const childKey = state.type_ === 1 /* Array */ ? +prop : prop;
const childDraft = createProxy(state.scope_, value, state, childKey);
return state.copy_[childKey] = childDraft;
}
return value;
},
has(state, prop) {
return prop in latest(state);
},
ownKeys(state) {
return Reflect.ownKeys(latest(state));
},
set(state, prop, value) {
const desc = getDescriptorFromProto(latest(state), prop);
if (desc?.set) {
desc.set.call(state.draft_, value);
return true;
}
if (!state.modified_) {
const current2 = peek(latest(state), prop);
const currentState = current2?.[DRAFT_STATE];
if (currentState && currentState.base_ === value) {
state.copy_[prop] = value;
state.assigned_.set(prop, false);
return true;
}
if (is(value, current2) && (value !== void 0 || has(state.base_, prop, state.type_)))
return true;
prepareCopy(state);
markChanged(state);
}
if (state.copy_[prop] === value && // special case: handle new props with value 'undefined'
(value !== void 0 || prop in state.copy_) || // special case: NaN
Number.isNaN(value) && Number.isNaN(state.copy_[prop]))
return true;
state.copy_[prop] = value;
state.assigned_.set(prop, true);
handleCrossReference(state, prop, value);
return true;
},
deleteProperty(state, prop) {
prepareCopy(state);
if (peek(state.base_, prop) !== void 0 || prop in state.base_) {
state.assigned_.set(prop, false);
markChanged(state);
} else {
state.assigned_.delete(prop);
}
if (state.copy_) {
delete state.copy_[prop];
}
return true;
},
// Note: We never coerce `desc.value` into an Immer draft, because we can't make
// the same guarantee in ES5 mode.
getOwnPropertyDescriptor(state, prop) {
const owner = latest(state);
const desc = Reflect.getOwnPropertyDescriptor(owner, prop);
if (!desc)
return desc;
return {
[WRITABLE]: true,
[CONFIGURABLE]: state.type_ !== 1 /* Array */ || prop !== "length",
[ENUMERABLE]: desc[ENUMERABLE],
[VALUE]: owner[prop]
};
},
defineProperty() {
die(11);
},
getPrototypeOf(state) {
return getPrototypeOf(state.base_);
},
setPrototypeOf() {
die(12);
}
};
var arrayTraps = {};
for (let key in objectTraps) {
let fn = objectTraps[key];
arrayTraps[key] = function() {
const args = arguments;
args[0] = args[0][0];
return fn.apply(this, args);
};
}
arrayTraps.deleteProperty = function(state, prop) {
if ( true && isNaN(parseInt(prop)))
die(13);
return arrayTraps.set.call(this, state, prop, void 0);
};
arrayTraps.set = function(state, prop, value) {
if ( true && prop !== "length" && isNaN(parseInt(prop)))
die(14);
return objectTraps.set.call(this, state[0], prop, value, state[0]);
};
function peek(draft, prop) {
const state = draft[DRAFT_STATE];
const source = state ? latest(state) : draft;
return source[prop];
}
function readPropFromProto(state, source, prop) {
const desc = getDescriptorFromProto(source, prop);
return desc ? VALUE in desc ? desc[VALUE] : (
// This is a very special case, if the prop is a getter defined by the
// prototype, we should invoke it with the draft as context!
desc.get?.call(state.draft_)
) : void 0;
}
function getDescriptorFromProto(source, prop) {
if (!(prop in source))
return void 0;
let proto = getPrototypeOf(source);
while (proto) {
const desc = Object.getOwnPropertyDescriptor(proto, prop);
if (desc)
return desc;
proto = getPrototypeOf(proto);
}
return void 0;
}
function markChanged(state) {
if (!state.modified_) {
state.modified_ = true;
if (state.parent_) {
markChanged(state.parent_);
}
}
}
function prepareCopy(state) {
if (!state.copy_) {
state.assigned_ = /* @__PURE__ */ new Map();
state.copy_ = shallowCopy(
state.base_,
state.scope_.immer_.useStrictShallowCopy_
);
}
}
// src/core/immerClass.ts
var Immer2 = class {
constructor(config) {
this.autoFreeze_ = true;
this.useStrictShallowCopy_ = false;
this.useStrictIteration_ = false;
/**
* The `produce` function takes a value and a "recipe function" (whose
* return value often depends on the base state). The recipe function is
* free to mutate its first argument however it wants. All mutations are
* only ever applied to a __copy__ of the base state.
*
* Pass only a function to create a "curried producer" which relieves you
* from passing the recipe function every time.
*
* Only plain objects and arrays are made mutable. All other objects are
* considered uncopyable.
*
* Note: This function is __bound__ to its `Immer` instance.
*
* @param {any} base - the initial state
* @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified
* @param {Function} patchListener - optional function that will be called with all the patches produced here
* @returns {any} a new state, or the initial state if nothing was modified
*/
this.produce = (base, recipe, patchListener) => {
if (isFunction(base) && !isFunction(recipe)) {
const defaultBase = recipe;
recipe = base;
const self = this;
return function curriedProduce(base2 = defaultBase, ...args) {
return self.produce(base2, (draft) => recipe.call(this, draft, ...args));
};
}
if (!isFunction(recipe))
die(6);
if (patchListener !== void 0 && !isFunction(patchListener))
die(7);
let result;
if (isDraftable(base)) {
const scope = enterScope(this);
const proxy = createProxy(scope, base, void 0);
let hasError = true;
try {
result = recipe(proxy);
hasError = false;
} finally {
if (hasError)
revokeScope(scope);
else
leaveScope(scope);
}
usePatchesInScope(scope, patchListener);
return processResult(result, scope);
} else if (!base || !isObjectish(base)) {
result = recipe(base);
if (result === void 0)
result = base;
if (result === NOTHING)
result = void 0;
if (this.autoFreeze_)
freeze(result, true);
if (patchListener) {
const p = [];
const ip = [];
getPlugin(PluginPatches).generateReplacementPatches_(base, result, {
patches_: p,
inversePatches_: ip
});
patchListener(p, ip);
}
return result;
} else
die(1, base);
};
this.produceWithPatches = (base, recipe) => {
if (isFunction(base)) {
return (state, ...args) => this.produceWithPatches(state, (draft) => base(draft, ...args));
}
let patches, inversePatches;
const result = this.produce(base, recipe, (p, ip) => {
patches = p;
inversePatches = ip;
});
return [result, patches, inversePatches];
};
if (isBoolean(config?.autoFreeze))
this.setAutoFreeze(config.autoFreeze);
if (isBoolean(config?.useStrictShallowCopy))
this.setUseStrictShallowCopy(config.useStrictShallowCopy);
if (isBoolean(config?.useStrictIteration))
this.setUseStrictIteration(config.useStrictIteration);
}
createDraft(base) {
if (!isDraftable(base))
die(8);
if (isDraft(base))
base = current(base);
const scope = enterScope(this);
const proxy = createProxy(scope, base, void 0);
proxy[DRAFT_STATE].isManual_ = true;
leaveScope(scope);
return proxy;
}
finishDraft(draft, patchListener) {
const state = draft && draft[DRAFT_STATE];
if (!state || !state.isManual_)
die(9);
const { scope_: scope } = state;
usePatchesInScope(scope, patchListener);
return processResult(void 0, scope);
}
/**
* Pass true to automatically freeze all copies created by Immer.
*
* By default, auto-freezing is enabled.
*/
setAutoFreeze(value) {
this.autoFreeze_ = value;
}
/**
* Pass true to enable strict shallow copy.
*
* By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.
*/
setUseStrictShallowCopy(value) {
this.useStrictShallowCopy_ = value;
}
/**
* Pass false to use faster iteration that skips non-enumerable properties
* but still handles symbols for compatibility.
*
* By default, strict iteration is enabled (includes all own properties).
*/
setUseStrictIteration(value) {
this.useStrictIteration_ = value;
}
shouldUseStrictIteration() {
return this.useStrictIteration_;
}
applyPatches(base, patches) {
let i;
for (i = patches.length - 1; i >= 0; i--) {
const patch = patches[i];
if (patch.path.length === 0 && patch.op === "replace") {
base = patch.value;
break;
}
}
if (i > -1) {
patches = patches.slice(i + 1);
}
const applyPatchesImpl = getPlugin(PluginPatches).applyPatches_;
if (isDraft(base)) {
return applyPatchesImpl(base, patches);
}
return this.produce(
base,
(draft) => applyPatchesImpl(draft, patches)
);
}
};
function createProxy(rootScope, value, parent, key) {
const [draft, state] = isMap(value) ? getPlugin(PluginMapSet).proxyMap_(value, parent) : isSet(value) ? getPlugin(PluginMapSet).proxySet_(value, parent) : createProxyProxy(value, parent);
const scope = parent?.scope_ ?? getCurrentScope();
scope.drafts_.push(draft);
state.callbacks_ = parent?.callbacks_ ?? [];
state.key_ = key;
if (parent && key !== void 0) {
registerChildFinalizationCallback(parent, state, key);
} else {
state.callbacks_.push(function rootDraftCleanup(rootScope2) {
rootScope2.mapSetPlugin_?.fixSetContents(state);
const { patchPlugin_ } = rootScope2;
if (state.modified_ && patchPlugin_) {
patchPlugin_.generatePatches_(state, [], rootScope2);
}
});
}
return draft;
}
// src/core/current.ts
function current(value) {
if (!isDraft(value))
die(10, value);
return currentImpl(value);
}
function currentImpl(value) {
if (!isDraftable(value) || isFrozen(value))
return value;
const state = value[DRAFT_STATE];
let copy;
let strict = true;
if (state) {
if (!state.modified_)
return state.base_;
state.finalized_ = true;
copy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_);
strict = state.scope_.immer_.shouldUseStrictIteration();
} else {
copy = shallowCopy(value, true);
}
each(
copy,
(key, childValue) => {
set(copy, key, currentImpl(childValue));
},
strict
);
if (state) {
state.finalized_ = false;
}
return copy;
}
// src/plugins/patches.ts
function enablePatches() {
const errorOffset = 16;
if (true) {
errors.push(
'Sets cannot have "replace" patches.',
function(op) {
return "Unsupported patch operation: " + op;
},
function(path) {
return "Cannot apply patch, path doesn't resolve: " + path;
},
"Patching reserved attributes like __proto__, prototype and constructor is not allowed"
);
}
function getPath(state, path = []) {
if (state.key_ !== void 0) {
const parentCopy = state.parent_.copy_ ?? state.parent_.base_;
const proxyDraft = getProxyDraft(get(parentCopy, state.key_));
const valueAtKey = get(parentCopy, state.key_);
if (valueAtKey === void 0) {
return null;
}
if (valueAtKey !== state.draft_ && valueAtKey !== state.base_ && valueAtKey !== state.copy_) {
return null;
}
if (proxyDraft != null && proxyDraft.base_ !== state.base_) {
return null;
}
const isSet2 = state.parent_.type_ === 3 /* Set */;
let key;
if (isSet2) {
const setParent = state.parent_;
key = Array.from(setParent.drafts_.keys()).indexOf(state.key_);
} else {
key = state.key_;
}
if (!(isSet2 && parentCopy.size > key || has(parentCopy, key))) {
return null;
}
path.push(key);
}
if (state.parent_) {
return getPath(state.parent_, path);
}
path.reverse();
try {
resolvePath(state.copy_, path);
} catch (e) {
return null;
}
return path;
}
function resolvePath(base, path) {
let current2 = base;
for (let i = 0; i < path.length - 1; i++) {
const key = path[i];
current2 = get(current2, key);
if (!isObjectish(current2) || current2 === null) {
throw new Error(`Cannot resolve path at '${path.join("/")}'`);
}
}
return current2;
}
const REPLACE = "replace";
const ADD = "add";
const REMOVE = "remove";
function generatePatches_(state, basePath, scope) {
if (state.scope_.processedForPatches_.has(state)) {
return;
}
state.scope_.processedForPatches_.add(state);
const { patches_, inversePatches_ } = scope;
switch (state.type_) {
case 0 /* Object */:
case 2 /* Map */:
return generatePatchesFromAssigned(
state,
basePath,
patches_,
inversePatches_
);
case 1 /* Array */:
return generateArrayPatches(
state,
basePath,
patches_,
inversePatches_
);
case 3 /* Set */:
return generateSetPatches(
state,
basePath,
patches_,
inversePatches_
);
}
}
function generateArrayPatches(state, basePath, patches, inversePatches) {
let { base_, assigned_ } = state;
let copy_ = state.copy_;
if (copy_.length < base_.length) {
;
[base_, copy_] = [copy_, base_];
[patches, inversePatches] = [inversePatches, patches];
}
const allReassigned = state.allIndicesReassigned_ === true;
for (let i = 0; i < base_.length; i++) {
const copiedItem = copy_[i];
const baseItem = base_[i];
const isAssigned = allReassigned || assigned_?.get(i.toString());
if (isAssigned && copiedItem !== baseItem) {
const childState = copiedItem?.[DRAFT_STATE];
if (childState && childState.modified_) {
continue;
}
const path = basePath.concat([i]);
patches.push({
op: REPLACE,
path,
// Need to maybe clone it, as it can in fact be the original value
// due to the base/copy inversion at the start of this function
value: clonePatchValueIfNeeded(copiedItem)
});
inversePatches.push({
op: REPLACE,
path,
value: clonePatchValueIfNeeded(baseItem)
});
}
}
for (let i = base_.length; i < copy_.length; i++) {
const path = basePath.concat([i]);
patches.push({
op: ADD,
path,
// Need to maybe clone it, as it can in fact be the original value
// due to the base/copy inversion at the start of this function
value: clonePatchValueIfNeeded(copy_[i])
});
}
for (let i = copy_.length - 1; base_.length <= i; --i) {
const path = basePath.concat([i]);
inversePatches.push({
op: REMOVE,
path
});
}
}
function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {
const { base_, copy_, type_ } = state;
each(state.assigned_, (key, assignedValue) => {
const origValue = get(base_, key, type_);
const value = get(copy_, key, type_);
const op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;
if (origValue === value && op === REPLACE)
return;
const path = basePath.concat(key);
patches.push(
op === REMOVE ? { op, path } : { op, path, value: clonePatchValueIfNeeded(value) }
);
inversePatches.push(
op === ADD ? { op: REMOVE, path } : op === REMOVE ? { op: ADD, path, value: clonePatchValueIfNeeded(origValue) } : { op: REPLACE, path, value: clonePatchValueIfNeeded(origValue) }
);
});
}
function generateSetPatches(state, basePath, patches, inversePatches) {
let { base_, copy_ } = state;
let i = 0;
base_.forEach((value) => {
if (!copy_.has(value)) {
const path = basePath.concat([i]);
patches.push({
op: REMOVE,
path,
value
});
inversePatches.unshift({
op: ADD,
path,
value
});
}
i++;
});
i = 0;
copy_.forEach((value) => {
if (!base_.has(value)) {
const path = basePath.concat([i]);
patches.push({
op: ADD,
path,
value
});
inversePatches.unshift({
op: REMOVE,
path,
value
});
}
i++;
});
}
function generateReplacementPatches_(baseValue, replacement, scope) {
const { patches_, inversePatches_ } = scope;
patches_.push({
op: REPLACE,
path: [],
value: replacement === NOTHING ? void 0 : replacement
});
inversePatches_.push({
op: REPLACE,
path: [],
value: baseValue
});
}
function applyPatches_(draft, patches) {
patches.forEach((patch) => {
const { path, op } = patch;
let base = draft;
for (let i = 0; i < path.length - 1; i++) {
const parentType = getArchtype(base);
let p = path[i];
if (typeof p !== "string" && typeof p !== "number") {
p = "" + p;
}
if ((parentType === 0 /* Object */ || parentType === 1 /* Array */) && (p === "__proto__" || p === CONSTRUCTOR))
die(errorOffset + 3);
if (isFunction(base) && p === PROTOTYPE)
die(errorOffset + 3);
base = get(base, p);
if (!isObjectish(base))
die(errorOffset + 2, path.join("/"));
}
const type = getArchtype(base);
const value = deepClonePatchValue(patch.value);
const key = path[path.length - 1];
switch (op) {
case REPLACE:
switch (type) {
case 2 /* Map */:
return base.set(key, value);
case 3 /* Set */:
die(errorOffset);
default:
return base[key] = value;
}
case ADD:
switch (type) {
case 1 /* Array */:
return key === "-" ? base.push(value) : base.splice(key, 0, value);
case 2 /* Map */:
return base.set(key, value);
case 3 /* Set */:
return base.add(value);
default:
return base[key] = value;
}
case REMOVE:
switch (type) {
case 1 /* Array */:
return base.splice(key, 1);
case 2 /* Map */:
return base.delete(key);
case 3 /* Set */:
return base.delete(patch.value);
default:
return delete base[key];
}
default:
die(errorOffset + 1, op);
}
});
return draft;
}
function deepClonePatchValue(obj) {
if (!isDraftable(obj))
return obj;
if (isArray(obj))
return obj.map(deepClonePatchValue);
if (isMap(obj))
return new Map(
Array.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])
);
if (isSet(obj))
return new Set(Array.from(obj).map(deepClonePatchValue));
const cloned = Object.create(getPrototypeOf(obj));
for (const key in obj)
cloned[key] = deepClonePatchValue(obj[key]);
if (has(obj, DRAFTABLE))
cloned[DRAFTABLE] = obj[DRAFTABLE];
return cloned;
}
function clonePatchValueIfNeeded(obj) {
if (isDraft(obj)) {
return deepClonePatchValue(obj);
} else
return obj;
}
loadPlugin(PluginPatches, {
applyPatches_,
generatePatches_,
generateReplacementPatches_,
getPath
});
}
// src/plugins/mapset.ts
function enableMapSet() {
class DraftMap extends Map {
constructor(target, parent) {
super();
this[DRAFT_STATE] = {
type_: 2 /* Map */,
parent_: parent,
scope_: parent ? parent.scope_ : getCurrentScope(),
modified_: false,
finalized_: false,
copy_: void 0,
assigned_: void 0,
base_: target,
draft_: this,
isManual_: false,
revoked_: false,
callbacks_: []
};
}
get size() {
return latest(this[DRAFT_STATE]).size;
}
has(key) {
return latest(this[DRAFT_STATE]).has(key);
}
set(key, value) {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
if (!latest(state).has(key) || latest(state).get(key) !== value) {
prepareMapCopy(state);
markChanged(state);
state.assigned_.set(key, true);
state.copy_.set(key, value);
state.assigned_.set(key, true);
handleCrossReference(state, key, value);
}
return this;
}
delete(key) {
if (!this.has(key)) {
return false;
}
const state = this[DRAFT_STATE];
assertUnrevoked(state);
prepareMapCopy(state);
markChanged(state);
if (state.base_.has(key)) {
state.assigned_.set(key, false);
} else {
state.assigned_.delete(key);
}
state.copy_.delete(key);
return true;
}
clear() {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
if (latest(state).size) {
prepareMapCopy(state);
markChanged(state);
state.assigned_ = /* @__PURE__ */ new Map();
each(state.base_, (key) => {
state.assigned_.set(key, false);
});
state.copy_.clear();
}
}
forEach(cb, thisArg) {
const state = this[DRAFT_STATE];
latest(state).forEach((_value, key, _map) => {
cb.call(thisArg, this.get(key), key, this);
});
}
get(key) {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
const value = latest(state).get(key);
if (state.finalized_ || !isDraftable(value)) {
return value;
}
if (value !== state.base_.get(key)) {
return value;
}
const draft = createProxy(state.scope_, value, state, key);
prepareMapCopy(state);
state.copy_.set(key, draft);
return draft;
}
keys() {
return latest(this[DRAFT_STATE]).keys();
}
values() {
const iterator = this.keys();
return {
[Symbol.iterator]: () => this.values(),
next: () => {
const r = iterator.next();
if (r.done)
return r;
const value = this.get(r.value);
return {
done: false,
value
};
}
};
}
entries() {
const iterator = this.keys();
return {
[Symbol.iterator]: () => this.entries(),
next: () => {
const r = iterator.next();
if (r.done)
return r;
const value = this.get(r.value);
return {
done: false,
value: [r.value, value]
};
}
};
}
[(DRAFT_STATE, Symbol.iterator)]() {
return this.entries();
}
}
function proxyMap_(target, parent) {
const map = new DraftMap(target, parent);
return [map, map[DRAFT_STATE]];
}
function prepareMapCopy(state) {
if (!state.copy_) {
state.assigned_ = /* @__PURE__ */ new Map();
state.copy_ = new Map(state.base_);
}
}
class DraftSet extends Set {
constructor(target, parent) {
super();
this[DRAFT_STATE] = {
type_: 3 /* Set */,
parent_: parent,
scope_: parent ? parent.scope_ : getCurrentScope(),
modified_: false,
finalized_: false,
copy_: void 0,
base_: target,
draft_: this,
drafts_: /* @__PURE__ */ new Map(),
revoked_: false,
isManual_: false,
assigned_: void 0,
callbacks_: []
};
}
get size() {
return latest(this[DRAFT_STATE]).size;
}
has(value) {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
if (!state.copy_) {
return state.base_.has(value);
}
if (state.copy_.has(value))
return true;
if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))
return true;
return false;
}
add(value) {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
if (!this.has(value)) {
prepareSetCopy(state);
markChanged(state);
state.copy_.add(value);
handleCrossReference(state, value, value);
}
return this;
}
delete(value) {
if (!this.has(value)) {
return false;
}
const state = this[DRAFT_STATE];
assertUnrevoked(state);
prepareSetCopy(state);
markChanged(state);
return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) : (
/* istanbul ignore next */
false
));
}
clear() {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
if (latest(state).size) {
prepareSetCopy(state);
markChanged(state);
state.copy_.clear();
}
}
values() {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
prepareSetCopy(state);
return state.copy_.values();
}
entries() {
const state = this[DRAFT_STATE];
assertUnrevoked(state);
prepareSetCopy(state);
return state.copy_.entries();
}
keys() {
return this.values();
}
[(DRAFT_STATE, Symbol.iterator)]() {
return this.values();
}
forEach(cb, thisArg) {
const iterator = this.values();
let result = iterator.next();
while (!result.done) {
cb.call(thisArg, result.value, result.value, this);
result = iterator.next();
}
}
}
function proxySet_(target, parent) {
const set2 = new DraftSet(target, parent);
return [set2, set2[DRAFT_STATE]];
}
function prepareSetCopy(state) {
if (!state.copy_) {
state.copy_ = /* @__PURE__ */ new Set();
state.base_.forEach((value) => {
if (isDraftable(value)) {
const draft = createProxy(state.scope_, value, state, value);
state.drafts_.set(value, draft);
state.copy_.add(draft);
} else {
state.copy_.add(value);
}
});
}
}
function assertUnrevoked(state) {
if (state.revoked_)
die(3, JSON.stringify(latest(state)));
}
function fixSetContents(target) {
if (target.type_ === 3 /* Set */ && target.copy_) {
const copy = new Set(target.copy_);
target.copy_.clear();
copy.forEach((value) => {
target.copy_.add(getValue(value));
});
}
}
loadPlugin(PluginMapSet, { proxyMap_, proxySet_, fixSetContents });
}
// src/plugins/arrayMethods.ts
function enableArrayMethods() {
const SHIFTING_METHODS = /* @__PURE__ */ new Set(["shift", "unshift"]);
const QUEUE_METHODS = /* @__PURE__ */ new Set(["push", "pop"]);
const RESULT_RETURNING_METHODS = /* @__PURE__ */ new Set([
...QUEUE_METHODS,
...SHIFTING_METHODS
]);
const REORDERING_METHODS = /* @__PURE__ */ new Set(["reverse", "sort"]);
const MUTATING_METHODS = /* @__PURE__ */ new Set([
...RESULT_RETURNING_METHODS,
...REORDERING_METHODS,
"splice"
]);
const FIND_METHODS = /* @__PURE__ */ new Set(["find", "findLast"]);
const NON_MUTATING_METHODS = /* @__PURE__ */ new Set([
"filter",
"slice",
"concat",
"flat",
...FIND_METHODS,
"findIndex",
"findLastIndex",
"some",
"every",
"indexOf",
"lastIndexOf",
"includes",
"join",
"toString",
"toLocaleString"
]);
function isMutatingArrayMethod(method) {
return MUTATING_METHODS.has(method);
}
function isNonMutatingArrayMethod(method) {
return NON_MUTATING_METHODS.has(method);
}
function isArrayOperationMethod(method) {
return isMutatingArrayMethod(method) || isNonMutatingArrayMethod(method);
}
function enterOperation(state, method) {
state.operationMethod = method;
}
function exitOperation(state) {
state.operationMethod = void 0;
}
function executeArrayMethod(state, operation, markLength = true) {
prepareCopy(state);
const result = operation();
markChanged(state);
if (markLength)
state.assigned_.set("length", true);
return result;
}
function markAllIndicesReassigned(state) {
state.allIndicesReassigned_ = true;
}
function normalizeSliceIndex(index, length) {
if (index < 0) {
return Math.max(length + index, 0);
}
return Math.min(index, length);
}
function handleInsertedValues(state, startIndex, values) {
for (let i = 0; i < values.length; i++) {
const index = startIndex + i;
state.assigned_.set(index, true);
handleCrossReference(state, index, values[i]);
}
}
function handleSimpleOperation(state, method, args) {
return executeArrayMethod(state, () => {
const lengthBefore = state.copy_.length;
const result = state.copy_[method](...args);
if (SHIFTING_METHODS.has(method)) {
markAllIndicesReassigned(state);
}
if (method === "push" && args.length > 0) {
handleInsertedValues(state, lengthBefore, args);
} else if (method === "unshift" && args.length > 0) {
handleInsertedValues(state, 0, args);
}
return RESULT_RETURNING_METHODS.has(method) ? result : state.draft_;
});
}
function handleReorderingOperation(state, method, args) {
return executeArrayMethod(
state,
() => {
;
state.copy_[method](...args);
markAllIndicesReassigned(state);
return state.draft_;
},
false
);
}
function createMethodInterceptor(state, originalMethod) {
return function interceptedMethod(...args) {
const method = originalMethod;
enterOperation(state, method);
try {
if (isMutatingArrayMethod(method)) {
if (RESULT_RETURNING_METHODS.has(method)) {
return handleSimpleOperation(state, method, args);
}
if (REORDERING_METHODS.has(method)) {
return handleReorderingOperation(state, method, args);
}
if (method === "splice") {
const res = executeArrayMethod(
state,
() => state.copy_.splice(...args)
);
markAllIndicesReassigned(state);
if (args.length > 2) {
const startIndex = normalizeSliceIndex(
args[0] ?? 0,
state.copy_.length
);
handleInsertedValues(state, startIndex, args.slice(2));
}
return res;
}
} else {
return handleNonMutatingOperation(state, method, args);
}
} finally {
exitOperation(state);
}
};
}
function handleNonMutatingOperation(state, method, args) {
const source = latest(state);
if (method === "filter") {
const predicate = args[0];
const result = [];
for (let i = 0; i < source.length; i++) {
if (predicate(source[i], i, source)) {
result.push(state.draft_[i]);
}
}
return result;
}
if (FIND_METHODS.has(method)) {
const predicate = args[0];
const isForward = method === "find";
const step = isForward ? 1 : -1;
const start = isForward ? 0 : source.length - 1;
for (let i = start; i >= 0 && i < source.length; i += step) {
if (predicate(source[i], i, source)) {
return state.draft_[i];
}
}
return void 0;
}
if (method === "slice") {
const rawStart = args[0] ?? 0;
const rawEnd = args[1] ?? source.length;
const start = normalizeSliceIndex(rawStart, source.length);
const end = normalizeSliceIndex(rawEnd, source.length);
const result = [];
for (let i = start; i < end; i++) {
result.push(state.draft_[i]);
}
return result;
}
return source[method](...args);
}
loadPlugin(PluginArrayMethods, {
createMethodInterceptor,
isArrayOperationMethod,
isMutatingArrayMethod
});
}
// src/immer.ts
var immer = new Immer2();
var produce = immer.produce;
var produceWithPatches = /* @__PURE__ */ immer.produceWithPatches.bind(
immer
);
var setAutoFreeze = /* @__PURE__ */ immer.setAutoFreeze.bind(immer);
var setUseStrictShallowCopy = /* @__PURE__ */ immer.setUseStrictShallowCopy.bind(
immer
);
var setUseStrictIteration = /* @__PURE__ */ immer.setUseStrictIteration.bind(
immer
);
var applyPatches = /* @__PURE__ */ immer.applyPatches.bind(immer);
var createDraft = /* @__PURE__ */ immer.createDraft.bind(immer);
var finishDraft = /* @__PURE__ */ immer.finishDraft.bind(immer);
var castDraft = (value) => value;
var castImmutable = (value) => value;
//# sourceMappingURL=immer.mjs.map
/***/ },
/***/ "../../../node_modules/internmap/src/index.js"
/*!****************************************************!*\
!*** ../../../node_modules/internmap/src/index.js ***!
\****************************************************/
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ InternMap: () => (/* binding */ InternMap),
/* harmony export */ InternSet: () => (/* binding */ InternSet)
/* harmony export */ });
class InternMap extends Map {
constructor(entries, key = keyof) {
super();
Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});
if (entries != null) for (const [key, value] of entries) this.set(key, value);
}
get(key) {
return super.get(intern_get(this, key));
}
has(key) {
return super.has(intern_get(this, key));
}
set(key, value) {
return super.set(intern_set(this, key), value);
}
delete(key) {
return super.delete(intern_delete(this, key));
}
}
class InternSet extends Set {
constructor(values, key = keyof) {
super();
Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});
if (values != null) for (const value of values) this.add(value);
}
has(value) {
return super.has(intern_get(this, value));
}
add(value) {
return super.add(intern_set(this, value));
}
delete(value) {
return super.delete(intern_delete(this, value));
}
}
function intern_get({_intern, _key}, value) {
const key = _key(value);
return _intern.has(key) ? _intern.get(key) : value;
}
function intern_set({_intern, _key}, value) {
const key = _key(value);
if (_intern.has(key)) return _intern.get(key);
_intern.set(key, value);
return value;
}
function intern_delete({_intern, _key}, value) {
const key = _key(value);
if (_intern.has(key)) {
value = _intern.get(key);
_intern.delete(key);
}
return value;
}
function keyof(value) {
return value !== null && typeof value === "object" ? value.valueOf() : value;
}
/***/ }
}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfZ29wZF9pbmRleF9qcy1ub2RlX21vZHVsZXNfaGFzLXN5bWJvbHNfaW5kZXhfanMtbm9kZV9tb2R1bGVzX2hhc293bl9pbmRlLWRlMTg1Yy52b2x1bnRlZXJhcGkuYmZkOTE5YzUyMGIwMWZlYmEzZGMuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFhOztBQUViLFdBQVcsa0JBQWtCO0FBQzdCOzs7Ozs7Ozs7Ozs7QUNIYTs7QUFFYixXQUFXLGFBQWE7QUFDeEIsWUFBWSxtQkFBTyxDQUFDLGtEQUFROztBQUU1QjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQ2RhOztBQUViO0FBQ0Esb0JBQW9CLG1CQUFPLENBQUMsMkRBQVM7O0FBRXJDLFdBQVcsYUFBYTtBQUN4QjtBQUNBLHlDQUF5QztBQUN6QyxxQ0FBcUM7QUFDckMsOENBQThDO0FBQzlDLDBDQUEwQzs7QUFFMUM7QUFDQTs7Ozs7Ozs7Ozs7O0FDYmE7O0FBRWIsV0FBVyxtQkFBbUI7QUFDOUI7QUFDQTtBQUNBLDJGQUEyRjtBQUMzRiw0Q0FBNEM7O0FBRTVDLGNBQWMsMkJBQTJCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEMsa0VBQWtFO0FBQ2xFLHFFQUFxRTs7QUFFckU7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQSx1Q0FBdUM7O0FBRXZDLDJEQUEyRDtBQUMzRCwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDLDJFQUEyRTs7QUFFM0UseUdBQXlHOztBQUV6RztBQUNBLDZDQUE2Qzs7QUFFN0MsOERBQThEOztBQUU5RDtBQUNBO0FBQ0EsOEJBQThCLG9CQUFvQjtBQUNsRCx1RUFBdUU7QUFDdkU7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUNhOztBQUViO0FBQ0E7QUFDQSxXQUFXLG1CQUFPLENBQUMsbUVBQWU7O0FBRWxDLFdBQVcsYUFB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QSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0Esa0RBQWtELGdDQUFtQjs7O0FBR3JFLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0Esa0JBQWtCLGdDQUFtQjtBQUNyQyxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixxQkFBcUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSxrREFBa0QsZ0NBQW1COzs7QUFHckUsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQSxtQkFBbUIsZ0NBQW1CO0FBQ3RDLGtCQUFrQixnQ0FBbUI7QUFDckMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQyx1QkFBdUIsZ0NBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsOEJBQThCO0FBQzlCLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0EsMERBQTBELDBCQUEwQjtBQUNwRiwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCwwQkFBMEI7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsNEJBQTRCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQSxnREFBZ0QsYUFBYTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBLHlEQUF5RCxnQkFBZ0I7QUFDekU7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBLHVEQUF1RCxnQkFBZ0I7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSxrREFBa0QsZ0NBQW1COzs7QUFHckUsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQSxlQUFlLGdDQUFtQjtBQUNsQyxpQkFBaUIsZ0NBQW1CO0FBQ3BDLGVBQWUsZ0NBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsNkNBQTZDO0FBQ25HO0FBQ0E7QUFDQSxzREFBc0QsNkNBQTZDO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Qsd0JBQXdCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELGdCQUFnQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGdCQUFnQjtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsa0NBQWtDO0FBQzdHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFFBQVEsK0dBQStHO0FBQzlLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLGdCQUFnQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBLE9BQU87O0FBRVA7QUFDQTs7O0FBR0E7QUFDQSxnREFBZ0QsYUFBYTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwwQkFBMEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0Esa0RBQWtELGdDQUFtQjs7O0FBR3JFLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0Esd0JBQXdCLGdDQUFtQjtBQUMzQyxlQUFlLGdDQUFtQjtBQUNsQyx3QkFBd0IsZ0NBQW1CO0FBQzNDLGVBQWUsZ0NBQW1CO0FBQ2xDLGtCQUFrQixnQ0FBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLHVCQUF1QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSxrREFBa0QsZ0NBQW1COzs7QUFHckUsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQSxlQUFlLGdDQUFtQjtBQUNsQyxlQUFlLGdDQUFtQjtBQUNsQyx3QkFBd0IsZ0NBQW1CO0FBQzNDLGtCQUFrQixnQ0FBbUI7QUFDckMsc0JBQXNCLGdDQUFtQjtBQUN6QyxxQkFBcUIsZ0NBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCwwQkFBMEI7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsb0RBQW9EO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxvREFBb0Q7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZ0JBQWdCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZ0JBQWdCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsdUJBQXVCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVM7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsVUFBVTtBQUN6QixlQUFlLFVBQVU7QUFDekIsaUJBQWlCLEtBQUs7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksZ0JBQWdCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxRQUFRO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsNkJBQTZCLHNDQUFzQztBQUNuRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDZCQUE2QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsU0FBUztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1QkU7QUFDRixrQzs7Ozs7Ozs7Ozs7Ozs7OztBQy9uRE87QUFDUDtBQUNBO0FBQ0EsbUNBQW1DLFVBQVUsaUJBQWlCLFNBQVMsWUFBWTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsbUNBQW1DLFVBQVUsaUJBQWlCLFNBQVMsWUFBWTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGNBQWM7QUFDbkM7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLGNBQWM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZ29wZC9nT1BELmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2dvcGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaGFzb3duL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pzcGRmLWF1dG90YWJsZS9kaXN0L2pzcGRmLnBsdWdpbi5hdXRvdGFibGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaW1tZXIvZGlzdC9pbW1lci5tanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaW50ZXJubWFwL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dPUEQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZ09QRCA9IHJlcXVpcmUoJy4vZ09QRCcpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc2hhbXMnKX0gKi9cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0LyoqIEB0eXBlIHt7IFtrIGluIHN5bWJvbF0/OiB1bmtub3duIH19ICovXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAodmFyIF8gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdHZhciBkZXNjcmlwdG9yID0gLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG52YXIgJGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKGNhbGwsICRoYXNPd24pO1xuIiwiLyohXG4gKiBcbiAqICAgICAgICAgICAgICAganNQREYgQXV0b1RhYmxlIHBsdWdpbiB2My44LjRcbiAqXG4gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAyNCBTaW1vbiBCZW5ndHNzb24sIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1vbmJlbmd0c3Nvbi9qc1BERi1BdXRvVGFibGVcbiAqICAgICAgICAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogICAgICAgICAgICAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqXG4gKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKGZ1bmN0aW9uIHdlYnBhY2tMb2FkT3B0aW9uYWxFeHRlcm5hbE1vZHVsZSgpIHsgdHJ5IHsgcmV0dXJuIHJlcXVpcmUoXCJqc3BkZlwiKTsgfSBjYXRjaChlKSB7fSB9KCkpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImpzcGRmXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBmYWN0b3J5KChmdW5jdGlvbiB3ZWJwYWNrTG9hZE9wdGlvbmFsRXh0ZXJuYWxNb2R1bGUoKSB7IHRyeSB7IHJldHVybiByZXF1aXJlKFwianNwZGZcIik7IH0gY2F0Y2goZSkge30gfSgpKSkgOiBmYWN0b3J5KHJvb3RbXCJqc3BkZlwiXSk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KSh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHRoaXMgIT09ICd1bmRlZmluZWQnID8gdGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IGdsb2JhbCAsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2NF9fKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdFwidXNlIHN0cmljdFwiO1xuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDE3Mjpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykge1xuXG5cbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmV4cG9ydHMuQ2VsbEhvb2tEYXRhID0gZXhwb3J0cy5Ib29rRGF0YSA9IHZvaWQgMDtcbnZhciBIb29rRGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBIb29rRGF0YShkb2MsIHRhYmxlLCBjdXJzb3IpIHtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0YWJsZS5wYWdlTnVtYmVyO1xuICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IHRoaXMucGFnZU51bWJlcjtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHRhYmxlLnNldHRpbmdzO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2MuZ2V0RG9jdW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIEhvb2tEYXRhO1xufSgpKTtcbmV4cG9ydHMuSG9va0RhdGEgPSBIb29rRGF0YTtcbnZhciBDZWxsSG9va0RhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENlbGxIb29rRGF0YSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDZWxsSG9va0RhdGEoZG9jLCB0YWJsZSwgY2VsbCwgcm93LCBjb2x1bW4sIGN1cnNvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkb2MsIHRhYmxlLCBjdXJzb3IpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNlbGwgPSBjZWxsO1xuICAgICAgICBfdGhpcy5yb3cgPSByb3c7XG4gICAgICAgIF90aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgX3RoaXMuc2VjdGlvbiA9IHJvdy5zZWN0aW9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBDZWxsSG9va0RhdGE7XG59KEhvb2tEYXRhKSk7XG5leHBvcnRzLkNlbGxIb29rRGF0YSA9IENlbGxIb29rRGF0YTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzQwOlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG52YXIgaHRtbFBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBhdXRvVGFibGVUZXh0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7XG52YXIgZG9jdW1lbnRIYW5kbGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NCk7XG52YXIgaW5wdXRQYXJzZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNzc2KTtcbnZhciB0YWJsZURyYXdlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NjQpO1xudmFyIHRhYmxlQ2FsY3VsYXRvcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzIpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGpzUERGKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBqc1BERi5BUEkuYXV0b1RhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvcHRpb25zO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBhcmdzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXNlIG9mIGRlcHJlY2F0ZWQgYXV0b1RhYmxlIGluaXRpYXRpb24nKTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBhcmdzWzJdIHx8IHt9O1xuICAgICAgICAgICAgb3B0aW9ucy5jb2x1bW5zID0gYXJnc1swXTtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IGFyZ3NbMV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlucHV0ID0gKDAsIGlucHV0UGFyc2VyXzEucGFyc2VJbnB1dCkodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHZhciB0YWJsZSA9ICgwLCB0YWJsZUNhbGN1bGF0b3JfMS5jcmVhdGVUYWJsZSkodGhpcywgaW5wdXQpO1xuICAgICAgICAoMCwgdGFibGVEcmF3ZXJfMS5kcmF3VGFibGUpKHRoaXMsIHRhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBBc3NpZ24gZmFsc2UgdG8gZW5hYmxlIGBkb2MubGFzdEF1dG9UYWJsZS5maW5hbFkgfHwgNDBgIHN1Z2FyXG4gICAganNQREYuQVBJLmxhc3RBdXRvVGFibGUgPSBmYWxzZTtcbiAgICBqc1BERi5BUEkucHJldmlvdXNBdXRvVGFibGUgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZCBpbiB2M1xuICAgIGpzUERGLkFQSS5hdXRvVGFibGUucHJldmlvdXMgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZCBpbiB2M1xuICAgIGpzUERGLkFQSS5hdXRvVGFibGVUZXh0ID0gZnVuY3Rpb24gKHRleHQsIHgsIHksIHN0eWxlcykge1xuICAgICAgICAoMCwgYXV0b1RhYmxlVGV4dF8xLmRlZmF1bHQpKHRleHQsIHgsIHksIHN0eWxlcywgdGhpcyk7XG4gICAgfTtcbiAgICBqc1BERi5BUEkuYXV0b1RhYmxlU2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmYXVsdHMpIHtcbiAgICAgICAgZG9jdW1lbnRIYW5kbGVyXzEuRG9jSGFuZGxlci5zZXREZWZhdWx0cyhkZWZhdWx0cywgdGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAganNQREYuYXV0b1RhYmxlU2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmYXVsdHMsIGRvYykge1xuICAgICAgICBkb2N1bWVudEhhbmRsZXJfMS5Eb2NIYW5kbGVyLnNldERlZmF1bHRzKGRlZmF1bHRzLCBkb2MpO1xuICAgIH07XG4gICAganNQREYuQVBJLmF1dG9UYWJsZUh0bWxUb0pzb24gPSBmdW5jdGlvbiAodGFibGVFbGVtLCBpbmNsdWRlSGlkZGVuRWxlbWVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoaW5jbHVkZUhpZGRlbkVsZW1lbnRzID09PSB2b2lkIDApIHsgaW5jbHVkZUhpZGRlbkVsZW1lbnRzID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcnVuIGF1dG9UYWJsZUh0bWxUb0pzb24gaW4gbm9uIGJyb3dzZXIgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkb2MgPSBuZXcgZG9jdW1lbnRIYW5kbGVyXzEuRG9jSGFuZGxlcih0aGlzKTtcbiAgICAgICAgdmFyIF9iID0gKDAsIGh0bWxQYXJzZXJfMS5wYXJzZUh0bWwpKGRvYywgdGFibGVFbGVtLCB3aW5kb3csIGluY2x1ZGVIaWRkZW5FbGVtZW50cywgZmFsc2UpLCBoZWFkID0gX2IuaGVhZCwgYm9keSA9IF9iLmJvZHk7XG4gICAgICAgIHZhciBjb2x1bW5zID0gKChfYSA9IGhlYWRbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuY29udGVudDsgfSkpIHx8IFtdO1xuICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBjb2x1bW5zLCByb3dzOiBib2R5LCBkYXRhOiBib2R5IH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGpzUERGLkFQSS5hdXRvVGFibGVFbmRQb3NZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVc2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbjogYXV0b1RhYmxlRW5kUG9zWS4gVXNlIGRvYy5sYXN0QXV0b1RhYmxlLmZpbmFsWSBpbnN0ZWFkLicpO1xuICAgICAgICB2YXIgcHJldiA9IHRoaXMubGFzdEF1dG9UYWJsZTtcbiAgICAgICAgaWYgKHByZXYgJiYgcHJldi5maW5hbFkpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2LmZpbmFsWTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGpzUERGLkFQSS5hdXRvVGFibGVBZGRQYWdlQ29udGVudCA9IGZ1bmN0aW9uIChob29rKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VzZSBvZiBkZXByZWNhdGVkIGZ1bmN0aW9uOiBhdXRvVGFibGVBZGRQYWdlQ29udGVudC4gVXNlIGpzUERGLmF1dG9UYWJsZVNldERlZmF1bHRzKHtkaWREcmF3UGFnZTogKCkgPT4ge319KSBpbnN0ZWFkLicpO1xuICAgICAgICBpZiAoIWpzUERGLkFQSS5hdXRvVGFibGUuZ2xvYmFsRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIGpzUERGLkFQSS5hdXRvVGFibGUuZ2xvYmFsRGVmYXVsdHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBqc1BERi5BUEkuYXV0b1RhYmxlLmdsb2JhbERlZmF1bHRzLmFkZFBhZ2VDb250ZW50ID0gaG9vaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGpzUERGLkFQSS5hdXRvVGFibGVBZGRQYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVc2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbjogYXV0b1RhYmxlQWRkUGFnZS4gVXNlIGRvYy5hZGRQYWdlKCknKTtcbiAgICAgICAgdGhpcy5hZGRQYWdlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGRlZmF1bHRfMTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTM2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG4vKipcbiAqIEltcHJvdmVkIHRleHQgZnVuY3Rpb24gd2l0aCBoYWxpZ24gYW5kIHZhbGlnbiBzdXBwb3J0XG4gKiBJbnNwaXJhdGlvbiBmcm9tOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI4MzI3NTEwL2FsaWduLXRleHQtcmlnaHQtdXNpbmctanNwZGYvMjg0MzMxMTMjMjg0MzMxMTNcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdF8xKHRleHQsIHgsIHksIHN0eWxlcywgZG9jKSB7XG4gICAgc3R5bGVzID0gc3R5bGVzIHx8IHt9O1xuICAgIHZhciBQSFlTSUNBTF9MSU5FX0hFSUdIVCA9IDEuMTU7XG4gICAgdmFyIGsgPSBkb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgdmFyIGZvbnRTaXplID0gZG9jLmludGVybmFsLmdldEZvbnRTaXplKCkgLyBrO1xuICAgIHZhciBsaW5lSGVpZ2h0RmFjdG9yID0gZG9jLmdldExpbmVIZWlnaHRGYWN0b3JcbiAgICAgICAgPyBkb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpXG4gICAgICAgIDogUEhZU0lDQUxfTElORV9IRUlHSFQ7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBmb250U2l6ZSAqIGxpbmVIZWlnaHRGYWN0b3I7XG4gICAgdmFyIHNwbGl0UmVnZXggPSAvXFxyXFxufFxccnxcXG4vZztcbiAgICB2YXIgc3BsaXRUZXh0ID0gJyc7XG4gICAgdmFyIGxpbmVDb3VudCA9IDE7XG4gICAgaWYgKHN0eWxlcy52YWxpZ24gPT09ICdtaWRkbGUnIHx8XG4gICAgICAgIHN0eWxlcy52YWxpZ24gPT09ICdib3R0b20nIHx8XG4gICAgICAgIHN0eWxlcy5oYWxpZ24gPT09ICdjZW50ZXInIHx8XG4gICAgICAgIHN0eWxlcy5oYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgc3BsaXRUZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dC5zcGxpdChzcGxpdFJlZ2V4KSA6IHRleHQ7XG4gICAgICAgIGxpbmVDb3VudCA9IHNwbGl0VGV4dC5sZW5ndGggfHwgMTtcbiAgICB9XG4gICAgLy8gQWxpZ24gdGhlIHRvcFxuICAgIHkgKz0gZm9udFNpemUgKiAoMiAtIFBIWVNJQ0FMX0xJTkVfSEVJR0hUKTtcbiAgICBpZiAoc3R5bGVzLnZhbGlnbiA9PT0gJ21pZGRsZScpXG4gICAgICAgIHkgLT0gKGxpbmVDb3VudCAvIDIpICogbGluZUhlaWdodDtcbiAgICBlbHNlIGlmIChzdHlsZXMudmFsaWduID09PSAnYm90dG9tJylcbiAgICAgICAgeSAtPSBsaW5lQ291bnQgKiBsaW5lSGVpZ2h0O1xuICAgIGlmIChzdHlsZXMuaGFsaWduID09PSAnY2VudGVyJyB8fCBzdHlsZXMuaGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHZhciBhbGlnblNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgaWYgKHN0eWxlcy5oYWxpZ24gPT09ICdjZW50ZXInKVxuICAgICAgICAgICAgYWxpZ25TaXplICo9IDAuNTtcbiAgICAgICAgaWYgKHNwbGl0VGV4dCAmJiBsaW5lQ291bnQgPj0gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaUxpbmUgPSAwOyBpTGluZSA8IHNwbGl0VGV4dC5sZW5ndGg7IGlMaW5lKyspIHtcbiAgICAgICAgICAgICAgICBkb2MudGV4dChzcGxpdFRleHRbaUxpbmVdLCB4IC0gZG9jLmdldFN0cmluZ1VuaXRXaWR0aChzcGxpdFRleHRbaUxpbmVdKSAqIGFsaWduU2l6ZSwgeSk7XG4gICAgICAgICAgICAgICAgeSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRvYztcbiAgICAgICAgfVxuICAgICAgICB4IC09IGRvYy5nZXRTdHJpbmdVbml0V2lkdGgodGV4dCkgKiBhbGlnblNpemU7XG4gICAgfVxuICAgIGlmIChzdHlsZXMuaGFsaWduID09PSAnanVzdGlmeScpIHtcbiAgICAgICAgZG9jLnRleHQodGV4dCwgeCwgeSwge1xuICAgICAgICAgICAgbWF4V2lkdGg6IHN0eWxlcy5tYXhXaWR0aCB8fCAxMDAsXG4gICAgICAgICAgICBhbGlnbjogJ2p1c3RpZnknLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRvYy50ZXh0KHRleHQsIHgsIHkpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jO1xufVxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBkZWZhdWx0XzE7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQyMDpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykge1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHsgdmFsdWU6IHRydWUgfSkpO1xuZXhwb3J0cy5nZXRQYWdlQXZhaWxhYmxlV2lkdGggPSBleHBvcnRzLnBhcnNlU3BhY2luZyA9IGV4cG9ydHMuZ2V0RmlsbFN0eWxlID0gZXhwb3J0cy5hZGRUYWJsZUJvcmRlciA9IGV4cG9ydHMuZ2V0U3RyaW5nV2lkdGggPSB2b2lkIDA7XG5mdW5jdGlvbiBnZXRTdHJpbmdXaWR0aCh0ZXh0LCBzdHlsZXMsIGRvYykge1xuICAgIGRvYy5hcHBseVN0eWxlcyhzdHlsZXMsIHRydWUpO1xuICAgIHZhciB0ZXh0QXJyID0gQXJyYXkuaXNBcnJheSh0ZXh0KSA/IHRleHQgOiBbdGV4dF07XG4gICAgdmFyIHdpZGVzdExpbmVXaWR0aCA9IHRleHRBcnJcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodGV4dCkgeyByZXR1cm4gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gTWF0aC5tYXgoYSwgYik7IH0sIDApO1xuICAgIHJldHVybiB3aWRlc3RMaW5lV2lkdGg7XG59XG5leHBvcnRzLmdldFN0cmluZ1dpZHRoID0gZ2V0U3RyaW5nV2lkdGg7XG5mdW5jdGlvbiBhZGRUYWJsZUJvcmRlcihkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yKSB7XG4gICAgdmFyIGxpbmVXaWR0aCA9IHRhYmxlLnNldHRpbmdzLnRhYmxlTGluZVdpZHRoO1xuICAgIHZhciBsaW5lQ29sb3IgPSB0YWJsZS5zZXR0aW5ncy50YWJsZUxpbmVDb2xvcjtcbiAgICBkb2MuYXBwbHlTdHlsZXMoeyBsaW5lV2lkdGg6IGxpbmVXaWR0aCwgbGluZUNvbG9yOiBsaW5lQ29sb3IgfSk7XG4gICAgdmFyIGZpbGxTdHlsZSA9IGdldEZpbGxTdHlsZShsaW5lV2lkdGgsIGZhbHNlKTtcbiAgICBpZiAoZmlsbFN0eWxlKSB7XG4gICAgICAgIGRvYy5yZWN0KHN0YXJ0UG9zLngsIHN0YXJ0UG9zLnksIHRhYmxlLmdldFdpZHRoKGRvYy5wYWdlU2l6ZSgpLndpZHRoKSwgY3Vyc29yLnkgLSBzdGFydFBvcy55LCBmaWxsU3R5bGUpO1xuICAgIH1cbn1cbmV4cG9ydHMuYWRkVGFibGVCb3JkZXIgPSBhZGRUYWJsZUJvcmRlcjtcbmZ1bmN0aW9uIGdldEZpbGxTdHlsZShsaW5lV2lkdGgsIGZpbGxDb2xvcikge1xuICAgIHZhciBkcmF3TGluZSA9IGxpbmVXaWR0aCA+IDA7XG4gICAgdmFyIGRyYXdCYWNrZ3JvdW5kID0gZmlsbENvbG9yIHx8IGZpbGxDb2xvciA9PT0gMDtcbiAgICBpZiAoZHJhd0xpbmUgJiYgZHJhd0JhY2tncm91bmQpIHtcbiAgICAgICAgcmV0dXJuICdERic7IC8vIEZpbGwgdGhlbiBzdHJva2VcbiAgICB9XG4gICAgZWxzZSBpZiAoZHJhd0xpbmUpIHtcbiAgICAgICAgcmV0dXJuICdTJzsgLy8gT25seSBzdHJva2UgKHRyYW5zcGFyZW50IGJhY2tncm91bmQpXG4gICAgfVxuICAgIGVsc2UgaWYgKGRyYXdCYWNrZ3JvdW5kKSB7XG4gICAgICAgIHJldHVybiAnRic7IC8vIE9ubHkgZmlsbCwgbm8gc3Ryb2tlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5leHBvcnRzLmdldEZpbGxTdHlsZSA9IGdldEZpbGxTdHlsZTtcbmZ1bmN0aW9uIHBhcnNlU3BhY2luZyh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHZhbHVlID0gdmFsdWUgfHwgZGVmYXVsdFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9wOiB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgICByaWdodDogdmFsdWVbMV0sXG4gICAgICAgICAgICAgICAgYm90dG9tOiB2YWx1ZVsyXSxcbiAgICAgICAgICAgICAgICBsZWZ0OiB2YWx1ZVszXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogdmFsdWVbMF0sXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHZhbHVlWzFdLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogdmFsdWVbMl0sXG4gICAgICAgICAgICAgICAgbGVmdDogdmFsdWVbMV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b3A6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB2YWx1ZVsxXSxcbiAgICAgICAgICAgICAgICBib3R0b206IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIGxlZnQ6IHZhbHVlWzFdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLnZlcnRpY2FsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWUudG9wID0gdmFsdWUudmVydGljYWw7XG4gICAgICAgICAgICB2YWx1ZS5ib3R0b20gPSB2YWx1ZS52ZXJ0aWNhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmhvcml6b250YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWx1ZS5yaWdodCA9IHZhbHVlLmhvcml6b250YWw7XG4gICAgICAgICAgICB2YWx1ZS5sZWZ0ID0gdmFsdWUuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogKF9hID0gdmFsdWUubGVmdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgdG9wOiAoX2IgPSB2YWx1ZS50b3ApICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIHJpZ2h0OiAoX2MgPSB2YWx1ZS5yaWdodCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgYm90dG9tOiAoX2QgPSB2YWx1ZS5ib3R0b20pICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB7IHRvcDogdmFsdWUsIHJpZ2h0OiB2YWx1ZSwgYm90dG9tOiB2YWx1ZSwgbGVmdDogdmFsdWUgfTtcbn1cbmV4cG9ydHMucGFyc2VTcGFjaW5nID0gcGFyc2VTcGFjaW5nO1xuZnVuY3Rpb24gZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGRvYywgdGFibGUpIHtcbiAgICB2YXIgbWFyZ2lucyA9IHBhcnNlU3BhY2luZyh0YWJsZS5zZXR0aW5ncy5tYXJnaW4sIDApO1xuICAgIHJldHVybiBkb2MucGFnZVNpemUoKS53aWR0aCAtIChtYXJnaW5zLmxlZnQgKyBtYXJnaW5zLnJpZ2h0KTtcbn1cbmV4cG9ydHMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoID0gZ2V0UGFnZUF2YWlsYWJsZVdpZHRoO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3OTY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuXG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLmdldFRoZW1lID0gZXhwb3J0cy5kZWZhdWx0U3R5bGVzID0gZXhwb3J0cy5IdG1sUm93SW5wdXQgPSB2b2lkIDA7XG52YXIgSHRtbFJvd0lucHV0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhIdG1sUm93SW5wdXQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSHRtbFJvd0lucHV0KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBIdG1sUm93SW5wdXQ7XG59KEFycmF5KSk7XG5leHBvcnRzLkh0bWxSb3dJbnB1dCA9IEh0bWxSb3dJbnB1dDtcbi8vIEJhc2Ugc3R5bGUgZm9yIGFsbCB0aGVtZXNcbmZ1bmN0aW9uIGRlZmF1bHRTdHlsZXMoc2NhbGVGYWN0b3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb250OiAnaGVsdmV0aWNhJywgLy8gaGVsdmV0aWNhLCB0aW1lcywgY291cmllclxuICAgICAgICBmb250U3R5bGU6ICdub3JtYWwnLCAvLyBub3JtYWwsIGJvbGQsIGl0YWxpYywgYm9sZGl0YWxpY1xuICAgICAgICBvdmVyZmxvdzogJ2xpbmVicmVhaycsIC8vIGxpbmVicmVhaywgZWxsaXBzaXplLCB2aXNpYmxlIG9yIGhpZGRlblxuICAgICAgICBmaWxsQ29sb3I6IGZhbHNlLCAvLyBFaXRoZXIgZmFsc2UgZm9yIHRyYW5zcGFyZW50LCByYmcgYXJyYXkgZS5nLiBbMjU1LCAyNTUsIDI1NV0gb3IgZ3JheSBsZXZlbCBlLmcgMjAwXG4gICAgICAgIHRleHRDb2xvcjogMjAsXG4gICAgICAgIGhhbGlnbjogJ2xlZnQnLCAvLyBsZWZ0LCBjZW50ZXIsIHJpZ2h0LCBqdXN0aWZ5XG4gICAgICAgIHZhbGlnbjogJ3RvcCcsIC8vIHRvcCwgbWlkZGxlLCBib3R0b21cbiAgICAgICAgZm9udFNpemU6IDEwLFxuICAgICAgICBjZWxsUGFkZGluZzogNSAvIHNjYWxlRmFjdG9yLCAvLyBudW1iZXIgb3Ige3RvcCxsZWZ0LHJpZ2h0LGxlZnQsdmVydGljYWwsaG9yaXpvbnRhbH1cbiAgICAgICAgbGluZUNvbG9yOiAyMDAsXG4gICAgICAgIGxpbmVXaWR0aDogMCxcbiAgICAgICAgY2VsbFdpZHRoOiAnYXV0bycsIC8vICdhdXRvJ3wnd3JhcCd8bnVtYmVyXG4gICAgICAgIG1pbkNlbGxIZWlnaHQ6IDAsXG4gICAgICAgIG1pbkNlbGxXaWR0aDogMCxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZhdWx0U3R5bGVzID0gZGVmYXVsdFN0eWxlcztcbmZ1bmN0aW9uIGdldFRoZW1lKG5hbWUpIHtcbiAgICB2YXIgdGhlbWVzID0ge1xuICAgICAgICBzdHJpcGVkOiB7XG4gICAgICAgICAgICB0YWJsZTogeyBmaWxsQ29sb3I6IDI1NSwgdGV4dENvbG9yOiA4MCwgZm9udFN0eWxlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgaGVhZDogeyB0ZXh0Q29sb3I6IDI1NSwgZmlsbENvbG9yOiBbNDEsIDEyOCwgMTg1XSwgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgICAgICAgIGJvZHk6IHt9LFxuICAgICAgICAgICAgZm9vdDogeyB0ZXh0Q29sb3I6IDI1NSwgZmlsbENvbG9yOiBbNDEsIDEyOCwgMTg1XSwgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgICAgICAgIGFsdGVybmF0ZVJvdzogeyBmaWxsQ29sb3I6IDI0NSB9LFxuICAgICAgICB9LFxuICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICB0YWJsZToge1xuICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogMjU1LFxuICAgICAgICAgICAgICAgIHRleHRDb2xvcjogODAsXG4gICAgICAgICAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IDAuMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkOiB7XG4gICAgICAgICAgICAgICAgdGV4dENvbG9yOiAyNTUsXG4gICAgICAgICAgICAgICAgZmlsbENvbG9yOiBbMjYsIDE4OCwgMTU2XSxcbiAgICAgICAgICAgICAgICBmb250U3R5bGU6ICdib2xkJyxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keToge30sXG4gICAgICAgICAgICBmb290OiB7XG4gICAgICAgICAgICAgICAgdGV4dENvbG9yOiAyNTUsXG4gICAgICAgICAgICAgICAgZmlsbENvbG9yOiBbMjYsIDE4OCwgMTU2XSxcbiAgICAgICAgICAgICAgICBmb250U3R5bGU6ICdib2xkJyxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWx0ZXJuYXRlUm93OiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgcGxhaW46IHtcbiAgICAgICAgICAgIGhlYWQ6IHsgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgICAgICAgIGZvb3Q6IHsgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiB0aGVtZXNbbmFtZV07XG59XG5leHBvcnRzLmdldFRoZW1lID0gZ2V0VGhlbWU7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDkwMzpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHsgdmFsdWU6IHRydWUgfSkpO1xuZXhwb3J0cy5wYXJzZUNzcyA9IHZvaWQgMDtcbi8vIExpbWl0YXRpb25zXG4vLyAtIE5vIHN1cHBvcnQgZm9yIGJvcmRlciBzcGFjaW5nXG4vLyAtIE5vIHN1cHBvcnQgZm9yIHRyYW5zcGFyZW5jeVxudmFyIGNvbW1vbl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjApO1xuZnVuY3Rpb24gcGFyc2VDc3Moc3VwcG9ydGVkRm9udHMsIGVsZW1lbnQsIHNjYWxlRmFjdG9yLCBzdHlsZSwgd2luZG93KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBweFNjYWxlRmFjdG9yID0gOTYgLyA3MjtcbiAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gcGFyc2VDb2xvcihlbGVtZW50LCBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSlbJ2JhY2tncm91bmRDb2xvciddO1xuICAgIH0pO1xuICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbClcbiAgICAgICAgcmVzdWx0LmZpbGxDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICB2YXIgdGV4dENvbG9yID0gcGFyc2VDb2xvcihlbGVtZW50LCBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSlbJ2NvbG9yJ107XG4gICAgfSk7XG4gICAgaWYgKHRleHRDb2xvciAhPSBudWxsKVxuICAgICAgICByZXN1bHQudGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VQYWRkaW5nKHN0eWxlLCBzY2FsZUZhY3Rvcik7XG4gICAgaWYgKHBhZGRpbmcpXG4gICAgICAgIHJlc3VsdC5jZWxsUGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdmFyIGJvcmRlckNvbG9yU2lkZSA9ICdib3JkZXJUb3BDb2xvcic7XG4gICAgdmFyIGZpbmFsU2NhbGVGYWN0b3IgPSBweFNjYWxlRmFjdG9yICogc2NhbGVGYWN0b3I7XG4gICAgdmFyIGJ0dyA9IHN0eWxlLmJvcmRlclRvcFdpZHRoO1xuICAgIGlmIChzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCA9PT0gYnR3ICYmXG4gICAgICAgIHN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPT09IGJ0dyAmJlxuICAgICAgICBzdHlsZS5ib3JkZXJMZWZ0V2lkdGggPT09IGJ0dykge1xuICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSAocGFyc2VGbG9hdChidHcpIHx8IDApIC8gZmluYWxTY2FsZUZhY3RvcjtcbiAgICAgICAgaWYgKGJvcmRlcldpZHRoKVxuICAgICAgICAgICAgcmVzdWx0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmxpbmVXaWR0aCA9IHtcbiAgICAgICAgICAgIHRvcDogKHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgpIHx8IDApIC8gZmluYWxTY2FsZUZhY3RvcixcbiAgICAgICAgICAgIHJpZ2h0OiAocGFyc2VGbG9hdChzdHlsZS5ib3JkZXJSaWdodFdpZHRoKSB8fCAwKSAvIGZpbmFsU2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBib3R0b206IChwYXJzZUZsb2F0KHN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKSB8fCAwKSAvIGZpbmFsU2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBsZWZ0OiAocGFyc2VGbG9hdChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgpIHx8IDApIC8gZmluYWxTY2FsZUZhY3RvcixcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQ2hvb3NlIGJvcmRlciBjb2xvciBvZiBmaXJzdCBhdmFpbGFibGUgc2lkZVxuICAgICAgICAvLyBjb3VsZCBiZSBpbXByb3ZlZCBieSBzdXBwb3J0aW5nIG9iamVjdCBhcyBsaW5lQ29sb3JcbiAgICAgICAgaWYgKCFyZXN1bHQubGluZVdpZHRoLnRvcCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5saW5lV2lkdGgucmlnaHQpIHtcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvclNpZGUgPSAnYm9yZGVyUmlnaHRDb2xvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQubGluZVdpZHRoLmJvdHRvbSkge1xuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yU2lkZSA9ICdib3JkZXJCb3R0b21Db2xvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQubGluZVdpZHRoLmxlZnQpIHtcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvclNpZGUgPSAnYm9yZGVyTGVmdENvbG9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgYm9yZGVyQ29sb3IgPSBwYXJzZUNvbG9yKGVsZW1lbnQsIGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKVtib3JkZXJDb2xvclNpZGVdO1xuICAgIH0pO1xuICAgIGlmIChib3JkZXJDb2xvciAhPSBudWxsKVxuICAgICAgICByZXN1bHQubGluZUNvbG9yID0gYm9yZGVyQ29sb3I7XG4gICAgdmFyIGFjY2VwdGVkID0gWydsZWZ0JywgJ3JpZ2h0JywgJ2NlbnRlcicsICdqdXN0aWZ5J107XG4gICAgaWYgKGFjY2VwdGVkLmluZGV4T2Yoc3R5bGUudGV4dEFsaWduKSAhPT0gLTEpIHtcbiAgICAgICAgcmVzdWx0LmhhbGlnbiA9IHN0eWxlLnRleHRBbGlnbjtcbiAgICB9XG4gICAgYWNjZXB0ZWQgPSBbJ21pZGRsZScsICdib3R0b20nLCAndG9wJ107XG4gICAgaWYgKGFjY2VwdGVkLmluZGV4T2Yoc3R5bGUudmVydGljYWxBbGlnbikgIT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC52YWxpZ24gPSBzdHlsZS52ZXJ0aWNhbEFsaWduO1xuICAgIH1cbiAgICB2YXIgcmVzID0gcGFyc2VJbnQoc3R5bGUuZm9udFNpemUgfHwgJycpO1xuICAgIGlmICghaXNOYU4ocmVzKSlcbiAgICAgICAgcmVzdWx0LmZvbnRTaXplID0gcmVzIC8gcHhTY2FsZUZhY3RvcjtcbiAgICB2YXIgZm9udFN0eWxlID0gcGFyc2VGb250U3R5bGUoc3R5bGUpO1xuICAgIGlmIChmb250U3R5bGUpXG4gICAgICAgIHJlc3VsdC5mb250U3R5bGUgPSBmb250U3R5bGU7XG4gICAgdmFyIGZvbnQgPSAoc3R5bGUuZm9udEZhbWlseSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoc3VwcG9ydGVkRm9udHMuaW5kZXhPZihmb250KSAhPT0gLTEpIHtcbiAgICAgICAgcmVzdWx0LmZvbnQgPSBmb250O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5wYXJzZUNzcyA9IHBhcnNlQ3NzO1xuZnVuY3Rpb24gcGFyc2VGb250U3R5bGUoc3R5bGUpIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgaWYgKHN0eWxlLmZvbnRXZWlnaHQgPT09ICdib2xkJyB8fFxuICAgICAgICBzdHlsZS5mb250V2VpZ2h0ID09PSAnYm9sZGVyJyB8fFxuICAgICAgICBwYXJzZUludChzdHlsZS5mb250V2VpZ2h0KSA+PSA3MDApIHtcbiAgICAgICAgcmVzID0gJ2JvbGQnO1xuICAgIH1cbiAgICBpZiAoc3R5bGUuZm9udFN0eWxlID09PSAnaXRhbGljJyB8fCBzdHlsZS5mb250U3R5bGUgPT09ICdvYmxpcXVlJykge1xuICAgICAgICByZXMgKz0gJ2l0YWxpYyc7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBwYXJzZUNvbG9yKGVsZW1lbnQsIHN0eWxlR2V0dGVyKSB7XG4gICAgdmFyIGNzc0NvbG9yID0gcmVhbENvbG9yKGVsZW1lbnQsIHN0eWxlR2V0dGVyKTtcbiAgICBpZiAoIWNzc0NvbG9yKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmdiYSA9IGNzc0NvbG9yLm1hdGNoKC9ecmdiYT9cXCgoXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCspKD86LFxccyooXFxkKlxcLj9cXGQqKSk/XFwpJC8pO1xuICAgIGlmICghcmdiYSB8fCAhQXJyYXkuaXNBcnJheShyZ2JhKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGNvbG9yID0gW1xuICAgICAgICBwYXJzZUludChyZ2JhWzFdKSxcbiAgICAgICAgcGFyc2VJbnQocmdiYVsyXSksXG4gICAgICAgIHBhcnNlSW50KHJnYmFbM10pLFxuICAgIF07XG4gICAgdmFyIGFscGhhID0gcGFyc2VJbnQocmdiYVs0XSk7XG4gICAgaWYgKGFscGhhID09PSAwIHx8IGlzTmFOKGNvbG9yWzBdKSB8fCBpc05hTihjb2xvclsxXSkgfHwgaXNOYU4oY29sb3JbMl0pKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG59XG5mdW5jdGlvbiByZWFsQ29sb3IoZWxlbSwgc3R5bGVHZXR0ZXIpIHtcbiAgICB2YXIgYmcgPSBzdHlsZUdldHRlcihlbGVtKTtcbiAgICBpZiAoYmcgPT09ICdyZ2JhKDAsIDAsIDAsIDApJyB8fFxuICAgICAgICBiZyA9PT0gJ3RyYW5zcGFyZW50JyB8fFxuICAgICAgICBiZyA9PT0gJ2luaXRpYWwnIHx8XG4gICAgICAgIGJnID09PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgaWYgKGVsZW0ucGFyZW50RWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhbENvbG9yKGVsZW0ucGFyZW50RWxlbWVudCwgc3R5bGVHZXR0ZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJnO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlUGFkZGluZyhzdHlsZSwgc2NhbGVGYWN0b3IpIHtcbiAgICB2YXIgdmFsID0gW1xuICAgICAgICBzdHlsZS5wYWRkaW5nVG9wLFxuICAgICAgICBzdHlsZS5wYWRkaW5nUmlnaHQsXG4gICAgICAgIHN0eWxlLnBhZGRpbmdCb3R0b20sXG4gICAgICAgIHN0eWxlLnBhZGRpbmdMZWZ0LFxuICAgIF07XG4gICAgdmFyIHB4U2NhbGVGYWN0b3IgPSA5NiAvICg3MiAvIHNjYWxlRmFjdG9yKTtcbiAgICB2YXIgbGluZVBhZGRpbmcgPSAocGFyc2VJbnQoc3R5bGUubGluZUhlaWdodCkgLSBwYXJzZUludChzdHlsZS5mb250U2l6ZSkpIC8gc2NhbGVGYWN0b3IgLyAyO1xuICAgIHZhciBpbnB1dFBhZGRpbmcgPSB2YWwubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChuIHx8ICcwJykgLyBweFNjYWxlRmFjdG9yO1xuICAgIH0pO1xuICAgIHZhciBwYWRkaW5nID0gKDAsIGNvbW1vbl8xLnBhcnNlU3BhY2luZykoaW5wdXRQYWRkaW5nLCAwKTtcbiAgICBpZiAobGluZVBhZGRpbmcgPiBwYWRkaW5nLnRvcCkge1xuICAgICAgICBwYWRkaW5nLnRvcCA9IGxpbmVQYWRkaW5nO1xuICAgIH1cbiAgICBpZiAobGluZVBhZGRpbmcgPiBwYWRkaW5nLmJvdHRvbSkge1xuICAgICAgICBwYWRkaW5nLmJvdHRvbSA9IGxpbmVQYWRkaW5nO1xuICAgIH1cbiAgICByZXR1cm4gcGFkZGluZztcbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzQ0OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLkRvY0hhbmRsZXIgPSB2b2lkIDA7XG52YXIgZ2xvYmFsRGVmYXVsdHMgPSB7fTtcbnZhciBEb2NIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERvY0hhbmRsZXIoanNQREZEb2N1bWVudCkge1xuICAgICAgICB0aGlzLmpzUERGRG9jdW1lbnQgPSBqc1BERkRvY3VtZW50O1xuICAgICAgICB0aGlzLnVzZXJTdHlsZXMgPSB7XG4gICAgICAgICAgICAvLyBCbGFjayBmb3IgdmVyc2lvbnMgb2YganNwZGYgd2l0aG91dCBnZXRUZXh0Q29sb3JcbiAgICAgICAgICAgIHRleHRDb2xvcjoganNQREZEb2N1bWVudC5nZXRUZXh0Q29sb3JcbiAgICAgICAgICAgICAgICA/IHRoaXMuanNQREZEb2N1bWVudC5nZXRUZXh0Q29sb3IoKVxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBqc1BERkRvY3VtZW50LmludGVybmFsLmdldEZvbnRTaXplKCksXG4gICAgICAgICAgICBmb250U3R5bGU6IGpzUERGRG9jdW1lbnQuaW50ZXJuYWwuZ2V0Rm9udCgpLmZvbnRTdHlsZSxcbiAgICAgICAgICAgIGZvbnQ6IGpzUERGRG9jdW1lbnQuaW50ZXJuYWwuZ2V0Rm9udCgpLmZvbnROYW1lLFxuICAgICAgICAgICAgLy8gMCBmb3IgdmVyc2lvbnMgb2YganNwZGYgd2l0aG91dCBnZXRMaW5lV2lkdGhcbiAgICAgICAgICAgIGxpbmVXaWR0aDoganNQREZEb2N1bWVudC5nZXRMaW5lV2lkdGhcbiAgICAgICAgICAgICAgICA/IHRoaXMuanNQREZEb2N1bWVudC5nZXRMaW5lV2lkdGgoKVxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIC8vIEJsYWNrIGZvciB2ZXJzaW9ucyBvZiBqc3BkZiB3aXRob3V0IGdldERyYXdDb2xvclxuICAgICAgICAgICAgbGluZUNvbG9yOiBqc1BERkRvY3VtZW50LmdldERyYXdDb2xvclxuICAgICAgICAgICAgICAgID8gdGhpcy5qc1BERkRvY3VtZW50LmdldERyYXdDb2xvcigpXG4gICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBEb2NIYW5kbGVyLnNldERlZmF1bHRzID0gZnVuY3Rpb24gKGRlZmF1bHRzLCBkb2MpIHtcbiAgICAgICAgaWYgKGRvYyA9PT0gdm9pZCAwKSB7IGRvYyA9IG51bGw7IH1cbiAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgZG9jLl9fYXV0b1RhYmxlRG9jdW1lbnREZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9jSGFuZGxlci51bmlmeUNvbG9yID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFtjLCBjLCBjXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBbY107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuYXBwbHlTdHlsZXMgPSBmdW5jdGlvbiAoc3R5bGVzLCBmb250T25seSkge1xuICAgICAgICAvLyBGb250IHN0eWxlIG5lZWRzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIGZvbnRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbW9uYmVuZ3Rzc29uL2pzUERGLUF1dG9UYWJsZS9pc3N1ZXMvNjMyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBpZiAoZm9udE9ubHkgPT09IHZvaWQgMCkgeyBmb250T25seSA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChzdHlsZXMuZm9udFN0eWxlKVxuICAgICAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldEZvbnRTdHlsZSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuanNQREZEb2N1bWVudC5zZXRGb250U3R5bGUoc3R5bGVzLmZvbnRTdHlsZSk7XG4gICAgICAgIHZhciBfZCA9IHRoaXMuanNQREZEb2N1bWVudC5pbnRlcm5hbC5nZXRGb250KCksIGZvbnRTdHlsZSA9IF9kLmZvbnRTdHlsZSwgZm9udE5hbWUgPSBfZC5mb250TmFtZTtcbiAgICAgICAgaWYgKHN0eWxlcy5mb250KVxuICAgICAgICAgICAgZm9udE5hbWUgPSBzdHlsZXMuZm9udDtcbiAgICAgICAgaWYgKHN0eWxlcy5mb250U3R5bGUpIHtcbiAgICAgICAgICAgIGZvbnRTdHlsZSA9IHN0eWxlcy5mb250U3R5bGU7XG4gICAgICAgICAgICB2YXIgYXZhaWxhYmxlRm9udFN0eWxlcyA9IHRoaXMuZ2V0Rm9udExpc3QoKVtmb250TmFtZV07XG4gICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9udFN0eWxlcyAmJlxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZvbnRTdHlsZXMuaW5kZXhPZihmb250U3R5bGUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIENvbW1vbiBpc3N1ZSB3YXMgdGhhdCB0aGUgZGVmYXVsdCBib2xkIGluIGhlYWRlcnNcbiAgICAgICAgICAgICAgICAvLyBtYWRlIGN1c3RvbSBmb250cyBub3Qgd29yay4gRm9yIGV4YW1wbGU6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbW9uYmVuZ3Rzc29uL2pzUERGLUF1dG9UYWJsZS9pc3N1ZXMvNjUzXG4gICAgICAgICAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldEZvbnRTdHlsZSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmpzUERGRG9jdW1lbnQuc2V0Rm9udFN0eWxlKGF2YWlsYWJsZUZvbnRTdHlsZXNbMF0pO1xuICAgICAgICAgICAgICAgIGZvbnRTdHlsZSA9IGF2YWlsYWJsZUZvbnRTdHlsZXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5qc1BERkRvY3VtZW50LnNldEZvbnQoZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIGlmIChzdHlsZXMuZm9udFNpemUpXG4gICAgICAgICAgICB0aGlzLmpzUERGRG9jdW1lbnQuc2V0Rm9udFNpemUoc3R5bGVzLmZvbnRTaXplKTtcbiAgICAgICAgaWYgKGZvbnRPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbG9yID0gRG9jSGFuZGxlci51bmlmeUNvbG9yKHN0eWxlcy5maWxsQ29sb3IpO1xuICAgICAgICBpZiAoY29sb3IpXG4gICAgICAgICAgICAoX2EgPSB0aGlzLmpzUERGRG9jdW1lbnQpLnNldEZpbGxDb2xvci5hcHBseShfYSwgY29sb3IpO1xuICAgICAgICBjb2xvciA9IERvY0hhbmRsZXIudW5pZnlDb2xvcihzdHlsZXMudGV4dENvbG9yKTtcbiAgICAgICAgaWYgKGNvbG9yKVxuICAgICAgICAgICAgKF9iID0gdGhpcy5qc1BERkRvY3VtZW50KS5zZXRUZXh0Q29sb3IuYXBwbHkoX2IsIGNvbG9yKTtcbiAgICAgICAgY29sb3IgPSBEb2NIYW5kbGVyLnVuaWZ5Q29sb3Ioc3R5bGVzLmxpbmVDb2xvcik7XG4gICAgICAgIGlmIChjb2xvcilcbiAgICAgICAgICAgIChfYyA9IHRoaXMuanNQREZEb2N1bWVudCkuc2V0RHJhd0NvbG9yLmFwcGx5KF9jLCBjb2xvcik7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGVzLmxpbmVXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuanNQREZEb2N1bWVudC5zZXRMaW5lV2lkdGgoc3R5bGVzLmxpbmVXaWR0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLnNwbGl0VGV4dFRvU2l6ZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaXplLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQuc3BsaXRUZXh0VG9TaXplKHRleHQsIHNpemUsIG9wdHMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHJlY3RhbmdsZSB0byB0aGUgUERGXG4gICAgICogQHBhcmFtIHggQ29vcmRpbmF0ZSAoaW4gdW5pdHMgZGVjbGFyZWQgYXQgaW5jZXB0aW9uIG9mIFBERiBkb2N1bWVudCkgYWdhaW5zdCBsZWZ0IGVkZ2Ugb2YgdGhlIHBhZ2VcbiAgICAgKiBAcGFyYW0geSBDb29yZGluYXRlIChpbiB1bml0cyBkZWNsYXJlZCBhdCBpbmNlcHRpb24gb2YgUERGIGRvY3VtZW50KSBhZ2FpbnN0IHVwcGVyIGVkZ2Ugb2YgdGhlIHBhZ2VcbiAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpXG4gICAgICogQHBhcmFtIGhlaWdodCBIZWlnaHQgKGluIHVuaXRzIGRlY2xhcmVkIGF0IGluY2VwdGlvbiBvZiBQREYgZG9jdW1lbnQpXG4gICAgICogQHBhcmFtIGZpbGxTdHlsZSBBIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBwYWludGluZyBzdHlsZSBvciBudWxsLiBWYWxpZCBzdHlsZXMgaW5jbHVkZTogJ1MnIFtkZWZhdWx0XSAtIHN0cm9rZSwgJ0YnIC0gZmlsbCwgYW5kICdERicgKG9yICdGRCcpIC0gZmlsbCB0aGVuIHN0cm9rZS5cbiAgICAgKi9cbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5yZWN0ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGxTdHlsZSkge1xuICAgICAgICAvLyBudWxsIGlzIGV4Y2x1ZGVkIGZyb20gZmlsbFN0eWxlIHBvc3NpYmxlIHZhbHVlcyBiZWNhdXNlIGl0IGlzbid0IG5lZWRlZFxuICAgICAgICAvLyBhbmQgaXMgcHJvbmUgdG8gYnVncyBhcyBpdCdzIHVzZWQgdG8gcG9zdHBvbmUgc2V0dGluZyB0aGUgc3R5bGVcbiAgICAgICAgLy8gaHR0cHM6Ly9yYXdnaXQuY29tL01yUmlvL2pzUERGL21hc3Rlci9kb2NzL2pzUERGLmh0bWwjcmVjdFxuICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50LnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbFN0eWxlKTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmdldExhc3RBdXRvVGFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQubGFzdEF1dG9UYWJsZSB8fCBudWxsO1xuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuZ2V0VGV4dFdpZHRoID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNQREZEb2N1bWVudC5nZXRUZXh0V2lkdGgodGV4dCk7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5nZXREb2N1bWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNQREZEb2N1bWVudDtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLnNldFBhZ2UgPSBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICB0aGlzLmpzUERGRG9jdW1lbnQuc2V0UGFnZShwYWdlKTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmFkZFBhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQuYWRkUGFnZSgpO1xuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuZ2V0Rm9udExpc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQuZ2V0Rm9udExpc3QoKTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmdldEdsb2JhbE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxEZWZhdWx0cyB8fCB7fTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmdldERvY3VtZW50T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNQREZEb2N1bWVudC5fX2F1dG9UYWJsZURvY3VtZW50RGVmYXVsdHMgfHwge307XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5wYWdlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhZ2VTaXplID0gdGhpcy5qc1BERkRvY3VtZW50LmludGVybmFsLnBhZ2VTaXplO1xuICAgICAgICAvLyBKU1BERiAxLjQgdXNlcyBnZXQgZnVuY3Rpb25zIGluc3RlYWQgb2YgcHJvcGVydGllcyBvbiBwYWdlU2l6ZVxuICAgICAgICBpZiAocGFnZVNpemUud2lkdGggPT0gbnVsbCkge1xuICAgICAgICAgICAgcGFnZVNpemUgPSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHBhZ2VTaXplLmdldFdpZHRoKCksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBwYWdlU2l6ZS5nZXRIZWlnaHQoKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VTaXplO1xuICAgIH07XG4gICAgRG9jSGFuZGxlci5wcm90b3R5cGUuc2NhbGVGYWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzUERGRG9jdW1lbnQuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgfTtcbiAgICBEb2NIYW5kbGVyLnByb3RvdHlwZS5nZXRMaW5lSGVpZ2h0RmFjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZG9jID0gdGhpcy5qc1BERkRvY3VtZW50O1xuICAgICAgICByZXR1cm4gZG9jLmdldExpbmVIZWlnaHRGYWN0b3IgPyBkb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpIDogMS4xNTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLmdldExpbmVIZWlnaHQgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgcmV0dXJuIChmb250U2l6ZSAvIHRoaXMuc2NhbGVGYWN0b3IoKSkgKiB0aGlzLmdldExpbmVIZWlnaHRGYWN0b3IoKTtcbiAgICB9O1xuICAgIERvY0hhbmRsZXIucHJvdG90eXBlLnBhZ2VOdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYWdlSW5mbyA9IHRoaXMuanNQREZEb2N1bWVudC5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKTtcbiAgICAgICAgaWYgKCFwYWdlSW5mbykge1xuICAgICAgICAgICAgLy8gT25seSByZWNlbnQgdmVyc2lvbnMgb2YganNwZGYgaGFzIHBhZ2VJbmZvXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5qc1BERkRvY3VtZW50LmludGVybmFsLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZUluZm8ucGFnZU51bWJlcjtcbiAgICB9O1xuICAgIHJldHVybiBEb2NIYW5kbGVyO1xufSgpKTtcbmV4cG9ydHMuRG9jSGFuZGxlciA9IERvY0hhbmRsZXI7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmV4cG9ydHMucGFyc2VIdG1sID0gdm9pZCAwO1xudmFyIGNzc1BhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDMpO1xudmFyIGNvbmZpZ18xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTYpO1xuZnVuY3Rpb24gcGFyc2VIdG1sKGRvYywgaW5wdXQsIHdpbmRvdywgaW5jbHVkZUhpZGRlbkh0bWwsIHVzZUNzcykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgaWYgKGluY2x1ZGVIaWRkZW5IdG1sID09PSB2b2lkIDApIHsgaW5jbHVkZUhpZGRlbkh0bWwgPSBmYWxzZTsgfVxuICAgIGlmICh1c2VDc3MgPT09IHZvaWQgMCkgeyB1c2VDc3MgPSBmYWxzZTsgfVxuICAgIHZhciB0YWJsZUVsZW1lbnQ7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGFibGVFbGVtZW50ID0gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFibGVFbGVtZW50ID0gaW5wdXQ7XG4gICAgfVxuICAgIHZhciBzdXBwb3J0ZWRGb250cyA9IE9iamVjdC5rZXlzKGRvYy5nZXRGb250TGlzdCgpKTtcbiAgICB2YXIgc2NhbGVGYWN0b3IgPSBkb2Muc2NhbGVGYWN0b3IoKTtcbiAgICB2YXIgaGVhZCA9IFtdLCBib2R5ID0gW10sIGZvb3QgPSBbXTtcbiAgICBpZiAoIXRhYmxlRWxlbWVudCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdIdG1sIHRhYmxlIGNvdWxkIG5vdCBiZSBmb3VuZCB3aXRoIGlucHV0OiAnLCBpbnB1dCk7XG4gICAgICAgIHJldHVybiB7IGhlYWQ6IGhlYWQsIGJvZHk6IGJvZHksIGZvb3Q6IGZvb3QgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJsZUVsZW1lbnQucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRhYmxlRWxlbWVudC5yb3dzW2ldO1xuICAgICAgICB2YXIgdGFnTmFtZSA9IChfYiA9IChfYSA9IGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudC5wYXJlbnRFbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnTmFtZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciByb3cgPSBwYXJzZVJvd0NvbnRlbnQoc3VwcG9ydGVkRm9udHMsIHNjYWxlRmFjdG9yLCB3aW5kb3csIGVsZW1lbnQsIGluY2x1ZGVIaWRkZW5IdG1sLCB1c2VDc3MpO1xuICAgICAgICBpZiAoIXJvdylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAodGFnTmFtZSA9PT0gJ3RoZWFkJykge1xuICAgICAgICAgICAgaGVhZC5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGFnTmFtZSA9PT0gJ3Rmb290Jykge1xuICAgICAgICAgICAgZm9vdC5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGQgdG8gYm9keSBib3RoIGlmIHBhcmVudCBpcyB0Ym9keSBvciB0YWJsZVxuICAgICAgICAgICAgYm9keS5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgaGVhZDogaGVhZCwgYm9keTogYm9keSwgZm9vdDogZm9vdCB9O1xufVxuZXhwb3J0cy5wYXJzZUh0bWwgPSBwYXJzZUh0bWw7XG5mdW5jdGlvbiBwYXJzZVJvd0NvbnRlbnQoc3VwcG9ydGVkRm9udHMsIHNjYWxlRmFjdG9yLCB3aW5kb3csIHJvdywgaW5jbHVkZUhpZGRlbiwgdXNlQ3NzKSB7XG4gICAgdmFyIHJlc3VsdFJvdyA9IG5ldyBjb25maWdfMS5IdG1sUm93SW5wdXQocm93KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgICAgdmFyIHN0eWxlXzEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcbiAgICAgICAgaWYgKGluY2x1ZGVIaWRkZW4gfHwgc3R5bGVfMS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHZhciBjZWxsU3R5bGVzID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHVzZUNzcykge1xuICAgICAgICAgICAgICAgIGNlbGxTdHlsZXMgPSAoMCwgY3NzUGFyc2VyXzEucGFyc2VDc3MpKHN1cHBvcnRlZEZvbnRzLCBjZWxsLCBzY2FsZUZhY3Rvciwgc3R5bGVfMSwgd2luZG93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFJvdy5wdXNoKHtcbiAgICAgICAgICAgICAgICByb3dTcGFuOiBjZWxsLnJvd1NwYW4sXG4gICAgICAgICAgICAgICAgY29sU3BhbjogY2VsbC5jb2xTcGFuLFxuICAgICAgICAgICAgICAgIHN0eWxlczogY2VsbFN0eWxlcyxcbiAgICAgICAgICAgICAgICBfZWxlbWVudDogY2VsbCxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBwYXJzZUNlbGxDb250ZW50KGNlbGwpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocm93KTtcbiAgICBpZiAocmVzdWx0Um93Lmxlbmd0aCA+IDAgJiYgKGluY2x1ZGVIaWRkZW4gfHwgc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0Um93O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlQ2VsbENvbnRlbnQob3JnQ2VsbCkge1xuICAgIC8vIFdvcmsgb24gY2xvbmVkIG5vZGUgdG8gbWFrZSBzdXJlIG5vIGNoYW5nZXMgYXJlIGFwcGxpZWQgdG8gaHRtbCB0YWJsZVxuICAgIHZhciBjZWxsID0gb3JnQ2VsbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgLy8gUmVtb3ZlIGV4dHJhIHNwYWNlIGFuZCBsaW5lIGJyZWFrcyBpbiBtYXJrdXAgdG8gbWFrZSBpdCBtb3JlIHNpbWlsYXIgdG9cbiAgICAvLyB3aGF0IHdvdWxkIGJlIHNob3duIGluIGh0bWxcbiAgICBjZWxsLmlubmVySFRNTCA9IGNlbGwuaW5uZXJIVE1MLnJlcGxhY2UoL1xcbi9nLCAnJykucmVwbGFjZSgvICsvZywgJyAnKTtcbiAgICAvLyBQcmVzZXJ2ZSA8YnI+IHRhZ3MgYXMgbGluZSBicmVha3MgaW4gdGhlIHBkZlxuICAgIGNlbGwuaW5uZXJIVE1MID0gY2VsbC5pbm5lckhUTUxcbiAgICAgICAgLnNwbGl0KC88YnIuKj8+LykgLy9zdGFydCB3aXRoICc8YnInIGFuZCBlbmRzIHdpdGggJz4nLlxuICAgICAgICAubWFwKGZ1bmN0aW9uIChwYXJ0KSB7IHJldHVybiBwYXJ0LnRyaW0oKTsgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIC8vIGlubmVyVGV4dCBmb3IgaWVcbiAgICByZXR1cm4gY2VsbC5pbm5lclRleHQgfHwgY2VsbC50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNzc2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLnBhcnNlSW5wdXQgPSB2b2lkIDA7XG52YXIgaHRtbFBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBwb2x5ZmlsbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzU2KTtcbnZhciBjb21tb25fMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDIwKTtcbnZhciBkb2N1bWVudEhhbmRsZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ0KTtcbnZhciBpbnB1dFZhbGlkYXRvcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTIpO1xuZnVuY3Rpb24gcGFyc2VJbnB1dChkLCBjdXJyZW50KSB7XG4gICAgdmFyIGRvYyA9IG5ldyBkb2N1bWVudEhhbmRsZXJfMS5Eb2NIYW5kbGVyKGQpO1xuICAgIHZhciBkb2N1bWVudCA9IGRvYy5nZXREb2N1bWVudE9wdGlvbnMoKTtcbiAgICB2YXIgZ2xvYmFsID0gZG9jLmdldEdsb2JhbE9wdGlvbnMoKTtcbiAgICAoMCwgaW5wdXRWYWxpZGF0b3JfMS5kZWZhdWx0KShkb2MsIGdsb2JhbCwgZG9jdW1lbnQsIGN1cnJlbnQpO1xuICAgIHZhciBvcHRpb25zID0gKDAsIHBvbHlmaWxsc18xLmFzc2lnbikoe30sIGdsb2JhbCwgZG9jdW1lbnQsIGN1cnJlbnQpO1xuICAgIHZhciB3aW47XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdpbiA9IHdpbmRvdztcbiAgICB9XG4gICAgdmFyIHN0eWxlcyA9IHBhcnNlU3R5bGVzKGdsb2JhbCwgZG9jdW1lbnQsIGN1cnJlbnQpO1xuICAgIHZhciBob29rcyA9IHBhcnNlSG9va3MoZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudCk7XG4gICAgdmFyIHNldHRpbmdzID0gcGFyc2VTZXR0aW5ncyhkb2MsIG9wdGlvbnMpO1xuICAgIHZhciBjb250ZW50ID0gcGFyc2VDb250ZW50KGRvYywgb3B0aW9ucywgd2luKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3VycmVudC50YWJsZUlkLFxuICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICBob29rczogaG9va3MsXG4gICAgICAgIHN0eWxlczogc3R5bGVzLFxuICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MsXG4gICAgfTtcbn1cbmV4cG9ydHMucGFyc2VJbnB1dCA9IHBhcnNlSW5wdXQ7XG5mdW5jdGlvbiBwYXJzZVN0eWxlcyhnSW5wdXQsIGRJbnB1dCwgY0lucHV0KSB7XG4gICAgdmFyIHN0eWxlT3B0aW9ucyA9IHtcbiAgICAgICAgc3R5bGVzOiB7fSxcbiAgICAgICAgaGVhZFN0eWxlczoge30sXG4gICAgICAgIGJvZHlTdHlsZXM6IHt9LFxuICAgICAgICBmb290U3R5bGVzOiB7fSxcbiAgICAgICAgYWx0ZXJuYXRlUm93U3R5bGVzOiB7fSxcbiAgICAgICAgY29sdW1uU3R5bGVzOiB7fSxcbiAgICB9O1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKHByb3AgPT09ICdjb2x1bW5TdHlsZXMnKSB7XG4gICAgICAgICAgICB2YXIgZ2xvYmFsXzEgPSBnSW5wdXRbcHJvcF07XG4gICAgICAgICAgICB2YXIgZG9jdW1lbnRfMSA9IGRJbnB1dFtwcm9wXTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gY0lucHV0W3Byb3BdO1xuICAgICAgICAgICAgc3R5bGVPcHRpb25zLmNvbHVtblN0eWxlcyA9ICgwLCBwb2x5ZmlsbHNfMS5hc3NpZ24pKHt9LCBnbG9iYWxfMSwgZG9jdW1lbnRfMSwgY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgYWxsT3B0aW9ucyA9IFtnSW5wdXQsIGRJbnB1dCwgY0lucHV0XTtcbiAgICAgICAgICAgIHZhciBzdHlsZXMgPSBhbGxPcHRpb25zLm1hcChmdW5jdGlvbiAob3B0cykgeyByZXR1cm4gb3B0c1twcm9wXSB8fCB7fTsgfSk7XG4gICAgICAgICAgICBzdHlsZU9wdGlvbnNbcHJvcF0gPSAoMCwgcG9seWZpbGxzXzEuYXNzaWduKSh7fSwgc3R5bGVzWzBdLCBzdHlsZXNbMV0sIHN0eWxlc1syXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhzdHlsZU9wdGlvbnMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgcHJvcCA9IF9hW19pXTtcbiAgICAgICAgX2xvb3BfMShwcm9wKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlT3B0aW9ucztcbn1cbmZ1bmN0aW9uIHBhcnNlSG9va3MoZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudCkge1xuICAgIHZhciBhbGxPcHRpb25zID0gW2dsb2JhbCwgZG9jdW1lbnQsIGN1cnJlbnRdO1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIGRpZFBhcnNlQ2VsbDogW10sXG4gICAgICAgIHdpbGxEcmF3Q2VsbDogW10sXG4gICAgICAgIGRpZERyYXdDZWxsOiBbXSxcbiAgICAgICAgd2lsbERyYXdQYWdlOiBbXSxcbiAgICAgICAgZGlkRHJhd1BhZ2U6IFtdLFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kgPSAwLCBhbGxPcHRpb25zXzEgPSBhbGxPcHRpb25zOyBfaSA8IGFsbE9wdGlvbnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhbGxPcHRpb25zXzFbX2ldO1xuICAgICAgICBpZiAob3B0aW9ucy5kaWRQYXJzZUNlbGwpXG4gICAgICAgICAgICByZXN1bHQuZGlkUGFyc2VDZWxsLnB1c2gob3B0aW9ucy5kaWRQYXJzZUNlbGwpO1xuICAgICAgICBpZiAob3B0aW9ucy53aWxsRHJhd0NlbGwpXG4gICAgICAgICAgICByZXN1bHQud2lsbERyYXdDZWxsLnB1c2gob3B0aW9ucy53aWxsRHJhd0NlbGwpO1xuICAgICAgICBpZiAob3B0aW9ucy5kaWREcmF3Q2VsbClcbiAgICAgICAgICAgIHJlc3VsdC5kaWREcmF3Q2VsbC5wdXNoKG9wdGlvbnMuZGlkRHJhd0NlbGwpO1xuICAgICAgICBpZiAob3B0aW9ucy53aWxsRHJhd1BhZ2UpXG4gICAgICAgICAgICByZXN1bHQud2lsbERyYXdQYWdlLnB1c2gob3B0aW9ucy53aWxsRHJhd1BhZ2UpO1xuICAgICAgICBpZiAob3B0aW9ucy5kaWREcmF3UGFnZSlcbiAgICAgICAgICAgIHJlc3VsdC5kaWREcmF3UGFnZS5wdXNoKG9wdGlvbnMuZGlkRHJhd1BhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VTZXR0aW5ncyhkb2MsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbTtcbiAgICB2YXIgbWFyZ2luID0gKDAsIGNvbW1vbl8xLnBhcnNlU3BhY2luZykob3B0aW9ucy5tYXJnaW4sIDQwIC8gZG9jLnNjYWxlRmFjdG9yKCkpO1xuICAgIHZhciBzdGFydFkgPSAoX2EgPSBnZXRTdGFydFkoZG9jLCBvcHRpb25zLnN0YXJ0WSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG1hcmdpbi50b3A7XG4gICAgdmFyIHNob3dGb290O1xuICAgIGlmIChvcHRpb25zLnNob3dGb290ID09PSB0cnVlKSB7XG4gICAgICAgIHNob3dGb290ID0gJ2V2ZXJ5UGFnZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuc2hvd0Zvb3QgPT09IGZhbHNlKSB7XG4gICAgICAgIHNob3dGb290ID0gJ25ldmVyJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNob3dGb290ID0gKF9iID0gb3B0aW9ucy5zaG93Rm9vdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ2V2ZXJ5UGFnZSc7XG4gICAgfVxuICAgIHZhciBzaG93SGVhZDtcbiAgICBpZiAob3B0aW9ucy5zaG93SGVhZCA9PT0gdHJ1ZSkge1xuICAgICAgICBzaG93SGVhZCA9ICdldmVyeVBhZ2UnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLnNob3dIZWFkID09PSBmYWxzZSkge1xuICAgICAgICBzaG93SGVhZCA9ICduZXZlcic7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzaG93SGVhZCA9IChfYyA9IG9wdGlvbnMuc2hvd0hlYWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICdldmVyeVBhZ2UnO1xuICAgIH1cbiAgICB2YXIgdXNlQ3NzID0gKF9kID0gb3B0aW9ucy51c2VDc3MpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgIHZhciB0aGVtZSA9IG9wdGlvbnMudGhlbWUgfHwgKHVzZUNzcyA/ICdwbGFpbicgOiAnc3RyaXBlZCcpO1xuICAgIHZhciBob3Jpem9udGFsUGFnZUJyZWFrID0gISFvcHRpb25zLmhvcml6b250YWxQYWdlQnJlYWs7XG4gICAgdmFyIGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQgPSAoX2UgPSBvcHRpb25zLmhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5jbHVkZUhpZGRlbkh0bWw6IChfZiA9IG9wdGlvbnMuaW5jbHVkZUhpZGRlbkh0bWwpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGZhbHNlLFxuICAgICAgICB1c2VDc3M6IHVzZUNzcyxcbiAgICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgICBzdGFydFk6IHN0YXJ0WSxcbiAgICAgICAgbWFyZ2luOiBtYXJnaW4sXG4gICAgICAgIHBhZ2VCcmVhazogKF9nID0gb3B0aW9ucy5wYWdlQnJlYWspICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6ICdhdXRvJyxcbiAgICAgICAgcm93UGFnZUJyZWFrOiAoX2ggPSBvcHRpb25zLnJvd1BhZ2VCcmVhaykgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogJ2F1dG8nLFxuICAgICAgICB0YWJsZVdpZHRoOiAoX2ogPSBvcHRpb25zLnRhYmxlV2lkdGgpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6ICdhdXRvJyxcbiAgICAgICAgc2hvd0hlYWQ6IHNob3dIZWFkLFxuICAgICAgICBzaG93Rm9vdDogc2hvd0Zvb3QsXG4gICAgICAgIHRhYmxlTGluZVdpZHRoOiAoX2sgPSBvcHRpb25zLnRhYmxlTGluZVdpZHRoKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAwLFxuICAgICAgICB0YWJsZUxpbmVDb2xvcjogKF9sID0gb3B0aW9ucy50YWJsZUxpbmVDb2xvcikgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogMjAwLFxuICAgICAgICBob3Jpem9udGFsUGFnZUJyZWFrOiBob3Jpem9udGFsUGFnZUJyZWFrLFxuICAgICAgICBob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0OiBob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0LFxuICAgICAgICBob3Jpem9udGFsUGFnZUJyZWFrQmVoYXZpb3VyOiAoX20gPSBvcHRpb25zLmhvcml6b250YWxQYWdlQnJlYWtCZWhhdmlvdXIpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6ICdhZnRlckFsbFJvd3MnLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRTdGFydFkoZG9jLCB1c2VyU3RhcnRZKSB7XG4gICAgdmFyIHByZXZpb3VzID0gZG9jLmdldExhc3RBdXRvVGFibGUoKTtcbiAgICB2YXIgc2YgPSBkb2Muc2NhbGVGYWN0b3IoKTtcbiAgICB2YXIgY3VycmVudFBhZ2UgPSBkb2MucGFnZU51bWJlcigpO1xuICAgIHZhciBpc1NhbWVQYWdlQXNQcmV2aW91c1RhYmxlID0gZmFsc2U7XG4gICAgaWYgKHByZXZpb3VzICYmIHByZXZpb3VzLnN0YXJ0UGFnZU51bWJlcikge1xuICAgICAgICB2YXIgZW5kaW5nUGFnZSA9IHByZXZpb3VzLnN0YXJ0UGFnZU51bWJlciArIHByZXZpb3VzLnBhZ2VOdW1iZXIgLSAxO1xuICAgICAgICBpc1NhbWVQYWdlQXNQcmV2aW91c1RhYmxlID0gZW5kaW5nUGFnZSA9PT0gY3VycmVudFBhZ2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXNlclN0YXJ0WSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJTdGFydFk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHVzZXJTdGFydFkgPT0gbnVsbCB8fCB1c2VyU3RhcnRZID09PSBmYWxzZSkge1xuICAgICAgICBpZiAoaXNTYW1lUGFnZUFzUHJldmlvdXNUYWJsZSAmJiAocHJldmlvdXMgPT09IG51bGwgfHwgcHJldmlvdXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZXZpb3VzLmZpbmFsWSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU29tZSB1c2VycyBoYWQgaXNzdWVzIHdpdGggb3ZlcmxhcHBpbmcgdGFibGVzIHdoZW4gdGhleSB1c2VkIG11bHRpcGxlXG4gICAgICAgICAgICAvLyB0YWJsZXMgd2l0aG91dCBzZXR0aW5nIHN0YXJ0WSBzbyBzZXR0aW5nIGl0IGhlcmUgdG8gYSBzZW5zaWJsZSBkZWZhdWx0LlxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzLmZpbmFsWSArIDIwIC8gc2Y7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBwYXJzZUNvbnRlbnQoZG9jLCBvcHRpb25zLCB3aW5kb3cpIHtcbiAgICB2YXIgaGVhZCA9IG9wdGlvbnMuaGVhZCB8fCBbXTtcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBbXTtcbiAgICB2YXIgZm9vdCA9IG9wdGlvbnMuZm9vdCB8fCBbXTtcbiAgICBpZiAob3B0aW9ucy5odG1sKSB7XG4gICAgICAgIHZhciBoaWRkZW4gPSBvcHRpb25zLmluY2x1ZGVIaWRkZW5IdG1sO1xuICAgICAgICBpZiAod2luZG93KSB7XG4gICAgICAgICAgICB2YXIgaHRtbENvbnRlbnQgPSAoMCwgaHRtbFBhcnNlcl8xLnBhcnNlSHRtbCkoZG9jLCBvcHRpb25zLmh0bWwsIHdpbmRvdywgaGlkZGVuLCBvcHRpb25zLnVzZUNzcykgfHwge307XG4gICAgICAgICAgICBoZWFkID0gaHRtbENvbnRlbnQuaGVhZCB8fCBoZWFkO1xuICAgICAgICAgICAgYm9keSA9IGh0bWxDb250ZW50LmJvZHkgfHwgaGVhZDtcbiAgICAgICAgICAgIGZvb3QgPSBodG1sQ29udGVudC5mb290IHx8IGhlYWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcGFyc2UgaHRtbCBpbiBub24gYnJvd3NlciBlbnZpcm9ubWVudCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBjb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zIHx8IHBhcnNlQ29sdW1ucyhoZWFkLCBib2R5LCBmb290KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICBoZWFkOiBoZWFkLFxuICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICBmb290OiBmb290LFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZUNvbHVtbnMoaGVhZCwgYm9keSwgZm9vdCkge1xuICAgIHZhciBmaXJzdFJvdyA9IGhlYWRbMF0gfHwgYm9keVswXSB8fCBmb290WzBdIHx8IFtdO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhmaXJzdFJvdylcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09ICdfZWxlbWVudCc7IH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIGNvbFNwYW4gPSAxO1xuICAgICAgICB2YXIgaW5wdXQ7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpcnN0Um93KSkge1xuICAgICAgICAgICAgaW5wdXQgPSBmaXJzdFJvd1twYXJzZUludChrZXkpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0ID0gZmlyc3RSb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbFNwYW4gPSAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlucHV0LmNvbFNwYW4pIHx8IDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xTcGFuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpcnN0Um93KSkge1xuICAgICAgICAgICAgICAgIGlkID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlkID0ga2V5ICsgKGkgPiAwID8gXCJfXCIuY29uY2F0KGkpIDogJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJvd1Jlc3VsdCA9IHsgZGF0YUtleTogaWQgfTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJvd1Jlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA3OTI6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShkb2MsIGdsb2JhbCwgZG9jdW1lbnQsIGN1cnJlbnQpIHtcbiAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIG9wdGlvbnMgcGFyYW1ldGVyIHNob3VsZCBiZSBvZiB0eXBlIG9iamVjdCwgaXM6ICcgKyB0eXBlb2Ygb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4dGVuZFdpZHRoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9ucy50YWJsZVdpZHRoID0gb3B0aW9ucy5leHRlbmRXaWR0aCA/ICdhdXRvJyA6ICd3cmFwJztcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VzZSBvZiBkZXByZWNhdGVkIG9wdGlvbjogZXh0ZW5kV2lkdGgsIHVzZSB0YWJsZVdpZHRoIGluc3RlYWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1hcmdpbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWFyZ2luID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmdpbiA9IG9wdGlvbnMubWFyZ2lucztcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VzZSBvZiBkZXByZWNhdGVkIG9wdGlvbjogbWFyZ2lucywgdXNlIG1hcmdpbiBpbnN0ZWFkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnN0YXJ0WSAmJiB0eXBlb2Ygb3B0aW9ucy5zdGFydFkgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBzdGFydFkgb3B0aW9uJywgb3B0aW9ucy5zdGFydFkpO1xuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3RhcnRZO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5kaWREcmF3UGFnZSAmJlxuICAgICAgICAgICAgKG9wdGlvbnMuYWZ0ZXJQYWdlQ29udGVudCB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuYmVmb3JlUGFnZUNvbnRlbnQgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFmdGVyUGFnZUFkZCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBhZnRlclBhZ2VDb250ZW50LCBiZWZvcmVQYWdlQ29udGVudCBhbmQgYWZ0ZXJQYWdlQWRkIGhvb2tzIGFyZSBkZXByZWNhdGVkLiBVc2UgZGlkRHJhd1BhZ2UgaW5zdGVhZCcpO1xuICAgICAgICAgICAgb3B0aW9ucy5kaWREcmF3UGFnZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmVQYWdlQ29udGVudClcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5iZWZvcmVQYWdlQ29udGVudChkYXRhKTtcbiAgICAgICAgICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyUGFnZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWZ0ZXJQYWdlQ29udGVudChkYXRhKTtcbiAgICAgICAgICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyUGFnZUFkZCAmJiBkYXRhLnBhZ2VOdW1iZXIgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5hZnRlclBhZ2VBZGQoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgW1xuICAgICAgICAgICAgJ2NyZWF0ZWRIZWFkZXJDZWxsJyxcbiAgICAgICAgICAgICdkcmF3SGVhZGVyUm93JyxcbiAgICAgICAgICAgICdkcmF3Um93JyxcbiAgICAgICAgICAgICdkcmF3SGVhZGVyQ2VsbCcsXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIGhvb2sgaGFzIGNoYW5nZWQgaW4gdmVyc2lvbiAzLjAsIGNoZWNrIHRoZSBjaGFuZ2Vsb2cgZm9yIGhvdyB0byBtaWdyYXRlLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Nob3dGb290JywgJ3Nob3dGb290ZXInXSxcbiAgICAgICAgICAgIFsnc2hvd0hlYWQnLCAnc2hvd0hlYWRlciddLFxuICAgICAgICAgICAgWydkaWREcmF3UGFnZScsICdhZGRQYWdlQ29udGVudCddLFxuICAgICAgICAgICAgWydkaWRQYXJzZUNlbGwnLCAnY3JlYXRlZENlbGwnXSxcbiAgICAgICAgICAgIFsnaGVhZFN0eWxlcycsICdoZWFkZXJTdHlsZXMnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBfYVswXSwgZGVwcmVjYXRlZCA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbZGVwcmVjYXRlZF0pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVXNlIG9mIGRlcHJlY2F0ZWQgb3B0aW9uIFwiLmNvbmNhdChkZXByZWNhdGVkLCBcIi4gVXNlIFwiKS5jb25jYXQoY3VycmVudCwgXCIgaW5zdGVhZFwiKSk7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tjdXJyZW50XSA9IG9wdGlvbnNbZGVwcmVjYXRlZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBbXG4gICAgICAgICAgICBbJ3BhZGRpbmcnLCAnY2VsbFBhZGRpbmcnXSxcbiAgICAgICAgICAgIFsnbGluZUhlaWdodCcsICdyb3dIZWlnaHQnXSxcbiAgICAgICAgICAgICdmb250U2l6ZScsXG4gICAgICAgICAgICAnb3ZlcmZsb3cnLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZhciBkZXByZWNhdGVkT3B0aW9uID0gdHlwZW9mIG8gPT09ICdzdHJpbmcnID8gbyA6IG9bMF07XG4gICAgICAgICAgICB2YXIgc3R5bGUgPSB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyBvIDogb1sxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tkZXByZWNhdGVkT3B0aW9uXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGVzW3N0eWxlXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdHlsZXNbc3R5bGVdID0gb3B0aW9uc1tkZXByZWNhdGVkT3B0aW9uXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXNlIG9mIGRlcHJlY2F0ZWQgb3B0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZE9wdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICcsIHVzZSB0aGUgc3R5bGUgJyArXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlICtcbiAgICAgICAgICAgICAgICAgICAgJyBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IFtcbiAgICAgICAgICAgICdzdHlsZXMnLFxuICAgICAgICAgICAgJ2JvZHlTdHlsZXMnLFxuICAgICAgICAgICAgJ2hlYWRTdHlsZXMnLFxuICAgICAgICAgICAgJ2Zvb3RTdHlsZXMnLFxuICAgICAgICBdOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIHN0eWxlUHJvcCA9IF9jW19iXTtcbiAgICAgICAgICAgIGNoZWNrU3R5bGVzKG9wdGlvbnNbc3R5bGVQcm9wXSB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbHVtblN0eWxlcyA9IG9wdGlvbnNbJ2NvbHVtblN0eWxlcyddIHx8IHt9O1xuICAgICAgICBmb3IgKHZhciBfZCA9IDAsIF9lID0gT2JqZWN0LmtleXMoY29sdW1uU3R5bGVzKTsgX2QgPCBfZS5sZW5ndGg7IF9kKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfZVtfZF07XG4gICAgICAgICAgICBjaGVja1N0eWxlcyhjb2x1bW5TdHlsZXNba2V5XSB8fCB7fSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBbZ2xvYmFsLCBkb2N1bWVudCwgY3VycmVudF07IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gX2FbX2ldO1xuICAgICAgICBfbG9vcF8xKG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZGVmYXVsdF8xO1xuZnVuY3Rpb24gY2hlY2tTdHlsZXMoc3R5bGVzKSB7XG4gICAgaWYgKHN0eWxlcy5yb3dIZWlnaHQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVXNlIG9mIGRlcHJlY2F0ZWQgc3R5bGUgcm93SGVpZ2h0LiBJdCBpcyByZW5hbWVkIHRvIG1pbkNlbGxIZWlnaHQuJyk7XG4gICAgICAgIGlmICghc3R5bGVzLm1pbkNlbGxIZWlnaHQpIHtcbiAgICAgICAgICAgIHN0eWxlcy5taW5DZWxsSGVpZ2h0ID0gc3R5bGVzLnJvd0hlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzdHlsZXMuY29sdW1uV2lkdGgpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVXNlIG9mIGRlcHJlY2F0ZWQgc3R5bGUgY29sdW1uV2lkdGguIEl0IGlzIHJlbmFtZWQgdG8gY2VsbFdpZHRoLicpO1xuICAgICAgICBpZiAoIXN0eWxlcy5jZWxsV2lkdGgpIHtcbiAgICAgICAgICAgIHN0eWxlcy5jZWxsV2lkdGggPSBzdHlsZXMuY29sdW1uV2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDI2MDpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHsgdmFsdWU6IHRydWUgfSkpO1xuZXhwb3J0cy5Db2x1bW4gPSBleHBvcnRzLkNlbGwgPSBleHBvcnRzLlJvdyA9IGV4cG9ydHMuVGFibGUgPSB2b2lkIDA7XG52YXIgY29uZmlnXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5Nik7XG52YXIgSG9va0RhdGFfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKTtcbnZhciBjb21tb25fMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDIwKTtcbnZhciBUYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWJsZShpbnB1dCwgY29udGVudCkge1xuICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xuICAgICAgICAvLyBEZXByZWNhdGVkLCB1c2UgcGFnZU51bWJlciBpbnN0ZWFkXG4gICAgICAgIC8vIE5vdCB1c2luZyBnZXR0ZXIgc2luY2U6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1vbmJlbmd0c3Nvbi9qc1BERi1BdXRvVGFibGUvaXNzdWVzLzU5NlxuICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IDE7XG4gICAgICAgIHRoaXMuaWQgPSBpbnB1dC5pZDtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IGlucHV0LnNldHRpbmdzO1xuICAgICAgICB0aGlzLnN0eWxlcyA9IGlucHV0LnN0eWxlcztcbiAgICAgICAgdGhpcy5ob29rcyA9IGlucHV0Lmhvb2tzO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb250ZW50LmNvbHVtbnM7XG4gICAgICAgIHRoaXMuaGVhZCA9IGNvbnRlbnQuaGVhZDtcbiAgICAgICAgdGhpcy5ib2R5ID0gY29udGVudC5ib2R5O1xuICAgICAgICB0aGlzLmZvb3QgPSBjb250ZW50LmZvb3Q7XG4gICAgfVxuICAgIFRhYmxlLnByb3RvdHlwZS5nZXRIZWFkSGVpZ2h0ID0gZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZC5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcm93KSB7IHJldHVybiBhY2MgKyByb3cuZ2V0TWF4Q2VsbEhlaWdodChjb2x1bW5zKTsgfSwgMCk7XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuZ2V0Rm9vdEhlaWdodCA9IGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvb3QucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJvdykgeyByZXR1cm4gYWNjICsgcm93LmdldE1heENlbGxIZWlnaHQoY29sdW1ucyk7IH0sIDApO1xuICAgIH07XG4gICAgVGFibGUucHJvdG90eXBlLmFsbFJvd3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWQuY29uY2F0KHRoaXMuYm9keSkuY29uY2F0KHRoaXMuZm9vdCk7XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuY2FsbENlbGxIb29rcyA9IGZ1bmN0aW9uIChkb2MsIGhhbmRsZXJzLCBjZWxsLCByb3csIGNvbHVtbiwgY3Vyc29yKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgaGFuZGxlcnNfMSA9IGhhbmRsZXJzOyBfaSA8IGhhbmRsZXJzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzXzFbX2ldO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgSG9va0RhdGFfMS5DZWxsSG9va0RhdGEoZG9jLCB0aGlzLCBjZWxsLCByb3csIGNvbHVtbiwgY3Vyc29yKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBoYW5kbGVyKGRhdGEpID09PSBmYWxzZTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGlzIGFsd2F5cyBzdHJpbmdbXSBzaW5jZSB1c2VyIGNhbiBhc3NpZ24gc3RyaW5nXG4gICAgICAgICAgICBjZWxsLnRleHQgPSBBcnJheS5pc0FycmF5KGNlbGwudGV4dCkgPyBjZWxsLnRleHQgOiBbY2VsbC50ZXh0XTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuY2FsbEVuZFBhZ2VIb29rcyA9IGZ1bmN0aW9uIChkb2MsIGN1cnNvcikge1xuICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5ob29rcy5kaWREcmF3UGFnZTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gX2FbX2ldO1xuICAgICAgICAgICAgaGFuZGxlcihuZXcgSG9va0RhdGFfMS5Ib29rRGF0YShkb2MsIHRoaXMsIGN1cnNvcikpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuY2FsbFdpbGxEcmF3UGFnZUhvb2tzID0gZnVuY3Rpb24gKGRvYywgY3Vyc29yKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLmhvb2tzLndpbGxEcmF3UGFnZTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gX2FbX2ldO1xuICAgICAgICAgICAgaGFuZGxlcihuZXcgSG9va0RhdGFfMS5Ib29rRGF0YShkb2MsIHRoaXMsIGN1cnNvcikpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAocGFnZVdpZHRoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5ncy50YWJsZVdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MudGFibGVXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNldHRpbmdzLnRhYmxlV2lkdGggPT09ICd3cmFwJykge1xuICAgICAgICAgICAgdmFyIHdyYXBwZWRXaWR0aCA9IHRoaXMuY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKHRvdGFsLCBjb2wpIHsgcmV0dXJuIHRvdGFsICsgY29sLndyYXBwZWRXaWR0aDsgfSwgMCk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG1hcmdpbiA9IHRoaXMuc2V0dGluZ3MubWFyZ2luO1xuICAgICAgICAgICAgcmV0dXJuIHBhZ2VXaWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGU7XG59KCkpO1xuZXhwb3J0cy5UYWJsZSA9IFRhYmxlO1xudmFyIFJvdyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSb3cocmF3LCBpbmRleCwgc2VjdGlvbiwgY2VsbHMsIHNwYW5zTXVsdGlwbGVQYWdlcykge1xuICAgICAgICBpZiAoc3BhbnNNdWx0aXBsZVBhZ2VzID09PSB2b2lkIDApIHsgc3BhbnNNdWx0aXBsZVBhZ2VzID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLnJhdyA9IHJhdztcbiAgICAgICAgaWYgKHJhdyBpbnN0YW5jZW9mIGNvbmZpZ18xLkh0bWxSb3dJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5yYXcgPSByYXcuX2VsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSByYXcuX2VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uO1xuICAgICAgICB0aGlzLmNlbGxzID0gY2VsbHM7XG4gICAgICAgIHRoaXMuc3BhbnNNdWx0aXBsZVBhZ2VzID0gc3BhbnNNdWx0aXBsZVBhZ2VzO1xuICAgIH1cbiAgICBSb3cucHJvdG90eXBlLmdldE1heENlbGxIZWlnaHQgPSBmdW5jdGlvbiAoY29sdW1ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY29sdW1uKSB7IHZhciBfYTsgcmV0dXJuIE1hdGgubWF4KGFjYywgKChfYSA9IF90aGlzLmNlbGxzW2NvbHVtbi5pbmRleF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oZWlnaHQpIHx8IDApOyB9LCAwKTtcbiAgICB9O1xuICAgIFJvdy5wcm90b3R5cGUuaGFzUm93U3BhbiA9IGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSBfdGhpcy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFjZWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnJvd1NwYW4gPiAxO1xuICAgICAgICB9KS5sZW5ndGggPiAwKTtcbiAgICB9O1xuICAgIFJvdy5wcm90b3R5cGUuY2FuRW50aXJlUm93Rml0ID0gZnVuY3Rpb24gKGhlaWdodCwgY29sdW1ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXhDZWxsSGVpZ2h0KGNvbHVtbnMpIDw9IGhlaWdodDtcbiAgICB9O1xuICAgIFJvdy5wcm90b3R5cGUuZ2V0TWluaW11bVJvd0hlaWdodCA9IGZ1bmN0aW9uIChjb2x1bW5zLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSBfdGhpcy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFjZWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBkb2MuZ2V0TGluZUhlaWdodChjZWxsLnN0eWxlcy5mb250U2l6ZSk7XG4gICAgICAgICAgICB2YXIgdlBhZGRpbmcgPSBjZWxsLnBhZGRpbmcoJ3ZlcnRpY2FsJyk7XG4gICAgICAgICAgICB2YXIgb25lUm93SGVpZ2h0ID0gdlBhZGRpbmcgKyBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgcmV0dXJuIG9uZVJvd0hlaWdodCA+IGFjYyA/IG9uZVJvd0hlaWdodCA6IGFjYztcbiAgICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICByZXR1cm4gUm93O1xufSgpKTtcbmV4cG9ydHMuUm93ID0gUm93O1xudmFyIENlbGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2VsbChyYXcsIHN0eWxlcywgc2VjdGlvbikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLmNvbnRlbnRIZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmNvbnRlbnRXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMud3JhcHBlZFdpZHRoID0gMDtcbiAgICAgICAgdGhpcy5taW5SZWFkYWJsZVdpZHRoID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzO1xuICAgICAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uO1xuICAgICAgICB0aGlzLnJhdyA9IHJhdztcbiAgICAgICAgdmFyIGNvbnRlbnQgPSByYXc7XG4gICAgICAgIGlmIChyYXcgIT0gbnVsbCAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgICAgICB0aGlzLnJvd1NwYW4gPSByYXcucm93U3BhbiB8fCAxO1xuICAgICAgICAgICAgdGhpcy5jb2xTcGFuID0gcmF3LmNvbFNwYW4gfHwgMTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAoX2IgPSAoX2EgPSByYXcuY29udGVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcmF3LnRpdGxlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiByYXc7XG4gICAgICAgICAgICBpZiAocmF3Ll9lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYXcgPSByYXcuX2VsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvd1NwYW4gPSAxO1xuICAgICAgICAgICAgdGhpcy5jb2xTcGFuID0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpbmdpZnkgMCBhbmQgZmFsc2UsIGJ1dCBub3QgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgdmFyIHRleHQgPSBjb250ZW50ICE9IG51bGwgPyAnJyArIGNvbnRlbnQgOiAnJztcbiAgICAgICAgdmFyIHNwbGl0UmVnZXggPSAvXFxyXFxufFxccnxcXG4vZztcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dC5zcGxpdChzcGxpdFJlZ2V4KTtcbiAgICB9XG4gICAgQ2VsbC5wcm90b3R5cGUuZ2V0VGV4dFBvcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHk7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlcy52YWxpZ24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICB5ID0gdGhpcy55ICsgdGhpcy5wYWRkaW5nKCd0b3AnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0eWxlcy52YWxpZ24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICB5ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQgLSB0aGlzLnBhZGRpbmcoJ2JvdHRvbScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG5ldEhlaWdodCA9IHRoaXMuaGVpZ2h0IC0gdGhpcy5wYWRkaW5nKCd2ZXJ0aWNhbCcpO1xuICAgICAgICAgICAgeSA9IHRoaXMueSArIG5ldEhlaWdodCAvIDIgKyB0aGlzLnBhZGRpbmcoJ3RvcCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4O1xuICAgICAgICBpZiAodGhpcy5zdHlsZXMuaGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB4ID0gdGhpcy54ICsgdGhpcy53aWR0aCAtIHRoaXMucGFkZGluZygncmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0eWxlcy5oYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB2YXIgbmV0V2lkdGggPSB0aGlzLndpZHRoIC0gdGhpcy5wYWRkaW5nKCdob3Jpem9udGFsJyk7XG4gICAgICAgICAgICB4ID0gdGhpcy54ICsgbmV0V2lkdGggLyAyICsgdGhpcy5wYWRkaW5nKCdsZWZ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB4ID0gdGhpcy54ICsgdGhpcy5wYWRkaW5nKCdsZWZ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSB9O1xuICAgIH07XG4gICAgLy8gVE9ETyAodjQpOiByZXBsYWNlIHBhcmFtZXRlcnMgd2l0aCBvbmx5IChsaW5lSGVpZ2h0KVxuICAgIENlbGwucHJvdG90eXBlLmdldENvbnRlbnRIZWlnaHQgPSBmdW5jdGlvbiAoc2NhbGVGYWN0b3IsIGxpbmVIZWlnaHRGYWN0b3IpIHtcbiAgICAgICAgaWYgKGxpbmVIZWlnaHRGYWN0b3IgPT09IHZvaWQgMCkgeyBsaW5lSGVpZ2h0RmFjdG9yID0gMS4xNTsgfVxuICAgICAgICB2YXIgbGluZUNvdW50ID0gQXJyYXkuaXNBcnJheSh0aGlzLnRleHQpID8gdGhpcy50ZXh0Lmxlbmd0aCA6IDE7XG4gICAgICAgIHZhciBsaW5lSGVpZ2h0ID0gKHRoaXMuc3R5bGVzLmZvbnRTaXplIC8gc2NhbGVGYWN0b3IpICogbGluZUhlaWdodEZhY3RvcjtcbiAgICAgICAgdmFyIGhlaWdodCA9IGxpbmVDb3VudCAqIGxpbmVIZWlnaHQgKyB0aGlzLnBhZGRpbmcoJ3ZlcnRpY2FsJyk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChoZWlnaHQsIHRoaXMuc3R5bGVzLm1pbkNlbGxIZWlnaHQpO1xuICAgIH07XG4gICAgQ2VsbC5wcm90b3R5cGUucGFkZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBwYWRkaW5nID0gKDAsIGNvbW1vbl8xLnBhcnNlU3BhY2luZykodGhpcy5zdHlsZXMuY2VsbFBhZGRpbmcsIDApO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgICAgcmV0dXJuIHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYWRkaW5nW25hbWVdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2VsbDtcbn0oKSk7XG5leHBvcnRzLkNlbGwgPSBDZWxsO1xudmFyIENvbHVtbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb2x1bW4oZGF0YUtleSwgcmF3LCBpbmRleCkge1xuICAgICAgICB0aGlzLndyYXBwZWRXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluUmVhZGFibGVXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGggPSAwO1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5kYXRhS2V5ID0gZGF0YUtleTtcbiAgICAgICAgdGhpcy5yYXcgPSByYXc7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgQ29sdW1uLnByb3RvdHlwZS5nZXRNYXhDdXN0b21DZWxsV2lkdGggPSBmdW5jdGlvbiAodGFibGUpIHtcbiAgICAgICAgdmFyIG1heCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0YWJsZS5hbGxSb3dzKCk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgcm93ID0gX2FbX2ldO1xuICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbdGhpcy5pbmRleF07XG4gICAgICAgICAgICBpZiAoY2VsbCAmJiB0eXBlb2YgY2VsbC5zdHlsZXMuY2VsbFdpZHRoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgY2VsbC5zdHlsZXMuY2VsbFdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH07XG4gICAgcmV0dXJuIENvbHVtbjtcbn0oKSk7XG5leHBvcnRzLkNvbHVtbiA9IENvbHVtbjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzU2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmV4cG9ydHMuYXNzaWduID0gdm9pZCAwO1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgcywgczEsIHMyLCBzMykge1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICB9XG4gICAgdmFyIHRvID0gT2JqZWN0KHRhcmdldCk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICB2YXIgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChuZXh0U291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBuZXh0U291cmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgYnVncyB3aGVuIGhhc093blByb3BlcnR5IGlzIHNoYWRvd2VkXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bztcbn1cbmV4cG9ydHMuYXNzaWduID0gYXNzaWduO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5NzI6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7IHZhbHVlOiB0cnVlIH0pKTtcbmV4cG9ydHMuY3JlYXRlVGFibGUgPSB2b2lkIDA7XG52YXIgZG9jdW1lbnRIYW5kbGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NCk7XG52YXIgbW9kZWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG52YXIgd2lkdGhDYWxjdWxhdG9yXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNCk7XG52YXIgY29uZmlnXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5Nik7XG52YXIgcG9seWZpbGxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1Nik7XG5mdW5jdGlvbiBjcmVhdGVUYWJsZShqc1BERkRvYywgaW5wdXQpIHtcbiAgICB2YXIgZG9jID0gbmV3IGRvY3VtZW50SGFuZGxlcl8xLkRvY0hhbmRsZXIoanNQREZEb2MpO1xuICAgIHZhciBjb250ZW50ID0gcGFyc2VDb250ZW50KGlucHV0LCBkb2Muc2NhbGVGYWN0b3IoKSk7XG4gICAgdmFyIHRhYmxlID0gbmV3IG1vZGVsc18xLlRhYmxlKGlucHV0LCBjb250ZW50KTtcbiAgICAoMCwgd2lkdGhDYWxjdWxhdG9yXzEuY2FsY3VsYXRlV2lkdGhzKShkb2MsIHRhYmxlKTtcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgIHJldHVybiB0YWJsZTtcbn1cbmV4cG9ydHMuY3JlYXRlVGFibGUgPSBjcmVhdGVUYWJsZTtcbmZ1bmN0aW9uIHBhcnNlQ29udGVudChpbnB1dCwgc2YpIHtcbiAgICB2YXIgY29udGVudCA9IGlucHV0LmNvbnRlbnQ7XG4gICAgdmFyIGNvbHVtbnMgPSBjcmVhdGVDb2x1bW5zKGNvbnRlbnQuY29sdW1ucyk7XG4gICAgLy8gSWYgbm8gaGVhZCBvciBmb290IGlzIHNldCwgdHJ5IGdlbmVyYXRpbmcgaXQgd2l0aCBjb250ZW50IGZyb20gY29sdW1uc1xuICAgIGlmIChjb250ZW50LmhlYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBzZWN0aW9uUm93ID0gZ2VuZXJhdGVTZWN0aW9uUm93KGNvbHVtbnMsICdoZWFkJyk7XG4gICAgICAgIGlmIChzZWN0aW9uUm93KVxuICAgICAgICAgICAgY29udGVudC5oZWFkLnB1c2goc2VjdGlvblJvdyk7XG4gICAgfVxuICAgIGlmIChjb250ZW50LmZvb3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBzZWN0aW9uUm93ID0gZ2VuZXJhdGVTZWN0aW9uUm93KGNvbHVtbnMsICdmb290Jyk7XG4gICAgICAgIGlmIChzZWN0aW9uUm93KVxuICAgICAgICAgICAgY29udGVudC5mb290LnB1c2goc2VjdGlvblJvdyk7XG4gICAgfVxuICAgIHZhciB0aGVtZSA9IGlucHV0LnNldHRpbmdzLnRoZW1lO1xuICAgIHZhciBzdHlsZXMgPSBpbnB1dC5zdHlsZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgaGVhZDogcGFyc2VTZWN0aW9uKCdoZWFkJywgY29udGVudC5oZWFkLCBjb2x1bW5zLCBzdHlsZXMsIHRoZW1lLCBzZiksXG4gICAgICAgIGJvZHk6IHBhcnNlU2VjdGlvbignYm9keScsIGNvbnRlbnQuYm9keSwgY29sdW1ucywgc3R5bGVzLCB0aGVtZSwgc2YpLFxuICAgICAgICBmb290OiBwYXJzZVNlY3Rpb24oJ2Zvb3QnLCBjb250ZW50LmZvb3QsIGNvbHVtbnMsIHN0eWxlcywgdGhlbWUsIHNmKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VTZWN0aW9uKHNlY3Rpb25OYW1lLCBzZWN0aW9uUm93cywgY29sdW1ucywgc3R5bGVQcm9wcywgdGhlbWUsIHNjYWxlRmFjdG9yKSB7XG4gICAgdmFyIHJvd1NwYW5zTGVmdEZvckNvbHVtbiA9IHt9O1xuICAgIHZhciByZXN1bHQgPSBzZWN0aW9uUm93cy5tYXAoZnVuY3Rpb24gKHJhd1Jvdywgcm93SW5kZXgpIHtcbiAgICAgICAgdmFyIHNraXBwZWRSb3dGb3JSb3dTcGFucyA9IDA7XG4gICAgICAgIHZhciBjZWxscyA9IHt9O1xuICAgICAgICB2YXIgY29sU3BhbnNBZGRlZCA9IDA7XG4gICAgICAgIHZhciBjb2x1bW5TcGFuc0xlZnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGNvbHVtbnNfMSA9IGNvbHVtbnM7IF9pIDwgY29sdW1uc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNfMVtfaV07XG4gICAgICAgICAgICBpZiAocm93U3BhbnNMZWZ0Rm9yQ29sdW1uW2NvbHVtbi5pbmRleF0gPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHJvd1NwYW5zTGVmdEZvckNvbHVtbltjb2x1bW4uaW5kZXhdLmxlZnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uU3BhbnNMZWZ0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByYXdDZWxsID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdSb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdDZWxsID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdSb3dbY29sdW1uLmluZGV4IC0gY29sU3BhbnNBZGRlZCAtIHNraXBwZWRSb3dGb3JSb3dTcGFuc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdDZWxsID0gcmF3Um93W2NvbHVtbi5kYXRhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbElucHV0U3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmF3Q2VsbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmF3Q2VsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxJbnB1dFN0eWxlcyA9IChyYXdDZWxsID09PSBudWxsIHx8IHJhd0NlbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd0NlbGwuc3R5bGVzKSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID0gY2VsbFN0eWxlcyhzZWN0aW9uTmFtZSwgY29sdW1uLCByb3dJbmRleCwgdGhlbWUsIHN0eWxlUHJvcHMsIHNjYWxlRmFjdG9yLCBjZWxsSW5wdXRTdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IG5ldyBtb2RlbHNfMS5DZWxsKHJhd0NlbGwsIHN0eWxlcywgc2VjdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBkYXRhS2V5IGlzIG5vdCB1c2VkIGludGVybmFsbHkgbm8gbW9yZSBidXQga2VlcCBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBpbiBob29rc1xuICAgICAgICAgICAgICAgICAgICBjZWxsc1tjb2x1bW4uZGF0YUtleV0gPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICBjZWxsc1tjb2x1bW4uaW5kZXhdID0gY2VsbDtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uU3BhbnNMZWZ0ID0gY2VsbC5jb2xTcGFuIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbnNMZWZ0Rm9yQ29sdW1uW2NvbHVtbi5pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBjZWxsLnJvd1NwYW4gLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXM6IGNvbHVtblNwYW5zTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblNwYW5zTGVmdC0tO1xuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuc0FkZGVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93U3BhbnNMZWZ0Rm9yQ29sdW1uW2NvbHVtbi5pbmRleF0ubGVmdC0tO1xuICAgICAgICAgICAgICAgIGNvbHVtblNwYW5zTGVmdCA9IHJvd1NwYW5zTGVmdEZvckNvbHVtbltjb2x1bW4uaW5kZXhdLnRpbWVzO1xuICAgICAgICAgICAgICAgIHNraXBwZWRSb3dGb3JSb3dTcGFucysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgbW9kZWxzXzEuUm93KHJhd1Jvdywgcm93SW5kZXgsIHNlY3Rpb25OYW1lLCBjZWxscyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlU2VjdGlvblJvdyhjb2x1bW5zLCBzZWN0aW9uKSB7XG4gICAgdmFyIHNlY3Rpb25Sb3cgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICBpZiAoY29sLnJhdyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBnZXRTZWN0aW9uVGl0bGUoc2VjdGlvbiwgY29sLnJhdyk7XG4gICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBzZWN0aW9uUm93W2NvbC5kYXRhS2V5XSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNlY3Rpb25Sb3cpLmxlbmd0aCA+IDAgPyBzZWN0aW9uUm93IDogbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFNlY3Rpb25UaXRsZShzZWN0aW9uLCBjb2x1bW4pIHtcbiAgICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29sdW1uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5oZWFkZXIgfHwgY29sdW1uLnRpdGxlIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNvbHVtbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc2VjdGlvbiA9PT0gJ2Zvb3QnICYmIHR5cGVvZiBjb2x1bW4gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW4uZm9vdGVyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbHVtbnMoY29sdW1ucykge1xuICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoaW5wdXQsIGluZGV4KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBrZXkgPSAoX2IgPSAoX2EgPSBpbnB1dC5kYXRhS2V5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBpbnB1dC5rZXkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBtb2RlbHNfMS5Db2x1bW4oa2V5LCBpbnB1dCwgaW5kZXgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gY2VsbFN0eWxlcyhzZWN0aW9uTmFtZSwgY29sdW1uLCByb3dJbmRleCwgdGhlbWVOYW1lLCBzdHlsZXMsIHNjYWxlRmFjdG9yLCBjZWxsSW5wdXRTdHlsZXMpIHtcbiAgICB2YXIgdGhlbWUgPSAoMCwgY29uZmlnXzEuZ2V0VGhlbWUpKHRoZW1lTmFtZSk7XG4gICAgdmFyIHNlY3Rpb25TdHlsZXM7XG4gICAgaWYgKHNlY3Rpb25OYW1lID09PSAnaGVhZCcpIHtcbiAgICAgICAgc2VjdGlvblN0eWxlcyA9IHN0eWxlcy5oZWFkU3R5bGVzO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWN0aW9uTmFtZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgIHNlY3Rpb25TdHlsZXMgPSBzdHlsZXMuYm9keVN0eWxlcztcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VjdGlvbk5hbWUgPT09ICdmb290Jykge1xuICAgICAgICBzZWN0aW9uU3R5bGVzID0gc3R5bGVzLmZvb3RTdHlsZXM7XG4gICAgfVxuICAgIHZhciBvdGhlclN0eWxlcyA9ICgwLCBwb2x5ZmlsbHNfMS5hc3NpZ24pKHt9LCB0aGVtZS50YWJsZSwgdGhlbWVbc2VjdGlvbk5hbWVdLCBzdHlsZXMuc3R5bGVzLCBzZWN0aW9uU3R5bGVzKTtcbiAgICB2YXIgY29sdW1uU3R5bGVzID0gc3R5bGVzLmNvbHVtblN0eWxlc1tjb2x1bW4uZGF0YUtleV0gfHxcbiAgICAgICAgc3R5bGVzLmNvbHVtblN0eWxlc1tjb2x1bW4uaW5kZXhdIHx8XG4gICAgICAgIHt9O1xuICAgIHZhciBjb2xTdHlsZXMgPSBzZWN0aW9uTmFtZSA9PT0gJ2JvZHknID8gY29sdW1uU3R5bGVzIDoge307XG4gICAgdmFyIHJvd1N0eWxlcyA9IHNlY3Rpb25OYW1lID09PSAnYm9keScgJiYgcm93SW5kZXggJSAyID09PSAwXG4gICAgICAgID8gKDAsIHBvbHlmaWxsc18xLmFzc2lnbikoe30sIHRoZW1lLmFsdGVybmF0ZVJvdywgc3R5bGVzLmFsdGVybmF0ZVJvd1N0eWxlcylcbiAgICAgICAgOiB7fTtcbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gKDAsIGNvbmZpZ18xLmRlZmF1bHRTdHlsZXMpKHNjYWxlRmFjdG9yKTtcbiAgICB2YXIgdGhlbWVTdHlsZXMgPSAoMCwgcG9seWZpbGxzXzEuYXNzaWduKSh7fSwgZGVmYXVsdFN0eWxlLCBvdGhlclN0eWxlcywgcm93U3R5bGVzLCBjb2xTdHlsZXMpO1xuICAgIHJldHVybiAoMCwgcG9seWZpbGxzXzEuYXNzaWduKSh0aGVtZVN0eWxlcywgY2VsbElucHV0U3R5bGVzKTtcbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNjY0OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLmFkZFBhZ2UgPSBleHBvcnRzLmRyYXdUYWJsZSA9IHZvaWQgMDtcbnZhciBjb21tb25fMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDIwKTtcbnZhciBtb2RlbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwKTtcbnZhciBkb2N1bWVudEhhbmRsZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ0KTtcbnZhciBwb2x5ZmlsbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzU2KTtcbnZhciBhdXRvVGFibGVUZXh0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7XG52YXIgdGFibGVQcmludGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyNCk7XG5mdW5jdGlvbiBkcmF3VGFibGUoanNQREZEb2MsIHRhYmxlKSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGFibGUuc2V0dGluZ3M7XG4gICAgdmFyIHN0YXJ0WSA9IHNldHRpbmdzLnN0YXJ0WTtcbiAgICB2YXIgbWFyZ2luID0gc2V0dGluZ3MubWFyZ2luO1xuICAgIHZhciBjdXJzb3IgPSB7XG4gICAgICAgIHg6IG1hcmdpbi5sZWZ0LFxuICAgICAgICB5OiBzdGFydFksXG4gICAgfTtcbiAgICB2YXIgc2VjdGlvbnNIZWlnaHQgPSB0YWJsZS5nZXRIZWFkSGVpZ2h0KHRhYmxlLmNvbHVtbnMpICsgdGFibGUuZ2V0Rm9vdEhlaWdodCh0YWJsZS5jb2x1bW5zKTtcbiAgICB2YXIgbWluVGFibGVCb3R0b21Qb3MgPSBzdGFydFkgKyBtYXJnaW4uYm90dG9tICsgc2VjdGlvbnNIZWlnaHQ7XG4gICAgaWYgKHNldHRpbmdzLnBhZ2VCcmVhayA9PT0gJ2F2b2lkJykge1xuICAgICAgICB2YXIgcm93cyA9IHRhYmxlLmJvZHk7XG4gICAgICAgIHZhciB0YWJsZUhlaWdodCA9IHJvd3MucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJvdykgeyByZXR1cm4gYWNjICsgcm93LmhlaWdodDsgfSwgMCk7XG4gICAgICAgIG1pblRhYmxlQm90dG9tUG9zICs9IHRhYmxlSGVpZ2h0O1xuICAgIH1cbiAgICB2YXIgZG9jID0gbmV3IGRvY3VtZW50SGFuZGxlcl8xLkRvY0hhbmRsZXIoanNQREZEb2MpO1xuICAgIGlmIChzZXR0aW5ncy5wYWdlQnJlYWsgPT09ICdhbHdheXMnIHx8XG4gICAgICAgIChzZXR0aW5ncy5zdGFydFkgIT0gbnVsbCAmJiBtaW5UYWJsZUJvdHRvbVBvcyA+IGRvYy5wYWdlU2l6ZSgpLmhlaWdodCkpIHtcbiAgICAgICAgbmV4dFBhZ2UoZG9jKTtcbiAgICAgICAgY3Vyc29yLnkgPSBtYXJnaW4udG9wO1xuICAgIH1cbiAgICB0YWJsZS5jYWxsV2lsbERyYXdQYWdlSG9va3MoZG9jLCBjdXJzb3IpO1xuICAgIHZhciBzdGFydFBvcyA9ICgwLCBwb2x5ZmlsbHNfMS5hc3NpZ24pKHt9LCBjdXJzb3IpO1xuICAgIHRhYmxlLnN0YXJ0UGFnZU51bWJlciA9IGRvYy5wYWdlTnVtYmVyKCk7XG4gICAgaWYgKHNldHRpbmdzLmhvcml6b250YWxQYWdlQnJlYWspIHtcbiAgICAgICAgLy8gbWFuYWdlZCBmbG93IGZvciBzcGxpdCBjb2x1bW5zXG4gICAgICAgIHByaW50VGFibGVXaXRoSG9yaXpvbnRhbFBhZ2VCcmVhayhkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG5vcm1hbCBmbG93XG4gICAgICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5zaG93SGVhZCA9PT0gJ2ZpcnN0UGFnZScgfHxcbiAgICAgICAgICAgIHNldHRpbmdzLnNob3dIZWFkID09PSAnZXZlcnlQYWdlJykge1xuICAgICAgICAgICAgdGFibGUuaGVhZC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJpbnRSb3coZG9jLCB0YWJsZSwgcm93LCBjdXJzb3IsIHRhYmxlLmNvbHVtbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICAgICAgdGFibGUuYm9keS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgaXNMYXN0Um93ID0gaW5kZXggPT09IHRhYmxlLmJvZHkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHByaW50RnVsbFJvdyhkb2MsIHRhYmxlLCByb3csIGlzTGFzdFJvdywgc3RhcnRQb3MsIGN1cnNvciwgdGFibGUuY29sdW1ucyk7XG4gICAgICAgIH0pO1xuICAgICAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd0Zvb3QgPT09ICdsYXN0UGFnZScgfHwgc2V0dGluZ3Muc2hvd0Zvb3QgPT09ICdldmVyeVBhZ2UnKSB7XG4gICAgICAgICAgICB0YWJsZS5mb290LmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmludFJvdyhkb2MsIHRhYmxlLCByb3csIGN1cnNvciwgdGFibGUuY29sdW1ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAoMCwgY29tbW9uXzEuYWRkVGFibGVCb3JkZXIpKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IpO1xuICAgIHRhYmxlLmNhbGxFbmRQYWdlSG9va3MoZG9jLCBjdXJzb3IpO1xuICAgIHRhYmxlLmZpbmFsWSA9IGN1cnNvci55O1xuICAgIGpzUERGRG9jLmxhc3RBdXRvVGFibGUgPSB0YWJsZTtcbiAgICBqc1BERkRvYy5wcmV2aW91c0F1dG9UYWJsZSA9IHRhYmxlOyAvLyBEZXByZWNhdGVkXG4gICAgaWYgKGpzUERGRG9jLmF1dG9UYWJsZSlcbiAgICAgICAganNQREZEb2MuYXV0b1RhYmxlLnByZXZpb3VzID0gdGFibGU7IC8vIERlcHJlY2F0ZWRcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xufVxuZXhwb3J0cy5kcmF3VGFibGUgPSBkcmF3VGFibGU7XG5mdW5jdGlvbiBwcmludFRhYmxlV2l0aEhvcml6b250YWxQYWdlQnJlYWsoZG9jLCB0YWJsZSwgc3RhcnRQb3MsIGN1cnNvcikge1xuICAgIC8vIGNhbGN1bGF0ZSB3aWR0aCBvZiBjb2x1bW5zIGFuZCByZW5kZXIgb25seSB0aG9zZSB3aGljaCBjYW4gZml0IGludG8gcGFnZVxuICAgIHZhciBhbGxDb2x1bW5zQ2FuRml0UmVzdWx0ID0gKDAsIHRhYmxlUHJpbnRlcl8xLmNhbGN1bGF0ZUFsbENvbHVtbnNDYW5GaXRJblBhZ2UpKGRvYywgdGFibGUpO1xuICAgIHZhciBzZXR0aW5ncyA9IHRhYmxlLnNldHRpbmdzO1xuICAgIGlmIChzZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrQmVoYXZpb3VyID09PSAnYWZ0ZXJBbGxSb3dzJykge1xuICAgICAgICBhbGxDb2x1bW5zQ2FuRml0UmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKGNvbHNBbmRJbmRleGVzLCBpbmRleCkge1xuICAgICAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICAgICAgICAgIC8vIGFkZCBwYWdlIHRvIHByaW50IG5leHQgY29sdW1ucyBpbiBuZXcgcGFnZVxuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYWRkaW5nIGEgcGFnZSBoZXJlLCBtYWtlIHN1cmUgbm90IHRvIHByaW50IHRoZSBmb290ZXJzXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IHdlcmUgYWxyZWFkeSBwcmludGVkIGJlZm9yZSBvbiB0aGlzIHNhbWUgbG9vcFxuICAgICAgICAgICAgICAgIGFkZFBhZ2UoZG9jLCB0YWJsZSwgc3RhcnRQb3MsIGN1cnNvciwgY29sc0FuZEluZGV4ZXMuY29sdW1ucywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBwcmludCBoZWFkIGZvciBzZWxlY3RlZCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgcHJpbnRIZWFkKGRvYywgdGFibGUsIGN1cnNvciwgY29sc0FuZEluZGV4ZXMuY29sdW1ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwcmludCBib2R5ICYgZm9vdGVyIGZvciBzZWxlY3RlZCBjb2x1bW5zXG4gICAgICAgICAgICBwcmludEJvZHkoZG9jLCB0YWJsZSwgc3RhcnRQb3MsIGN1cnNvciwgY29sc0FuZEluZGV4ZXMuY29sdW1ucyk7XG4gICAgICAgICAgICBwcmludEZvb3QoZG9jLCB0YWJsZSwgY3Vyc29yLCBjb2xzQW5kSW5kZXhlcy5jb2x1bW5zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xID0gLTE7XG4gICAgICAgIHZhciBmaXJzdENvbHVtbnNUb0ZpdFJlc3VsdCA9IGFsbENvbHVtbnNDYW5GaXRSZXN1bHRbMF07XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGZpcnN0IGNvbHVtbnMsIHRha2luZyBub3RlIG9mIHRoZSBsYXN0IHJvdyBwcmludGVkXG4gICAgICAgICAgICB2YXIgbGFzdFByaW50ZWRSb3dJbmRleCA9IGxhc3RSb3dJbmRleE9mTGFzdFBhZ2VfMTtcbiAgICAgICAgICAgIGlmIChmaXJzdENvbHVtbnNUb0ZpdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0Q29sdW1uc1RvRml0ID0gZmlyc3RDb2x1bW5zVG9GaXRSZXN1bHQuY29sdW1ucztcbiAgICAgICAgICAgICAgICBpZiAobGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBhZGRpbmcgYSBwYWdlIGhlcmUsIG1ha2Ugc3VyZSBub3QgdG8gcHJpbnQgdGhlIGZvb3RlcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IHdlcmUgYWxyZWFkeSBwcmludGVkIGJlZm9yZSBvbiB0aGlzIHNhbWUgbG9vcFxuICAgICAgICAgICAgICAgICAgICBhZGRQYWdlKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IsIGZpcnN0Q29sdW1uc1RvRml0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW50SGVhZChkb2MsIHRhYmxlLCBjdXJzb3IsIGZpcnN0Q29sdW1uc1RvRml0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdFByaW50ZWRSb3dJbmRleCA9IHByaW50Qm9keVdpdGhvdXRQYWdlQnJlYWtzKGRvYywgdGFibGUsIGxhc3RSb3dJbmRleE9mTGFzdFBhZ2VfMSArIDEsIGN1cnNvciwgZmlyc3RDb2x1bW5zVG9GaXQpO1xuICAgICAgICAgICAgICAgIHByaW50Rm9vdChkb2MsIHRhYmxlLCBjdXJzb3IsIGZpcnN0Q29sdW1uc1RvRml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGhvdyBtYW55IHJvd3Mgd2VyZSBwcmludGVkLCBzbyB0aGF0IHRoZSBuZXh0IGNvbHVtbnMgd291bGQgbm90IHByaW50IG1vcmUgcm93cyB0aGFuIHRoYXRcbiAgICAgICAgICAgIHZhciBtYXhOdW1iZXJPZlJvd3MgPSBsYXN0UHJpbnRlZFJvd0luZGV4IC0gbGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xO1xuICAgICAgICAgICAgLy8gUHJpbnQgdGhlIG5leHQgY29sdW1ucywgbmV2ZXIgZXhjZWRpbmcgbWF4TnVtYmVyT2ZSb3dzXG4gICAgICAgICAgICBhbGxDb2x1bW5zQ2FuRml0UmVzdWx0LnNsaWNlKDEpLmZvckVhY2goZnVuY3Rpb24gKGNvbHNBbmRJbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIGFkZGluZyBhIHBhZ2UgaGVyZSwgbWFrZSBzdXJlIG5vdCB0byBwcmludCB0aGUgZm9vdGVyc1xuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSB3ZXJlIGFscmVhZHkgcHJpbnRlZCBiZWZvcmUgb24gdGhpcyBzYW1lIGxvb3BcbiAgICAgICAgICAgICAgICBhZGRQYWdlKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHNBbmRJbmRleGVzLmNvbHVtbnMsIHRydWUpO1xuICAgICAgICAgICAgICAgIHByaW50Qm9keVdpdGhvdXRQYWdlQnJlYWtzKGRvYywgdGFibGUsIGxhc3RSb3dJbmRleE9mTGFzdFBhZ2VfMSArIDEsIGN1cnNvciwgY29sc0FuZEluZGV4ZXMuY29sdW1ucywgbWF4TnVtYmVyT2ZSb3dzKTtcbiAgICAgICAgICAgICAgICBwcmludEZvb3QoZG9jLCB0YWJsZSwgY3Vyc29yLCBjb2xzQW5kSW5kZXhlcy5jb2x1bW5zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGFzdFJvd0luZGV4T2ZMYXN0UGFnZV8xID0gbGFzdFByaW50ZWRSb3dJbmRleDtcbiAgICAgICAgfTtcbiAgICAgICAgd2hpbGUgKGxhc3RSb3dJbmRleE9mTGFzdFBhZ2VfMSA8IHRhYmxlLmJvZHkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgX2xvb3BfMSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcHJpbnRIZWFkKGRvYywgdGFibGUsIGN1cnNvciwgY29sdW1ucykge1xuICAgIHZhciBzZXR0aW5ncyA9IHRhYmxlLnNldHRpbmdzO1xuICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgaWYgKHNldHRpbmdzLnNob3dIZWFkID09PSAnZmlyc3RQYWdlJyB8fCBzZXR0aW5ncy5zaG93SGVhZCA9PT0gJ2V2ZXJ5UGFnZScpIHtcbiAgICAgICAgdGFibGUuaGVhZC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTsgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcHJpbnRCb2R5KGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IsIGNvbHVtbnMpIHtcbiAgICBkb2MuYXBwbHlTdHlsZXMoZG9jLnVzZXJTdHlsZXMpO1xuICAgIHRhYmxlLmJvZHkuZm9yRWFjaChmdW5jdGlvbiAocm93LCBpbmRleCkge1xuICAgICAgICB2YXIgaXNMYXN0Um93ID0gaW5kZXggPT09IHRhYmxlLmJvZHkubGVuZ3RoIC0gMTtcbiAgICAgICAgcHJpbnRGdWxsUm93KGRvYywgdGFibGUsIHJvdywgaXNMYXN0Um93LCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHByaW50Qm9keVdpdGhvdXRQYWdlQnJlYWtzKGRvYywgdGFibGUsIHN0YXJ0Um93SW5kZXgsIGN1cnNvciwgY29sdW1ucywgbWF4TnVtYmVyT2ZSb3dzKSB7XG4gICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICBtYXhOdW1iZXJPZlJvd3MgPSBtYXhOdW1iZXJPZlJvd3MgIT09IG51bGwgJiYgbWF4TnVtYmVyT2ZSb3dzICE9PSB2b2lkIDAgPyBtYXhOdW1iZXJPZlJvd3MgOiB0YWJsZS5ib2R5Lmxlbmd0aDtcbiAgICB2YXIgZW5kUm93SW5kZXggPSBNYXRoLm1pbihzdGFydFJvd0luZGV4ICsgbWF4TnVtYmVyT2ZSb3dzLCB0YWJsZS5ib2R5Lmxlbmd0aCk7XG4gICAgdmFyIGxhc3RQcmludGVkUm93SW5kZXggPSAtMTtcbiAgICB0YWJsZS5ib2R5LnNsaWNlKHN0YXJ0Um93SW5kZXgsIGVuZFJvd0luZGV4KS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGluZGV4KSB7XG4gICAgICAgIHZhciBpc0xhc3RSb3cgPSBzdGFydFJvd0luZGV4ICsgaW5kZXggPT09IHRhYmxlLmJvZHkubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIHJlbWFpbmluZ1NwYWNlID0gZ2V0UmVtYWluaW5nUGFnZVNwYWNlKGRvYywgdGFibGUsIGlzTGFzdFJvdywgY3Vyc29yKTtcbiAgICAgICAgaWYgKHJvdy5jYW5FbnRpcmVSb3dGaXQocmVtYWluaW5nU3BhY2UsIGNvbHVtbnMpKSB7XG4gICAgICAgICAgICBwcmludFJvdyhkb2MsIHRhYmxlLCByb3csIGN1cnNvciwgY29sdW1ucyk7XG4gICAgICAgICAgICBsYXN0UHJpbnRlZFJvd0luZGV4ID0gc3RhcnRSb3dJbmRleCArIGluZGV4O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGxhc3RQcmludGVkUm93SW5kZXg7XG59XG5mdW5jdGlvbiBwcmludEZvb3QoZG9jLCB0YWJsZSwgY3Vyc29yLCBjb2x1bW5zKSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGFibGUuc2V0dGluZ3M7XG4gICAgZG9jLmFwcGx5U3R5bGVzKGRvYy51c2VyU3R5bGVzKTtcbiAgICBpZiAoc2V0dGluZ3Muc2hvd0Zvb3QgPT09ICdsYXN0UGFnZScgfHwgc2V0dGluZ3Muc2hvd0Zvb3QgPT09ICdldmVyeVBhZ2UnKSB7XG4gICAgICAgIHRhYmxlLmZvb3QuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7IHJldHVybiBwcmludFJvdyhkb2MsIHRhYmxlLCByb3csIGN1cnNvciwgY29sdW1ucyk7IH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ0xpbmVDb3VudChjZWxsLCByZW1haW5pbmdQYWdlU3BhY2UsIGRvYykge1xuICAgIHZhciBsaW5lSGVpZ2h0ID0gZG9jLmdldExpbmVIZWlnaHQoY2VsbC5zdHlsZXMuZm9udFNpemUpO1xuICAgIHZhciB2UGFkZGluZyA9IGNlbGwucGFkZGluZygndmVydGljYWwnKTtcbiAgICB2YXIgcmVtYWluaW5nTGluZXMgPSBNYXRoLmZsb29yKChyZW1haW5pbmdQYWdlU3BhY2UgLSB2UGFkZGluZykgLyBsaW5lSGVpZ2h0KTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgcmVtYWluaW5nTGluZXMpO1xufVxuZnVuY3Rpb24gbW9kaWZ5Um93VG9GaXQocm93LCByZW1haW5pbmdQYWdlU3BhY2UsIHRhYmxlLCBkb2MpIHtcbiAgICB2YXIgY2VsbHMgPSB7fTtcbiAgICByb3cuc3BhbnNNdWx0aXBsZVBhZ2VzID0gdHJ1ZTtcbiAgICByb3cuaGVpZ2h0ID0gMDtcbiAgICB2YXIgcm93SGVpZ2h0ID0gMDtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGFibGUuY29sdW1uczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IF9hW19pXTtcbiAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgaWYgKCFjZWxsKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjZWxsLnRleHQpKSB7XG4gICAgICAgICAgICBjZWxsLnRleHQgPSBbY2VsbC50ZXh0XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVtYWluZGVyQ2VsbCA9IG5ldyBtb2RlbHNfMS5DZWxsKGNlbGwucmF3LCBjZWxsLnN0eWxlcywgY2VsbC5zZWN0aW9uKTtcbiAgICAgICAgcmVtYWluZGVyQ2VsbCA9ICgwLCBwb2x5ZmlsbHNfMS5hc3NpZ24pKHJlbWFpbmRlckNlbGwsIGNlbGwpO1xuICAgICAgICByZW1haW5kZXJDZWxsLnRleHQgPSBbXTtcbiAgICAgICAgdmFyIHJlbWFpbmluZ0xpbmVDb3VudCA9IGdldFJlbWFpbmluZ0xpbmVDb3VudChjZWxsLCByZW1haW5pbmdQYWdlU3BhY2UsIGRvYyk7XG4gICAgICAgIGlmIChjZWxsLnRleHQubGVuZ3RoID4gcmVtYWluaW5nTGluZUNvdW50KSB7XG4gICAgICAgICAgICByZW1haW5kZXJDZWxsLnRleHQgPSBjZWxsLnRleHQuc3BsaWNlKHJlbWFpbmluZ0xpbmVDb3VudCwgY2VsbC50ZXh0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjYWxlRmFjdG9yID0gZG9jLnNjYWxlRmFjdG9yKCk7XG4gICAgICAgIHZhciBsaW5lSGVpZ2h0RmFjdG9yID0gZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKTtcbiAgICAgICAgY2VsbC5jb250ZW50SGVpZ2h0ID0gY2VsbC5nZXRDb250ZW50SGVpZ2h0KHNjYWxlRmFjdG9yLCBsaW5lSGVpZ2h0RmFjdG9yKTtcbiAgICAgICAgaWYgKGNlbGwuY29udGVudEhlaWdodCA+PSByZW1haW5pbmdQYWdlU3BhY2UpIHtcbiAgICAgICAgICAgIGNlbGwuY29udGVudEhlaWdodCA9IHJlbWFpbmluZ1BhZ2VTcGFjZTtcbiAgICAgICAgICAgIHJlbWFpbmRlckNlbGwuc3R5bGVzLm1pbkNlbGxIZWlnaHQgLT0gcmVtYWluaW5nUGFnZVNwYWNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsLmNvbnRlbnRIZWlnaHQgPiByb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICByb3cuaGVpZ2h0ID0gY2VsbC5jb250ZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJlbWFpbmRlckNlbGwuY29udGVudEhlaWdodCA9IHJlbWFpbmRlckNlbGwuZ2V0Q29udGVudEhlaWdodChzY2FsZUZhY3RvciwgbGluZUhlaWdodEZhY3Rvcik7XG4gICAgICAgIGlmIChyZW1haW5kZXJDZWxsLmNvbnRlbnRIZWlnaHQgPiByb3dIZWlnaHQpIHtcbiAgICAgICAgICAgIHJvd0hlaWdodCA9IHJlbWFpbmRlckNlbGwuY29udGVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjZWxsc1tjb2x1bW4uaW5kZXhdID0gcmVtYWluZGVyQ2VsbDtcbiAgICB9XG4gICAgdmFyIHJlbWFpbmRlclJvdyA9IG5ldyBtb2RlbHNfMS5Sb3cocm93LnJhdywgLTEsIHJvdy5zZWN0aW9uLCBjZWxscywgdHJ1ZSk7XG4gICAgcmVtYWluZGVyUm93LmhlaWdodCA9IHJvd0hlaWdodDtcbiAgICBmb3IgKHZhciBfYiA9IDAsIF9jID0gdGFibGUuY29sdW1uczsgX2IgPCBfYy5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IF9jW19iXTtcbiAgICAgICAgdmFyIHJlbWFpbmRlckNlbGwgPSByZW1haW5kZXJSb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgaWYgKHJlbWFpbmRlckNlbGwpIHtcbiAgICAgICAgICAgIHJlbWFpbmRlckNlbGwuaGVpZ2h0ID0gcmVtYWluZGVyUm93LmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgY2VsbC5oZWlnaHQgPSByb3cuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZW1haW5kZXJSb3c7XG59XG5mdW5jdGlvbiBzaG91bGRQcmludE9uQ3VycmVudFBhZ2UoZG9jLCByb3csIHJlbWFpbmluZ1BhZ2VTcGFjZSwgdGFibGUpIHtcbiAgICB2YXIgcGFnZUhlaWdodCA9IGRvYy5wYWdlU2l6ZSgpLmhlaWdodDtcbiAgICB2YXIgbWFyZ2luID0gdGFibGUuc2V0dGluZ3MubWFyZ2luO1xuICAgIHZhciBtYXJnaW5IZWlnaHQgPSBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbTtcbiAgICB2YXIgbWF4Um93SGVpZ2h0ID0gcGFnZUhlaWdodCAtIG1hcmdpbkhlaWdodDtcbiAgICBpZiAocm93LnNlY3Rpb24gPT09ICdib2R5Jykge1xuICAgICAgICAvLyBTaG91bGQgYWxzbyB0YWtlIGludG8gYWNjb3VudCB0aGF0IGhlYWQgYW5kIGZvb3QgaXMgbm90XG4gICAgICAgIC8vIG9uIGV2ZXJ5IHBhZ2Ugd2l0aCBzb21lIHNldHRpbmdzXG4gICAgICAgIG1heFJvd0hlaWdodCAtPVxuICAgICAgICAgICAgdGFibGUuZ2V0SGVhZEhlaWdodCh0YWJsZS5jb2x1bW5zKSArIHRhYmxlLmdldEZvb3RIZWlnaHQodGFibGUuY29sdW1ucyk7XG4gICAgfVxuICAgIHZhciBtaW5Sb3dIZWlnaHQgPSByb3cuZ2V0TWluaW11bVJvd0hlaWdodCh0YWJsZS5jb2x1bW5zLCBkb2MpO1xuICAgIHZhciBtaW5Sb3dGaXRzID0gbWluUm93SGVpZ2h0IDwgcmVtYWluaW5nUGFnZVNwYWNlO1xuICAgIGlmIChtaW5Sb3dIZWlnaHQgPiBtYXhSb3dIZWlnaHQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIldpbGwgbm90IGJlIGFibGUgdG8gcHJpbnQgcm93IFwiLmNvbmNhdChyb3cuaW5kZXgsIFwiIGNvcnJlY3RseSBzaW5jZSBpdCdzIG1pbmltdW0gaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHBhZ2UgaGVpZ2h0XCIpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghbWluUm93Rml0cykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciByb3dIYXNSb3dTcGFuQ2VsbCA9IHJvdy5oYXNSb3dTcGFuKHRhYmxlLmNvbHVtbnMpO1xuICAgIHZhciByb3dIaWdoZXJUaGFuUGFnZSA9IHJvdy5nZXRNYXhDZWxsSGVpZ2h0KHRhYmxlLmNvbHVtbnMpID4gbWF4Um93SGVpZ2h0O1xuICAgIGlmIChyb3dIaWdoZXJUaGFuUGFnZSkge1xuICAgICAgICBpZiAocm93SGFzUm93U3BhbkNlbGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgY29udGVudCBvZiByb3cgXCIuY29uY2F0KHJvdy5pbmRleCwgXCIgd2lsbCBub3QgYmUgZHJhd24gY29ycmVjdGx5IHNpbmNlIGRyYXdpbmcgcm93cyB3aXRoIGEgaGVpZ2h0IGxhcmdlciB0aGFuIHRoZSBwYWdlIGhlaWdodCBhbmQgaGFzIGNlbGxzIHdpdGggcm93c3BhbnMgaXMgbm90IHN1cHBvcnRlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocm93SGFzUm93U3BhbkNlbGwpIHtcbiAgICAgICAgLy8gQ3VycmVudGx5IGEgbmV3IHBhZ2UgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgYSByb3dzcGFuIHJvdyBkb24ndCBmaXQgYSBwYWdlLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0YWJsZS5zZXR0aW5ncy5yb3dQYWdlQnJlYWsgPT09ICdhdm9pZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBJbiBhbGwgb3RoZXIgY2FzZXMgcHJpbnQgdGhlIHJvdyBvbiBjdXJyZW50IHBhZ2VcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHByaW50RnVsbFJvdyhkb2MsIHRhYmxlLCByb3csIGlzTGFzdFJvdywgc3RhcnRQb3MsIGN1cnNvciwgY29sdW1ucykge1xuICAgIHZhciByZW1haW5pbmdTcGFjZSA9IGdldFJlbWFpbmluZ1BhZ2VTcGFjZShkb2MsIHRhYmxlLCBpc0xhc3RSb3csIGN1cnNvcik7XG4gICAgaWYgKHJvdy5jYW5FbnRpcmVSb3dGaXQocmVtYWluaW5nU3BhY2UsIGNvbHVtbnMpKSB7XG4gICAgICAgIC8vIFRoZSByb3cgZml0cyBpbiB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2hvdWxkUHJpbnRPbkN1cnJlbnRQYWdlKGRvYywgcm93LCByZW1haW5pbmdTcGFjZSwgdGFibGUpKSB7XG4gICAgICAgIC8vIFRoZSByb3cgZ2V0cyBzcGxpdCBpbiB0d28gaGVyZSwgZWFjaCBwaWVjZSBpbiBvbmUgcGFnZVxuICAgICAgICB2YXIgcmVtYWluZGVyUm93ID0gbW9kaWZ5Um93VG9GaXQocm93LCByZW1haW5pbmdTcGFjZSwgdGFibGUsIGRvYyk7XG4gICAgICAgIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICAgICAgYWRkUGFnZShkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICAgICAgcHJpbnRGdWxsUm93KGRvYywgdGFibGUsIHJlbWFpbmRlclJvdywgaXNMYXN0Um93LCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRoZSByb3cgZ2V0IHByaW50ZWQgZW50aXJlbGx5IG9uIHRoZSBuZXh0IHBhZ2VcbiAgICAgICAgYWRkUGFnZShkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICAgICAgcHJpbnRGdWxsUm93KGRvYywgdGFibGUsIHJvdywgaXNMYXN0Um93LCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwcmludFJvdyhkb2MsIHRhYmxlLCByb3csIGN1cnNvciwgY29sdW1ucykge1xuICAgIGN1cnNvci54ID0gdGFibGUuc2V0dGluZ3MubWFyZ2luLmxlZnQ7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBjb2x1bW5zXzEgPSBjb2x1bW5zOyBfaSA8IGNvbHVtbnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNfMVtfaV07XG4gICAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgY3Vyc29yLnggKz0gY29sdW1uLndpZHRoO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZG9jLmFwcGx5U3R5bGVzKGNlbGwuc3R5bGVzKTtcbiAgICAgICAgY2VsbC54ID0gY3Vyc29yLng7XG4gICAgICAgIGNlbGwueSA9IGN1cnNvci55O1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGFibGUuY2FsbENlbGxIb29rcyhkb2MsIHRhYmxlLmhvb2tzLndpbGxEcmF3Q2VsbCwgY2VsbCwgcm93LCBjb2x1bW4sIGN1cnNvcik7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjdXJzb3IueCArPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkcmF3Q2VsbFJlY3QoZG9jLCBjZWxsLCBjdXJzb3IpO1xuICAgICAgICB2YXIgdGV4dFBvcyA9IGNlbGwuZ2V0VGV4dFBvcygpO1xuICAgICAgICAoMCwgYXV0b1RhYmxlVGV4dF8xLmRlZmF1bHQpKGNlbGwudGV4dCwgdGV4dFBvcy54LCB0ZXh0UG9zLnksIHtcbiAgICAgICAgICAgIGhhbGlnbjogY2VsbC5zdHlsZXMuaGFsaWduLFxuICAgICAgICAgICAgdmFsaWduOiBjZWxsLnN0eWxlcy52YWxpZ24sXG4gICAgICAgICAgICBtYXhXaWR0aDogTWF0aC5jZWlsKGNlbGwud2lkdGggLSBjZWxsLnBhZGRpbmcoJ2xlZnQnKSAtIGNlbGwucGFkZGluZygncmlnaHQnKSksXG4gICAgICAgIH0sIGRvYy5nZXREb2N1bWVudCgpKTtcbiAgICAgICAgdGFibGUuY2FsbENlbGxIb29rcyhkb2MsIHRhYmxlLmhvb2tzLmRpZERyYXdDZWxsLCBjZWxsLCByb3csIGNvbHVtbiwgY3Vyc29yKTtcbiAgICAgICAgY3Vyc29yLnggKz0gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgICBjdXJzb3IueSArPSByb3cuaGVpZ2h0O1xufVxuZnVuY3Rpb24gZHJhd0NlbGxSZWN0KGRvYywgY2VsbCwgY3Vyc29yKSB7XG4gICAgdmFyIGNlbGxTdHlsZXMgPSBjZWxsLnN0eWxlcztcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2ltb25iZW5ndHNzb24vanNQREYtQXV0b1RhYmxlL2lzc3Vlcy83NzRcbiAgICAvLyBUT0RPICh2NCk6IGJldHRlciBzb2x1dGlvbj9cbiAgICBkb2MuZ2V0RG9jdW1lbnQoKS5zZXRGaWxsQ29sb3IoZG9jLmdldERvY3VtZW50KCkuZ2V0RmlsbENvbG9yKCkpO1xuICAgIGlmICh0eXBlb2YgY2VsbFN0eWxlcy5saW5lV2lkdGggPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIERyYXcgY2VsbCBiYWNrZ3JvdW5kIHdpdGggbm9ybWFsIGJvcmRlcnNcbiAgICAgICAgdmFyIGZpbGxTdHlsZSA9ICgwLCBjb21tb25fMS5nZXRGaWxsU3R5bGUpKGNlbGxTdHlsZXMubGluZVdpZHRoLCBjZWxsU3R5bGVzLmZpbGxDb2xvcik7XG4gICAgICAgIGlmIChmaWxsU3R5bGUpIHtcbiAgICAgICAgICAgIGRvYy5yZWN0KGNlbGwueCwgY3Vyc29yLnksIGNlbGwud2lkdGgsIGNlbGwuaGVpZ2h0LCBmaWxsU3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBjZWxsU3R5bGVzLmxpbmVXaWR0aCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gRHJhdyBjZWxsIGJhY2tncm91bmRcbiAgICAgICAgaWYgKGNlbGxTdHlsZXMuZmlsbENvbG9yKSB7XG4gICAgICAgICAgICBkb2MucmVjdChjZWxsLngsIGN1cnNvci55LCBjZWxsLndpZHRoLCBjZWxsLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEcmF3IGNlbGwgaW5kaXZpZHVhbCBib3JkZXJzXG4gICAgICAgIGRyYXdDZWxsQm9yZGVycyhkb2MsIGNlbGwsIGN1cnNvciwgY2VsbFN0eWxlcy5saW5lV2lkdGgpO1xuICAgIH1cbn1cbi8qKlxuICogRHJhdyBhbGwgc3BlY2lmaWVkIGJvcmRlcnMuIEJvcmRlcnMgYXJlIGNlbnRlcmVkIG9uIGNlbGwncyBlZGdlIGFuZCBsZW5ndGhlbmVkXG4gKiB0byBvdmVybGFwIHdpdGggbmVpZ2hib3VycyB0byBjcmVhdGUgc2hhcnAgY29ybmVycy5cbiAqIEBwYXJhbSBkb2NcbiAqIEBwYXJhbSBjZWxsXG4gKiBAcGFyYW0gY3Vyc29yXG4gKiBAcGFyYW0gZmlsbENvbG9yXG4gKiBAcGFyYW0gbGluZVdpZHRoXG4gKi9cbmZ1bmN0aW9uIGRyYXdDZWxsQm9yZGVycyhkb2MsIGNlbGwsIGN1cnNvciwgbGluZVdpZHRoKSB7XG4gICAgdmFyIHgxLCB5MSwgeDIsIHkyO1xuICAgIGlmIChsaW5lV2lkdGgudG9wKSB7XG4gICAgICAgIHgxID0gY3Vyc29yLng7XG4gICAgICAgIHkxID0gY3Vyc29yLnk7XG4gICAgICAgIHgyID0gY3Vyc29yLnggKyBjZWxsLndpZHRoO1xuICAgICAgICB5MiA9IGN1cnNvci55O1xuICAgICAgICBpZiAobGluZVdpZHRoLnJpZ2h0KSB7XG4gICAgICAgICAgICB4MiArPSAwLjUgKiBsaW5lV2lkdGgucmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmVXaWR0aC5sZWZ0KSB7XG4gICAgICAgICAgICB4MSAtPSAwLjUgKiBsaW5lV2lkdGgubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZShsaW5lV2lkdGgudG9wLCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgfVxuICAgIGlmIChsaW5lV2lkdGguYm90dG9tKSB7XG4gICAgICAgIHgxID0gY3Vyc29yLng7XG4gICAgICAgIHkxID0gY3Vyc29yLnkgKyBjZWxsLmhlaWdodDtcbiAgICAgICAgeDIgPSBjdXJzb3IueCArIGNlbGwud2lkdGg7XG4gICAgICAgIHkyID0gY3Vyc29yLnkgKyBjZWxsLmhlaWdodDtcbiAgICAgICAgaWYgKGxpbmVXaWR0aC5yaWdodCkge1xuICAgICAgICAgICAgeDIgKz0gMC41ICogbGluZVdpZHRoLnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lV2lkdGgubGVmdCkge1xuICAgICAgICAgICAgeDEgLT0gMC41ICogbGluZVdpZHRoLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZHJhd0xpbmUobGluZVdpZHRoLmJvdHRvbSwgeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgICBpZiAobGluZVdpZHRoLmxlZnQpIHtcbiAgICAgICAgeDEgPSBjdXJzb3IueDtcbiAgICAgICAgeTEgPSBjdXJzb3IueTtcbiAgICAgICAgeDIgPSBjdXJzb3IueDtcbiAgICAgICAgeTIgPSBjdXJzb3IueSArIGNlbGwuaGVpZ2h0O1xuICAgICAgICBpZiAobGluZVdpZHRoLnRvcCkge1xuICAgICAgICAgICAgeTEgLT0gMC41ICogbGluZVdpZHRoLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVdpZHRoLmJvdHRvbSkge1xuICAgICAgICAgICAgeTIgKz0gMC41ICogbGluZVdpZHRoLmJvdHRvbTtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZShsaW5lV2lkdGgubGVmdCwgeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgICBpZiAobGluZVdpZHRoLnJpZ2h0KSB7XG4gICAgICAgIHgxID0gY3Vyc29yLnggKyBjZWxsLndpZHRoO1xuICAgICAgICB5MSA9IGN1cnNvci55O1xuICAgICAgICB4MiA9IGN1cnNvci54ICsgY2VsbC53aWR0aDtcbiAgICAgICAgeTIgPSBjdXJzb3IueSArIGNlbGwuaGVpZ2h0O1xuICAgICAgICBpZiAobGluZVdpZHRoLnRvcCkge1xuICAgICAgICAgICAgeTEgLT0gMC41ICogbGluZVdpZHRoLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVdpZHRoLmJvdHRvbSkge1xuICAgICAgICAgICAgeTIgKz0gMC41ICogbGluZVdpZHRoLmJvdHRvbTtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZShsaW5lV2lkdGgucmlnaHQsIHgxLCB5MSwgeDIsIHkyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhd0xpbmUod2lkdGgsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIGRvYy5nZXREb2N1bWVudCgpLnNldExpbmVXaWR0aCh3aWR0aCk7XG4gICAgICAgIGRvYy5nZXREb2N1bWVudCgpLmxpbmUoeDEsIHkxLCB4MiwgeTIsICdTJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nUGFnZVNwYWNlKGRvYywgdGFibGUsIGlzTGFzdFJvdywgY3Vyc29yKSB7XG4gICAgdmFyIGJvdHRvbUNvbnRlbnRIZWlnaHQgPSB0YWJsZS5zZXR0aW5ncy5tYXJnaW4uYm90dG9tO1xuICAgIHZhciBzaG93Rm9vdCA9IHRhYmxlLnNldHRpbmdzLnNob3dGb290O1xuICAgIGlmIChzaG93Rm9vdCA9PT0gJ2V2ZXJ5UGFnZScgfHwgKHNob3dGb290ID09PSAnbGFzdFBhZ2UnICYmIGlzTGFzdFJvdykpIHtcbiAgICAgICAgYm90dG9tQ29udGVudEhlaWdodCArPSB0YWJsZS5nZXRGb290SGVpZ2h0KHRhYmxlLmNvbHVtbnMpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jLnBhZ2VTaXplKCkuaGVpZ2h0IC0gY3Vyc29yLnkgLSBib3R0b21Db250ZW50SGVpZ2h0O1xufVxuZnVuY3Rpb24gYWRkUGFnZShkb2MsIHRhYmxlLCBzdGFydFBvcywgY3Vyc29yLCBjb2x1bW5zLCBzdXBwcmVzc0Zvb3Rlcikge1xuICAgIGlmIChjb2x1bW5zID09PSB2b2lkIDApIHsgY29sdW1ucyA9IFtdOyB9XG4gICAgaWYgKHN1cHByZXNzRm9vdGVyID09PSB2b2lkIDApIHsgc3VwcHJlc3NGb290ZXIgPSBmYWxzZTsgfVxuICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgaWYgKHRhYmxlLnNldHRpbmdzLnNob3dGb290ID09PSAnZXZlcnlQYWdlJyAmJiAhc3VwcHJlc3NGb290ZXIpIHtcbiAgICAgICAgdGFibGUuZm9vdC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTsgfSk7XG4gICAgfVxuICAgIC8vIEFkZCB1c2VyIGNvbnRlbnQganVzdCBiZWZvcmUgYWRkaW5nIG5ldyBwYWdlIGVuc3VyZSBpdCB3aWxsXG4gICAgLy8gYmUgZHJhd24gYWJvdmUgb3RoZXIgdGhpbmdzIG9uIHRoZSBwYWdlXG4gICAgdGFibGUuY2FsbEVuZFBhZ2VIb29rcyhkb2MsIGN1cnNvcik7XG4gICAgdmFyIG1hcmdpbiA9IHRhYmxlLnNldHRpbmdzLm1hcmdpbjtcbiAgICAoMCwgY29tbW9uXzEuYWRkVGFibGVCb3JkZXIpKGRvYywgdGFibGUsIHN0YXJ0UG9zLCBjdXJzb3IpO1xuICAgIG5leHRQYWdlKGRvYyk7XG4gICAgdGFibGUucGFnZU51bWJlcisrO1xuICAgIHRhYmxlLnBhZ2VDb3VudCsrO1xuICAgIGN1cnNvci54ID0gbWFyZ2luLmxlZnQ7XG4gICAgY3Vyc29yLnkgPSBtYXJnaW4udG9wO1xuICAgIHN0YXJ0UG9zLnkgPSBtYXJnaW4udG9wO1xuICAgIC8vIGNhbGwgZGlkQWRkUGFnZSBob29rcyBiZWZvcmUgYW55IGNvbnRlbnQgaXMgYWRkZWQgdG8gdGhlIHBhZ2VcbiAgICB0YWJsZS5jYWxsV2lsbERyYXdQYWdlSG9va3MoZG9jLCBjdXJzb3IpO1xuICAgIGlmICh0YWJsZS5zZXR0aW5ncy5zaG93SGVhZCA9PT0gJ2V2ZXJ5UGFnZScpIHtcbiAgICAgICAgdGFibGUuaGVhZC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHByaW50Um93KGRvYywgdGFibGUsIHJvdywgY3Vyc29yLCBjb2x1bW5zKTsgfSk7XG4gICAgICAgIGRvYy5hcHBseVN0eWxlcyhkb2MudXNlclN0eWxlcyk7XG4gICAgfVxufVxuZXhwb3J0cy5hZGRQYWdlID0gYWRkUGFnZTtcbmZ1bmN0aW9uIG5leHRQYWdlKGRvYykge1xuICAgIHZhciBjdXJyZW50ID0gZG9jLnBhZ2VOdW1iZXIoKTtcbiAgICBkb2Muc2V0UGFnZShjdXJyZW50ICsgMSk7XG4gICAgdmFyIG5ld0N1cnJlbnQgPSBkb2MucGFnZU51bWJlcigpO1xuICAgIGlmIChuZXdDdXJyZW50ID09PSBjdXJyZW50KSB7XG4gICAgICAgIGRvYy5hZGRQYWdlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDIyNDpcbi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHsgdmFsdWU6IHRydWUgfSkpO1xuZXhwb3J0cy5jYWxjdWxhdGVBbGxDb2x1bW5zQ2FuRml0SW5QYWdlID0gdm9pZCAwO1xudmFyIGNvbW1vbl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjApO1xuLy8gZ2V0IGNvbHVtbnMgY2FuIGJlIGZpdCBpbnRvIHBhZ2VcbmZ1bmN0aW9uIGdldENvbHVtbnNDYW5GaXRJblBhZ2UoZG9jLCB0YWJsZSwgY29uZmlnKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgIC8vIEdldCBwYWdlIHdpZHRoXG4gICAgdmFyIHJlbWFpbmluZ1dpZHRoID0gKDAsIGNvbW1vbl8xLmdldFBhZ2VBdmFpbGFibGVXaWR0aCkoZG9jLCB0YWJsZSk7XG4gICAgLy8gR2V0IGNvbHVtbiBkYXRhIGtleSB0byByZXBlYXRcbiAgICB2YXIgcmVwZWF0Q29sdW1uc01hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgY29sSW5kZXhlcyA9IFtdO1xuICAgIHZhciBjb2x1bW5zID0gW107XG4gICAgdmFyIGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQgPSBbXTtcbiAgICB0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhYmxlLnNldHRpbmdzLmhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQpKSB7XG4gICAgICAgIGhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQgPSB0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0O1xuICAgICAgICAvLyBJdCBjYW4gYmUgYSBzaW5nbGUgdmFsdWUgb2YgdHlwZSBzdHJpbmcgb3IgbnVtYmVyIChldmVuIG51bWJlcjogMClcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHRhYmxlLnNldHRpbmdzLmhvcml6b250YWxQYWdlQnJlYWtSZXBlYXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiB0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBob3Jpem9udGFsUGFnZUJyZWFrUmVwZWF0ID0gW3RhYmxlLnNldHRpbmdzLmhvcml6b250YWxQYWdlQnJlYWtSZXBlYXRdO1xuICAgIH1cbiAgICAvLyBDb2RlIHRvIHJlcGVhdCB0aGUgZ2l2ZW4gY29sdW1uIGluIHNwbGl0IHBhZ2VzXG4gICAgaG9yaXpvbnRhbFBhZ2VCcmVha1JlcGVhdC5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgY29sID0gdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLmRhdGFLZXkgPT09IGZpZWxkIHx8IGl0ZW0uaW5kZXggPT09IGZpZWxkOyB9KTtcbiAgICAgICAgaWYgKGNvbCAmJiAhcmVwZWF0Q29sdW1uc01hcC5oYXMoY29sLmluZGV4KSkge1xuICAgICAgICAgICAgcmVwZWF0Q29sdW1uc01hcC5zZXQoY29sLmluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgIGNvbEluZGV4ZXMucHVzaChjb2wuaW5kZXgpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHRhYmxlLmNvbHVtbnNbY29sLmluZGV4XSk7XG4gICAgICAgICAgICByZW1haW5pbmdXaWR0aCAtPSBjb2wud3JhcHBlZFdpZHRoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgdmFyIGZpcnN0ID0gdHJ1ZTtcbiAgICB2YXIgaSA9IChfYSA9IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5zdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDsgLy8gbWFrZSBzdXJlIGNvdXRlciBpcyBpbml0aWF0ZWQgb3V0c2lkZSB0aGUgbG9vcFxuICAgIHdoaWxlIChpIDwgdGFibGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGVzXG4gICAgICAgIGlmIChyZXBlYXRDb2x1bW5zTWFwLmhhcyhpKSkge1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbFdpZHRoID0gdGFibGUuY29sdW1uc1tpXS53cmFwcGVkV2lkdGg7XG4gICAgICAgIC8vIFRha2UgYXQgbGVhc3Qgb25lIGNvbHVtbiBldmVuIGlmIGl0IGRvZXNuJ3QgZml0XG4gICAgICAgIGlmIChmaXJzdCB8fCByZW1haW5pbmdXaWR0aCA+PSBjb2xXaWR0aCkge1xuICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbEluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaCh0YWJsZS5jb2x1bW5zW2ldKTtcbiAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2xJbmRleGVzOiBjb2xJbmRleGVzLCBjb2x1bW5zOiBjb2x1bW5zLCBsYXN0SW5kZXg6IGkgLSAxIH07XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVBbGxDb2x1bW5zQ2FuRml0SW5QYWdlKGRvYywgdGFibGUpIHtcbiAgICB2YXIgYWxsUmVzdWx0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFibGUuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZ2V0Q29sdW1uc0NhbkZpdEluUGFnZShkb2MsIHRhYmxlLCB7IHN0YXJ0OiBpIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhbGxSZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgIGkgPSByZXN1bHQubGFzdEluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGxSZXN1bHRzO1xufVxuZXhwb3J0cy5jYWxjdWxhdGVBbGxDb2x1bW5zQ2FuRml0SW5QYWdlID0gY2FsY3VsYXRlQWxsQ29sdW1uc0NhbkZpdEluUGFnZTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzI0OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLmVsbGlwc2l6ZSA9IGV4cG9ydHMucmVzaXplQ29sdW1ucyA9IGV4cG9ydHMuY2FsY3VsYXRlV2lkdGhzID0gdm9pZCAwO1xudmFyIGNvbW1vbl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjApO1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGNvbHVtbiB3aWR0aHNcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlV2lkdGhzKGRvYywgdGFibGUpIHtcbiAgICBjYWxjdWxhdGUoZG9jLCB0YWJsZSk7XG4gICAgdmFyIHJlc2l6YWJsZUNvbHVtbnMgPSBbXTtcbiAgICB2YXIgaW5pdGlhbFRhYmxlV2lkdGggPSAwO1xuICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHZhciBjdXN0b21XaWR0aCA9IGNvbHVtbi5nZXRNYXhDdXN0b21DZWxsV2lkdGgodGFibGUpO1xuICAgICAgICBpZiAoY3VzdG9tV2lkdGgpIHtcbiAgICAgICAgICAgIC8vIGZpbmFsIGNvbHVtbiB3aWR0aFxuICAgICAgICAgICAgY29sdW1uLndpZHRoID0gY3VzdG9tV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbml0aWFsIGNvbHVtbiB3aWR0aCAod2lsbCBiZSByZXNpemVkKVxuICAgICAgICAgICAgY29sdW1uLndpZHRoID0gY29sdW1uLndyYXBwZWRXaWR0aDtcbiAgICAgICAgICAgIHJlc2l6YWJsZUNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxUYWJsZVdpZHRoICs9IGNvbHVtbi53aWR0aDtcbiAgICB9KTtcbiAgICAvLyB3aWR0aCBkaWZmZXJlbmNlIHRoYXQgbmVlZHMgdG8gYmUgZGlzdHJpYnV0ZWRcbiAgICB2YXIgcmVzaXplV2lkdGggPSB0YWJsZS5nZXRXaWR0aChkb2MucGFnZVNpemUoKS53aWR0aCkgLSBpbml0aWFsVGFibGVXaWR0aDtcbiAgICAvLyBmaXJzdCByZXNpemUgYXR0ZW1wdDogd2l0aCByZXNwZWN0IHRvIG1pblJlYWRhYmxlV2lkdGggYW5kIG1pbldpZHRoXG4gICAgaWYgKHJlc2l6ZVdpZHRoKSB7XG4gICAgICAgIHJlc2l6ZVdpZHRoID0gcmVzaXplQ29sdW1ucyhyZXNpemFibGVDb2x1bW5zLCByZXNpemVXaWR0aCwgZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbHVtbi5taW5SZWFkYWJsZVdpZHRoLCBjb2x1bW4ubWluV2lkdGgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gc2Vjb25kIHJlc2l6ZSBhdHRlbXB0OiBpZ25vcmUgbWluUmVhZGFibGVXaWR0aCBidXQgcmVzcGVjdCBtaW5XaWR0aFxuICAgIGlmIChyZXNpemVXaWR0aCkge1xuICAgICAgICByZXNpemVXaWR0aCA9IHJlc2l6ZUNvbHVtbnMocmVzaXphYmxlQ29sdW1ucywgcmVzaXplV2lkdGgsIGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5taW5XaWR0aDsgfSk7XG4gICAgfVxuICAgIHJlc2l6ZVdpZHRoID0gTWF0aC5hYnMocmVzaXplV2lkdGgpO1xuICAgIGlmICghdGFibGUuc2V0dGluZ3MuaG9yaXpvbnRhbFBhZ2VCcmVhayAmJlxuICAgICAgICByZXNpemVXaWR0aCA+IDAuMSAvIGRvYy5zY2FsZUZhY3RvcigpKSB7XG4gICAgICAgIC8vIFRhYmxlIGNhbid0IGdldCBzbWFsbGVyIGR1ZSB0byBjdXN0b20td2lkdGggb3IgbWluV2lkdGggcmVzdHJpY3Rpb25zXG4gICAgICAgIC8vIFdlIGNhbid0IHJlYWxseSBkbyBtdWNoIGhlcmUuIFVwIHRvIHVzZXIgdG8gZm9yIGV4YW1wbGVcbiAgICAgICAgLy8gcmVkdWNlIGZvbnQgc2l6ZSwgaW5jcmVhc2UgcGFnZSBzaXplIG9yIHJlbW92ZSBjdXN0b20gY2VsbCB3aWR0aHNcbiAgICAgICAgLy8gdG8gYWxsb3cgbW9yZSBjb2x1bW5zIHRvIGJlIHJlZHVjZWQgaW4gc2l6ZVxuICAgICAgICByZXNpemVXaWR0aCA9IHJlc2l6ZVdpZHRoIDwgMSA/IHJlc2l6ZVdpZHRoIDogTWF0aC5yb3VuZChyZXNpemVXaWR0aCk7XG4gICAgICAgIGNvbnNvbGUud2FybihcIk9mIHRoZSB0YWJsZSBjb250ZW50LCBcIi5jb25jYXQocmVzaXplV2lkdGgsIFwiIHVuaXRzIHdpZHRoIGNvdWxkIG5vdCBmaXQgcGFnZVwiKSk7XG4gICAgfVxuICAgIGFwcGx5Q29sU3BhbnModGFibGUpO1xuICAgIGZpdENvbnRlbnQodGFibGUsIGRvYyk7XG4gICAgYXBwbHlSb3dTcGFucyh0YWJsZSk7XG59XG5leHBvcnRzLmNhbGN1bGF0ZVdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocztcbmZ1bmN0aW9uIGNhbGN1bGF0ZShkb2MsIHRhYmxlKSB7XG4gICAgdmFyIHNmID0gZG9jLnNjYWxlRmFjdG9yKCk7XG4gICAgdmFyIGhvcml6b250YWxQYWdlQnJlYWsgPSB0YWJsZS5zZXR0aW5ncy5ob3Jpem9udGFsUGFnZUJyZWFrO1xuICAgIHZhciBhdmFpbGFibGVQYWdlV2lkdGggPSAoMCwgY29tbW9uXzEuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKShkb2MsIHRhYmxlKTtcbiAgICB0YWJsZS5hbGxSb3dzKCkuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0YWJsZS5jb2x1bW5zOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF9hW19pXTtcbiAgICAgICAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB2YXIgaG9va3MgPSB0YWJsZS5ob29rcy5kaWRQYXJzZUNlbGw7XG4gICAgICAgICAgICB0YWJsZS5jYWxsQ2VsbEhvb2tzKGRvYywgaG9va3MsIGNlbGwsIHJvdywgY29sdW1uLCBudWxsKTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nID0gY2VsbC5wYWRkaW5nKCdob3Jpem9udGFsJyk7XG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRXaWR0aCA9ICgwLCBjb21tb25fMS5nZXRTdHJpbmdXaWR0aCkoY2VsbC50ZXh0LCBjZWxsLnN0eWxlcywgZG9jKSArIHBhZGRpbmc7XG4gICAgICAgICAgICAvLyBVc2luZyBbXlxcU1xcdTAwQTBdIGluc3RlYWQgb2YgXFxzIGVuc3VyZXMgdGhhdCB3ZSBzcGxpdCB0aGUgdGV4dCBvbiBhbGxcbiAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UgZXhjZXB0IG5vbi1icmVha2luZyBzcGFjZXMgKFxcdTAwQTApLiBXZSBuZWVkIHRvIHByZXNlcnZlXG4gICAgICAgICAgICAvLyB0aGVtIGluIHRoZSBzcGxpdCBwcm9jZXNzIHRvIGVuc3VyZSBjb3JyZWN0IHdvcmQgc2VwYXJhdGlvbiBhbmQgd2lkdGhcbiAgICAgICAgICAgIC8vIGNhbGN1bGF0aW9uLlxuICAgICAgICAgICAgdmFyIGxvbmdlc3RXb3JkV2lkdGggPSAoMCwgY29tbW9uXzEuZ2V0U3RyaW5nV2lkdGgpKGNlbGwudGV4dC5qb2luKCcgJykuc3BsaXQoL1teXFxTXFx1MDBBMF0rLyksIGNlbGwuc3R5bGVzLCBkb2MpO1xuICAgICAgICAgICAgY2VsbC5taW5SZWFkYWJsZVdpZHRoID0gbG9uZ2VzdFdvcmRXaWR0aCArIGNlbGwucGFkZGluZygnaG9yaXpvbnRhbCcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsLnN0eWxlcy5jZWxsV2lkdGggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgY2VsbC5taW5XaWR0aCA9IGNlbGwuc3R5bGVzLmNlbGxXaWR0aDtcbiAgICAgICAgICAgICAgICBjZWxsLndyYXBwZWRXaWR0aCA9IGNlbGwuc3R5bGVzLmNlbGxXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwuc3R5bGVzLmNlbGxXaWR0aCA9PT0gJ3dyYXAnIHx8XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBhZ2VCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vIGNlbGwgd2lkdGggc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gYXZhaWxhYmxlIHBhZ2Ugd2lkdGhcbiAgICAgICAgICAgICAgICBpZiAoY2VsbC5jb250ZW50V2lkdGggPiBhdmFpbGFibGVQYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5taW5XaWR0aCA9IGF2YWlsYWJsZVBhZ2VXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC53cmFwcGVkV2lkdGggPSBhdmFpbGFibGVQYWdlV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLm1pbldpZHRoID0gY2VsbC5jb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwud3JhcHBlZFdpZHRoID0gY2VsbC5jb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYXV0b1xuICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0TWluV2lkdGggPSAxMCAvIHNmO1xuICAgICAgICAgICAgICAgIGNlbGwubWluV2lkdGggPSBjZWxsLnN0eWxlcy5taW5DZWxsV2lkdGggfHwgZGVmYXVsdE1pbldpZHRoO1xuICAgICAgICAgICAgICAgIGNlbGwud3JhcHBlZFdpZHRoID0gY2VsbC5jb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwubWluV2lkdGggPiBjZWxsLndyYXBwZWRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLndyYXBwZWRXaWR0aCA9IGNlbGwubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgdGFibGUuYWxsUm93cygpLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGFibGUuY29sdW1uczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfYVtfaV07XG4gICAgICAgICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgLy8gRm9yIG5vdyB3ZSBpZ25vcmUgdGhlIG1pbldpZHRoIGFuZCB3cmFwcGVkV2lkdGggb2YgY29sc3BhbiBjZWxscyB3aGVuIGNhbGN1bGF0aW5nIGNvbHNwYW4gd2lkdGhzLlxuICAgICAgICAgICAgLy8gQ291bGQgcHJvYmFibHkgYmUgaW1wcm92ZWQgdXBvbiBob3dldmVyLlxuICAgICAgICAgICAgaWYgKGNlbGwgJiYgY2VsbC5jb2xTcGFuID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLndyYXBwZWRXaWR0aCA9IE1hdGgubWF4KGNvbHVtbi53cmFwcGVkV2lkdGgsIGNlbGwud3JhcHBlZFdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4ubWluV2lkdGggPSBNYXRoLm1heChjb2x1bW4ubWluV2lkdGgsIGNlbGwubWluV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbHVtbi5taW5SZWFkYWJsZVdpZHRoID0gTWF0aC5tYXgoY29sdW1uLm1pblJlYWRhYmxlV2lkdGgsIGNlbGwubWluUmVhZGFibGVXaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNwZWN0IGNlbGxXaWR0aCBzZXQgaW4gY29sdW1uU3R5bGVzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gY2VsbHMgZm9yIHRoaXMgY29sdW1uXG4gICAgICAgICAgICAgICAgLy8gb3IgaWYgdGhlIGNvbHVtbiBvbmx5IGhhdmUgY29sc3BhbiBjZWxscy4gU2luY2UgdGhlIHdpZHRoIG9mIGNvbHNwYW4gY2VsbHNcbiAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBhZmZlY3QgdGhlIHdpZHRoIG9mIGNvbHVtbnMsIHNldHRpbmcgY29sdW1uU3R5bGVzIGNlbGxXaWR0aCBlbmFibGVzIHRoZVxuICAgICAgICAgICAgICAgIC8vIHVzZXIgdG8gYXQgbGVhc3QgZG8gaXQgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHBlcmZlY3QgZm9yIG5vdyBzaW5jZSBmb3IgZXhhbXBsZSByb3cgYW5kIHRhYmxlIHN0eWxlcyBhcmVcbiAgICAgICAgICAgICAgICAvLyBub3QgYWNjb3VudGVkIGZvclxuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5TdHlsZXMgPSB0YWJsZS5zdHlsZXMuY29sdW1uU3R5bGVzW2NvbHVtbi5kYXRhS2V5XSB8fFxuICAgICAgICAgICAgICAgICAgICB0YWJsZS5zdHlsZXMuY29sdW1uU3R5bGVzW2NvbHVtbi5pbmRleF0gfHxcbiAgICAgICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgICAgdmFyIGNlbGxXaWR0aCA9IGNvbHVtblN0eWxlcy5jZWxsV2lkdGggfHwgY29sdW1uU3R5bGVzLm1pbkNlbGxXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbFdpZHRoICYmIHR5cGVvZiBjZWxsV2lkdGggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5taW5XaWR0aCA9IGNlbGxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLndyYXBwZWRXaWR0aCA9IGNlbGxXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgY29sdW1ucyBnZXQgYXQgbGVhc3QgbWluIHdpZHRoIGV2ZW4gdGhvdWdoIHdpZHRoIGNhbGN1bGF0aW9ucyBhcmUgbm90IGJhc2VkIG9uIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoY2VsbC5jb2xTcGFuID4gMSAmJiAhY29sdW1uLm1pbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5taW5XaWR0aCA9IGNlbGwubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmNvbFNwYW4gPiAxICYmICFjb2x1bW4ud3JhcHBlZFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi53cmFwcGVkV2lkdGggPSBjZWxsLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBEaXN0cmlidXRlIHJlc2l6ZVdpZHRoIG9uIHBhc3NlZCByZXNpemFibGUgY29sdW1uc1xuICovXG5mdW5jdGlvbiByZXNpemVDb2x1bW5zKGNvbHVtbnMsIHJlc2l6ZVdpZHRoLCBnZXRNaW5XaWR0aCkge1xuICAgIHZhciBpbml0aWFsUmVzaXplV2lkdGggPSByZXNpemVXaWR0aDtcbiAgICB2YXIgc3VtV3JhcHBlZFdpZHRoID0gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY29sdW1uKSB7IHJldHVybiBhY2MgKyBjb2x1bW4ud3JhcHBlZFdpZHRoOyB9LCAwKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNbaV07XG4gICAgICAgIHZhciByYXRpbyA9IGNvbHVtbi53cmFwcGVkV2lkdGggLyBzdW1XcmFwcGVkV2lkdGg7XG4gICAgICAgIHZhciBzdWdnZXN0ZWRDaGFuZ2UgPSBpbml0aWFsUmVzaXplV2lkdGggKiByYXRpbztcbiAgICAgICAgdmFyIHN1Z2dlc3RlZFdpZHRoID0gY29sdW1uLndpZHRoICsgc3VnZ2VzdGVkQ2hhbmdlO1xuICAgICAgICB2YXIgbWluV2lkdGggPSBnZXRNaW5XaWR0aChjb2x1bW4pO1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBzdWdnZXN0ZWRXaWR0aCA8IG1pbldpZHRoID8gbWluV2lkdGggOiBzdWdnZXN0ZWRXaWR0aDtcbiAgICAgICAgcmVzaXplV2lkdGggLT0gbmV3V2lkdGggLSBjb2x1bW4ud2lkdGg7XG4gICAgICAgIGNvbHVtbi53aWR0aCA9IG5ld1dpZHRoO1xuICAgIH1cbiAgICByZXNpemVXaWR0aCA9IE1hdGgucm91bmQocmVzaXplV2lkdGggKiAxZTEwKSAvIDFlMTA7XG4gICAgLy8gUnVuIHRoZSByZXNpemVyIGFnYWluIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdpZHRoIG5lZWRzXG4gICAgLy8gdG8gYmUgZGlzdHJpYnV0ZWQgYW5kIHRoZXJlJ3JlIGNvbHVtbnMgdGhhdCBjYW4gYmUgcmVzaXplZFxuICAgIGlmIChyZXNpemVXaWR0aCkge1xuICAgICAgICB2YXIgcmVzaXphYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiByZXNpemVXaWR0aCA8IDBcbiAgICAgICAgICAgICAgICA/IGNvbHVtbi53aWR0aCA+IGdldE1pbldpZHRoKGNvbHVtbikgLy8gY2hlY2sgaWYgY29sdW1uIGNhbiBzaHJpbmtcbiAgICAgICAgICAgICAgICA6IHRydWU7IC8vIGNoZWNrIGlmIGNvbHVtbiBjYW4gZ3Jvd1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc2l6YWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXNpemVXaWR0aCA9IHJlc2l6ZUNvbHVtbnMocmVzaXphYmxlQ29sdW1ucywgcmVzaXplV2lkdGgsIGdldE1pbldpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzaXplV2lkdGg7XG59XG5leHBvcnRzLnJlc2l6ZUNvbHVtbnMgPSByZXNpemVDb2x1bW5zO1xuZnVuY3Rpb24gYXBwbHlSb3dTcGFucyh0YWJsZSkge1xuICAgIHZhciByb3dTcGFuQ2VsbHMgPSB7fTtcbiAgICB2YXIgY29sUm93U3BhbnNMZWZ0ID0gMTtcbiAgICB2YXIgYWxsID0gdGFibGUuYWxsUm93cygpO1xuICAgIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBhbGwubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgIHZhciByb3cgPSBhbGxbcm93SW5kZXhdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGFibGUuY29sdW1uczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfYVtfaV07XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHJvd1NwYW5DZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGNvbFJvd1NwYW5zTGVmdCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb2xSb3dTcGFuc0xlZnQtLTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5jZWxsLmhlaWdodCArPSByb3cuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbFJvd1NwYW5zTGVmdCA9IGRhdGEuY2VsbC5jb2xTcGFuO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgICAgICBkYXRhLmxlZnQtLTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZWZ0IDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvd1NwYW5DZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjZWxsLmhlaWdodCA9IHJvdy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwucm93U3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGFsbC5sZW5ndGggLSByb3dJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBjZWxsLnJvd1NwYW4gPiByZW1haW5pbmcgPyByZW1haW5pbmcgOiBjZWxsLnJvd1NwYW47XG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW5DZWxsc1tjb2x1bW4uaW5kZXhdID0geyBjZWxsOiBjZWxsLCBsZWZ0OiBsZWZ0LCByb3c6IHJvdyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5Q29sU3BhbnModGFibGUpIHtcbiAgICB2YXIgYWxsID0gdGFibGUuYWxsUm93cygpO1xuICAgIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBhbGwubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgIHZhciByb3cgPSBhbGxbcm93SW5kZXhdO1xuICAgICAgICB2YXIgY29sU3BhbkNlbGwgPSBudWxsO1xuICAgICAgICB2YXIgY29tYmluZWRDb2xTcGFuV2lkdGggPSAwO1xuICAgICAgICB2YXIgY29sU3BhbnNMZWZ0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoOyBjb2x1bW5JbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGFibGUuY29sdW1uc1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgICAvLyBXaWR0aCBhbmQgY29sc3BhblxuICAgICAgICAgICAgY29sU3BhbnNMZWZ0IC09IDE7XG4gICAgICAgICAgICBpZiAoY29sU3BhbnNMZWZ0ID4gMSAmJiB0YWJsZS5jb2x1bW5zW2NvbHVtbkluZGV4ICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjb21iaW5lZENvbFNwYW5XaWR0aCArPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJvdy5jZWxsc1tjb2x1bW4uaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29sU3BhbkNlbGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IGNvbFNwYW5DZWxsO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgICAgICBjb2xTcGFuQ2VsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2VsbC53aWR0aCA9IGNvbHVtbi53aWR0aCArIGNvbWJpbmVkQ29sU3BhbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbY29sdW1uLmluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbFNwYW5zTGVmdCA9IGNlbGwuY29sU3BhbjtcbiAgICAgICAgICAgICAgICBjb21iaW5lZENvbFNwYW5XaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuY29sU3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbkNlbGwgPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZENvbFNwYW5XaWR0aCArPSBjb2x1bW4ud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjZWxsLndpZHRoID0gY29sdW1uLndpZHRoICsgY29tYmluZWRDb2xTcGFuV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBmaXRDb250ZW50KHRhYmxlLCBkb2MpIHtcbiAgICB2YXIgcm93U3BhbkhlaWdodCA9IHsgY291bnQ6IDAsIGhlaWdodDogMCB9O1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0YWJsZS5hbGxSb3dzKCk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSBfYVtfaV07XG4gICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSB0YWJsZS5jb2x1bW5zOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF9jW19iXTtcbiAgICAgICAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICAgICAgICBpZiAoIWNlbGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBkb2MuYXBwbHlTdHlsZXMoY2VsbC5zdHlsZXMsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHRleHRTcGFjZSA9IGNlbGwud2lkdGggLSBjZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKTtcbiAgICAgICAgICAgIGlmIChjZWxsLnN0eWxlcy5vdmVyZmxvdyA9PT0gJ2xpbmVicmVhaycpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgb25lIHB0IHRvIHRleHRTcGFjZSB0byBmaXggcm91bmRpbmcgZXJyb3JcbiAgICAgICAgICAgICAgICBjZWxsLnRleHQgPSBkb2Muc3BsaXRUZXh0VG9TaXplKGNlbGwudGV4dCwgdGV4dFNwYWNlICsgMSAvIGRvYy5zY2FsZUZhY3RvcigpLCB7IGZvbnRTaXplOiBjZWxsLnN0eWxlcy5mb250U2l6ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwuc3R5bGVzLm92ZXJmbG93ID09PSAnZWxsaXBzaXplJykge1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dCA9IGVsbGlwc2l6ZShjZWxsLnRleHQsIHRleHRTcGFjZSwgY2VsbC5zdHlsZXMsIGRvYywgJy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC5zdHlsZXMub3ZlcmZsb3cgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0ID0gZWxsaXBzaXplKGNlbGwudGV4dCwgdGV4dFNwYWNlLCBjZWxsLnN0eWxlcywgZG9jLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2VsbC5zdHlsZXMub3ZlcmZsb3cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2VsbC5zdHlsZXMub3ZlcmZsb3coY2VsbC50ZXh0LCB0ZXh0U3BhY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLnRleHQgPSBbcmVzdWx0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwudGV4dCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRIZWlnaHQgPSBjZWxsLmdldENvbnRlbnRIZWlnaHQoZG9jLnNjYWxlRmFjdG9yKCksIGRvYy5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkpO1xuICAgICAgICAgICAgdmFyIHJlYWxDb250ZW50SGVpZ2h0ID0gY2VsbC5jb250ZW50SGVpZ2h0IC8gY2VsbC5yb3dTcGFuO1xuICAgICAgICAgICAgaWYgKGNlbGwucm93U3BhbiA+IDEgJiZcbiAgICAgICAgICAgICAgICByb3dTcGFuSGVpZ2h0LmNvdW50ICogcm93U3BhbkhlaWdodC5oZWlnaHQgPFxuICAgICAgICAgICAgICAgICAgICByZWFsQ29udGVudEhlaWdodCAqIGNlbGwucm93U3Bhbikge1xuICAgICAgICAgICAgICAgIHJvd1NwYW5IZWlnaHQgPSB7IGhlaWdodDogcmVhbENvbnRlbnRIZWlnaHQsIGNvdW50OiBjZWxsLnJvd1NwYW4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJvd1NwYW5IZWlnaHQgJiYgcm93U3BhbkhlaWdodC5jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocm93U3BhbkhlaWdodC5oZWlnaHQgPiByZWFsQ29udGVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICByZWFsQ29udGVudEhlaWdodCA9IHJvd1NwYW5IZWlnaHQuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWFsQ29udGVudEhlaWdodCA+IHJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByb3cuaGVpZ2h0ID0gcmVhbENvbnRlbnRIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcm93U3BhbkhlaWdodC5jb3VudC0tO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsbGlwc2l6ZSh0ZXh0LCB3aWR0aCwgc3R5bGVzLCBkb2MsIG92ZXJmbG93KSB7XG4gICAgcmV0dXJuIHRleHQubWFwKGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGVsbGlwc2l6ZVN0cihzdHIsIHdpZHRoLCBzdHlsZXMsIGRvYywgb3ZlcmZsb3cpOyB9KTtcbn1cbmV4cG9ydHMuZWxsaXBzaXplID0gZWxsaXBzaXplO1xuZnVuY3Rpb24gZWxsaXBzaXplU3RyKHRleHQsIHdpZHRoLCBzdHlsZXMsIGRvYywgb3ZlcmZsb3cpIHtcbiAgICB2YXIgcHJlY2lzaW9uID0gMTAwMDAgKiBkb2Muc2NhbGVGYWN0b3IoKTtcbiAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG4gICAgaWYgKHdpZHRoID49ICgwLCBjb21tb25fMS5nZXRTdHJpbmdXaWR0aCkodGV4dCwgc3R5bGVzLCBkb2MpKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICB3aGlsZSAod2lkdGggPCAoMCwgY29tbW9uXzEuZ2V0U3RyaW5nV2lkdGgpKHRleHQgKyBvdmVyZmxvdywgc3R5bGVzLCBkb2MpKSB7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQudHJpbSgpICsgb3ZlcmZsb3c7XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDk2NDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuaWYodHlwZW9mIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2NF9fID09PSAndW5kZWZpbmVkJykgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAndW5kZWZpbmVkJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY0X187XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IHt9O1xuLy8gVGhpcyBlbnRyeSBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIGl0IG5lZWQgdG8gYmUgaXNvbGF0ZWQgYWdhaW5zdCBvdGhlciBtb2R1bGVzIGluIHRoZSBjaHVuay5cbiFmdW5jdGlvbigpIHtcbnZhciBleHBvcnRzID0gX193ZWJwYWNrX2V4cG9ydHNfXztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7XG5leHBvcnRzLkNlbGwgPSBleHBvcnRzLkNvbHVtbiA9IGV4cG9ydHMuUm93ID0gZXhwb3J0cy5UYWJsZSA9IGV4cG9ydHMuQ2VsbEhvb2tEYXRhID0gZXhwb3J0cy5fX2RyYXdUYWJsZSA9IGV4cG9ydHMuX19jcmVhdGVUYWJsZSA9IGV4cG9ydHMuYXBwbHlQbHVnaW4gPSB2b2lkIDA7XG52YXIgYXBwbHlQbHVnaW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzQwKTtcbnZhciBpbnB1dFBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzYpO1xudmFyIHRhYmxlRHJhd2VyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NCk7XG52YXIgdGFibGVDYWxjdWxhdG9yXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3Mik7XG52YXIgbW9kZWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2MCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUYWJsZVwiLCAoeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZGVsc18xLlRhYmxlOyB9IH0pKTtcbnZhciBIb29rRGF0YV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2VsbEhvb2tEYXRhXCIsICh7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gSG9va0RhdGFfMS5DZWxsSG9va0RhdGE7IH0gfSkpO1xudmFyIG1vZGVsc18yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjApO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2VsbFwiLCAoeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZGVsc18yLkNlbGw7IH0gfSkpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29sdW1uXCIsICh7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9kZWxzXzIuQ29sdW1uOyB9IH0pKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJvd1wiLCAoeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZGVsc18yLlJvdzsgfSB9KSk7XG4vLyBleHBvcnQgeyBhcHBseVBsdWdpbiB9IGRpZG4ndCBleHBvcnQgYXBwbHlQbHVnaW5cbi8vIHRvIGluZGV4LmQudHMgZm9yIHNvbWUgcmVhc29uXG5mdW5jdGlvbiBhcHBseVBsdWdpbihqc1BERikge1xuICAgICgwLCBhcHBseVBsdWdpbl8xLmRlZmF1bHQpKGpzUERGKTtcbn1cbmV4cG9ydHMuYXBwbHlQbHVnaW4gPSBhcHBseVBsdWdpbjtcbmZ1bmN0aW9uIGF1dG9UYWJsZShkLCBvcHRpb25zKSB7XG4gICAgdmFyIGlucHV0ID0gKDAsIGlucHV0UGFyc2VyXzEucGFyc2VJbnB1dCkoZCwgb3B0aW9ucyk7XG4gICAgdmFyIHRhYmxlID0gKDAsIHRhYmxlQ2FsY3VsYXRvcl8xLmNyZWF0ZVRhYmxlKShkLCBpbnB1dCk7XG4gICAgKDAsIHRhYmxlRHJhd2VyXzEuZHJhd1RhYmxlKShkLCB0YWJsZSk7XG59XG4vLyBFeHBlcmltZW50YWwgZXhwb3J0XG5mdW5jdGlvbiBfX2NyZWF0ZVRhYmxlKGQsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW5wdXQgPSAoMCwgaW5wdXRQYXJzZXJfMS5wYXJzZUlucHV0KShkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKDAsIHRhYmxlQ2FsY3VsYXRvcl8xLmNyZWF0ZVRhYmxlKShkLCBpbnB1dCk7XG59XG5leHBvcnRzLl9fY3JlYXRlVGFibGUgPSBfX2NyZWF0ZVRhYmxlO1xuZnVuY3Rpb24gX19kcmF3VGFibGUoZCwgdGFibGUpIHtcbiAgICAoMCwgdGFibGVEcmF3ZXJfMS5kcmF3VGFibGUpKGQsIHRhYmxlKTtcbn1cbmV4cG9ydHMuX19kcmF3VGFibGUgPSBfX2RyYXdUYWJsZTtcbnRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICB2YXIganNQREYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2NCk7XG4gICAgLy8gV2VicGFjayBpbXBvcnRlZCBqc3BkZiBpbnN0ZWFkIG9mIGpzUERGIGZvciBzb21lIHJlYXNvblxuICAgIC8vIHdoaWxlIGl0IHNlZW1lZCB0byB3b3JrIGV2ZXJ5d2hlcmUgZWxzZS5cbiAgICBpZiAoanNQREYuanNQREYpXG4gICAgICAgIGpzUERGID0ganNQREYuanNQREY7XG4gICAgYXBwbHlQbHVnaW4oanNQREYpO1xufVxuY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gSW1wb3J0aW5nIGpzcGRmIGluIG5vZGVqcyBlbnZpcm9ubWVudHMgZG9lcyBub3Qgd29yayBhcyBvZiBqc3BkZlxuICAgIC8vIDEuNS4zIHNvIHdlIG5lZWQgdG8gc2lsZW5jZSBwb3RlbnRpYWwgZXJyb3JzIHRvIHN1cHBvcnQgdXNpbmcgZm9yIGV4YW1wbGVcbiAgICAvLyB0aGUgbm9kZWpzIGpzcGRmIGRpc3QgZmlsZXMgd2l0aCB0aGUgZXhwb3J0ZWQgYXBwbHlQbHVnaW5cbn1cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gYXV0b1RhYmxlO1xuXG59KCk7XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7IiwiLy8gc3JjL3V0aWxzL2Vudi50c1xudmFyIE5PVEhJTkcgPSBTeW1ib2wuZm9yKFwiaW1tZXItbm90aGluZ1wiKTtcbnZhciBEUkFGVEFCTEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItZHJhZnRhYmxlXCIpO1xudmFyIERSQUZUX1NUQVRFID0gU3ltYm9sLmZvcihcImltbWVyLXN0YXRlXCIpO1xuXG4vLyBzcmMvdXRpbHMvZXJyb3JzLnRzXG52YXIgZXJyb3JzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gW1xuICAvLyBBbGwgZXJyb3IgY29kZXMsIHN0YXJ0aW5nIGJ5IDA6XG4gIGZ1bmN0aW9uKHBsdWdpbikge1xuICAgIHJldHVybiBgVGhlIHBsdWdpbiBmb3IgJyR7cGx1Z2lufScgaGFzIG5vdCBiZWVuIGxvYWRlZCBpbnRvIEltbWVyLiBUbyBlbmFibGUgdGhlIHBsdWdpbiwgaW1wb3J0IGFuZCBjYWxsIFxcYGVuYWJsZSR7cGx1Z2lufSgpXFxgIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXIgYXBwbGljYXRpb24uYDtcbiAgfSxcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYHByb2R1Y2UgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHRoaW5ncyB0aGF0IGFyZSBkcmFmdGFibGU6IHBsYWluIG9iamVjdHMsIGFycmF5cywgTWFwLCBTZXQgb3IgY2xhc3NlcyB0aGF0IGFyZSBtYXJrZWQgd2l0aCAnW2ltbWVyYWJsZV06IHRydWUnLiBHb3QgJyR7dGhpbmd9J2A7XG4gIH0sXG4gIFwiVGhpcyBvYmplY3QgaGFzIGJlZW4gZnJvemVuIGFuZCBzaG91bGQgbm90IGJlIG11dGF0ZWRcIixcbiAgZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiBcIkNhbm5vdCB1c2UgYSBwcm94eSB0aGF0IGhhcyBiZWVuIHJldm9rZWQuIERpZCB5b3UgcGFzcyBhbiBvYmplY3QgZnJvbSBpbnNpZGUgYW4gaW1tZXIgZnVuY3Rpb24gdG8gYW4gYXN5bmMgcHJvY2Vzcz8gXCIgKyBkYXRhO1xuICB9LFxuICBcIkFuIGltbWVyIHByb2R1Y2VyIHJldHVybmVkIGEgbmV3IHZhbHVlICphbmQqIG1vZGlmaWVkIGl0cyBkcmFmdC4gRWl0aGVyIHJldHVybiBhIG5ldyB2YWx1ZSAqb3IqIG1vZGlmeSB0aGUgZHJhZnQuXCIsXG4gIFwiSW1tZXIgZm9yYmlkcyBjaXJjdWxhciByZWZlcmVuY2VzXCIsXG4gIFwiVGhlIGZpcnN0IG9yIHNlY29uZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCIsXG4gIFwiVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGNyZWF0ZURyYWZ0YCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LCBhbiBhcnJheSwgb3IgYW4gaW1tZXJhYmxlIG9iamVjdFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBmaW5pc2hEcmFmdGAgbXVzdCBiZSBhIGRyYWZ0IHJldHVybmVkIGJ5IGBjcmVhdGVEcmFmdGBcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9LFxuICBcIk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIGRlbGV0aW5nIGFycmF5IGluZGljZXNcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIHNldHRpbmcgYXJyYXkgaW5kaWNlcyBhbmQgdGhlICdsZW5ndGgnIHByb3BlcnR5XCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnb3JpZ2luYWwnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH1cbiAgLy8gTm90ZTogaWYgbW9yZSBlcnJvcnMgYXJlIGFkZGVkLCB0aGUgZXJyb3JPZmZzZXQgaW4gUGF0Y2hlcy50cyBzaG91bGQgYmUgaW5jcmVhc2VkXG4gIC8vIFNlZSBQYXRjaGVzLnRzIGZvciBhZGRpdGlvbmFsIGVycm9yc1xuXSA6IFtdO1xuZnVuY3Rpb24gZGllKGVycm9yLCAuLi5hcmdzKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zdCBlID0gZXJyb3JzW2Vycm9yXTtcbiAgICBjb25zdCBtc2cgPSBpc0Z1bmN0aW9uKGUpID8gZS5hcHBseShudWxsLCBhcmdzKSA6IGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbSW1tZXJdICR7bXNnfWApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgW0ltbWVyXSBtaW5pZmllZCBlcnJvciBucjogJHtlcnJvcn0uIEZ1bGwgZXJyb3IgYXQ6IGh0dHBzOi8vYml0Lmx5LzNjWEVLV2ZgXG4gICk7XG59XG5cbi8vIHNyYy91dGlscy9jb21tb24udHNcbnZhciBPID0gT2JqZWN0O1xudmFyIGdldFByb3RvdHlwZU9mID0gTy5nZXRQcm90b3R5cGVPZjtcbnZhciBDT05TVFJVQ1RPUiA9IFwiY29uc3RydWN0b3JcIjtcbnZhciBQUk9UT1RZUEUgPSBcInByb3RvdHlwZVwiO1xudmFyIENPTkZJR1VSQUJMRSA9IFwiY29uZmlndXJhYmxlXCI7XG52YXIgRU5VTUVSQUJMRSA9IFwiZW51bWVyYWJsZVwiO1xudmFyIFdSSVRBQkxFID0gXCJ3cml0YWJsZVwiO1xudmFyIFZBTFVFID0gXCJ2YWx1ZVwiO1xudmFyIGlzRHJhZnQgPSAodmFsdWUpID0+ICEhdmFsdWUgJiYgISF2YWx1ZVtEUkFGVF9TVEFURV07XG5mdW5jdGlvbiBpc0RyYWZ0YWJsZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpIHx8ICEhdmFsdWVbRFJBRlRBQkxFXSB8fCAhIXZhbHVlW0NPTlNUUlVDVE9SXT8uW0RSQUZUQUJMRV0gfHwgaXNNYXAodmFsdWUpIHx8IGlzU2V0KHZhbHVlKTtcbn1cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gT1tQUk9UT1RZUEVdW0NPTlNUUlVDVE9SXS50b1N0cmluZygpO1xudmFyIGNhY2hlZEN0b3JTdHJpbmdzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgIWlzT2JqZWN0aXNoKHZhbHVlKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IE9bUFJPVE9UWVBFXSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgQ3RvciA9IE8uaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgQ09OU1RSVUNUT1IpICYmIHByb3RvW0NPTlNUUlVDVE9SXTtcbiAgaWYgKEN0b3IgPT09IE9iamVjdClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFpc0Z1bmN0aW9uKEN0b3IpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGN0b3JTdHJpbmcgPSBjYWNoZWRDdG9yU3RyaW5ncy5nZXQoQ3Rvcik7XG4gIGlmIChjdG9yU3RyaW5nID09PSB2b2lkIDApIHtcbiAgICBjdG9yU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChDdG9yKTtcbiAgICBjYWNoZWRDdG9yU3RyaW5ncy5zZXQoQ3RvciwgY3RvclN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIGN0b3JTdHJpbmcgPT09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5mdW5jdGlvbiBvcmlnaW5hbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnQodmFsdWUpKVxuICAgIGRpZSgxNSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWVbRFJBRlRfU1RBVEVdLmJhc2VfO1xufVxuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXIsIHN0cmljdCA9IHRydWUpIHtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPT09IDAgLyogT2JqZWN0ICovKSB7XG4gICAgY29uc3Qga2V5cyA9IHN0cmljdCA/IFJlZmxlY3Qub3duS2V5cyhvYmopIDogTy5rZXlzKG9iaik7XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGl0ZXIoa2V5LCBvYmpba2V5XSwgb2JqKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmouZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiBpdGVyKGluZGV4LCBlbnRyeSwgb2JqKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEFyY2h0eXBlKHRoaW5nKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpbmdbRFJBRlRfU1RBVEVdO1xuICByZXR1cm4gc3RhdGUgPyBzdGF0ZS50eXBlXyA6IGlzQXJyYXkodGhpbmcpID8gMSAvKiBBcnJheSAqLyA6IGlzTWFwKHRoaW5nKSA/IDIgLyogTWFwICovIDogaXNTZXQodGhpbmcpID8gMyAvKiBTZXQgKi8gOiAwIC8qIE9iamVjdCAqLztcbn1cbnZhciBoYXMgPSAodGhpbmcsIHByb3AsIHR5cGUgPSBnZXRBcmNodHlwZSh0aGluZykpID0+IHR5cGUgPT09IDIgLyogTWFwICovID8gdGhpbmcuaGFzKHByb3ApIDogT1tQUk9UT1RZUEVdLmhhc093blByb3BlcnR5LmNhbGwodGhpbmcsIHByb3ApO1xudmFyIGdldCA9ICh0aGluZywgcHJvcCwgdHlwZSA9IGdldEFyY2h0eXBlKHRoaW5nKSkgPT4gKFxuICAvLyBAdHMtaWdub3JlXG4gIHR5cGUgPT09IDIgLyogTWFwICovID8gdGhpbmcuZ2V0KHByb3ApIDogdGhpbmdbcHJvcF1cbik7XG52YXIgc2V0ID0gKHRoaW5nLCBwcm9wT3JPbGRWYWx1ZSwgdmFsdWUsIHR5cGUgPSBnZXRBcmNodHlwZSh0aGluZykpID0+IHtcbiAgaWYgKHR5cGUgPT09IDIgLyogTWFwICovKVxuICAgIHRoaW5nLnNldChwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpO1xuICBlbHNlIGlmICh0eXBlID09PSAzIC8qIFNldCAqLykge1xuICAgIHRoaW5nLmFkZCh2YWx1ZSk7XG4gIH0gZWxzZVxuICAgIHRoaW5nW3Byb3BPck9sZFZhbHVlXSA9IHZhbHVlO1xufTtcbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIGlzTWFwID0gKHRhcmdldCkgPT4gdGFyZ2V0IGluc3RhbmNlb2YgTWFwO1xudmFyIGlzU2V0ID0gKHRhcmdldCkgPT4gdGFyZ2V0IGluc3RhbmNlb2YgU2V0O1xudmFyIGlzT2JqZWN0aXNoID0gKHRhcmdldCkgPT4gdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIjtcbnZhciBpc0Z1bmN0aW9uID0gKHRhcmdldCkgPT4gdHlwZW9mIHRhcmdldCA9PT0gXCJmdW5jdGlvblwiO1xudmFyIGlzQm9vbGVhbiA9ICh0YXJnZXQpID0+IHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiO1xuZnVuY3Rpb24gaXNBcnJheUluZGV4KHZhbHVlKSB7XG4gIGNvbnN0IG4gPSArdmFsdWU7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIFN0cmluZyhuKSA9PT0gdmFsdWU7XG59XG52YXIgZ2V0UHJveHlEcmFmdCA9ICh2YWx1ZSkgPT4ge1xuICBpZiAoIWlzT2JqZWN0aXNoKHZhbHVlKSlcbiAgICByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHZhbHVlPy5bRFJBRlRfU1RBVEVdO1xufTtcbnZhciBsYXRlc3QgPSAoc3RhdGUpID0+IHN0YXRlLmNvcHlfIHx8IHN0YXRlLmJhc2VfO1xudmFyIGdldFZhbHVlID0gKHZhbHVlKSA9PiB7XG4gIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KHZhbHVlKTtcbiAgcmV0dXJuIHByb3h5RHJhZnQgPyBwcm94eURyYWZ0LmNvcHlfID8/IHByb3h5RHJhZnQuYmFzZV8gOiB2YWx1ZTtcbn07XG52YXIgZ2V0RmluYWxWYWx1ZSA9IChzdGF0ZSkgPT4gc3RhdGUubW9kaWZpZWRfID8gc3RhdGUuY29weV8gOiBzdGF0ZS5iYXNlXztcbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KGJhc2UsIHN0cmljdCkge1xuICBpZiAoaXNNYXAoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IE1hcChiYXNlKTtcbiAgfVxuICBpZiAoaXNTZXQoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IFNldChiYXNlKTtcbiAgfVxuICBpZiAoaXNBcnJheShiYXNlKSlcbiAgICByZXR1cm4gQXJyYXlbUFJPVE9UWVBFXS5zbGljZS5jYWxsKGJhc2UpO1xuICBjb25zdCBpc1BsYWluID0gaXNQbGFpbk9iamVjdChiYXNlKTtcbiAgaWYgKHN0cmljdCA9PT0gdHJ1ZSB8fCBzdHJpY3QgPT09IFwiY2xhc3Nfb25seVwiICYmICFpc1BsYWluKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPLmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYmFzZSk7XG4gICAgZGVsZXRlIGRlc2NyaXB0b3JzW0RSQUZUX1NUQVRFXTtcbiAgICBsZXQga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgZGVzYyA9IGRlc2NyaXB0b3JzW2tleV07XG4gICAgICBpZiAoZGVzY1tXUklUQUJMRV0gPT09IGZhbHNlKSB7XG4gICAgICAgIGRlc2NbV1JJVEFCTEVdID0gdHJ1ZTtcbiAgICAgICAgZGVzY1tDT05GSUdVUkFCTEVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkZXNjLmdldCB8fCBkZXNjLnNldClcbiAgICAgICAgZGVzY3JpcHRvcnNba2V5XSA9IHtcbiAgICAgICAgICBbQ09ORklHVVJBQkxFXTogdHJ1ZSxcbiAgICAgICAgICBbV1JJVEFCTEVdOiB0cnVlLFxuICAgICAgICAgIC8vIGNvdWxkIGxpdmUgd2l0aCAhIWRlc2Muc2V0IGFzIHdlbGwgaGVyZS4uLlxuICAgICAgICAgIFtFTlVNRVJBQkxFXTogZGVzY1tFTlVNRVJBQkxFXSxcbiAgICAgICAgICBbVkFMVUVdOiBiYXNlW2tleV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIE8uY3JlYXRlKGdldFByb3RvdHlwZU9mKGJhc2UpLCBkZXNjcmlwdG9ycyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihiYXNlKTtcbiAgICBpZiAocHJvdG8gIT09IG51bGwgJiYgaXNQbGFpbikge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSB9O1xuICAgIH1cbiAgICBjb25zdCBvYmogPSBPLmNyZWF0ZShwcm90byk7XG4gICAgcmV0dXJuIE8uYXNzaWduKG9iaiwgYmFzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZyZWV6ZShvYmosIGRlZXAgPSBmYWxzZSkge1xuICBpZiAoaXNGcm96ZW4ob2JqKSB8fCBpc0RyYWZ0KG9iaikgfHwgIWlzRHJhZnRhYmxlKG9iaikpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPiAxKSB7XG4gICAgTy5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICAgICAgc2V0OiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBhZGQ6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSxcbiAgICAgIGNsZWFyOiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBkZWxldGU6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZVxuICAgIH0pO1xuICB9XG4gIE8uZnJlZXplKG9iaik7XG4gIGlmIChkZWVwKVxuICAgIGVhY2goXG4gICAgICBvYmosXG4gICAgICAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgZnJlZXplKHZhbHVlLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnMoKSB7XG4gIGRpZSgyKTtcbn1cbnZhciBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUgPSB7XG4gIFtWQUxVRV06IGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9uc1xufTtcbmZ1bmN0aW9uIGlzRnJvemVuKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8ICFpc09iamVjdGlzaChvYmopKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gTy5pc0Zyb3plbihvYmopO1xufVxuXG4vLyBzcmMvdXRpbHMvcGx1Z2lucy50c1xudmFyIFBsdWdpbk1hcFNldCA9IFwiTWFwU2V0XCI7XG52YXIgUGx1Z2luUGF0Y2hlcyA9IFwiUGF0Y2hlc1wiO1xudmFyIFBsdWdpbkFycmF5TWV0aG9kcyA9IFwiQXJyYXlNZXRob2RzXCI7XG52YXIgcGx1Z2lucyA9IHt9O1xuZnVuY3Rpb24gZ2V0UGx1Z2luKHBsdWdpbktleSkge1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW3BsdWdpbktleV07XG4gIGlmICghcGx1Z2luKSB7XG4gICAgZGllKDAsIHBsdWdpbktleSk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbjtcbn1cbnZhciBpc1BsdWdpbkxvYWRlZCA9IChwbHVnaW5LZXkpID0+ICEhcGx1Z2luc1twbHVnaW5LZXldO1xuZnVuY3Rpb24gbG9hZFBsdWdpbihwbHVnaW5LZXksIGltcGxlbWVudGF0aW9uKSB7XG4gIGlmICghcGx1Z2luc1twbHVnaW5LZXldKVxuICAgIHBsdWdpbnNbcGx1Z2luS2V5XSA9IGltcGxlbWVudGF0aW9uO1xufVxuXG4vLyBzcmMvY29yZS9zY29wZS50c1xudmFyIGN1cnJlbnRTY29wZTtcbnZhciBnZXRDdXJyZW50U2NvcGUgPSAoKSA9PiBjdXJyZW50U2NvcGU7XG52YXIgY3JlYXRlU2NvcGUgPSAocGFyZW50XywgaW1tZXJfKSA9PiAoe1xuICBkcmFmdHNfOiBbXSxcbiAgcGFyZW50XyxcbiAgaW1tZXJfLFxuICAvLyBXaGVuZXZlciB0aGUgbW9kaWZpZWQgZHJhZnQgY29udGFpbnMgYSBkcmFmdCBmcm9tIGFub3RoZXIgc2NvcGUsIHdlXG4gIC8vIG5lZWQgdG8gcHJldmVudCBhdXRvLWZyZWV6aW5nIHNvIHRoZSB1bm93bmVkIGRyYWZ0IGNhbiBiZSBmaW5hbGl6ZWQuXG4gIGNhbkF1dG9GcmVlemVfOiB0cnVlLFxuICB1bmZpbmFsaXplZERyYWZ0c186IDAsXG4gIGhhbmRsZWRTZXRfOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICBwcm9jZXNzZWRGb3JQYXRjaGVzXzogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgbWFwU2V0UGx1Z2luXzogaXNQbHVnaW5Mb2FkZWQoUGx1Z2luTWFwU2V0KSA/IGdldFBsdWdpbihQbHVnaW5NYXBTZXQpIDogdm9pZCAwLFxuICBhcnJheU1ldGhvZHNQbHVnaW5fOiBpc1BsdWdpbkxvYWRlZChQbHVnaW5BcnJheU1ldGhvZHMpID8gZ2V0UGx1Z2luKFBsdWdpbkFycmF5TWV0aG9kcykgOiB2b2lkIDBcbn0pO1xuZnVuY3Rpb24gdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpIHtcbiAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICBzY29wZS5wYXRjaFBsdWdpbl8gPSBnZXRQbHVnaW4oUGx1Z2luUGF0Y2hlcyk7XG4gICAgc2NvcGUucGF0Y2hlc18gPSBbXTtcbiAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc18gPSBbXTtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyA9IHBhdGNoTGlzdGVuZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJldm9rZVNjb3BlKHNjb3BlKSB7XG4gIGxlYXZlU2NvcGUoc2NvcGUpO1xuICBzY29wZS5kcmFmdHNfLmZvckVhY2gocmV2b2tlRHJhZnQpO1xuICBzY29wZS5kcmFmdHNfID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGxlYXZlU2NvcGUoc2NvcGUpIHtcbiAgaWYgKHNjb3BlID09PSBjdXJyZW50U2NvcGUpIHtcbiAgICBjdXJyZW50U2NvcGUgPSBzY29wZS5wYXJlbnRfO1xuICB9XG59XG52YXIgZW50ZXJTY29wZSA9IChpbW1lcjIpID0+IGN1cnJlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKGN1cnJlbnRTY29wZSwgaW1tZXIyKTtcbmZ1bmN0aW9uIHJldm9rZURyYWZ0KGRyYWZ0KSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBpZiAoc3RhdGUudHlwZV8gPT09IDAgLyogT2JqZWN0ICovIHx8IHN0YXRlLnR5cGVfID09PSAxIC8qIEFycmF5ICovKVxuICAgIHN0YXRlLnJldm9rZV8oKTtcbiAgZWxzZVxuICAgIHN0YXRlLnJldm9rZWRfID0gdHJ1ZTtcbn1cblxuLy8gc3JjL2NvcmUvZmluYWxpemUudHNcbmZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSkge1xuICBzY29wZS51bmZpbmFsaXplZERyYWZ0c18gPSBzY29wZS5kcmFmdHNfLmxlbmd0aDtcbiAgY29uc3QgYmFzZURyYWZ0ID0gc2NvcGUuZHJhZnRzX1swXTtcbiAgY29uc3QgaXNSZXBsYWNlZCA9IHJlc3VsdCAhPT0gdm9pZCAwICYmIHJlc3VsdCAhPT0gYmFzZURyYWZ0O1xuICBpZiAoaXNSZXBsYWNlZCkge1xuICAgIGlmIChiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLm1vZGlmaWVkXykge1xuICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgZGllKDQpO1xuICAgIH1cbiAgICBpZiAoaXNEcmFmdGFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGF0Y2hQbHVnaW5fIH0gPSBzY29wZTtcbiAgICBpZiAocGF0Y2hQbHVnaW5fKSB7XG4gICAgICBwYXRjaFBsdWdpbl8uZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKFxuICAgICAgICBiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLmJhc2VfLFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgYmFzZURyYWZ0KTtcbiAgfVxuICBtYXliZUZyZWV6ZShzY29wZSwgcmVzdWx0LCB0cnVlKTtcbiAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyhzY29wZS5wYXRjaGVzXywgc2NvcGUuaW52ZXJzZVBhdGNoZXNfKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICE9PSBOT1RISU5HID8gcmVzdWx0IDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZmluYWxpemUocm9vdFNjb3BlLCB2YWx1ZSkge1xuICBpZiAoaXNGcm96ZW4odmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gIGlmICghc3RhdGUpIHtcbiAgICBjb25zdCBmaW5hbFZhbHVlID0gaGFuZGxlVmFsdWUodmFsdWUsIHJvb3RTY29wZS5oYW5kbGVkU2V0Xywgcm9vdFNjb3BlKTtcbiAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgfVxuICBpZiAoIWlzU2FtZVNjb3BlKHN0YXRlLCByb290U2NvcGUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICB9XG4gIGlmICghc3RhdGUuZmluYWxpemVkXykge1xuICAgIGNvbnN0IHsgY2FsbGJhY2tzXyB9ID0gc3RhdGU7XG4gICAgaWYgKGNhbGxiYWNrc18pIHtcbiAgICAgIHdoaWxlIChjYWxsYmFja3NfLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBjYWxsYmFja3NfLnBvcCgpO1xuICAgICAgICBjYWxsYmFjayhyb290U2NvcGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZVBhdGNoZXNBbmRGaW5hbGl6ZShzdGF0ZSwgcm9vdFNjb3BlKTtcbiAgfVxuICByZXR1cm4gc3RhdGUuY29weV87XG59XG5mdW5jdGlvbiBtYXliZUZyZWV6ZShzY29wZSwgdmFsdWUsIGRlZXAgPSBmYWxzZSkge1xuICBpZiAoIXNjb3BlLnBhcmVudF8gJiYgc2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHNjb3BlLmNhbkF1dG9GcmVlemVfKSB7XG4gICAgZnJlZXplKHZhbHVlLCBkZWVwKTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlRmluYWxpemVkKHN0YXRlKSB7XG4gIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICBzdGF0ZS5zY29wZV8udW5maW5hbGl6ZWREcmFmdHNfLS07XG59XG52YXIgaXNTYW1lU2NvcGUgPSAoc3RhdGUsIHJvb3RTY29wZSkgPT4gc3RhdGUuc2NvcGVfID09PSByb290U2NvcGU7XG52YXIgRU1QVFlfTE9DQVRJT05TX1JFU1VMVCA9IFtdO1xuZnVuY3Rpb24gdXBkYXRlRHJhZnRJblBhcmVudChwYXJlbnQsIGRyYWZ0VmFsdWUsIGZpbmFsaXplZFZhbHVlLCBvcmlnaW5hbEtleSkge1xuICBjb25zdCBwYXJlbnRDb3B5ID0gbGF0ZXN0KHBhcmVudCk7XG4gIGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQudHlwZV87XG4gIGlmIChvcmlnaW5hbEtleSAhPT0gdm9pZCAwKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gZ2V0KHBhcmVudENvcHksIG9yaWdpbmFsS2V5LCBwYXJlbnRUeXBlKTtcbiAgICBpZiAoY3VycmVudFZhbHVlID09PSBkcmFmdFZhbHVlKSB7XG4gICAgICBzZXQocGFyZW50Q29weSwgb3JpZ2luYWxLZXksIGZpbmFsaXplZFZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKCFwYXJlbnQuZHJhZnRMb2NhdGlvbnNfKSB7XG4gICAgY29uc3QgZHJhZnRMb2NhdGlvbnMgPSBwYXJlbnQuZHJhZnRMb2NhdGlvbnNfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBlYWNoKHBhcmVudENvcHksIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoaXNEcmFmdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGRyYWZ0TG9jYXRpb25zLmdldCh2YWx1ZSkgfHwgW107XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICBkcmFmdExvY2F0aW9ucy5zZXQodmFsdWUsIGtleXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGxvY2F0aW9ucyA9IHBhcmVudC5kcmFmdExvY2F0aW9uc18uZ2V0KGRyYWZ0VmFsdWUpID8/IEVNUFRZX0xPQ0FUSU9OU19SRVNVTFQ7XG4gIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgc2V0KHBhcmVudENvcHksIGxvY2F0aW9uLCBmaW5hbGl6ZWRWYWx1ZSwgcGFyZW50VHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyQ2hpbGRGaW5hbGl6YXRpb25DYWxsYmFjayhwYXJlbnQsIGNoaWxkLCBrZXkpIHtcbiAgcGFyZW50LmNhbGxiYWNrc18ucHVzaChmdW5jdGlvbiBjaGlsZENsZWFudXAocm9vdFNjb3BlKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBjaGlsZDtcbiAgICBpZiAoIXN0YXRlIHx8ICFpc1NhbWVTY29wZShzdGF0ZSwgcm9vdFNjb3BlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByb290U2NvcGUubWFwU2V0UGx1Z2luXz8uZml4U2V0Q29udGVudHMoc3RhdGUpO1xuICAgIGNvbnN0IGZpbmFsaXplZFZhbHVlID0gZ2V0RmluYWxWYWx1ZShzdGF0ZSk7XG4gICAgdXBkYXRlRHJhZnRJblBhcmVudChwYXJlbnQsIHN0YXRlLmRyYWZ0XyA/PyBzdGF0ZSwgZmluYWxpemVkVmFsdWUsIGtleSk7XG4gICAgZ2VuZXJhdGVQYXRjaGVzQW5kRmluYWxpemUoc3RhdGUsIHJvb3RTY29wZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzQW5kRmluYWxpemUoc3RhdGUsIHJvb3RTY29wZSkge1xuICBjb25zdCBzaG91bGRGaW5hbGl6ZSA9IHN0YXRlLm1vZGlmaWVkXyAmJiAhc3RhdGUuZmluYWxpemVkXyAmJiAoc3RhdGUudHlwZV8gPT09IDMgLyogU2V0ICovIHx8IHN0YXRlLnR5cGVfID09PSAxIC8qIEFycmF5ICovICYmIHN0YXRlLmFsbEluZGljZXNSZWFzc2lnbmVkXyB8fCAoc3RhdGUuYXNzaWduZWRfPy5zaXplID8/IDApID4gMCk7XG4gIGlmIChzaG91bGRGaW5hbGl6ZSkge1xuICAgIGNvbnN0IHsgcGF0Y2hQbHVnaW5fIH0gPSByb290U2NvcGU7XG4gICAgaWYgKHBhdGNoUGx1Z2luXykge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXRjaFBsdWdpbl8uZ2V0UGF0aChzdGF0ZSk7XG4gICAgICBpZiAoYmFzZVBhdGgpIHtcbiAgICAgICAgcGF0Y2hQbHVnaW5fLmdlbmVyYXRlUGF0Y2hlc18oc3RhdGUsIGJhc2VQYXRoLCByb290U2NvcGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXJrU3RhdGVGaW5hbGl6ZWQoc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVDcm9zc1JlZmVyZW5jZSh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgY29uc3QgeyBzY29wZV8gfSA9IHRhcmdldDtcbiAgaWYgKGlzRHJhZnQodmFsdWUpKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gICAgaWYgKGlzU2FtZVNjb3BlKHN0YXRlLCBzY29wZV8pKSB7XG4gICAgICBzdGF0ZS5jYWxsYmFja3NfLnB1c2goZnVuY3Rpb24gY3Jvc3NSZWZlcmVuY2VDbGVhbnVwKCkge1xuICAgICAgICBwcmVwYXJlQ29weSh0YXJnZXQpO1xuICAgICAgICBjb25zdCBmaW5hbGl6ZWRWYWx1ZSA9IGdldEZpbmFsVmFsdWUoc3RhdGUpO1xuICAgICAgICB1cGRhdGVEcmFmdEluUGFyZW50KHRhcmdldCwgdmFsdWUsIGZpbmFsaXplZFZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgIHRhcmdldC5jYWxsYmFja3NfLnB1c2goZnVuY3Rpb24gbmVzdGVkRHJhZnRDbGVhbnVwKCkge1xuICAgICAgY29uc3QgdGFyZ2V0Q29weSA9IGxhdGVzdCh0YXJnZXQpO1xuICAgICAgaWYgKHRhcmdldC50eXBlXyA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICAgICAgaWYgKHRhcmdldENvcHkuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGhhbmRsZVZhbHVlKHZhbHVlLCBzY29wZV8uaGFuZGxlZFNldF8sIHNjb3BlXyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChnZXQodGFyZ2V0Q29weSwga2V5LCB0YXJnZXQudHlwZV8pID09PSB2YWx1ZSkge1xuICAgICAgICAgIGlmIChzY29wZV8uZHJhZnRzXy5sZW5ndGggPiAxICYmICh0YXJnZXQuYXNzaWduZWRfLmdldChrZXkpID8/IGZhbHNlKSA9PT0gdHJ1ZSAmJiB0YXJnZXQuY29weV8pIHtcbiAgICAgICAgICAgIGhhbmRsZVZhbHVlKFxuICAgICAgICAgICAgICBnZXQodGFyZ2V0LmNvcHlfLCBrZXksIHRhcmdldC50eXBlXyksXG4gICAgICAgICAgICAgIHNjb3BlXy5oYW5kbGVkU2V0XyxcbiAgICAgICAgICAgICAgc2NvcGVfXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVWYWx1ZSh0YXJnZXQsIGhhbmRsZWRTZXQsIHJvb3RTY29wZSkge1xuICBpZiAoIXJvb3RTY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgcm9vdFNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA8IDEpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGlmIChpc0RyYWZ0KHRhcmdldCkgfHwgaGFuZGxlZFNldC5oYXModGFyZ2V0KSB8fCAhaXNEcmFmdGFibGUodGFyZ2V0KSB8fCBpc0Zyb3plbih0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBoYW5kbGVkU2V0LmFkZCh0YXJnZXQpO1xuICBlYWNoKHRhcmdldCwgKGtleSwgdmFsdWUpID0+IHtcbiAgICBpZiAoaXNEcmFmdCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICAgICAgaWYgKGlzU2FtZVNjb3BlKHN0YXRlLCByb290U2NvcGUpKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZSA9IGdldEZpbmFsVmFsdWUoc3RhdGUpO1xuICAgICAgICBzZXQodGFyZ2V0LCBrZXksIHVwZGF0ZWRWYWx1ZSwgdGFyZ2V0LnR5cGVfKTtcbiAgICAgICAgbWFya1N0YXRlRmluYWxpemVkKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgaGFuZGxlVmFsdWUodmFsdWUsIGhhbmRsZWRTZXQsIHJvb3RTY29wZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLy8gc3JjL2NvcmUvcHJveHkudHNcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5UHJveHkoYmFzZSwgcGFyZW50KSB7XG4gIGNvbnN0IGJhc2VJc0FycmF5ID0gaXNBcnJheShiYXNlKTtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgdHlwZV86IGJhc2VJc0FycmF5ID8gMSAvKiBBcnJheSAqLyA6IDAgLyogT2JqZWN0ICovLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb2R1Y2UgY2FsbCB0aGlzIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAvLyBUcnVlIGZvciBib3RoIHNoYWxsb3cgYW5kIGRlZXAgY2hhbmdlcy5cbiAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgIC8vIFVzZWQgZHVyaW5nIGZpbmFsaXphdGlvbi5cbiAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAvLyBUcmFjayB3aGljaCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBhc3NpZ25lZCAodHJ1ZSkgb3IgZGVsZXRlZCAoZmFsc2UpLlxuICAgIC8vIGFjdHVhbGx5IGluc3RhbnRpYXRlZCBpbiBgcHJlcGFyZUNvcHkoKWBcbiAgICBhc3NpZ25lZF86IHZvaWQgMCxcbiAgICAvLyBUaGUgcGFyZW50IGRyYWZ0IHN0YXRlLlxuICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAvLyBUaGUgYmFzZSBzdGF0ZS5cbiAgICBiYXNlXzogYmFzZSxcbiAgICAvLyBUaGUgYmFzZSBwcm94eS5cbiAgICBkcmFmdF86IG51bGwsXG4gICAgLy8gc2V0IGJlbG93XG4gICAgLy8gVGhlIGJhc2UgY29weSB3aXRoIGFueSB1cGRhdGVkIHZhbHVlcy5cbiAgICBjb3B5XzogbnVsbCxcbiAgICAvLyBDYWxsZWQgYnkgdGhlIGBwcm9kdWNlYCBmdW5jdGlvbi5cbiAgICByZXZva2VfOiBudWxsLFxuICAgIGlzTWFudWFsXzogZmFsc2UsXG4gICAgLy8gYGNhbGxiYWNrc2AgYWN0dWFsbHkgZ2V0cyBhc3NpZ25lZCBpbiBgY3JlYXRlUHJveHlgXG4gICAgY2FsbGJhY2tzXzogdm9pZCAwXG4gIH07XG4gIGxldCB0YXJnZXQgPSBzdGF0ZTtcbiAgbGV0IHRyYXBzID0gb2JqZWN0VHJhcHM7XG4gIGlmIChiYXNlSXNBcnJheSkge1xuICAgIHRhcmdldCA9IFtzdGF0ZV07XG4gICAgdHJhcHMgPSBhcnJheVRyYXBzO1xuICB9XG4gIGNvbnN0IHsgcmV2b2tlLCBwcm94eSB9ID0gUHJveHkucmV2b2NhYmxlKHRhcmdldCwgdHJhcHMpO1xuICBzdGF0ZS5kcmFmdF8gPSBwcm94eTtcbiAgc3RhdGUucmV2b2tlXyA9IHJldm9rZTtcbiAgcmV0dXJuIFtwcm94eSwgc3RhdGVdO1xufVxudmFyIG9iamVjdFRyYXBzID0ge1xuICBnZXQoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gRFJBRlRfU1RBVEUpXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgbGV0IGFycmF5UGx1Z2luID0gc3RhdGUuc2NvcGVfLmFycmF5TWV0aG9kc1BsdWdpbl87XG4gICAgY29uc3QgaXNBcnJheVdpdGhTdHJpbmdQcm9wID0gc3RhdGUudHlwZV8gPT09IDEgLyogQXJyYXkgKi8gJiYgdHlwZW9mIHByb3AgPT09IFwic3RyaW5nXCI7XG4gICAgaWYgKGlzQXJyYXlXaXRoU3RyaW5nUHJvcCkge1xuICAgICAgaWYgKGFycmF5UGx1Z2luPy5pc0FycmF5T3BlcmF0aW9uTWV0aG9kKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBhcnJheVBsdWdpbi5jcmVhdGVNZXRob2RJbnRlcmNlcHRvcihzdGF0ZSwgcHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSk7XG4gICAgaWYgKCFoYXMoc291cmNlLCBwcm9wLCBzdGF0ZS50eXBlXykpIHtcbiAgICAgIHJldHVybiByZWFkUHJvcEZyb21Qcm90byhzdGF0ZSwgc291cmNlLCBwcm9wKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF07XG4gICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheVdpdGhTdHJpbmdQcm9wICYmIHN0YXRlLm9wZXJhdGlvbk1ldGhvZCAmJiBhcnJheVBsdWdpbj8uaXNNdXRhdGluZ0FycmF5TWV0aG9kKFxuICAgICAgc3RhdGUub3BlcmF0aW9uTWV0aG9kXG4gICAgKSAmJiBpc0FycmF5SW5kZXgocHJvcCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSkge1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgY29uc3QgY2hpbGRLZXkgPSBzdGF0ZS50eXBlXyA9PT0gMSAvKiBBcnJheSAqLyA/ICtwcm9wIDogcHJvcDtcbiAgICAgIGNvbnN0IGNoaWxkRHJhZnQgPSBjcmVhdGVQcm94eShzdGF0ZS5zY29wZV8sIHZhbHVlLCBzdGF0ZSwgY2hpbGRLZXkpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfW2NoaWxkS2V5XSA9IGNoaWxkRHJhZnQ7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgaGFzKHN0YXRlLCBwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgaW4gbGF0ZXN0KHN0YXRlKTtcbiAgfSxcbiAgb3duS2V5cyhzdGF0ZSkge1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobGF0ZXN0KHN0YXRlKSk7XG4gIH0sXG4gIHNldChzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICBpZiAoZGVzYz8uc2V0KSB7XG4gICAgICBkZXNjLnNldC5jYWxsKHN0YXRlLmRyYWZ0XywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgICBjb25zdCBjdXJyZW50MiA9IHBlZWsobGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjdXJyZW50Mj8uW0RSQUZUX1NUQVRFXTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgJiYgY3VycmVudFN0YXRlLmJhc2VfID09PSB2YWx1ZSkge1xuICAgICAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KHByb3AsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXModmFsdWUsIGN1cnJlbnQyKSAmJiAodmFsdWUgIT09IHZvaWQgMCB8fCBoYXMoc3RhdGUuYmFzZV8sIHByb3AsIHN0YXRlLnR5cGVfKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29weV9bcHJvcF0gPT09IHZhbHVlICYmIC8vIHNwZWNpYWwgY2FzZTogaGFuZGxlIG5ldyBwcm9wcyB3aXRoIHZhbHVlICd1bmRlZmluZWQnXG4gICAgKHZhbHVlICE9PSB2b2lkIDAgfHwgcHJvcCBpbiBzdGF0ZS5jb3B5XykgfHwgLy8gc3BlY2lhbCBjYXNlOiBOYU5cbiAgICBOdW1iZXIuaXNOYU4odmFsdWUpICYmIE51bWJlci5pc05hTihzdGF0ZS5jb3B5X1twcm9wXSkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQocHJvcCwgdHJ1ZSk7XG4gICAgaGFuZGxlQ3Jvc3NSZWZlcmVuY2Uoc3RhdGUsIHByb3AsIHZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3ApIHtcbiAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgaWYgKHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApICE9PSB2b2lkIDAgfHwgcHJvcCBpbiBzdGF0ZS5iYXNlXykge1xuICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChwcm9wLCBmYWxzZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkXy5kZWxldGUocHJvcCk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5Xykge1xuICAgICAgZGVsZXRlIHN0YXRlLmNvcHlfW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gTm90ZTogV2UgbmV2ZXIgY29lcmNlIGBkZXNjLnZhbHVlYCBpbnRvIGFuIEltbWVyIGRyYWZ0LCBiZWNhdXNlIHdlIGNhbid0IG1ha2VcbiAgLy8gdGhlIHNhbWUgZ3VhcmFudGVlIGluIEVTNSBtb2RlLlxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3RhdGUsIHByb3ApIHtcbiAgICBjb25zdCBvd25lciA9IGxhdGVzdChzdGF0ZSk7XG4gICAgY29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG93bmVyLCBwcm9wKTtcbiAgICBpZiAoIWRlc2MpXG4gICAgICByZXR1cm4gZGVzYztcbiAgICByZXR1cm4ge1xuICAgICAgW1dSSVRBQkxFXTogdHJ1ZSxcbiAgICAgIFtDT05GSUdVUkFCTEVdOiBzdGF0ZS50eXBlXyAhPT0gMSAvKiBBcnJheSAqLyB8fCBwcm9wICE9PSBcImxlbmd0aFwiLFxuICAgICAgW0VOVU1FUkFCTEVdOiBkZXNjW0VOVU1FUkFCTEVdLFxuICAgICAgW1ZBTFVFXTogb3duZXJbcHJvcF1cbiAgICB9O1xuICB9LFxuICBkZWZpbmVQcm9wZXJ0eSgpIHtcbiAgICBkaWUoMTEpO1xuICB9LFxuICBnZXRQcm90b3R5cGVPZihzdGF0ZSkge1xuICAgIHJldHVybiBnZXRQcm90b3R5cGVPZihzdGF0ZS5iYXNlXyk7XG4gIH0sXG4gIHNldFByb3RvdHlwZU9mKCkge1xuICAgIGRpZSgxMik7XG4gIH1cbn07XG52YXIgYXJyYXlUcmFwcyA9IHt9O1xuZm9yIChsZXQga2V5IGluIG9iamVjdFRyYXBzKSB7XG4gIGxldCBmbiA9IG9iamVjdFRyYXBzW2tleV07XG4gIGFycmF5VHJhcHNba2V5XSA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgYXJnc1swXSA9IGFyZ3NbMF1bMF07XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xufVxuYXJyYXlUcmFwcy5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxMyk7XG4gIHJldHVybiBhcnJheVRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlLCBwcm9wLCB2b2lkIDApO1xufTtcbmFycmF5VHJhcHMuc2V0ID0gZnVuY3Rpb24oc3RhdGUsIHByb3AsIHZhbHVlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgcHJvcCAhPT0gXCJsZW5ndGhcIiAmJiBpc05hTihwYXJzZUludChwcm9wKSkpXG4gICAgZGllKDE0KTtcbiAgcmV0dXJuIG9iamVjdFRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlWzBdLCBwcm9wLCB2YWx1ZSwgc3RhdGVbMF0pO1xufTtcbmZ1bmN0aW9uIHBlZWsoZHJhZnQsIHByb3ApIHtcbiAgY29uc3Qgc3RhdGUgPSBkcmFmdFtEUkFGVF9TVEFURV07XG4gIGNvbnN0IHNvdXJjZSA9IHN0YXRlID8gbGF0ZXN0KHN0YXRlKSA6IGRyYWZ0O1xuICByZXR1cm4gc291cmNlW3Byb3BdO1xufVxuZnVuY3Rpb24gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCkge1xuICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApO1xuICByZXR1cm4gZGVzYyA/IFZBTFVFIGluIGRlc2MgPyBkZXNjW1ZBTFVFXSA6IChcbiAgICAvLyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBwcm9wIGlzIGEgZ2V0dGVyIGRlZmluZWQgYnkgdGhlXG4gICAgLy8gcHJvdG90eXBlLCB3ZSBzaG91bGQgaW52b2tlIGl0IHdpdGggdGhlIGRyYWZ0IGFzIGNvbnRleHQhXG4gICAgZGVzYy5nZXQ/LmNhbGwoc3RhdGUuZHJhZnRfKVxuICApIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApIHtcbiAgaWYgKCEocHJvcCBpbiBzb3VyY2UpKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCBwcm90byA9IGdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIHdoaWxlIChwcm90bykge1xuICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBwcm9wKTtcbiAgICBpZiAoZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHByb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBtYXJrQ2hhbmdlZChzdGF0ZSkge1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIHN0YXRlLm1vZGlmaWVkXyA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnBhcmVudF8pIHtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlLnBhcmVudF8pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZUNvcHkoc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgc3RhdGUuY29weV8gPSBzaGFsbG93Q29weShcbiAgICAgIHN0YXRlLmJhc2VfLFxuICAgICAgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV9cbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL2ltbWVyQ2xhc3MudHNcbnZhciBJbW1lcjIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB0cnVlO1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gZmFsc2U7XG4gICAgdGhpcy51c2VTdHJpY3RJdGVyYXRpb25fID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWNlYCBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIGFuZCBhIFwicmVjaXBlIGZ1bmN0aW9uXCIgKHdob3NlXG4gICAgICogcmV0dXJuIHZhbHVlIG9mdGVuIGRlcGVuZHMgb24gdGhlIGJhc2Ugc3RhdGUpLiBUaGUgcmVjaXBlIGZ1bmN0aW9uIGlzXG4gICAgICogZnJlZSB0byBtdXRhdGUgaXRzIGZpcnN0IGFyZ3VtZW50IGhvd2V2ZXIgaXQgd2FudHMuIEFsbCBtdXRhdGlvbnMgYXJlXG4gICAgICogb25seSBldmVyIGFwcGxpZWQgdG8gYSBfX2NvcHlfXyBvZiB0aGUgYmFzZSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFBhc3Mgb25seSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFwiY3VycmllZCBwcm9kdWNlclwiIHdoaWNoIHJlbGlldmVzIHlvdVxuICAgICAqIGZyb20gcGFzc2luZyB0aGUgcmVjaXBlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUuXG4gICAgICpcbiAgICAgKiBPbmx5IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcmUgbWFkZSBtdXRhYmxlLiBBbGwgb3RoZXIgb2JqZWN0cyBhcmVcbiAgICAgKiBjb25zaWRlcmVkIHVuY29weWFibGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIF9fYm91bmRfXyB0byBpdHMgYEltbWVyYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YW55fSBiYXNlIC0gdGhlIGluaXRpYWwgc3RhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWNpcGUgLSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgcHJveHkgb2YgdGhlIGJhc2Ugc3RhdGUgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHdoaWNoIGNhbiBiZSBmcmVlbHkgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXRjaExpc3RlbmVyIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB0aGUgcGF0Y2hlcyBwcm9kdWNlZCBoZXJlXG4gICAgICogQHJldHVybnMge2FueX0gYSBuZXcgc3RhdGUsIG9yIHRoZSBpbml0aWFsIHN0YXRlIGlmIG5vdGhpbmcgd2FzIG1vZGlmaWVkXG4gICAgICovXG4gICAgdGhpcy5wcm9kdWNlID0gKGJhc2UsIHJlY2lwZSwgcGF0Y2hMaXN0ZW5lcikgPT4ge1xuICAgICAgaWYgKGlzRnVuY3Rpb24oYmFzZSkgJiYgIWlzRnVuY3Rpb24ocmVjaXBlKSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0QmFzZSA9IHJlY2lwZTtcbiAgICAgICAgcmVjaXBlID0gYmFzZTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkUHJvZHVjZShiYXNlMiA9IGRlZmF1bHRCYXNlLCAuLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYucHJvZHVjZShiYXNlMiwgKGRyYWZ0KSA9PiByZWNpcGUuY2FsbCh0aGlzLCBkcmFmdCwgLi4uYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0Z1bmN0aW9uKHJlY2lwZSkpXG4gICAgICAgIGRpZSg2KTtcbiAgICAgIGlmIChwYXRjaExpc3RlbmVyICE9PSB2b2lkIDAgJiYgIWlzRnVuY3Rpb24ocGF0Y2hMaXN0ZW5lcikpXG4gICAgICAgIGRpZSg3KTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAoaXNEcmFmdGFibGUoYmFzZSkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgICAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KHNjb3BlLCBiYXNlLCB2b2lkIDApO1xuICAgICAgICBsZXQgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlY2lwZShwcm94eSk7XG4gICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoaGFzRXJyb3IpXG4gICAgICAgICAgICByZXZva2VTY29wZShzY29wZSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHNjb3BlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWJhc2UgfHwgIWlzT2JqZWN0aXNoKGJhc2UpKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlY2lwZShiYXNlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKVxuICAgICAgICAgIHJlc3VsdCA9IGJhc2U7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PVEhJTkcpXG4gICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICBpZiAodGhpcy5hdXRvRnJlZXplXylcbiAgICAgICAgICBmcmVlemUocmVzdWx0LCB0cnVlKTtcbiAgICAgICAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICAgICAgICBjb25zdCBwID0gW107XG4gICAgICAgICAgY29uc3QgaXAgPSBbXTtcbiAgICAgICAgICBnZXRQbHVnaW4oUGx1Z2luUGF0Y2hlcykuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2UsIHJlc3VsdCwge1xuICAgICAgICAgICAgcGF0Y2hlc186IHAsXG4gICAgICAgICAgICBpbnZlcnNlUGF0Y2hlc186IGlwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGF0Y2hMaXN0ZW5lcihwLCBpcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBkaWUoMSwgYmFzZSk7XG4gICAgfTtcbiAgICB0aGlzLnByb2R1Y2VXaXRoUGF0Y2hlcyA9IChiYXNlLCByZWNpcGUpID0+IHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGJhc2UpKSB7XG4gICAgICAgIHJldHVybiAoc3RhdGUsIC4uLmFyZ3MpID0+IHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzKHN0YXRlLCAoZHJhZnQpID0+IGJhc2UoZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvZHVjZShiYXNlLCByZWNpcGUsIChwLCBpcCkgPT4ge1xuICAgICAgICBwYXRjaGVzID0gcDtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMgPSBpcDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtyZXN1bHQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzXTtcbiAgICB9O1xuICAgIGlmIChpc0Jvb2xlYW4oY29uZmlnPy5hdXRvRnJlZXplKSlcbiAgICAgIHRoaXMuc2V0QXV0b0ZyZWV6ZShjb25maWcuYXV0b0ZyZWV6ZSk7XG4gICAgaWYgKGlzQm9vbGVhbihjb25maWc/LnVzZVN0cmljdFNoYWxsb3dDb3B5KSlcbiAgICAgIHRoaXMuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkoY29uZmlnLnVzZVN0cmljdFNoYWxsb3dDb3B5KTtcbiAgICBpZiAoaXNCb29sZWFuKGNvbmZpZz8udXNlU3RyaWN0SXRlcmF0aW9uKSlcbiAgICAgIHRoaXMuc2V0VXNlU3RyaWN0SXRlcmF0aW9uKGNvbmZpZy51c2VTdHJpY3RJdGVyYXRpb24pO1xuICB9XG4gIGNyZWF0ZURyYWZ0KGJhc2UpIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKGJhc2UpKVxuICAgICAgZGllKDgpO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKVxuICAgICAgYmFzZSA9IGN1cnJlbnQoYmFzZSk7XG4gICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoc2NvcGUsIGJhc2UsIHZvaWQgMCk7XG4gICAgcHJveHlbRFJBRlRfU1RBVEVdLmlzTWFudWFsXyA9IHRydWU7XG4gICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG4gIGZpbmlzaERyYWZ0KGRyYWZ0LCBwYXRjaExpc3RlbmVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBkcmFmdCAmJiBkcmFmdFtEUkFGVF9TVEFURV07XG4gICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuaXNNYW51YWxfKVxuICAgICAgZGllKDkpO1xuICAgIGNvbnN0IHsgc2NvcGVfOiBzY29wZSB9ID0gc3RhdGU7XG4gICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHZvaWQgMCwgc2NvcGUpO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gYXV0b21hdGljYWxseSBmcmVlemUgYWxsIGNvcGllcyBjcmVhdGVkIGJ5IEltbWVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhdXRvLWZyZWV6aW5nIGlzIGVuYWJsZWQuXG4gICAqL1xuICBzZXRBdXRvRnJlZXplKHZhbHVlKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gZW5hYmxlIHN0cmljdCBzaGFsbG93IGNvcHkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGltbWVyIGRvZXMgbm90IGNvcHkgdGhlIG9iamVjdCBkZXNjcmlwdG9ycyBzdWNoIGFzIGdldHRlciwgc2V0dGVyIGFuZCBub24tZW51bXJhYmxlIHByb3BlcnRpZXMuXG4gICAqL1xuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSh2YWx1ZSkge1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgZmFsc2UgdG8gdXNlIGZhc3RlciBpdGVyYXRpb24gdGhhdCBza2lwcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAqIGJ1dCBzdGlsbCBoYW5kbGVzIHN5bWJvbHMgZm9yIGNvbXBhdGliaWxpdHkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHN0cmljdCBpdGVyYXRpb24gaXMgZW5hYmxlZCAoaW5jbHVkZXMgYWxsIG93biBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIHNldFVzZVN0cmljdEl0ZXJhdGlvbih2YWx1ZSkge1xuICAgIHRoaXMudXNlU3RyaWN0SXRlcmF0aW9uXyA9IHZhbHVlO1xuICB9XG4gIHNob3VsZFVzZVN0cmljdEl0ZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy51c2VTdHJpY3RJdGVyYXRpb25fO1xuICB9XG4gIGFwcGx5UGF0Y2hlcyhiYXNlLCBwYXRjaGVzKSB7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gcGF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAwICYmIHBhdGNoLm9wID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICBiYXNlID0gcGF0Y2gudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICBwYXRjaGVzID0gcGF0Y2hlcy5zbGljZShpICsgMSk7XG4gICAgfVxuICAgIGNvbnN0IGFwcGx5UGF0Y2hlc0ltcGwgPSBnZXRQbHVnaW4oUGx1Z2luUGF0Y2hlcykuYXBwbHlQYXRjaGVzXztcbiAgICBpZiAoaXNEcmFmdChiYXNlKSkge1xuICAgICAgcmV0dXJuIGFwcGx5UGF0Y2hlc0ltcGwoYmFzZSwgcGF0Y2hlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb2R1Y2UoXG4gICAgICBiYXNlLFxuICAgICAgKGRyYWZ0KSA9PiBhcHBseVBhdGNoZXNJbXBsKGRyYWZ0LCBwYXRjaGVzKVxuICAgICk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVQcm94eShyb290U2NvcGUsIHZhbHVlLCBwYXJlbnQsIGtleSkge1xuICBjb25zdCBbZHJhZnQsIHN0YXRlXSA9IGlzTWFwKHZhbHVlKSA/IGdldFBsdWdpbihQbHVnaW5NYXBTZXQpLnByb3h5TWFwXyh2YWx1ZSwgcGFyZW50KSA6IGlzU2V0KHZhbHVlKSA/IGdldFBsdWdpbihQbHVnaW5NYXBTZXQpLnByb3h5U2V0Xyh2YWx1ZSwgcGFyZW50KSA6IGNyZWF0ZVByb3h5UHJveHkodmFsdWUsIHBhcmVudCk7XG4gIGNvbnN0IHNjb3BlID0gcGFyZW50Py5zY29wZV8gPz8gZ2V0Q3VycmVudFNjb3BlKCk7XG4gIHNjb3BlLmRyYWZ0c18ucHVzaChkcmFmdCk7XG4gIHN0YXRlLmNhbGxiYWNrc18gPSBwYXJlbnQ/LmNhbGxiYWNrc18gPz8gW107XG4gIHN0YXRlLmtleV8gPSBrZXk7XG4gIGlmIChwYXJlbnQgJiYga2V5ICE9PSB2b2lkIDApIHtcbiAgICByZWdpc3RlckNoaWxkRmluYWxpemF0aW9uQ2FsbGJhY2socGFyZW50LCBzdGF0ZSwga2V5KTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5jYWxsYmFja3NfLnB1c2goZnVuY3Rpb24gcm9vdERyYWZ0Q2xlYW51cChyb290U2NvcGUyKSB7XG4gICAgICByb290U2NvcGUyLm1hcFNldFBsdWdpbl8/LmZpeFNldENvbnRlbnRzKHN0YXRlKTtcbiAgICAgIGNvbnN0IHsgcGF0Y2hQbHVnaW5fIH0gPSByb290U2NvcGUyO1xuICAgICAgaWYgKHN0YXRlLm1vZGlmaWVkXyAmJiBwYXRjaFBsdWdpbl8pIHtcbiAgICAgICAgcGF0Y2hQbHVnaW5fLmdlbmVyYXRlUGF0Y2hlc18oc3RhdGUsIFtdLCByb290U2NvcGUyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHJhZnQ7XG59XG5cbi8vIHNyYy9jb3JlL2N1cnJlbnQudHNcbmZ1bmN0aW9uIGN1cnJlbnQodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTAsIHZhbHVlKTtcbiAgcmV0dXJuIGN1cnJlbnRJbXBsKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGN1cnJlbnRJbXBsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdGFibGUodmFsdWUpIHx8IGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBsZXQgY29weTtcbiAgbGV0IHN0cmljdCA9IHRydWU7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKVxuICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV8pO1xuICAgIHN0cmljdCA9IHN0YXRlLnNjb3BlXy5pbW1lcl8uc2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCB0cnVlKTtcbiAgfVxuICBlYWNoKFxuICAgIGNvcHksXG4gICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4ge1xuICAgICAgc2V0KGNvcHksIGtleSwgY3VycmVudEltcGwoY2hpbGRWYWx1ZSkpO1xuICAgIH0sXG4gICAgc3RyaWN0XG4gICk7XG4gIGlmIChzdGF0ZSkge1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvcGF0Y2hlcy50c1xuZnVuY3Rpb24gZW5hYmxlUGF0Y2hlcygpIHtcbiAgY29uc3QgZXJyb3JPZmZzZXQgPSAxNjtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgJ1NldHMgY2Fubm90IGhhdmUgXCJyZXBsYWNlXCIgcGF0Y2hlcy4nLFxuICAgICAgZnVuY3Rpb24ob3ApIHtcbiAgICAgICAgcmV0dXJuIFwiVW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiBcIiArIG9wO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIgKyBwYXRoO1xuICAgICAgfSxcbiAgICAgIFwiUGF0Y2hpbmcgcmVzZXJ2ZWQgYXR0cmlidXRlcyBsaWtlIF9fcHJvdG9fXywgcHJvdG90eXBlIGFuZCBjb25zdHJ1Y3RvciBpcyBub3QgYWxsb3dlZFwiXG4gICAgKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQYXRoKHN0YXRlLCBwYXRoID0gW10pIHtcbiAgICBpZiAoc3RhdGUua2V5XyAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBwYXJlbnRDb3B5ID0gc3RhdGUucGFyZW50Xy5jb3B5XyA/PyBzdGF0ZS5wYXJlbnRfLmJhc2VfO1xuICAgICAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQoZ2V0KHBhcmVudENvcHksIHN0YXRlLmtleV8pKTtcbiAgICAgIGNvbnN0IHZhbHVlQXRLZXkgPSBnZXQocGFyZW50Q29weSwgc3RhdGUua2V5Xyk7XG4gICAgICBpZiAodmFsdWVBdEtleSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlQXRLZXkgIT09IHN0YXRlLmRyYWZ0XyAmJiB2YWx1ZUF0S2V5ICE9PSBzdGF0ZS5iYXNlXyAmJiB2YWx1ZUF0S2V5ICE9PSBzdGF0ZS5jb3B5Xykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm94eURyYWZ0ICE9IG51bGwgJiYgcHJveHlEcmFmdC5iYXNlXyAhPT0gc3RhdGUuYmFzZV8pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1NldDIgPSBzdGF0ZS5wYXJlbnRfLnR5cGVfID09PSAzIC8qIFNldCAqLztcbiAgICAgIGxldCBrZXk7XG4gICAgICBpZiAoaXNTZXQyKSB7XG4gICAgICAgIGNvbnN0IHNldFBhcmVudCA9IHN0YXRlLnBhcmVudF87XG4gICAgICAgIGtleSA9IEFycmF5LmZyb20oc2V0UGFyZW50LmRyYWZ0c18ua2V5cygpKS5pbmRleE9mKHN0YXRlLmtleV8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5ID0gc3RhdGUua2V5XztcbiAgICAgIH1cbiAgICAgIGlmICghKGlzU2V0MiAmJiBwYXJlbnRDb3B5LnNpemUgPiBrZXkgfHwgaGFzKHBhcmVudENvcHksIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKGtleSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5wYXJlbnRfKSB7XG4gICAgICByZXR1cm4gZ2V0UGF0aChzdGF0ZS5wYXJlbnRfLCBwYXRoKTtcbiAgICB9XG4gICAgcGF0aC5yZXZlcnNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVQYXRoKHN0YXRlLmNvcHlfLCBwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cbiAgZnVuY3Rpb24gcmVzb2x2ZVBhdGgoYmFzZSwgcGF0aCkge1xuICAgIGxldCBjdXJyZW50MiA9IGJhc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtpXTtcbiAgICAgIGN1cnJlbnQyID0gZ2V0KGN1cnJlbnQyLCBrZXkpO1xuICAgICAgaWYgKCFpc09iamVjdGlzaChjdXJyZW50MikgfHwgY3VycmVudDIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBwYXRoIGF0ICcke3BhdGguam9pbihcIi9cIil9J2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDI7XG4gIH1cbiAgY29uc3QgUkVQTEFDRSA9IFwicmVwbGFjZVwiO1xuICBjb25zdCBBREQgPSBcImFkZFwiO1xuICBjb25zdCBSRU1PVkUgPSBcInJlbW92ZVwiO1xuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNfKHN0YXRlLCBiYXNlUGF0aCwgc2NvcGUpIHtcbiAgICBpZiAoc3RhdGUuc2NvcGVfLnByb2Nlc3NlZEZvclBhdGNoZXNfLmhhcyhzdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUuc2NvcGVfLnByb2Nlc3NlZEZvclBhdGNoZXNfLmFkZChzdGF0ZSk7XG4gICAgY29uc3QgeyBwYXRjaGVzXywgaW52ZXJzZVBhdGNoZXNfIH0gPSBzY29wZTtcbiAgICBzd2l0Y2ggKHN0YXRlLnR5cGVfKSB7XG4gICAgICBjYXNlIDAgLyogT2JqZWN0ICovOlxuICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzXyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc19cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXJyYXlQYXRjaGVzKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXNfLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzX1xuICAgICAgICApO1xuICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2V0UGF0Y2hlcyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzXyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc19cbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBhc3NpZ25lZF8gfSA9IHN0YXRlO1xuICAgIGxldCBjb3B5XyA9IHN0YXRlLmNvcHlfO1xuICAgIGlmIChjb3B5Xy5sZW5ndGggPCBiYXNlXy5sZW5ndGgpIHtcbiAgICAgIDtcbiAgICAgIFtiYXNlXywgY29weV9dID0gW2NvcHlfLCBiYXNlX107XG4gICAgICBbcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdID0gW2ludmVyc2VQYXRjaGVzLCBwYXRjaGVzXTtcbiAgICB9XG4gICAgY29uc3QgYWxsUmVhc3NpZ25lZCA9IHN0YXRlLmFsbEluZGljZXNSZWFzc2lnbmVkXyA9PT0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2VfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb3BpZWRJdGVtID0gY29weV9baV07XG4gICAgICBjb25zdCBiYXNlSXRlbSA9IGJhc2VfW2ldO1xuICAgICAgY29uc3QgaXNBc3NpZ25lZCA9IGFsbFJlYXNzaWduZWQgfHwgYXNzaWduZWRfPy5nZXQoaS50b1N0cmluZygpKTtcbiAgICAgIGlmIChpc0Fzc2lnbmVkICYmIGNvcGllZEl0ZW0gIT09IGJhc2VJdGVtKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkU3RhdGUgPSBjb3BpZWRJdGVtPy5bRFJBRlRfU1RBVEVdO1xuICAgICAgICBpZiAoY2hpbGRTdGF0ZSAmJiBjaGlsZFN0YXRlLm1vZGlmaWVkXykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3BpZWRJdGVtKVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoYmFzZUl0ZW0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gYmFzZV8ubGVuZ3RoOyBpIDwgY29weV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBBREQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBjb3B5Xy5sZW5ndGggLSAxOyBiYXNlXy5sZW5ndGggPD0gaTsgLS1pKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgY29uc3QgeyBiYXNlXywgY29weV8sIHR5cGVfIH0gPSBzdGF0ZTtcbiAgICBlYWNoKHN0YXRlLmFzc2lnbmVkXywgKGtleSwgYXNzaWduZWRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ1ZhbHVlID0gZ2V0KGJhc2VfLCBrZXksIHR5cGVfKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0KGNvcHlfLCBrZXksIHR5cGVfKTtcbiAgICAgIGNvbnN0IG9wID0gIWFzc2lnbmVkVmFsdWUgPyBSRU1PVkUgOiBoYXMoYmFzZV8sIGtleSkgPyBSRVBMQUNFIDogQUREO1xuICAgICAgaWYgKG9yaWdWYWx1ZSA9PT0gdmFsdWUgJiYgb3AgPT09IFJFUExBQ0UpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoa2V5KTtcbiAgICAgIHBhdGNoZXMucHVzaChcbiAgICAgICAgb3AgPT09IFJFTU9WRSA/IHsgb3AsIHBhdGggfSA6IHsgb3AsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZCh2YWx1ZSkgfVxuICAgICAgKTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goXG4gICAgICAgIG9wID09PSBBREQgPyB7IG9wOiBSRU1PVkUsIHBhdGggfSA6IG9wID09PSBSRU1PVkUgPyB7IG9wOiBBREQsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH0gOiB7IG9wOiBSRVBMQUNFLCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlU2V0UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghY29weV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gICAgaSA9IDA7XG4gICAgY29weV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghYmFzZV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2VWYWx1ZSwgcmVwbGFjZW1lbnQsIHNjb3BlKSB7XG4gICAgY29uc3QgeyBwYXRjaGVzXywgaW52ZXJzZVBhdGNoZXNfIH0gPSBzY29wZTtcbiAgICBwYXRjaGVzXy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogcmVwbGFjZW1lbnQgPT09IE5PVEhJTkcgPyB2b2lkIDAgOiByZXBsYWNlbWVudFxuICAgIH0pO1xuICAgIGludmVyc2VQYXRjaGVzXy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogYmFzZVZhbHVlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gYXBwbHlQYXRjaGVzXyhkcmFmdCwgcGF0Y2hlcykge1xuICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHsgcGF0aCwgb3AgfSA9IHBhdGNoO1xuICAgICAgbGV0IGJhc2UgPSBkcmFmdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFyZW50VHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgICBsZXQgcCA9IHBhdGhbaV07XG4gICAgICAgIGlmICh0eXBlb2YgcCAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgcCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHAgPSBcIlwiICsgcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHBhcmVudFR5cGUgPT09IDAgLyogT2JqZWN0ICovIHx8IHBhcmVudFR5cGUgPT09IDEgLyogQXJyYXkgKi8pICYmIChwID09PSBcIl9fcHJvdG9fX1wiIHx8IHAgPT09IENPTlNUUlVDVE9SKSlcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oYmFzZSkgJiYgcCA9PT0gUFJPVE9UWVBFKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBiYXNlID0gZ2V0KGJhc2UsIHApO1xuICAgICAgICBpZiAoIWlzT2JqZWN0aXNoKGJhc2UpKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDIsIHBhdGguam9pbihcIi9cIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKHBhdGNoLnZhbHVlKTtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgY2FzZSBSRVBMQUNFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgZGllKGVycm9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQUREOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4ga2V5ID09PSBcIi1cIiA/IGJhc2UucHVzaCh2YWx1ZSkgOiBiYXNlLnNwbGljZShrZXksIDAsIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIFJFTU9WRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc3BsaWNlKGtleSwgMSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShwYXRjaC52YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIGJhc2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMSwgb3ApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkcmFmdDtcbiAgfVxuICBmdW5jdGlvbiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaikge1xuICAgIGlmICghaXNEcmFmdGFibGUob2JqKSlcbiAgICAgIHJldHVybiBvYmo7XG4gICAgaWYgKGlzQXJyYXkob2JqKSlcbiAgICAgIHJldHVybiBvYmoubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpO1xuICAgIGlmIChpc01hcChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgIEFycmF5LmZyb20ob2JqLmVudHJpZXMoKSkubWFwKChbaywgdl0pID0+IFtrLCBkZWVwQ2xvbmVQYXRjaFZhbHVlKHYpXSlcbiAgICAgICk7XG4gICAgaWYgKGlzU2V0KG9iaikpXG4gICAgICByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKG9iaikubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpKTtcbiAgICBjb25zdCBjbG9uZWQgPSBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKG9iaikpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iailcbiAgICAgIGNsb25lZFtrZXldID0gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmpba2V5XSk7XG4gICAgaWYgKGhhcyhvYmosIERSQUZUQUJMRSkpXG4gICAgICBjbG9uZWRbRFJBRlRBQkxFXSA9IG9ialtEUkFGVEFCTEVdO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgZnVuY3Rpb24gY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob2JqKSB7XG4gICAgaWYgKGlzRHJhZnQob2JqKSkge1xuICAgICAgcmV0dXJuIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBvYmo7XG4gIH1cbiAgbG9hZFBsdWdpbihQbHVnaW5QYXRjaGVzLCB7XG4gICAgYXBwbHlQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyxcbiAgICBnZXRQYXRoXG4gIH0pO1xufVxuXG4vLyBzcmMvcGx1Z2lucy9tYXBzZXQudHNcbmZ1bmN0aW9uIGVuYWJsZU1hcFNldCgpIHtcbiAgY2xhc3MgRHJhZnRNYXAgZXh0ZW5kcyBNYXAge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAyIC8qIE1hcCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGFzc2lnbmVkXzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2UsXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZSxcbiAgICAgICAgY2FsbGJhY2tzXzogW11cbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuaGFzKGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghbGF0ZXN0KHN0YXRlKS5oYXMoa2V5KSB8fCBsYXRlc3Qoc3RhdGUpLmdldChrZXkpICE9PSB2YWx1ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaGFuZGxlQ3Jvc3NSZWZlcmVuY2Uoc3RhdGUsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5iYXNlXy5oYXMoa2V5KSkge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAgc3RhdGUuY29weV8uZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIGVhY2goc3RhdGUuYmFzZV8sIChrZXkpID0+IHtcbiAgICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGxhdGVzdChzdGF0ZSkuZm9yRWFjaCgoX3ZhbHVlLCBrZXksIF9tYXApID0+IHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCB0aGlzLmdldChrZXkpLCBrZXksIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgY29uc3QgdmFsdWUgPSBsYXRlc3Qoc3RhdGUpLmdldChrZXkpO1xuICAgICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgIT09IHN0YXRlLmJhc2VfLmdldChrZXkpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkoc3RhdGUuc2NvcGVfLCB2YWx1ZSwgc3RhdGUsIGtleSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCBkcmFmdCk7XG4gICAgICByZXR1cm4gZHJhZnQ7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5rZXlzKCk7XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy52YWx1ZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLmVudHJpZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IFtyLnZhbHVlLCB2YWx1ZV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlNYXBfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgY29uc3QgbWFwID0gbmV3IERyYWZ0TWFwKHRhcmdldCwgcGFyZW50KTtcbiAgICByZXR1cm4gW21hcCwgbWFwW0RSQUZUX1NUQVRFXV07XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZU1hcENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgc3RhdGUuY29weV8gPSBuZXcgTWFwKHN0YXRlLmJhc2VfKTtcbiAgICB9XG4gIH1cbiAgY2xhc3MgRHJhZnRTZXQgZXh0ZW5kcyBTZXQge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAzIC8qIFNldCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgZHJhZnRzXzogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlLFxuICAgICAgICBhc3NpZ25lZF86IHZvaWQgMCxcbiAgICAgICAgY2FsbGJhY2tzXzogW11cbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfLmhhcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuY29weV8uaGFzKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpICYmIHN0YXRlLmNvcHlfLmhhcyhzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgICBoYW5kbGVDcm9zc1JlZmVyZW5jZShzdGF0ZSwgdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUodmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmRlbGV0ZSh2YWx1ZSkgfHwgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSA/IHN0YXRlLmNvcHlfLmRlbGV0ZShzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpIDogKFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBmYWxzZVxuICAgICAgKSk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmVudHJpZXMoKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XG4gICAgICBsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKTtcbiAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eVNldF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICBjb25zdCBzZXQyID0gbmV3IERyYWZ0U2V0KHRhcmdldCwgcGFyZW50KTtcbiAgICByZXR1cm4gW3NldDIsIHNldDJbRFJBRlRfU1RBVEVdXTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlU2V0Q29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmNvcHlfID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIHN0YXRlLmJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHN0YXRlLnNjb3BlXywgdmFsdWUsIHN0YXRlLCB2YWx1ZSk7XG4gICAgICAgICAgc3RhdGUuZHJhZnRzXy5zZXQodmFsdWUsIGRyYWZ0KTtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQoZHJhZnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhc3NlcnRVbnJldm9rZWQoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUucmV2b2tlZF8pXG4gICAgICBkaWUoMywgSlNPTi5zdHJpbmdpZnkobGF0ZXN0KHN0YXRlKSkpO1xuICB9XG4gIGZ1bmN0aW9uIGZpeFNldENvbnRlbnRzKHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQudHlwZV8gPT09IDMgLyogU2V0ICovICYmIHRhcmdldC5jb3B5Xykge1xuICAgICAgY29uc3QgY29weSA9IG5ldyBTZXQodGFyZ2V0LmNvcHlfKTtcbiAgICAgIHRhcmdldC5jb3B5Xy5jbGVhcigpO1xuICAgICAgY29weS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0YXJnZXQuY29weV8uYWRkKGdldFZhbHVlKHZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgbG9hZFBsdWdpbihQbHVnaW5NYXBTZXQsIHsgcHJveHlNYXBfLCBwcm94eVNldF8sIGZpeFNldENvbnRlbnRzIH0pO1xufVxuXG4vLyBzcmMvcGx1Z2lucy9hcnJheU1ldGhvZHMudHNcbmZ1bmN0aW9uIGVuYWJsZUFycmF5TWV0aG9kcygpIHtcbiAgY29uc3QgU0hJRlRJTkdfTUVUSE9EUyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcInNoaWZ0XCIsIFwidW5zaGlmdFwiXSk7XG4gIGNvbnN0IFFVRVVFX01FVEhPRFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXCJwdXNoXCIsIFwicG9wXCJdKTtcbiAgY29uc3QgUkVTVUxUX1JFVFVSTklOR19NRVRIT0RTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICAgIC4uLlFVRVVFX01FVEhPRFMsXG4gICAgLi4uU0hJRlRJTkdfTUVUSE9EU1xuICBdKTtcbiAgY29uc3QgUkVPUkRFUklOR19NRVRIT0RTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1wicmV2ZXJzZVwiLCBcInNvcnRcIl0pO1xuICBjb25zdCBNVVRBVElOR19NRVRIT0RTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICAgIC4uLlJFU1VMVF9SRVRVUk5JTkdfTUVUSE9EUyxcbiAgICAuLi5SRU9SREVSSU5HX01FVEhPRFMsXG4gICAgXCJzcGxpY2VcIlxuICBdKTtcbiAgY29uc3QgRklORF9NRVRIT0RTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1wiZmluZFwiLCBcImZpbmRMYXN0XCJdKTtcbiAgY29uc3QgTk9OX01VVEFUSU5HX01FVEhPRFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXG4gICAgXCJmaWx0ZXJcIixcbiAgICBcInNsaWNlXCIsXG4gICAgXCJjb25jYXRcIixcbiAgICBcImZsYXRcIixcbiAgICAuLi5GSU5EX01FVEhPRFMsXG4gICAgXCJmaW5kSW5kZXhcIixcbiAgICBcImZpbmRMYXN0SW5kZXhcIixcbiAgICBcInNvbWVcIixcbiAgICBcImV2ZXJ5XCIsXG4gICAgXCJpbmRleE9mXCIsXG4gICAgXCJsYXN0SW5kZXhPZlwiLFxuICAgIFwiaW5jbHVkZXNcIixcbiAgICBcImpvaW5cIixcbiAgICBcInRvU3RyaW5nXCIsXG4gICAgXCJ0b0xvY2FsZVN0cmluZ1wiXG4gIF0pO1xuICBmdW5jdGlvbiBpc011dGF0aW5nQXJyYXlNZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIE1VVEFUSU5HX01FVEhPRFMuaGFzKG1ldGhvZCk7XG4gIH1cbiAgZnVuY3Rpb24gaXNOb25NdXRhdGluZ0FycmF5TWV0aG9kKG1ldGhvZCkge1xuICAgIHJldHVybiBOT05fTVVUQVRJTkdfTUVUSE9EUy5oYXMobWV0aG9kKTtcbiAgfVxuICBmdW5jdGlvbiBpc0FycmF5T3BlcmF0aW9uTWV0aG9kKG1ldGhvZCkge1xuICAgIHJldHVybiBpc011dGF0aW5nQXJyYXlNZXRob2QobWV0aG9kKSB8fCBpc05vbk11dGF0aW5nQXJyYXlNZXRob2QobWV0aG9kKTtcbiAgfVxuICBmdW5jdGlvbiBlbnRlck9wZXJhdGlvbihzdGF0ZSwgbWV0aG9kKSB7XG4gICAgc3RhdGUub3BlcmF0aW9uTWV0aG9kID0gbWV0aG9kO1xuICB9XG4gIGZ1bmN0aW9uIGV4aXRPcGVyYXRpb24oc3RhdGUpIHtcbiAgICBzdGF0ZS5vcGVyYXRpb25NZXRob2QgPSB2b2lkIDA7XG4gIH1cbiAgZnVuY3Rpb24gZXhlY3V0ZUFycmF5TWV0aG9kKHN0YXRlLCBvcGVyYXRpb24sIG1hcmtMZW5ndGggPSB0cnVlKSB7XG4gICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG9wZXJhdGlvbigpO1xuICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICBpZiAobWFya0xlbmd0aClcbiAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoXCJsZW5ndGhcIiwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBmdW5jdGlvbiBtYXJrQWxsSW5kaWNlc1JlYXNzaWduZWQoc3RhdGUpIHtcbiAgICBzdGF0ZS5hbGxJbmRpY2VzUmVhc3NpZ25lZF8gPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNsaWNlSW5kZXgoaW5kZXgsIGxlbmd0aCkge1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1pbihpbmRleCwgbGVuZ3RoKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVJbnNlcnRlZFZhbHVlcyhzdGF0ZSwgc3RhcnRJbmRleCwgdmFsdWVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gc3RhcnRJbmRleCArIGk7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGluZGV4LCB0cnVlKTtcbiAgICAgIGhhbmRsZUNyb3NzUmVmZXJlbmNlKHN0YXRlLCBpbmRleCwgdmFsdWVzW2ldKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlU2ltcGxlT3BlcmF0aW9uKHN0YXRlLCBtZXRob2QsIGFyZ3MpIHtcbiAgICByZXR1cm4gZXhlY3V0ZUFycmF5TWV0aG9kKHN0YXRlLCAoKSA9PiB7XG4gICAgICBjb25zdCBsZW5ndGhCZWZvcmUgPSBzdGF0ZS5jb3B5Xy5sZW5ndGg7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdGF0ZS5jb3B5X1ttZXRob2RdKC4uLmFyZ3MpO1xuICAgICAgaWYgKFNISUZUSU5HX01FVEhPRFMuaGFzKG1ldGhvZCkpIHtcbiAgICAgICAgbWFya0FsbEluZGljZXNSZWFzc2lnbmVkKHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwicHVzaFwiICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBoYW5kbGVJbnNlcnRlZFZhbHVlcyhzdGF0ZSwgbGVuZ3RoQmVmb3JlLCBhcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcInVuc2hpZnRcIiAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGFuZGxlSW5zZXJ0ZWRWYWx1ZXMoc3RhdGUsIDAsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJFU1VMVF9SRVRVUk5JTkdfTUVUSE9EUy5oYXMobWV0aG9kKSA/IHJlc3VsdCA6IHN0YXRlLmRyYWZ0XztcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVSZW9yZGVyaW5nT3BlcmF0aW9uKHN0YXRlLCBtZXRob2QsIGFyZ3MpIHtcbiAgICByZXR1cm4gZXhlY3V0ZUFycmF5TWV0aG9kKFxuICAgICAgc3RhdGUsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIDtcbiAgICAgICAgc3RhdGUuY29weV9bbWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgbWFya0FsbEluZGljZXNSZWFzc2lnbmVkKHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmRyYWZ0XztcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kSW50ZXJjZXB0b3Ioc3RhdGUsIG9yaWdpbmFsTWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludGVyY2VwdGVkTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IG9yaWdpbmFsTWV0aG9kO1xuICAgICAgZW50ZXJPcGVyYXRpb24oc3RhdGUsIG1ldGhvZCk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaXNNdXRhdGluZ0FycmF5TWV0aG9kKG1ldGhvZCkpIHtcbiAgICAgICAgICBpZiAoUkVTVUxUX1JFVFVSTklOR19NRVRIT0RTLmhhcyhtZXRob2QpKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU2ltcGxlT3BlcmF0aW9uKHN0YXRlLCBtZXRob2QsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoUkVPUkRFUklOR19NRVRIT0RTLmhhcyhtZXRob2QpKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUmVvcmRlcmluZ09wZXJhdGlvbihzdGF0ZSwgbWV0aG9kLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJzcGxpY2VcIikge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gZXhlY3V0ZUFycmF5TWV0aG9kKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgKCkgPT4gc3RhdGUuY29weV8uc3BsaWNlKC4uLmFyZ3MpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFya0FsbEluZGljZXNSZWFzc2lnbmVkKHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IG5vcm1hbGl6ZVNsaWNlSW5kZXgoXG4gICAgICAgICAgICAgICAgYXJnc1swXSA/PyAwLFxuICAgICAgICAgICAgICAgIHN0YXRlLmNvcHlfLmxlbmd0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBoYW5kbGVJbnNlcnRlZFZhbHVlcyhzdGF0ZSwgc3RhcnRJbmRleCwgYXJncy5zbGljZSgyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlTm9uTXV0YXRpbmdPcGVyYXRpb24oc3RhdGUsIG1ldGhvZCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGV4aXRPcGVyYXRpb24oc3RhdGUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlTm9uTXV0YXRpbmdPcGVyYXRpb24oc3RhdGUsIG1ldGhvZCwgYXJncykge1xuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSk7XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJmaWx0ZXJcIikge1xuICAgICAgY29uc3QgcHJlZGljYXRlID0gYXJnc1swXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShzb3VyY2VbaV0sIGksIHNvdXJjZSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChzdGF0ZS5kcmFmdF9baV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoRklORF9NRVRIT0RTLmhhcyhtZXRob2QpKSB7XG4gICAgICBjb25zdCBwcmVkaWNhdGUgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgaXNGb3J3YXJkID0gbWV0aG9kID09PSBcImZpbmRcIjtcbiAgICAgIGNvbnN0IHN0ZXAgPSBpc0ZvcndhcmQgPyAxIDogLTE7XG4gICAgICBjb25zdCBzdGFydCA9IGlzRm9yd2FyZCA/IDAgOiBzb3VyY2UubGVuZ3RoIC0gMTtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA+PSAwICYmIGkgPCBzb3VyY2UubGVuZ3RoOyBpICs9IHN0ZXApIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShzb3VyY2VbaV0sIGksIHNvdXJjZSkpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUuZHJhZnRfW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSBcInNsaWNlXCIpIHtcbiAgICAgIGNvbnN0IHJhd1N0YXJ0ID0gYXJnc1swXSA/PyAwO1xuICAgICAgY29uc3QgcmF3RW5kID0gYXJnc1sxXSA/PyBzb3VyY2UubGVuZ3RoO1xuICAgICAgY29uc3Qgc3RhcnQgPSBub3JtYWxpemVTbGljZUluZGV4KHJhd1N0YXJ0LCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGVuZCA9IG5vcm1hbGl6ZVNsaWNlSW5kZXgocmF3RW5kLCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2goc3RhdGUuZHJhZnRfW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VbbWV0aG9kXSguLi5hcmdzKTtcbiAgfVxuICBsb2FkUGx1Z2luKFBsdWdpbkFycmF5TWV0aG9kcywge1xuICAgIGNyZWF0ZU1ldGhvZEludGVyY2VwdG9yLFxuICAgIGlzQXJyYXlPcGVyYXRpb25NZXRob2QsXG4gICAgaXNNdXRhdGluZ0FycmF5TWV0aG9kXG4gIH0pO1xufVxuXG4vLyBzcmMvaW1tZXIudHNcbnZhciBpbW1lciA9IG5ldyBJbW1lcjIoKTtcbnZhciBwcm9kdWNlID0gaW1tZXIucHJvZHVjZTtcbnZhciBwcm9kdWNlV2l0aFBhdGNoZXMgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIucHJvZHVjZVdpdGhQYXRjaGVzLmJpbmQoXG4gIGltbWVyXG4pO1xudmFyIHNldEF1dG9GcmVlemUgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuc2V0QXV0b0ZyZWV6ZS5iaW5kKGltbWVyKTtcbnZhciBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5zZXRVc2VTdHJpY3RTaGFsbG93Q29weS5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBzZXRVc2VTdHJpY3RJdGVyYXRpb24gPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuc2V0VXNlU3RyaWN0SXRlcmF0aW9uLmJpbmQoXG4gIGltbWVyXG4pO1xudmFyIGFwcGx5UGF0Y2hlcyA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5hcHBseVBhdGNoZXMuYmluZChpbW1lcik7XG52YXIgY3JlYXRlRHJhZnQgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuY3JlYXRlRHJhZnQuYmluZChpbW1lcik7XG52YXIgZmluaXNoRHJhZnQgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuZmluaXNoRHJhZnQuYmluZChpbW1lcik7XG52YXIgY2FzdERyYWZ0ID0gKHZhbHVlKSA9PiB2YWx1ZTtcbnZhciBjYXN0SW1tdXRhYmxlID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmV4cG9ydCB7XG4gIEltbWVyMiBhcyBJbW1lcixcbiAgYXBwbHlQYXRjaGVzLFxuICBjYXN0RHJhZnQsXG4gIGNhc3RJbW11dGFibGUsXG4gIGNyZWF0ZURyYWZ0LFxuICBjdXJyZW50LFxuICBlbmFibGVBcnJheU1ldGhvZHMsXG4gIGVuYWJsZU1hcFNldCxcbiAgZW5hYmxlUGF0Y2hlcyxcbiAgZmluaXNoRHJhZnQsXG4gIGZyZWV6ZSxcbiAgRFJBRlRBQkxFIGFzIGltbWVyYWJsZSxcbiAgaXNEcmFmdCxcbiAgaXNEcmFmdGFibGUsXG4gIE5PVEhJTkcgYXMgbm90aGluZyxcbiAgb3JpZ2luYWwsXG4gIHByb2R1Y2UsXG4gIHByb2R1Y2VXaXRoUGF0Y2hlcyxcbiAgc2V0QXV0b0ZyZWV6ZSxcbiAgc2V0VXNlU3RyaWN0SXRlcmF0aW9uLFxuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWltbWVyLm1qcy5tYXAiLCJleHBvcnQgY2xhc3MgSW50ZXJuTWFwIGV4dGVuZHMgTWFwIHtcbiAgY29uc3RydWN0b3IoZW50cmllcywga2V5ID0ga2V5b2YpIHtcbiAgICBzdXBlcigpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtfaW50ZXJuOiB7dmFsdWU6IG5ldyBNYXAoKX0sIF9rZXk6IHt2YWx1ZToga2V5fX0pO1xuICAgIGlmIChlbnRyaWVzICE9IG51bGwpIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICB9XG4gIGdldChrZXkpIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0KGludGVybl9nZXQodGhpcywga2V5KSk7XG4gIH1cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiBzdXBlci5oYXMoaW50ZXJuX2dldCh0aGlzLCBrZXkpKTtcbiAgfVxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5zZXQoaW50ZXJuX3NldCh0aGlzLCBrZXkpLCB2YWx1ZSk7XG4gIH1cbiAgZGVsZXRlKGtleSkge1xuICAgIHJldHVybiBzdXBlci5kZWxldGUoaW50ZXJuX2RlbGV0ZSh0aGlzLCBrZXkpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuU2V0IGV4dGVuZHMgU2V0IHtcbiAgY29uc3RydWN0b3IodmFsdWVzLCBrZXkgPSBrZXlvZikge1xuICAgIHN1cGVyKCk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge19pbnRlcm46IHt2YWx1ZTogbmV3IE1hcCgpfSwgX2tleToge3ZhbHVlOiBrZXl9fSk7XG4gICAgaWYgKHZhbHVlcyAhPSBudWxsKSBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgdGhpcy5hZGQodmFsdWUpO1xuICB9XG4gIGhhcyh2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5oYXMoaW50ZXJuX2dldCh0aGlzLCB2YWx1ZSkpO1xuICB9XG4gIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5hZGQoaW50ZXJuX3NldCh0aGlzLCB2YWx1ZSkpO1xuICB9XG4gIGRlbGV0ZSh2YWx1ZSkge1xuICAgIHJldHVybiBzdXBlci5kZWxldGUoaW50ZXJuX2RlbGV0ZSh0aGlzLCB2YWx1ZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVybl9nZXQoe19pbnRlcm4sIF9rZXl9LCB2YWx1ZSkge1xuICBjb25zdCBrZXkgPSBfa2V5KHZhbHVlKTtcbiAgcmV0dXJuIF9pbnRlcm4uaGFzKGtleSkgPyBfaW50ZXJuLmdldChrZXkpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGludGVybl9zZXQoe19pbnRlcm4sIF9rZXl9LCB2YWx1ZSkge1xuICBjb25zdCBrZXkgPSBfa2V5KHZhbHVlKTtcbiAgaWYgKF9pbnRlcm4uaGFzKGtleSkpIHJldHVybiBfaW50ZXJuLmdldChrZXkpO1xuICBfaW50ZXJuLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpbnRlcm5fZGVsZXRlKHtfaW50ZXJuLCBfa2V5fSwgdmFsdWUpIHtcbiAgY29uc3Qga2V5ID0gX2tleSh2YWx1ZSk7XG4gIGlmIChfaW50ZXJuLmhhcyhrZXkpKSB7XG4gICAgdmFsdWUgPSBfaW50ZXJuLmdldChrZXkpO1xuICAgIF9pbnRlcm4uZGVsZXRlKGtleSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBrZXlvZih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=