9346 lines
798 KiB
JavaScript
9346 lines
798 KiB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
|
||
if(typeof exports === 'object' && typeof module === 'object')
|
||
module.exports = factory(require("react"), require("react-dom"));
|
||
else if(typeof define === 'function' && define.amd)
|
||
define(["react", "react-dom"], factory);
|
||
else if(typeof exports === 'object')
|
||
exports["ReactBootstrapTable2"] = factory(require("react"), require("react-dom"));
|
||
else
|
||
root["ReactBootstrapTable2"] = factory(root["React"], root["ReactDOM"]);
|
||
})(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_17__) {
|
||
return /******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId]) {
|
||
/******/ return installedModules[moduleId].exports;
|
||
/******/ }
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ i: moduleId,
|
||
/******/ l: false,
|
||
/******/ exports: {}
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.l = true;
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/******/
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
/******/
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
/******/
|
||
/******/ // define getter function for harmony exports
|
||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||
/******/ Object.defineProperty(exports, name, {
|
||
/******/ configurable: false,
|
||
/******/ enumerable: true,
|
||
/******/ get: getter
|
||
/******/ });
|
||
/******/ }
|
||
/******/ };
|
||
/******/
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = function(module) {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ function getDefault() { return module['default']; } :
|
||
/******/ function getModuleExports() { return module; };
|
||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/
|
||
/******/ // Object.prototype.hasOwnProperty.call
|
||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||
/******/
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
/******/
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(__webpack_require__.s = 22);
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ([
|
||
/* 0 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = __WEBPACK_EXTERNAL_MODULE_0__;
|
||
|
||
/***/ }),
|
||
/* 1 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/**
|
||
* Copyright (c) 2013-present, Facebook, Inc.
|
||
*
|
||
* This source code is licensed under the MIT license found in the
|
||
* LICENSE file in the root directory of this source tree.
|
||
*/
|
||
|
||
if (false) {
|
||
var ReactIs = require('react-is');
|
||
|
||
// By explicitly using `prop-types` you are opting into new development behavior.
|
||
// http://fb.me/prop-types-in-prod
|
||
var throwOnDirectAccess = true;
|
||
module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);
|
||
} else {
|
||
// By explicitly using `prop-types` you are opting into new production behavior.
|
||
// http://fb.me/prop-types-in-prod
|
||
module.exports = __webpack_require__(24)();
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 2 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _underscore = __webpack_require__(30);
|
||
|
||
var _underscore2 = _interopRequireDefault(_underscore);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function splitNested(str) {
|
||
return [str].join('.').replace(/\[/g, '.').replace(/\]/g, '').split('.');
|
||
} /* eslint no-empty: 0 */
|
||
/* eslint no-param-reassign: 0 */
|
||
/* eslint prefer-rest-params: 0 */
|
||
|
||
|
||
function get(target, field) {
|
||
var pathArray = splitNested(field);
|
||
var result = void 0;
|
||
try {
|
||
result = pathArray.reduce(function (curr, path) {
|
||
return curr[path];
|
||
}, target);
|
||
} catch (e) {}
|
||
return result;
|
||
}
|
||
|
||
function set(target, field, value) {
|
||
var safe = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
||
|
||
var pathArray = splitNested(field);
|
||
var level = 0;
|
||
pathArray.reduce(function (a, b) {
|
||
level += 1;
|
||
if (typeof a[b] === 'undefined') {
|
||
if (!safe) throw new Error(a + '.' + b + ' is undefined');
|
||
a[b] = {};
|
||
return a[b];
|
||
}
|
||
|
||
if (level === pathArray.length) {
|
||
a[b] = value;
|
||
return value;
|
||
}
|
||
return a[b];
|
||
}, target);
|
||
}
|
||
|
||
function isEmptyObject(obj) {
|
||
if (!_underscore2.default.isObject(obj)) return false;
|
||
|
||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||
var keys = Object.keys(obj);
|
||
|
||
for (var i = 0; i < keys.length; i += 1) {
|
||
if (hasOwnProperty.call(obj, keys[i])) return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
function isDefined(value) {
|
||
return typeof value !== 'undefined' && value !== null;
|
||
}
|
||
|
||
function sleep(fn, ms) {
|
||
return setTimeout(function () {
|
||
return fn();
|
||
}, ms);
|
||
}
|
||
|
||
function debounce(func, wait, immediate) {
|
||
var _this = this,
|
||
_arguments = arguments;
|
||
|
||
var timeout = void 0;
|
||
|
||
return function () {
|
||
var later = function later() {
|
||
timeout = null;
|
||
|
||
if (!immediate) {
|
||
func.apply(_this, _arguments);
|
||
}
|
||
};
|
||
|
||
var callNow = immediate && !timeout;
|
||
|
||
clearTimeout(timeout);
|
||
timeout = setTimeout(later, wait || 0);
|
||
|
||
if (callNow) {
|
||
func.apply(_this, _arguments);
|
||
}
|
||
};
|
||
}
|
||
|
||
exports.default = Object.assign(_underscore2.default, { get: get, set: set, isDefined: isDefined, isEmptyObject: isEmptyObject, sleep: sleep, debounce: debounce });
|
||
|
||
/***/ }),
|
||
/* 3 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.default = {
|
||
SORT_ASC: 'asc',
|
||
SORT_DESC: 'desc',
|
||
ROW_SELECT_SINGLE: 'radio',
|
||
ROW_SELECT_MULTIPLE: 'checkbox',
|
||
ROW_SELECT_DISABLED: 'ROW_SELECT_DISABLED',
|
||
CHECKBOX_STATUS_CHECKED: 'checked',
|
||
CHECKBOX_STATUS_INDETERMINATE: 'indeterminate',
|
||
CHECKBOX_STATUS_UNCHECKED: 'unchecked',
|
||
INDICATOR_POSITION_LEFT: 'left',
|
||
INDICATOR_POSITION_RIGHT: 'right',
|
||
TYPE_STRING: 'string',
|
||
TYPE_NUMBER: 'number',
|
||
TYPE_BOOLEAN: 'bool',
|
||
TYPE_DATE: 'date',
|
||
FILTERS_POSITION_INLINE: 'inline',
|
||
FILTERS_POSITION_TOP: 'top',
|
||
FILTERS_POSITION_BOTTOM: 'bottom'
|
||
};
|
||
|
||
/***/ }),
|
||
/* 4 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
|
||
Copyright (c) 2016 Jed Watson.
|
||
Licensed under the MIT License (MIT), see
|
||
http://jedwatson.github.io/classnames
|
||
*/
|
||
/* global define */
|
||
|
||
(function () {
|
||
'use strict';
|
||
|
||
var hasOwn = {}.hasOwnProperty;
|
||
|
||
function classNames () {
|
||
var classes = [];
|
||
|
||
for (var i = 0; i < arguments.length; i++) {
|
||
var arg = arguments[i];
|
||
if (!arg) continue;
|
||
|
||
var argType = typeof arg;
|
||
|
||
if (argType === 'string' || argType === 'number') {
|
||
classes.push(arg);
|
||
} else if (Array.isArray(arg)) {
|
||
classes.push(classNames.apply(null, arg));
|
||
} else if (argType === 'object') {
|
||
for (var key in arg) {
|
||
if (hasOwn.call(arg, key) && arg[key]) {
|
||
classes.push(key);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return classes.join(' ');
|
||
}
|
||
|
||
if (typeof module !== 'undefined' && module.exports) {
|
||
module.exports = classNames;
|
||
} else if (true) {
|
||
// register as 'classnames', consistent with npm package name
|
||
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {
|
||
return classNames;
|
||
}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
|
||
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
||
} else {
|
||
window.classNames = classNames;
|
||
}
|
||
}());
|
||
|
||
|
||
/***/ }),
|
||
/* 5 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.BootstrapContext = undefined;
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var BootstrapContext = exports.BootstrapContext = _react2.default.createContext({
|
||
bootstrap4: false
|
||
});
|
||
|
||
/***/ }),
|
||
/* 6 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.getRowByRowId = exports.matchRow = undefined;
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var matchRow = exports.matchRow = function matchRow(keyField, id) {
|
||
return function (row) {
|
||
return _utils2.default.get(row, keyField) === id;
|
||
};
|
||
};
|
||
|
||
var getRowByRowId = exports.getRowByRowId = function getRowByRowId(data, keyField, id) {
|
||
return data.find(matchRow(keyField, id));
|
||
};
|
||
|
||
/***/ }),
|
||
/* 7 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||
|
||
var events = ['onClick', 'onDoubleClick', 'onMouseEnter', 'onMouseLeave', 'onContextMenu'];
|
||
|
||
exports.default = function (ExtendBase) {
|
||
return function (_ExtendBase) {
|
||
_inherits(CellEventDelegater, _ExtendBase);
|
||
|
||
function CellEventDelegater(props) {
|
||
_classCallCheck(this, CellEventDelegater);
|
||
|
||
var _this = _possibleConstructorReturn(this, (CellEventDelegater.__proto__ || Object.getPrototypeOf(CellEventDelegater)).call(this, props));
|
||
|
||
_this.createDefaultEventHandler = _this.createDefaultEventHandler.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(CellEventDelegater, [{
|
||
key: 'createDefaultEventHandler',
|
||
value: function createDefaultEventHandler(cb) {
|
||
var _this2 = this;
|
||
|
||
return function (e) {
|
||
var _props = _this2.props,
|
||
column = _props.column,
|
||
columnIndex = _props.columnIndex,
|
||
index = _props.index;
|
||
|
||
cb(e, column, typeof columnIndex !== 'undefined' ? columnIndex : index);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'delegate',
|
||
value: function delegate() {
|
||
var _this3 = this;
|
||
|
||
var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var newAttrs = _extends({}, attrs);
|
||
Object.keys(attrs).forEach(function (attr) {
|
||
if (_utils2.default.contains(events, attr)) {
|
||
newAttrs[attr] = _this3.createDefaultEventHandler(attrs[attr]);
|
||
}
|
||
});
|
||
return newAttrs;
|
||
}
|
||
}]);
|
||
|
||
return CellEventDelegater;
|
||
}(ExtendBase);
|
||
};
|
||
|
||
/***/ }),
|
||
/* 8 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _operators = __webpack_require__(9);
|
||
|
||
var _operators2 = _interopRequireDefault(_operators);
|
||
|
||
var _selection = __webpack_require__(11);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint camelcase: 0 */
|
||
/* eslint react/prop-types: 0 */
|
||
|
||
|
||
var SelectionContext = _react2.default.createContext();
|
||
|
||
var SelectionProvider = function (_React$Component) {
|
||
_inherits(SelectionProvider, _React$Component);
|
||
|
||
function SelectionProvider(props) {
|
||
_classCallCheck(this, SelectionProvider);
|
||
|
||
var _this = _possibleConstructorReturn(this, (SelectionProvider.__proto__ || Object.getPrototypeOf(SelectionProvider)).call(this, props));
|
||
|
||
_this.handleRowSelect = function (rowKey, checked, rowIndex, e) {
|
||
var _this$props = _this.props,
|
||
data = _this$props.data,
|
||
keyField = _this$props.keyField,
|
||
_this$props$selectRow = _this$props.selectRow,
|
||
mode = _this$props$selectRow.mode,
|
||
onSelect = _this$props$selectRow.onSelect;
|
||
var ROW_SELECT_SINGLE = _const2.default.ROW_SELECT_SINGLE;
|
||
|
||
|
||
var currSelected = [].concat(_toConsumableArray(_this.selected));
|
||
|
||
var result = true;
|
||
if (onSelect) {
|
||
var row = _operators2.default.getRowByRowId(data, keyField, rowKey);
|
||
result = onSelect(row, checked, rowIndex, e);
|
||
}
|
||
|
||
if (result === true || result === undefined) {
|
||
if (mode === ROW_SELECT_SINGLE) {
|
||
// when select mode is radio
|
||
currSelected = [rowKey];
|
||
} else if (checked) {
|
||
// when select mode is checkbox
|
||
currSelected.push(rowKey);
|
||
} else {
|
||
currSelected = currSelected.filter(function (value) {
|
||
return value !== rowKey;
|
||
});
|
||
}
|
||
}
|
||
_this.selected = currSelected;
|
||
_this.forceUpdate();
|
||
};
|
||
|
||
_this.handleAllRowsSelect = function (e, isUnSelect) {
|
||
var _this$props2 = _this.props,
|
||
data = _this$props2.data,
|
||
keyField = _this$props2.keyField,
|
||
_this$props2$selectRo = _this$props2.selectRow,
|
||
onSelectAll = _this$props2$selectRo.onSelectAll,
|
||
nonSelectable = _this$props2$selectRo.nonSelectable;
|
||
var selected = _this.selected;
|
||
|
||
|
||
var currSelected = void 0;
|
||
|
||
if (!isUnSelect) {
|
||
currSelected = selected.concat(_operators2.default.selectableKeys(data, keyField, nonSelectable));
|
||
} else {
|
||
currSelected = selected.filter(function (s) {
|
||
return typeof data.find(function (d) {
|
||
return _utils2.default.get(d, keyField) === s;
|
||
}) === 'undefined';
|
||
});
|
||
}
|
||
|
||
var result = void 0;
|
||
if (onSelectAll) {
|
||
result = onSelectAll(!isUnSelect, _operators2.default.getSelectedRows(data, keyField, isUnSelect ? selected : currSelected), e);
|
||
if (Array.isArray(result)) {
|
||
currSelected = result;
|
||
}
|
||
}
|
||
_this.selected = currSelected;
|
||
_this.forceUpdate();
|
||
};
|
||
|
||
_this.selected = props.selectRow.selected || [];
|
||
return _this;
|
||
}
|
||
|
||
// exposed API
|
||
|
||
|
||
_createClass(SelectionProvider, [{
|
||
key: 'getSelected',
|
||
value: function getSelected() {
|
||
return this.selected;
|
||
}
|
||
}, {
|
||
key: 'UNSAFE_componentWillReceiveProps',
|
||
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
||
if (nextProps.selectRow) {
|
||
this.selected = nextProps.selectRow.selected || this.selected;
|
||
}
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _getSelectionSummary = (0, _selection.getSelectionSummary)(this.props.data, this.props.keyField, this.selected),
|
||
allRowsSelected = _getSelectionSummary.allRowsSelected,
|
||
allRowsNotSelected = _getSelectionSummary.allRowsNotSelected;
|
||
|
||
var checkedStatus = void 0;
|
||
|
||
// checkbox status depending on selected rows counts
|
||
if (allRowsSelected) checkedStatus = _const2.default.CHECKBOX_STATUS_CHECKED;else if (allRowsNotSelected) checkedStatus = _const2.default.CHECKBOX_STATUS_UNCHECKED;else checkedStatus = _const2.default.CHECKBOX_STATUS_INDETERMINATE;
|
||
|
||
return _react2.default.createElement(
|
||
SelectionContext.Provider,
|
||
{
|
||
value: _extends({}, this.props.selectRow, {
|
||
selected: this.selected,
|
||
onRowSelect: this.handleRowSelect,
|
||
onAllRowsSelect: this.handleAllRowsSelect,
|
||
allRowsSelected: allRowsSelected,
|
||
allRowsNotSelected: allRowsNotSelected,
|
||
checkedStatus: checkedStatus
|
||
})
|
||
},
|
||
this.props.children
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return SelectionProvider;
|
||
}(_react2.default.Component);
|
||
|
||
SelectionProvider.propTypes = {
|
||
children: _propTypes2.default.node.isRequired,
|
||
data: _propTypes2.default.array.isRequired,
|
||
keyField: _propTypes2.default.string.isRequired
|
||
};
|
||
exports.default = {
|
||
Provider: SelectionProvider,
|
||
Consumer: SelectionContext.Consumer
|
||
};
|
||
|
||
/***/ }),
|
||
/* 9 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _rows = __webpack_require__(6);
|
||
|
||
var rows = _interopRequireWildcard(_rows);
|
||
|
||
var _selection = __webpack_require__(11);
|
||
|
||
var selection = _interopRequireWildcard(_selection);
|
||
|
||
var _expand = __webpack_require__(36);
|
||
|
||
var expand = _interopRequireWildcard(_expand);
|
||
|
||
var _mutate = __webpack_require__(37);
|
||
|
||
var mutate = _interopRequireWildcard(_mutate);
|
||
|
||
var _sort = __webpack_require__(38);
|
||
|
||
var sort = _interopRequireWildcard(_sort);
|
||
|
||
var _type = __webpack_require__(39);
|
||
|
||
var type = _interopRequireWildcard(_type);
|
||
|
||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
||
|
||
exports.default = _extends({}, rows, selection, expand, mutate, sort, type);
|
||
|
||
/***/ }),
|
||
/* 10 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _operators = __webpack_require__(9);
|
||
|
||
var _operators2 = _interopRequireDefault(_operators);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint camelcase: 0 */
|
||
/* eslint react/prop-types: 0 */
|
||
|
||
|
||
var RowExpandContext = _react2.default.createContext();
|
||
|
||
var RowExpandProvider = function (_React$Component) {
|
||
_inherits(RowExpandProvider, _React$Component);
|
||
|
||
function RowExpandProvider() {
|
||
var _ref;
|
||
|
||
var _temp, _this, _ret;
|
||
|
||
_classCallCheck(this, RowExpandProvider);
|
||
|
||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||
args[_key] = arguments[_key];
|
||
}
|
||
|
||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = RowExpandProvider.__proto__ || Object.getPrototypeOf(RowExpandProvider)).call.apply(_ref, [this].concat(args))), _this), _this.state = { expanded: _this.props.expandRow.expanded || [],
|
||
isClosing: _this.props.expandRow.isClosing || [] }, _this.onClosed = function (closedRow) {
|
||
_this.setState({ isClosing: _this.state.isClosing.filter(function (value) {
|
||
return value !== closedRow;
|
||
}) });
|
||
}, _this.handleRowExpand = function (rowKey, expanded, rowIndex, e) {
|
||
var _this$props = _this.props,
|
||
data = _this$props.data,
|
||
keyField = _this$props.keyField,
|
||
_this$props$expandRow = _this$props.expandRow,
|
||
onExpand = _this$props$expandRow.onExpand,
|
||
onlyOneExpanding = _this$props$expandRow.onlyOneExpanding,
|
||
nonExpandable = _this$props$expandRow.nonExpandable;
|
||
|
||
if (nonExpandable && _utils2.default.contains(nonExpandable, rowKey)) {
|
||
return;
|
||
}
|
||
|
||
var currExpanded = [].concat(_toConsumableArray(_this.state.expanded));
|
||
var isClosing = [].concat(_toConsumableArray(_this.state.isClosing));
|
||
|
||
if (expanded) {
|
||
if (onlyOneExpanding) {
|
||
isClosing = isClosing.concat(currExpanded);
|
||
currExpanded = [rowKey];
|
||
} else currExpanded.push(rowKey);
|
||
} else {
|
||
isClosing.push(rowKey);
|
||
currExpanded = currExpanded.filter(function (value) {
|
||
return value !== rowKey;
|
||
});
|
||
}
|
||
|
||
if (onExpand) {
|
||
var row = _operators2.default.getRowByRowId(data, keyField, rowKey);
|
||
onExpand(row, expanded, rowIndex, e);
|
||
}
|
||
_this.setState(function () {
|
||
return { expanded: currExpanded, isClosing: isClosing };
|
||
});
|
||
}, _this.handleAllRowExpand = function (e, expandAll) {
|
||
var _this$props2 = _this.props,
|
||
data = _this$props2.data,
|
||
keyField = _this$props2.keyField,
|
||
_this$props2$expandRo = _this$props2.expandRow,
|
||
onExpandAll = _this$props2$expandRo.onExpandAll,
|
||
nonExpandable = _this$props2$expandRo.nonExpandable;
|
||
var expanded = _this.state.expanded;
|
||
|
||
|
||
var currExpanded = void 0;
|
||
|
||
if (expandAll) {
|
||
currExpanded = expanded.concat(_operators2.default.expandableKeys(data, keyField, nonExpandable));
|
||
} else {
|
||
currExpanded = expanded.filter(function (s) {
|
||
return typeof data.find(function (d) {
|
||
return _utils2.default.get(d, keyField) === s;
|
||
}) === 'undefined';
|
||
});
|
||
}
|
||
|
||
if (onExpandAll) {
|
||
onExpandAll(expandAll, _operators2.default.getExpandedRows(data, keyField, currExpanded), e);
|
||
}
|
||
|
||
_this.setState(function () {
|
||
return { expanded: currExpanded };
|
||
});
|
||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||
}
|
||
|
||
_createClass(RowExpandProvider, [{
|
||
key: 'UNSAFE_componentWillReceiveProps',
|
||
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
||
var _this2 = this;
|
||
|
||
if (nextProps.expandRow) {
|
||
var nextExpanded = nextProps.expandRow.expanded || this.state.expanded;
|
||
var isClosing = this.state.expanded.reduce(function (acc, cur) {
|
||
if (!_utils2.default.contains(nextExpanded, cur)) {
|
||
acc.push(cur);
|
||
}
|
||
return acc;
|
||
}, []);
|
||
this.setState(function () {
|
||
return {
|
||
expanded: nextExpanded,
|
||
isClosing: isClosing
|
||
};
|
||
});
|
||
} else {
|
||
this.setState(function () {
|
||
return {
|
||
expanded: _this2.state.expanded
|
||
};
|
||
});
|
||
}
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
data = _props.data,
|
||
keyField = _props.keyField;
|
||
|
||
return _react2.default.createElement(
|
||
RowExpandContext.Provider,
|
||
{
|
||
value: _extends({}, this.props.expandRow, {
|
||
nonExpandable: this.props.expandRow.nonExpandable,
|
||
expanded: this.state.expanded,
|
||
isClosing: this.state.isClosing,
|
||
onClosed: this.onClosed,
|
||
isAnyExpands: _operators2.default.isAnyExpands(data, keyField, this.state.expanded),
|
||
onRowExpand: this.handleRowExpand,
|
||
onAllRowExpand: this.handleAllRowExpand
|
||
})
|
||
},
|
||
this.props.children
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return RowExpandProvider;
|
||
}(_react2.default.Component);
|
||
|
||
RowExpandProvider.propTypes = {
|
||
children: _propTypes2.default.node.isRequired,
|
||
data: _propTypes2.default.array.isRequired,
|
||
keyField: _propTypes2.default.string.isRequired
|
||
};
|
||
exports.default = {
|
||
Provider: RowExpandProvider,
|
||
Consumer: RowExpandContext.Consumer
|
||
};
|
||
|
||
/***/ }),
|
||
/* 11 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.getSelectedRows = exports.unSelectableKeys = exports.selectableKeys = exports.getSelectionSummary = undefined;
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _rows = __webpack_require__(6);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var getSelectionSummary = exports.getSelectionSummary = function getSelectionSummary() {
|
||
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
||
var keyField = arguments[1];
|
||
var selected = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
||
|
||
var allRowsSelected = data.length > 0;
|
||
var allRowsNotSelected = true;
|
||
|
||
var rowKeys = data.map(function (d) {
|
||
return _utils2.default.get(d, keyField);
|
||
});
|
||
|
||
var _loop = function _loop(i) {
|
||
var curr = rowKeys[i];
|
||
if (typeof selected.find(function (x) {
|
||
return x === curr;
|
||
}) === 'undefined') {
|
||
allRowsSelected = false;
|
||
} else {
|
||
allRowsNotSelected = false;
|
||
}
|
||
};
|
||
|
||
for (var i = 0; i < rowKeys.length; i += 1) {
|
||
_loop(i);
|
||
}
|
||
return {
|
||
allRowsSelected: allRowsSelected,
|
||
allRowsNotSelected: allRowsNotSelected
|
||
};
|
||
};
|
||
|
||
var selectableKeys = exports.selectableKeys = function selectableKeys() {
|
||
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
||
var keyField = arguments[1];
|
||
var skips = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
||
|
||
if (skips.length === 0) {
|
||
return data.map(function (row) {
|
||
return _utils2.default.get(row, keyField);
|
||
});
|
||
}
|
||
return data.filter(function (row) {
|
||
return !_utils2.default.contains(skips, _utils2.default.get(row, keyField));
|
||
}).map(function (row) {
|
||
return _utils2.default.get(row, keyField);
|
||
});
|
||
};
|
||
|
||
var unSelectableKeys = exports.unSelectableKeys = function unSelectableKeys(selected) {
|
||
var skips = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
||
|
||
if (skips.length === 0) {
|
||
return [];
|
||
}
|
||
return selected.filter(function (x) {
|
||
return _utils2.default.contains(skips, x);
|
||
});
|
||
};
|
||
|
||
var getSelectedRows = exports.getSelectedRows = function getSelectedRows() {
|
||
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
||
var keyField = arguments[1];
|
||
var selected = arguments[2];
|
||
return selected.map(function (k) {
|
||
return (0, _rows.getRowByRowId)(data, keyField, k);
|
||
}).filter(function (x) {
|
||
return !!x;
|
||
});
|
||
};
|
||
|
||
/***/ }),
|
||
/* 12 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } /* eslint react/require-default-props: 0 */
|
||
|
||
|
||
var RowTemplate = function RowTemplate(props) {
|
||
var renderContent = props.renderContent,
|
||
selectRow = props.selectRow,
|
||
expandRow = props.expandRow,
|
||
cellEl = props.cellEl,
|
||
rest = _objectWithoutProperties(props, ['renderContent', 'selectRow', 'expandRow', 'cellEl']);
|
||
|
||
var isRenderFunctionColumnInLeft = function isRenderFunctionColumnInLeft() {
|
||
var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _const2.default.INDICATOR_POSITION_LEFT;
|
||
return position === _const2.default.INDICATOR_POSITION_LEFT;
|
||
};
|
||
|
||
var childrens = renderContent() || [];
|
||
|
||
if (selectRow && selectRow.hideSelectColumn !== true) {
|
||
if (isRenderFunctionColumnInLeft(selectRow.selectColumnPosition)) {
|
||
childrens.unshift(_react2.default.createElement(cellEl, { key: 'selection' }));
|
||
} else {
|
||
childrens.push(_react2.default.createElement(cellEl, { key: 'selection' }));
|
||
}
|
||
}
|
||
|
||
if (expandRow.showExpandColumn) {
|
||
if (isRenderFunctionColumnInLeft(expandRow.expandColumnPosition)) {
|
||
childrens.unshift(_react2.default.createElement(cellEl, { key: 'expansion' }));
|
||
} else {
|
||
childrens.push(_react2.default.createElement(cellEl, { key: 'expansion' }));
|
||
}
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'tr',
|
||
rest,
|
||
childrens
|
||
);
|
||
};
|
||
|
||
RowTemplate.propTypes = {
|
||
renderContent: _propTypes2.default.func.isRequired,
|
||
cellEl: _propTypes2.default.string.isRequired,
|
||
selectRow: _propTypes2.default.object,
|
||
expandRow: _propTypes2.default.object
|
||
};
|
||
|
||
exports.default = RowTemplate;
|
||
|
||
/***/ }),
|
||
/* 13 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _cell = __webpack_require__(46);
|
||
|
||
var _cell2 = _interopRequireDefault(_cell);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */
|
||
/* eslint react/no-array-index-key: 0 */
|
||
/* eslint no-plusplus: 0 */
|
||
|
||
|
||
var RowPureContent = function (_React$Component) {
|
||
_inherits(RowPureContent, _React$Component);
|
||
|
||
function RowPureContent() {
|
||
_classCallCheck(this, RowPureContent);
|
||
|
||
return _possibleConstructorReturn(this, (RowPureContent.__proto__ || Object.getPrototypeOf(RowPureContent)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(RowPureContent, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
if (typeof nextProps.shouldUpdate !== 'undefined') {
|
||
return nextProps.shouldUpdate;
|
||
}
|
||
return true;
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
row = _props.row,
|
||
keyField = _props.keyField,
|
||
columns = _props.columns,
|
||
rowIndex = _props.rowIndex,
|
||
editable = _props.editable,
|
||
editingRowIdx = _props.editingRowIdx,
|
||
editingColIdx = _props.editingColIdx,
|
||
onStart = _props.onStart,
|
||
clickToEdit = _props.clickToEdit,
|
||
dbclickToEdit = _props.dbclickToEdit,
|
||
EditingCellComponent = _props.EditingCellComponent,
|
||
tabIndexStart = _props.tabIndexStart;
|
||
|
||
|
||
var tabIndex = tabIndexStart;
|
||
|
||
return columns.map(function (column, index) {
|
||
var dataField = column.dataField;
|
||
|
||
var content = _utils2.default.get(row, dataField);
|
||
if (rowIndex === editingRowIdx && index === editingColIdx) {
|
||
return _react2.default.createElement(EditingCellComponent, {
|
||
key: content + '-' + index + '-editing',
|
||
row: row,
|
||
rowIndex: rowIndex,
|
||
column: column,
|
||
columnIndex: index
|
||
});
|
||
}
|
||
// render cell
|
||
var cellTitle = void 0;
|
||
var cellStyle = {};
|
||
var cellAttrs = _extends({}, _utils2.default.isFunction(column.attrs) ? column.attrs(content, row, rowIndex, index) : column.attrs);
|
||
|
||
if (column.events) {
|
||
var events = Object.assign({}, column.events);
|
||
Object.keys(Object.assign({}, column.events)).forEach(function (key) {
|
||
var originFn = events[key];
|
||
events[key] = function () {
|
||
for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
|
||
rest[_key] = arguments[_key];
|
||
}
|
||
|
||
return originFn.apply(undefined, rest.concat([row, rowIndex]));
|
||
};
|
||
});
|
||
cellAttrs = _extends({}, cellAttrs, events);
|
||
}
|
||
|
||
var cellClasses = _utils2.default.isFunction(column.classes) ? column.classes(content, row, rowIndex, index) : column.classes;
|
||
|
||
if (column.style) {
|
||
cellStyle = _utils2.default.isFunction(column.style) ? column.style(content, row, rowIndex, index) : column.style;
|
||
cellStyle = Object.assign({}, cellStyle) || {};
|
||
}
|
||
|
||
if (column.title) {
|
||
cellTitle = _utils2.default.isFunction(column.title) ? column.title(content, row, rowIndex, index) : content;
|
||
cellAttrs.title = cellTitle;
|
||
}
|
||
|
||
if (column.align) {
|
||
cellStyle.textAlign = _utils2.default.isFunction(column.align) ? column.align(content, row, rowIndex, index) : column.align;
|
||
}
|
||
|
||
if (cellClasses) cellAttrs.className = cellClasses;
|
||
if (!_utils2.default.isEmptyObject(cellStyle)) cellAttrs.style = cellStyle;
|
||
|
||
var editableCell = _utils2.default.isDefined(column.editable) ? column.editable : true;
|
||
if (column.dataField === keyField || !editable) editableCell = false;
|
||
if (_utils2.default.isFunction(column.editable)) {
|
||
editableCell = column.editable(content, row, rowIndex, index);
|
||
}
|
||
|
||
if (tabIndexStart !== -1) {
|
||
cellAttrs.tabIndex = tabIndex++;
|
||
}
|
||
|
||
return _react2.default.createElement(_cell2.default, _extends({
|
||
key: content + '-' + index,
|
||
row: row,
|
||
editable: editableCell,
|
||
rowIndex: rowIndex,
|
||
columnIndex: index,
|
||
column: column,
|
||
onStart: onStart,
|
||
clickToEdit: clickToEdit,
|
||
dbclickToEdit: dbclickToEdit
|
||
}, cellAttrs));
|
||
});
|
||
}
|
||
}]);
|
||
|
||
return RowPureContent;
|
||
}(_react2.default.Component);
|
||
|
||
exports.default = RowPureContent;
|
||
|
||
/***/ }),
|
||
/* 14 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||
|
||
var events = ['onClick', 'onDoubleClick', 'onMouseEnter', 'onMouseLeave', 'onContextMenu'];
|
||
|
||
exports.default = function (ExtendBase) {
|
||
return function (_ExtendBase) {
|
||
_inherits(RowEventDelegater, _ExtendBase);
|
||
|
||
function RowEventDelegater(props) {
|
||
_classCallCheck(this, RowEventDelegater);
|
||
|
||
var _this = _possibleConstructorReturn(this, (RowEventDelegater.__proto__ || Object.getPrototypeOf(RowEventDelegater)).call(this, props));
|
||
|
||
_this.clickNum = 0;
|
||
_this.createDefaultEventHandler = _this.createDefaultEventHandler.bind(_this);
|
||
_this.createClickEventHandler = _this.createClickEventHandler.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(RowEventDelegater, [{
|
||
key: 'createClickEventHandler',
|
||
value: function createClickEventHandler(cb) {
|
||
var _this2 = this;
|
||
|
||
return function (e) {
|
||
var _props = _this2.props,
|
||
row = _props.row,
|
||
selected = _props.selected,
|
||
keyField = _props.keyField,
|
||
selectable = _props.selectable,
|
||
expandable = _props.expandable,
|
||
rowIndex = _props.rowIndex,
|
||
expanded = _props.expanded,
|
||
expandRow = _props.expandRow,
|
||
selectRow = _props.selectRow,
|
||
DELAY_FOR_DBCLICK = _props.DELAY_FOR_DBCLICK;
|
||
|
||
var clickFn = function clickFn() {
|
||
if (cb) {
|
||
cb(e, row, rowIndex);
|
||
}
|
||
var key = _utils2.default.get(row, keyField);
|
||
if (expandRow && expandable && !expandRow.expandByColumnOnly) {
|
||
if (selectRow.mode !== _const2.default.ROW_SELECT_DISABLED && selectRow.clickToExpand || selectRow.mode === _const2.default.ROW_SELECT_DISABLED) {
|
||
expandRow.onRowExpand(key, !expanded, rowIndex, e);
|
||
}
|
||
}
|
||
if (selectRow.clickToSelect && selectable) {
|
||
selectRow.onRowSelect(key, !selected, rowIndex, e);
|
||
}
|
||
};
|
||
|
||
if (DELAY_FOR_DBCLICK) {
|
||
_this2.clickNum += 1;
|
||
_utils2.default.debounce(function () {
|
||
if (_this2.clickNum === 1) {
|
||
clickFn();
|
||
}
|
||
_this2.clickNum = 0;
|
||
}, DELAY_FOR_DBCLICK)();
|
||
} else {
|
||
clickFn();
|
||
}
|
||
};
|
||
}
|
||
}, {
|
||
key: 'createDefaultEventHandler',
|
||
value: function createDefaultEventHandler(cb) {
|
||
var _this3 = this;
|
||
|
||
return function (e) {
|
||
var _props2 = _this3.props,
|
||
row = _props2.row,
|
||
rowIndex = _props2.rowIndex;
|
||
|
||
cb(e, row, rowIndex);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'delegate',
|
||
value: function delegate() {
|
||
var _this4 = this;
|
||
|
||
var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var newAttrs = _extends({}, attrs);
|
||
Object.keys(attrs).forEach(function (attr) {
|
||
if (_utils2.default.contains(events, attr)) {
|
||
newAttrs[attr] = _this4.createDefaultEventHandler(attrs[attr]);
|
||
}
|
||
});
|
||
return newAttrs;
|
||
}
|
||
}]);
|
||
|
||
return RowEventDelegater;
|
||
}(ExtendBase);
|
||
};
|
||
|
||
/***/ }),
|
||
/* 15 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */
|
||
|
||
|
||
exports.default = function (ExtendBase) {
|
||
return function (_ExtendBase) {
|
||
_inherits(RowShouldUpdater, _ExtendBase);
|
||
|
||
function RowShouldUpdater() {
|
||
_classCallCheck(this, RowShouldUpdater);
|
||
|
||
return _possibleConstructorReturn(this, (RowShouldUpdater.__proto__ || Object.getPrototypeOf(RowShouldUpdater)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(RowShouldUpdater, [{
|
||
key: 'shouldUpdateByCellEditing',
|
||
value: function shouldUpdateByCellEditing(nextProps) {
|
||
if (!(this.props.clickToEdit || this.props.dbclickToEdit)) return false;
|
||
return nextProps.editingRowIdx === nextProps.rowIndex || this.props.editingRowIdx === nextProps.rowIndex && nextProps.editingRowIdx === null || this.props.editingRowIdx === nextProps.rowIndex;
|
||
}
|
||
}, {
|
||
key: 'shouldUpdatedBySelfProps',
|
||
value: function shouldUpdatedBySelfProps(nextProps) {
|
||
return this.props.className !== nextProps.className || !_utils2.default.isEqual(this.props.style, nextProps.style) || !_utils2.default.isEqual(this.props.attrs, nextProps.attrs);
|
||
}
|
||
|
||
// Only use for simple-row
|
||
|
||
}, {
|
||
key: 'shouldUpdateByColumnsForSimpleCheck',
|
||
value: function shouldUpdateByColumnsForSimpleCheck(nextProps) {
|
||
if (this.props.columns.length !== nextProps.columns.length) {
|
||
return true;
|
||
}
|
||
for (var i = 0; i < this.props.columns.length; i += 1) {
|
||
if (!_utils2.default.isEqual(this.props.columns[i], nextProps.columns[i])) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
}, {
|
||
key: 'shouldUpdatedByNormalProps',
|
||
value: function shouldUpdatedByNormalProps(nextProps) {
|
||
var shouldUpdate = this.props.rowIndex !== nextProps.rowIndex || this.props.editable !== nextProps.editable || !_utils2.default.isEqual(this.props.row, nextProps.row) || this.props.columns.length !== nextProps.columns.length;
|
||
|
||
return shouldUpdate;
|
||
}
|
||
}, {
|
||
key: 'shouldUpdateChild',
|
||
value: function shouldUpdateChild(nextProps) {
|
||
return this.shouldUpdateByCellEditing(nextProps) || this.shouldUpdatedByNormalProps(nextProps);
|
||
}
|
||
}, {
|
||
key: 'shouldRowContentUpdate',
|
||
value: function shouldRowContentUpdate(nextProps) {
|
||
return this.shouldUpdateChild(nextProps) || this.shouldUpdateByColumnsForSimpleCheck(nextProps);
|
||
}
|
||
}]);
|
||
|
||
return RowShouldUpdater;
|
||
}(ExtendBase);
|
||
};
|
||
|
||
/***/ }),
|
||
/* 16 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;
|
||
|
||
var PropTypes = _interopRequireWildcard(__webpack_require__(1));
|
||
|
||
var _react = _interopRequireDefault(__webpack_require__(0));
|
||
|
||
var _reactDom = _interopRequireDefault(__webpack_require__(17));
|
||
|
||
var _reactLifecyclesCompat = __webpack_require__(18);
|
||
|
||
var _PropTypes = __webpack_require__(19);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
||
|
||
var UNMOUNTED = 'unmounted';
|
||
exports.UNMOUNTED = UNMOUNTED;
|
||
var EXITED = 'exited';
|
||
exports.EXITED = EXITED;
|
||
var ENTERING = 'entering';
|
||
exports.ENTERING = ENTERING;
|
||
var ENTERED = 'entered';
|
||
exports.ENTERED = ENTERED;
|
||
var EXITING = 'exiting';
|
||
/**
|
||
* The Transition component lets you describe a transition from one component
|
||
* state to another _over time_ with a simple declarative API. Most commonly
|
||
* it's used to animate the mounting and unmounting of a component, but can also
|
||
* be used to describe in-place transition states as well.
|
||
*
|
||
* By default the `Transition` component does not alter the behavior of the
|
||
* component it renders, it only tracks "enter" and "exit" states for the components.
|
||
* It's up to you to give meaning and effect to those states. For example we can
|
||
* add styles to a component when it enters or exits:
|
||
*
|
||
* ```jsx
|
||
* import Transition from 'react-transition-group/Transition';
|
||
*
|
||
* const duration = 300;
|
||
*
|
||
* const defaultStyle = {
|
||
* transition: `opacity ${duration}ms ease-in-out`,
|
||
* opacity: 0,
|
||
* }
|
||
*
|
||
* const transitionStyles = {
|
||
* entering: { opacity: 0 },
|
||
* entered: { opacity: 1 },
|
||
* };
|
||
*
|
||
* const Fade = ({ in: inProp }) => (
|
||
* <Transition in={inProp} timeout={duration}>
|
||
* {(state) => (
|
||
* <div style={{
|
||
* ...defaultStyle,
|
||
* ...transitionStyles[state]
|
||
* }}>
|
||
* I'm a fade Transition!
|
||
* </div>
|
||
* )}
|
||
* </Transition>
|
||
* );
|
||
* ```
|
||
*
|
||
* As noted the `Transition` component doesn't _do_ anything by itself to its child component.
|
||
* What it does do is track transition states over time so you can update the
|
||
* component (such as by adding styles or classes) when it changes states.
|
||
*
|
||
* There are 4 main states a Transition can be in:
|
||
* - `'entering'`
|
||
* - `'entered'`
|
||
* - `'exiting'`
|
||
* - `'exited'`
|
||
*
|
||
* Transition state is toggled via the `in` prop. When `true` the component begins the
|
||
* "Enter" stage. During this stage, the component will shift from its current transition state,
|
||
* to `'entering'` for the duration of the transition and then to the `'entered'` stage once
|
||
* it's complete. Let's take the following example:
|
||
*
|
||
* ```jsx
|
||
* state = { in: false };
|
||
*
|
||
* toggleEnterState = () => {
|
||
* this.setState({ in: true });
|
||
* }
|
||
*
|
||
* render() {
|
||
* return (
|
||
* <div>
|
||
* <Transition in={this.state.in} timeout={500} />
|
||
* <button onClick={this.toggleEnterState}>Click to Enter</button>
|
||
* </div>
|
||
* );
|
||
* }
|
||
* ```
|
||
*
|
||
* When the button is clicked the component will shift to the `'entering'` state and
|
||
* stay there for 500ms (the value of `timeout`) before it finally switches to `'entered'`.
|
||
*
|
||
* When `in` is `false` the same thing happens except the state moves from `'exiting'` to `'exited'`.
|
||
*
|
||
* ## Timing
|
||
*
|
||
* Timing is often the trickiest part of animation, mistakes can result in slight delays
|
||
* that are hard to pin down. A common example is when you want to add an exit transition,
|
||
* you should set the desired final styles when the state is `'exiting'`. That's when the
|
||
* transition to those styles will start and, if you matched the `timeout` prop with the
|
||
* CSS Transition duration, it will end exactly when the state changes to `'exited'`.
|
||
*
|
||
* > **Note**: For simpler transitions the `Transition` component might be enough, but
|
||
* > take into account that it's platform-agnostic, while the `CSSTransition` component
|
||
* > [forces reflows](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)
|
||
* > in order to make more complex transitions more predictable. For example, even though
|
||
* > classes `example-enter` and `example-enter-active` are applied immediately one after
|
||
* > another, you can still transition from one to the other because of the forced reflow
|
||
* > (read [this issue](https://github.com/reactjs/react-transition-group/issues/159#issuecomment-322761171)
|
||
* > for more info). Take this into account when choosing between `Transition` and
|
||
* > `CSSTransition`.
|
||
*/
|
||
|
||
exports.EXITING = EXITING;
|
||
|
||
var Transition =
|
||
/*#__PURE__*/
|
||
function (_React$Component) {
|
||
_inheritsLoose(Transition, _React$Component);
|
||
|
||
function Transition(props, context) {
|
||
var _this;
|
||
|
||
_this = _React$Component.call(this, props, context) || this;
|
||
var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears
|
||
|
||
var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;
|
||
var initialStatus;
|
||
_this.appearStatus = null;
|
||
|
||
if (props.in) {
|
||
if (appear) {
|
||
initialStatus = EXITED;
|
||
_this.appearStatus = ENTERING;
|
||
} else {
|
||
initialStatus = ENTERED;
|
||
}
|
||
} else {
|
||
if (props.unmountOnExit || props.mountOnEnter) {
|
||
initialStatus = UNMOUNTED;
|
||
} else {
|
||
initialStatus = EXITED;
|
||
}
|
||
}
|
||
|
||
_this.state = {
|
||
status: initialStatus
|
||
};
|
||
_this.nextCallback = null;
|
||
return _this;
|
||
}
|
||
|
||
var _proto = Transition.prototype;
|
||
|
||
_proto.getChildContext = function getChildContext() {
|
||
return {
|
||
transitionGroup: null // allows for nested Transitions
|
||
|
||
};
|
||
};
|
||
|
||
Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {
|
||
var nextIn = _ref.in;
|
||
|
||
if (nextIn && prevState.status === UNMOUNTED) {
|
||
return {
|
||
status: EXITED
|
||
};
|
||
}
|
||
|
||
return null;
|
||
}; // getSnapshotBeforeUpdate(prevProps) {
|
||
// let nextStatus = null
|
||
// if (prevProps !== this.props) {
|
||
// const { status } = this.state
|
||
// if (this.props.in) {
|
||
// if (status !== ENTERING && status !== ENTERED) {
|
||
// nextStatus = ENTERING
|
||
// }
|
||
// } else {
|
||
// if (status === ENTERING || status === ENTERED) {
|
||
// nextStatus = EXITING
|
||
// }
|
||
// }
|
||
// }
|
||
// return { nextStatus }
|
||
// }
|
||
|
||
|
||
_proto.componentDidMount = function componentDidMount() {
|
||
this.updateStatus(true, this.appearStatus);
|
||
};
|
||
|
||
_proto.componentDidUpdate = function componentDidUpdate(prevProps) {
|
||
var nextStatus = null;
|
||
|
||
if (prevProps !== this.props) {
|
||
var status = this.state.status;
|
||
|
||
if (this.props.in) {
|
||
if (status !== ENTERING && status !== ENTERED) {
|
||
nextStatus = ENTERING;
|
||
}
|
||
} else {
|
||
if (status === ENTERING || status === ENTERED) {
|
||
nextStatus = EXITING;
|
||
}
|
||
}
|
||
}
|
||
|
||
this.updateStatus(false, nextStatus);
|
||
};
|
||
|
||
_proto.componentWillUnmount = function componentWillUnmount() {
|
||
this.cancelNextCallback();
|
||
};
|
||
|
||
_proto.getTimeouts = function getTimeouts() {
|
||
var timeout = this.props.timeout;
|
||
var exit, enter, appear;
|
||
exit = enter = appear = timeout;
|
||
|
||
if (timeout != null && typeof timeout !== 'number') {
|
||
exit = timeout.exit;
|
||
enter = timeout.enter;
|
||
appear = timeout.appear;
|
||
}
|
||
|
||
return {
|
||
exit: exit,
|
||
enter: enter,
|
||
appear: appear
|
||
};
|
||
};
|
||
|
||
_proto.updateStatus = function updateStatus(mounting, nextStatus) {
|
||
if (mounting === void 0) {
|
||
mounting = false;
|
||
}
|
||
|
||
if (nextStatus !== null) {
|
||
// nextStatus will always be ENTERING or EXITING.
|
||
this.cancelNextCallback();
|
||
|
||
var node = _reactDom.default.findDOMNode(this);
|
||
|
||
if (nextStatus === ENTERING) {
|
||
this.performEnter(node, mounting);
|
||
} else {
|
||
this.performExit(node);
|
||
}
|
||
} else if (this.props.unmountOnExit && this.state.status === EXITED) {
|
||
this.setState({
|
||
status: UNMOUNTED
|
||
});
|
||
}
|
||
};
|
||
|
||
_proto.performEnter = function performEnter(node, mounting) {
|
||
var _this2 = this;
|
||
|
||
var enter = this.props.enter;
|
||
var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;
|
||
var timeouts = this.getTimeouts(); // no enter animation skip right to ENTERED
|
||
// if we are mounting and running this it means appear _must_ be set
|
||
|
||
if (!mounting && !enter) {
|
||
this.safeSetState({
|
||
status: ENTERED
|
||
}, function () {
|
||
_this2.props.onEntered(node);
|
||
});
|
||
return;
|
||
}
|
||
|
||
this.props.onEnter(node, appearing);
|
||
this.safeSetState({
|
||
status: ENTERING
|
||
}, function () {
|
||
_this2.props.onEntering(node, appearing); // FIXME: appear timeout?
|
||
|
||
|
||
_this2.onTransitionEnd(node, timeouts.enter, function () {
|
||
_this2.safeSetState({
|
||
status: ENTERED
|
||
}, function () {
|
||
_this2.props.onEntered(node, appearing);
|
||
});
|
||
});
|
||
});
|
||
};
|
||
|
||
_proto.performExit = function performExit(node) {
|
||
var _this3 = this;
|
||
|
||
var exit = this.props.exit;
|
||
var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED
|
||
|
||
if (!exit) {
|
||
this.safeSetState({
|
||
status: EXITED
|
||
}, function () {
|
||
_this3.props.onExited(node);
|
||
});
|
||
return;
|
||
}
|
||
|
||
this.props.onExit(node);
|
||
this.safeSetState({
|
||
status: EXITING
|
||
}, function () {
|
||
_this3.props.onExiting(node);
|
||
|
||
_this3.onTransitionEnd(node, timeouts.exit, function () {
|
||
_this3.safeSetState({
|
||
status: EXITED
|
||
}, function () {
|
||
_this3.props.onExited(node);
|
||
});
|
||
});
|
||
});
|
||
};
|
||
|
||
_proto.cancelNextCallback = function cancelNextCallback() {
|
||
if (this.nextCallback !== null) {
|
||
this.nextCallback.cancel();
|
||
this.nextCallback = null;
|
||
}
|
||
};
|
||
|
||
_proto.safeSetState = function safeSetState(nextState, callback) {
|
||
// This shouldn't be necessary, but there are weird race conditions with
|
||
// setState callbacks and unmounting in testing, so always make sure that
|
||
// we can cancel any pending setState callbacks after we unmount.
|
||
callback = this.setNextCallback(callback);
|
||
this.setState(nextState, callback);
|
||
};
|
||
|
||
_proto.setNextCallback = function setNextCallback(callback) {
|
||
var _this4 = this;
|
||
|
||
var active = true;
|
||
|
||
this.nextCallback = function (event) {
|
||
if (active) {
|
||
active = false;
|
||
_this4.nextCallback = null;
|
||
callback(event);
|
||
}
|
||
};
|
||
|
||
this.nextCallback.cancel = function () {
|
||
active = false;
|
||
};
|
||
|
||
return this.nextCallback;
|
||
};
|
||
|
||
_proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {
|
||
this.setNextCallback(handler);
|
||
|
||
if (node) {
|
||
if (this.props.addEndListener) {
|
||
this.props.addEndListener(node, this.nextCallback);
|
||
}
|
||
|
||
if (timeout != null) {
|
||
setTimeout(this.nextCallback, timeout);
|
||
}
|
||
} else {
|
||
setTimeout(this.nextCallback, 0);
|
||
}
|
||
};
|
||
|
||
_proto.render = function render() {
|
||
var status = this.state.status;
|
||
|
||
if (status === UNMOUNTED) {
|
||
return null;
|
||
}
|
||
|
||
var _this$props = this.props,
|
||
children = _this$props.children,
|
||
childProps = _objectWithoutPropertiesLoose(_this$props, ["children"]); // filter props for Transtition
|
||
|
||
|
||
delete childProps.in;
|
||
delete childProps.mountOnEnter;
|
||
delete childProps.unmountOnExit;
|
||
delete childProps.appear;
|
||
delete childProps.enter;
|
||
delete childProps.exit;
|
||
delete childProps.timeout;
|
||
delete childProps.addEndListener;
|
||
delete childProps.onEnter;
|
||
delete childProps.onEntering;
|
||
delete childProps.onEntered;
|
||
delete childProps.onExit;
|
||
delete childProps.onExiting;
|
||
delete childProps.onExited;
|
||
|
||
if (typeof children === 'function') {
|
||
return children(status, childProps);
|
||
}
|
||
|
||
var child = _react.default.Children.only(children);
|
||
|
||
return _react.default.cloneElement(child, childProps);
|
||
};
|
||
|
||
return Transition;
|
||
}(_react.default.Component);
|
||
|
||
Transition.contextTypes = {
|
||
transitionGroup: PropTypes.object
|
||
};
|
||
Transition.childContextTypes = {
|
||
transitionGroup: function transitionGroup() {}
|
||
};
|
||
Transition.propTypes = false ? {
|
||
/**
|
||
* A `function` child can be used instead of a React element.
|
||
* This function is called with the current transition status
|
||
* ('entering', 'entered', 'exiting', 'exited', 'unmounted'), which can be used
|
||
* to apply context specific props to a component.
|
||
*
|
||
* ```jsx
|
||
* <Transition timeout={150}>
|
||
* {(status) => (
|
||
* <MyComponent className={`fade fade-${status}`} />
|
||
* )}
|
||
* </Transition>
|
||
* ```
|
||
*/
|
||
children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,
|
||
|
||
/**
|
||
* Show the component; triggers the enter or exit states
|
||
*/
|
||
in: PropTypes.bool,
|
||
|
||
/**
|
||
* By default the child component is mounted immediately along with
|
||
* the parent `Transition` component. If you want to "lazy mount" the component on the
|
||
* first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay
|
||
* mounted, even on "exited", unless you also specify `unmountOnExit`.
|
||
*/
|
||
mountOnEnter: PropTypes.bool,
|
||
|
||
/**
|
||
* By default the child component stays mounted after it reaches the `'exited'` state.
|
||
* Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.
|
||
*/
|
||
unmountOnExit: PropTypes.bool,
|
||
|
||
/**
|
||
* Normally a component is not transitioned if it is shown when the `<Transition>` component mounts.
|
||
* If you want to transition on the first mount set `appear` to `true`, and the
|
||
* component will transition in as soon as the `<Transition>` mounts.
|
||
*
|
||
* > Note: there are no specific "appear" states. `appear` only adds an additional `enter` transition.
|
||
*/
|
||
appear: PropTypes.bool,
|
||
|
||
/**
|
||
* Enable or disable enter transitions.
|
||
*/
|
||
enter: PropTypes.bool,
|
||
|
||
/**
|
||
* Enable or disable exit transitions.
|
||
*/
|
||
exit: PropTypes.bool,
|
||
|
||
/**
|
||
* The duration of the transition, in milliseconds.
|
||
* Required unless `addEndListener` is provided
|
||
*
|
||
* You may specify a single timeout for all transitions like: `timeout={500}`,
|
||
* or individually like:
|
||
*
|
||
* ```jsx
|
||
* timeout={{
|
||
* enter: 300,
|
||
* exit: 500,
|
||
* }}
|
||
* ```
|
||
*
|
||
* @type {number | { enter?: number, exit?: number }}
|
||
*/
|
||
timeout: function timeout(props) {
|
||
var pt = process.env.NODE_ENV !== "production" ? _PropTypes.timeoutsShape : {};;
|
||
if (!props.addEndListener) pt = pt.isRequired;
|
||
|
||
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
args[_key - 1] = arguments[_key];
|
||
}
|
||
|
||
return pt.apply(void 0, [props].concat(args));
|
||
},
|
||
|
||
/**
|
||
* Add a custom transition end trigger. Called with the transitioning
|
||
* DOM node and a `done` callback. Allows for more fine grained transition end
|
||
* logic. **Note:** Timeouts are still used as a fallback if provided.
|
||
*
|
||
* ```jsx
|
||
* addEndListener={(node, done) => {
|
||
* // use the css transitionend event to mark the finish of a transition
|
||
* node.addEventListener('transitionend', done, false);
|
||
* }}
|
||
* ```
|
||
*/
|
||
addEndListener: PropTypes.func,
|
||
|
||
/**
|
||
* Callback fired before the "entering" status is applied. An extra parameter
|
||
* `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount
|
||
*
|
||
* @type Function(node: HtmlElement, isAppearing: bool) -> void
|
||
*/
|
||
onEnter: PropTypes.func,
|
||
|
||
/**
|
||
* Callback fired after the "entering" status is applied. An extra parameter
|
||
* `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount
|
||
*
|
||
* @type Function(node: HtmlElement, isAppearing: bool)
|
||
*/
|
||
onEntering: PropTypes.func,
|
||
|
||
/**
|
||
* Callback fired after the "entered" status is applied. An extra parameter
|
||
* `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount
|
||
*
|
||
* @type Function(node: HtmlElement, isAppearing: bool) -> void
|
||
*/
|
||
onEntered: PropTypes.func,
|
||
|
||
/**
|
||
* Callback fired before the "exiting" status is applied.
|
||
*
|
||
* @type Function(node: HtmlElement) -> void
|
||
*/
|
||
onExit: PropTypes.func,
|
||
|
||
/**
|
||
* Callback fired after the "exiting" status is applied.
|
||
*
|
||
* @type Function(node: HtmlElement) -> void
|
||
*/
|
||
onExiting: PropTypes.func,
|
||
|
||
/**
|
||
* Callback fired after the "exited" status is applied.
|
||
*
|
||
* @type Function(node: HtmlElement) -> void
|
||
*/
|
||
onExited: PropTypes.func // Name the function so it is clearer in the documentation
|
||
|
||
} : {};
|
||
|
||
function noop() {}
|
||
|
||
Transition.defaultProps = {
|
||
in: false,
|
||
mountOnEnter: false,
|
||
unmountOnExit: false,
|
||
appear: false,
|
||
enter: true,
|
||
exit: true,
|
||
onEnter: noop,
|
||
onEntering: noop,
|
||
onEntered: noop,
|
||
onExit: noop,
|
||
onExiting: noop,
|
||
onExited: noop
|
||
};
|
||
Transition.UNMOUNTED = 0;
|
||
Transition.EXITED = 1;
|
||
Transition.ENTERING = 2;
|
||
Transition.ENTERED = 3;
|
||
Transition.EXITING = 4;
|
||
|
||
var _default = (0, _reactLifecyclesCompat.polyfill)(Transition);
|
||
|
||
exports.default = _default;
|
||
|
||
/***/ }),
|
||
/* 17 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = __WEBPACK_EXTERNAL_MODULE_17__;
|
||
|
||
/***/ }),
|
||
/* 18 */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyfill", function() { return polyfill; });
|
||
/**
|
||
* Copyright (c) 2013-present, Facebook, Inc.
|
||
*
|
||
* This source code is licensed under the MIT license found in the
|
||
* LICENSE file in the root directory of this source tree.
|
||
*/
|
||
|
||
function componentWillMount() {
|
||
// Call this.constructor.gDSFP to support sub-classes.
|
||
var state = this.constructor.getDerivedStateFromProps(this.props, this.state);
|
||
if (state !== null && state !== undefined) {
|
||
this.setState(state);
|
||
}
|
||
}
|
||
|
||
function componentWillReceiveProps(nextProps) {
|
||
// Call this.constructor.gDSFP to support sub-classes.
|
||
// Use the setState() updater to ensure state isn't stale in certain edge cases.
|
||
function updater(prevState) {
|
||
var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);
|
||
return state !== null && state !== undefined ? state : null;
|
||
}
|
||
// Binding "this" is important for shallow renderer support.
|
||
this.setState(updater.bind(this));
|
||
}
|
||
|
||
function componentWillUpdate(nextProps, nextState) {
|
||
try {
|
||
var prevProps = this.props;
|
||
var prevState = this.state;
|
||
this.props = nextProps;
|
||
this.state = nextState;
|
||
this.__reactInternalSnapshotFlag = true;
|
||
this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(
|
||
prevProps,
|
||
prevState
|
||
);
|
||
} finally {
|
||
this.props = prevProps;
|
||
this.state = prevState;
|
||
}
|
||
}
|
||
|
||
// React may warn about cWM/cWRP/cWU methods being deprecated.
|
||
// Add a flag to suppress these warnings for this special case.
|
||
componentWillMount.__suppressDeprecationWarning = true;
|
||
componentWillReceiveProps.__suppressDeprecationWarning = true;
|
||
componentWillUpdate.__suppressDeprecationWarning = true;
|
||
|
||
function polyfill(Component) {
|
||
var prototype = Component.prototype;
|
||
|
||
if (!prototype || !prototype.isReactComponent) {
|
||
throw new Error('Can only polyfill class components');
|
||
}
|
||
|
||
if (
|
||
typeof Component.getDerivedStateFromProps !== 'function' &&
|
||
typeof prototype.getSnapshotBeforeUpdate !== 'function'
|
||
) {
|
||
return Component;
|
||
}
|
||
|
||
// If new component APIs are defined, "unsafe" lifecycles won't be called.
|
||
// Error if any of these lifecycles are present,
|
||
// Because they would work differently between older and newer (16.3+) versions of React.
|
||
var foundWillMountName = null;
|
||
var foundWillReceivePropsName = null;
|
||
var foundWillUpdateName = null;
|
||
if (typeof prototype.componentWillMount === 'function') {
|
||
foundWillMountName = 'componentWillMount';
|
||
} else if (typeof prototype.UNSAFE_componentWillMount === 'function') {
|
||
foundWillMountName = 'UNSAFE_componentWillMount';
|
||
}
|
||
if (typeof prototype.componentWillReceiveProps === 'function') {
|
||
foundWillReceivePropsName = 'componentWillReceiveProps';
|
||
} else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {
|
||
foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
|
||
}
|
||
if (typeof prototype.componentWillUpdate === 'function') {
|
||
foundWillUpdateName = 'componentWillUpdate';
|
||
} else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {
|
||
foundWillUpdateName = 'UNSAFE_componentWillUpdate';
|
||
}
|
||
if (
|
||
foundWillMountName !== null ||
|
||
foundWillReceivePropsName !== null ||
|
||
foundWillUpdateName !== null
|
||
) {
|
||
var componentName = Component.displayName || Component.name;
|
||
var newApiName =
|
||
typeof Component.getDerivedStateFromProps === 'function'
|
||
? 'getDerivedStateFromProps()'
|
||
: 'getSnapshotBeforeUpdate()';
|
||
|
||
throw Error(
|
||
'Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' +
|
||
componentName +
|
||
' uses ' +
|
||
newApiName +
|
||
' but also contains the following legacy lifecycles:' +
|
||
(foundWillMountName !== null ? '\n ' + foundWillMountName : '') +
|
||
(foundWillReceivePropsName !== null
|
||
? '\n ' + foundWillReceivePropsName
|
||
: '') +
|
||
(foundWillUpdateName !== null ? '\n ' + foundWillUpdateName : '') +
|
||
'\n\nThe above lifecycles should be removed. Learn more about this warning here:\n' +
|
||
'https://fb.me/react-async-component-lifecycle-hooks'
|
||
);
|
||
}
|
||
|
||
// React <= 16.2 does not support static getDerivedStateFromProps.
|
||
// As a workaround, use cWM and cWRP to invoke the new static lifecycle.
|
||
// Newer versions of React will ignore these lifecycles if gDSFP exists.
|
||
if (typeof Component.getDerivedStateFromProps === 'function') {
|
||
prototype.componentWillMount = componentWillMount;
|
||
prototype.componentWillReceiveProps = componentWillReceiveProps;
|
||
}
|
||
|
||
// React <= 16.2 does not support getSnapshotBeforeUpdate.
|
||
// As a workaround, use cWU to invoke the new lifecycle.
|
||
// Newer versions of React will ignore that lifecycle if gSBU exists.
|
||
if (typeof prototype.getSnapshotBeforeUpdate === 'function') {
|
||
if (typeof prototype.componentDidUpdate !== 'function') {
|
||
throw new Error(
|
||
'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'
|
||
);
|
||
}
|
||
|
||
prototype.componentWillUpdate = componentWillUpdate;
|
||
|
||
var componentDidUpdate = prototype.componentDidUpdate;
|
||
|
||
prototype.componentDidUpdate = function componentDidUpdatePolyfill(
|
||
prevProps,
|
||
prevState,
|
||
maybeSnapshot
|
||
) {
|
||
// 16.3+ will not execute our will-update method;
|
||
// It will pass a snapshot value to did-update though.
|
||
// Older versions will require our polyfilled will-update value.
|
||
// We need to handle both cases, but can't just check for the presence of "maybeSnapshot",
|
||
// Because for <= 15.x versions this might be a "prevContext" object.
|
||
// We also can't just check "__reactInternalSnapshot",
|
||
// Because get-snapshot might return a falsy value.
|
||
// So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.
|
||
var snapshot = this.__reactInternalSnapshotFlag
|
||
? this.__reactInternalSnapshot
|
||
: maybeSnapshot;
|
||
|
||
componentDidUpdate.call(this, prevProps, prevState, snapshot);
|
||
};
|
||
}
|
||
|
||
return Component;
|
||
}
|
||
|
||
|
||
|
||
|
||
/***/ }),
|
||
/* 19 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.classNamesShape = exports.timeoutsShape = void 0;
|
||
|
||
var _propTypes = _interopRequireDefault(__webpack_require__(1));
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var timeoutsShape = false ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
|
||
enter: _propTypes.default.number,
|
||
exit: _propTypes.default.number
|
||
}).isRequired]) : null;
|
||
exports.timeoutsShape = timeoutsShape;
|
||
var classNamesShape = false ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({
|
||
enter: _propTypes.default.string,
|
||
exit: _propTypes.default.string,
|
||
active: _propTypes.default.string
|
||
}), _propTypes.default.shape({
|
||
enter: _propTypes.default.string,
|
||
enterDone: _propTypes.default.string,
|
||
enterActive: _propTypes.default.string,
|
||
exit: _propTypes.default.string,
|
||
exitDone: _propTypes.default.string,
|
||
exitActive: _propTypes.default.string
|
||
})]) : null;
|
||
exports.classNamesShape = classNamesShape;
|
||
|
||
/***/ }),
|
||
/* 20 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.default = void 0;
|
||
|
||
var _propTypes = _interopRequireDefault(__webpack_require__(1));
|
||
|
||
var _react = _interopRequireDefault(__webpack_require__(0));
|
||
|
||
var _reactLifecyclesCompat = __webpack_require__(18);
|
||
|
||
var _ChildMapping = __webpack_require__(61);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
||
|
||
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
||
|
||
var values = Object.values || function (obj) {
|
||
return Object.keys(obj).map(function (k) {
|
||
return obj[k];
|
||
});
|
||
};
|
||
|
||
var defaultProps = {
|
||
component: 'div',
|
||
childFactory: function childFactory(child) {
|
||
return child;
|
||
}
|
||
/**
|
||
* The `<TransitionGroup>` component manages a set of transition components
|
||
* (`<Transition>` and `<CSSTransition>`) in a list. Like with the transition
|
||
* components, `<TransitionGroup>` is a state machine for managing the mounting
|
||
* and unmounting of components over time.
|
||
*
|
||
* Consider the example below. As items are removed or added to the TodoList the
|
||
* `in` prop is toggled automatically by the `<TransitionGroup>`.
|
||
*
|
||
* Note that `<TransitionGroup>` does not define any animation behavior!
|
||
* Exactly _how_ a list item animates is up to the individual transition
|
||
* component. This means you can mix and match animations across different list
|
||
* items.
|
||
*/
|
||
|
||
};
|
||
|
||
var TransitionGroup =
|
||
/*#__PURE__*/
|
||
function (_React$Component) {
|
||
_inheritsLoose(TransitionGroup, _React$Component);
|
||
|
||
function TransitionGroup(props, context) {
|
||
var _this;
|
||
|
||
_this = _React$Component.call(this, props, context) || this;
|
||
|
||
var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear
|
||
|
||
|
||
_this.state = {
|
||
handleExited: handleExited,
|
||
firstRender: true
|
||
};
|
||
return _this;
|
||
}
|
||
|
||
var _proto = TransitionGroup.prototype;
|
||
|
||
_proto.getChildContext = function getChildContext() {
|
||
return {
|
||
transitionGroup: {
|
||
isMounting: !this.appeared
|
||
}
|
||
};
|
||
};
|
||
|
||
_proto.componentDidMount = function componentDidMount() {
|
||
this.appeared = true;
|
||
this.mounted = true;
|
||
};
|
||
|
||
_proto.componentWillUnmount = function componentWillUnmount() {
|
||
this.mounted = false;
|
||
};
|
||
|
||
TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {
|
||
var prevChildMapping = _ref.children,
|
||
handleExited = _ref.handleExited,
|
||
firstRender = _ref.firstRender;
|
||
return {
|
||
children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),
|
||
firstRender: false
|
||
};
|
||
};
|
||
|
||
_proto.handleExited = function handleExited(child, node) {
|
||
var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);
|
||
if (child.key in currentChildMapping) return;
|
||
|
||
if (child.props.onExited) {
|
||
child.props.onExited(node);
|
||
}
|
||
|
||
if (this.mounted) {
|
||
this.setState(function (state) {
|
||
var children = _extends({}, state.children);
|
||
|
||
delete children[child.key];
|
||
return {
|
||
children: children
|
||
};
|
||
});
|
||
}
|
||
};
|
||
|
||
_proto.render = function render() {
|
||
var _this$props = this.props,
|
||
Component = _this$props.component,
|
||
childFactory = _this$props.childFactory,
|
||
props = _objectWithoutPropertiesLoose(_this$props, ["component", "childFactory"]);
|
||
|
||
var children = values(this.state.children).map(childFactory);
|
||
delete props.appear;
|
||
delete props.enter;
|
||
delete props.exit;
|
||
|
||
if (Component === null) {
|
||
return children;
|
||
}
|
||
|
||
return _react.default.createElement(Component, props, children);
|
||
};
|
||
|
||
return TransitionGroup;
|
||
}(_react.default.Component);
|
||
|
||
TransitionGroup.childContextTypes = {
|
||
transitionGroup: _propTypes.default.object.isRequired
|
||
};
|
||
TransitionGroup.propTypes = false ? {
|
||
/**
|
||
* `<TransitionGroup>` renders a `<div>` by default. You can change this
|
||
* behavior by providing a `component` prop.
|
||
* If you use React v16+ and would like to avoid a wrapping `<div>` element
|
||
* you can pass in `component={null}`. This is useful if the wrapping div
|
||
* borks your css styles.
|
||
*/
|
||
component: _propTypes.default.any,
|
||
|
||
/**
|
||
* A set of `<Transition>` components, that are toggled `in` and out as they
|
||
* leave. the `<TransitionGroup>` will inject specific transition props, so
|
||
* remember to spread them through if you are wrapping the `<Transition>` as
|
||
* with our `<Fade>` example.
|
||
*/
|
||
children: _propTypes.default.node,
|
||
|
||
/**
|
||
* A convenience prop that enables or disables appear animations
|
||
* for all children. Note that specifying this will override any defaults set
|
||
* on individual children Transitions.
|
||
*/
|
||
appear: _propTypes.default.bool,
|
||
|
||
/**
|
||
* A convenience prop that enables or disables enter animations
|
||
* for all children. Note that specifying this will override any defaults set
|
||
* on individual children Transitions.
|
||
*/
|
||
enter: _propTypes.default.bool,
|
||
|
||
/**
|
||
* A convenience prop that enables or disables exit animations
|
||
* for all children. Note that specifying this will override any defaults set
|
||
* on individual children Transitions.
|
||
*/
|
||
exit: _propTypes.default.bool,
|
||
|
||
/**
|
||
* You may need to apply reactive updates to a child as it is exiting.
|
||
* This is generally done by using `cloneElement` however in the case of an exiting
|
||
* child the element has already been removed and not accessible to the consumer.
|
||
*
|
||
* If you do need to update a child as it leaves you can provide a `childFactory`
|
||
* to wrap every child, even the ones that are leaving.
|
||
*
|
||
* @type Function(child: ReactElement) -> ReactElement
|
||
*/
|
||
childFactory: _propTypes.default.func
|
||
} : {};
|
||
TransitionGroup.defaultProps = defaultProps;
|
||
|
||
var _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);
|
||
|
||
exports.default = _default;
|
||
module.exports = exports["default"];
|
||
|
||
/***/ }),
|
||
/* 21 */
|
||
/***/ (function(module, exports) {
|
||
|
||
// Copyright Joyent, Inc. and other Node contributors.
|
||
//
|
||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||
// copy of this software and associated documentation files (the
|
||
// "Software"), to deal in the Software without restriction, including
|
||
// without limitation the rights to use, copy, modify, merge, publish,
|
||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||
// persons to whom the Software is furnished to do so, subject to the
|
||
// following conditions:
|
||
//
|
||
// The above copyright notice and this permission notice shall be included
|
||
// in all copies or substantial portions of the Software.
|
||
//
|
||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
||
function EventEmitter() {
|
||
this._events = this._events || {};
|
||
this._maxListeners = this._maxListeners || undefined;
|
||
}
|
||
module.exports = EventEmitter;
|
||
|
||
// Backwards-compat with node 0.10.x
|
||
EventEmitter.EventEmitter = EventEmitter;
|
||
|
||
EventEmitter.prototype._events = undefined;
|
||
EventEmitter.prototype._maxListeners = undefined;
|
||
|
||
// By default EventEmitters will print a warning if more than 10 listeners are
|
||
// added to it. This is a useful default which helps finding memory leaks.
|
||
EventEmitter.defaultMaxListeners = 10;
|
||
|
||
// Obviously not all Emitters should be limited to 10. This function allows
|
||
// that to be increased. Set to zero for unlimited.
|
||
EventEmitter.prototype.setMaxListeners = function(n) {
|
||
if (!isNumber(n) || n < 0 || isNaN(n))
|
||
throw TypeError('n must be a positive number');
|
||
this._maxListeners = n;
|
||
return this;
|
||
};
|
||
|
||
EventEmitter.prototype.emit = function(type) {
|
||
var er, handler, len, args, i, listeners;
|
||
|
||
if (!this._events)
|
||
this._events = {};
|
||
|
||
// If there is no 'error' event listener then throw.
|
||
if (type === 'error') {
|
||
if (!this._events.error ||
|
||
(isObject(this._events.error) && !this._events.error.length)) {
|
||
er = arguments[1];
|
||
if (er instanceof Error) {
|
||
throw er; // Unhandled 'error' event
|
||
} else {
|
||
// At least give some kind of context to the user
|
||
var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
|
||
err.context = er;
|
||
throw err;
|
||
}
|
||
}
|
||
}
|
||
|
||
handler = this._events[type];
|
||
|
||
if (isUndefined(handler))
|
||
return false;
|
||
|
||
if (isFunction(handler)) {
|
||
switch (arguments.length) {
|
||
// fast cases
|
||
case 1:
|
||
handler.call(this);
|
||
break;
|
||
case 2:
|
||
handler.call(this, arguments[1]);
|
||
break;
|
||
case 3:
|
||
handler.call(this, arguments[1], arguments[2]);
|
||
break;
|
||
// slower
|
||
default:
|
||
args = Array.prototype.slice.call(arguments, 1);
|
||
handler.apply(this, args);
|
||
}
|
||
} else if (isObject(handler)) {
|
||
args = Array.prototype.slice.call(arguments, 1);
|
||
listeners = handler.slice();
|
||
len = listeners.length;
|
||
for (i = 0; i < len; i++)
|
||
listeners[i].apply(this, args);
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
EventEmitter.prototype.addListener = function(type, listener) {
|
||
var m;
|
||
|
||
if (!isFunction(listener))
|
||
throw TypeError('listener must be a function');
|
||
|
||
if (!this._events)
|
||
this._events = {};
|
||
|
||
// To avoid recursion in the case that type === "newListener"! Before
|
||
// adding it to the listeners, first emit "newListener".
|
||
if (this._events.newListener)
|
||
this.emit('newListener', type,
|
||
isFunction(listener.listener) ?
|
||
listener.listener : listener);
|
||
|
||
if (!this._events[type])
|
||
// Optimize the case of one listener. Don't need the extra array object.
|
||
this._events[type] = listener;
|
||
else if (isObject(this._events[type]))
|
||
// If we've already got an array, just append.
|
||
this._events[type].push(listener);
|
||
else
|
||
// Adding the second element, need to change to array.
|
||
this._events[type] = [this._events[type], listener];
|
||
|
||
// Check for listener leak
|
||
if (isObject(this._events[type]) && !this._events[type].warned) {
|
||
if (!isUndefined(this._maxListeners)) {
|
||
m = this._maxListeners;
|
||
} else {
|
||
m = EventEmitter.defaultMaxListeners;
|
||
}
|
||
|
||
if (m && m > 0 && this._events[type].length > m) {
|
||
this._events[type].warned = true;
|
||
console.error('(node) warning: possible EventEmitter memory ' +
|
||
'leak detected. %d listeners added. ' +
|
||
'Use emitter.setMaxListeners() to increase limit.',
|
||
this._events[type].length);
|
||
if (typeof console.trace === 'function') {
|
||
// not supported in IE 10
|
||
console.trace();
|
||
}
|
||
}
|
||
}
|
||
|
||
return this;
|
||
};
|
||
|
||
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
||
|
||
EventEmitter.prototype.once = function(type, listener) {
|
||
if (!isFunction(listener))
|
||
throw TypeError('listener must be a function');
|
||
|
||
var fired = false;
|
||
|
||
function g() {
|
||
this.removeListener(type, g);
|
||
|
||
if (!fired) {
|
||
fired = true;
|
||
listener.apply(this, arguments);
|
||
}
|
||
}
|
||
|
||
g.listener = listener;
|
||
this.on(type, g);
|
||
|
||
return this;
|
||
};
|
||
|
||
// emits a 'removeListener' event iff the listener was removed
|
||
EventEmitter.prototype.removeListener = function(type, listener) {
|
||
var list, position, length, i;
|
||
|
||
if (!isFunction(listener))
|
||
throw TypeError('listener must be a function');
|
||
|
||
if (!this._events || !this._events[type])
|
||
return this;
|
||
|
||
list = this._events[type];
|
||
length = list.length;
|
||
position = -1;
|
||
|
||
if (list === listener ||
|
||
(isFunction(list.listener) && list.listener === listener)) {
|
||
delete this._events[type];
|
||
if (this._events.removeListener)
|
||
this.emit('removeListener', type, listener);
|
||
|
||
} else if (isObject(list)) {
|
||
for (i = length; i-- > 0;) {
|
||
if (list[i] === listener ||
|
||
(list[i].listener && list[i].listener === listener)) {
|
||
position = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (position < 0)
|
||
return this;
|
||
|
||
if (list.length === 1) {
|
||
list.length = 0;
|
||
delete this._events[type];
|
||
} else {
|
||
list.splice(position, 1);
|
||
}
|
||
|
||
if (this._events.removeListener)
|
||
this.emit('removeListener', type, listener);
|
||
}
|
||
|
||
return this;
|
||
};
|
||
|
||
EventEmitter.prototype.removeAllListeners = function(type) {
|
||
var key, listeners;
|
||
|
||
if (!this._events)
|
||
return this;
|
||
|
||
// not listening for removeListener, no need to emit
|
||
if (!this._events.removeListener) {
|
||
if (arguments.length === 0)
|
||
this._events = {};
|
||
else if (this._events[type])
|
||
delete this._events[type];
|
||
return this;
|
||
}
|
||
|
||
// emit removeListener for all listeners on all events
|
||
if (arguments.length === 0) {
|
||
for (key in this._events) {
|
||
if (key === 'removeListener') continue;
|
||
this.removeAllListeners(key);
|
||
}
|
||
this.removeAllListeners('removeListener');
|
||
this._events = {};
|
||
return this;
|
||
}
|
||
|
||
listeners = this._events[type];
|
||
|
||
if (isFunction(listeners)) {
|
||
this.removeListener(type, listeners);
|
||
} else if (listeners) {
|
||
// LIFO order
|
||
while (listeners.length)
|
||
this.removeListener(type, listeners[listeners.length - 1]);
|
||
}
|
||
delete this._events[type];
|
||
|
||
return this;
|
||
};
|
||
|
||
EventEmitter.prototype.listeners = function(type) {
|
||
var ret;
|
||
if (!this._events || !this._events[type])
|
||
ret = [];
|
||
else if (isFunction(this._events[type]))
|
||
ret = [this._events[type]];
|
||
else
|
||
ret = this._events[type].slice();
|
||
return ret;
|
||
};
|
||
|
||
EventEmitter.prototype.listenerCount = function(type) {
|
||
if (this._events) {
|
||
var evlistener = this._events[type];
|
||
|
||
if (isFunction(evlistener))
|
||
return 1;
|
||
else if (evlistener)
|
||
return evlistener.length;
|
||
}
|
||
return 0;
|
||
};
|
||
|
||
EventEmitter.listenerCount = function(emitter, type) {
|
||
return emitter.listenerCount(type);
|
||
};
|
||
|
||
function isFunction(arg) {
|
||
return typeof arg === 'function';
|
||
}
|
||
|
||
function isNumber(arg) {
|
||
return typeof arg === 'number';
|
||
}
|
||
|
||
function isObject(arg) {
|
||
return typeof arg === 'object' && arg !== null;
|
||
}
|
||
|
||
function isUndefined(arg) {
|
||
return arg === void 0;
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 22 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _bootstrapTable = __webpack_require__(23);
|
||
|
||
var _bootstrapTable2 = _interopRequireDefault(_bootstrapTable);
|
||
|
||
var _contexts = __webpack_require__(66);
|
||
|
||
var _contexts2 = _interopRequireDefault(_contexts);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = (0, _contexts2.default)(_bootstrapTable2.default);
|
||
|
||
/***/ }),
|
||
/* 23 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _header = __webpack_require__(26);
|
||
|
||
var _header2 = _interopRequireDefault(_header);
|
||
|
||
var _filters = __webpack_require__(41);
|
||
|
||
var _filters2 = _interopRequireDefault(_filters);
|
||
|
||
var _caption = __webpack_require__(43);
|
||
|
||
var _caption2 = _interopRequireDefault(_caption);
|
||
|
||
var _body = __webpack_require__(44);
|
||
|
||
var _body2 = _interopRequireDefault(_body);
|
||
|
||
var _footer = __webpack_require__(62);
|
||
|
||
var _footer2 = _interopRequireDefault(_footer);
|
||
|
||
var _propsResolver = __webpack_require__(64);
|
||
|
||
var _propsResolver2 = _interopRequireDefault(_propsResolver);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint camelcase: 0 */
|
||
/* eslint arrow-body-style: 0 */
|
||
|
||
var BootstrapTable = function (_PropsBaseResolver) {
|
||
_inherits(BootstrapTable, _PropsBaseResolver);
|
||
|
||
function BootstrapTable(props) {
|
||
_classCallCheck(this, BootstrapTable);
|
||
|
||
var _this = _possibleConstructorReturn(this, (BootstrapTable.__proto__ || Object.getPrototypeOf(BootstrapTable)).call(this, props));
|
||
|
||
_this.getData = function () {
|
||
return _this.visibleRows();
|
||
};
|
||
|
||
_this.validateProps();
|
||
return _this;
|
||
}
|
||
|
||
_createClass(BootstrapTable, [{
|
||
key: 'UNSAFE_componentWillReceiveProps',
|
||
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
||
if (nextProps.onDataSizeChange && !nextProps.pagination) {
|
||
if (nextProps.data.length !== this.props.data.length) {
|
||
nextProps.onDataSizeChange({ dataSize: nextProps.data.length });
|
||
}
|
||
}
|
||
}
|
||
|
||
// Exposed APIs
|
||
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
loading = _props.loading,
|
||
overlay = _props.overlay;
|
||
|
||
if (overlay) {
|
||
var LoadingOverlay = overlay(loading);
|
||
return _react2.default.createElement(
|
||
LoadingOverlay,
|
||
null,
|
||
this.renderTable()
|
||
);
|
||
}
|
||
return this.renderTable();
|
||
}
|
||
}, {
|
||
key: 'renderTable',
|
||
value: function renderTable() {
|
||
var _props2 = this.props,
|
||
columns = _props2.columns,
|
||
keyField = _props2.keyField,
|
||
tabIndexCell = _props2.tabIndexCell,
|
||
id = _props2.id,
|
||
classes = _props2.classes,
|
||
bootstrap4 = _props2.bootstrap4,
|
||
striped = _props2.striped,
|
||
hover = _props2.hover,
|
||
bordered = _props2.bordered,
|
||
condensed = _props2.condensed,
|
||
noDataIndication = _props2.noDataIndication,
|
||
caption = _props2.caption,
|
||
rowStyle = _props2.rowStyle,
|
||
rowClasses = _props2.rowClasses,
|
||
wrapperClasses = _props2.wrapperClasses,
|
||
rowEvents = _props2.rowEvents,
|
||
selectRow = _props2.selectRow,
|
||
expandRow = _props2.expandRow,
|
||
cellEdit = _props2.cellEdit,
|
||
filterPosition = _props2.filterPosition;
|
||
|
||
|
||
var tableWrapperClass = (0, _classnames2.default)('react-bootstrap-table', wrapperClasses);
|
||
|
||
var tableClass = (0, _classnames2.default)('table', _defineProperty({
|
||
'table-striped': striped,
|
||
'table-hover': hover,
|
||
'table-bordered': bordered
|
||
}, bootstrap4 ? 'table-sm' : 'table-condensed', condensed), classes);
|
||
|
||
var hasFilters = columns.some(function (col) {
|
||
return col.filter || col.filterRenderer;
|
||
});
|
||
|
||
var hasFooter = _utils2.default.filter(columns, function (col) {
|
||
return _utils2.default.has(col, 'footer');
|
||
}).length > 0;
|
||
|
||
var tableCaption = caption && _react2.default.createElement(
|
||
_caption2.default,
|
||
{ bootstrap4: bootstrap4 },
|
||
caption
|
||
);
|
||
|
||
return _react2.default.createElement(
|
||
'div',
|
||
{ className: tableWrapperClass },
|
||
_react2.default.createElement(
|
||
'table',
|
||
{ id: id, className: tableClass },
|
||
tableCaption,
|
||
_react2.default.createElement(_header2.default, {
|
||
columns: columns,
|
||
className: this.props.headerClasses,
|
||
wrapperClasses: this.props.headerWrapperClasses,
|
||
sortField: this.props.sortField,
|
||
sortOrder: this.props.sortOrder,
|
||
onSort: this.props.onSort,
|
||
globalSortCaret: this.props.sort && this.props.sort.sortCaret,
|
||
onFilter: this.props.onFilter,
|
||
currFilters: this.props.currFilters,
|
||
onExternalFilter: this.props.onExternalFilter,
|
||
selectRow: selectRow,
|
||
expandRow: expandRow,
|
||
filterPosition: filterPosition
|
||
}),
|
||
hasFilters && filterPosition !== _const2.default.FILTERS_POSITION_INLINE && _react2.default.createElement(_filters2.default, {
|
||
columns: columns,
|
||
className: this.props.filtersClasses,
|
||
onSort: this.props.onSort,
|
||
onFilter: this.props.onFilter,
|
||
currFilters: this.props.currFilters,
|
||
filterPosition: this.props.filterPosition,
|
||
onExternalFilter: this.props.onExternalFilter,
|
||
selectRow: selectRow,
|
||
expandRow: expandRow
|
||
}),
|
||
_react2.default.createElement(_body2.default, {
|
||
className: this.props.bodyClasses,
|
||
data: this.getData(),
|
||
keyField: keyField,
|
||
tabIndexCell: tabIndexCell,
|
||
columns: columns,
|
||
isEmpty: this.isEmpty(),
|
||
visibleColumnSize: this.visibleColumnSize(),
|
||
noDataIndication: noDataIndication,
|
||
cellEdit: cellEdit,
|
||
selectRow: selectRow,
|
||
expandRow: expandRow,
|
||
rowStyle: rowStyle,
|
||
rowClasses: rowClasses,
|
||
rowEvents: rowEvents
|
||
}),
|
||
hasFooter && _react2.default.createElement(_footer2.default, {
|
||
data: this.getData(),
|
||
columns: columns,
|
||
selectRow: selectRow,
|
||
expandRow: expandRow,
|
||
className: this.props.footerClasses
|
||
})
|
||
)
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return BootstrapTable;
|
||
}((0, _propsResolver2.default)(_react.Component));
|
||
|
||
BootstrapTable.propTypes = {
|
||
keyField: _propTypes2.default.string.isRequired,
|
||
data: _propTypes2.default.array.isRequired,
|
||
columns: _propTypes2.default.array.isRequired,
|
||
bootstrap4: _propTypes2.default.bool,
|
||
remote: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.shape({
|
||
pagination: _propTypes2.default.bool
|
||
})]),
|
||
noDataIndication: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]),
|
||
striped: _propTypes2.default.bool,
|
||
bordered: _propTypes2.default.bool,
|
||
hover: _propTypes2.default.bool,
|
||
tabIndexCell: _propTypes2.default.bool,
|
||
id: _propTypes2.default.string,
|
||
classes: _propTypes2.default.string,
|
||
headerClasses: _propTypes2.default.string,
|
||
bodyClasses: _propTypes2.default.string,
|
||
wrapperClasses: _propTypes2.default.string,
|
||
headerWrapperClasses: _propTypes2.default.string,
|
||
condensed: _propTypes2.default.bool,
|
||
caption: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.string]),
|
||
pagination: _propTypes2.default.object,
|
||
filter: _propTypes2.default.object,
|
||
cellEdit: _propTypes2.default.object,
|
||
selectRow: _propTypes2.default.shape({
|
||
mode: _propTypes2.default.oneOf([_const2.default.ROW_SELECT_SINGLE, _const2.default.ROW_SELECT_MULTIPLE, _const2.default.ROW_SELECT_DISABLED]).isRequired,
|
||
clickToSelect: _propTypes2.default.bool,
|
||
clickToExpand: _propTypes2.default.bool,
|
||
clickToEdit: _propTypes2.default.bool,
|
||
hideSelectAll: _propTypes2.default.bool,
|
||
onSelect: _propTypes2.default.func,
|
||
onSelectAll: _propTypes2.default.func,
|
||
style: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
classes: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
nonSelectable: _propTypes2.default.array,
|
||
nonSelectableStyle: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
nonSelectableClasses: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
bgColor: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
hideSelectColumn: _propTypes2.default.bool,
|
||
selectionRenderer: _propTypes2.default.func,
|
||
selectionHeaderRenderer: _propTypes2.default.func,
|
||
headerColumnStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
selectColumnStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
selectColumnPosition: _propTypes2.default.oneOf([_const2.default.INDICATOR_POSITION_LEFT, _const2.default.INDICATOR_POSITION_RIGHT])
|
||
}),
|
||
expandRow: _propTypes2.default.shape({
|
||
renderer: _propTypes2.default.func,
|
||
expanded: _propTypes2.default.array,
|
||
onExpand: _propTypes2.default.func,
|
||
onExpandAll: _propTypes2.default.func,
|
||
nonExpandable: _propTypes2.default.array,
|
||
showExpandColumn: _propTypes2.default.bool,
|
||
onlyOneExpanding: _propTypes2.default.bool,
|
||
expandByColumnOnly: _propTypes2.default.bool,
|
||
expandColumnRenderer: _propTypes2.default.func,
|
||
expandHeaderColumnRenderer: _propTypes2.default.func,
|
||
expandColumnPosition: _propTypes2.default.oneOf([_const2.default.INDICATOR_POSITION_LEFT, _const2.default.INDICATOR_POSITION_RIGHT]),
|
||
className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
parentClassName: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func])
|
||
}),
|
||
rowStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
rowEvents: _propTypes2.default.object,
|
||
rowClasses: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
filtersClasses: _propTypes2.default.string,
|
||
filterPosition: _propTypes2.default.oneOf([_const2.default.FILTERS_POSITION_TOP, _const2.default.FILTERS_POSITION_INLINE, _const2.default.FILTERS_POSITION_BOTTOM]),
|
||
footerClasses: _propTypes2.default.string,
|
||
defaultSorted: _propTypes2.default.arrayOf(_propTypes2.default.shape({
|
||
dataField: _propTypes2.default.string.isRequired,
|
||
order: _propTypes2.default.oneOf([_const2.default.SORT_DESC, _const2.default.SORT_ASC]).isRequired
|
||
})),
|
||
sort: _propTypes2.default.shape({
|
||
dataField: _propTypes2.default.string,
|
||
order: _propTypes2.default.oneOf([_const2.default.SORT_DESC, _const2.default.SORT_ASC]),
|
||
sortFunc: _propTypes2.default.func,
|
||
sortCaret: _propTypes2.default.func
|
||
}),
|
||
defaultSortDirection: _propTypes2.default.oneOf([_const2.default.SORT_DESC, _const2.default.SORT_ASC]),
|
||
overlay: _propTypes2.default.func,
|
||
onTableChange: _propTypes2.default.func,
|
||
onSort: _propTypes2.default.func,
|
||
onFilter: _propTypes2.default.func,
|
||
onExternalFilter: _propTypes2.default.func,
|
||
onDataSizeChange: _propTypes2.default.func,
|
||
// Inject from toolkit
|
||
search: _propTypes2.default.shape({
|
||
searchText: _propTypes2.default.string,
|
||
searchContext: _propTypes2.default.func
|
||
}),
|
||
setDependencyModules: _propTypes2.default.func
|
||
};
|
||
|
||
BootstrapTable.defaultProps = {
|
||
bootstrap4: false,
|
||
remote: false,
|
||
striped: false,
|
||
bordered: true,
|
||
hover: false,
|
||
condensed: false,
|
||
noDataIndication: null,
|
||
selectRow: {
|
||
mode: _const2.default.ROW_SELECT_DISABLED,
|
||
selected: [],
|
||
hideSelectColumn: true
|
||
},
|
||
expandRow: {
|
||
renderer: undefined,
|
||
expanded: [],
|
||
nonExpandable: []
|
||
},
|
||
cellEdit: {
|
||
mode: null,
|
||
nonEditableRows: []
|
||
},
|
||
filterPosition: _const2.default.FILTERS_POSITION_INLINE
|
||
};
|
||
|
||
exports.default = BootstrapTable;
|
||
|
||
/***/ }),
|
||
/* 24 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
/**
|
||
* Copyright (c) 2013-present, Facebook, Inc.
|
||
*
|
||
* This source code is licensed under the MIT license found in the
|
||
* LICENSE file in the root directory of this source tree.
|
||
*/
|
||
|
||
|
||
|
||
var ReactPropTypesSecret = __webpack_require__(25);
|
||
|
||
function emptyFunction() {}
|
||
function emptyFunctionWithReset() {}
|
||
emptyFunctionWithReset.resetWarningCache = emptyFunction;
|
||
|
||
module.exports = function() {
|
||
function shim(props, propName, componentName, location, propFullName, secret) {
|
||
if (secret === ReactPropTypesSecret) {
|
||
// It is still safe when called from React.
|
||
return;
|
||
}
|
||
var err = new Error(
|
||
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
||
'Use PropTypes.checkPropTypes() to call them. ' +
|
||
'Read more at http://fb.me/use-check-prop-types'
|
||
);
|
||
err.name = 'Invariant Violation';
|
||
throw err;
|
||
};
|
||
shim.isRequired = shim;
|
||
function getShim() {
|
||
return shim;
|
||
};
|
||
// Important!
|
||
// Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
|
||
var ReactPropTypes = {
|
||
array: shim,
|
||
bool: shim,
|
||
func: shim,
|
||
number: shim,
|
||
object: shim,
|
||
string: shim,
|
||
symbol: shim,
|
||
|
||
any: shim,
|
||
arrayOf: getShim,
|
||
element: shim,
|
||
elementType: shim,
|
||
instanceOf: getShim,
|
||
node: shim,
|
||
objectOf: getShim,
|
||
oneOf: getShim,
|
||
oneOfType: getShim,
|
||
shape: getShim,
|
||
exact: getShim,
|
||
|
||
checkPropTypes: emptyFunctionWithReset,
|
||
resetWarningCache: emptyFunction
|
||
};
|
||
|
||
ReactPropTypes.PropTypes = ReactPropTypes;
|
||
|
||
return ReactPropTypes;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 25 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
/**
|
||
* Copyright (c) 2013-present, Facebook, Inc.
|
||
*
|
||
* This source code is licensed under the MIT license found in the
|
||
* LICENSE file in the root directory of this source tree.
|
||
*/
|
||
|
||
|
||
|
||
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
||
|
||
module.exports = ReactPropTypesSecret;
|
||
|
||
|
||
/***/ }),
|
||
/* 26 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _headerCell = __webpack_require__(27);
|
||
|
||
var _headerCell2 = _interopRequireDefault(_headerCell);
|
||
|
||
var _selectionHeaderCell = __webpack_require__(33);
|
||
|
||
var _selectionHeaderCell2 = _interopRequireDefault(_selectionHeaderCell);
|
||
|
||
var _expandHeaderCell = __webpack_require__(34);
|
||
|
||
var _expandHeaderCell2 = _interopRequireDefault(_expandHeaderCell);
|
||
|
||
var _selectionHeaderCellConsumer = __webpack_require__(35);
|
||
|
||
var _selectionHeaderCellConsumer2 = _interopRequireDefault(_selectionHeaderCellConsumer);
|
||
|
||
var _expandHeaderCellConsumer = __webpack_require__(40);
|
||
|
||
var _expandHeaderCellConsumer2 = _interopRequireDefault(_expandHeaderCellConsumer);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
/* eslint react/require-default-props: 0 */
|
||
var Header = function Header(props) {
|
||
var className = props.className,
|
||
columns = props.columns,
|
||
onSort = props.onSort,
|
||
onFilter = props.onFilter,
|
||
sortField = props.sortField,
|
||
sortOrder = props.sortOrder,
|
||
selectRow = props.selectRow,
|
||
expandRow = props.expandRow,
|
||
currFilters = props.currFilters,
|
||
onExternalFilter = props.onExternalFilter,
|
||
filterPosition = props.filterPosition,
|
||
globalSortCaret = props.globalSortCaret,
|
||
wrapperClasses = props.wrapperClasses;
|
||
|
||
|
||
var SelectionHeaderCellComp = function SelectionHeaderCellComp() {
|
||
return null;
|
||
};
|
||
var ExpansionHeaderCellComp = function ExpansionHeaderCellComp() {
|
||
return null;
|
||
};
|
||
|
||
if (expandRow.showExpandColumn) {
|
||
ExpansionHeaderCellComp = (0, _expandHeaderCellConsumer2.default)(_expandHeaderCell2.default);
|
||
}
|
||
|
||
if (selectRow) {
|
||
SelectionHeaderCellComp = (0, _selectionHeaderCellConsumer2.default)(_selectionHeaderCell2.default);
|
||
}
|
||
|
||
var isRenderFunctionColumnInLeft = function isRenderFunctionColumnInLeft() {
|
||
var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _const2.default.INDICATOR_POSITION_LEFT;
|
||
return position === _const2.default.INDICATOR_POSITION_LEFT;
|
||
};
|
||
|
||
var childrens = [columns.map(function (column, i) {
|
||
var currSort = column.dataField === sortField;
|
||
var isLastSorting = column.dataField === sortField;
|
||
|
||
return _react2.default.createElement(_headerCell2.default, {
|
||
index: i,
|
||
key: column.dataField,
|
||
column: column,
|
||
onSort: onSort,
|
||
sorting: currSort,
|
||
sortOrder: sortOrder,
|
||
globalSortCaret: globalSortCaret,
|
||
isLastSorting: isLastSorting,
|
||
onFilter: onFilter,
|
||
currFilters: currFilters,
|
||
onExternalFilter: onExternalFilter,
|
||
filterPosition: filterPosition
|
||
});
|
||
})];
|
||
|
||
if (!selectRow.hideSelectColumn) {
|
||
if (isRenderFunctionColumnInLeft(selectRow.selectColumnPosition)) {
|
||
childrens.unshift(_react2.default.createElement(SelectionHeaderCellComp, { key: 'selection' }));
|
||
} else {
|
||
childrens.push(_react2.default.createElement(SelectionHeaderCellComp, { key: 'selection' }));
|
||
}
|
||
}
|
||
|
||
if (expandRow.showExpandColumn) {
|
||
if (isRenderFunctionColumnInLeft(expandRow.expandColumnPosition)) {
|
||
childrens.unshift(_react2.default.createElement(ExpansionHeaderCellComp, { key: 'expansion' }));
|
||
} else {
|
||
childrens.push(_react2.default.createElement(ExpansionHeaderCellComp, { key: 'expansion' }));
|
||
}
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'thead',
|
||
{ className: wrapperClasses },
|
||
_react2.default.createElement(
|
||
'tr',
|
||
{ className: className },
|
||
childrens
|
||
)
|
||
);
|
||
};
|
||
|
||
Header.propTypes = {
|
||
columns: _propTypes2.default.array.isRequired,
|
||
onSort: _propTypes2.default.func,
|
||
onFilter: _propTypes2.default.func,
|
||
sortField: _propTypes2.default.string,
|
||
sortOrder: _propTypes2.default.string,
|
||
selectRow: _propTypes2.default.object,
|
||
currFilters: _propTypes2.default.object,
|
||
onExternalFilter: _propTypes2.default.func,
|
||
globalSortCaret: _propTypes2.default.func,
|
||
className: _propTypes2.default.string,
|
||
wrapperClasses: _propTypes2.default.string,
|
||
expandRow: _propTypes2.default.object,
|
||
filterPosition: _propTypes2.default.oneOf([_const2.default.FILTERS_POSITION_TOP, _const2.default.FILTERS_POSITION_INLINE, _const2.default.FILTERS_POSITION_BOTTOM])
|
||
};
|
||
|
||
exports.default = Header;
|
||
|
||
/***/ }),
|
||
/* 27 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _symbol = __webpack_require__(28);
|
||
|
||
var _symbol2 = _interopRequireDefault(_symbol);
|
||
|
||
var _caret = __webpack_require__(29);
|
||
|
||
var _caret2 = _interopRequireDefault(_caret);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _cellEventDelegater = __webpack_require__(7);
|
||
|
||
var _cellEventDelegater2 = _interopRequireDefault(_cellEventDelegater);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/require-default-props: 0 */
|
||
|
||
|
||
var HeaderCell = function (_eventDelegater) {
|
||
_inherits(HeaderCell, _eventDelegater);
|
||
|
||
function HeaderCell() {
|
||
_classCallCheck(this, HeaderCell);
|
||
|
||
return _possibleConstructorReturn(this, (HeaderCell.__proto__ || Object.getPrototypeOf(HeaderCell)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(HeaderCell, [{
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
column = _props.column,
|
||
index = _props.index,
|
||
onSort = _props.onSort,
|
||
sorting = _props.sorting,
|
||
sortOrder = _props.sortOrder,
|
||
isLastSorting = _props.isLastSorting,
|
||
onFilter = _props.onFilter,
|
||
currFilters = _props.currFilters,
|
||
filterPosition = _props.filterPosition,
|
||
onExternalFilter = _props.onExternalFilter,
|
||
globalSortCaret = _props.globalSortCaret;
|
||
var text = column.text,
|
||
sort = column.sort,
|
||
sortCaret = column.sortCaret,
|
||
filter = column.filter,
|
||
filterRenderer = column.filterRenderer,
|
||
headerTitle = column.headerTitle,
|
||
headerAlign = column.headerAlign,
|
||
headerFormatter = column.headerFormatter,
|
||
headerEvents = column.headerEvents,
|
||
headerClasses = column.headerClasses,
|
||
headerStyle = column.headerStyle,
|
||
headerAttrs = column.headerAttrs,
|
||
headerSortingClasses = column.headerSortingClasses,
|
||
headerSortingStyle = column.headerSortingStyle;
|
||
|
||
|
||
var sortCaretfunc = sortCaret || globalSortCaret;
|
||
|
||
var delegateEvents = this.delegate(headerEvents);
|
||
|
||
var customAttrs = _utils2.default.isFunction(headerAttrs) ? headerAttrs(column, index) : headerAttrs || {};
|
||
|
||
var cellAttrs = _extends({}, customAttrs, delegateEvents, {
|
||
tabIndex: _utils2.default.isDefined(customAttrs.tabIndex) ? customAttrs.tabIndex : 0
|
||
});
|
||
|
||
var sortSymbol = void 0;
|
||
var filterElm = void 0;
|
||
var cellStyle = {};
|
||
var cellClasses = _utils2.default.isFunction(headerClasses) ? headerClasses(column, index) : headerClasses;
|
||
|
||
if (headerStyle) {
|
||
cellStyle = _utils2.default.isFunction(headerStyle) ? headerStyle(column, index) : headerStyle;
|
||
cellStyle = cellStyle ? _extends({}, cellStyle) : cellStyle;
|
||
}
|
||
|
||
if (headerTitle) {
|
||
cellAttrs.title = _utils2.default.isFunction(headerTitle) ? headerTitle(column, index) : text;
|
||
}
|
||
|
||
if (headerAlign) {
|
||
cellStyle.textAlign = _utils2.default.isFunction(headerAlign) ? headerAlign(column, index) : headerAlign;
|
||
}
|
||
|
||
if (sort) {
|
||
var customClick = cellAttrs.onClick;
|
||
cellAttrs['aria-label'] = sorting ? text + ' sort ' + sortOrder : text + ' sortable';
|
||
cellAttrs.onKeyUp = function (e) {
|
||
if (e.key === 'Enter') {
|
||
onSort(column);
|
||
if (_utils2.default.isFunction(customClick)) customClick(e);
|
||
}
|
||
};
|
||
cellAttrs.onClick = function (e) {
|
||
onSort(column);
|
||
if (_utils2.default.isFunction(customClick)) customClick(e);
|
||
};
|
||
cellAttrs.className = (0, _classnames2.default)(cellAttrs.className, 'sortable');
|
||
|
||
if (sorting) {
|
||
sortSymbol = sortCaretfunc ? sortCaretfunc(sortOrder, column) : _react2.default.createElement(_caret2.default, { order: sortOrder });
|
||
|
||
// append customized classes or style if table was sorting based on the current column.
|
||
cellClasses = (0, _classnames2.default)(cellClasses, _utils2.default.isFunction(headerSortingClasses) ? headerSortingClasses(column, sortOrder, isLastSorting, index) : headerSortingClasses);
|
||
|
||
cellStyle = _extends({}, cellStyle, _utils2.default.isFunction(headerSortingStyle) ? headerSortingStyle(column, sortOrder, isLastSorting, index) : headerSortingStyle);
|
||
} else {
|
||
sortSymbol = sortCaretfunc ? sortCaretfunc(undefined, column) : _react2.default.createElement(_symbol2.default, null);
|
||
}
|
||
}
|
||
|
||
if (cellClasses) cellAttrs.className = (0, _classnames2.default)(cellAttrs.className, cellClasses);
|
||
if (!_utils2.default.isEmptyObject(cellStyle)) cellAttrs.style = cellStyle;
|
||
|
||
if (filterPosition === _const2.default.FILTERS_POSITION_INLINE) {
|
||
if (filterRenderer) {
|
||
var onCustomFilter = onExternalFilter(column, filter.props.type);
|
||
filterElm = filterRenderer(onCustomFilter, column);
|
||
} else if (filter) {
|
||
filterElm = _react2.default.createElement(filter.Filter, _extends({}, filter.props, {
|
||
filterState: currFilters[column.dataField],
|
||
onFilter: onFilter,
|
||
column: column
|
||
}));
|
||
}
|
||
}
|
||
|
||
var children = headerFormatter ? headerFormatter(column, index, { sortElement: sortSymbol, filterElement: filterElm }) : text;
|
||
|
||
if (headerFormatter) {
|
||
return _react2.default.createElement('th', cellAttrs, children);
|
||
}
|
||
|
||
return _react2.default.createElement('th', cellAttrs, children, sortSymbol, filterElm);
|
||
}
|
||
}]);
|
||
|
||
return HeaderCell;
|
||
}((0, _cellEventDelegater2.default)(_react2.default.Component));
|
||
|
||
HeaderCell.propTypes = {
|
||
column: _propTypes2.default.shape({
|
||
dataField: _propTypes2.default.string.isRequired,
|
||
text: _propTypes2.default.string.isRequired,
|
||
type: _propTypes2.default.oneOf([_const2.default.TYPE_STRING, _const2.default.TYPE_NUMBER, _const2.default.TYPE_BOOLEAN, _const2.default.TYPE_DATE]),
|
||
isDummyField: _propTypes2.default.bool,
|
||
hidden: _propTypes2.default.bool,
|
||
headerFormatter: _propTypes2.default.func,
|
||
formatter: _propTypes2.default.func,
|
||
formatExtraData: _propTypes2.default.any,
|
||
headerClasses: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
classes: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
headerStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
style: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
headerTitle: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.func]),
|
||
title: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.func]),
|
||
headerEvents: _propTypes2.default.object,
|
||
events: _propTypes2.default.object,
|
||
headerAlign: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
align: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
headerAttrs: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
attrs: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
sort: _propTypes2.default.bool,
|
||
sortFunc: _propTypes2.default.func,
|
||
onSort: _propTypes2.default.func,
|
||
editor: _propTypes2.default.object,
|
||
editable: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.func]),
|
||
editCellStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
editCellClasses: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
editorStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func]),
|
||
editorClasses: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
||
editorRenderer: _propTypes2.default.func,
|
||
validator: _propTypes2.default.func,
|
||
filter: _propTypes2.default.object,
|
||
filterRenderer: _propTypes2.default.func,
|
||
filterValue: _propTypes2.default.func,
|
||
searchable: _propTypes2.default.bool
|
||
}).isRequired,
|
||
index: _propTypes2.default.number.isRequired,
|
||
onSort: _propTypes2.default.func,
|
||
sorting: _propTypes2.default.bool,
|
||
sortOrder: _propTypes2.default.oneOf([_const2.default.SORT_ASC, _const2.default.SORT_DESC]),
|
||
sortCaret: _propTypes2.default.func,
|
||
isLastSorting: _propTypes2.default.bool,
|
||
onFilter: _propTypes2.default.func,
|
||
filterPosition: _propTypes2.default.oneOf([_const2.default.FILTERS_POSITION_INLINE, _const2.default.FILTERS_POSITION_BOTTOM, _const2.default.FILTERS_POSITION_TOP]),
|
||
currFilters: _propTypes2.default.object,
|
||
onExternalFilter: _propTypes2.default.func
|
||
};
|
||
|
||
exports.default = HeaderCell;
|
||
|
||
/***/ }),
|
||
/* 28 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _bootstrap = __webpack_require__(5);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var SortSymbol = function SortSymbol() {
|
||
return _react2.default.createElement(
|
||
_bootstrap.BootstrapContext.Consumer,
|
||
null,
|
||
function (_ref) {
|
||
var bootstrap4 = _ref.bootstrap4;
|
||
return bootstrap4 ? _react2.default.createElement('span', { className: 'order-4' }) : _react2.default.createElement(
|
||
'span',
|
||
{ className: 'order' },
|
||
_react2.default.createElement(
|
||
'span',
|
||
{ className: 'dropdown' },
|
||
_react2.default.createElement('span', { className: 'caret' })
|
||
),
|
||
_react2.default.createElement(
|
||
'span',
|
||
{ className: 'dropup' },
|
||
_react2.default.createElement('span', { className: 'caret' })
|
||
)
|
||
);
|
||
}
|
||
);
|
||
};
|
||
|
||
exports.default = SortSymbol;
|
||
|
||
/***/ }),
|
||
/* 29 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _bootstrap = __webpack_require__(5);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var SortCaret = function SortCaret(_ref) {
|
||
var order = _ref.order;
|
||
|
||
var orderClass = (0, _classnames2.default)('react-bootstrap-table-sort-order', {
|
||
dropup: order === _const2.default.SORT_ASC
|
||
});
|
||
|
||
return _react2.default.createElement(
|
||
_bootstrap.BootstrapContext.Consumer,
|
||
null,
|
||
function (_ref2) {
|
||
var bootstrap4 = _ref2.bootstrap4;
|
||
return bootstrap4 ? _react2.default.createElement('span', { className: 'caret-4-' + order }) : _react2.default.createElement(
|
||
'span',
|
||
{ className: orderClass },
|
||
_react2.default.createElement('span', { className: 'caret' })
|
||
);
|
||
}
|
||
);
|
||
};
|
||
|
||
SortCaret.propTypes = {
|
||
order: _propTypes2.default.oneOf([_const2.default.SORT_ASC, _const2.default.SORT_DESC]).isRequired
|
||
};
|
||
|
||
exports.default = SortCaret;
|
||
|
||
/***/ }),
|
||
/* 30 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Underscore.js 1.9.1
|
||
// http://underscorejs.org
|
||
// (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||
// Underscore may be freely distributed under the MIT license.
|
||
|
||
(function() {
|
||
|
||
// Baseline setup
|
||
// --------------
|
||
|
||
// Establish the root object, `window` (`self`) in the browser, `global`
|
||
// on the server, or `this` in some virtual machines. We use `self`
|
||
// instead of `window` for `WebWorker` support.
|
||
var root = typeof self == 'object' && self.self === self && self ||
|
||
typeof global == 'object' && global.global === global && global ||
|
||
this ||
|
||
{};
|
||
|
||
// Save the previous value of the `_` variable.
|
||
var previousUnderscore = root._;
|
||
|
||
// Save bytes in the minified (but not gzipped) version:
|
||
var ArrayProto = Array.prototype, ObjProto = Object.prototype;
|
||
var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
|
||
|
||
// Create quick reference variables for speed access to core prototypes.
|
||
var push = ArrayProto.push,
|
||
slice = ArrayProto.slice,
|
||
toString = ObjProto.toString,
|
||
hasOwnProperty = ObjProto.hasOwnProperty;
|
||
|
||
// All **ECMAScript 5** native function implementations that we hope to use
|
||
// are declared here.
|
||
var nativeIsArray = Array.isArray,
|
||
nativeKeys = Object.keys,
|
||
nativeCreate = Object.create;
|
||
|
||
// Naked function reference for surrogate-prototype-swapping.
|
||
var Ctor = function(){};
|
||
|
||
// Create a safe reference to the Underscore object for use below.
|
||
var _ = function(obj) {
|
||
if (obj instanceof _) return obj;
|
||
if (!(this instanceof _)) return new _(obj);
|
||
this._wrapped = obj;
|
||
};
|
||
|
||
// Export the Underscore object for **Node.js**, with
|
||
// backwards-compatibility for their old module API. If we're in
|
||
// the browser, add `_` as a global object.
|
||
// (`nodeType` is checked to ensure that `module`
|
||
// and `exports` are not HTML elements.)
|
||
if (typeof exports != 'undefined' && !exports.nodeType) {
|
||
if (typeof module != 'undefined' && !module.nodeType && module.exports) {
|
||
exports = module.exports = _;
|
||
}
|
||
exports._ = _;
|
||
} else {
|
||
root._ = _;
|
||
}
|
||
|
||
// Current version.
|
||
_.VERSION = '1.9.1';
|
||
|
||
// Internal function that returns an efficient (for current engines) version
|
||
// of the passed-in callback, to be repeatedly applied in other Underscore
|
||
// functions.
|
||
var optimizeCb = function(func, context, argCount) {
|
||
if (context === void 0) return func;
|
||
switch (argCount == null ? 3 : argCount) {
|
||
case 1: return function(value) {
|
||
return func.call(context, value);
|
||
};
|
||
// The 2-argument case is omitted because we’re not using it.
|
||
case 3: return function(value, index, collection) {
|
||
return func.call(context, value, index, collection);
|
||
};
|
||
case 4: return function(accumulator, value, index, collection) {
|
||
return func.call(context, accumulator, value, index, collection);
|
||
};
|
||
}
|
||
return function() {
|
||
return func.apply(context, arguments);
|
||
};
|
||
};
|
||
|
||
var builtinIteratee;
|
||
|
||
// An internal function to generate callbacks that can be applied to each
|
||
// element in a collection, returning the desired result — either `identity`,
|
||
// an arbitrary callback, a property matcher, or a property accessor.
|
||
var cb = function(value, context, argCount) {
|
||
if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
|
||
if (value == null) return _.identity;
|
||
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
|
||
if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
|
||
return _.property(value);
|
||
};
|
||
|
||
// External wrapper for our callback generator. Users may customize
|
||
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
|
||
// This abstraction hides the internal-only argCount argument.
|
||
_.iteratee = builtinIteratee = function(value, context) {
|
||
return cb(value, context, Infinity);
|
||
};
|
||
|
||
// Some functions take a variable number of arguments, or a few expected
|
||
// arguments at the beginning and then a variable number of values to operate
|
||
// on. This helper accumulates all remaining arguments past the function’s
|
||
// argument length (or an explicit `startIndex`), into an array that becomes
|
||
// the last argument. Similar to ES6’s "rest parameter".
|
||
var restArguments = function(func, startIndex) {
|
||
startIndex = startIndex == null ? func.length - 1 : +startIndex;
|
||
return function() {
|
||
var length = Math.max(arguments.length - startIndex, 0),
|
||
rest = Array(length),
|
||
index = 0;
|
||
for (; index < length; index++) {
|
||
rest[index] = arguments[index + startIndex];
|
||
}
|
||
switch (startIndex) {
|
||
case 0: return func.call(this, rest);
|
||
case 1: return func.call(this, arguments[0], rest);
|
||
case 2: return func.call(this, arguments[0], arguments[1], rest);
|
||
}
|
||
var args = Array(startIndex + 1);
|
||
for (index = 0; index < startIndex; index++) {
|
||
args[index] = arguments[index];
|
||
}
|
||
args[startIndex] = rest;
|
||
return func.apply(this, args);
|
||
};
|
||
};
|
||
|
||
// An internal function for creating a new object that inherits from another.
|
||
var baseCreate = function(prototype) {
|
||
if (!_.isObject(prototype)) return {};
|
||
if (nativeCreate) return nativeCreate(prototype);
|
||
Ctor.prototype = prototype;
|
||
var result = new Ctor;
|
||
Ctor.prototype = null;
|
||
return result;
|
||
};
|
||
|
||
var shallowProperty = function(key) {
|
||
return function(obj) {
|
||
return obj == null ? void 0 : obj[key];
|
||
};
|
||
};
|
||
|
||
var has = function(obj, path) {
|
||
return obj != null && hasOwnProperty.call(obj, path);
|
||
}
|
||
|
||
var deepGet = function(obj, path) {
|
||
var length = path.length;
|
||
for (var i = 0; i < length; i++) {
|
||
if (obj == null) return void 0;
|
||
obj = obj[path[i]];
|
||
}
|
||
return length ? obj : void 0;
|
||
};
|
||
|
||
// Helper for collection methods to determine whether a collection
|
||
// should be iterated as an array or as an object.
|
||
// Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
|
||
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
|
||
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
|
||
var getLength = shallowProperty('length');
|
||
var isArrayLike = function(collection) {
|
||
var length = getLength(collection);
|
||
return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
|
||
};
|
||
|
||
// Collection Functions
|
||
// --------------------
|
||
|
||
// The cornerstone, an `each` implementation, aka `forEach`.
|
||
// Handles raw objects in addition to array-likes. Treats all
|
||
// sparse array-likes as if they were dense.
|
||
_.each = _.forEach = function(obj, iteratee, context) {
|
||
iteratee = optimizeCb(iteratee, context);
|
||
var i, length;
|
||
if (isArrayLike(obj)) {
|
||
for (i = 0, length = obj.length; i < length; i++) {
|
||
iteratee(obj[i], i, obj);
|
||
}
|
||
} else {
|
||
var keys = _.keys(obj);
|
||
for (i = 0, length = keys.length; i < length; i++) {
|
||
iteratee(obj[keys[i]], keys[i], obj);
|
||
}
|
||
}
|
||
return obj;
|
||
};
|
||
|
||
// Return the results of applying the iteratee to each element.
|
||
_.map = _.collect = function(obj, iteratee, context) {
|
||
iteratee = cb(iteratee, context);
|
||
var keys = !isArrayLike(obj) && _.keys(obj),
|
||
length = (keys || obj).length,
|
||
results = Array(length);
|
||
for (var index = 0; index < length; index++) {
|
||
var currentKey = keys ? keys[index] : index;
|
||
results[index] = iteratee(obj[currentKey], currentKey, obj);
|
||
}
|
||
return results;
|
||
};
|
||
|
||
// Create a reducing function iterating left or right.
|
||
var createReduce = function(dir) {
|
||
// Wrap code that reassigns argument variables in a separate function than
|
||
// the one that accesses `arguments.length` to avoid a perf hit. (#1991)
|
||
var reducer = function(obj, iteratee, memo, initial) {
|
||
var keys = !isArrayLike(obj) && _.keys(obj),
|
||
length = (keys || obj).length,
|
||
index = dir > 0 ? 0 : length - 1;
|
||
if (!initial) {
|
||
memo = obj[keys ? keys[index] : index];
|
||
index += dir;
|
||
}
|
||
for (; index >= 0 && index < length; index += dir) {
|
||
var currentKey = keys ? keys[index] : index;
|
||
memo = iteratee(memo, obj[currentKey], currentKey, obj);
|
||
}
|
||
return memo;
|
||
};
|
||
|
||
return function(obj, iteratee, memo, context) {
|
||
var initial = arguments.length >= 3;
|
||
return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
|
||
};
|
||
};
|
||
|
||
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
||
// or `foldl`.
|
||
_.reduce = _.foldl = _.inject = createReduce(1);
|
||
|
||
// The right-associative version of reduce, also known as `foldr`.
|
||
_.reduceRight = _.foldr = createReduce(-1);
|
||
|
||
// Return the first value which passes a truth test. Aliased as `detect`.
|
||
_.find = _.detect = function(obj, predicate, context) {
|
||
var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey;
|
||
var key = keyFinder(obj, predicate, context);
|
||
if (key !== void 0 && key !== -1) return obj[key];
|
||
};
|
||
|
||
// Return all the elements that pass a truth test.
|
||
// Aliased as `select`.
|
||
_.filter = _.select = function(obj, predicate, context) {
|
||
var results = [];
|
||
predicate = cb(predicate, context);
|
||
_.each(obj, function(value, index, list) {
|
||
if (predicate(value, index, list)) results.push(value);
|
||
});
|
||
return results;
|
||
};
|
||
|
||
// Return all the elements for which a truth test fails.
|
||
_.reject = function(obj, predicate, context) {
|
||
return _.filter(obj, _.negate(cb(predicate)), context);
|
||
};
|
||
|
||
// Determine whether all of the elements match a truth test.
|
||
// Aliased as `all`.
|
||
_.every = _.all = function(obj, predicate, context) {
|
||
predicate = cb(predicate, context);
|
||
var keys = !isArrayLike(obj) && _.keys(obj),
|
||
length = (keys || obj).length;
|
||
for (var index = 0; index < length; index++) {
|
||
var currentKey = keys ? keys[index] : index;
|
||
if (!predicate(obj[currentKey], currentKey, obj)) return false;
|
||
}
|
||
return true;
|
||
};
|
||
|
||
// Determine if at least one element in the object matches a truth test.
|
||
// Aliased as `any`.
|
||
_.some = _.any = function(obj, predicate, context) {
|
||
predicate = cb(predicate, context);
|
||
var keys = !isArrayLike(obj) && _.keys(obj),
|
||
length = (keys || obj).length;
|
||
for (var index = 0; index < length; index++) {
|
||
var currentKey = keys ? keys[index] : index;
|
||
if (predicate(obj[currentKey], currentKey, obj)) return true;
|
||
}
|
||
return false;
|
||
};
|
||
|
||
// Determine if the array or object contains a given item (using `===`).
|
||
// Aliased as `includes` and `include`.
|
||
_.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
|
||
if (!isArrayLike(obj)) obj = _.values(obj);
|
||
if (typeof fromIndex != 'number' || guard) fromIndex = 0;
|
||
return _.indexOf(obj, item, fromIndex) >= 0;
|
||
};
|
||
|
||
// Invoke a method (with arguments) on every item in a collection.
|
||
_.invoke = restArguments(function(obj, path, args) {
|
||
var contextPath, func;
|
||
if (_.isFunction(path)) {
|
||
func = path;
|
||
} else if (_.isArray(path)) {
|
||
contextPath = path.slice(0, -1);
|
||
path = path[path.length - 1];
|
||
}
|
||
return _.map(obj, function(context) {
|
||
var method = func;
|
||
if (!method) {
|
||
if (contextPath && contextPath.length) {
|
||
context = deepGet(context, contextPath);
|
||
}
|
||
if (context == null) return void 0;
|
||
method = context[path];
|
||
}
|
||
return method == null ? method : method.apply(context, args);
|
||
});
|
||
});
|
||
|
||
// Convenience version of a common use case of `map`: fetching a property.
|
||
_.pluck = function(obj, key) {
|
||
return _.map(obj, _.property(key));
|
||
};
|
||
|
||
// Convenience version of a common use case of `filter`: selecting only objects
|
||
// containing specific `key:value` pairs.
|
||
_.where = function(obj, attrs) {
|
||
return _.filter(obj, _.matcher(attrs));
|
||
};
|
||
|
||
// Convenience version of a common use case of `find`: getting the first object
|
||
// containing specific `key:value` pairs.
|
||
_.findWhere = function(obj, attrs) {
|
||
return _.find(obj, _.matcher(attrs));
|
||
};
|
||
|
||
// Return the maximum element (or element-based computation).
|
||
_.max = function(obj, iteratee, context) {
|
||
var result = -Infinity, lastComputed = -Infinity,
|
||
value, computed;
|
||
if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
|
||
obj = isArrayLike(obj) ? obj : _.values(obj);
|
||
for (var i = 0, length = obj.length; i < length; i++) {
|
||
value = obj[i];
|
||
if (value != null && value > result) {
|
||
result = value;
|
||
}
|
||
}
|
||
} else {
|
||
iteratee = cb(iteratee, context);
|
||
_.each(obj, function(v, index, list) {
|
||
computed = iteratee(v, index, list);
|
||
if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
|
||
result = v;
|
||
lastComputed = computed;
|
||
}
|
||
});
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Return the minimum element (or element-based computation).
|
||
_.min = function(obj, iteratee, context) {
|
||
var result = Infinity, lastComputed = Infinity,
|
||
value, computed;
|
||
if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
|
||
obj = isArrayLike(obj) ? obj : _.values(obj);
|
||
for (var i = 0, length = obj.length; i < length; i++) {
|
||
value = obj[i];
|
||
if (value != null && value < result) {
|
||
result = value;
|
||
}
|
||
}
|
||
} else {
|
||
iteratee = cb(iteratee, context);
|
||
_.each(obj, function(v, index, list) {
|
||
computed = iteratee(v, index, list);
|
||
if (computed < lastComputed || computed === Infinity && result === Infinity) {
|
||
result = v;
|
||
lastComputed = computed;
|
||
}
|
||
});
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Shuffle a collection.
|
||
_.shuffle = function(obj) {
|
||
return _.sample(obj, Infinity);
|
||
};
|
||
|
||
// Sample **n** random values from a collection using the modern version of the
|
||
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
|
||
// If **n** is not specified, returns a single random element.
|
||
// The internal `guard` argument allows it to work with `map`.
|
||
_.sample = function(obj, n, guard) {
|
||
if (n == null || guard) {
|
||
if (!isArrayLike(obj)) obj = _.values(obj);
|
||
return obj[_.random(obj.length - 1)];
|
||
}
|
||
var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj);
|
||
var length = getLength(sample);
|
||
n = Math.max(Math.min(n, length), 0);
|
||
var last = length - 1;
|
||
for (var index = 0; index < n; index++) {
|
||
var rand = _.random(index, last);
|
||
var temp = sample[index];
|
||
sample[index] = sample[rand];
|
||
sample[rand] = temp;
|
||
}
|
||
return sample.slice(0, n);
|
||
};
|
||
|
||
// Sort the object's values by a criterion produced by an iteratee.
|
||
_.sortBy = function(obj, iteratee, context) {
|
||
var index = 0;
|
||
iteratee = cb(iteratee, context);
|
||
return _.pluck(_.map(obj, function(value, key, list) {
|
||
return {
|
||
value: value,
|
||
index: index++,
|
||
criteria: iteratee(value, key, list)
|
||
};
|
||
}).sort(function(left, right) {
|
||
var a = left.criteria;
|
||
var b = right.criteria;
|
||
if (a !== b) {
|
||
if (a > b || a === void 0) return 1;
|
||
if (a < b || b === void 0) return -1;
|
||
}
|
||
return left.index - right.index;
|
||
}), 'value');
|
||
};
|
||
|
||
// An internal function used for aggregate "group by" operations.
|
||
var group = function(behavior, partition) {
|
||
return function(obj, iteratee, context) {
|
||
var result = partition ? [[], []] : {};
|
||
iteratee = cb(iteratee, context);
|
||
_.each(obj, function(value, index) {
|
||
var key = iteratee(value, index, obj);
|
||
behavior(result, value, key);
|
||
});
|
||
return result;
|
||
};
|
||
};
|
||
|
||
// Groups the object's values by a criterion. Pass either a string attribute
|
||
// to group by, or a function that returns the criterion.
|
||
_.groupBy = group(function(result, value, key) {
|
||
if (has(result, key)) result[key].push(value); else result[key] = [value];
|
||
});
|
||
|
||
// Indexes the object's values by a criterion, similar to `groupBy`, but for
|
||
// when you know that your index values will be unique.
|
||
_.indexBy = group(function(result, value, key) {
|
||
result[key] = value;
|
||
});
|
||
|
||
// Counts instances of an object that group by a certain criterion. Pass
|
||
// either a string attribute to count by, or a function that returns the
|
||
// criterion.
|
||
_.countBy = group(function(result, value, key) {
|
||
if (has(result, key)) result[key]++; else result[key] = 1;
|
||
});
|
||
|
||
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
|
||
// Safely create a real, live array from anything iterable.
|
||
_.toArray = function(obj) {
|
||
if (!obj) return [];
|
||
if (_.isArray(obj)) return slice.call(obj);
|
||
if (_.isString(obj)) {
|
||
// Keep surrogate pair characters together
|
||
return obj.match(reStrSymbol);
|
||
}
|
||
if (isArrayLike(obj)) return _.map(obj, _.identity);
|
||
return _.values(obj);
|
||
};
|
||
|
||
// Return the number of elements in an object.
|
||
_.size = function(obj) {
|
||
if (obj == null) return 0;
|
||
return isArrayLike(obj) ? obj.length : _.keys(obj).length;
|
||
};
|
||
|
||
// Split a collection into two arrays: one whose elements all satisfy the given
|
||
// predicate, and one whose elements all do not satisfy the predicate.
|
||
_.partition = group(function(result, value, pass) {
|
||
result[pass ? 0 : 1].push(value);
|
||
}, true);
|
||
|
||
// Array Functions
|
||
// ---------------
|
||
|
||
// Get the first element of an array. Passing **n** will return the first N
|
||
// values in the array. Aliased as `head` and `take`. The **guard** check
|
||
// allows it to work with `_.map`.
|
||
_.first = _.head = _.take = function(array, n, guard) {
|
||
if (array == null || array.length < 1) return n == null ? void 0 : [];
|
||
if (n == null || guard) return array[0];
|
||
return _.initial(array, array.length - n);
|
||
};
|
||
|
||
// Returns everything but the last entry of the array. Especially useful on
|
||
// the arguments object. Passing **n** will return all the values in
|
||
// the array, excluding the last N.
|
||
_.initial = function(array, n, guard) {
|
||
return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
|
||
};
|
||
|
||
// Get the last element of an array. Passing **n** will return the last N
|
||
// values in the array.
|
||
_.last = function(array, n, guard) {
|
||
if (array == null || array.length < 1) return n == null ? void 0 : [];
|
||
if (n == null || guard) return array[array.length - 1];
|
||
return _.rest(array, Math.max(0, array.length - n));
|
||
};
|
||
|
||
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
|
||
// Especially useful on the arguments object. Passing an **n** will return
|
||
// the rest N values in the array.
|
||
_.rest = _.tail = _.drop = function(array, n, guard) {
|
||
return slice.call(array, n == null || guard ? 1 : n);
|
||
};
|
||
|
||
// Trim out all falsy values from an array.
|
||
_.compact = function(array) {
|
||
return _.filter(array, Boolean);
|
||
};
|
||
|
||
// Internal implementation of a recursive `flatten` function.
|
||
var flatten = function(input, shallow, strict, output) {
|
||
output = output || [];
|
||
var idx = output.length;
|
||
for (var i = 0, length = getLength(input); i < length; i++) {
|
||
var value = input[i];
|
||
if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
|
||
// Flatten current level of array or arguments object.
|
||
if (shallow) {
|
||
var j = 0, len = value.length;
|
||
while (j < len) output[idx++] = value[j++];
|
||
} else {
|
||
flatten(value, shallow, strict, output);
|
||
idx = output.length;
|
||
}
|
||
} else if (!strict) {
|
||
output[idx++] = value;
|
||
}
|
||
}
|
||
return output;
|
||
};
|
||
|
||
// Flatten out an array, either recursively (by default), or just one level.
|
||
_.flatten = function(array, shallow) {
|
||
return flatten(array, shallow, false);
|
||
};
|
||
|
||
// Return a version of the array that does not contain the specified value(s).
|
||
_.without = restArguments(function(array, otherArrays) {
|
||
return _.difference(array, otherArrays);
|
||
});
|
||
|
||
// Produce a duplicate-free version of the array. If the array has already
|
||
// been sorted, you have the option of using a faster algorithm.
|
||
// The faster algorithm will not work with an iteratee if the iteratee
|
||
// is not a one-to-one function, so providing an iteratee will disable
|
||
// the faster algorithm.
|
||
// Aliased as `unique`.
|
||
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
|
||
if (!_.isBoolean(isSorted)) {
|
||
context = iteratee;
|
||
iteratee = isSorted;
|
||
isSorted = false;
|
||
}
|
||
if (iteratee != null) iteratee = cb(iteratee, context);
|
||
var result = [];
|
||
var seen = [];
|
||
for (var i = 0, length = getLength(array); i < length; i++) {
|
||
var value = array[i],
|
||
computed = iteratee ? iteratee(value, i, array) : value;
|
||
if (isSorted && !iteratee) {
|
||
if (!i || seen !== computed) result.push(value);
|
||
seen = computed;
|
||
} else if (iteratee) {
|
||
if (!_.contains(seen, computed)) {
|
||
seen.push(computed);
|
||
result.push(value);
|
||
}
|
||
} else if (!_.contains(result, value)) {
|
||
result.push(value);
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Produce an array that contains the union: each distinct element from all of
|
||
// the passed-in arrays.
|
||
_.union = restArguments(function(arrays) {
|
||
return _.uniq(flatten(arrays, true, true));
|
||
});
|
||
|
||
// Produce an array that contains every item shared between all the
|
||
// passed-in arrays.
|
||
_.intersection = function(array) {
|
||
var result = [];
|
||
var argsLength = arguments.length;
|
||
for (var i = 0, length = getLength(array); i < length; i++) {
|
||
var item = array[i];
|
||
if (_.contains(result, item)) continue;
|
||
var j;
|
||
for (j = 1; j < argsLength; j++) {
|
||
if (!_.contains(arguments[j], item)) break;
|
||
}
|
||
if (j === argsLength) result.push(item);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Take the difference between one array and a number of other arrays.
|
||
// Only the elements present in just the first array will remain.
|
||
_.difference = restArguments(function(array, rest) {
|
||
rest = flatten(rest, true, true);
|
||
return _.filter(array, function(value){
|
||
return !_.contains(rest, value);
|
||
});
|
||
});
|
||
|
||
// Complement of _.zip. Unzip accepts an array of arrays and groups
|
||
// each array's elements on shared indices.
|
||
_.unzip = function(array) {
|
||
var length = array && _.max(array, getLength).length || 0;
|
||
var result = Array(length);
|
||
|
||
for (var index = 0; index < length; index++) {
|
||
result[index] = _.pluck(array, index);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Zip together multiple lists into a single array -- elements that share
|
||
// an index go together.
|
||
_.zip = restArguments(_.unzip);
|
||
|
||
// Converts lists into objects. Pass either a single array of `[key, value]`
|
||
// pairs, or two parallel arrays of the same length -- one of keys, and one of
|
||
// the corresponding values. Passing by pairs is the reverse of _.pairs.
|
||
_.object = function(list, values) {
|
||
var result = {};
|
||
for (var i = 0, length = getLength(list); i < length; i++) {
|
||
if (values) {
|
||
result[list[i]] = values[i];
|
||
} else {
|
||
result[list[i][0]] = list[i][1];
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Generator function to create the findIndex and findLastIndex functions.
|
||
var createPredicateIndexFinder = function(dir) {
|
||
return function(array, predicate, context) {
|
||
predicate = cb(predicate, context);
|
||
var length = getLength(array);
|
||
var index = dir > 0 ? 0 : length - 1;
|
||
for (; index >= 0 && index < length; index += dir) {
|
||
if (predicate(array[index], index, array)) return index;
|
||
}
|
||
return -1;
|
||
};
|
||
};
|
||
|
||
// Returns the first index on an array-like that passes a predicate test.
|
||
_.findIndex = createPredicateIndexFinder(1);
|
||
_.findLastIndex = createPredicateIndexFinder(-1);
|
||
|
||
// Use a comparator function to figure out the smallest index at which
|
||
// an object should be inserted so as to maintain order. Uses binary search.
|
||
_.sortedIndex = function(array, obj, iteratee, context) {
|
||
iteratee = cb(iteratee, context, 1);
|
||
var value = iteratee(obj);
|
||
var low = 0, high = getLength(array);
|
||
while (low < high) {
|
||
var mid = Math.floor((low + high) / 2);
|
||
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
|
||
}
|
||
return low;
|
||
};
|
||
|
||
// Generator function to create the indexOf and lastIndexOf functions.
|
||
var createIndexFinder = function(dir, predicateFind, sortedIndex) {
|
||
return function(array, item, idx) {
|
||
var i = 0, length = getLength(array);
|
||
if (typeof idx == 'number') {
|
||
if (dir > 0) {
|
||
i = idx >= 0 ? idx : Math.max(idx + length, i);
|
||
} else {
|
||
length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
|
||
}
|
||
} else if (sortedIndex && idx && length) {
|
||
idx = sortedIndex(array, item);
|
||
return array[idx] === item ? idx : -1;
|
||
}
|
||
if (item !== item) {
|
||
idx = predicateFind(slice.call(array, i, length), _.isNaN);
|
||
return idx >= 0 ? idx + i : -1;
|
||
}
|
||
for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
|
||
if (array[idx] === item) return idx;
|
||
}
|
||
return -1;
|
||
};
|
||
};
|
||
|
||
// Return the position of the first occurrence of an item in an array,
|
||
// or -1 if the item is not included in the array.
|
||
// If the array is large and already in sort order, pass `true`
|
||
// for **isSorted** to use binary search.
|
||
_.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
|
||
_.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
|
||
|
||
// Generate an integer Array containing an arithmetic progression. A port of
|
||
// the native Python `range()` function. See
|
||
// [the Python documentation](http://docs.python.org/library/functions.html#range).
|
||
_.range = function(start, stop, step) {
|
||
if (stop == null) {
|
||
stop = start || 0;
|
||
start = 0;
|
||
}
|
||
if (!step) {
|
||
step = stop < start ? -1 : 1;
|
||
}
|
||
|
||
var length = Math.max(Math.ceil((stop - start) / step), 0);
|
||
var range = Array(length);
|
||
|
||
for (var idx = 0; idx < length; idx++, start += step) {
|
||
range[idx] = start;
|
||
}
|
||
|
||
return range;
|
||
};
|
||
|
||
// Chunk a single array into multiple arrays, each containing `count` or fewer
|
||
// items.
|
||
_.chunk = function(array, count) {
|
||
if (count == null || count < 1) return [];
|
||
var result = [];
|
||
var i = 0, length = array.length;
|
||
while (i < length) {
|
||
result.push(slice.call(array, i, i += count));
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Function (ahem) Functions
|
||
// ------------------
|
||
|
||
// Determines whether to execute a function as a constructor
|
||
// or a normal function with the provided arguments.
|
||
var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
|
||
if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
|
||
var self = baseCreate(sourceFunc.prototype);
|
||
var result = sourceFunc.apply(self, args);
|
||
if (_.isObject(result)) return result;
|
||
return self;
|
||
};
|
||
|
||
// Create a function bound to a given object (assigning `this`, and arguments,
|
||
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
|
||
// available.
|
||
_.bind = restArguments(function(func, context, args) {
|
||
if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
|
||
var bound = restArguments(function(callArgs) {
|
||
return executeBound(func, bound, context, this, args.concat(callArgs));
|
||
});
|
||
return bound;
|
||
});
|
||
|
||
// Partially apply a function by creating a version that has had some of its
|
||
// arguments pre-filled, without changing its dynamic `this` context. _ acts
|
||
// as a placeholder by default, allowing any combination of arguments to be
|
||
// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
|
||
_.partial = restArguments(function(func, boundArgs) {
|
||
var placeholder = _.partial.placeholder;
|
||
var bound = function() {
|
||
var position = 0, length = boundArgs.length;
|
||
var args = Array(length);
|
||
for (var i = 0; i < length; i++) {
|
||
args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
|
||
}
|
||
while (position < arguments.length) args.push(arguments[position++]);
|
||
return executeBound(func, bound, this, this, args);
|
||
};
|
||
return bound;
|
||
});
|
||
|
||
_.partial.placeholder = _;
|
||
|
||
// Bind a number of an object's methods to that object. Remaining arguments
|
||
// are the method names to be bound. Useful for ensuring that all callbacks
|
||
// defined on an object belong to it.
|
||
_.bindAll = restArguments(function(obj, keys) {
|
||
keys = flatten(keys, false, false);
|
||
var index = keys.length;
|
||
if (index < 1) throw new Error('bindAll must be passed function names');
|
||
while (index--) {
|
||
var key = keys[index];
|
||
obj[key] = _.bind(obj[key], obj);
|
||
}
|
||
});
|
||
|
||
// Memoize an expensive function by storing its results.
|
||
_.memoize = function(func, hasher) {
|
||
var memoize = function(key) {
|
||
var cache = memoize.cache;
|
||
var address = '' + (hasher ? hasher.apply(this, arguments) : key);
|
||
if (!has(cache, address)) cache[address] = func.apply(this, arguments);
|
||
return cache[address];
|
||
};
|
||
memoize.cache = {};
|
||
return memoize;
|
||
};
|
||
|
||
// Delays a function for the given number of milliseconds, and then calls
|
||
// it with the arguments supplied.
|
||
_.delay = restArguments(function(func, wait, args) {
|
||
return setTimeout(function() {
|
||
return func.apply(null, args);
|
||
}, wait);
|
||
});
|
||
|
||
// Defers a function, scheduling it to run after the current call stack has
|
||
// cleared.
|
||
_.defer = _.partial(_.delay, _, 1);
|
||
|
||
// Returns a function, that, when invoked, will only be triggered at most once
|
||
// during a given window of time. Normally, the throttled function will run
|
||
// as much as it can, without ever going more than once per `wait` duration;
|
||
// but if you'd like to disable the execution on the leading edge, pass
|
||
// `{leading: false}`. To disable execution on the trailing edge, ditto.
|
||
_.throttle = function(func, wait, options) {
|
||
var timeout, context, args, result;
|
||
var previous = 0;
|
||
if (!options) options = {};
|
||
|
||
var later = function() {
|
||
previous = options.leading === false ? 0 : _.now();
|
||
timeout = null;
|
||
result = func.apply(context, args);
|
||
if (!timeout) context = args = null;
|
||
};
|
||
|
||
var throttled = function() {
|
||
var now = _.now();
|
||
if (!previous && options.leading === false) previous = now;
|
||
var remaining = wait - (now - previous);
|
||
context = this;
|
||
args = arguments;
|
||
if (remaining <= 0 || remaining > wait) {
|
||
if (timeout) {
|
||
clearTimeout(timeout);
|
||
timeout = null;
|
||
}
|
||
previous = now;
|
||
result = func.apply(context, args);
|
||
if (!timeout) context = args = null;
|
||
} else if (!timeout && options.trailing !== false) {
|
||
timeout = setTimeout(later, remaining);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
throttled.cancel = function() {
|
||
clearTimeout(timeout);
|
||
previous = 0;
|
||
timeout = context = args = null;
|
||
};
|
||
|
||
return throttled;
|
||
};
|
||
|
||
// Returns a function, that, as long as it continues to be invoked, will not
|
||
// be triggered. The function will be called after it stops being called for
|
||
// N milliseconds. If `immediate` is passed, trigger the function on the
|
||
// leading edge, instead of the trailing.
|
||
_.debounce = function(func, wait, immediate) {
|
||
var timeout, result;
|
||
|
||
var later = function(context, args) {
|
||
timeout = null;
|
||
if (args) result = func.apply(context, args);
|
||
};
|
||
|
||
var debounced = restArguments(function(args) {
|
||
if (timeout) clearTimeout(timeout);
|
||
if (immediate) {
|
||
var callNow = !timeout;
|
||
timeout = setTimeout(later, wait);
|
||
if (callNow) result = func.apply(this, args);
|
||
} else {
|
||
timeout = _.delay(later, wait, this, args);
|
||
}
|
||
|
||
return result;
|
||
});
|
||
|
||
debounced.cancel = function() {
|
||
clearTimeout(timeout);
|
||
timeout = null;
|
||
};
|
||
|
||
return debounced;
|
||
};
|
||
|
||
// Returns the first function passed as an argument to the second,
|
||
// allowing you to adjust arguments, run code before and after, and
|
||
// conditionally execute the original function.
|
||
_.wrap = function(func, wrapper) {
|
||
return _.partial(wrapper, func);
|
||
};
|
||
|
||
// Returns a negated version of the passed-in predicate.
|
||
_.negate = function(predicate) {
|
||
return function() {
|
||
return !predicate.apply(this, arguments);
|
||
};
|
||
};
|
||
|
||
// Returns a function that is the composition of a list of functions, each
|
||
// consuming the return value of the function that follows.
|
||
_.compose = function() {
|
||
var args = arguments;
|
||
var start = args.length - 1;
|
||
return function() {
|
||
var i = start;
|
||
var result = args[start].apply(this, arguments);
|
||
while (i--) result = args[i].call(this, result);
|
||
return result;
|
||
};
|
||
};
|
||
|
||
// Returns a function that will only be executed on and after the Nth call.
|
||
_.after = function(times, func) {
|
||
return function() {
|
||
if (--times < 1) {
|
||
return func.apply(this, arguments);
|
||
}
|
||
};
|
||
};
|
||
|
||
// Returns a function that will only be executed up to (but not including) the Nth call.
|
||
_.before = function(times, func) {
|
||
var memo;
|
||
return function() {
|
||
if (--times > 0) {
|
||
memo = func.apply(this, arguments);
|
||
}
|
||
if (times <= 1) func = null;
|
||
return memo;
|
||
};
|
||
};
|
||
|
||
// Returns a function that will be executed at most one time, no matter how
|
||
// often you call it. Useful for lazy initialization.
|
||
_.once = _.partial(_.before, 2);
|
||
|
||
_.restArguments = restArguments;
|
||
|
||
// Object Functions
|
||
// ----------------
|
||
|
||
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
|
||
var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
|
||
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
|
||
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
|
||
|
||
var collectNonEnumProps = function(obj, keys) {
|
||
var nonEnumIdx = nonEnumerableProps.length;
|
||
var constructor = obj.constructor;
|
||
var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;
|
||
|
||
// Constructor is a special case.
|
||
var prop = 'constructor';
|
||
if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
|
||
|
||
while (nonEnumIdx--) {
|
||
prop = nonEnumerableProps[nonEnumIdx];
|
||
if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
|
||
keys.push(prop);
|
||
}
|
||
}
|
||
};
|
||
|
||
// Retrieve the names of an object's own properties.
|
||
// Delegates to **ECMAScript 5**'s native `Object.keys`.
|
||
_.keys = function(obj) {
|
||
if (!_.isObject(obj)) return [];
|
||
if (nativeKeys) return nativeKeys(obj);
|
||
var keys = [];
|
||
for (var key in obj) if (has(obj, key)) keys.push(key);
|
||
// Ahem, IE < 9.
|
||
if (hasEnumBug) collectNonEnumProps(obj, keys);
|
||
return keys;
|
||
};
|
||
|
||
// Retrieve all the property names of an object.
|
||
_.allKeys = function(obj) {
|
||
if (!_.isObject(obj)) return [];
|
||
var keys = [];
|
||
for (var key in obj) keys.push(key);
|
||
// Ahem, IE < 9.
|
||
if (hasEnumBug) collectNonEnumProps(obj, keys);
|
||
return keys;
|
||
};
|
||
|
||
// Retrieve the values of an object's properties.
|
||
_.values = function(obj) {
|
||
var keys = _.keys(obj);
|
||
var length = keys.length;
|
||
var values = Array(length);
|
||
for (var i = 0; i < length; i++) {
|
||
values[i] = obj[keys[i]];
|
||
}
|
||
return values;
|
||
};
|
||
|
||
// Returns the results of applying the iteratee to each element of the object.
|
||
// In contrast to _.map it returns an object.
|
||
_.mapObject = function(obj, iteratee, context) {
|
||
iteratee = cb(iteratee, context);
|
||
var keys = _.keys(obj),
|
||
length = keys.length,
|
||
results = {};
|
||
for (var index = 0; index < length; index++) {
|
||
var currentKey = keys[index];
|
||
results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
|
||
}
|
||
return results;
|
||
};
|
||
|
||
// Convert an object into a list of `[key, value]` pairs.
|
||
// The opposite of _.object.
|
||
_.pairs = function(obj) {
|
||
var keys = _.keys(obj);
|
||
var length = keys.length;
|
||
var pairs = Array(length);
|
||
for (var i = 0; i < length; i++) {
|
||
pairs[i] = [keys[i], obj[keys[i]]];
|
||
}
|
||
return pairs;
|
||
};
|
||
|
||
// Invert the keys and values of an object. The values must be serializable.
|
||
_.invert = function(obj) {
|
||
var result = {};
|
||
var keys = _.keys(obj);
|
||
for (var i = 0, length = keys.length; i < length; i++) {
|
||
result[obj[keys[i]]] = keys[i];
|
||
}
|
||
return result;
|
||
};
|
||
|
||
// Return a sorted list of the function names available on the object.
|
||
// Aliased as `methods`.
|
||
_.functions = _.methods = function(obj) {
|
||
var names = [];
|
||
for (var key in obj) {
|
||
if (_.isFunction(obj[key])) names.push(key);
|
||
}
|
||
return names.sort();
|
||
};
|
||
|
||
// An internal function for creating assigner functions.
|
||
var createAssigner = function(keysFunc, defaults) {
|
||
return function(obj) {
|
||
var length = arguments.length;
|
||
if (defaults) obj = Object(obj);
|
||
if (length < 2 || obj == null) return obj;
|
||
for (var index = 1; index < length; index++) {
|
||
var source = arguments[index],
|
||
keys = keysFunc(source),
|
||
l = keys.length;
|
||
for (var i = 0; i < l; i++) {
|
||
var key = keys[i];
|
||
if (!defaults || obj[key] === void 0) obj[key] = source[key];
|
||
}
|
||
}
|
||
return obj;
|
||
};
|
||
};
|
||
|
||
// Extend a given object with all the properties in passed-in object(s).
|
||
_.extend = createAssigner(_.allKeys);
|
||
|
||
// Assigns a given object with all the own properties in the passed-in object(s).
|
||
// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
|
||
_.extendOwn = _.assign = createAssigner(_.keys);
|
||
|
||
// Returns the first key on an object that passes a predicate test.
|
||
_.findKey = function(obj, predicate, context) {
|
||
predicate = cb(predicate, context);
|
||
var keys = _.keys(obj), key;
|
||
for (var i = 0, length = keys.length; i < length; i++) {
|
||
key = keys[i];
|
||
if (predicate(obj[key], key, obj)) return key;
|
||
}
|
||
};
|
||
|
||
// Internal pick helper function to determine if `obj` has key `key`.
|
||
var keyInObj = function(value, key, obj) {
|
||
return key in obj;
|
||
};
|
||
|
||
// Return a copy of the object only containing the whitelisted properties.
|
||
_.pick = restArguments(function(obj, keys) {
|
||
var result = {}, iteratee = keys[0];
|
||
if (obj == null) return result;
|
||
if (_.isFunction(iteratee)) {
|
||
if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
|
||
keys = _.allKeys(obj);
|
||
} else {
|
||
iteratee = keyInObj;
|
||
keys = flatten(keys, false, false);
|
||
obj = Object(obj);
|
||
}
|
||
for (var i = 0, length = keys.length; i < length; i++) {
|
||
var key = keys[i];
|
||
var value = obj[key];
|
||
if (iteratee(value, key, obj)) result[key] = value;
|
||
}
|
||
return result;
|
||
});
|
||
|
||
// Return a copy of the object without the blacklisted properties.
|
||
_.omit = restArguments(function(obj, keys) {
|
||
var iteratee = keys[0], context;
|
||
if (_.isFunction(iteratee)) {
|
||
iteratee = _.negate(iteratee);
|
||
if (keys.length > 1) context = keys[1];
|
||
} else {
|
||
keys = _.map(flatten(keys, false, false), String);
|
||
iteratee = function(value, key) {
|
||
return !_.contains(keys, key);
|
||
};
|
||
}
|
||
return _.pick(obj, iteratee, context);
|
||
});
|
||
|
||
// Fill in a given object with default properties.
|
||
_.defaults = createAssigner(_.allKeys, true);
|
||
|
||
// Creates an object that inherits from the given prototype object.
|
||
// If additional properties are provided then they will be added to the
|
||
// created object.
|
||
_.create = function(prototype, props) {
|
||
var result = baseCreate(prototype);
|
||
if (props) _.extendOwn(result, props);
|
||
return result;
|
||
};
|
||
|
||
// Create a (shallow-cloned) duplicate of an object.
|
||
_.clone = function(obj) {
|
||
if (!_.isObject(obj)) return obj;
|
||
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
|
||
};
|
||
|
||
// Invokes interceptor with the obj, and then returns obj.
|
||
// The primary purpose of this method is to "tap into" a method chain, in
|
||
// order to perform operations on intermediate results within the chain.
|
||
_.tap = function(obj, interceptor) {
|
||
interceptor(obj);
|
||
return obj;
|
||
};
|
||
|
||
// Returns whether an object has a given set of `key:value` pairs.
|
||
_.isMatch = function(object, attrs) {
|
||
var keys = _.keys(attrs), length = keys.length;
|
||
if (object == null) return !length;
|
||
var obj = Object(object);
|
||
for (var i = 0; i < length; i++) {
|
||
var key = keys[i];
|
||
if (attrs[key] !== obj[key] || !(key in obj)) return false;
|
||
}
|
||
return true;
|
||
};
|
||
|
||
|
||
// Internal recursive comparison function for `isEqual`.
|
||
var eq, deepEq;
|
||
eq = function(a, b, aStack, bStack) {
|
||
// Identical objects are equal. `0 === -0`, but they aren't identical.
|
||
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
|
||
if (a === b) return a !== 0 || 1 / a === 1 / b;
|
||
// `null` or `undefined` only equal to itself (strict comparison).
|
||
if (a == null || b == null) return false;
|
||
// `NaN`s are equivalent, but non-reflexive.
|
||
if (a !== a) return b !== b;
|
||
// Exhaust primitive checks
|
||
var type = typeof a;
|
||
if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
|
||
return deepEq(a, b, aStack, bStack);
|
||
};
|
||
|
||
// Internal recursive comparison function for `isEqual`.
|
||
deepEq = function(a, b, aStack, bStack) {
|
||
// Unwrap any wrapped objects.
|
||
if (a instanceof _) a = a._wrapped;
|
||
if (b instanceof _) b = b._wrapped;
|
||
// Compare `[[Class]]` names.
|
||
var className = toString.call(a);
|
||
if (className !== toString.call(b)) return false;
|
||
switch (className) {
|
||
// Strings, numbers, regular expressions, dates, and booleans are compared by value.
|
||
case '[object RegExp]':
|
||
// RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
|
||
case '[object String]':
|
||
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
|
||
// equivalent to `new String("5")`.
|
||
return '' + a === '' + b;
|
||
case '[object Number]':
|
||
// `NaN`s are equivalent, but non-reflexive.
|
||
// Object(NaN) is equivalent to NaN.
|
||
if (+a !== +a) return +b !== +b;
|
||
// An `egal` comparison is performed for other numeric values.
|
||
return +a === 0 ? 1 / +a === 1 / b : +a === +b;
|
||
case '[object Date]':
|
||
case '[object Boolean]':
|
||
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
|
||
// millisecond representations. Note that invalid dates with millisecond representations
|
||
// of `NaN` are not equivalent.
|
||
return +a === +b;
|
||
case '[object Symbol]':
|
||
return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
|
||
}
|
||
|
||
var areArrays = className === '[object Array]';
|
||
if (!areArrays) {
|
||
if (typeof a != 'object' || typeof b != 'object') return false;
|
||
|
||
// Objects with different constructors are not equivalent, but `Object`s or `Array`s
|
||
// from different frames are.
|
||
var aCtor = a.constructor, bCtor = b.constructor;
|
||
if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
|
||
_.isFunction(bCtor) && bCtor instanceof bCtor)
|
||
&& ('constructor' in a && 'constructor' in b)) {
|
||
return false;
|
||
}
|
||
}
|
||
// Assume equality for cyclic structures. The algorithm for detecting cyclic
|
||
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
|
||
|
||
// Initializing stack of traversed objects.
|
||
// It's done here since we only need them for objects and arrays comparison.
|
||
aStack = aStack || [];
|
||
bStack = bStack || [];
|
||
var length = aStack.length;
|
||
while (length--) {
|
||
// Linear search. Performance is inversely proportional to the number of
|
||
// unique nested structures.
|
||
if (aStack[length] === a) return bStack[length] === b;
|
||
}
|
||
|
||
// Add the first object to the stack of traversed objects.
|
||
aStack.push(a);
|
||
bStack.push(b);
|
||
|
||
// Recursively compare objects and arrays.
|
||
if (areArrays) {
|
||
// Compare array lengths to determine if a deep comparison is necessary.
|
||
length = a.length;
|
||
if (length !== b.length) return false;
|
||
// Deep compare the contents, ignoring non-numeric properties.
|
||
while (length--) {
|
||
if (!eq(a[length], b[length], aStack, bStack)) return false;
|
||
}
|
||
} else {
|
||
// Deep compare objects.
|
||
var keys = _.keys(a), key;
|
||
length = keys.length;
|
||
// Ensure that both objects contain the same number of properties before comparing deep equality.
|
||
if (_.keys(b).length !== length) return false;
|
||
while (length--) {
|
||
// Deep compare each member
|
||
key = keys[length];
|
||
if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
|
||
}
|
||
}
|
||
// Remove the first object from the stack of traversed objects.
|
||
aStack.pop();
|
||
bStack.pop();
|
||
return true;
|
||
};
|
||
|
||
// Perform a deep comparison to check if two objects are equal.
|
||
_.isEqual = function(a, b) {
|
||
return eq(a, b);
|
||
};
|
||
|
||
// Is a given array, string, or object empty?
|
||
// An "empty" object has no enumerable own-properties.
|
||
_.isEmpty = function(obj) {
|
||
if (obj == null) return true;
|
||
if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
|
||
return _.keys(obj).length === 0;
|
||
};
|
||
|
||
// Is a given value a DOM element?
|
||
_.isElement = function(obj) {
|
||
return !!(obj && obj.nodeType === 1);
|
||
};
|
||
|
||
// Is a given value an array?
|
||
// Delegates to ECMA5's native Array.isArray
|
||
_.isArray = nativeIsArray || function(obj) {
|
||
return toString.call(obj) === '[object Array]';
|
||
};
|
||
|
||
// Is a given variable an object?
|
||
_.isObject = function(obj) {
|
||
var type = typeof obj;
|
||
return type === 'function' || type === 'object' && !!obj;
|
||
};
|
||
|
||
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.
|
||
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) {
|
||
_['is' + name] = function(obj) {
|
||
return toString.call(obj) === '[object ' + name + ']';
|
||
};
|
||
});
|
||
|
||
// Define a fallback version of the method in browsers (ahem, IE < 9), where
|
||
// there isn't any inspectable "Arguments" type.
|
||
if (!_.isArguments(arguments)) {
|
||
_.isArguments = function(obj) {
|
||
return has(obj, 'callee');
|
||
};
|
||
}
|
||
|
||
// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
|
||
// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
|
||
var nodelist = root.document && root.document.childNodes;
|
||
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
|
||
_.isFunction = function(obj) {
|
||
return typeof obj == 'function' || false;
|
||
};
|
||
}
|
||
|
||
// Is a given object a finite number?
|
||
_.isFinite = function(obj) {
|
||
return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
|
||
};
|
||
|
||
// Is the given value `NaN`?
|
||
_.isNaN = function(obj) {
|
||
return _.isNumber(obj) && isNaN(obj);
|
||
};
|
||
|
||
// Is a given value a boolean?
|
||
_.isBoolean = function(obj) {
|
||
return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
|
||
};
|
||
|
||
// Is a given value equal to null?
|
||
_.isNull = function(obj) {
|
||
return obj === null;
|
||
};
|
||
|
||
// Is a given variable undefined?
|
||
_.isUndefined = function(obj) {
|
||
return obj === void 0;
|
||
};
|
||
|
||
// Shortcut function for checking if an object has a given property directly
|
||
// on itself (in other words, not on a prototype).
|
||
_.has = function(obj, path) {
|
||
if (!_.isArray(path)) {
|
||
return has(obj, path);
|
||
}
|
||
var length = path.length;
|
||
for (var i = 0; i < length; i++) {
|
||
var key = path[i];
|
||
if (obj == null || !hasOwnProperty.call(obj, key)) {
|
||
return false;
|
||
}
|
||
obj = obj[key];
|
||
}
|
||
return !!length;
|
||
};
|
||
|
||
// Utility Functions
|
||
// -----------------
|
||
|
||
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
|
||
// previous owner. Returns a reference to the Underscore object.
|
||
_.noConflict = function() {
|
||
root._ = previousUnderscore;
|
||
return this;
|
||
};
|
||
|
||
// Keep the identity function around for default iteratees.
|
||
_.identity = function(value) {
|
||
return value;
|
||
};
|
||
|
||
// Predicate-generating functions. Often useful outside of Underscore.
|
||
_.constant = function(value) {
|
||
return function() {
|
||
return value;
|
||
};
|
||
};
|
||
|
||
_.noop = function(){};
|
||
|
||
// Creates a function that, when passed an object, will traverse that object’s
|
||
// properties down the given `path`, specified as an array of keys or indexes.
|
||
_.property = function(path) {
|
||
if (!_.isArray(path)) {
|
||
return shallowProperty(path);
|
||
}
|
||
return function(obj) {
|
||
return deepGet(obj, path);
|
||
};
|
||
};
|
||
|
||
// Generates a function for a given object that returns a given property.
|
||
_.propertyOf = function(obj) {
|
||
if (obj == null) {
|
||
return function(){};
|
||
}
|
||
return function(path) {
|
||
return !_.isArray(path) ? obj[path] : deepGet(obj, path);
|
||
};
|
||
};
|
||
|
||
// Returns a predicate for checking whether an object has a given set of
|
||
// `key:value` pairs.
|
||
_.matcher = _.matches = function(attrs) {
|
||
attrs = _.extendOwn({}, attrs);
|
||
return function(obj) {
|
||
return _.isMatch(obj, attrs);
|
||
};
|
||
};
|
||
|
||
// Run a function **n** times.
|
||
_.times = function(n, iteratee, context) {
|
||
var accum = Array(Math.max(0, n));
|
||
iteratee = optimizeCb(iteratee, context, 1);
|
||
for (var i = 0; i < n; i++) accum[i] = iteratee(i);
|
||
return accum;
|
||
};
|
||
|
||
// Return a random integer between min and max (inclusive).
|
||
_.random = function(min, max) {
|
||
if (max == null) {
|
||
max = min;
|
||
min = 0;
|
||
}
|
||
return min + Math.floor(Math.random() * (max - min + 1));
|
||
};
|
||
|
||
// A (possibly faster) way to get the current timestamp as an integer.
|
||
_.now = Date.now || function() {
|
||
return new Date().getTime();
|
||
};
|
||
|
||
// List of HTML entities for escaping.
|
||
var escapeMap = {
|
||
'&': '&',
|
||
'<': '<',
|
||
'>': '>',
|
||
'"': '"',
|
||
"'": ''',
|
||
'`': '`'
|
||
};
|
||
var unescapeMap = _.invert(escapeMap);
|
||
|
||
// Functions for escaping and unescaping strings to/from HTML interpolation.
|
||
var createEscaper = function(map) {
|
||
var escaper = function(match) {
|
||
return map[match];
|
||
};
|
||
// Regexes for identifying a key that needs to be escaped.
|
||
var source = '(?:' + _.keys(map).join('|') + ')';
|
||
var testRegexp = RegExp(source);
|
||
var replaceRegexp = RegExp(source, 'g');
|
||
return function(string) {
|
||
string = string == null ? '' : '' + string;
|
||
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
|
||
};
|
||
};
|
||
_.escape = createEscaper(escapeMap);
|
||
_.unescape = createEscaper(unescapeMap);
|
||
|
||
// Traverses the children of `obj` along `path`. If a child is a function, it
|
||
// is invoked with its parent as context. Returns the value of the final
|
||
// child, or `fallback` if any child is undefined.
|
||
_.result = function(obj, path, fallback) {
|
||
if (!_.isArray(path)) path = [path];
|
||
var length = path.length;
|
||
if (!length) {
|
||
return _.isFunction(fallback) ? fallback.call(obj) : fallback;
|
||
}
|
||
for (var i = 0; i < length; i++) {
|
||
var prop = obj == null ? void 0 : obj[path[i]];
|
||
if (prop === void 0) {
|
||
prop = fallback;
|
||
i = length; // Ensure we don't continue iterating.
|
||
}
|
||
obj = _.isFunction(prop) ? prop.call(obj) : prop;
|
||
}
|
||
return obj;
|
||
};
|
||
|
||
// Generate a unique integer id (unique within the entire client session).
|
||
// Useful for temporary DOM ids.
|
||
var idCounter = 0;
|
||
_.uniqueId = function(prefix) {
|
||
var id = ++idCounter + '';
|
||
return prefix ? prefix + id : id;
|
||
};
|
||
|
||
// By default, Underscore uses ERB-style template delimiters, change the
|
||
// following template settings to use alternative delimiters.
|
||
_.templateSettings = {
|
||
evaluate: /<%([\s\S]+?)%>/g,
|
||
interpolate: /<%=([\s\S]+?)%>/g,
|
||
escape: /<%-([\s\S]+?)%>/g
|
||
};
|
||
|
||
// When customizing `templateSettings`, if you don't want to define an
|
||
// interpolation, evaluation or escaping regex, we need one that is
|
||
// guaranteed not to match.
|
||
var noMatch = /(.)^/;
|
||
|
||
// Certain characters need to be escaped so that they can be put into a
|
||
// string literal.
|
||
var escapes = {
|
||
"'": "'",
|
||
'\\': '\\',
|
||
'\r': 'r',
|
||
'\n': 'n',
|
||
'\u2028': 'u2028',
|
||
'\u2029': 'u2029'
|
||
};
|
||
|
||
var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
|
||
|
||
var escapeChar = function(match) {
|
||
return '\\' + escapes[match];
|
||
};
|
||
|
||
// JavaScript micro-templating, similar to John Resig's implementation.
|
||
// Underscore templating handles arbitrary delimiters, preserves whitespace,
|
||
// and correctly escapes quotes within interpolated code.
|
||
// NB: `oldSettings` only exists for backwards compatibility.
|
||
_.template = function(text, settings, oldSettings) {
|
||
if (!settings && oldSettings) settings = oldSettings;
|
||
settings = _.defaults({}, settings, _.templateSettings);
|
||
|
||
// Combine delimiters into one regular expression via alternation.
|
||
var matcher = RegExp([
|
||
(settings.escape || noMatch).source,
|
||
(settings.interpolate || noMatch).source,
|
||
(settings.evaluate || noMatch).source
|
||
].join('|') + '|$', 'g');
|
||
|
||
// Compile the template source, escaping string literals appropriately.
|
||
var index = 0;
|
||
var source = "__p+='";
|
||
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
|
||
source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
|
||
index = offset + match.length;
|
||
|
||
if (escape) {
|
||
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
|
||
} else if (interpolate) {
|
||
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
|
||
} else if (evaluate) {
|
||
source += "';\n" + evaluate + "\n__p+='";
|
||
}
|
||
|
||
// Adobe VMs need the match returned to produce the correct offset.
|
||
return match;
|
||
});
|
||
source += "';\n";
|
||
|
||
// If a variable is not specified, place data values in local scope.
|
||
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
|
||
|
||
source = "var __t,__p='',__j=Array.prototype.join," +
|
||
"print=function(){__p+=__j.call(arguments,'');};\n" +
|
||
source + 'return __p;\n';
|
||
|
||
var render;
|
||
try {
|
||
render = new Function(settings.variable || 'obj', '_', source);
|
||
} catch (e) {
|
||
e.source = source;
|
||
throw e;
|
||
}
|
||
|
||
var template = function(data) {
|
||
return render.call(this, data, _);
|
||
};
|
||
|
||
// Provide the compiled source as a convenience for precompilation.
|
||
var argument = settings.variable || 'obj';
|
||
template.source = 'function(' + argument + '){\n' + source + '}';
|
||
|
||
return template;
|
||
};
|
||
|
||
// Add a "chain" function. Start chaining a wrapped Underscore object.
|
||
_.chain = function(obj) {
|
||
var instance = _(obj);
|
||
instance._chain = true;
|
||
return instance;
|
||
};
|
||
|
||
// OOP
|
||
// ---------------
|
||
// If Underscore is called as a function, it returns a wrapped object that
|
||
// can be used OO-style. This wrapper holds altered versions of all the
|
||
// underscore functions. Wrapped objects may be chained.
|
||
|
||
// Helper function to continue chaining intermediate results.
|
||
var chainResult = function(instance, obj) {
|
||
return instance._chain ? _(obj).chain() : obj;
|
||
};
|
||
|
||
// Add your own custom functions to the Underscore object.
|
||
_.mixin = function(obj) {
|
||
_.each(_.functions(obj), function(name) {
|
||
var func = _[name] = obj[name];
|
||
_.prototype[name] = function() {
|
||
var args = [this._wrapped];
|
||
push.apply(args, arguments);
|
||
return chainResult(this, func.apply(_, args));
|
||
};
|
||
});
|
||
return _;
|
||
};
|
||
|
||
// Add all of the Underscore functions to the wrapper object.
|
||
_.mixin(_);
|
||
|
||
// Add all mutator Array functions to the wrapper.
|
||
_.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
|
||
var method = ArrayProto[name];
|
||
_.prototype[name] = function() {
|
||
var obj = this._wrapped;
|
||
method.apply(obj, arguments);
|
||
if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
|
||
return chainResult(this, obj);
|
||
};
|
||
});
|
||
|
||
// Add all accessor Array functions to the wrapper.
|
||
_.each(['concat', 'join', 'slice'], function(name) {
|
||
var method = ArrayProto[name];
|
||
_.prototype[name] = function() {
|
||
return chainResult(this, method.apply(this._wrapped, arguments));
|
||
};
|
||
});
|
||
|
||
// Extracts the result from a wrapped and chained object.
|
||
_.prototype.value = function() {
|
||
return this._wrapped;
|
||
};
|
||
|
||
// Provide unwrapping proxy for some methods used in engine operations
|
||
// such as arithmetic and JSON stringification.
|
||
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
|
||
|
||
_.prototype.toString = function() {
|
||
return String(this._wrapped);
|
||
};
|
||
|
||
// AMD registration happens at the end for compatibility with AMD loaders
|
||
// that may not enforce next-turn semantics on modules. Even though general
|
||
// practice for AMD registration is to be anonymous, underscore registers
|
||
// as a named module because, like jQuery, it is a base library that is
|
||
// popular enough to be bundled in a third party lib, but not be part of
|
||
// an AMD load request. Those cases could generate an error when an
|
||
// anonymous define() is called outside of a loader request.
|
||
if (true) {
|
||
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {
|
||
return _;
|
||
}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
|
||
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
||
}
|
||
}());
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(31), __webpack_require__(32)(module)))
|
||
|
||
/***/ }),
|
||
/* 31 */
|
||
/***/ (function(module, exports) {
|
||
|
||
var g;
|
||
|
||
// This works in non-strict mode
|
||
g = (function() {
|
||
return this;
|
||
})();
|
||
|
||
try {
|
||
// This works if eval is allowed (see CSP)
|
||
g = g || Function("return this")() || (1,eval)("this");
|
||
} catch(e) {
|
||
// This works if the window reference is available
|
||
if(typeof window === "object")
|
||
g = window;
|
||
}
|
||
|
||
// g can still be undefined, but nothing to do about it...
|
||
// We return undefined, instead of nothing here, so it's
|
||
// easier to handle this case. if(!global) { ...}
|
||
|
||
module.exports = g;
|
||
|
||
|
||
/***/ }),
|
||
/* 32 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = function(module) {
|
||
if(!module.webpackPolyfill) {
|
||
module.deprecate = function() {};
|
||
module.paths = [];
|
||
// module.parent = undefined by default
|
||
if(!module.children) module.children = [];
|
||
Object.defineProperty(module, "loaded", {
|
||
enumerable: true,
|
||
get: function() {
|
||
return module.l;
|
||
}
|
||
});
|
||
Object.defineProperty(module, "id", {
|
||
enumerable: true,
|
||
get: function() {
|
||
return module.i;
|
||
}
|
||
});
|
||
module.webpackPolyfill = 1;
|
||
}
|
||
return module;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 33 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.CheckBox = undefined;
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _bootstrap = __webpack_require__(5);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/require-default-props: 0 */
|
||
|
||
|
||
var CheckBox = exports.CheckBox = function CheckBox(_ref) {
|
||
var className = _ref.className,
|
||
checked = _ref.checked,
|
||
indeterminate = _ref.indeterminate;
|
||
return _react2.default.createElement('input', {
|
||
type: 'checkbox',
|
||
checked: checked,
|
||
className: className,
|
||
ref: function ref(input) {
|
||
if (input) input.indeterminate = indeterminate; // eslint-disable-line no-param-reassign
|
||
},
|
||
onChange: function onChange() {}
|
||
});
|
||
};
|
||
|
||
CheckBox.propTypes = {
|
||
checked: _propTypes2.default.bool.isRequired,
|
||
indeterminate: _propTypes2.default.bool.isRequired,
|
||
className: _propTypes2.default.string
|
||
};
|
||
|
||
var SelectionHeaderCell = function (_Component) {
|
||
_inherits(SelectionHeaderCell, _Component);
|
||
|
||
function SelectionHeaderCell() {
|
||
_classCallCheck(this, SelectionHeaderCell);
|
||
|
||
var _this = _possibleConstructorReturn(this, (SelectionHeaderCell.__proto__ || Object.getPrototypeOf(SelectionHeaderCell)).call(this));
|
||
|
||
_this.handleCheckBoxClick = _this.handleCheckBoxClick.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
/**
|
||
* avoid updating if button is
|
||
* 1. radio
|
||
* 2. status was not changed.
|
||
*/
|
||
|
||
|
||
_createClass(SelectionHeaderCell, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
var ROW_SELECT_SINGLE = _const2.default.ROW_SELECT_SINGLE;
|
||
var _props = this.props,
|
||
mode = _props.mode,
|
||
checkedStatus = _props.checkedStatus;
|
||
|
||
|
||
if (mode === ROW_SELECT_SINGLE) return false;
|
||
|
||
return nextProps.checkedStatus !== checkedStatus;
|
||
}
|
||
}, {
|
||
key: 'handleCheckBoxClick',
|
||
value: function handleCheckBoxClick(e) {
|
||
var _props2 = this.props,
|
||
onAllRowsSelect = _props2.onAllRowsSelect,
|
||
checkedStatus = _props2.checkedStatus;
|
||
|
||
var isUnSelect = checkedStatus === _const2.default.CHECKBOX_STATUS_CHECKED || checkedStatus === _const2.default.CHECKBOX_STATUS_INDETERMINATE;
|
||
|
||
onAllRowsSelect(e, isUnSelect);
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _this2 = this;
|
||
|
||
var CHECKBOX_STATUS_CHECKED = _const2.default.CHECKBOX_STATUS_CHECKED,
|
||
CHECKBOX_STATUS_INDETERMINATE = _const2.default.CHECKBOX_STATUS_INDETERMINATE,
|
||
ROW_SELECT_MULTIPLE = _const2.default.ROW_SELECT_MULTIPLE;
|
||
var _props3 = this.props,
|
||
mode = _props3.mode,
|
||
checkedStatus = _props3.checkedStatus,
|
||
selectionHeaderRenderer = _props3.selectionHeaderRenderer,
|
||
hideSelectAll = _props3.hideSelectAll,
|
||
headerColumnStyle = _props3.headerColumnStyle;
|
||
|
||
if (hideSelectAll) {
|
||
return _react2.default.createElement('th', { 'data-row-selection': true });
|
||
}
|
||
|
||
var checked = checkedStatus === CHECKBOX_STATUS_CHECKED;
|
||
|
||
var indeterminate = checkedStatus === CHECKBOX_STATUS_INDETERMINATE;
|
||
|
||
var attrs = {};
|
||
var content = void 0;
|
||
if (selectionHeaderRenderer || mode === ROW_SELECT_MULTIPLE) {
|
||
attrs.onClick = this.handleCheckBoxClick;
|
||
}
|
||
|
||
attrs.style = _utils2.default.isFunction(headerColumnStyle) ? headerColumnStyle(checkedStatus) : headerColumnStyle;
|
||
|
||
return _react2.default.createElement(
|
||
_bootstrap.BootstrapContext.Consumer,
|
||
null,
|
||
function (_ref2) {
|
||
var bootstrap4 = _ref2.bootstrap4;
|
||
|
||
if (selectionHeaderRenderer) {
|
||
content = selectionHeaderRenderer({
|
||
mode: mode,
|
||
checked: checked,
|
||
indeterminate: indeterminate
|
||
});
|
||
} else if (mode === ROW_SELECT_MULTIPLE) {
|
||
content = _react2.default.createElement(CheckBox, _extends({}, _this2.props, {
|
||
checked: checked,
|
||
className: bootstrap4 ? 'selection-input-4' : '',
|
||
indeterminate: indeterminate
|
||
}));
|
||
}
|
||
return _react2.default.createElement(
|
||
'th',
|
||
_extends({ className: 'selection-cell-header', 'data-row-selection': true }, attrs),
|
||
content
|
||
);
|
||
}
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return SelectionHeaderCell;
|
||
}(_react.Component);
|
||
|
||
SelectionHeaderCell.propTypes = {
|
||
mode: _propTypes2.default.string.isRequired,
|
||
checkedStatus: _propTypes2.default.string,
|
||
onAllRowsSelect: _propTypes2.default.func,
|
||
hideSelectAll: _propTypes2.default.bool,
|
||
selectionHeaderRenderer: _propTypes2.default.func,
|
||
headerColumnStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func])
|
||
};
|
||
exports.default = SelectionHeaderCell;
|
||
|
||
/***/ }),
|
||
/* 34 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/require-default-props: 0 */
|
||
/* eslint no-nested-ternary: 0 */
|
||
|
||
|
||
var ExpansionHeaderCell = function (_Component) {
|
||
_inherits(ExpansionHeaderCell, _Component);
|
||
|
||
function ExpansionHeaderCell() {
|
||
_classCallCheck(this, ExpansionHeaderCell);
|
||
|
||
var _this = _possibleConstructorReturn(this, (ExpansionHeaderCell.__proto__ || Object.getPrototypeOf(ExpansionHeaderCell)).call(this));
|
||
|
||
_this.handleCheckBoxClick = _this.handleCheckBoxClick.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(ExpansionHeaderCell, [{
|
||
key: 'handleCheckBoxClick',
|
||
value: function handleCheckBoxClick(e) {
|
||
var _props = this.props,
|
||
isAnyExpands = _props.isAnyExpands,
|
||
onAllRowExpand = _props.onAllRowExpand;
|
||
|
||
|
||
onAllRowExpand(e, !isAnyExpands);
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props2 = this.props,
|
||
isAnyExpands = _props2.isAnyExpands,
|
||
expandHeaderColumnRenderer = _props2.expandHeaderColumnRenderer;
|
||
|
||
var attrs = {
|
||
onClick: this.handleCheckBoxClick
|
||
};
|
||
|
||
return _react2.default.createElement(
|
||
'th',
|
||
_extends({ className: 'expand-cell-header', 'data-row-selection': true }, attrs),
|
||
expandHeaderColumnRenderer ? expandHeaderColumnRenderer({ isAnyExpands: isAnyExpands }) : isAnyExpands ? '(-)' : '(+)'
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return ExpansionHeaderCell;
|
||
}(_react.Component);
|
||
|
||
ExpansionHeaderCell.propTypes = {
|
||
isAnyExpands: _propTypes2.default.bool.isRequired,
|
||
onAllRowExpand: _propTypes2.default.func.isRequired,
|
||
expandHeaderColumnRenderer: _propTypes2.default.func
|
||
};
|
||
exports.default = ExpansionHeaderCell;
|
||
|
||
/***/ }),
|
||
/* 35 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _selectionContext = __webpack_require__(8);
|
||
|
||
var _selectionContext2 = _interopRequireDefault(_selectionContext);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = function (Component) {
|
||
return function () {
|
||
return _react2.default.createElement(
|
||
_selectionContext2.default.Consumer,
|
||
null,
|
||
function (selectRow) {
|
||
return _react2.default.createElement(Component, selectRow);
|
||
}
|
||
);
|
||
};
|
||
};
|
||
|
||
/***/ }),
|
||
/* 36 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.getExpandedRows = exports.expandableKeys = exports.isAnyExpands = undefined;
|
||
|
||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _rows = __webpack_require__(6);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var isAnyExpands = exports.isAnyExpands = function isAnyExpands(data, keyField) {
|
||
var expanded = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
||
|
||
var _loop = function _loop(i) {
|
||
var rowKey = _utils2.default.get(data[i], keyField);
|
||
if (typeof expanded.find(function (x) {
|
||
return x === rowKey;
|
||
}) !== 'undefined') {
|
||
return {
|
||
v: true
|
||
};
|
||
}
|
||
};
|
||
|
||
for (var i = 0; i < data.length; i += 1) {
|
||
var _ret = _loop(i);
|
||
|
||
if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
|
||
}
|
||
return false;
|
||
};
|
||
|
||
var expandableKeys = exports.expandableKeys = function expandableKeys(data, keyField) {
|
||
var skips = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
||
|
||
if (skips.length === 0) {
|
||
return data.map(function (row) {
|
||
return _utils2.default.get(row, keyField);
|
||
});
|
||
}
|
||
return data.filter(function (row) {
|
||
return !_utils2.default.contains(skips, _utils2.default.get(row, keyField));
|
||
}).map(function (row) {
|
||
return _utils2.default.get(row, keyField);
|
||
});
|
||
};
|
||
|
||
var getExpandedRows = exports.getExpandedRows = function getExpandedRows(data, keyField, expanded) {
|
||
return expanded.map(function (k) {
|
||
return (0, _rows.getRowByRowId)(data, keyField, k);
|
||
});
|
||
};
|
||
|
||
/***/ }),
|
||
/* 37 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.editCell = undefined;
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _rows = __webpack_require__(6);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var editCell = exports.editCell = function editCell(data, keyField, rowId, dataField, newValue) {
|
||
var row = (0, _rows.getRowByRowId)(data, keyField, rowId);
|
||
if (row) _utils2.default.set(row, dataField, newValue);
|
||
};
|
||
|
||
/***/ }),
|
||
/* 38 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.nextOrder = exports.sort = undefined;
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /* eslint no-nested-ternary: 0 */
|
||
/* eslint no-lonely-if: 0 */
|
||
/* eslint no-underscore-dangle: 0 */
|
||
|
||
|
||
function comparator(a, b) {
|
||
var result = void 0;
|
||
if (typeof b === 'string') {
|
||
result = b.localeCompare(a);
|
||
} else {
|
||
result = a > b ? -1 : a < b ? 1 : 0;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
var sort = exports.sort = function sort(data, sortOrder, _ref) {
|
||
var dataField = _ref.dataField,
|
||
sortFunc = _ref.sortFunc,
|
||
sortValue = _ref.sortValue;
|
||
|
||
var _data = [].concat(_toConsumableArray(data));
|
||
_data.sort(function (a, b) {
|
||
var result = void 0;
|
||
var valueA = _utils2.default.get(a, dataField);
|
||
var valueB = _utils2.default.get(b, dataField);
|
||
if (sortValue) {
|
||
valueA = sortValue(valueA, a);
|
||
valueB = sortValue(valueB, b);
|
||
} else {
|
||
valueA = _utils2.default.isDefined(valueA) ? valueA : '';
|
||
valueB = _utils2.default.isDefined(valueB) ? valueB : '';
|
||
}
|
||
|
||
if (sortFunc) {
|
||
result = sortFunc(valueA, valueB, sortOrder, dataField, a, b);
|
||
} else {
|
||
if (sortOrder === _const2.default.SORT_DESC) {
|
||
result = comparator(valueA, valueB);
|
||
} else {
|
||
result = comparator(valueB, valueA);
|
||
}
|
||
}
|
||
return result;
|
||
});
|
||
return _data;
|
||
};
|
||
|
||
var nextOrder = exports.nextOrder = function nextOrder(currentSortColumn, _ref2) {
|
||
var sortOrder = _ref2.sortOrder,
|
||
sortColumn = _ref2.sortColumn;
|
||
var defaultOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _const2.default.SORT_DESC;
|
||
|
||
if (!sortColumn || currentSortColumn.dataField !== sortColumn.dataField) return defaultOrder;
|
||
return sortOrder === _const2.default.SORT_DESC ? _const2.default.SORT_ASC : _const2.default.SORT_DESC;
|
||
};
|
||
|
||
/***/ }),
|
||
/* 39 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.typeConvert = undefined;
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var typeConvert = exports.typeConvert = function typeConvert(type, value) {
|
||
if (type === _const2.default.TYPE_STRING) {
|
||
return String(value);
|
||
} else if (type === _const2.default.TYPE_NUMBER) {
|
||
return Number(value);
|
||
} else if (type === _const2.default.TYPE_BOOLEAN) {
|
||
if (typeof value === 'boolean') {
|
||
return value;
|
||
}
|
||
return value === 'true';
|
||
} else if (type === _const2.default.TYPE_DATE) {
|
||
return new Date(value);
|
||
}
|
||
return value;
|
||
};
|
||
|
||
/***/ }),
|
||
/* 40 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _rowExpandContext = __webpack_require__(10);
|
||
|
||
var _rowExpandContext2 = _interopRequireDefault(_rowExpandContext);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = function (Component) {
|
||
return function () {
|
||
return _react2.default.createElement(
|
||
_rowExpandContext2.default.Consumer,
|
||
null,
|
||
function (expandRow) {
|
||
return _react2.default.createElement(Component, expandRow);
|
||
}
|
||
);
|
||
};
|
||
};
|
||
|
||
/***/ }),
|
||
/* 41 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _filtersCell = __webpack_require__(42);
|
||
|
||
var _filtersCell2 = _interopRequireDefault(_filtersCell);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _rowTemplate = __webpack_require__(12);
|
||
|
||
var _rowTemplate2 = _interopRequireDefault(_rowTemplate);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var Filters = function Filters(props) {
|
||
var columns = props.columns,
|
||
onFilter = props.onFilter,
|
||
currFilters = props.currFilters,
|
||
filterPosition = props.filterPosition,
|
||
onExternalFilter = props.onExternalFilter,
|
||
className = props.className,
|
||
selectRow = props.selectRow,
|
||
expandRow = props.expandRow;
|
||
|
||
|
||
function renderContent() {
|
||
var filterColumns = [];
|
||
var showFiltersRow = false;
|
||
|
||
columns.forEach(function (column, i) {
|
||
filterColumns.push(_react2.default.createElement(_filtersCell2.default, {
|
||
index: i,
|
||
key: column.dataField,
|
||
column: column,
|
||
currFilters: currFilters,
|
||
onExternalFilter: onExternalFilter,
|
||
onFilter: onFilter
|
||
}));
|
||
|
||
if (column.filterRenderer || column.filter) {
|
||
if (!showFiltersRow) {
|
||
showFiltersRow = true;
|
||
}
|
||
}
|
||
});
|
||
return filterColumns;
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'tbody',
|
||
{
|
||
className: className,
|
||
style: {
|
||
display: filterPosition === _const2.default.FILTERS_POSITION_TOP ? 'table-header-group' : 'table-footer-group'
|
||
}
|
||
},
|
||
_react2.default.createElement(_rowTemplate2.default, {
|
||
renderContent: renderContent,
|
||
selectRow: selectRow,
|
||
expandRow: expandRow,
|
||
cellEl: 'td'
|
||
})
|
||
);
|
||
}; /* eslint react/require-default-props: 0 */
|
||
|
||
|
||
Filters.propTypes = {
|
||
columns: _propTypes2.default.array.isRequired,
|
||
onFilter: _propTypes2.default.func,
|
||
filterPosition: _propTypes2.default.oneOf([_const2.default.FILTERS_POSITION_TOP, _const2.default.FILTERS_POSITION_INLINE, _const2.default.FILTERS_POSITION_BOTTOM]),
|
||
currFilters: _propTypes2.default.object,
|
||
onExternalFilter: _propTypes2.default.func,
|
||
className: _propTypes2.default.string,
|
||
selectRow: _propTypes2.default.object,
|
||
expandRow: _propTypes2.default.object
|
||
};
|
||
|
||
Filters.defaultProps = {
|
||
position: _const2.default.FILTERS_POSITION_TOP
|
||
};
|
||
|
||
exports.default = Filters;
|
||
|
||
/***/ }),
|
||
/* 42 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var FiltersCell = function FiltersCell(props) {
|
||
var index = props.index,
|
||
column = props.column,
|
||
onExternalFilter = props.onExternalFilter,
|
||
currFilters = props.currFilters,
|
||
onFilter = props.onFilter;
|
||
var filterRenderer = column.filterRenderer,
|
||
filter = column.filter;
|
||
|
||
var filterElm = void 0;
|
||
var cellAttrs = {};
|
||
var cellStyle = {};
|
||
cellAttrs.style = cellStyle;
|
||
if (column.headerAlign) {
|
||
cellStyle.textAlign = _utils2.default.isFunction(column.headerAlign) ? column.headerAlign(column, index) : column.headerAlign;
|
||
}
|
||
if (column.filterRenderer) {
|
||
var onCustomFilter = onExternalFilter(column, filter.props.type);
|
||
filterElm = filterRenderer(onCustomFilter, column);
|
||
} else if (filter) {
|
||
filterElm = _react2.default.createElement(filter.Filter, _extends({}, filter.props, {
|
||
filterState: currFilters[column.dataField],
|
||
onFilter: onFilter,
|
||
column: column
|
||
}));
|
||
}
|
||
return _react2.default.createElement('th', cellAttrs, filterElm);
|
||
};
|
||
|
||
FiltersCell.propTypes = {
|
||
index: _propTypes2.default.number.isRequired,
|
||
column: _propTypes2.default.object.isRequired,
|
||
currFilters: _propTypes2.default.object.isRequired,
|
||
onFilter: _propTypes2.default.func,
|
||
onExternalFilter: _propTypes2.default.func
|
||
};
|
||
|
||
FiltersCell.defaultProps = {
|
||
onFilter: function onFilter() {},
|
||
onExternalFilter: function onExternalFilter() {}
|
||
};
|
||
|
||
exports.default = FiltersCell;
|
||
|
||
/***/ }),
|
||
/* 43 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
/* eslint react/require-default-props: 0 */
|
||
var Caption = function Caption(props) {
|
||
if (!props.children) return null;
|
||
|
||
var caption = props.bootstrap4 ? _react2.default.createElement(
|
||
'caption',
|
||
{ style: { captionSide: 'top' } },
|
||
props.children
|
||
) : _react2.default.createElement(
|
||
'caption',
|
||
null,
|
||
props.children
|
||
);
|
||
|
||
return caption;
|
||
};
|
||
|
||
Caption.propTypes = {
|
||
children: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.string]),
|
||
bootstrap4: _propTypes2.default.bool
|
||
};
|
||
|
||
exports.default = Caption;
|
||
|
||
/***/ }),
|
||
/* 44 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _simpleRow = __webpack_require__(45);
|
||
|
||
var _simpleRow2 = _interopRequireDefault(_simpleRow);
|
||
|
||
var _aggregateRow = __webpack_require__(47);
|
||
|
||
var _aggregateRow2 = _interopRequireDefault(_aggregateRow);
|
||
|
||
var _rowSection = __webpack_require__(50);
|
||
|
||
var _rowSection2 = _interopRequireDefault(_rowSection);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _rowConsumer = __webpack_require__(51);
|
||
|
||
var _rowConsumer2 = _interopRequireDefault(_rowConsumer);
|
||
|
||
var _rowConsumer3 = __webpack_require__(52);
|
||
|
||
var _rowConsumer4 = _interopRequireDefault(_rowConsumer3);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */
|
||
/* eslint react/require-default-props: 0 */
|
||
|
||
var Body = function (_React$Component) {
|
||
_inherits(Body, _React$Component);
|
||
|
||
function Body(props) {
|
||
_classCallCheck(this, Body);
|
||
|
||
var _this = _possibleConstructorReturn(this, (Body.__proto__ || Object.getPrototypeOf(Body)).call(this, props));
|
||
|
||
var keyField = props.keyField,
|
||
cellEdit = props.cellEdit,
|
||
selectRow = props.selectRow,
|
||
expandRow = props.expandRow;
|
||
|
||
// Construct Editing Cell Component
|
||
|
||
if (cellEdit.createContext) {
|
||
_this.EditingCell = cellEdit.createEditingCell(_utils2.default, cellEdit.options.onStartEdit);
|
||
}
|
||
|
||
// Construct Row Component
|
||
var RowComponent = _simpleRow2.default;
|
||
var selectRowEnabled = selectRow.mode !== _const2.default.ROW_SELECT_DISABLED;
|
||
var expandRowEnabled = !!expandRow.renderer;
|
||
|
||
if (expandRowEnabled) {
|
||
RowComponent = (0, _rowConsumer4.default)(_aggregateRow2.default);
|
||
}
|
||
|
||
if (selectRowEnabled) {
|
||
RowComponent = (0, _rowConsumer2.default)(expandRowEnabled ? RowComponent : _aggregateRow2.default);
|
||
}
|
||
|
||
if (cellEdit.createContext) {
|
||
RowComponent = cellEdit.withRowLevelCellEdit(RowComponent, selectRowEnabled, keyField, _utils2.default);
|
||
}
|
||
_this.RowComponent = RowComponent;
|
||
return _this;
|
||
}
|
||
|
||
_createClass(Body, [{
|
||
key: 'render',
|
||
value: function render() {
|
||
var _this2 = this;
|
||
|
||
var _props = this.props,
|
||
columns = _props.columns,
|
||
data = _props.data,
|
||
tabIndexCell = _props.tabIndexCell,
|
||
keyField = _props.keyField,
|
||
isEmpty = _props.isEmpty,
|
||
noDataIndication = _props.noDataIndication,
|
||
visibleColumnSize = _props.visibleColumnSize,
|
||
cellEdit = _props.cellEdit,
|
||
selectRow = _props.selectRow,
|
||
rowStyle = _props.rowStyle,
|
||
rowClasses = _props.rowClasses,
|
||
rowEvents = _props.rowEvents,
|
||
expandRow = _props.expandRow,
|
||
className = _props.className;
|
||
|
||
|
||
var content = void 0;
|
||
|
||
if (isEmpty) {
|
||
var indication = _utils2.default.isFunction(noDataIndication) ? noDataIndication() : noDataIndication;
|
||
if (!indication) {
|
||
return null;
|
||
}
|
||
content = _react2.default.createElement(_rowSection2.default, { content: indication, colSpan: visibleColumnSize });
|
||
} else {
|
||
var selectRowEnabled = selectRow.mode !== _const2.default.ROW_SELECT_DISABLED;
|
||
var expandRowEnabled = !!expandRow.renderer;
|
||
|
||
var additionalRowProps = {};
|
||
|
||
if (cellEdit.createContext) {
|
||
additionalRowProps.EditingCellComponent = this.EditingCell;
|
||
}
|
||
|
||
if (selectRowEnabled || expandRowEnabled) {
|
||
additionalRowProps.expandRow = expandRow;
|
||
additionalRowProps.selectRow = selectRow;
|
||
}
|
||
|
||
content = data.map(function (row, index) {
|
||
var key = _utils2.default.get(row, keyField);
|
||
var baseRowProps = _extends({
|
||
key: key,
|
||
row: row,
|
||
tabIndexCell: tabIndexCell,
|
||
columns: columns,
|
||
keyField: keyField,
|
||
cellEdit: cellEdit,
|
||
value: key,
|
||
rowIndex: index,
|
||
visibleColumnSize: visibleColumnSize,
|
||
attrs: rowEvents || {}
|
||
}, additionalRowProps);
|
||
|
||
baseRowProps.style = _utils2.default.isFunction(rowStyle) ? rowStyle(row, index) : rowStyle;
|
||
baseRowProps.className = _utils2.default.isFunction(rowClasses) ? rowClasses(row, index) : rowClasses;
|
||
|
||
return _react2.default.createElement(_this2.RowComponent, baseRowProps);
|
||
});
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'tbody',
|
||
{ className: className },
|
||
content
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return Body;
|
||
}(_react2.default.Component);
|
||
|
||
Body.propTypes = {
|
||
keyField: _propTypes2.default.string.isRequired,
|
||
data: _propTypes2.default.array.isRequired,
|
||
columns: _propTypes2.default.array.isRequired,
|
||
selectRow: _propTypes2.default.object
|
||
};
|
||
|
||
exports.default = Body;
|
||
|
||
/***/ }),
|
||
/* 45 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _rowPureContent = __webpack_require__(13);
|
||
|
||
var _rowPureContent2 = _interopRequireDefault(_rowPureContent);
|
||
|
||
var _eventDelegater = __webpack_require__(14);
|
||
|
||
var _eventDelegater2 = _interopRequireDefault(_eventDelegater);
|
||
|
||
var _shouldUpdater2 = __webpack_require__(15);
|
||
|
||
var _shouldUpdater3 = _interopRequireDefault(_shouldUpdater2);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */
|
||
/* eslint react/no-array-index-key: 0 */
|
||
|
||
|
||
var SimpleRow = function (_shouldUpdater) {
|
||
_inherits(SimpleRow, _shouldUpdater);
|
||
|
||
function SimpleRow(props) {
|
||
_classCallCheck(this, SimpleRow);
|
||
|
||
var _this = _possibleConstructorReturn(this, (SimpleRow.__proto__ || Object.getPrototypeOf(SimpleRow)).call(this, props));
|
||
|
||
_this.shouldUpdateRowContent = false;
|
||
return _this;
|
||
}
|
||
|
||
_createClass(SimpleRow, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
this.shouldUpdateRowContent = false;
|
||
this.shouldUpdateRowContent = this.shouldRowContentUpdate(nextProps);
|
||
if (this.shouldUpdateRowContent) return true;
|
||
|
||
return this.shouldUpdatedBySelfProps(nextProps);
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
className = _props.className,
|
||
style = _props.style,
|
||
attrs = _props.attrs,
|
||
visibleColumnSize = _props.visibleColumnSize,
|
||
tabIndexCell = _props.tabIndexCell,
|
||
rest = _objectWithoutProperties(_props, ['className', 'style', 'attrs', 'visibleColumnSize', 'tabIndexCell']);
|
||
|
||
var trAttrs = this.delegate(attrs);
|
||
var tabIndexStart = this.props.rowIndex * visibleColumnSize + 1;
|
||
|
||
return _react2.default.createElement(
|
||
'tr',
|
||
_extends({ style: style, className: className }, trAttrs),
|
||
_react2.default.createElement(_rowPureContent2.default, _extends({
|
||
shouldUpdate: this.shouldUpdateRowContent,
|
||
tabIndexStart: tabIndexCell ? tabIndexStart : -1
|
||
}, rest))
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return SimpleRow;
|
||
}((0, _shouldUpdater3.default)((0, _eventDelegater2.default)(_react.Component)));
|
||
|
||
SimpleRow.propTypes = {
|
||
row: _propTypes2.default.object.isRequired,
|
||
rowIndex: _propTypes2.default.number.isRequired,
|
||
columns: _propTypes2.default.array.isRequired,
|
||
style: _propTypes2.default.object,
|
||
className: _propTypes2.default.string,
|
||
attrs: _propTypes2.default.object
|
||
};
|
||
|
||
SimpleRow.defaultProps = {
|
||
editable: true,
|
||
style: {},
|
||
className: null,
|
||
attrs: {}
|
||
};
|
||
|
||
exports.default = SimpleRow;
|
||
|
||
/***/ }),
|
||
/* 46 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _cellEventDelegater = __webpack_require__(7);
|
||
|
||
var _cellEventDelegater2 = _interopRequireDefault(_cellEventDelegater);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */
|
||
|
||
|
||
var Cell = function (_eventDelegater) {
|
||
_inherits(Cell, _eventDelegater);
|
||
|
||
function Cell(props) {
|
||
_classCallCheck(this, Cell);
|
||
|
||
var _this = _possibleConstructorReturn(this, (Cell.__proto__ || Object.getPrototypeOf(Cell)).call(this, props));
|
||
|
||
_this.createHandleEditingCell = function (originFunc) {
|
||
return function (e) {
|
||
var _this$props = _this.props,
|
||
onStart = _this$props.onStart,
|
||
rowIndex = _this$props.rowIndex,
|
||
columnIndex = _this$props.columnIndex,
|
||
clickToEdit = _this$props.clickToEdit,
|
||
dbclickToEdit = _this$props.dbclickToEdit;
|
||
|
||
if ((clickToEdit || dbclickToEdit) && _utils2.default.isFunction(originFunc)) {
|
||
originFunc(e);
|
||
}
|
||
if (onStart) {
|
||
onStart(rowIndex, columnIndex);
|
||
}
|
||
};
|
||
};
|
||
|
||
_this.createHandleEditingCell = _this.createHandleEditingCell.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(Cell, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
var shouldUpdate = false;
|
||
if (nextProps.column.isDummyField) {
|
||
shouldUpdate = !_utils2.default.isEqual(this.props.row, nextProps.row);
|
||
} else {
|
||
shouldUpdate = _utils2.default.get(this.props.row, this.props.column.dataField) !== _utils2.default.get(nextProps.row, nextProps.column.dataField);
|
||
}
|
||
|
||
if (shouldUpdate) return true;
|
||
|
||
// if (nextProps.formatter)
|
||
|
||
shouldUpdate = (nextProps.column.formatter ? !_utils2.default.isEqual(this.props.row, nextProps.row) : false) || this.props.column.hidden !== nextProps.column.hidden || this.props.column.isDummyField !== nextProps.column.isDummyField || this.props.rowIndex !== nextProps.rowIndex || this.props.columnIndex !== nextProps.columnIndex || this.props.className !== nextProps.className || this.props.title !== nextProps.title || this.props.editable !== nextProps.editable || this.props.clickToEdit !== nextProps.clickToEdit || this.props.dbclickToEdit !== nextProps.dbclickToEdit || !_utils2.default.isEqual(this.props.style, nextProps.style) || !_utils2.default.isEqual(this.props.column.formatExtraData, nextProps.column.formatExtraData) || !_utils2.default.isEqual(this.props.column.events, nextProps.column.events) || !_utils2.default.isEqual(this.props.column.attrs, nextProps.column.attrs) || this.props.tabIndex !== nextProps.tabIndex;
|
||
return shouldUpdate;
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
row = _props.row,
|
||
rowIndex = _props.rowIndex,
|
||
column = _props.column,
|
||
columnIndex = _props.columnIndex,
|
||
onStart = _props.onStart,
|
||
editable = _props.editable,
|
||
clickToEdit = _props.clickToEdit,
|
||
dbclickToEdit = _props.dbclickToEdit,
|
||
rest = _objectWithoutProperties(_props, ['row', 'rowIndex', 'column', 'columnIndex', 'onStart', 'editable', 'clickToEdit', 'dbclickToEdit']);
|
||
|
||
var dataField = column.dataField,
|
||
formatter = column.formatter,
|
||
formatExtraData = column.formatExtraData;
|
||
|
||
var attrs = this.delegate(_extends({}, rest));
|
||
var content = column.isDummyField ? null : _utils2.default.get(row, dataField);
|
||
|
||
if (formatter) {
|
||
content = column.formatter(content, row, rowIndex, formatExtraData);
|
||
}
|
||
|
||
if (clickToEdit && editable) {
|
||
attrs.onClick = this.createHandleEditingCell(attrs.onClick);
|
||
} else if (dbclickToEdit && editable) {
|
||
attrs.onDoubleClick = this.createHandleEditingCell(attrs.onDoubleClick);
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'td',
|
||
attrs,
|
||
typeof content === 'boolean' ? '' + content : content
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return Cell;
|
||
}((0, _cellEventDelegater2.default)(_react.Component));
|
||
|
||
Cell.propTypes = {
|
||
row: _propTypes2.default.object.isRequired,
|
||
rowIndex: _propTypes2.default.number.isRequired,
|
||
column: _propTypes2.default.object.isRequired,
|
||
columnIndex: _propTypes2.default.number.isRequired
|
||
};
|
||
|
||
exports.default = Cell;
|
||
|
||
/***/ }),
|
||
/* 47 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _expandCell = __webpack_require__(48);
|
||
|
||
var _expandCell2 = _interopRequireDefault(_expandCell);
|
||
|
||
var _selectionCell = __webpack_require__(49);
|
||
|
||
var _selectionCell2 = _interopRequireDefault(_selectionCell);
|
||
|
||
var _shouldUpdater2 = __webpack_require__(15);
|
||
|
||
var _shouldUpdater3 = _interopRequireDefault(_shouldUpdater2);
|
||
|
||
var _eventDelegater = __webpack_require__(14);
|
||
|
||
var _eventDelegater2 = _interopRequireDefault(_eventDelegater);
|
||
|
||
var _rowPureContent = __webpack_require__(13);
|
||
|
||
var _rowPureContent2 = _interopRequireDefault(_rowPureContent);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint class-methods-use-this: 0 */
|
||
/* eslint react/prop-types: 0 */
|
||
/* eslint no-plusplus: 0 */
|
||
|
||
|
||
var RowAggregator = function (_shouldUpdater) {
|
||
_inherits(RowAggregator, _shouldUpdater);
|
||
|
||
function RowAggregator(props) {
|
||
_classCallCheck(this, RowAggregator);
|
||
|
||
var _this = _possibleConstructorReturn(this, (RowAggregator.__proto__ || Object.getPrototypeOf(RowAggregator)).call(this, props));
|
||
|
||
_this.clickNum = 0;
|
||
_this.shouldUpdateRowContent = false;
|
||
_this.createClickEventHandler = _this.createClickEventHandler.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(RowAggregator, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
if (this.props.selected !== nextProps.selected || this.props.expanded !== nextProps.expanded || this.props.expandable !== nextProps.expandable || this.props.selectable !== nextProps.selectable || this.props.selectRow.hideSelectColumn !== nextProps.selectRow.hideSelectColumn || this.shouldUpdatedBySelfProps(nextProps)) {
|
||
this.shouldUpdateRowContent = this.shouldRowContentUpdate(nextProps);
|
||
return true;
|
||
}
|
||
this.shouldUpdateRowContent = this.shouldRowContentUpdate(nextProps);
|
||
|
||
return this.shouldUpdateRowContent;
|
||
}
|
||
}, {
|
||
key: 'isRenderFunctionColumnInLeft',
|
||
value: function isRenderFunctionColumnInLeft() {
|
||
var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _const2.default.INDICATOR_POSITION_LEFT;
|
||
|
||
return position === _const2.default.INDICATOR_POSITION_LEFT;
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
row = _props.row,
|
||
columns = _props.columns,
|
||
keyField = _props.keyField,
|
||
rowIndex = _props.rowIndex,
|
||
style = _props.style,
|
||
className = _props.className,
|
||
attrs = _props.attrs,
|
||
selectRow = _props.selectRow,
|
||
expandRow = _props.expandRow,
|
||
expanded = _props.expanded,
|
||
expandable = _props.expandable,
|
||
selected = _props.selected,
|
||
selectable = _props.selectable,
|
||
visibleColumnSize = _props.visibleColumnSize,
|
||
tabIndexCell = _props.tabIndexCell,
|
||
rest = _objectWithoutProperties(_props, ['row', 'columns', 'keyField', 'rowIndex', 'style', 'className', 'attrs', 'selectRow', 'expandRow', 'expanded', 'expandable', 'selected', 'selectable', 'visibleColumnSize', 'tabIndexCell']);
|
||
|
||
var key = _utils2.default.get(row, keyField);
|
||
var hideSelectColumn = selectRow.hideSelectColumn,
|
||
selectColumnPosition = selectRow.selectColumnPosition,
|
||
clickToSelect = selectRow.clickToSelect;
|
||
var showExpandColumn = expandRow.showExpandColumn,
|
||
expandColumnPosition = expandRow.expandColumnPosition;
|
||
|
||
|
||
var newAttrs = this.delegate(_extends({}, attrs));
|
||
if (clickToSelect || !!expandRow.renderer) {
|
||
newAttrs.onClick = this.createClickEventHandler(newAttrs.onClick);
|
||
}
|
||
|
||
var tabIndexStart = rowIndex * visibleColumnSize + 1;
|
||
|
||
var childrens = [_react2.default.createElement(_rowPureContent2.default, _extends({
|
||
key: 'row',
|
||
row: row,
|
||
columns: columns,
|
||
keyField: keyField,
|
||
rowIndex: rowIndex,
|
||
shouldUpdate: this.shouldUpdateRowContent,
|
||
tabIndexStart: tabIndexCell ? tabIndexStart : -1
|
||
}, rest))];
|
||
|
||
if (!hideSelectColumn) {
|
||
var selectCell = _react2.default.createElement(_selectionCell2.default, _extends({}, selectRow, {
|
||
key: 'selection-cell',
|
||
rowKey: key,
|
||
rowIndex: rowIndex,
|
||
selected: selected,
|
||
disabled: !selectable,
|
||
tabIndex: tabIndexCell ? tabIndexStart++ : -1
|
||
}));
|
||
if (this.isRenderFunctionColumnInLeft(selectColumnPosition)) {
|
||
childrens.unshift(selectCell);
|
||
} else {
|
||
childrens.push(selectCell);
|
||
}
|
||
}
|
||
|
||
if (showExpandColumn) {
|
||
var expandCell = _react2.default.createElement(_expandCell2.default, _extends({}, expandRow, {
|
||
key: 'expand-cell',
|
||
rowKey: key,
|
||
rowIndex: rowIndex,
|
||
expanded: expanded,
|
||
expandable: expandable,
|
||
tabIndex: tabIndexCell ? tabIndexStart++ : -1
|
||
}));
|
||
if (this.isRenderFunctionColumnInLeft(expandColumnPosition)) {
|
||
childrens.unshift(expandCell);
|
||
} else {
|
||
childrens.push(expandCell);
|
||
}
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'tr',
|
||
_extends({
|
||
style: style,
|
||
className: className
|
||
}, newAttrs),
|
||
childrens
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return RowAggregator;
|
||
}((0, _shouldUpdater3.default)((0, _eventDelegater2.default)(_react2.default.Component)));
|
||
|
||
RowAggregator.propTypes = {
|
||
attrs: _propTypes2.default.object,
|
||
style: _propTypes2.default.object
|
||
};
|
||
RowAggregator.defaultProps = {
|
||
attrs: {},
|
||
style: {}
|
||
};
|
||
exports.default = RowAggregator;
|
||
|
||
/***/ }),
|
||
/* 48 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint
|
||
react/require-default-props: 0
|
||
jsx-a11y/no-noninteractive-element-interactions: 0
|
||
*/
|
||
/* eslint no-nested-ternary: 0 */
|
||
|
||
|
||
var ExpandCell = function (_Component) {
|
||
_inherits(ExpandCell, _Component);
|
||
|
||
function ExpandCell() {
|
||
_classCallCheck(this, ExpandCell);
|
||
|
||
var _this = _possibleConstructorReturn(this, (ExpandCell.__proto__ || Object.getPrototypeOf(ExpandCell)).call(this));
|
||
|
||
_this.handleClick = _this.handleClick.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(ExpandCell, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
var shouldUpdate = this.props.rowIndex !== nextProps.rowIndex || this.props.expanded !== nextProps.expanded || this.props.rowKey !== nextProps.rowKey || this.props.tabIndex !== nextProps.tabIndex;
|
||
|
||
return shouldUpdate;
|
||
}
|
||
}, {
|
||
key: 'handleClick',
|
||
value: function handleClick(e) {
|
||
var _props = this.props,
|
||
rowKey = _props.rowKey,
|
||
expanded = _props.expanded,
|
||
onRowExpand = _props.onRowExpand,
|
||
rowIndex = _props.rowIndex;
|
||
|
||
e.stopPropagation();
|
||
onRowExpand(rowKey, !expanded, rowIndex, e);
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props2 = this.props,
|
||
expanded = _props2.expanded,
|
||
expandable = _props2.expandable,
|
||
expandColumnRenderer = _props2.expandColumnRenderer,
|
||
tabIndex = _props2.tabIndex,
|
||
rowKey = _props2.rowKey;
|
||
|
||
var attrs = {};
|
||
if (tabIndex !== -1) attrs.tabIndex = tabIndex;
|
||
|
||
return _react2.default.createElement(
|
||
'td',
|
||
_extends({ className: 'expand-cell', onClick: this.handleClick }, attrs),
|
||
expandColumnRenderer ? expandColumnRenderer({
|
||
expandable: expandable,
|
||
expanded: expanded,
|
||
rowKey: rowKey
|
||
}) : expandable ? expanded ? '(-)' : '(+)' : ''
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return ExpandCell;
|
||
}(_react.Component);
|
||
|
||
ExpandCell.propTypes = {
|
||
rowKey: _propTypes2.default.any,
|
||
expanded: _propTypes2.default.bool.isRequired,
|
||
expandable: _propTypes2.default.bool.isRequired,
|
||
onRowExpand: _propTypes2.default.func.isRequired,
|
||
expandColumnRenderer: _propTypes2.default.func,
|
||
rowIndex: _propTypes2.default.number,
|
||
tabIndex: _propTypes2.default.number
|
||
};
|
||
exports.default = ExpandCell;
|
||
|
||
/***/ }),
|
||
/* 49 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _bootstrap = __webpack_require__(5);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint
|
||
react/require-default-props: 0
|
||
jsx-a11y/no-noninteractive-element-interactions: 0
|
||
*/
|
||
|
||
|
||
var SelectionCell = function (_Component) {
|
||
_inherits(SelectionCell, _Component);
|
||
|
||
function SelectionCell() {
|
||
_classCallCheck(this, SelectionCell);
|
||
|
||
var _this = _possibleConstructorReturn(this, (SelectionCell.__proto__ || Object.getPrototypeOf(SelectionCell)).call(this));
|
||
|
||
_this.handleClick = _this.handleClick.bind(_this);
|
||
return _this;
|
||
}
|
||
|
||
_createClass(SelectionCell, [{
|
||
key: 'shouldComponentUpdate',
|
||
value: function shouldComponentUpdate(nextProps) {
|
||
var shouldUpdate = this.props.rowIndex !== nextProps.rowIndex || this.props.selected !== nextProps.selected || this.props.disabled !== nextProps.disabled || this.props.rowKey !== nextProps.rowKey || this.props.tabIndex !== nextProps.tabIndex || this.props.selectColumnStyle !== nextProps.selectColumnStyle;
|
||
|
||
return shouldUpdate;
|
||
}
|
||
}, {
|
||
key: 'handleClick',
|
||
value: function handleClick(e) {
|
||
var _props = this.props,
|
||
inputType = _props.mode,
|
||
rowKey = _props.rowKey,
|
||
selected = _props.selected,
|
||
onRowSelect = _props.onRowSelect,
|
||
disabled = _props.disabled,
|
||
rowIndex = _props.rowIndex;
|
||
|
||
e.stopPropagation();
|
||
if (disabled) return;
|
||
|
||
var checked = inputType === _const2.default.ROW_SELECT_SINGLE ? true : !selected;
|
||
|
||
onRowSelect(rowKey, checked, rowIndex, e);
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _this2 = this;
|
||
|
||
var _props2 = this.props,
|
||
rowKey = _props2.rowKey,
|
||
inputType = _props2.mode,
|
||
selected = _props2.selected,
|
||
disabled = _props2.disabled,
|
||
tabIndex = _props2.tabIndex,
|
||
rowIndex = _props2.rowIndex,
|
||
selectionRenderer = _props2.selectionRenderer,
|
||
selectColumnStyle = _props2.selectColumnStyle;
|
||
|
||
|
||
var attrs = {};
|
||
if (tabIndex !== -1) attrs.tabIndex = tabIndex;
|
||
|
||
attrs.style = _utils2.default.isFunction(selectColumnStyle) ? selectColumnStyle({
|
||
checked: selected,
|
||
disabled: disabled,
|
||
rowIndex: rowIndex,
|
||
rowKey: rowKey
|
||
}) : selectColumnStyle;
|
||
|
||
return _react2.default.createElement(
|
||
_bootstrap.BootstrapContext.Consumer,
|
||
null,
|
||
function (_ref) {
|
||
var bootstrap4 = _ref.bootstrap4;
|
||
return _react2.default.createElement(
|
||
'td',
|
||
_extends({ className: 'selection-cell', onClick: _this2.handleClick }, attrs),
|
||
selectionRenderer ? selectionRenderer({
|
||
mode: inputType,
|
||
checked: selected,
|
||
disabled: disabled,
|
||
rowIndex: rowIndex
|
||
}) : _react2.default.createElement('input', {
|
||
type: inputType,
|
||
checked: selected,
|
||
disabled: disabled,
|
||
className: bootstrap4 ? 'selection-input-4' : '',
|
||
onChange: function onChange() {}
|
||
})
|
||
);
|
||
}
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return SelectionCell;
|
||
}(_react.Component);
|
||
|
||
SelectionCell.propTypes = {
|
||
mode: _propTypes2.default.string.isRequired,
|
||
rowKey: _propTypes2.default.any,
|
||
selected: _propTypes2.default.bool,
|
||
onRowSelect: _propTypes2.default.func,
|
||
disabled: _propTypes2.default.bool,
|
||
rowIndex: _propTypes2.default.number,
|
||
tabIndex: _propTypes2.default.number,
|
||
clickToSelect: _propTypes2.default.bool,
|
||
selectionRenderer: _propTypes2.default.func,
|
||
selectColumnStyle: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.func])
|
||
};
|
||
exports.default = SelectionCell;
|
||
|
||
/***/ }),
|
||
/* 50 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var RowSection = function RowSection(_ref) {
|
||
var content = _ref.content,
|
||
colSpan = _ref.colSpan;
|
||
return _react2.default.createElement(
|
||
'tr',
|
||
null,
|
||
_react2.default.createElement(
|
||
'td',
|
||
{
|
||
'data-toggle': 'collapse',
|
||
colSpan: colSpan,
|
||
className: 'react-bs-table-no-data'
|
||
},
|
||
content
|
||
)
|
||
);
|
||
};
|
||
|
||
RowSection.propTypes = {
|
||
content: _propTypes2.default.any,
|
||
colSpan: _propTypes2.default.number
|
||
};
|
||
|
||
RowSection.defaultProps = {
|
||
content: null,
|
||
colSpan: 1
|
||
};
|
||
|
||
exports.default = RowSection;
|
||
|
||
/***/ }),
|
||
/* 51 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* eslint react/prop-types: 0 */
|
||
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _selectionContext = __webpack_require__(8);
|
||
|
||
var _selectionContext2 = _interopRequireDefault(_selectionContext);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = function (Component) {
|
||
var renderWithSelection = function renderWithSelection(props, selectRow) {
|
||
var key = props.value;
|
||
var selected = _utils2.default.contains(selectRow.selected, key);
|
||
var selectable = !selectRow.nonSelectable || !_utils2.default.contains(selectRow.nonSelectable, key);
|
||
var notSelectable = _utils2.default.contains(selectRow.nonSelectable, key);
|
||
|
||
var style = props.style,
|
||
className = props.className;
|
||
|
||
|
||
if (selected) {
|
||
var selectedStyle = _utils2.default.isFunction(selectRow.style) ? selectRow.style(props.row, props.rowIndex) : selectRow.style;
|
||
|
||
var selectedClasses = _utils2.default.isFunction(selectRow.classes) ? selectRow.classes(props.row, props.rowIndex) : selectRow.classes;
|
||
|
||
style = _extends({}, style, selectedStyle);
|
||
className = (0, _classnames2.default)(className, selectedClasses) || undefined;
|
||
|
||
if (selectRow.bgColor) {
|
||
style = style || {};
|
||
style.backgroundColor = _utils2.default.isFunction(selectRow.bgColor) ? selectRow.bgColor(props.row, props.rowIndex) : selectRow.bgColor;
|
||
}
|
||
}
|
||
|
||
if (notSelectable) {
|
||
var notSelectableStyle = _utils2.default.isFunction(selectRow.nonSelectableStyle) ? selectRow.nonSelectableStyle(props.row, props.rowIndex) : selectRow.nonSelectableStyle;
|
||
|
||
var notSelectableClasses = _utils2.default.isFunction(selectRow.nonSelectableClasses) ? selectRow.nonSelectableClasses(props.row, props.rowIndex) : selectRow.nonSelectableClasses;
|
||
|
||
style = _extends({}, style, notSelectableStyle);
|
||
className = (0, _classnames2.default)(className, notSelectableClasses) || undefined;
|
||
}
|
||
|
||
return _react2.default.createElement(Component, _extends({}, props, {
|
||
style: style,
|
||
className: className,
|
||
selectRow: selectRow,
|
||
selected: selected,
|
||
selectable: selectable
|
||
}));
|
||
};
|
||
|
||
function withConsumer(props) {
|
||
return _react2.default.createElement(
|
||
_selectionContext2.default.Consumer,
|
||
null,
|
||
function (selectRow) {
|
||
return renderWithSelection(props, selectRow);
|
||
}
|
||
);
|
||
}
|
||
|
||
withConsumer.displayName = 'WithSelectionRowConsumer';
|
||
return withConsumer;
|
||
};
|
||
|
||
/***/ }),
|
||
/* 52 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* eslint react/prop-types: 0 */
|
||
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _expandRow = __webpack_require__(53);
|
||
|
||
var _expandRow2 = _interopRequireDefault(_expandRow);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _rowExpandContext = __webpack_require__(10);
|
||
|
||
var _rowExpandContext2 = _interopRequireDefault(_rowExpandContext);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = function (Component) {
|
||
var renderWithExpansion = function renderWithExpansion(props, expandRow) {
|
||
var parentClassName = '';
|
||
var className = '';
|
||
var key = props.value;
|
||
|
||
var expanded = _utils2.default.contains(expandRow.expanded, key);
|
||
var isClosing = _utils2.default.contains(expandRow.isClosing, key);
|
||
var expandable = !expandRow.nonExpandable || !_utils2.default.contains(expandRow.nonExpandable, key);
|
||
if (expanded) {
|
||
parentClassName = _utils2.default.isFunction(expandRow.parentClassName) ? expandRow.parentClassName(expanded, props.row, props.rowIndex) : expandRow.parentClassName || '';
|
||
|
||
className = _utils2.default.isFunction(expandRow.className) ? expandRow.className(expanded, props.row, props.rowIndex) : expandRow.className || '';
|
||
}
|
||
|
||
return [_react2.default.createElement(Component, _extends({}, props, {
|
||
key: key,
|
||
expanded: expanded,
|
||
expandable: expandable,
|
||
expandRow: _extends({}, expandRow),
|
||
className: (0, _classnames2.default)(props.className, parentClassName)
|
||
})), expanded || isClosing ? _react2.default.createElement(
|
||
_expandRow2.default,
|
||
{
|
||
key: key + '-expanding',
|
||
colSpan: props.visibleColumnSize,
|
||
expanded: expanded,
|
||
onClosed: function onClosed() {
|
||
return expandRow.onClosed(key);
|
||
},
|
||
className: className
|
||
},
|
||
expandRow.renderer(props.row, props.rowIndex)
|
||
) : null];
|
||
};
|
||
return function (props) {
|
||
return _react2.default.createElement(
|
||
_rowExpandContext2.default.Consumer,
|
||
null,
|
||
function (expandRow) {
|
||
return renderWithExpansion(props, expandRow);
|
||
}
|
||
);
|
||
};
|
||
};
|
||
|
||
/***/ }),
|
||
/* 53 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _reactTransitionGroup = __webpack_require__(54);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
||
|
||
var ExpandRow = function ExpandRow(_ref) {
|
||
var children = _ref.children,
|
||
expanded = _ref.expanded,
|
||
onClosed = _ref.onClosed,
|
||
className = _ref.className,
|
||
rest = _objectWithoutProperties(_ref, ['children', 'expanded', 'onClosed', 'className']);
|
||
|
||
return _react2.default.createElement(
|
||
'tr',
|
||
null,
|
||
_react2.default.createElement(
|
||
'td',
|
||
_extends({ className: (0, _classnames2.default)('reset-expansion-style', className) }, rest),
|
||
_react2.default.createElement(
|
||
_reactTransitionGroup.CSSTransition,
|
||
{
|
||
appear: true,
|
||
'in': expanded,
|
||
timeout: 400,
|
||
classNames: 'row-expand-slide',
|
||
onExited: onClosed
|
||
},
|
||
_react2.default.createElement(
|
||
'div',
|
||
null,
|
||
_react2.default.createElement(
|
||
'div',
|
||
{ className: 'row-expansion-style' },
|
||
children
|
||
)
|
||
)
|
||
)
|
||
)
|
||
);
|
||
};
|
||
|
||
ExpandRow.propTypes = {
|
||
children: _propTypes2.default.node,
|
||
expanded: _propTypes2.default.bool,
|
||
onClosed: _propTypes2.default.func,
|
||
className: _propTypes2.default.string
|
||
};
|
||
|
||
ExpandRow.defaultProps = {
|
||
children: null,
|
||
expanded: false,
|
||
onClosed: null,
|
||
className: ''
|
||
};
|
||
|
||
exports.default = ExpandRow;
|
||
|
||
/***/ }),
|
||
/* 54 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
var _CSSTransition = _interopRequireDefault(__webpack_require__(55));
|
||
|
||
var _ReplaceTransition = _interopRequireDefault(__webpack_require__(60));
|
||
|
||
var _TransitionGroup = _interopRequireDefault(__webpack_require__(20));
|
||
|
||
var _Transition = _interopRequireDefault(__webpack_require__(16));
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
module.exports = {
|
||
Transition: _Transition.default,
|
||
TransitionGroup: _TransitionGroup.default,
|
||
ReplaceTransition: _ReplaceTransition.default,
|
||
CSSTransition: _CSSTransition.default
|
||
};
|
||
|
||
/***/ }),
|
||
/* 55 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.default = void 0;
|
||
|
||
var PropTypes = _interopRequireWildcard(__webpack_require__(1));
|
||
|
||
var _addClass = _interopRequireDefault(__webpack_require__(56));
|
||
|
||
var _removeClass = _interopRequireDefault(__webpack_require__(59));
|
||
|
||
var _react = _interopRequireDefault(__webpack_require__(0));
|
||
|
||
var _Transition = _interopRequireDefault(__webpack_require__(16));
|
||
|
||
var _PropTypes = __webpack_require__(19);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
|
||
|
||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
||
|
||
var addClass = function addClass(node, classes) {
|
||
return node && classes && classes.split(' ').forEach(function (c) {
|
||
return (0, _addClass.default)(node, c);
|
||
});
|
||
};
|
||
|
||
var removeClass = function removeClass(node, classes) {
|
||
return node && classes && classes.split(' ').forEach(function (c) {
|
||
return (0, _removeClass.default)(node, c);
|
||
});
|
||
};
|
||
/**
|
||
* A `Transition` component using CSS transitions and animations.
|
||
* It's inspired by the excellent [ng-animate](http://www.nganimate.org/) library.
|
||
*
|
||
* `CSSTransition` applies a pair of class names during the `appear`, `enter`,
|
||
* and `exit` stages of the transition. The first class is applied and then a
|
||
* second "active" class in order to activate the css animation. After the animation,
|
||
* matching `done` class names are applied to persist the animation state.
|
||
*
|
||
* When the `in` prop is toggled to `true` the Component will get
|
||
* the `example-enter` CSS class and the `example-enter-active` CSS class
|
||
* added in the next tick. This is a convention based on the `classNames` prop.
|
||
*/
|
||
|
||
|
||
var CSSTransition =
|
||
/*#__PURE__*/
|
||
function (_React$Component) {
|
||
_inheritsLoose(CSSTransition, _React$Component);
|
||
|
||
function CSSTransition() {
|
||
var _this;
|
||
|
||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
||
args[_key] = arguments[_key];
|
||
}
|
||
|
||
_this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
|
||
|
||
_this.onEnter = function (node, appearing) {
|
||
var _this$getClassNames = _this.getClassNames(appearing ? 'appear' : 'enter'),
|
||
className = _this$getClassNames.className;
|
||
|
||
_this.removeClasses(node, 'exit');
|
||
|
||
addClass(node, className);
|
||
|
||
if (_this.props.onEnter) {
|
||
_this.props.onEnter(node, appearing);
|
||
}
|
||
};
|
||
|
||
_this.onEntering = function (node, appearing) {
|
||
var _this$getClassNames2 = _this.getClassNames(appearing ? 'appear' : 'enter'),
|
||
activeClassName = _this$getClassNames2.activeClassName;
|
||
|
||
_this.reflowAndAddClass(node, activeClassName);
|
||
|
||
if (_this.props.onEntering) {
|
||
_this.props.onEntering(node, appearing);
|
||
}
|
||
};
|
||
|
||
_this.onEntered = function (node, appearing) {
|
||
var _this$getClassNames3 = _this.getClassNames('enter'),
|
||
doneClassName = _this$getClassNames3.doneClassName;
|
||
|
||
_this.removeClasses(node, appearing ? 'appear' : 'enter');
|
||
|
||
addClass(node, doneClassName);
|
||
|
||
if (_this.props.onEntered) {
|
||
_this.props.onEntered(node, appearing);
|
||
}
|
||
};
|
||
|
||
_this.onExit = function (node) {
|
||
var _this$getClassNames4 = _this.getClassNames('exit'),
|
||
className = _this$getClassNames4.className;
|
||
|
||
_this.removeClasses(node, 'appear');
|
||
|
||
_this.removeClasses(node, 'enter');
|
||
|
||
addClass(node, className);
|
||
|
||
if (_this.props.onExit) {
|
||
_this.props.onExit(node);
|
||
}
|
||
};
|
||
|
||
_this.onExiting = function (node) {
|
||
var _this$getClassNames5 = _this.getClassNames('exit'),
|
||
activeClassName = _this$getClassNames5.activeClassName;
|
||
|
||
_this.reflowAndAddClass(node, activeClassName);
|
||
|
||
if (_this.props.onExiting) {
|
||
_this.props.onExiting(node);
|
||
}
|
||
};
|
||
|
||
_this.onExited = function (node) {
|
||
var _this$getClassNames6 = _this.getClassNames('exit'),
|
||
doneClassName = _this$getClassNames6.doneClassName;
|
||
|
||
_this.removeClasses(node, 'exit');
|
||
|
||
addClass(node, doneClassName);
|
||
|
||
if (_this.props.onExited) {
|
||
_this.props.onExited(node);
|
||
}
|
||
};
|
||
|
||
_this.getClassNames = function (type) {
|
||
var classNames = _this.props.classNames;
|
||
var className = typeof classNames !== 'string' ? classNames[type] : classNames + '-' + type;
|
||
var activeClassName = typeof classNames !== 'string' ? classNames[type + 'Active'] : className + '-active';
|
||
var doneClassName = typeof classNames !== 'string' ? classNames[type + 'Done'] : className + '-done';
|
||
return {
|
||
className: className,
|
||
activeClassName: activeClassName,
|
||
doneClassName: doneClassName
|
||
};
|
||
};
|
||
|
||
return _this;
|
||
}
|
||
|
||
var _proto = CSSTransition.prototype;
|
||
|
||
_proto.removeClasses = function removeClasses(node, type) {
|
||
var _this$getClassNames7 = this.getClassNames(type),
|
||
className = _this$getClassNames7.className,
|
||
activeClassName = _this$getClassNames7.activeClassName,
|
||
doneClassName = _this$getClassNames7.doneClassName;
|
||
|
||
className && removeClass(node, className);
|
||
activeClassName && removeClass(node, activeClassName);
|
||
doneClassName && removeClass(node, doneClassName);
|
||
};
|
||
|
||
_proto.reflowAndAddClass = function reflowAndAddClass(node, className) {
|
||
// This is for to force a repaint,
|
||
// which is necessary in order to transition styles when adding a class name.
|
||
if (className) {
|
||
/* eslint-disable no-unused-expressions */
|
||
node && node.scrollTop;
|
||
/* eslint-enable no-unused-expressions */
|
||
|
||
addClass(node, className);
|
||
}
|
||
};
|
||
|
||
_proto.render = function render() {
|
||
var props = _extends({}, this.props);
|
||
|
||
delete props.classNames;
|
||
return _react.default.createElement(_Transition.default, _extends({}, props, {
|
||
onEnter: this.onEnter,
|
||
onEntered: this.onEntered,
|
||
onEntering: this.onEntering,
|
||
onExit: this.onExit,
|
||
onExiting: this.onExiting,
|
||
onExited: this.onExited
|
||
}));
|
||
};
|
||
|
||
return CSSTransition;
|
||
}(_react.default.Component);
|
||
|
||
CSSTransition.propTypes = false ? _extends({}, _Transition.default.propTypes, {
|
||
/**
|
||
* The animation classNames applied to the component as it enters, exits or has finished the transition.
|
||
* A single name can be provided and it will be suffixed for each stage: e.g.
|
||
*
|
||
* `classNames="fade"` applies `fade-enter`, `fade-enter-active`, `fade-enter-done`,
|
||
* `fade-exit`, `fade-exit-active`, `fade-exit-done`, `fade-appear`, and `fade-appear-active`.
|
||
* Each individual classNames can also be specified independently like:
|
||
*
|
||
* ```js
|
||
* classNames={{
|
||
* appear: 'my-appear',
|
||
* appearActive: 'my-active-appear',
|
||
* enter: 'my-enter',
|
||
* enterActive: 'my-active-enter',
|
||
* enterDone: 'my-done-enter',
|
||
* exit: 'my-exit',
|
||
* exitActive: 'my-active-exit',
|
||
* exitDone: 'my-done-exit',
|
||
* }}
|
||
* ```
|
||
*
|
||
* If you want to set these classes using CSS Modules:
|
||
*
|
||
* ```js
|
||
* import styles from './styles.css';
|
||
* ```
|
||
*
|
||
* you might want to use camelCase in your CSS file, that way could simply spread
|
||
* them instead of listing them one by one:
|
||
*
|
||
* ```js
|
||
* classNames={{ ...styles }}
|
||
* ```
|
||
*
|
||
* @type {string | {
|
||
* appear?: string,
|
||
* appearActive?: string,
|
||
* enter?: string,
|
||
* enterActive?: string,
|
||
* enterDone?: string,
|
||
* exit?: string,
|
||
* exitActive?: string,
|
||
* exitDone?: string,
|
||
* }}
|
||
*/
|
||
classNames: _PropTypes.classNamesShape,
|
||
|
||
/**
|
||
* A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is
|
||
* applied.
|
||
*
|
||
* @type Function(node: HtmlElement, isAppearing: bool)
|
||
*/
|
||
onEnter: PropTypes.func,
|
||
|
||
/**
|
||
* A `<Transition>` callback fired immediately after the 'enter-active' or
|
||
* 'appear-active' class is applied.
|
||
*
|
||
* @type Function(node: HtmlElement, isAppearing: bool)
|
||
*/
|
||
onEntering: PropTypes.func,
|
||
|
||
/**
|
||
* A `<Transition>` callback fired immediately after the 'enter' or
|
||
* 'appear' classes are **removed** and the `done` class is added to the DOM node.
|
||
*
|
||
* @type Function(node: HtmlElement, isAppearing: bool)
|
||
*/
|
||
onEntered: PropTypes.func,
|
||
|
||
/**
|
||
* A `<Transition>` callback fired immediately after the 'exit' class is
|
||
* applied.
|
||
*
|
||
* @type Function(node: HtmlElement)
|
||
*/
|
||
onExit: PropTypes.func,
|
||
|
||
/**
|
||
* A `<Transition>` callback fired immediately after the 'exit-active' is applied.
|
||
*
|
||
* @type Function(node: HtmlElement)
|
||
*/
|
||
onExiting: PropTypes.func,
|
||
|
||
/**
|
||
* A `<Transition>` callback fired immediately after the 'exit' classes
|
||
* are **removed** and the `exit-done` class is added to the DOM node.
|
||
*
|
||
* @type Function(node: HtmlElement)
|
||
*/
|
||
onExited: PropTypes.func
|
||
}) : {};
|
||
var _default = CSSTransition;
|
||
exports.default = _default;
|
||
module.exports = exports["default"];
|
||
|
||
/***/ }),
|
||
/* 56 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
var _interopRequireDefault = __webpack_require__(57);
|
||
|
||
exports.__esModule = true;
|
||
exports.default = addClass;
|
||
|
||
var _hasClass = _interopRequireDefault(__webpack_require__(58));
|
||
|
||
function addClass(element, className) {
|
||
if (element.classList) element.classList.add(className);else if (!(0, _hasClass.default)(element, className)) if (typeof element.className === 'string') element.className = element.className + ' ' + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + ' ' + className);
|
||
}
|
||
|
||
module.exports = exports["default"];
|
||
|
||
/***/ }),
|
||
/* 57 */
|
||
/***/ (function(module, exports) {
|
||
|
||
function _interopRequireDefault(obj) {
|
||
return obj && obj.__esModule ? obj : {
|
||
"default": obj
|
||
};
|
||
}
|
||
|
||
module.exports = _interopRequireDefault;
|
||
|
||
/***/ }),
|
||
/* 58 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.default = hasClass;
|
||
|
||
function hasClass(element, className) {
|
||
if (element.classList) return !!className && element.classList.contains(className);else return (" " + (element.className.baseVal || element.className) + " ").indexOf(" " + className + " ") !== -1;
|
||
}
|
||
|
||
module.exports = exports["default"];
|
||
|
||
/***/ }),
|
||
/* 59 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
function replaceClassName(origClass, classToRemove) {
|
||
return origClass.replace(new RegExp('(^|\\s)' + classToRemove + '(?:\\s|$)', 'g'), '$1').replace(/\s+/g, ' ').replace(/^\s*|\s*$/g, '');
|
||
}
|
||
|
||
module.exports = function removeClass(element, className) {
|
||
if (element.classList) element.classList.remove(className);else if (typeof element.className === 'string') element.className = replaceClassName(element.className, className);else element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));
|
||
};
|
||
|
||
/***/ }),
|
||
/* 60 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.default = void 0;
|
||
|
||
var _propTypes = _interopRequireDefault(__webpack_require__(1));
|
||
|
||
var _react = _interopRequireDefault(__webpack_require__(0));
|
||
|
||
var _reactDom = __webpack_require__(17);
|
||
|
||
var _TransitionGroup = _interopRequireDefault(__webpack_require__(20));
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||
|
||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
||
|
||
/**
|
||
* The `<ReplaceTransition>` component is a specialized `Transition` component
|
||
* that animates between two children.
|
||
*
|
||
* ```jsx
|
||
* <ReplaceTransition in>
|
||
* <Fade><div>I appear first</div></Fade>
|
||
* <Fade><div>I replace the above</div></Fade>
|
||
* </ReplaceTransition>
|
||
* ```
|
||
*/
|
||
var ReplaceTransition =
|
||
/*#__PURE__*/
|
||
function (_React$Component) {
|
||
_inheritsLoose(ReplaceTransition, _React$Component);
|
||
|
||
function ReplaceTransition() {
|
||
var _this;
|
||
|
||
for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
|
||
_args[_key] = arguments[_key];
|
||
}
|
||
|
||
_this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;
|
||
|
||
_this.handleEnter = function () {
|
||
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
||
args[_key2] = arguments[_key2];
|
||
}
|
||
|
||
return _this.handleLifecycle('onEnter', 0, args);
|
||
};
|
||
|
||
_this.handleEntering = function () {
|
||
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
||
args[_key3] = arguments[_key3];
|
||
}
|
||
|
||
return _this.handleLifecycle('onEntering', 0, args);
|
||
};
|
||
|
||
_this.handleEntered = function () {
|
||
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
||
args[_key4] = arguments[_key4];
|
||
}
|
||
|
||
return _this.handleLifecycle('onEntered', 0, args);
|
||
};
|
||
|
||
_this.handleExit = function () {
|
||
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
||
args[_key5] = arguments[_key5];
|
||
}
|
||
|
||
return _this.handleLifecycle('onExit', 1, args);
|
||
};
|
||
|
||
_this.handleExiting = function () {
|
||
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
|
||
args[_key6] = arguments[_key6];
|
||
}
|
||
|
||
return _this.handleLifecycle('onExiting', 1, args);
|
||
};
|
||
|
||
_this.handleExited = function () {
|
||
for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
|
||
args[_key7] = arguments[_key7];
|
||
}
|
||
|
||
return _this.handleLifecycle('onExited', 1, args);
|
||
};
|
||
|
||
return _this;
|
||
}
|
||
|
||
var _proto = ReplaceTransition.prototype;
|
||
|
||
_proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {
|
||
var _child$props;
|
||
|
||
var children = this.props.children;
|
||
|
||
var child = _react.default.Children.toArray(children)[idx];
|
||
|
||
if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);
|
||
if (this.props[handler]) this.props[handler]((0, _reactDom.findDOMNode)(this));
|
||
};
|
||
|
||
_proto.render = function render() {
|
||
var _this$props = this.props,
|
||
children = _this$props.children,
|
||
inProp = _this$props.in,
|
||
props = _objectWithoutPropertiesLoose(_this$props, ["children", "in"]);
|
||
|
||
var _React$Children$toArr = _react.default.Children.toArray(children),
|
||
first = _React$Children$toArr[0],
|
||
second = _React$Children$toArr[1];
|
||
|
||
delete props.onEnter;
|
||
delete props.onEntering;
|
||
delete props.onEntered;
|
||
delete props.onExit;
|
||
delete props.onExiting;
|
||
delete props.onExited;
|
||
return _react.default.createElement(_TransitionGroup.default, props, inProp ? _react.default.cloneElement(first, {
|
||
key: 'first',
|
||
onEnter: this.handleEnter,
|
||
onEntering: this.handleEntering,
|
||
onEntered: this.handleEntered
|
||
}) : _react.default.cloneElement(second, {
|
||
key: 'second',
|
||
onEnter: this.handleExit,
|
||
onEntering: this.handleExiting,
|
||
onEntered: this.handleExited
|
||
}));
|
||
};
|
||
|
||
return ReplaceTransition;
|
||
}(_react.default.Component);
|
||
|
||
ReplaceTransition.propTypes = false ? {
|
||
in: _propTypes.default.bool.isRequired,
|
||
children: function children(props, propName) {
|
||
if (_react.default.Children.count(props[propName]) !== 2) return new Error("\"" + propName + "\" must be exactly two transition components.");
|
||
return null;
|
||
}
|
||
} : {};
|
||
var _default = ReplaceTransition;
|
||
exports.default = _default;
|
||
module.exports = exports["default"];
|
||
|
||
/***/ }),
|
||
/* 61 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
exports.__esModule = true;
|
||
exports.getChildMapping = getChildMapping;
|
||
exports.mergeChildMappings = mergeChildMappings;
|
||
exports.getInitialChildMapping = getInitialChildMapping;
|
||
exports.getNextChildMapping = getNextChildMapping;
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
/**
|
||
* Given `this.props.children`, return an object mapping key to child.
|
||
*
|
||
* @param {*} children `this.props.children`
|
||
* @return {object} Mapping of key to child
|
||
*/
|
||
function getChildMapping(children, mapFn) {
|
||
var mapper = function mapper(child) {
|
||
return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;
|
||
};
|
||
|
||
var result = Object.create(null);
|
||
if (children) _react.Children.map(children, function (c) {
|
||
return c;
|
||
}).forEach(function (child) {
|
||
// run the map function here instead so that the key is the computed one
|
||
result[child.key] = mapper(child);
|
||
});
|
||
return result;
|
||
}
|
||
/**
|
||
* When you're adding or removing children some may be added or removed in the
|
||
* same render pass. We want to show *both* since we want to simultaneously
|
||
* animate elements in and out. This function takes a previous set of keys
|
||
* and a new set of keys and merges them with its best guess of the correct
|
||
* ordering. In the future we may expose some of the utilities in
|
||
* ReactMultiChild to make this easy, but for now React itself does not
|
||
* directly have this concept of the union of prevChildren and nextChildren
|
||
* so we implement it here.
|
||
*
|
||
* @param {object} prev prev children as returned from
|
||
* `ReactTransitionChildMapping.getChildMapping()`.
|
||
* @param {object} next next children as returned from
|
||
* `ReactTransitionChildMapping.getChildMapping()`.
|
||
* @return {object} a key set that contains all keys in `prev` and all keys
|
||
* in `next` in a reasonable order.
|
||
*/
|
||
|
||
|
||
function mergeChildMappings(prev, next) {
|
||
prev = prev || {};
|
||
next = next || {};
|
||
|
||
function getValueForKey(key) {
|
||
return key in next ? next[key] : prev[key];
|
||
} // For each key of `next`, the list of keys to insert before that key in
|
||
// the combined list
|
||
|
||
|
||
var nextKeysPending = Object.create(null);
|
||
var pendingKeys = [];
|
||
|
||
for (var prevKey in prev) {
|
||
if (prevKey in next) {
|
||
if (pendingKeys.length) {
|
||
nextKeysPending[prevKey] = pendingKeys;
|
||
pendingKeys = [];
|
||
}
|
||
} else {
|
||
pendingKeys.push(prevKey);
|
||
}
|
||
}
|
||
|
||
var i;
|
||
var childMapping = {};
|
||
|
||
for (var nextKey in next) {
|
||
if (nextKeysPending[nextKey]) {
|
||
for (i = 0; i < nextKeysPending[nextKey].length; i++) {
|
||
var pendingNextKey = nextKeysPending[nextKey][i];
|
||
childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);
|
||
}
|
||
}
|
||
|
||
childMapping[nextKey] = getValueForKey(nextKey);
|
||
} // Finally, add the keys which didn't appear before any key in `next`
|
||
|
||
|
||
for (i = 0; i < pendingKeys.length; i++) {
|
||
childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);
|
||
}
|
||
|
||
return childMapping;
|
||
}
|
||
|
||
function getProp(child, prop, props) {
|
||
return props[prop] != null ? props[prop] : child.props[prop];
|
||
}
|
||
|
||
function getInitialChildMapping(props, onExited) {
|
||
return getChildMapping(props.children, function (child) {
|
||
return (0, _react.cloneElement)(child, {
|
||
onExited: onExited.bind(null, child),
|
||
in: true,
|
||
appear: getProp(child, 'appear', props),
|
||
enter: getProp(child, 'enter', props),
|
||
exit: getProp(child, 'exit', props)
|
||
});
|
||
});
|
||
}
|
||
|
||
function getNextChildMapping(nextProps, prevChildMapping, onExited) {
|
||
var nextChildMapping = getChildMapping(nextProps.children);
|
||
var children = mergeChildMappings(prevChildMapping, nextChildMapping);
|
||
Object.keys(children).forEach(function (key) {
|
||
var child = children[key];
|
||
if (!(0, _react.isValidElement)(child)) return;
|
||
var hasPrev = key in prevChildMapping;
|
||
var hasNext = key in nextChildMapping;
|
||
var prevChild = prevChildMapping[key];
|
||
var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)
|
||
|
||
if (hasNext && (!hasPrev || isLeaving)) {
|
||
// console.log('entering', key)
|
||
children[key] = (0, _react.cloneElement)(child, {
|
||
onExited: onExited.bind(null, child),
|
||
in: true,
|
||
exit: getProp(child, 'exit', nextProps),
|
||
enter: getProp(child, 'enter', nextProps)
|
||
});
|
||
} else if (!hasNext && hasPrev && !isLeaving) {
|
||
// item is old (exiting)
|
||
// console.log('leaving', key)
|
||
children[key] = (0, _react.cloneElement)(child, {
|
||
in: false
|
||
});
|
||
} else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {
|
||
// item hasn't changed transition states
|
||
// copy over the last transition props;
|
||
// console.log('unchanged', key)
|
||
children[key] = (0, _react.cloneElement)(child, {
|
||
onExited: onExited.bind(null, child),
|
||
in: prevChild.props.in,
|
||
exit: getProp(child, 'exit', nextProps),
|
||
enter: getProp(child, 'enter', nextProps)
|
||
});
|
||
}
|
||
});
|
||
return children;
|
||
}
|
||
|
||
/***/ }),
|
||
/* 62 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _rowTemplate = __webpack_require__(12);
|
||
|
||
var _rowTemplate2 = _interopRequireDefault(_rowTemplate);
|
||
|
||
var _footerCell = __webpack_require__(63);
|
||
|
||
var _footerCell2 = _interopRequireDefault(_footerCell);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var Footer = function Footer(props) {
|
||
var data = props.data,
|
||
className = props.className,
|
||
columns = props.columns,
|
||
selectRow = props.selectRow,
|
||
expandRow = props.expandRow;
|
||
|
||
|
||
function renderContent() {
|
||
return columns.map(function (column, i) {
|
||
if (column.footer === undefined || column.footer === null) {
|
||
return false;
|
||
}
|
||
|
||
var columnData = _utils2.default.pluck(data, column.dataField);
|
||
|
||
return _react2.default.createElement(_footerCell2.default, {
|
||
index: i,
|
||
key: column.dataField,
|
||
column: column,
|
||
columnData: columnData
|
||
});
|
||
});
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
'tfoot',
|
||
null,
|
||
_react2.default.createElement(_rowTemplate2.default, {
|
||
renderContent: renderContent,
|
||
selectRow: selectRow,
|
||
expandRow: expandRow,
|
||
className: className,
|
||
cellEl: 'th'
|
||
})
|
||
);
|
||
}; /* eslint react/require-default-props: 0 */
|
||
|
||
|
||
Footer.propTypes = {
|
||
data: _propTypes2.default.array,
|
||
className: _propTypes2.default.string,
|
||
columns: _propTypes2.default.array,
|
||
selectRow: _propTypes2.default.object,
|
||
expandRow: _propTypes2.default.object
|
||
};
|
||
|
||
exports.default = Footer;
|
||
|
||
/***/ }),
|
||
/* 63 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _classnames = __webpack_require__(4);
|
||
|
||
var _classnames2 = _interopRequireDefault(_classnames);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _cellEventDelegater = __webpack_require__(7);
|
||
|
||
var _cellEventDelegater2 = _interopRequireDefault(_cellEventDelegater);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/require-default-props: 0 */
|
||
|
||
|
||
var FooterCell = function (_eventDelegater) {
|
||
_inherits(FooterCell, _eventDelegater);
|
||
|
||
function FooterCell() {
|
||
_classCallCheck(this, FooterCell);
|
||
|
||
return _possibleConstructorReturn(this, (FooterCell.__proto__ || Object.getPrototypeOf(FooterCell)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(FooterCell, [{
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
index = _props.index,
|
||
column = _props.column,
|
||
columnData = _props.columnData;
|
||
var footer = column.footer,
|
||
footerTitle = column.footerTitle,
|
||
footerAlign = column.footerAlign,
|
||
footerFormatter = column.footerFormatter,
|
||
footerEvents = column.footerEvents,
|
||
footerClasses = column.footerClasses,
|
||
footerStyle = column.footerStyle,
|
||
footerAttrs = column.footerAttrs;
|
||
|
||
|
||
var delegateEvents = this.delegate(footerEvents);
|
||
var cellAttrs = _extends({}, _utils2.default.isFunction(footerAttrs) ? footerAttrs(column, index) : footerAttrs, delegateEvents);
|
||
|
||
var text = '';
|
||
if (_utils2.default.isString(footer)) {
|
||
text = footer;
|
||
} else if (_utils2.default.isFunction(footer)) {
|
||
text = footer(columnData, column, index);
|
||
}
|
||
|
||
var cellStyle = {};
|
||
var cellClasses = _utils2.default.isFunction(footerClasses) ? footerClasses(column, index) : footerClasses;
|
||
|
||
if (footerStyle) {
|
||
cellStyle = _utils2.default.isFunction(footerStyle) ? footerStyle(column, index) : footerStyle;
|
||
cellStyle = cellStyle ? _extends({}, cellStyle) : cellStyle;
|
||
}
|
||
|
||
if (footerTitle) {
|
||
cellAttrs.title = _utils2.default.isFunction(footerTitle) ? footerTitle(column, index) : text;
|
||
}
|
||
|
||
if (footerAlign) {
|
||
cellStyle.textAlign = _utils2.default.isFunction(footerAlign) ? footerAlign(column, index) : footerAlign;
|
||
}
|
||
|
||
if (cellClasses) cellAttrs.className = (0, _classnames2.default)(cellAttrs.className, cellClasses);
|
||
if (!_utils2.default.isEmptyObject(cellStyle)) cellAttrs.style = cellStyle;
|
||
|
||
var children = footerFormatter ? footerFormatter(column, index) : text;
|
||
|
||
return _react2.default.createElement('th', cellAttrs, children);
|
||
}
|
||
}]);
|
||
|
||
return FooterCell;
|
||
}((0, _cellEventDelegater2.default)(_react2.default.Component));
|
||
|
||
FooterCell.propTypes = {
|
||
columnData: _propTypes2.default.array,
|
||
index: _propTypes2.default.number,
|
||
column: _propTypes2.default.object
|
||
};
|
||
|
||
exports.default = FooterCell;
|
||
|
||
/***/ }),
|
||
/* 64 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _columnResolver = __webpack_require__(65);
|
||
|
||
var _columnResolver2 = _interopRequireDefault(_columnResolver);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||
|
||
exports.default = function (ExtendBase) {
|
||
return function (_ColumnResolver) {
|
||
_inherits(TableResolver, _ColumnResolver);
|
||
|
||
function TableResolver() {
|
||
_classCallCheck(this, TableResolver);
|
||
|
||
return _possibleConstructorReturn(this, (TableResolver.__proto__ || Object.getPrototypeOf(TableResolver)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(TableResolver, [{
|
||
key: 'validateProps',
|
||
value: function validateProps() {
|
||
var keyField = this.props.keyField;
|
||
|
||
if (!keyField) {
|
||
throw new Error('Please specify a field as key via keyField');
|
||
}
|
||
if (this.visibleColumnSize(false) <= 0) {
|
||
throw new Error('No visible columns detected');
|
||
}
|
||
}
|
||
}, {
|
||
key: 'isEmpty',
|
||
value: function isEmpty() {
|
||
return this.props.data.length === 0;
|
||
}
|
||
}, {
|
||
key: 'visibleRows',
|
||
value: function visibleRows() {
|
||
var _props = this.props,
|
||
data = _props.data,
|
||
hiddenRows = _props.hiddenRows,
|
||
keyField = _props.keyField;
|
||
|
||
if (!hiddenRows || hiddenRows.length === 0) return data;
|
||
return data.filter(function (row) {
|
||
var key = _utils2.default.get(row, keyField);
|
||
return !_utils2.default.contains(hiddenRows, key);
|
||
});
|
||
}
|
||
}]);
|
||
|
||
return TableResolver;
|
||
}((0, _columnResolver2.default)(ExtendBase));
|
||
};
|
||
|
||
/***/ }),
|
||
/* 65 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||
|
||
exports.default = function (ExtendBase) {
|
||
return function (_ExtendBase) {
|
||
_inherits(ColumnResolver, _ExtendBase);
|
||
|
||
function ColumnResolver() {
|
||
_classCallCheck(this, ColumnResolver);
|
||
|
||
return _possibleConstructorReturn(this, (ColumnResolver.__proto__ || Object.getPrototypeOf(ColumnResolver)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(ColumnResolver, [{
|
||
key: "visibleColumnSize",
|
||
value: function visibleColumnSize() {
|
||
var includeSelectColumn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
||
|
||
var columnLen = void 0;
|
||
if (this.props.columnToggle && this.props.columnToggle.toggles) {
|
||
var columns = this.props.columnToggle.toggles;
|
||
columnLen = Object.keys(columns).filter(function (name) {
|
||
return columns[name];
|
||
}).length;
|
||
} else {
|
||
columnLen = this.props.columns.filter(function (c) {
|
||
return !c.hidden;
|
||
}).length;
|
||
}
|
||
if (!includeSelectColumn) return columnLen;
|
||
if (this.props.selectRow && !this.props.selectRow.hideSelectColumn) {
|
||
columnLen += 1;
|
||
}
|
||
if (this.props.expandRow && this.props.expandRow.showExpandColumn) {
|
||
columnLen += 1;
|
||
}
|
||
return columnLen;
|
||
}
|
||
}]);
|
||
|
||
return ColumnResolver;
|
||
}(ExtendBase);
|
||
};
|
||
|
||
/***/ }),
|
||
/* 66 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _events = __webpack_require__(21);
|
||
|
||
var _events2 = _interopRequireDefault(_events);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
var _dataContext = __webpack_require__(67);
|
||
|
||
var _dataContext2 = _interopRequireDefault(_dataContext);
|
||
|
||
var _columnContext = __webpack_require__(68);
|
||
|
||
var _columnContext2 = _interopRequireDefault(_columnContext);
|
||
|
||
var _sortContext = __webpack_require__(69);
|
||
|
||
var _sortContext2 = _interopRequireDefault(_sortContext);
|
||
|
||
var _selectionContext = __webpack_require__(8);
|
||
|
||
var _selectionContext2 = _interopRequireDefault(_selectionContext);
|
||
|
||
var _rowExpandContext = __webpack_require__(10);
|
||
|
||
var _rowExpandContext2 = _interopRequireDefault(_rowExpandContext);
|
||
|
||
var _remoteResolver2 = __webpack_require__(70);
|
||
|
||
var _remoteResolver3 = _interopRequireDefault(_remoteResolver2);
|
||
|
||
var _bootstrap = __webpack_require__(5);
|
||
|
||
var _operators = __webpack_require__(9);
|
||
|
||
var _operators2 = _interopRequireDefault(_operators);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint camelcase: 0 */
|
||
/* eslint no-return-assign: 0 */
|
||
/* eslint no-param-reassign: 0 */
|
||
/* eslint class-methods-use-this: 0 */
|
||
|
||
|
||
var withContext = function withContext(Base) {
|
||
return function (_remoteResolver) {
|
||
_inherits(BootstrapTableContainer, _remoteResolver);
|
||
|
||
function BootstrapTableContainer(props) {
|
||
_classCallCheck(this, BootstrapTableContainer);
|
||
|
||
var _this = _possibleConstructorReturn(this, (BootstrapTableContainer.__proto__ || Object.getPrototypeOf(BootstrapTableContainer)).call(this, props));
|
||
|
||
_this.DataContext = (0, _dataContext2.default)();
|
||
|
||
if (props.registerExposedAPI) {
|
||
var exposedAPIEmitter = new _events2.default();
|
||
exposedAPIEmitter.on('get.table.data', function (payload) {
|
||
return payload.result = _this.table.getData();
|
||
});
|
||
exposedAPIEmitter.on('get.selected.rows', function (payload) {
|
||
return payload.result = _this.selectionContext.getSelected();
|
||
});
|
||
exposedAPIEmitter.on('get.filtered.rows', function (payload) {
|
||
if (_this.searchContext) {
|
||
payload.result = _this.searchContext.getSearched();
|
||
} else if (_this.filterContext) {
|
||
payload.result = _this.filterContext.getFiltered();
|
||
} else {
|
||
payload.result = _this.table.getData();
|
||
}
|
||
});
|
||
props.registerExposedAPI(exposedAPIEmitter);
|
||
}
|
||
|
||
if (props.columns.filter(function (col) {
|
||
return col.sort;
|
||
}).length > 0) {
|
||
_this.SortContext = (0, _sortContext2.default)(_operators2.default, _this.isRemoteSort, _this.handleRemoteSortChange);
|
||
}
|
||
|
||
if (props.columnToggle || props.columns.filter(function (col) {
|
||
return col.hidden;
|
||
}).length > 0) {
|
||
_this.ColumnManagementContext = (0, _columnContext2.default)();
|
||
}
|
||
|
||
if (props.selectRow) {
|
||
_this.SelectionContext = _selectionContext2.default;
|
||
}
|
||
|
||
if (props.expandRow) {
|
||
_this.RowExpandContext = _rowExpandContext2.default;
|
||
}
|
||
|
||
if (props.cellEdit && props.cellEdit.createContext) {
|
||
_this.CellEditContext = props.cellEdit.createContext(_utils2.default, _operators2.default, _this.isRemoteCellEdit, _this.handleRemoteCellChange);
|
||
}
|
||
|
||
if (props.filter) {
|
||
_this.FilterContext = props.filter.createContext(_utils2.default, _this.isRemoteFiltering, _this.handleRemoteFilterChange);
|
||
}
|
||
|
||
if (props.pagination) {
|
||
_this.PaginationContext = props.pagination.createContext();
|
||
}
|
||
|
||
if (props.search && props.search.searchContext) {
|
||
_this.SearchContext = props.search.searchContext(_utils2.default, _this.isRemoteSearch, _this.handleRemoteSearchChange);
|
||
}
|
||
|
||
if (props.setDependencyModules) {
|
||
props.setDependencyModules(_utils2.default);
|
||
}
|
||
|
||
if (props.setPaginationRemoteEmitter) {
|
||
props.setPaginationRemoteEmitter(_this.remoteEmitter);
|
||
}
|
||
return _this;
|
||
}
|
||
|
||
_createClass(BootstrapTableContainer, [{
|
||
key: 'UNSAFE_componentWillReceiveProps',
|
||
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
||
if (nextProps.columns.filter(function (col) {
|
||
return col.sort;
|
||
}).length <= 0) {
|
||
this.SortContext = null;
|
||
} else if (!this.SortContext) {
|
||
this.SortContext = (0, _sortContext2.default)(_operators2.default, this.isRemoteSort, this.handleRemoteSortChange);
|
||
}
|
||
if (!nextProps.pagination && this.props.pagination) {
|
||
this.PaginationContext = null;
|
||
}
|
||
if (nextProps.pagination && !this.props.pagination) {
|
||
this.PaginationContext = nextProps.pagination.createContext(this.isRemotePagination, this.handleRemotePageChange);
|
||
}
|
||
if (!nextProps.cellEdit && this.props.cellEdit) {
|
||
this.CellEditContext = null;
|
||
}
|
||
if (nextProps.cellEdit && !this.props.cellEdit) {
|
||
this.CellEditContext = nextProps.cellEdit.createContext(_utils2.default, _operators2.default, this.isRemoteCellEdit, this.handleRemoteCellChange);
|
||
}
|
||
}
|
||
}, {
|
||
key: 'renderBase',
|
||
value: function renderBase() {
|
||
var _this2 = this;
|
||
|
||
return function (rootProps, filterProps, searchProps, sortProps, paginationProps, columnToggleProps) {
|
||
return _react2.default.createElement(Base, _extends({
|
||
ref: function ref(n) {
|
||
return _this2.table = n;
|
||
}
|
||
}, _this2.props, sortProps, filterProps, searchProps, paginationProps, columnToggleProps, {
|
||
data: rootProps.getData(filterProps, searchProps, sortProps, paginationProps)
|
||
}));
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithColumnManagementCtx',
|
||
value: function renderWithColumnManagementCtx(base, baseProps) {
|
||
var _this3 = this;
|
||
|
||
return function (rootProps, filterProps, searchProps, sortProps, paginationProps) {
|
||
return _react2.default.createElement(
|
||
_this3.ColumnManagementContext.Provider,
|
||
_extends({}, baseProps, {
|
||
toggles: _this3.props.columnToggle ? _this3.props.columnToggle.toggles : null
|
||
}),
|
||
_react2.default.createElement(
|
||
_this3.ColumnManagementContext.Consumer,
|
||
null,
|
||
function (columnToggleProps) {
|
||
return base(rootProps, filterProps, searchProps, sortProps, paginationProps, columnToggleProps);
|
||
}
|
||
)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithSelectionCtx',
|
||
value: function renderWithSelectionCtx(base, baseProps) {
|
||
var _this4 = this;
|
||
|
||
return function (rootProps, filterProps, searchProps, sortProps, paginationProps) {
|
||
return _react2.default.createElement(
|
||
_this4.SelectionContext.Provider,
|
||
_extends({}, baseProps, {
|
||
ref: function ref(n) {
|
||
return _this4.selectionContext = n;
|
||
},
|
||
selectRow: _this4.props.selectRow,
|
||
data: rootProps.getData(filterProps, searchProps, sortProps, paginationProps)
|
||
}),
|
||
base(rootProps, filterProps, searchProps, sortProps, paginationProps)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithRowExpandCtx',
|
||
value: function renderWithRowExpandCtx(base, baseProps) {
|
||
var _this5 = this;
|
||
|
||
return function (rootProps, filterProps, searchProps, sortProps, paginationProps) {
|
||
return _react2.default.createElement(
|
||
_this5.RowExpandContext.Provider,
|
||
_extends({}, baseProps, {
|
||
ref: function ref(n) {
|
||
return _this5.rowExpandContext = n;
|
||
},
|
||
expandRow: _this5.props.expandRow,
|
||
data: rootProps.getData(filterProps, searchProps, sortProps, paginationProps)
|
||
}),
|
||
base(rootProps, filterProps, searchProps, sortProps, paginationProps)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithPaginationCtx',
|
||
value: function renderWithPaginationCtx(base) {
|
||
var _this6 = this;
|
||
|
||
return function (rootProps, filterProps, searchProps, sortProps) {
|
||
return _react2.default.createElement(
|
||
_this6.PaginationContext.Provider,
|
||
{
|
||
ref: function ref(n) {
|
||
return _this6.paginationContext = n;
|
||
},
|
||
pagination: _this6.props.pagination,
|
||
data: rootProps.getData(filterProps, searchProps, sortProps),
|
||
bootstrap4: _this6.props.bootstrap4,
|
||
isRemotePagination: _this6.isRemotePagination,
|
||
remoteEmitter: _this6.remoteEmitter,
|
||
onDataSizeChange: _this6.props.onDataSizeChange
|
||
},
|
||
_react2.default.createElement(
|
||
_this6.PaginationContext.Consumer,
|
||
null,
|
||
function (paginationProps) {
|
||
return base(rootProps, filterProps, searchProps, sortProps, paginationProps);
|
||
}
|
||
)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithSortCtx',
|
||
value: function renderWithSortCtx(base, baseProps) {
|
||
var _this7 = this;
|
||
|
||
return function (rootProps, filterProps, searchProps) {
|
||
return _react2.default.createElement(
|
||
_this7.SortContext.Provider,
|
||
_extends({}, baseProps, {
|
||
ref: function ref(n) {
|
||
return _this7.sortContext = n;
|
||
},
|
||
defaultSorted: _this7.props.defaultSorted,
|
||
defaultSortDirection: _this7.props.defaultSortDirection,
|
||
sort: _this7.props.sort,
|
||
data: rootProps.getData(filterProps, searchProps)
|
||
}),
|
||
_react2.default.createElement(
|
||
_this7.SortContext.Consumer,
|
||
null,
|
||
function (sortProps) {
|
||
return base(rootProps, filterProps, searchProps, sortProps);
|
||
}
|
||
)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithSearchCtx',
|
||
value: function renderWithSearchCtx(base, baseProps) {
|
||
var _this8 = this;
|
||
|
||
return function (rootProps, filterProps) {
|
||
return _react2.default.createElement(
|
||
_this8.SearchContext.Provider,
|
||
_extends({}, baseProps, {
|
||
ref: function ref(n) {
|
||
return _this8.searchContext = n;
|
||
},
|
||
data: rootProps.getData(filterProps),
|
||
searchText: _this8.props.search.searchText,
|
||
dataChangeListener: _this8.props.dataChangeListener
|
||
}),
|
||
_react2.default.createElement(
|
||
_this8.SearchContext.Consumer,
|
||
null,
|
||
function (searchProps) {
|
||
return base(rootProps, filterProps, searchProps);
|
||
}
|
||
)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithFilterCtx',
|
||
value: function renderWithFilterCtx(base, baseProps) {
|
||
var _this9 = this;
|
||
|
||
return function (rootProps) {
|
||
return _react2.default.createElement(
|
||
_this9.FilterContext.Provider,
|
||
_extends({}, baseProps, {
|
||
ref: function ref(n) {
|
||
return _this9.filterContext = n;
|
||
},
|
||
data: rootProps.getData(),
|
||
dataChangeListener: _this9.props.dataChangeListener
|
||
}),
|
||
_react2.default.createElement(
|
||
_this9.FilterContext.Consumer,
|
||
null,
|
||
function (filterProps) {
|
||
return base(rootProps, filterProps);
|
||
}
|
||
)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'renderWithCellEditCtx',
|
||
value: function renderWithCellEditCtx(base, baseProps) {
|
||
var _this10 = this;
|
||
|
||
return function (rootProps) {
|
||
return _react2.default.createElement(
|
||
_this10.CellEditContext.Provider,
|
||
_extends({}, baseProps, {
|
||
ref: function ref(n) {
|
||
return _this10.cellEditContext = n;
|
||
},
|
||
selectRow: _this10.props.selectRow,
|
||
cellEdit: _this10.props.cellEdit,
|
||
data: rootProps.getData()
|
||
}),
|
||
base(rootProps)
|
||
);
|
||
};
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var _props = this.props,
|
||
keyField = _props.keyField,
|
||
columns = _props.columns,
|
||
bootstrap4 = _props.bootstrap4;
|
||
|
||
var baseProps = { keyField: keyField, columns: columns };
|
||
|
||
var base = this.renderBase();
|
||
|
||
if (this.ColumnManagementContext) {
|
||
base = this.renderWithColumnManagementCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.SelectionContext) {
|
||
base = this.renderWithSelectionCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.RowExpandContext) {
|
||
base = this.renderWithRowExpandCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.PaginationContext) {
|
||
base = this.renderWithPaginationCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.SortContext) {
|
||
base = this.renderWithSortCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.SearchContext) {
|
||
base = this.renderWithSearchCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.FilterContext) {
|
||
base = this.renderWithFilterCtx(base, baseProps);
|
||
}
|
||
|
||
if (this.CellEditContext) {
|
||
base = this.renderWithCellEditCtx(base, baseProps);
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
_bootstrap.BootstrapContext.Provider,
|
||
{ value: { bootstrap4: bootstrap4 } },
|
||
_react2.default.createElement(
|
||
this.DataContext.Provider,
|
||
_extends({}, baseProps, {
|
||
data: this.props.data
|
||
}),
|
||
_react2.default.createElement(
|
||
this.DataContext.Consumer,
|
||
null,
|
||
base
|
||
)
|
||
)
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return BootstrapTableContainer;
|
||
}((0, _remoteResolver3.default)(_react.Component));
|
||
};
|
||
|
||
exports.default = withContext;
|
||
|
||
/***/ }),
|
||
/* 67 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint camelcase: 0 */
|
||
|
||
|
||
exports.default = function () {
|
||
var DataContext = _react2.default.createContext();
|
||
|
||
var DataProvider = function (_Component) {
|
||
_inherits(DataProvider, _Component);
|
||
|
||
function DataProvider() {
|
||
var _ref;
|
||
|
||
var _temp, _this, _ret;
|
||
|
||
_classCallCheck(this, DataProvider);
|
||
|
||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||
args[_key] = arguments[_key];
|
||
}
|
||
|
||
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = DataProvider.__proto__ || Object.getPrototypeOf(DataProvider)).call.apply(_ref, [this].concat(args))), _this), _this.state = { data: _this.props.data }, _this.getData = function (filterProps, searchProps, sortProps, paginationProps) {
|
||
if (paginationProps) return paginationProps.data;else if (sortProps) return sortProps.data;else if (searchProps) return searchProps.data;else if (filterProps) return filterProps.data;
|
||
return _this.props.data;
|
||
}, _temp), _possibleConstructorReturn(_this, _ret);
|
||
}
|
||
|
||
_createClass(DataProvider, [{
|
||
key: 'UNSAFE_componentWillReceiveProps',
|
||
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
||
this.setState(function () {
|
||
return { data: nextProps.data };
|
||
});
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
return _react2.default.createElement(
|
||
DataContext.Provider,
|
||
{
|
||
value: {
|
||
data: this.state.data,
|
||
getData: this.getData
|
||
}
|
||
},
|
||
this.props.children
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return DataProvider;
|
||
}(_react.Component);
|
||
|
||
DataProvider.propTypes = {
|
||
data: _propTypes2.default.array.isRequired,
|
||
children: _propTypes2.default.node.isRequired
|
||
};
|
||
|
||
return {
|
||
Provider: DataProvider,
|
||
Consumer: DataContext.Consumer
|
||
};
|
||
};
|
||
|
||
/***/ }),
|
||
/* 68 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint react/prop-types: 0 */
|
||
/* eslint react/prefer-stateless-function: 0 */
|
||
|
||
|
||
exports.default = function () {
|
||
var ColumnManagementContext = _react2.default.createContext();
|
||
|
||
var ColumnManagementProvider = function (_React$Component) {
|
||
_inherits(ColumnManagementProvider, _React$Component);
|
||
|
||
function ColumnManagementProvider() {
|
||
_classCallCheck(this, ColumnManagementProvider);
|
||
|
||
return _possibleConstructorReturn(this, (ColumnManagementProvider.__proto__ || Object.getPrototypeOf(ColumnManagementProvider)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(ColumnManagementProvider, [{
|
||
key: 'render',
|
||
value: function render() {
|
||
var toggleColumn = void 0;
|
||
var _props = this.props,
|
||
columns = _props.columns,
|
||
toggles = _props.toggles;
|
||
|
||
if (toggles) {
|
||
toggleColumn = columns.filter(function (column) {
|
||
return toggles[column.dataField];
|
||
});
|
||
} else {
|
||
toggleColumn = columns.filter(function (column) {
|
||
return !column.hidden;
|
||
});
|
||
}
|
||
return _react2.default.createElement(
|
||
ColumnManagementContext.Provider,
|
||
{ value: { columns: toggleColumn } },
|
||
this.props.children
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return ColumnManagementProvider;
|
||
}(_react2.default.Component);
|
||
|
||
ColumnManagementProvider.propTypes = {
|
||
columns: _propTypes2.default.array.isRequired,
|
||
toggles: _propTypes2.default.object
|
||
};
|
||
ColumnManagementProvider.defaultProps = {
|
||
toggles: null
|
||
};
|
||
|
||
|
||
return {
|
||
Provider: ColumnManagementProvider,
|
||
Consumer: ColumnManagementContext.Consumer
|
||
};
|
||
};
|
||
|
||
/***/ }),
|
||
/* 69 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _react = __webpack_require__(0);
|
||
|
||
var _react2 = _interopRequireDefault(_react);
|
||
|
||
var _propTypes = __webpack_require__(1);
|
||
|
||
var _propTypes2 = _interopRequireDefault(_propTypes);
|
||
|
||
var _const = __webpack_require__(3);
|
||
|
||
var _const2 = _interopRequireDefault(_const);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint camelcase: 0 */
|
||
/* eslint react/require-default-props: 0 */
|
||
|
||
|
||
exports.default = function (dataOperator, isRemoteSort, handleSortChange) {
|
||
var SortContext = _react2.default.createContext();
|
||
|
||
var SortProvider = function (_React$Component) {
|
||
_inherits(SortProvider, _React$Component);
|
||
|
||
function SortProvider(props) {
|
||
_classCallCheck(this, SortProvider);
|
||
|
||
var _this = _possibleConstructorReturn(this, (SortProvider.__proto__ || Object.getPrototypeOf(SortProvider)).call(this, props));
|
||
|
||
_initialiseProps.call(_this);
|
||
|
||
var sortOrder = void 0;
|
||
var sortColumn = void 0;
|
||
var defaultSorted = props.defaultSorted,
|
||
defaultSortDirection = props.defaultSortDirection,
|
||
sort = props.sort;
|
||
|
||
|
||
if (defaultSorted && defaultSorted.length > 0) {
|
||
sortOrder = defaultSorted[0].order || defaultSortDirection;
|
||
sortColumn = _this.initSort(defaultSorted[0].dataField, sortOrder);
|
||
} else if (sort && sort.dataField && sort.order) {
|
||
sortOrder = sort.order;
|
||
sortColumn = _this.initSort(sort.dataField, sortOrder);
|
||
}
|
||
_this.state = { sortOrder: sortOrder, sortColumn: sortColumn };
|
||
return _this;
|
||
}
|
||
|
||
_createClass(SortProvider, [{
|
||
key: 'componentDidMount',
|
||
value: function componentDidMount() {
|
||
var _state = this.state,
|
||
sortOrder = _state.sortOrder,
|
||
sortColumn = _state.sortColumn;
|
||
|
||
if (isRemoteSort() && sortOrder && sortColumn) {
|
||
handleSortChange(sortColumn.dataField, sortOrder);
|
||
}
|
||
}
|
||
}, {
|
||
key: 'UNSAFE_componentWillReceiveProps',
|
||
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
||
var sort = nextProps.sort,
|
||
columns = nextProps.columns;
|
||
|
||
if (sort && sort.dataField && sort.order) {
|
||
this.setState({
|
||
sortOrder: sort.order,
|
||
sortColumn: columns.find(function (col) {
|
||
return col.dataField === sort.dataField;
|
||
})
|
||
});
|
||
}
|
||
}
|
||
}, {
|
||
key: 'initSort',
|
||
value: function initSort(sortField, sortOrder) {
|
||
var sortColumn = void 0;
|
||
var columns = this.props.columns;
|
||
|
||
var sortColumns = columns.filter(function (col) {
|
||
return col.dataField === sortField;
|
||
});
|
||
if (sortColumns.length > 0) {
|
||
sortColumn = sortColumns[0];
|
||
|
||
if (sortColumn.onSort) {
|
||
sortColumn.onSort(sortField, sortOrder);
|
||
}
|
||
}
|
||
return sortColumn;
|
||
}
|
||
}, {
|
||
key: 'render',
|
||
value: function render() {
|
||
var data = this.props.data;
|
||
var sort = this.props.sort;
|
||
var _state2 = this.state,
|
||
sortOrder = _state2.sortOrder,
|
||
sortColumn = _state2.sortColumn;
|
||
|
||
if (!isRemoteSort() && sortColumn) {
|
||
var sortFunc = sortColumn.sortFunc ? sortColumn.sortFunc : sort && sort.sortFunc;
|
||
data = dataOperator.sort(data, sortOrder, _extends({}, sortColumn, { sortFunc: sortFunc }));
|
||
}
|
||
|
||
return _react2.default.createElement(
|
||
SortContext.Provider,
|
||
{
|
||
value: {
|
||
data: data,
|
||
sortOrder: sortOrder,
|
||
onSort: this.handleSort,
|
||
sortField: sortColumn ? sortColumn.dataField : null
|
||
}
|
||
},
|
||
this.props.children
|
||
);
|
||
}
|
||
}]);
|
||
|
||
return SortProvider;
|
||
}(_react2.default.Component);
|
||
|
||
SortProvider.propTypes = {
|
||
data: _propTypes2.default.array.isRequired,
|
||
columns: _propTypes2.default.array.isRequired,
|
||
children: _propTypes2.default.node.isRequired,
|
||
defaultSorted: _propTypes2.default.arrayOf(_propTypes2.default.shape({
|
||
dataField: _propTypes2.default.string.isRequired,
|
||
order: _propTypes2.default.oneOf([_const2.default.SORT_DESC, _const2.default.SORT_ASC]).isRequired
|
||
})),
|
||
sort: _propTypes2.default.shape({
|
||
dataField: _propTypes2.default.string,
|
||
order: _propTypes2.default.oneOf([_const2.default.SORT_DESC, _const2.default.SORT_ASC]),
|
||
sortFunc: _propTypes2.default.func
|
||
}),
|
||
defaultSortDirection: _propTypes2.default.oneOf([_const2.default.SORT_DESC, _const2.default.SORT_ASC])
|
||
};
|
||
|
||
var _initialiseProps = function _initialiseProps() {
|
||
var _this2 = this;
|
||
|
||
this.handleSort = function (column) {
|
||
var sortOrder = dataOperator.nextOrder(column, _this2.state, _this2.props.defaultSortDirection);
|
||
|
||
if (column.onSort) {
|
||
column.onSort(column.dataField, sortOrder);
|
||
}
|
||
|
||
if (isRemoteSort()) {
|
||
handleSortChange(column.dataField, sortOrder);
|
||
}
|
||
_this2.setState(function () {
|
||
return {
|
||
sortOrder: sortOrder,
|
||
sortColumn: column
|
||
};
|
||
});
|
||
};
|
||
};
|
||
|
||
return {
|
||
Provider: SortProvider,
|
||
Consumer: SortContext.Consumer
|
||
};
|
||
};
|
||
|
||
/***/ }),
|
||
/* 70 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||
|
||
var _events = __webpack_require__(21);
|
||
|
||
var _events2 = _interopRequireDefault(_events);
|
||
|
||
var _utils = __webpack_require__(2);
|
||
|
||
var _utils2 = _interopRequireDefault(_utils);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||
|
||
exports.default = function (ExtendBase) {
|
||
return function (_ExtendBase) {
|
||
_inherits(RemoteResolver, _ExtendBase);
|
||
|
||
function RemoteResolver(props) {
|
||
_classCallCheck(this, RemoteResolver);
|
||
|
||
var _this = _possibleConstructorReturn(this, (RemoteResolver.__proto__ || Object.getPrototypeOf(RemoteResolver)).call(this, props));
|
||
|
||
_this.getNewestState = function () {
|
||
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var sortOrder = void 0;
|
||
var sortField = void 0;
|
||
var page = void 0;
|
||
var sizePerPage = void 0;
|
||
var searchText = void 0;
|
||
var filters = {};
|
||
|
||
if (_this.sortContext) {
|
||
sortOrder = _this.sortContext.state.sortOrder;
|
||
sortField = _this.sortContext.state.sortColumn ? _this.sortContext.state.sortColumn.dataField : null;
|
||
}
|
||
|
||
if (_this.filterContext) {
|
||
filters = _this.filterContext.currFilters;
|
||
}
|
||
|
||
if (_this.paginationContext) {
|
||
page = _this.paginationContext.currPage;
|
||
sizePerPage = _this.paginationContext.currSizePerPage;
|
||
}
|
||
|
||
if (_this.searchContext) {
|
||
searchText = _this.props.search.searchText;
|
||
}
|
||
|
||
return _extends({
|
||
sortOrder: sortOrder,
|
||
sortField: sortField,
|
||
filters: filters,
|
||
page: page,
|
||
sizePerPage: sizePerPage,
|
||
searchText: searchText
|
||
}, state, {
|
||
data: _this.props.data
|
||
});
|
||
};
|
||
|
||
_this.isRemoteSearch = function () {
|
||
var remote = _this.props.remote;
|
||
|
||
return remote === true || _utils2.default.isObject(remote) && remote.search || _this.isRemotePagination();
|
||
};
|
||
|
||
_this.isRemotePagination = function () {
|
||
var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
var remote = _this.props.remote;
|
||
|
||
e.result = remote === true || _utils2.default.isObject(remote) && remote.pagination;
|
||
return e.result;
|
||
};
|
||
|
||
_this.isRemoteFiltering = function () {
|
||
var remote = _this.props.remote;
|
||
|
||
return remote === true || _utils2.default.isObject(remote) && remote.filter || _this.isRemotePagination();
|
||
};
|
||
|
||
_this.isRemoteSort = function () {
|
||
var remote = _this.props.remote;
|
||
|
||
return remote === true || _utils2.default.isObject(remote) && remote.sort || _this.isRemotePagination();
|
||
};
|
||
|
||
_this.isRemoteCellEdit = function () {
|
||
var remote = _this.props.remote;
|
||
|
||
return remote === true || _utils2.default.isObject(remote) && remote.cellEdit;
|
||
};
|
||
|
||
_this.handleRemotePageChange = function (page, sizePerPage) {
|
||
_this.props.onTableChange('pagination', _this.getNewestState({ page: page, sizePerPage: sizePerPage }));
|
||
};
|
||
|
||
_this.handleRemoteFilterChange = function (filters) {
|
||
var newState = { filters: filters };
|
||
if (_this.isRemotePagination()) {
|
||
var options = _this.props.pagination.options || {};
|
||
newState.page = _utils2.default.isDefined(options.pageStartIndex) ? options.pageStartIndex : 1;
|
||
}
|
||
_this.props.onTableChange('filter', _this.getNewestState(newState));
|
||
};
|
||
|
||
_this.handleRemoteSortChange = function (sortField, sortOrder) {
|
||
_this.props.onTableChange('sort', _this.getNewestState({ sortField: sortField, sortOrder: sortOrder }));
|
||
};
|
||
|
||
_this.handleRemoteCellChange = function (rowId, dataField, newValue) {
|
||
var cellEdit = { rowId: rowId, dataField: dataField, newValue: newValue };
|
||
_this.props.onTableChange('cellEdit', _this.getNewestState({ cellEdit: cellEdit }));
|
||
};
|
||
|
||
_this.handleRemoteSearchChange = function (searchText) {
|
||
_this.props.onTableChange('search', _this.getNewestState({ searchText: searchText }));
|
||
};
|
||
|
||
_this.remoteEmitter = new _events2.default();
|
||
_this.remoteEmitter.on('paginationChange', _this.handleRemotePageChange);
|
||
_this.remoteEmitter.on('isRemotePagination', _this.isRemotePagination);
|
||
return _this;
|
||
}
|
||
|
||
return RemoteResolver;
|
||
}(ExtendBase);
|
||
};
|
||
|
||
/***/ })
|
||
/******/ ]);
|
||
});
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAyMTFhY2RhZWEyOTM2ZjQ2ZmVhNiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiUmVhY3RcIixcImNvbW1vbmpzMlwiOlwicmVhY3RcIixcImNvbW1vbmpzXCI6XCJyZWFjdFwiLFwiYW1kXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3V0aWxzLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnN0LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29udGV4dHMvYm9vdHN0cmFwLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3N0b3JlL3Jvd3MuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY2VsbC1ldmVudC1kZWxlZ2F0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29udGV4dHMvc2VsZWN0aW9uLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvc3RvcmUvb3BlcmF0b3JzLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL3Jvdy1leHBhbmQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9zdG9yZS9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L3Jvdy10ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3cvcm93LXB1cmUtY29udGVudC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3cvZXZlbnQtZGVsZWdhdGVyLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy9zaG91bGQtdXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL1RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0RE9NXCIsXCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwiLFwiY29tbW9uanNcIjpcInJlYWN0LWRvbVwiLFwiYW1kXCI6XCJyZWFjdC1kb21cIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQvcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQuZXMuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC91dGlscy9Qcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uR3JvdXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9ib290c3RyYXAtdGFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvaGVhZGVyLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2hlYWRlci1jZWxsLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3NvcnQvc3ltYm9sLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3NvcnQvY2FyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvdW5kZXJzY29yZS91bmRlcnNjb3JlLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3ctc2VsZWN0aW9uL3NlbGVjdGlvbi1oZWFkZXItY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3ctZXhwYW5kL2V4cGFuZC1oZWFkZXItY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3ctc2VsZWN0aW9uL3NlbGVjdGlvbi1oZWFkZXItY2VsbC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9zdG9yZS9leHBhbmQuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvc3RvcmUvbXV0YXRlLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3N0b3JlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvc3RvcmUvdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3ctZXhwYW5kL2V4cGFuZC1oZWFkZXItY2VsbC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9maWx0ZXJzLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2ZpbHRlcnMtY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9jYXB0aW9uLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2JvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L3NpbXBsZS1yb3cuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3cvYWdncmVnYXRlLXJvdy5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3ctZXhwYW5kL2V4cGFuZC1jZWxsLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1zZWxlY3Rpb24vc2VsZWN0aW9uLWNlbGwuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L3Jvdy1zZWN0aW9uLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1zZWxlY3Rpb24vcm93LWNvbnN1bWVyLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1leHBhbmQvcm93LWNvbnN1bWVyLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1leHBhbmQvZXhwYW5kLXJvdy5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL2luZGV4LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvQ1NTVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9jbGFzcy9hZGRDbGFzcy5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9jbGFzcy9oYXNDbGFzcy5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9jbGFzcy9yZW1vdmVDbGFzcy5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL1JlcGxhY2VUcmFuc2l0aW9uLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvdXRpbHMvQ2hpbGRNYXBwaW5nLmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2Zvb3Rlci5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9mb290ZXItY2VsbC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9wcm9wcy1yZXNvbHZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9wcm9wcy1yZXNvbHZlci9jb2x1bW4tcmVzb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29udGV4dHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29udGV4dHMvZGF0YS1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL2NvbHVtbi1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL3NvcnQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9wcm9wcy1yZXNvbHZlci9yZW1vdGUtcmVzb2x2ZXIuanMiXSwibmFtZXMiOlsic3BsaXROZXN0ZWQiLCJzdHIiLCJqb2luIiwicmVwbGFjZSIsInNwbGl0IiwiZ2V0IiwidGFyZ2V0IiwiZmllbGQiLCJwYXRoQXJyYXkiLCJyZXN1bHQiLCJyZWR1Y2UiLCJjdXJyIiwicGF0aCIsImUiLCJzZXQiLCJ2YWx1ZSIsInNhZmUiLCJsZXZlbCIsImEiLCJiIiwiRXJyb3IiLCJsZW5ndGgiLCJpc0VtcHR5T2JqZWN0Iiwib2JqIiwiaXNPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsIk9iamVjdCIsInByb3RvdHlwZSIsImtleXMiLCJpIiwiY2FsbCIsImlzRGVmaW5lZCIsInNsZWVwIiwiZm4iLCJtcyIsInNldFRpbWVvdXQiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwidGltZW91dCIsImxhdGVyIiwiYXBwbHkiLCJjYWxsTm93IiwiY2xlYXJUaW1lb3V0IiwiYXNzaWduIiwiU09SVF9BU0MiLCJTT1JUX0RFU0MiLCJST1dfU0VMRUNUX1NJTkdMRSIsIlJPV19TRUxFQ1RfTVVMVElQTEUiLCJST1dfU0VMRUNUX0RJU0FCTEVEIiwiQ0hFQ0tCT1hfU1RBVFVTX0NIRUNLRUQiLCJDSEVDS0JPWF9TVEFUVVNfSU5ERVRFUk1JTkFURSIsIkNIRUNLQk9YX1NUQVRVU19VTkNIRUNLRUQiLCJJTkRJQ0FUT1JfUE9TSVRJT05fTEVGVCIsIklORElDQVRPUl9QT1NJVElPTl9SSUdIVCIsIlRZUEVfU1RSSU5HIiwiVFlQRV9OVU1CRVIiLCJUWVBFX0JPT0xFQU4iLCJUWVBFX0RBVEUiLCJGSUxURVJTX1BPU0lUSU9OX0lOTElORSIsIkZJTFRFUlNfUE9TSVRJT05fVE9QIiwiRklMVEVSU19QT1NJVElPTl9CT1RUT00iLCJCb290c3RyYXBDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImJvb3RzdHJhcDQiLCJtYXRjaFJvdyIsImtleUZpZWxkIiwiaWQiLCJyb3ciLCJnZXRSb3dCeVJvd0lkIiwiZGF0YSIsImZpbmQiLCJldmVudHMiLCJwcm9wcyIsImNyZWF0ZURlZmF1bHRFdmVudEhhbmRsZXIiLCJiaW5kIiwiY2IiLCJjb2x1bW4iLCJjb2x1bW5JbmRleCIsImluZGV4IiwiYXR0cnMiLCJuZXdBdHRycyIsImZvckVhY2giLCJhdHRyIiwiY29udGFpbnMiLCJFeHRlbmRCYXNlIiwiU2VsZWN0aW9uQ29udGV4dCIsIlNlbGVjdGlvblByb3ZpZGVyIiwiaGFuZGxlUm93U2VsZWN0Iiwicm93S2V5IiwiY2hlY2tlZCIsInJvd0luZGV4Iiwic2VsZWN0Um93IiwibW9kZSIsIm9uU2VsZWN0IiwiY3VyclNlbGVjdGVkIiwic2VsZWN0ZWQiLCJ1bmRlZmluZWQiLCJwdXNoIiwiZmlsdGVyIiwiZm9yY2VVcGRhdGUiLCJoYW5kbGVBbGxSb3dzU2VsZWN0IiwiaXNVblNlbGVjdCIsIm9uU2VsZWN0QWxsIiwibm9uU2VsZWN0YWJsZSIsImNvbmNhdCIsInNlbGVjdGFibGVLZXlzIiwiZCIsInMiLCJnZXRTZWxlY3RlZFJvd3MiLCJBcnJheSIsImlzQXJyYXkiLCJuZXh0UHJvcHMiLCJhbGxSb3dzU2VsZWN0ZWQiLCJhbGxSb3dzTm90U2VsZWN0ZWQiLCJjaGVja2VkU3RhdHVzIiwib25Sb3dTZWxlY3QiLCJvbkFsbFJvd3NTZWxlY3QiLCJjaGlsZHJlbiIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIm5vZGUiLCJpc1JlcXVpcmVkIiwiYXJyYXkiLCJzdHJpbmciLCJQcm92aWRlciIsIkNvbnN1bWVyIiwicm93cyIsInNlbGVjdGlvbiIsImV4cGFuZCIsIm11dGF0ZSIsInNvcnQiLCJ0eXBlIiwiUm93RXhwYW5kQ29udGV4dCIsIlJvd0V4cGFuZFByb3ZpZGVyIiwic3RhdGUiLCJleHBhbmRlZCIsImV4cGFuZFJvdyIsImlzQ2xvc2luZyIsIm9uQ2xvc2VkIiwiY2xvc2VkUm93Iiwic2V0U3RhdGUiLCJoYW5kbGVSb3dFeHBhbmQiLCJvbkV4cGFuZCIsIm9ubHlPbmVFeHBhbmRpbmciLCJub25FeHBhbmRhYmxlIiwiY3VyckV4cGFuZGVkIiwiaGFuZGxlQWxsUm93RXhwYW5kIiwiZXhwYW5kQWxsIiwib25FeHBhbmRBbGwiLCJleHBhbmRhYmxlS2V5cyIsImdldEV4cGFuZGVkUm93cyIsIm5leHRFeHBhbmRlZCIsImFjYyIsImN1ciIsImlzQW55RXhwYW5kcyIsIm9uUm93RXhwYW5kIiwib25BbGxSb3dFeHBhbmQiLCJnZXRTZWxlY3Rpb25TdW1tYXJ5Iiwicm93S2V5cyIsIm1hcCIsIngiLCJza2lwcyIsInVuU2VsZWN0YWJsZUtleXMiLCJrIiwiUm93VGVtcGxhdGUiLCJyZW5kZXJDb250ZW50IiwiY2VsbEVsIiwicmVzdCIsImlzUmVuZGVyRnVuY3Rpb25Db2x1bW5JbkxlZnQiLCJwb3NpdGlvbiIsImNoaWxkcmVucyIsImhpZGVTZWxlY3RDb2x1bW4iLCJzZWxlY3RDb2x1bW5Qb3NpdGlvbiIsInVuc2hpZnQiLCJjcmVhdGVFbGVtZW50Iiwia2V5Iiwic2hvd0V4cGFuZENvbHVtbiIsImV4cGFuZENvbHVtblBvc2l0aW9uIiwib2JqZWN0IiwiUm93UHVyZUNvbnRlbnQiLCJzaG91bGRVcGRhdGUiLCJjb2x1bW5zIiwiZWRpdGFibGUiLCJlZGl0aW5nUm93SWR4IiwiZWRpdGluZ0NvbElkeCIsIm9uU3RhcnQiLCJjbGlja1RvRWRpdCIsImRiY2xpY2tUb0VkaXQiLCJFZGl0aW5nQ2VsbENvbXBvbmVudCIsInRhYkluZGV4U3RhcnQiLCJ0YWJJbmRleCIsImRhdGFGaWVsZCIsImNvbnRlbnQiLCJjZWxsVGl0bGUiLCJjZWxsU3R5bGUiLCJjZWxsQXR0cnMiLCJpc0Z1bmN0aW9uIiwib3JpZ2luRm4iLCJjZWxsQ2xhc3NlcyIsImNsYXNzZXMiLCJzdHlsZSIsInRpdGxlIiwiYWxpZ24iLCJ0ZXh0QWxpZ24iLCJjbGFzc05hbWUiLCJlZGl0YWJsZUNlbGwiLCJjbGlja051bSIsImNyZWF0ZUNsaWNrRXZlbnRIYW5kbGVyIiwic2VsZWN0YWJsZSIsImV4cGFuZGFibGUiLCJERUxBWV9GT1JfREJDTElDSyIsImNsaWNrRm4iLCJleHBhbmRCeUNvbHVtbk9ubHkiLCJjbGlja1RvRXhwYW5kIiwiY2xpY2tUb1NlbGVjdCIsImlzRXF1YWwiLCJzaG91bGRVcGRhdGVCeUNlbGxFZGl0aW5nIiwic2hvdWxkVXBkYXRlZEJ5Tm9ybWFsUHJvcHMiLCJzaG91bGRVcGRhdGVDaGlsZCIsInNob3VsZFVwZGF0ZUJ5Q29sdW1uc0ZvclNpbXBsZUNoZWNrIiwiQm9vdHN0cmFwVGFibGUiLCJnZXREYXRhIiwidmlzaWJsZVJvd3MiLCJ2YWxpZGF0ZVByb3BzIiwib25EYXRhU2l6ZUNoYW5nZSIsInBhZ2luYXRpb24iLCJkYXRhU2l6ZSIsImxvYWRpbmciLCJvdmVybGF5IiwiTG9hZGluZ092ZXJsYXkiLCJyZW5kZXJUYWJsZSIsInRhYkluZGV4Q2VsbCIsInN0cmlwZWQiLCJob3ZlciIsImJvcmRlcmVkIiwiY29uZGVuc2VkIiwibm9EYXRhSW5kaWNhdGlvbiIsImNhcHRpb24iLCJyb3dTdHlsZSIsInJvd0NsYXNzZXMiLCJ3cmFwcGVyQ2xhc3NlcyIsInJvd0V2ZW50cyIsImNlbGxFZGl0IiwiZmlsdGVyUG9zaXRpb24iLCJ0YWJsZVdyYXBwZXJDbGFzcyIsInRhYmxlQ2xhc3MiLCJoYXNGaWx0ZXJzIiwic29tZSIsImNvbCIsImZpbHRlclJlbmRlcmVyIiwiaGFzRm9vdGVyIiwiaGFzIiwidGFibGVDYXB0aW9uIiwiaGVhZGVyQ2xhc3NlcyIsImhlYWRlcldyYXBwZXJDbGFzc2VzIiwic29ydEZpZWxkIiwic29ydE9yZGVyIiwib25Tb3J0Iiwic29ydENhcmV0Iiwib25GaWx0ZXIiLCJjdXJyRmlsdGVycyIsIm9uRXh0ZXJuYWxGaWx0ZXIiLCJmaWx0ZXJzQ2xhc3NlcyIsImJvZHlDbGFzc2VzIiwiaXNFbXB0eSIsInZpc2libGVDb2x1bW5TaXplIiwiZm9vdGVyQ2xhc3NlcyIsImJvb2wiLCJyZW1vdGUiLCJvbmVPZlR5cGUiLCJzaGFwZSIsIm9uZU9mIiwiaGlkZVNlbGVjdEFsbCIsIm5vblNlbGVjdGFibGVTdHlsZSIsIm5vblNlbGVjdGFibGVDbGFzc2VzIiwiYmdDb2xvciIsInNlbGVjdGlvblJlbmRlcmVyIiwic2VsZWN0aW9uSGVhZGVyUmVuZGVyZXIiLCJoZWFkZXJDb2x1bW5TdHlsZSIsInNlbGVjdENvbHVtblN0eWxlIiwicmVuZGVyZXIiLCJleHBhbmRDb2x1bW5SZW5kZXJlciIsImV4cGFuZEhlYWRlckNvbHVtblJlbmRlcmVyIiwicGFyZW50Q2xhc3NOYW1lIiwiZGVmYXVsdFNvcnRlZCIsImFycmF5T2YiLCJvcmRlciIsInNvcnRGdW5jIiwiZGVmYXVsdFNvcnREaXJlY3Rpb24iLCJvblRhYmxlQ2hhbmdlIiwic2VhcmNoIiwic2VhcmNoVGV4dCIsInNlYXJjaENvbnRleHQiLCJzZXREZXBlbmRlbmN5TW9kdWxlcyIsImRlZmF1bHRQcm9wcyIsIm5vbkVkaXRhYmxlUm93cyIsIkhlYWRlciIsImdsb2JhbFNvcnRDYXJldCIsIlNlbGVjdGlvbkhlYWRlckNlbGxDb21wIiwiRXhwYW5zaW9uSGVhZGVyQ2VsbENvbXAiLCJjdXJyU29ydCIsImlzTGFzdFNvcnRpbmciLCJIZWFkZXJDZWxsIiwic29ydGluZyIsInRleHQiLCJoZWFkZXJUaXRsZSIsImhlYWRlckFsaWduIiwiaGVhZGVyRm9ybWF0dGVyIiwiaGVhZGVyRXZlbnRzIiwiaGVhZGVyU3R5bGUiLCJoZWFkZXJBdHRycyIsImhlYWRlclNvcnRpbmdDbGFzc2VzIiwiaGVhZGVyU29ydGluZ1N0eWxlIiwic29ydENhcmV0ZnVuYyIsImRlbGVnYXRlRXZlbnRzIiwiZGVsZWdhdGUiLCJjdXN0b21BdHRycyIsInNvcnRTeW1ib2wiLCJmaWx0ZXJFbG0iLCJjdXN0b21DbGljayIsIm9uQ2xpY2siLCJvbktleVVwIiwib25DdXN0b21GaWx0ZXIiLCJzb3J0RWxlbWVudCIsImZpbHRlckVsZW1lbnQiLCJpc0R1bW15RmllbGQiLCJoaWRkZW4iLCJmb3JtYXR0ZXIiLCJmb3JtYXRFeHRyYURhdGEiLCJhbnkiLCJlZGl0b3IiLCJlZGl0Q2VsbFN0eWxlIiwiZWRpdENlbGxDbGFzc2VzIiwiZWRpdG9yU3R5bGUiLCJlZGl0b3JDbGFzc2VzIiwiZWRpdG9yUmVuZGVyZXIiLCJ2YWxpZGF0b3IiLCJmaWx0ZXJWYWx1ZSIsInNlYXJjaGFibGUiLCJudW1iZXIiLCJTb3J0U3ltYm9sIiwiU29ydENhcmV0Iiwib3JkZXJDbGFzcyIsImRyb3B1cCIsIkNoZWNrQm94IiwiaW5kZXRlcm1pbmF0ZSIsImlucHV0IiwiU2VsZWN0aW9uSGVhZGVyQ2VsbCIsImhhbmRsZUNoZWNrQm94Q2xpY2siLCJFeHBhbnNpb25IZWFkZXJDZWxsIiwiZWRpdENlbGwiLCJyb3dJZCIsIm5ld1ZhbHVlIiwiY29tcGFyYXRvciIsImxvY2FsZUNvbXBhcmUiLCJzb3J0VmFsdWUiLCJfZGF0YSIsInZhbHVlQSIsInZhbHVlQiIsIm5leHRPcmRlciIsImN1cnJlbnRTb3J0Q29sdW1uIiwic29ydENvbHVtbiIsImRlZmF1bHRPcmRlciIsInR5cGVDb252ZXJ0IiwiU3RyaW5nIiwiTnVtYmVyIiwiRGF0ZSIsIkZpbHRlcnMiLCJmaWx0ZXJDb2x1bW5zIiwic2hvd0ZpbHRlcnNSb3ciLCJkaXNwbGF5IiwiRmlsdGVyc0NlbGwiLCJDYXB0aW9uIiwiY2FwdGlvblNpZGUiLCJCb2R5IiwiRWRpdGluZ0NlbGwiLCJjcmVhdGVFZGl0aW5nQ2VsbCIsIm9wdGlvbnMiLCJvblN0YXJ0RWRpdCIsIlJvd0NvbXBvbmVudCIsInNlbGVjdFJvd0VuYWJsZWQiLCJleHBhbmRSb3dFbmFibGVkIiwid2l0aFJvd0xldmVsQ2VsbEVkaXQiLCJpbmRpY2F0aW9uIiwiYWRkaXRpb25hbFJvd1Byb3BzIiwiYmFzZVJvd1Byb3BzIiwiU2ltcGxlUm93Iiwic2hvdWxkVXBkYXRlUm93Q29udGVudCIsInNob3VsZFJvd0NvbnRlbnRVcGRhdGUiLCJzaG91bGRVcGRhdGVkQnlTZWxmUHJvcHMiLCJ0ckF0dHJzIiwiQ2VsbCIsImNyZWF0ZUhhbmRsZUVkaXRpbmdDZWxsIiwib3JpZ2luRnVuYyIsIm9uRG91YmxlQ2xpY2siLCJSb3dBZ2dyZWdhdG9yIiwic2VsZWN0Q2VsbCIsImV4cGFuZENlbGwiLCJFeHBhbmRDZWxsIiwiaGFuZGxlQ2xpY2siLCJzdG9wUHJvcGFnYXRpb24iLCJTZWxlY3Rpb25DZWxsIiwiZGlzYWJsZWQiLCJpbnB1dFR5cGUiLCJSb3dTZWN0aW9uIiwiY29sU3BhbiIsInJlbmRlcldpdGhTZWxlY3Rpb24iLCJub3RTZWxlY3RhYmxlIiwic2VsZWN0ZWRTdHlsZSIsInNlbGVjdGVkQ2xhc3NlcyIsImJhY2tncm91bmRDb2xvciIsIm5vdFNlbGVjdGFibGVTdHlsZSIsIm5vdFNlbGVjdGFibGVDbGFzc2VzIiwid2l0aENvbnN1bWVyIiwiZGlzcGxheU5hbWUiLCJyZW5kZXJXaXRoRXhwYW5zaW9uIiwiRXhwYW5kUm93IiwiRm9vdGVyIiwiZm9vdGVyIiwiY29sdW1uRGF0YSIsInBsdWNrIiwiRm9vdGVyQ2VsbCIsImZvb3RlclRpdGxlIiwiZm9vdGVyQWxpZ24iLCJmb290ZXJGb3JtYXR0ZXIiLCJmb290ZXJFdmVudHMiLCJmb290ZXJTdHlsZSIsImZvb3RlckF0dHJzIiwiaXNTdHJpbmciLCJoaWRkZW5Sb3dzIiwiaW5jbHVkZVNlbGVjdENvbHVtbiIsImNvbHVtbkxlbiIsImNvbHVtblRvZ2dsZSIsInRvZ2dsZXMiLCJuYW1lIiwiYyIsIndpdGhDb250ZXh0IiwiRGF0YUNvbnRleHQiLCJyZWdpc3RlckV4cG9zZWRBUEkiLCJleHBvc2VkQVBJRW1pdHRlciIsIm9uIiwicGF5bG9hZCIsInRhYmxlIiwic2VsZWN0aW9uQ29udGV4dCIsImdldFNlbGVjdGVkIiwiZ2V0U2VhcmNoZWQiLCJmaWx0ZXJDb250ZXh0IiwiZ2V0RmlsdGVyZWQiLCJTb3J0Q29udGV4dCIsImlzUmVtb3RlU29ydCIsImhhbmRsZVJlbW90ZVNvcnRDaGFuZ2UiLCJDb2x1bW5NYW5hZ2VtZW50Q29udGV4dCIsIkNlbGxFZGl0Q29udGV4dCIsImlzUmVtb3RlQ2VsbEVkaXQiLCJoYW5kbGVSZW1vdGVDZWxsQ2hhbmdlIiwiRmlsdGVyQ29udGV4dCIsImlzUmVtb3RlRmlsdGVyaW5nIiwiaGFuZGxlUmVtb3RlRmlsdGVyQ2hhbmdlIiwiUGFnaW5hdGlvbkNvbnRleHQiLCJTZWFyY2hDb250ZXh0IiwiaXNSZW1vdGVTZWFyY2giLCJoYW5kbGVSZW1vdGVTZWFyY2hDaGFuZ2UiLCJzZXRQYWdpbmF0aW9uUmVtb3RlRW1pdHRlciIsInJlbW90ZUVtaXR0ZXIiLCJpc1JlbW90ZVBhZ2luYXRpb24iLCJoYW5kbGVSZW1vdGVQYWdlQ2hhbmdlIiwicm9vdFByb3BzIiwiZmlsdGVyUHJvcHMiLCJzZWFyY2hQcm9wcyIsInNvcnRQcm9wcyIsInBhZ2luYXRpb25Qcm9wcyIsImNvbHVtblRvZ2dsZVByb3BzIiwibiIsImJhc2UiLCJiYXNlUHJvcHMiLCJyb3dFeHBhbmRDb250ZXh0IiwicGFnaW5hdGlvbkNvbnRleHQiLCJzb3J0Q29udGV4dCIsImRhdGFDaGFuZ2VMaXN0ZW5lciIsImNlbGxFZGl0Q29udGV4dCIsInJlbmRlckJhc2UiLCJyZW5kZXJXaXRoQ29sdW1uTWFuYWdlbWVudEN0eCIsInJlbmRlcldpdGhTZWxlY3Rpb25DdHgiLCJyZW5kZXJXaXRoUm93RXhwYW5kQ3R4IiwicmVuZGVyV2l0aFBhZ2luYXRpb25DdHgiLCJyZW5kZXJXaXRoU29ydEN0eCIsInJlbmRlcldpdGhTZWFyY2hDdHgiLCJyZW5kZXJXaXRoRmlsdGVyQ3R4IiwicmVuZGVyV2l0aENlbGxFZGl0Q3R4IiwiRGF0YVByb3ZpZGVyIiwiQ29sdW1uTWFuYWdlbWVudFByb3ZpZGVyIiwidG9nZ2xlQ29sdW1uIiwiZGF0YU9wZXJhdG9yIiwiaGFuZGxlU29ydENoYW5nZSIsIlNvcnRQcm92aWRlciIsImluaXRTb3J0Iiwic29ydENvbHVtbnMiLCJoYW5kbGVTb3J0IiwiZ2V0TmV3ZXN0U3RhdGUiLCJwYWdlIiwic2l6ZVBlclBhZ2UiLCJmaWx0ZXJzIiwiY3VyclBhZ2UiLCJjdXJyU2l6ZVBlclBhZ2UiLCJuZXdTdGF0ZSIsInBhZ2VTdGFydEluZGV4Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDN0RBLCtDOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNmQTs7Ozs7O0FBRUEsU0FBU0EsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEI7QUFDeEIsU0FBTyxDQUFDQSxHQUFELEVBQ0pDLElBREksQ0FDQyxHQURELEVBRUpDLE9BRkksQ0FFSSxLQUZKLEVBRVcsR0FGWCxFQUdKQSxPQUhJLENBR0ksS0FISixFQUdXLEVBSFgsRUFJSkMsS0FKSSxDQUlFLEdBSkYsQ0FBUDtBQUtELEMsQ0FYRDtBQUNB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QTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsK0NBQStDOzs7QUFHL0M7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEVBQThFOzs7QUFHOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixJQUFJO0FBQzlCLFFBQVE7QUFDUixpQ0FBaUMsYUFBYSxPQUFPLEVBQUU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUFLO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsSUFBSTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEZBQTBGLGFBQWE7QUFDdkc7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDJCOzs7Ozs7QUN6bEJBLGdEOzs7Ozs7OztBQ0FBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFUTs7Ozs7Ozs7QUM3SlI7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDBDOzs7Ozs7O0FDMUJBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGLDBEQUEwRCwrQkFBK0IsaUJBQWlCLHNDQUFzQyxZQUFZLFlBQVksdUJBQXVCLE9BQU8scUJBQXFCLDBDQUEwQywyQkFBMkIsRUFBRSxlQUFlOztBQUVqVCxxQkFBcUIsZ0RBQWdELGdCQUFnQixzQkFBc0IsT0FBTywyQkFBMkIsMEJBQTBCLHlEQUF5RCwyQkFBMkIsRUFBRSxFQUFFLEVBQUUsZUFBZSxHQUFHLHdDQUF3Qzs7QUFFM1QsK0NBQStDLDBEQUEwRCwyQ0FBMkMsaUNBQWlDOztBQUVyTCx1Q0FBdUMsdUJBQXVCLHVGQUF1RixFQUFFLGFBQWE7O0FBRXBLO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHNHQUFzRzs7O0FBR3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLEtBQUs7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQSxvQzs7Ozs7O0FDeE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNILG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzdTQTs7OztBQUNBOzs7Ozs7a0JBRWUsaUQ7Ozs7Ozs7Ozs7Ozs7OztBQ0FmOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OzsrZUFkQTtBQUNBOztJQWVNd0ksYzs7O0FBQ0osMEJB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsWUFBWTtBQUNsRDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsdUNBQXVDLFlBQVk7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw4QkFBOEI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixnQkFBZ0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QyxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGdCQUFnQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFlBQVk7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixnQkFBZ0I7QUFDekM7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsWUFBWTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFlBQVk7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFlBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7O0FBRUEsd0VBQXdFLGFBQWE7QUFDckY7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDRFQUE0RSxlQUFlO0FBQzNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RSxlQUFlO0FBQzNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RSxlQUFlO0FBQzNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RSxlQUFlO0FBQzNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RSxlQUFlO0FBQzNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RSxlQUFlO0FBQzNGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0Esb0M7Ozs7Ozs7QUNySkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FB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LG9CQUF0QixFQUE0QyxNQUFLd0Isa0JBQWpEO0FBSmlCO0FBS2xCOztBQVBVO0FBQUEsSUFDZ0I1WCxVQURoQjtBQUFBLEMiLCJmaWxlIjoicmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9kaXN0L3JlYWN0LWJvb3RzdHJhcC10YWJsZS1uZXh0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIiksIHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wicmVhY3RcIiwgXCJyZWFjdC1kb21cIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUmVhY3RCb290c3RyYXBUYWJsZTJcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSwgcmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiUmVhY3RCb290c3RyYXBUYWJsZTJcIl0gPSBmYWN0b3J5KHJvb3RbXCJSZWFjdFwiXSwgcm9vdFtcIlJlYWN0RE9NXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzE3X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMjIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDIxMWFjZGFlYTI5MzZmNDZmZWE2IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzBfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJSZWFjdFwiLFwiY29tbW9uanMyXCI6XCJyZWFjdFwiLFwiY29tbW9uanNcIjpcInJlYWN0XCIsXCJhbWRcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLyogZXNsaW50IG5vLWVtcHR5OiAwICovXG4vKiBlc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246IDAgKi9cbi8qIGVzbGludCBwcmVmZXItcmVzdC1wYXJhbXM6IDAgKi9cbmltcG9ydCBfIGZyb20gJ3VuZGVyc2NvcmUnO1xuXG5mdW5jdGlvbiBzcGxpdE5lc3RlZChzdHIpIHtcbiAgcmV0dXJuIFtzdHJdXG4gICAgLmpvaW4oJy4nKVxuICAgIC5yZXBsYWNlKC9cXFsvZywgJy4nKVxuICAgIC5yZXBsYWNlKC9cXF0vZywgJycpXG4gICAgLnNwbGl0KCcuJyk7XG59XG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIGZpZWxkKSB7XG4gIGNvbnN0IHBhdGhBcnJheSA9IHNwbGl0TmVzdGVkKGZpZWxkKTtcbiAgbGV0IHJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBwYXRoQXJyYXkucmVkdWNlKChjdXJyLCBwYXRoKSA9PiBjdXJyW3BhdGhdLCB0YXJnZXQpO1xuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBmaWVsZCwgdmFsdWUsIHNhZmUgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoQXJyYXkgPSBzcGxpdE5lc3RlZChmaWVsZCk7XG4gIGxldCBsZXZlbCA9IDA7XG4gIHBhdGhBcnJheS5yZWR1Y2UoKGEsIGIpID0+IHtcbiAgICBsZXZlbCArPSAxO1xuICAgIGlmICh0eXBlb2YgYVtiXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICghc2FmZSkgdGhyb3cgbmV3IEVycm9yKGAke2F9LiR7Yn0gaXMgdW5kZWZpbmVkYCk7XG4gICAgICBhW2JdID0ge307XG4gICAgICByZXR1cm4gYVtiXTtcbiAgICB9XG5cbiAgICBpZiAobGV2ZWwgPT09IHBhdGhBcnJheS5sZW5ndGgpIHtcbiAgICAgIGFbYl0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFbYl07XG4gIH0sIHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlPYmplY3Qob2JqKSB7XG4gIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBzbGVlcChmbiwgbXMpIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gZm4oKSwgbXMpO1xufVxuXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgbGV0IHRpbWVvdXQ7XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBsYXRlciA9ICgpID0+IHtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuXG4gICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG5cbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgfHwgMCk7XG5cbiAgICBpZiAoY2FsbE5vdykge1xuICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihfLCB7IGdldCwgc2V0LCBpc0RlZmluZWQsIGlzRW1wdHlPYmplY3QsIHNsZWVwLCBkZWJvdW5jZSB9KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3V0aWxzLmpzIiwiZXhwb3J0IGRlZmF1bHQge1xuICBTT1JUX0FTQzogJ2FzYycsXG4gIFNPUlRfREVTQzogJ2Rlc2MnLFxuICBST1dfU0VMRUNUX1NJTkdMRTogJ3JhZGlvJyxcbiAgUk9XX1NFTEVDVF9NVUxUSVBMRTogJ2NoZWNrYm94JyxcbiAgUk9XX1NFTEVDVF9ESVNBQkxFRDogJ1JPV19TRUxFQ1RfRElTQUJMRUQnLFxuICBDSEVDS0JPWF9TVEFUVVNfQ0hFQ0tFRDogJ2NoZWNrZWQnLFxuICBDSEVDS0JPWF9TVEFUVVNfSU5ERVRFUk1JTkFURTogJ2luZGV0ZXJtaW5hdGUnLFxuICBDSEVDS0JPWF9TVEFUVVNfVU5DSEVDS0VEOiAndW5jaGVja2VkJyxcbiAgSU5ESUNBVE9SX1BPU0lUSU9OX0xFRlQ6ICdsZWZ0JyxcbiAgSU5ESUNBVE9SX1BPU0lUSU9OX1JJR0hUOiAncmlnaHQnLFxuICBUWVBFX1NUUklORzogJ3N0cmluZycsXG4gIFRZUEVfTlVNQkVSOiAnbnVtYmVyJyxcbiAgVFlQRV9CT09MRUFOOiAnYm9vbCcsXG4gIFRZUEVfREFURTogJ2RhdGUnLFxuICBGSUxURVJTX1BPU0lUSU9OX0lOTElORTogJ2lubGluZScsXG4gIEZJTFRFUlNfUE9TSVRJT05fVE9QOiAndG9wJyxcbiAgRklMVEVSU19QT1NJVElPTl9CT1RUT006ICdib3R0b20nXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29uc3QuanMiLCIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE2IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcyAoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZykpO1xuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBjb25zdCBCb290c3RyYXBDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGJvb3RzdHJhcDQ6IGZhbHNlXG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL2Jvb3RzdHJhcC5qcyIsImltcG9ydCBfIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG1hdGNoUm93ID0gKGtleUZpZWxkLCBpZCkgPT4gcm93ID0+IF8uZ2V0KHJvdywga2V5RmllbGQpID09PSBpZDtcblxuZXhwb3J0IGNvbnN0IGdldFJvd0J5Um93SWQgPSAoZGF0YSwga2V5RmllbGQsIGlkKSA9PiBkYXRhLmZpbmQobWF0Y2hSb3coa2V5RmllbGQsIGlkKSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9zdG9yZS9yb3dzLmpzIiwiaW1wb3J0IF8gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGV2ZW50cyA9IFtcbiAgJ29uQ2xpY2snLFxuICAnb25Eb3VibGVDbGljaycsXG4gICdvbk1vdXNlRW50ZXInLFxuICAnb25Nb3VzZUxlYXZlJyxcbiAgJ29uQ29udGV4dE1lbnUnXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBFeHRlbmRCYXNlID0+XG4gIGNsYXNzIENlbGxFdmVudERlbGVnYXRlciBleHRlbmRzIEV4dGVuZEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICBzdXBlcihwcm9wcyk7XG4gICAgICB0aGlzLmNyZWF0ZURlZmF1bHRFdmVudEhhbmRsZXIgPSB0aGlzLmNyZWF0ZURlZmF1bHRFdmVudEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBjcmVhdGVEZWZhdWx0RXZlbnRIYW5kbGVyKGNiKSB7XG4gICAgICByZXR1cm4gKGUpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2x1bW4sIGNvbHVtbkluZGV4LCBpbmRleCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY2IoZSwgY29sdW1uLCB0eXBlb2YgY29sdW1uSW5kZXggIT09ICd1bmRlZmluZWQnID8gY29sdW1uSW5kZXggOiBpbmRleCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlbGVnYXRlKGF0dHJzID0ge30pIHtcbiAgICAgIGNvbnN0IG5ld0F0dHJzID0geyAuLi5hdHRycyB9O1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgaWYgKF8uY29udGFpbnMoZXZlbnRzLCBhdHRyKSkge1xuICAgICAgICAgIG5ld0F0dHJzW2F0dHJdID0gdGhpcy5jcmVhdGVEZWZhdWx0RXZlbnRIYW5kbGVyKGF0dHJzW2F0dHJdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3QXR0cnM7XG4gICAgfVxuICB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY2VsbC1ldmVudC1kZWxlZ2F0ZXIuanMiLCIvKiBlc2xpbnQgY2FtZWxjYXNlOiAwICovXG4vKiBlc2xpbnQgcmVhY3QvcHJvcC10eXBlczogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQ29uc3QgZnJvbSAnLi4vY29uc3QnO1xuaW1wb3J0IF8gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQgZGF0YU9wZXJhdG9yIGZyb20gJy4uL3N0b3JlL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRTZWxlY3Rpb25TdW1tYXJ5IH0gZnJvbSAnLi4vc3RvcmUvc2VsZWN0aW9uJztcblxuY29uc3QgU2VsZWN0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoKTtcbmNsYXNzIFNlbGVjdGlvblByb3ZpZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICBkYXRhOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBrZXlGaWVsZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnNlbGVjdGVkID0gcHJvcHMuc2VsZWN0Um93LnNlbGVjdGVkIHx8IFtdO1xuICB9XG5cbiAgLy8gZXhwb3NlZCBBUElcbiAgZ2V0U2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLnNlbGVjdFJvdykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IG5leHRQcm9wcy5zZWxlY3RSb3cuc2VsZWN0ZWQgfHwgdGhpcy5zZWxlY3RlZDtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSb3dTZWxlY3QgPSAocm93S2V5LCBjaGVja2VkLCByb3dJbmRleCwgZSkgPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwga2V5RmllbGQsIHNlbGVjdFJvdzogeyBtb2RlLCBvblNlbGVjdCB9IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgUk9XX1NFTEVDVF9TSU5HTEUgfSA9IENvbnN0O1xuXG4gICAgbGV0IGN1cnJTZWxlY3RlZCA9IFsuLi50aGlzLnNlbGVjdGVkXTtcblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgY29uc3Qgcm93ID0gZGF0YU9wZXJhdG9yLmdldFJvd0J5Um93SWQoZGF0YSwga2V5RmllbGQsIHJvd0tleSk7XG4gICAgICByZXN1bHQgPSBvblNlbGVjdChyb3csIGNoZWNrZWQsIHJvd0luZGV4LCBlKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAobW9kZSA9PT0gUk9XX1NFTEVDVF9TSU5HTEUpIHsgLy8gd2hlbiBzZWxlY3QgbW9kZSBpcyByYWRpb1xuICAgICAgICBjdXJyU2VsZWN0ZWQgPSBbcm93S2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoY2hlY2tlZCkgeyAvLyB3aGVuIHNlbGVjdCBtb2RlIGlzIGNoZWNrYm94XG4gICAgICAgIGN1cnJTZWxlY3RlZC5wdXNoKHJvd0tleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyU2VsZWN0ZWQgPSBjdXJyU2VsZWN0ZWQuZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9PSByb3dLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkID0gY3VyclNlbGVjdGVkO1xuICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgfVxuXG4gIGhhbmRsZUFsbFJvd3NTZWxlY3QgPSAoZSwgaXNVblNlbGVjdCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBrZXlGaWVsZCxcbiAgICAgIHNlbGVjdFJvdzoge1xuICAgICAgICBvblNlbGVjdEFsbCxcbiAgICAgICAgbm9uU2VsZWN0YWJsZVxuICAgICAgfVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWQgfSA9IHRoaXM7XG5cbiAgICBsZXQgY3VyclNlbGVjdGVkO1xuXG4gICAgaWYgKCFpc1VuU2VsZWN0KSB7XG4gICAgICBjdXJyU2VsZWN0ZWQgPSBzZWxlY3RlZC5jb25jYXQoZGF0YU9wZXJhdG9yLnNlbGVjdGFibGVLZXlzKGRhdGEsIGtleUZpZWxkLCBub25TZWxlY3RhYmxlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJTZWxlY3RlZCA9IHNlbGVjdGVkLmZpbHRlcihzID0+IHR5cGVvZiBkYXRhLmZpbmQoZCA9PiBfLmdldChkLCBrZXlGaWVsZCkgPT09IHMpID09PSAndW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAob25TZWxlY3RBbGwpIHtcbiAgICAgIHJlc3VsdCA9IG9uU2VsZWN0QWxsKFxuICAgICAgICAhaXNVblNlbGVjdCxcbiAgICAgICAgZGF0YU9wZXJhdG9yLmdldFNlbGVjdGVkUm93cyhcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGtleUZpZWxkLFxuICAgICAgICAgIGlzVW5TZWxlY3QgPyBzZWxlY3RlZCA6IGN1cnJTZWxlY3RlZFxuICAgICAgICApLFxuICAgICAgICBlXG4gICAgICApO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICBjdXJyU2VsZWN0ZWQgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWQgPSBjdXJyU2VsZWN0ZWQ7XG4gICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIGFsbFJvd3NOb3RTZWxlY3RlZFxuICAgIH0gPSBnZXRTZWxlY3Rpb25TdW1tYXJ5KFxuICAgICAgdGhpcy5wcm9wcy5kYXRhLFxuICAgICAgdGhpcy5wcm9wcy5rZXlGaWVsZCxcbiAgICAgIHRoaXMuc2VsZWN0ZWRcbiAgICApO1xuXG4gICAgbGV0IGNoZWNrZWRTdGF0dXM7XG5cbiAgICAvLyBjaGVja2JveCBzdGF0dXMgZGVwZW5kaW5nIG9uIHNlbGVjdGVkIHJvd3MgY291bnRzXG4gICAgaWYgKGFsbFJvd3NTZWxlY3RlZCkgY2hlY2tlZFN0YXR1cyA9IENvbnN0LkNIRUNLQk9YX1NUQVRVU19DSEVDS0VEO1xuICAgIGVsc2UgaWYgKGFsbFJvd3NOb3RTZWxlY3RlZCkgY2hlY2tlZFN0YXR1cyA9IENvbnN0LkNIRUNLQk9YX1NUQVRVU19VTkNIRUNLRUQ7XG4gICAgZWxzZSBjaGVja2VkU3RhdHVzID0gQ29uc3QuQ0hFQ0tCT1hfU1RBVFVTX0lOREVURVJNSU5BVEU7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNlbGVjdGlvbkNvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgdmFsdWU9eyB7XG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5zZWxlY3RSb3csXG4gICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICAgICAgb25Sb3dTZWxlY3Q6IHRoaXMuaGFuZGxlUm93U2VsZWN0LFxuICAgICAgICAgIG9uQWxsUm93c1NlbGVjdDogdGhpcy5oYW5kbGVBbGxSb3dzU2VsZWN0LFxuICAgICAgICAgIGFsbFJvd3NTZWxlY3RlZCxcbiAgICAgICAgICBhbGxSb3dzTm90U2VsZWN0ZWQsXG4gICAgICAgICAgY2hlY2tlZFN0YXR1c1xuICAgICAgICB9IH1cbiAgICAgID5cbiAgICAgICAgeyB0aGlzLnByb3BzLmNoaWxkcmVuIH1cbiAgICAgIDwvU2VsZWN0aW9uQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgUHJvdmlkZXI6IFNlbGVjdGlvblByb3ZpZGVyLFxuICBDb25zdW1lcjogU2VsZWN0aW9uQ29udGV4dC5Db25zdW1lclxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL3NlbGVjdGlvbi1jb250ZXh0LmpzIiwiaW1wb3J0ICogYXMgcm93cyBmcm9tICcuL3Jvd3MnO1xuaW1wb3J0ICogYXMgc2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCAqIGFzIGV4cGFuZCBmcm9tICcuL2V4cGFuZCc7XG5pbXBvcnQgKiBhcyBtdXRhdGUgZnJvbSAnLi9tdXRhdGUnO1xuaW1wb3J0ICogYXMgc29ydCBmcm9tICcuL3NvcnQnO1xuaW1wb3J0ICogYXMgdHlwZSBmcm9tICcuL3R5cGUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLnJvd3MsXG4gIC4uLnNlbGVjdGlvbixcbiAgLi4uZXhwYW5kLFxuICAuLi5tdXRhdGUsXG4gIC4uLnNvcnQsXG4gIC4uLnR5cGVcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9zdG9yZS9vcGVyYXRvcnMuanMiLCIvKiBlc2xpbnQgY2FtZWxjYXNlOiAwICovXG4vKiBlc2xpbnQgcmVhY3QvcHJvcC10eXBlczogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgZGF0YU9wZXJhdG9yIGZyb20gJy4uL3N0b3JlL29wZXJhdG9ycyc7XG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IFJvd0V4cGFuZENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KCk7XG5cbmNsYXNzIFJvd0V4cGFuZFByb3ZpZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICBkYXRhOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBrZXlGaWVsZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG4gIH07XG5cbiAgc3RhdGUgPSB7IGV4cGFuZGVkOiB0aGlzLnByb3BzLmV4cGFuZFJvdy5leHBhbmRlZCB8fCBbXSxcbiAgICBpc0Nsb3Npbmc6IHRoaXMucHJvcHMuZXhwYW5kUm93LmlzQ2xvc2luZyB8fCBbXSB9O1xuXG4gIG9uQ2xvc2VkID0gKGNsb3NlZFJvdykgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBpc0Nsb3Npbmc6IHRoaXMuc3RhdGUuaXNDbG9zaW5nLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gY2xvc2VkUm93KSB9KTtcbiAgfTtcblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmV4cGFuZFJvdykge1xuICAgICAgY29uc3QgbmV4dEV4cGFuZGVkID0gbmV4dFByb3BzLmV4cGFuZFJvdy5leHBhbmRlZCB8fCB0aGlzLnN0YXRlLmV4cGFuZGVkO1xuICAgICAgY29uc3QgaXNDbG9zaW5nID0gdGhpcy5zdGF0ZS5leHBhbmRlZC5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XG4gICAgICAgIGlmICghXy5jb250YWlucyhuZXh0RXhwYW5kZWQsIGN1cikpIHtcbiAgICAgICAgICBhY2MucHVzaChjdXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKCgpID0+ICh7XG4gICAgICAgIGV4cGFuZGVkOiBuZXh0RXhwYW5kZWQsXG4gICAgICAgIGlzQ2xvc2luZ1xuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKCgpID0+ICh7XG4gICAgICAgIGV4cGFuZGVkOiB0aGlzLnN0YXRlLmV4cGFuZGVkXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUm93RXhwYW5kID0gKHJvd0tleSwgZXhwYW5kZWQsIHJvd0luZGV4LCBlKSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBrZXlGaWVsZCwgZXhwYW5kUm93OiB7IG9uRXhwYW5kLCBvbmx5T25lRXhwYW5kaW5nLCBub25FeHBhbmRhYmxlIH0gfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG5vbkV4cGFuZGFibGUgJiYgXy5jb250YWlucyhub25FeHBhbmRhYmxlLCByb3dLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGN1cnJFeHBhbmRlZCA9IFsuLi50aGlzLnN0YXRlLmV4cGFuZGVkXTtcbiAgICBsZXQgaXNDbG9zaW5nID0gWy4uLnRoaXMuc3RhdGUuaXNDbG9zaW5nXTtcblxuICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgaWYgKG9ubHlPbmVFeHBhbmRpbmcpIHtcbiAgICAgICAgaXNDbG9zaW5nID0gaXNDbG9zaW5nLmNvbmNhdChjdXJyRXhwYW5kZWQpO1xuICAgICAgICBjdXJyRXhwYW5kZWQgPSBbcm93S2V5XTtcbiAgICAgIH0gZWxzZSBjdXJyRXhwYW5kZWQucHVzaChyb3dLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0Nsb3NpbmcucHVzaChyb3dLZXkpO1xuICAgICAgY3VyckV4cGFuZGVkID0gY3VyckV4cGFuZGVkLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gcm93S2V5KTtcbiAgICB9XG5cbiAgICBpZiAob25FeHBhbmQpIHtcbiAgICAgIGNvbnN0IHJvdyA9IGRhdGFPcGVyYXRvci5nZXRSb3dCeVJvd0lkKGRhdGEsIGtleUZpZWxkLCByb3dLZXkpO1xuICAgICAgb25FeHBhbmQocm93LCBleHBhbmRlZCwgcm93SW5kZXgsIGUpO1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKCgpID0+ICh7IGV4cGFuZGVkOiBjdXJyRXhwYW5kZWQsIGlzQ2xvc2luZyB9KSk7XG4gIH07XG5cbiAgaGFuZGxlQWxsUm93RXhwYW5kID0gKGUsIGV4cGFuZEFsbCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBrZXlGaWVsZCxcbiAgICAgIGV4cGFuZFJvdzoge1xuICAgICAgICBvbkV4cGFuZEFsbCxcbiAgICAgICAgbm9uRXhwYW5kYWJsZVxuICAgICAgfVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZXhwYW5kZWQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBsZXQgY3VyckV4cGFuZGVkO1xuXG4gICAgaWYgKGV4cGFuZEFsbCkge1xuICAgICAgY3VyckV4cGFuZGVkID0gZXhwYW5kZWQuY29uY2F0KGRhdGFPcGVyYXRvci5leHBhbmRhYmxlS2V5cyhkYXRhLCBrZXlGaWVsZCwgbm9uRXhwYW5kYWJsZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyRXhwYW5kZWQgPSBleHBhbmRlZC5maWx0ZXIocyA9PiB0eXBlb2YgZGF0YS5maW5kKGQgPT4gXy5nZXQoZCwga2V5RmllbGQpID09PSBzKSA9PT0gJ3VuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGlmIChvbkV4cGFuZEFsbCkge1xuICAgICAgb25FeHBhbmRBbGwoZXhwYW5kQWxsLCBkYXRhT3BlcmF0b3IuZ2V0RXhwYW5kZWRSb3dzKGRhdGEsIGtleUZpZWxkLCBjdXJyRXhwYW5kZWQpLCBlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCgpID0+ICh7IGV4cGFuZGVkOiBjdXJyRXhwYW5kZWQgfSkpO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGRhdGEsIGtleUZpZWxkIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICA8Um93RXhwYW5kQ29udGV4dC5Qcm92aWRlclxuICAgICAgICB2YWx1ZT17IHtcbiAgICAgICAgICAuLi50aGlzLnByb3BzLmV4cGFuZFJvdyxcbiAgICAgICAgICBub25FeHBhbmRhYmxlOiB0aGlzLnByb3BzLmV4cGFuZFJvdy5ub25FeHBhbmRhYmxlLFxuICAgICAgICAgIGV4cGFuZGVkOiB0aGlzLnN0YXRlLmV4cGFuZGVkLFxuICAgICAgICAgIGlzQ2xvc2luZzogdGhpcy5zdGF0ZS5pc0Nsb3NpbmcsXG4gICAgICAgICAgb25DbG9zZWQ6IHRoaXMub25DbG9zZWQsXG4gICAgICAgICAgaXNBbnlFeHBhbmRzOiBkYXRhT3BlcmF0b3IuaXNBbnlFeHBhbmRzKGRhdGEsIGtleUZpZWxkLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSxcbiAgICAgICAgICBvblJvd0V4cGFuZDogdGhpcy5oYW5kbGVSb3dFeHBhbmQsXG4gICAgICAgICAgb25BbGxSb3dFeHBhbmQ6IHRoaXMuaGFuZGxlQWxsUm93RXhwYW5kXG4gICAgICAgIH0gfVxuICAgICAgPlxuICAgICAgICB7IHRoaXMucHJvcHMuY2hpbGRyZW4gfVxuICAgICAgPC9Sb3dFeHBhbmRDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBQcm92aWRlcjogUm93RXhwYW5kUHJvdmlkZXIsXG4gIENvbnN1bWVyOiBSb3dFeHBhbmRDb250ZXh0LkNvbnN1bWVyXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29udGV4dHMvcm93LWV4cGFuZC1jb250ZXh0LmpzIiwiaW1wb3J0IF8gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Um93QnlSb3dJZCB9IGZyb20gJy4vcm93cyc7XG5cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3Rpb25TdW1tYXJ5ID0gKFxuICBkYXRhID0gW10sXG4gIGtleUZpZWxkLFxuICBzZWxlY3RlZCA9IFtdXG4pID0+IHtcbiAgbGV0IGFsbFJvd3NTZWxlY3RlZCA9IGRhdGEubGVuZ3RoID4gMDtcbiAgbGV0IGFsbFJvd3NOb3RTZWxlY3RlZCA9IHRydWU7XG5cbiAgY29uc3Qgcm93S2V5cyA9IGRhdGEubWFwKGQgPT4gXy5nZXQoZCwga2V5RmllbGQpKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgY3VyciA9IHJvd0tleXNbaV07XG4gICAgaWYgKHR5cGVvZiBzZWxlY3RlZC5maW5kKHggPT4geCA9PT0gY3VycikgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWxsUm93c05vdFNlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgYWxsUm93c1NlbGVjdGVkLFxuICAgIGFsbFJvd3NOb3RTZWxlY3RlZFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdGFibGVLZXlzID0gKGRhdGEgPSBbXSwga2V5RmllbGQsIHNraXBzID0gW10pID0+IHtcbiAgaWYgKHNraXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBkYXRhLm1hcChyb3cgPT4gXy5nZXQocm93LCBrZXlGaWVsZCkpO1xuICB9XG4gIHJldHVybiBkYXRhXG4gICAgLmZpbHRlcihyb3cgPT4gIV8uY29udGFpbnMoc2tpcHMsIF8uZ2V0KHJvdywga2V5RmllbGQpKSlcbiAgICAubWFwKHJvdyA9PiBfLmdldChyb3csIGtleUZpZWxkKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdW5TZWxlY3RhYmxlS2V5cyA9IChzZWxlY3RlZCwgc2tpcHMgPSBbXSkgPT4ge1xuICBpZiAoc2tpcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBzZWxlY3RlZC5maWx0ZXIoeCA9PiBfLmNvbnRhaW5zKHNraXBzLCB4KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0ZWRSb3dzID0gKGRhdGEgPSBbXSwga2V5RmllbGQsIHNlbGVjdGVkKSA9PlxuICBzZWxlY3RlZC5tYXAoayA9PiBnZXRSb3dCeVJvd0lkKGRhdGEsIGtleUZpZWxkLCBrKSkuZmlsdGVyKHggPT4gISF4KTtcblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvc3RvcmUvc2VsZWN0aW9uLmpzIiwiLyogZXNsaW50IHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wczogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBDb25zdCBmcm9tICcuLi9jb25zdCc7XG5cbmNvbnN0IFJvd1RlbXBsYXRlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZW5kZXJDb250ZW50LFxuICAgIHNlbGVjdFJvdyxcbiAgICBleHBhbmRSb3csXG4gICAgY2VsbEVsLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IGlzUmVuZGVyRnVuY3Rpb25Db2x1bW5JbkxlZnQgPSAoXG4gICAgcG9zaXRpb24gPSBDb25zdC5JTkRJQ0FUT1JfUE9TSVRJT05fTEVGVFxuICApID0+IHBvc2l0aW9uID09PSBDb25zdC5JTkRJQ0FUT1JfUE9TSVRJT05fTEVGVDtcblxuICBjb25zdCBjaGlsZHJlbnMgPSByZW5kZXJDb250ZW50KCkgfHwgW107XG5cbiAgaWYgKHNlbGVjdFJvdyAmJiBzZWxlY3RSb3cuaGlkZVNlbGVjdENvbHVtbiAhPT0gdHJ1ZSkge1xuICAgIGlmIChpc1JlbmRlckZ1bmN0aW9uQ29sdW1uSW5MZWZ0KHNlbGVjdFJvdy5zZWxlY3RDb2x1bW5Qb3NpdGlvbikpIHtcbiAgICAgIGNoaWxkcmVucy51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2VsbEVsLCB7IGtleTogJ3NlbGVjdGlvbicgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbnMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KGNlbGxFbCwgeyBrZXk6ICdzZWxlY3Rpb24nIH0pKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhwYW5kUm93LnNob3dFeHBhbmRDb2x1bW4pIHtcbiAgICBpZiAoaXNSZW5kZXJGdW5jdGlvbkNvbHVtbkluTGVmdChleHBhbmRSb3cuZXhwYW5kQ29sdW1uUG9zaXRpb24pKSB7XG4gICAgICBjaGlsZHJlbnMudW5zaGlmdChSZWFjdC5jcmVhdGVFbGVtZW50KGNlbGxFbCwgeyBrZXk6ICdleHBhbnNpb24nIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5zLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChjZWxsRWwsIHsga2V5OiAnZXhwYW5zaW9uJyB9KSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDx0ciB7IC4uLnJlc3QgfT57IGNoaWxkcmVucyB9PC90cj47XG59O1xuXG5Sb3dUZW1wbGF0ZS5wcm9wVHlwZXMgPSB7XG4gIHJlbmRlckNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNlbGxFbDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBzZWxlY3RSb3c6IFByb3BUeXBlcy5vYmplY3QsXG4gIGV4cGFuZFJvdzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUm93VGVtcGxhdGU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3cvcm93LXRlbXBsYXRlLmpzIiwiLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbi8qIGVzbGludCByZWFjdC9uby1hcnJheS1pbmRleC1rZXk6IDAgKi9cbi8qIGVzbGludCBuby1wbHVzcGx1czogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IF8gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IENlbGwgZnJvbSAnLi4vY2VsbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvd1B1cmVDb250ZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgIGlmICh0eXBlb2YgbmV4dFByb3BzLnNob3VsZFVwZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBuZXh0UHJvcHMuc2hvdWxkVXBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICByb3csXG4gICAgICBrZXlGaWVsZCxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGVkaXRhYmxlLFxuICAgICAgZWRpdGluZ1Jvd0lkeCxcbiAgICAgIGVkaXRpbmdDb2xJZHgsXG4gICAgICBvblN0YXJ0LFxuICAgICAgY2xpY2tUb0VkaXQsXG4gICAgICBkYmNsaWNrVG9FZGl0LFxuICAgICAgRWRpdGluZ0NlbGxDb21wb25lbnQsXG4gICAgICB0YWJJbmRleFN0YXJ0XG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBsZXQgdGFiSW5kZXggPSB0YWJJbmRleFN0YXJ0O1xuXG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGFGaWVsZCB9ID0gY29sdW1uO1xuICAgICAgY29uc3QgY29udGVudCA9IF8uZ2V0KHJvdywgZGF0YUZpZWxkKTtcbiAgICAgIGlmIChyb3dJbmRleCA9PT0gZWRpdGluZ1Jvd0lkeCAmJiBpbmRleCA9PT0gZWRpdGluZ0NvbElkeCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxFZGl0aW5nQ2VsbENvbXBvbmVudFxuICAgICAgICAgICAga2V5PXsgYCR7Y29udGVudH0tJHtpbmRleH0tZWRpdGluZ2AgfVxuICAgICAgICAgICAgcm93PXsgcm93IH1cbiAgICAgICAgICAgIHJvd0luZGV4PXsgcm93SW5kZXggfVxuICAgICAgICAgICAgY29sdW1uPXsgY29sdW1uIH1cbiAgICAgICAgICAgIGNvbHVtbkluZGV4PXsgaW5kZXggfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyByZW5kZXIgY2VsbFxuICAgICAgbGV0IGNlbGxUaXRsZTtcbiAgICAgIGxldCBjZWxsU3R5bGUgPSB7fTtcbiAgICAgIGxldCBjZWxsQXR0cnMgPSB7XG4gICAgICAgIC4uLl8uaXNGdW5jdGlvbihjb2x1bW4uYXR0cnMpXG4gICAgICAgICAgPyBjb2x1bW4uYXR0cnMoY29udGVudCwgcm93LCByb3dJbmRleCwgaW5kZXgpXG4gICAgICAgICAgOiBjb2x1bW4uYXR0cnNcbiAgICAgIH07XG5cbiAgICAgIGlmIChjb2x1bW4uZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbHVtbi5ldmVudHMpO1xuICAgICAgICBPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCBjb2x1bW4uZXZlbnRzKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luRm4gPSBldmVudHNba2V5XTtcbiAgICAgICAgICBldmVudHNba2V5XSA9ICguLi5yZXN0KSA9PiBvcmlnaW5GbiguLi5yZXN0LCByb3csIHJvd0luZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNlbGxBdHRycyA9IHsgLi4uY2VsbEF0dHJzLCAuLi5ldmVudHMgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2VsbENsYXNzZXMgPSBfLmlzRnVuY3Rpb24oY29sdW1uLmNsYXNzZXMpXG4gICAgICAgID8gY29sdW1uLmNsYXNzZXMoY29udGVudCwgcm93LCByb3dJbmRleCwgaW5kZXgpXG4gICAgICAgIDogY29sdW1uLmNsYXNzZXM7XG5cbiAgICAgIGlmIChjb2x1bW4uc3R5bGUpIHtcbiAgICAgICAgY2VsbFN0eWxlID0gXy5pc0Z1bmN0aW9uKGNvbHVtbi5zdHlsZSlcbiAgICAgICAgICA/IGNvbHVtbi5zdHlsZShjb250ZW50LCByb3csIHJvd0luZGV4LCBpbmRleClcbiAgICAgICAgICA6IGNvbHVtbi5zdHlsZTtcbiAgICAgICAgY2VsbFN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgY2VsbFN0eWxlKSB8fCB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi50aXRsZSkge1xuICAgICAgICBjZWxsVGl0bGUgPSBfLmlzRnVuY3Rpb24oY29sdW1uLnRpdGxlKVxuICAgICAgICAgID8gY29sdW1uLnRpdGxlKGNvbnRlbnQsIHJvdywgcm93SW5kZXgsIGluZGV4KVxuICAgICAgICAgIDogY29udGVudDtcbiAgICAgICAgY2VsbEF0dHJzLnRpdGxlID0gY2VsbFRpdGxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sdW1uLmFsaWduKSB7XG4gICAgICAgIGNlbGxTdHlsZS50ZXh0QWxpZ24gPVxuICAgICAgICAgIF8uaXNGdW5jdGlvbihjb2x1bW4uYWxpZ24pXG4gICAgICAgICAgICA/IGNvbHVtbi5hbGlnbihjb250ZW50LCByb3csIHJvd0luZGV4LCBpbmRleClcbiAgICAgICAgICAgIDogY29sdW1uLmFsaWduO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbENsYXNzZXMpIGNlbGxBdHRycy5jbGFzc05hbWUgPSBjZWxsQ2xhc3NlcztcbiAgICAgIGlmICghXy5pc0VtcHR5T2JqZWN0KGNlbGxTdHlsZSkpIGNlbGxBdHRycy5zdHlsZSA9IGNlbGxTdHlsZTtcblxuICAgICAgbGV0IGVkaXRhYmxlQ2VsbCA9IF8uaXNEZWZpbmVkKGNvbHVtbi5lZGl0YWJsZSkgPyBjb2x1bW4uZWRpdGFibGUgOiB0cnVlO1xuICAgICAgaWYgKGNvbHVtbi5kYXRhRmllbGQgPT09IGtleUZpZWxkIHx8ICFlZGl0YWJsZSkgZWRpdGFibGVDZWxsID0gZmFsc2U7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKGNvbHVtbi5lZGl0YWJsZSkpIHtcbiAgICAgICAgZWRpdGFibGVDZWxsID0gY29sdW1uLmVkaXRhYmxlKGNvbnRlbnQsIHJvdywgcm93SW5kZXgsIGluZGV4KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhYkluZGV4U3RhcnQgIT09IC0xKSB7XG4gICAgICAgIGNlbGxBdHRycy50YWJJbmRleCA9IHRhYkluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDZWxsXG4gICAgICAgICAga2V5PXsgYCR7Y29udGVudH0tJHtpbmRleH1gIH1cbiAgICAgICAgICByb3c9eyByb3cgfVxuICAgICAgICAgIGVkaXRhYmxlPXsgZWRpdGFibGVDZWxsIH1cbiAgICAgICAgICByb3dJbmRleD17IHJvd0luZGV4IH1cbiAgICAgICAgICBjb2x1bW5JbmRleD17IGluZGV4IH1cbiAgICAgICAgICBjb2x1bW49eyBjb2x1bW4gfVxuICAgICAgICAgIG9uU3RhcnQ9eyBvblN0YXJ0IH1cbiAgICAgICAgICBjbGlja1RvRWRpdD17IGNsaWNrVG9FZGl0IH1cbiAgICAgICAgICBkYmNsaWNrVG9FZGl0PXsgZGJjbGlja1RvRWRpdCB9XG4gICAgICAgICAgeyAuLi5jZWxsQXR0cnMgfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L3Jvdy1wdXJlLWNvbnRlbnQuanMiLCJpbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgQ29uc3QgZnJvbSAnLi4vY29uc3QnO1xuXG5jb25zdCBldmVudHMgPSBbXG4gICdvbkNsaWNrJyxcbiAgJ29uRG91YmxlQ2xpY2snLFxuICAnb25Nb3VzZUVudGVyJyxcbiAgJ29uTW91c2VMZWF2ZScsXG4gICdvbkNvbnRleHRNZW51J1xuXTtcblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5kQmFzZSA9PlxuICBjbGFzcyBSb3dFdmVudERlbGVnYXRlciBleHRlbmRzIEV4dGVuZEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICBzdXBlcihwcm9wcyk7XG4gICAgICB0aGlzLmNsaWNrTnVtID0gMDtcbiAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEV2ZW50SGFuZGxlciA9IHRoaXMuY3JlYXRlRGVmYXVsdEV2ZW50SGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5jcmVhdGVDbGlja0V2ZW50SGFuZGxlciA9IHRoaXMuY3JlYXRlQ2xpY2tFdmVudEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBjcmVhdGVDbGlja0V2ZW50SGFuZGxlcihjYikge1xuICAgICAgcmV0dXJuIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByb3csXG4gICAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgICAga2V5RmllbGQsXG4gICAgICAgICAgc2VsZWN0YWJsZSxcbiAgICAgICAgICBleHBhbmRhYmxlLFxuICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgIGV4cGFuZGVkLFxuICAgICAgICAgIGV4cGFuZFJvdyxcbiAgICAgICAgICBzZWxlY3RSb3csXG4gICAgICAgICAgREVMQVlfRk9SX0RCQ0xJQ0tcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICBjYihlLCByb3csIHJvd0luZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qga2V5ID0gXy5nZXQocm93LCBrZXlGaWVsZCk7XG4gICAgICAgICAgaWYgKGV4cGFuZFJvdyAmJiBleHBhbmRhYmxlICYmICFleHBhbmRSb3cuZXhwYW5kQnlDb2x1bW5Pbmx5KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChzZWxlY3RSb3cubW9kZSAhPT0gQ29uc3QuUk9XX1NFTEVDVF9ESVNBQkxFRCAmJiBzZWxlY3RSb3cuY2xpY2tUb0V4cGFuZCkgfHxcbiAgICAgICAgICAgICAgc2VsZWN0Um93Lm1vZGUgPT09IENvbnN0LlJPV19TRUxFQ1RfRElTQUJMRURcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBleHBhbmRSb3cub25Sb3dFeHBhbmQoa2V5LCAhZXhwYW5kZWQsIHJvd0luZGV4LCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGVjdFJvdy5jbGlja1RvU2VsZWN0ICYmIHNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgIHNlbGVjdFJvdy5vblJvd1NlbGVjdChrZXksICFzZWxlY3RlZCwgcm93SW5kZXgsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoREVMQVlfRk9SX0RCQ0xJQ0spIHtcbiAgICAgICAgICB0aGlzLmNsaWNrTnVtICs9IDE7XG4gICAgICAgICAgXy5kZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja051bSA9PT0gMSkge1xuICAgICAgICAgICAgICBjbGlja0ZuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsaWNrTnVtID0gMDtcbiAgICAgICAgICB9LCBERUxBWV9GT1JfREJDTElDSykoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGlja0ZuKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY3JlYXRlRGVmYXVsdEV2ZW50SGFuZGxlcihjYikge1xuICAgICAgcmV0dXJuIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcm93LCByb3dJbmRleCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY2IoZSwgcm93LCByb3dJbmRleCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlbGVnYXRlKGF0dHJzID0ge30pIHtcbiAgICAgIGNvbnN0IG5ld0F0dHJzID0geyAuLi5hdHRycyB9O1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgaWYgKF8uY29udGFpbnMoZXZlbnRzLCBhdHRyKSkge1xuICAgICAgICAgIG5ld0F0dHJzW2F0dHJdID0gdGhpcy5jcmVhdGVEZWZhdWx0RXZlbnRIYW5kbGVyKGF0dHJzW2F0dHJdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3QXR0cnM7XG4gICAgfVxuICB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L2V2ZW50LWRlbGVnYXRlci5qcyIsIi8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOiAwICovXG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IEV4dGVuZEJhc2UgPT5cbiAgY2xhc3MgUm93U2hvdWxkVXBkYXRlciBleHRlbmRzIEV4dGVuZEJhc2Uge1xuICAgIHNob3VsZFVwZGF0ZUJ5Q2VsbEVkaXRpbmcobmV4dFByb3BzKSB7XG4gICAgICBpZiAoISh0aGlzLnByb3BzLmNsaWNrVG9FZGl0IHx8IHRoaXMucHJvcHMuZGJjbGlja1RvRWRpdCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG5leHRQcm9wcy5lZGl0aW5nUm93SWR4ID09PSBuZXh0UHJvcHMucm93SW5kZXggfHxcbiAgICAgICAgKHRoaXMucHJvcHMuZWRpdGluZ1Jvd0lkeCA9PT0gbmV4dFByb3BzLnJvd0luZGV4ICYmXG4gICAgICAgIG5leHRQcm9wcy5lZGl0aW5nUm93SWR4ID09PSBudWxsKSB8fFxuICAgICAgICB0aGlzLnByb3BzLmVkaXRpbmdSb3dJZHggPT09IG5leHRQcm9wcy5yb3dJbmRleFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzaG91bGRVcGRhdGVkQnlTZWxmUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnByb3BzLmNsYXNzTmFtZSAhPT0gbmV4dFByb3BzLmNsYXNzTmFtZSB8fFxuICAgICAgICAhXy5pc0VxdWFsKHRoaXMucHJvcHMuc3R5bGUsIG5leHRQcm9wcy5zdHlsZSkgfHxcbiAgICAgICAgIV8uaXNFcXVhbCh0aGlzLnByb3BzLmF0dHJzLCBuZXh0UHJvcHMuYXR0cnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdXNlIGZvciBzaW1wbGUtcm93XG4gICAgc2hvdWxkVXBkYXRlQnlDb2x1bW5zRm9yU2ltcGxlQ2hlY2sobmV4dFByb3BzKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jb2x1bW5zLmxlbmd0aCAhPT0gbmV4dFByb3BzLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb3BzLmNvbHVtbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKCFfLmlzRXF1YWwodGhpcy5wcm9wcy5jb2x1bW5zW2ldLCBuZXh0UHJvcHMuY29sdW1uc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNob3VsZFVwZGF0ZWRCeU5vcm1hbFByb3BzKG5leHRQcm9wcykge1xuICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgICAgdGhpcy5wcm9wcy5yb3dJbmRleCAhPT0gbmV4dFByb3BzLnJvd0luZGV4IHx8XG4gICAgICAgIHRoaXMucHJvcHMuZWRpdGFibGUgIT09IG5leHRQcm9wcy5lZGl0YWJsZSB8fFxuICAgICAgICAhXy5pc0VxdWFsKHRoaXMucHJvcHMucm93LCBuZXh0UHJvcHMucm93KSB8fFxuICAgICAgICB0aGlzLnByb3BzLmNvbHVtbnMubGVuZ3RoICE9PSBuZXh0UHJvcHMuY29sdW1ucy5sZW5ndGg7XG5cbiAgICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gICAgfVxuXG4gICAgc2hvdWxkVXBkYXRlQ2hpbGQobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGRVcGRhdGVCeUNlbGxFZGl0aW5nKG5leHRQcm9wcykgfHxcbiAgICAgICAgdGhpcy5zaG91bGRVcGRhdGVkQnlOb3JtYWxQcm9wcyhuZXh0UHJvcHMpO1xuICAgIH1cblxuICAgIHNob3VsZFJvd0NvbnRlbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGRVcGRhdGVDaGlsZChuZXh0UHJvcHMpIHx8XG4gICAgICAgIHRoaXMuc2hvdWxkVXBkYXRlQnlDb2x1bW5zRm9yU2ltcGxlQ2hlY2sobmV4dFByb3BzKTtcbiAgICB9XG4gIH07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3cvc2hvdWxkLXVwZGF0ZXIuanMiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuRVhJVElORyA9IGV4cG9ydHMuRU5URVJFRCA9IGV4cG9ydHMuRU5URVJJTkcgPSBleHBvcnRzLkVYSVRFRCA9IGV4cG9ydHMuVU5NT1VOVEVEID0gdm9pZCAwO1xuXG52YXIgUHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0RG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTtcblxudmFyIF9yZWFjdExpZmVjeWNsZXNDb21wYXQgPSByZXF1aXJlKFwicmVhY3QtbGlmZWN5Y2xlcy1jb21wYXRcIik7XG5cbnZhciBfUHJvcFR5cGVzID0gcmVxdWlyZShcIi4vdXRpbHMvUHJvcFR5cGVzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IHt9OyBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBVTk1PVU5URUQgPSAndW5tb3VudGVkJztcbmV4cG9ydHMuVU5NT1VOVEVEID0gVU5NT1VOVEVEO1xudmFyIEVYSVRFRCA9ICdleGl0ZWQnO1xuZXhwb3J0cy5FWElURUQgPSBFWElURUQ7XG52YXIgRU5URVJJTkcgPSAnZW50ZXJpbmcnO1xuZXhwb3J0cy5FTlRFUklORyA9IEVOVEVSSU5HO1xudmFyIEVOVEVSRUQgPSAnZW50ZXJlZCc7XG5leHBvcnRzLkVOVEVSRUQgPSBFTlRFUkVEO1xudmFyIEVYSVRJTkcgPSAnZXhpdGluZyc7XG4vKipcbiAqIFRoZSBUcmFuc2l0aW9uIGNvbXBvbmVudCBsZXRzIHlvdSBkZXNjcmliZSBhIHRyYW5zaXRpb24gZnJvbSBvbmUgY29tcG9uZW50XG4gKiBzdGF0ZSB0byBhbm90aGVyIF9vdmVyIHRpbWVfIHdpdGggYSBzaW1wbGUgZGVjbGFyYXRpdmUgQVBJLiBNb3N0IGNvbW1vbmx5XG4gKiBpdCdzIHVzZWQgdG8gYW5pbWF0ZSB0aGUgbW91bnRpbmcgYW5kIHVubW91bnRpbmcgb2YgYSBjb21wb25lbnQsIGJ1dCBjYW4gYWxzb1xuICogYmUgdXNlZCB0byBkZXNjcmliZSBpbi1wbGFjZSB0cmFuc2l0aW9uIHN0YXRlcyBhcyB3ZWxsLlxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGBUcmFuc2l0aW9uYCBjb21wb25lbnQgZG9lcyBub3QgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHRoZVxuICogY29tcG9uZW50IGl0IHJlbmRlcnMsIGl0IG9ubHkgdHJhY2tzIFwiZW50ZXJcIiBhbmQgXCJleGl0XCIgc3RhdGVzIGZvciB0aGUgY29tcG9uZW50cy5cbiAqIEl0J3MgdXAgdG8geW91IHRvIGdpdmUgbWVhbmluZyBhbmQgZWZmZWN0IHRvIHRob3NlIHN0YXRlcy4gRm9yIGV4YW1wbGUgd2UgY2FuXG4gKiBhZGQgc3R5bGVzIHRvIGEgY29tcG9uZW50IHdoZW4gaXQgZW50ZXJzIG9yIGV4aXRzOlxuICpcbiAqIGBgYGpzeFxuICogaW1wb3J0IFRyYW5zaXRpb24gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbiAqXG4gKiBjb25zdCBkdXJhdGlvbiA9IDMwMDtcbiAqXG4gKiBjb25zdCBkZWZhdWx0U3R5bGUgPSB7XG4gKiAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7ZHVyYXRpb259bXMgZWFzZS1pbi1vdXRgLFxuICogICBvcGFjaXR5OiAwLFxuICogfVxuICpcbiAqIGNvbnN0IHRyYW5zaXRpb25TdHlsZXMgPSB7XG4gKiAgIGVudGVyaW5nOiB7IG9wYWNpdHk6IDAgfSxcbiAqICAgZW50ZXJlZDogIHsgb3BhY2l0eTogMSB9LFxuICogfTtcbiAqXG4gKiBjb25zdCBGYWRlID0gKHsgaW46IGluUHJvcCB9KSA9PiAoXG4gKiAgIDxUcmFuc2l0aW9uIGluPXtpblByb3B9IHRpbWVvdXQ9e2R1cmF0aW9ufT5cbiAqICAgICB7KHN0YXRlKSA9PiAoXG4gKiAgICAgICA8ZGl2IHN0eWxlPXt7XG4gKiAgICAgICAgIC4uLmRlZmF1bHRTdHlsZSxcbiAqICAgICAgICAgLi4udHJhbnNpdGlvblN0eWxlc1tzdGF0ZV1cbiAqICAgICAgIH19PlxuICogICAgICAgICBJJ20gYSBmYWRlIFRyYW5zaXRpb24hXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICApfVxuICogICA8L1RyYW5zaXRpb24+XG4gKiApO1xuICogYGBgXG4gKlxuICogQXMgbm90ZWQgdGhlIGBUcmFuc2l0aW9uYCBjb21wb25lbnQgZG9lc24ndCBfZG9fIGFueXRoaW5nIGJ5IGl0c2VsZiB0byBpdHMgY2hpbGQgY29tcG9uZW50LlxuICogV2hhdCBpdCBkb2VzIGRvIGlzIHRyYWNrIHRyYW5zaXRpb24gc3RhdGVzIG92ZXIgdGltZSBzbyB5b3UgY2FuIHVwZGF0ZSB0aGVcbiAqIGNvbXBvbmVudCAoc3VjaCBhcyBieSBhZGRpbmcgc3R5bGVzIG9yIGNsYXNzZXMpIHdoZW4gaXQgY2hhbmdlcyBzdGF0ZXMuXG4gKlxuICogVGhlcmUgYXJlIDQgbWFpbiBzdGF0ZXMgYSBUcmFuc2l0aW9uIGNhbiBiZSBpbjpcbiAqICAtIGAnZW50ZXJpbmcnYFxuICogIC0gYCdlbnRlcmVkJ2BcbiAqICAtIGAnZXhpdGluZydgXG4gKiAgLSBgJ2V4aXRlZCdgXG4gKlxuICogVHJhbnNpdGlvbiBzdGF0ZSBpcyB0b2dnbGVkIHZpYSB0aGUgYGluYCBwcm9wLiBXaGVuIGB0cnVlYCB0aGUgY29tcG9uZW50IGJlZ2lucyB0aGVcbiAqIFwiRW50ZXJcIiBzdGFnZS4gRHVyaW5nIHRoaXMgc3RhZ2UsIHRoZSBjb21wb25lbnQgd2lsbCBzaGlmdCBmcm9tIGl0cyBjdXJyZW50IHRyYW5zaXRpb24gc3RhdGUsXG4gKiB0byBgJ2VudGVyaW5nJ2AgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBhbmQgdGhlbiB0byB0aGUgYCdlbnRlcmVkJ2Agc3RhZ2Ugb25jZVxuICogaXQncyBjb21wbGV0ZS4gTGV0J3MgdGFrZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6XG4gKlxuICogYGBganN4XG4gKiBzdGF0ZSA9IHsgaW46IGZhbHNlIH07XG4gKlxuICogdG9nZ2xlRW50ZXJTdGF0ZSA9ICgpID0+IHtcbiAqICAgdGhpcy5zZXRTdGF0ZSh7IGluOiB0cnVlIH0pO1xuICogfVxuICpcbiAqIHJlbmRlcigpIHtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8ZGl2PlxuICogICAgICAgPFRyYW5zaXRpb24gaW49e3RoaXMuc3RhdGUuaW59IHRpbWVvdXQ9ezUwMH0gLz5cbiAqICAgICAgIDxidXR0b24gb25DbGljaz17dGhpcy50b2dnbGVFbnRlclN0YXRlfT5DbGljayB0byBFbnRlcjwvYnV0dG9uPlxuICogICAgIDwvZGl2PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogV2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgdGhlIGNvbXBvbmVudCB3aWxsIHNoaWZ0IHRvIHRoZSBgJ2VudGVyaW5nJ2Agc3RhdGUgYW5kXG4gKiBzdGF5IHRoZXJlIGZvciA1MDBtcyAodGhlIHZhbHVlIG9mIGB0aW1lb3V0YCkgYmVmb3JlIGl0IGZpbmFsbHkgc3dpdGNoZXMgdG8gYCdlbnRlcmVkJ2AuXG4gKlxuICogV2hlbiBgaW5gIGlzIGBmYWxzZWAgdGhlIHNhbWUgdGhpbmcgaGFwcGVucyBleGNlcHQgdGhlIHN0YXRlIG1vdmVzIGZyb20gYCdleGl0aW5nJ2AgdG8gYCdleGl0ZWQnYC5cbiAqXG4gKiAjIyBUaW1pbmdcbiAqXG4gKiBUaW1pbmcgaXMgb2Z0ZW4gdGhlIHRyaWNraWVzdCBwYXJ0IG9mIGFuaW1hdGlvbiwgbWlzdGFrZXMgY2FuIHJlc3VsdCBpbiBzbGlnaHQgZGVsYXlzXG4gKiB0aGF0IGFyZSBoYXJkIHRvIHBpbiBkb3duLiBBIGNvbW1vbiBleGFtcGxlIGlzIHdoZW4geW91IHdhbnQgdG8gYWRkIGFuIGV4aXQgdHJhbnNpdGlvbixcbiAqIHlvdSBzaG91bGQgc2V0IHRoZSBkZXNpcmVkIGZpbmFsIHN0eWxlcyB3aGVuIHRoZSBzdGF0ZSBpcyBgJ2V4aXRpbmcnYC4gVGhhdCdzIHdoZW4gdGhlXG4gKiB0cmFuc2l0aW9uIHRvIHRob3NlIHN0eWxlcyB3aWxsIHN0YXJ0IGFuZCwgaWYgeW91IG1hdGNoZWQgdGhlIGB0aW1lb3V0YCBwcm9wIHdpdGggdGhlXG4gKiBDU1MgVHJhbnNpdGlvbiBkdXJhdGlvbiwgaXQgd2lsbCBlbmQgZXhhY3RseSB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzIHRvIGAnZXhpdGVkJ2AuXG4gKlxuICogPiAqKk5vdGUqKjogRm9yIHNpbXBsZXIgdHJhbnNpdGlvbnMgdGhlIGBUcmFuc2l0aW9uYCBjb21wb25lbnQgbWlnaHQgYmUgZW5vdWdoLCBidXRcbiAqID4gdGFrZSBpbnRvIGFjY291bnQgdGhhdCBpdCdzIHBsYXRmb3JtLWFnbm9zdGljLCB3aGlsZSB0aGUgYENTU1RyYW5zaXRpb25gIGNvbXBvbmVudFxuICogPiBbZm9yY2VzIHJlZmxvd3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvYmxvYi81MDA3MzAzZTcyOWE3NGJlNjZhMjFjM2UyMjA1ZTQ5MTY4MjE1MjRiL3NyYy9DU1NUcmFuc2l0aW9uLmpzI0wyMDgtTDIxNSlcbiAqID4gaW4gb3JkZXIgdG8gbWFrZSBtb3JlIGNvbXBsZXggdHJhbnNpdGlvbnMgbW9yZSBwcmVkaWN0YWJsZS4gRm9yIGV4YW1wbGUsIGV2ZW4gdGhvdWdoXG4gKiA+IGNsYXNzZXMgYGV4YW1wbGUtZW50ZXJgIGFuZCBgZXhhbXBsZS1lbnRlci1hY3RpdmVgIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5IG9uZSBhZnRlclxuICogPiBhbm90aGVyLCB5b3UgY2FuIHN0aWxsIHRyYW5zaXRpb24gZnJvbSBvbmUgdG8gdGhlIG90aGVyIGJlY2F1c2Ugb2YgdGhlIGZvcmNlZCByZWZsb3dcbiAqID4gKHJlYWQgW3RoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvaXNzdWVzLzE1OSNpc3N1ZWNvbW1lbnQtMzIyNzYxMTcxKVxuICogPiBmb3IgbW9yZSBpbmZvKS4gVGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuIGNob29zaW5nIGJldHdlZW4gYFRyYW5zaXRpb25gIGFuZFxuICogPiBgQ1NTVHJhbnNpdGlvbmAuXG4gKi9cblxuZXhwb3J0cy5FWElUSU5HID0gRVhJVElORztcblxudmFyIFRyYW5zaXRpb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVHJhbnNpdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVHJhbnNpdGlvbihwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSB8fCB0aGlzO1xuICAgIHZhciBwYXJlbnRHcm91cCA9IGNvbnRleHQudHJhbnNpdGlvbkdyb3VwOyAvLyBJbiB0aGUgY29udGV4dCBvZiBhIFRyYW5zaXRpb25Hcm91cCBhbGwgZW50ZXJzIGFyZSByZWFsbHkgYXBwZWFyc1xuXG4gICAgdmFyIGFwcGVhciA9IHBhcmVudEdyb3VwICYmICFwYXJlbnRHcm91cC5pc01vdW50aW5nID8gcHJvcHMuZW50ZXIgOiBwcm9wcy5hcHBlYXI7XG4gICAgdmFyIGluaXRpYWxTdGF0dXM7XG4gICAgX3RoaXMuYXBwZWFyU3RhdHVzID0gbnVsbDtcblxuICAgIGlmIChwcm9wcy5pbikge1xuICAgICAgaWYgKGFwcGVhcikge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRVhJVEVEO1xuICAgICAgICBfdGhpcy5hcHBlYXJTdGF0dXMgPSBFTlRFUklORztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBFTlRFUkVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcHMudW5tb3VudE9uRXhpdCB8fCBwcm9wcy5tb3VudE9uRW50ZXIpIHtcbiAgICAgICAgaW5pdGlhbFN0YXR1cyA9IFVOTU9VTlRFRDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBFWElURUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBzdGF0dXM6IGluaXRpYWxTdGF0dXNcbiAgICB9O1xuICAgIF90aGlzLm5leHRDYWxsYmFjayA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zaXRpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zaXRpb25Hcm91cDogbnVsbCAvLyBhbGxvd3MgZm9yIG5lc3RlZCBUcmFuc2l0aW9uc1xuXG4gICAgfTtcbiAgfTtcblxuICBUcmFuc2l0aW9uLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmLCBwcmV2U3RhdGUpIHtcbiAgICB2YXIgbmV4dEluID0gX3JlZi5pbjtcblxuICAgIGlmIChuZXh0SW4gJiYgcHJldlN0YXRlLnN0YXR1cyA9PT0gVU5NT1VOVEVEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IEVYSVRFRFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTsgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUocHJldlByb3BzKSB7XG4gIC8vICAgbGV0IG5leHRTdGF0dXMgPSBudWxsXG4gIC8vICAgaWYgKHByZXZQcm9wcyAhPT0gdGhpcy5wcm9wcykge1xuICAvLyAgICAgY29uc3QgeyBzdGF0dXMgfSA9IHRoaXMuc3RhdGVcbiAgLy8gICAgIGlmICh0aGlzLnByb3BzLmluKSB7XG4gIC8vICAgICAgIGlmIChzdGF0dXMgIT09IEVOVEVSSU5HICYmIHN0YXR1cyAhPT0gRU5URVJFRCkge1xuICAvLyAgICAgICAgIG5leHRTdGF0dXMgPSBFTlRFUklOR1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICBpZiAoc3RhdHVzID09PSBFTlRFUklORyB8fCBzdGF0dXMgPT09IEVOVEVSRUQpIHtcbiAgLy8gICAgICAgICBuZXh0U3RhdHVzID0gRVhJVElOR1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiB7IG5leHRTdGF0dXMgfVxuICAvLyB9XG5cblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnVwZGF0ZVN0YXR1cyh0cnVlLCB0aGlzLmFwcGVhclN0YXR1cyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgbmV4dFN0YXR1cyA9IG51bGw7XG5cbiAgICBpZiAocHJldlByb3BzICE9PSB0aGlzLnByb3BzKSB7XG4gICAgICB2YXIgc3RhdHVzID0gdGhpcy5zdGF0ZS5zdGF0dXM7XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLmluKSB7XG4gICAgICAgIGlmIChzdGF0dXMgIT09IEVOVEVSSU5HICYmIHN0YXR1cyAhPT0gRU5URVJFRCkge1xuICAgICAgICAgIG5leHRTdGF0dXMgPSBFTlRFUklORztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gRU5URVJJTkcgfHwgc3RhdHVzID09PSBFTlRFUkVEKSB7XG4gICAgICAgICAgbmV4dFN0YXR1cyA9IEVYSVRJTkc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1cyhmYWxzZSwgbmV4dFN0YXR1cyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0VGltZW91dHMgPSBmdW5jdGlvbiBnZXRUaW1lb3V0cygpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXMucHJvcHMudGltZW91dDtcbiAgICB2YXIgZXhpdCwgZW50ZXIsIGFwcGVhcjtcbiAgICBleGl0ID0gZW50ZXIgPSBhcHBlYXIgPSB0aW1lb3V0O1xuXG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCAmJiB0eXBlb2YgdGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgIGV4aXQgPSB0aW1lb3V0LmV4aXQ7XG4gICAgICBlbnRlciA9IHRpbWVvdXQuZW50ZXI7XG4gICAgICBhcHBlYXIgPSB0aW1lb3V0LmFwcGVhcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXhpdDogZXhpdCxcbiAgICAgIGVudGVyOiBlbnRlcixcbiAgICAgIGFwcGVhcjogYXBwZWFyXG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8udXBkYXRlU3RhdHVzID0gZnVuY3Rpb24gdXBkYXRlU3RhdHVzKG1vdW50aW5nLCBuZXh0U3RhdHVzKSB7XG4gICAgaWYgKG1vdW50aW5nID09PSB2b2lkIDApIHtcbiAgICAgIG1vdW50aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5leHRTdGF0dXMgIT09IG51bGwpIHtcbiAgICAgIC8vIG5leHRTdGF0dXMgd2lsbCBhbHdheXMgYmUgRU5URVJJTkcgb3IgRVhJVElORy5cbiAgICAgIHRoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG5cbiAgICAgIHZhciBub2RlID0gX3JlYWN0RG9tLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7XG5cbiAgICAgIGlmIChuZXh0U3RhdHVzID09PSBFTlRFUklORykge1xuICAgICAgICB0aGlzLnBlcmZvcm1FbnRlcihub2RlLCBtb3VudGluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBlcmZvcm1FeGl0KG5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy51bm1vdW50T25FeGl0ICYmIHRoaXMuc3RhdGUuc3RhdHVzID09PSBFWElURUQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzdGF0dXM6IFVOTU9VTlRFRFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wZXJmb3JtRW50ZXIgPSBmdW5jdGlvbiBwZXJmb3JtRW50ZXIobm9kZSwgbW91bnRpbmcpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBlbnRlciA9IHRoaXMucHJvcHMuZW50ZXI7XG4gICAgdmFyIGFwcGVhcmluZyA9IHRoaXMuY29udGV4dC50cmFuc2l0aW9uR3JvdXAgPyB0aGlzLmNvbnRleHQudHJhbnNpdGlvbkdyb3VwLmlzTW91bnRpbmcgOiBtb3VudGluZztcbiAgICB2YXIgdGltZW91dHMgPSB0aGlzLmdldFRpbWVvdXRzKCk7IC8vIG5vIGVudGVyIGFuaW1hdGlvbiBza2lwIHJpZ2h0IHRvIEVOVEVSRURcbiAgICAvLyBpZiB3ZSBhcmUgbW91bnRpbmcgYW5kIHJ1bm5pbmcgdGhpcyBpdCBtZWFucyBhcHBlYXIgX211c3RfIGJlIHNldFxuXG4gICAgaWYgKCFtb3VudGluZyAmJiAhZW50ZXIpIHtcbiAgICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgc3RhdHVzOiBFTlRFUkVEXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5wcm9wcy5vbkVudGVyZWQobm9kZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uRW50ZXIobm9kZSwgYXBwZWFyaW5nKTtcbiAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICBzdGF0dXM6IEVOVEVSSU5HXG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJpbmcobm9kZSwgYXBwZWFyaW5nKTsgLy8gRklYTUU6IGFwcGVhciB0aW1lb3V0P1xuXG5cbiAgICAgIF90aGlzMi5vblRyYW5zaXRpb25FbmQobm9kZSwgdGltZW91dHMuZW50ZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLnNhZmVTZXRTdGF0ZSh7XG4gICAgICAgICAgc3RhdHVzOiBFTlRFUkVEXG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIucHJvcHMub25FbnRlcmVkKG5vZGUsIGFwcGVhcmluZyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnBlcmZvcm1FeGl0ID0gZnVuY3Rpb24gcGVyZm9ybUV4aXQobm9kZSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGV4aXQgPSB0aGlzLnByb3BzLmV4aXQ7XG4gICAgdmFyIHRpbWVvdXRzID0gdGhpcy5nZXRUaW1lb3V0cygpOyAvLyBubyBleGl0IGFuaW1hdGlvbiBza2lwIHJpZ2h0IHRvIEVYSVRFRFxuXG4gICAgaWYgKCFleGl0KSB7XG4gICAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICAgIHN0YXR1czogRVhJVEVEXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRlZChub2RlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25FeGl0KG5vZGUpO1xuICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgIHN0YXR1czogRVhJVElOR1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRpbmcobm9kZSk7XG5cbiAgICAgIF90aGlzMy5vblRyYW5zaXRpb25FbmQobm9kZSwgdGltZW91dHMuZXhpdCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgICBzdGF0dXM6IEVYSVRFRFxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMzLnByb3BzLm9uRXhpdGVkKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5jYW5jZWxOZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiBjYW5jZWxOZXh0Q2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMubmV4dENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB0aGlzLm5leHRDYWxsYmFjay5jYW5jZWwoKTtcbiAgICAgIHRoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnNhZmVTZXRTdGF0ZSA9IGZ1bmN0aW9uIHNhZmVTZXRTdGF0ZShuZXh0U3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgLy8gVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgdGhlcmUgYXJlIHdlaXJkIHJhY2UgY29uZGl0aW9ucyB3aXRoXG4gICAgLy8gc2V0U3RhdGUgY2FsbGJhY2tzIGFuZCB1bm1vdW50aW5nIGluIHRlc3RpbmcsIHNvIGFsd2F5cyBtYWtlIHN1cmUgdGhhdFxuICAgIC8vIHdlIGNhbiBjYW5jZWwgYW55IHBlbmRpbmcgc2V0U3RhdGUgY2FsbGJhY2tzIGFmdGVyIHdlIHVubW91bnQuXG4gICAgY2FsbGJhY2sgPSB0aGlzLnNldE5leHRDYWxsYmFjayhjYWxsYmFjayk7XG4gICAgdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUsIGNhbGxiYWNrKTtcbiAgfTtcblxuICBfcHJvdG8uc2V0TmV4dENhbGxiYWNrID0gZnVuY3Rpb24gc2V0TmV4dENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgYWN0aXZlID0gdHJ1ZTtcblxuICAgIHRoaXMubmV4dENhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBfdGhpczQubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5leHRDYWxsYmFjay5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubmV4dENhbGxiYWNrO1xuICB9O1xuXG4gIF9wcm90by5vblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQobm9kZSwgdGltZW91dCwgaGFuZGxlcikge1xuICAgIHRoaXMuc2V0TmV4dENhbGxiYWNrKGhhbmRsZXIpO1xuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMucHJvcHMuYWRkRW5kTGlzdGVuZXIobm9kZSwgdGhpcy5uZXh0Q2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KHRoaXMubmV4dENhbGxiYWNrLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgc3RhdHVzID0gdGhpcy5zdGF0ZS5zdGF0dXM7XG5cbiAgICBpZiAoc3RhdHVzID09PSBVTk1PVU5URUQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNoaWxkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiY2hpbGRyZW5cIl0pOyAvLyBmaWx0ZXIgcHJvcHMgZm9yIFRyYW5zdGl0aW9uXG5cblxuICAgIGRlbGV0ZSBjaGlsZFByb3BzLmluO1xuICAgIGRlbGV0ZSBjaGlsZFByb3BzLm1vdW50T25FbnRlcjtcbiAgICBkZWxldGUgY2hpbGRQcm9wcy51bm1vdW50T25FeGl0O1xuICAgIGRlbGV0ZSBjaGlsZFByb3BzLmFwcGVhcjtcbiAgICBkZWxldGUgY2hpbGRQcm9wcy5lbnRlcjtcbiAgICBkZWxldGUgY2hpbGRQcm9wcy5leGl0O1xuICAgIGRlbGV0ZSBjaGlsZFByb3BzLnRpbWVvdXQ7XG4gICAgZGVsZXRlIGNoaWxkUHJvcHMuYWRkRW5kTGlzdGVuZXI7XG4gICAgZGVsZXRlIGNoaWxkUHJvcHMub25FbnRlcjtcbiAgICBkZWxldGUgY2hpbGRQcm9wcy5vbkVudGVyaW5nO1xuICAgIGRlbGV0ZSBjaGlsZFByb3BzLm9uRW50ZXJlZDtcbiAgICBkZWxldGUgY2hpbGRQcm9wcy5vbkV4aXQ7XG4gICAgZGVsZXRlIGNoaWxkUHJvcHMub25FeGl0aW5nO1xuICAgIGRlbGV0ZSBjaGlsZFByb3BzLm9uRXhpdGVkO1xuXG4gICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuKHN0YXR1cywgY2hpbGRQcm9wcyk7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gX3JlYWN0LmRlZmF1bHQuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG5cbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY2xvbmVFbGVtZW50KGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgfTtcblxuICByZXR1cm4gVHJhbnNpdGlvbjtcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5jb250ZXh0VHlwZXMgPSB7XG4gIHRyYW5zaXRpb25Hcm91cDogUHJvcFR5cGVzLm9iamVjdFxufTtcblRyYW5zaXRpb24uY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gIHRyYW5zaXRpb25Hcm91cDogZnVuY3Rpb24gdHJhbnNpdGlvbkdyb3VwKCkge31cbn07XG5UcmFuc2l0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqXG4gICAqIEEgYGZ1bmN0aW9uYCBjaGlsZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgUmVhY3QgZWxlbWVudC5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCB0cmFuc2l0aW9uIHN0YXR1c1xuICAgKiAoJ2VudGVyaW5nJywgJ2VudGVyZWQnLCAnZXhpdGluZycsICdleGl0ZWQnLCAndW5tb3VudGVkJyksIHdoaWNoIGNhbiBiZSB1c2VkXG4gICAqIHRvIGFwcGx5IGNvbnRleHQgc3BlY2lmaWMgcHJvcHMgdG8gYSBjb21wb25lbnQuXG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiA8VHJhbnNpdGlvbiB0aW1lb3V0PXsxNTB9PlxuICAgKiAgIHsoc3RhdHVzKSA9PiAoXG4gICAqICAgICA8TXlDb21wb25lbnQgY2xhc3NOYW1lPXtgZmFkZSBmYWRlLSR7c3RhdHVzfWB9IC8+XG4gICAqICAgKX1cbiAgICogPC9UcmFuc2l0aW9uPlxuICAgKiBgYGBcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLCBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkXSkuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBzdGF0ZXNcbiAgICovXG4gIGluOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgY2hpbGQgY29tcG9uZW50IGlzIG1vdW50ZWQgaW1tZWRpYXRlbHkgYWxvbmcgd2l0aFxuICAgKiB0aGUgcGFyZW50IGBUcmFuc2l0aW9uYCBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIFwibGF6eSBtb3VudFwiIHRoZSBjb21wb25lbnQgb24gdGhlXG4gICAqIGZpcnN0IGBpbj17dHJ1ZX1gIHlvdSBjYW4gc2V0IGBtb3VudE9uRW50ZXJgLiBBZnRlciB0aGUgZmlyc3QgZW50ZXIgdHJhbnNpdGlvbiB0aGUgY29tcG9uZW50IHdpbGwgc3RheVxuICAgKiBtb3VudGVkLCBldmVuIG9uIFwiZXhpdGVkXCIsIHVubGVzcyB5b3UgYWxzbyBzcGVjaWZ5IGB1bm1vdW50T25FeGl0YC5cbiAgICovXG4gIG1vdW50T25FbnRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGNoaWxkIGNvbXBvbmVudCBzdGF5cyBtb3VudGVkIGFmdGVyIGl0IHJlYWNoZXMgdGhlIGAnZXhpdGVkJ2Agc3RhdGUuXG4gICAqIFNldCBgdW5tb3VudE9uRXhpdGAgaWYgeW91J2QgcHJlZmVyIHRvIHVubW91bnQgdGhlIGNvbXBvbmVudCBhZnRlciBpdCBmaW5pc2hlcyBleGl0aW5nLlxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE5vcm1hbGx5IGEgY29tcG9uZW50IGlzIG5vdCB0cmFuc2l0aW9uZWQgaWYgaXQgaXMgc2hvd24gd2hlbiB0aGUgYDxUcmFuc2l0aW9uPmAgY29tcG9uZW50IG1vdW50cy5cbiAgICogSWYgeW91IHdhbnQgdG8gdHJhbnNpdGlvbiBvbiB0aGUgZmlyc3QgbW91bnQgc2V0IGBhcHBlYXJgIHRvIGB0cnVlYCwgYW5kIHRoZVxuICAgKiBjb21wb25lbnQgd2lsbCB0cmFuc2l0aW9uIGluIGFzIHNvb24gYXMgdGhlIGA8VHJhbnNpdGlvbj5gIG1vdW50cy5cbiAgICpcbiAgICogPiBOb3RlOiB0aGVyZSBhcmUgbm8gc3BlY2lmaWMgXCJhcHBlYXJcIiBzdGF0ZXMuIGBhcHBlYXJgIG9ubHkgYWRkcyBhbiBhZGRpdGlvbmFsIGBlbnRlcmAgdHJhbnNpdGlvbi5cbiAgICovXG4gIGFwcGVhcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIGVudGVyIHRyYW5zaXRpb25zLlxuICAgKi9cbiAgZW50ZXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBleGl0IHRyYW5zaXRpb25zLlxuICAgKi9cbiAgZXhpdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBSZXF1aXJlZCB1bmxlc3MgYGFkZEVuZExpc3RlbmVyYCBpcyBwcm92aWRlZFxuICAgKlxuICAgKiBZb3UgbWF5IHNwZWNpZnkgYSBzaW5nbGUgdGltZW91dCBmb3IgYWxsIHRyYW5zaXRpb25zIGxpa2U6IGB0aW1lb3V0PXs1MDB9YCxcbiAgICogb3IgaW5kaXZpZHVhbGx5IGxpa2U6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiB0aW1lb3V0PXt7XG4gICAqICBlbnRlcjogMzAwLFxuICAgKiAgZXhpdDogNTAwLFxuICAgKiB9fVxuICAgKiBgYGBcbiAgICpcbiAgICogQHR5cGUge251bWJlciB8IHsgZW50ZXI/OiBudW1iZXIsIGV4aXQ/OiBudW1iZXIgfX1cbiAgICovXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uIHRpbWVvdXQocHJvcHMpIHtcbiAgICB2YXIgcHQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBfUHJvcFR5cGVzLnRpbWVvdXRzU2hhcGUgOiB7fTs7XG4gICAgaWYgKCFwcm9wcy5hZGRFbmRMaXN0ZW5lcikgcHQgPSBwdC5pc1JlcXVpcmVkO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHB0LmFwcGx5KHZvaWQgMCwgW3Byb3BzXS5jb25jYXQoYXJncykpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBBZGQgYSBjdXN0b20gdHJhbnNpdGlvbiBlbmQgdHJpZ2dlci4gQ2FsbGVkIHdpdGggdGhlIHRyYW5zaXRpb25pbmdcbiAgICogRE9NIG5vZGUgYW5kIGEgYGRvbmVgIGNhbGxiYWNrLiBBbGxvd3MgZm9yIG1vcmUgZmluZSBncmFpbmVkIHRyYW5zaXRpb24gZW5kXG4gICAqIGxvZ2ljLiAqKk5vdGU6KiogVGltZW91dHMgYXJlIHN0aWxsIHVzZWQgYXMgYSBmYWxsYmFjayBpZiBwcm92aWRlZC5cbiAgICpcbiAgICogYGBganN4XG4gICAqIGFkZEVuZExpc3RlbmVyPXsobm9kZSwgZG9uZSkgPT4ge1xuICAgKiAgIC8vIHVzZSB0aGUgY3NzIHRyYW5zaXRpb25lbmQgZXZlbnQgdG8gbWFyayB0aGUgZmluaXNoIG9mIGEgdHJhbnNpdGlvblxuICAgKiAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGRvbmUsIGZhbHNlKTtcbiAgICogfX1cbiAgICogYGBgXG4gICAqL1xuICBhZGRFbmRMaXN0ZW5lcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgXCJlbnRlcmluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLiBBbiBleHRyYSBwYXJhbWV0ZXJcbiAgICogYGlzQXBwZWFyaW5nYCBpcyBzdXBwbGllZCB0byBpbmRpY2F0ZSBpZiB0aGUgZW50ZXIgc3RhZ2UgaXMgb2NjdXJyaW5nIG9uIHRoZSBpbml0aWFsIG1vdW50XG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50LCBpc0FwcGVhcmluZzogYm9vbCkgLT4gdm9pZFxuICAgKi9cbiAgb25FbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBcImVudGVyaW5nXCIgc3RhdHVzIGlzIGFwcGxpZWQuIEFuIGV4dHJhIHBhcmFtZXRlclxuICAgKiBgaXNBcHBlYXJpbmdgIGlzIHN1cHBsaWVkIHRvIGluZGljYXRlIGlmIHRoZSBlbnRlciBzdGFnZSBpcyBvY2N1cnJpbmcgb24gdGhlIGluaXRpYWwgbW91bnRcbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQsIGlzQXBwZWFyaW5nOiBib29sKVxuICAgKi9cbiAgb25FbnRlcmluZzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBcImVudGVyZWRcIiBzdGF0dXMgaXMgYXBwbGllZC4gQW4gZXh0cmEgcGFyYW1ldGVyXG4gICAqIGBpc0FwcGVhcmluZ2AgaXMgc3VwcGxpZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGVudGVyIHN0YWdlIGlzIG9jY3VycmluZyBvbiB0aGUgaW5pdGlhbCBtb3VudFxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCwgaXNBcHBlYXJpbmc6IGJvb2wpIC0+IHZvaWRcbiAgICovXG4gIG9uRW50ZXJlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgXCJleGl0aW5nXCIgc3RhdHVzIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50KSAtPiB2b2lkXG4gICAqL1xuICBvbkV4aXQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJleGl0aW5nXCIgc3RhdHVzIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50KSAtPiB2b2lkXG4gICAqL1xuICBvbkV4aXRpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJleGl0ZWRcIiBzdGF0dXMgaXMgYXBwbGllZC5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQpIC0+IHZvaWRcbiAgICovXG4gIG9uRXhpdGVkOiBQcm9wVHlwZXMuZnVuYyAvLyBOYW1lIHRoZSBmdW5jdGlvbiBzbyBpdCBpcyBjbGVhcmVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG5cbn0gOiB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBpbjogZmFsc2UsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlLFxuICBlbnRlcjogdHJ1ZSxcbiAgZXhpdDogdHJ1ZSxcbiAgb25FbnRlcjogbm9vcCxcbiAgb25FbnRlcmluZzogbm9vcCxcbiAgb25FbnRlcmVkOiBub29wLFxuICBvbkV4aXQ6IG5vb3AsXG4gIG9uRXhpdGluZzogbm9vcCxcbiAgb25FeGl0ZWQ6IG5vb3Bcbn07XG5UcmFuc2l0aW9uLlVOTU9VTlRFRCA9IDA7XG5UcmFuc2l0aW9uLkVYSVRFRCA9IDE7XG5UcmFuc2l0aW9uLkVOVEVSSU5HID0gMjtcblRyYW5zaXRpb24uRU5URVJFRCA9IDM7XG5UcmFuc2l0aW9uLkVYSVRJTkcgPSA0O1xuXG52YXIgX2RlZmF1bHQgPSAoMCwgX3JlYWN0TGlmZWN5Y2xlc0NvbXBhdC5wb2x5ZmlsbCkoVHJhbnNpdGlvbik7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xN19fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0RE9NXCIsXCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwiLFwiY29tbW9uanNcIjpcInJlYWN0LWRvbVwiLFwiYW1kXCI6XCJyZWFjdC1kb21cIn1cbi8vIG1vZHVsZSBpZCA9IDE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gIC8vIENhbGwgdGhpcy5jb25zdHJ1Y3Rvci5nRFNGUCB0byBzdXBwb3J0IHN1Yi1jbGFzc2VzLlxuICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgaWYgKHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAvLyBDYWxsIHRoaXMuY29uc3RydWN0b3IuZ0RTRlAgdG8gc3VwcG9ydCBzdWItY2xhc3Nlcy5cbiAgLy8gVXNlIHRoZSBzZXRTdGF0ZSgpIHVwZGF0ZXIgdG8gZW5zdXJlIHN0YXRlIGlzbid0IHN0YWxlIGluIGNlcnRhaW4gZWRnZSBjYXNlcy5cbiAgZnVuY3Rpb24gdXBkYXRlcihwcmV2U3RhdGUpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQgPyBzdGF0ZSA6IG51bGw7XG4gIH1cbiAgLy8gQmluZGluZyBcInRoaXNcIiBpcyBpbXBvcnRhbnQgZm9yIHNoYWxsb3cgcmVuZGVyZXIgc3VwcG9ydC5cbiAgdGhpcy5zZXRTdGF0ZSh1cGRhdGVyLmJpbmQodGhpcykpO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gIHRyeSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHByZXZTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgdGhpcy5wcm9wcyA9IG5leHRQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgIHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnID0gdHJ1ZTtcbiAgICB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90ID0gdGhpcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5wcm9wcyA9IHByZXZQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gcHJldlN0YXRlO1xuICB9XG59XG5cbi8vIFJlYWN0IG1heSB3YXJuIGFib3V0IGNXTS9jV1JQL2NXVSBtZXRob2RzIGJlaW5nIGRlcHJlY2F0ZWQuXG4vLyBBZGQgYSBmbGFnIHRvIHN1cHByZXNzIHRoZXNlIHdhcm5pbmdzIGZvciB0aGlzIHNwZWNpYWwgY2FzZS5cbmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTtcbmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7XG5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuXG5mdW5jdGlvbiBwb2x5ZmlsbChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG5cbiAgaWYgKCFwcm90b3R5cGUgfHwgIXByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBwb2x5ZmlsbCBjbGFzcyBjb21wb25lbnRzJyk7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH1cblxuICAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gIC8vIEVycm9yIGlmIGFueSBvZiB0aGVzZSBsaWZlY3ljbGVzIGFyZSBwcmVzZW50LFxuICAvLyBCZWNhdXNlIHRoZXkgd291bGQgd29yayBkaWZmZXJlbnRseSBiZXR3ZWVuIG9sZGVyIGFuZCBuZXdlciAoMTYuMyspIHZlcnNpb25zIG9mIFJlYWN0LlxuICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgfVxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvdHlwZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICB9XG4gIGlmIChcbiAgICBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHxcbiAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8XG4gICAgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbFxuICApIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZTtcbiAgICB2YXIgbmV3QXBpTmFtZSA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSdcbiAgICAgICAgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICtcbiAgICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICcgdXNlcyAnICtcbiAgICAgICAgbmV3QXBpTmFtZSArXG4gICAgICAgICcgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczonICtcbiAgICAgICAgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJykgK1xuICAgICAgICAoZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbFxuICAgICAgICAgID8gJ1xcbiAgJyArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWVcbiAgICAgICAgICA6ICcnKSArXG4gICAgICAgIChmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJykgK1xuICAgICAgICAnXFxuXFxuVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArXG4gICAgICAgICdodHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IDw9IDE2LjIgZG9lcyBub3Qgc3VwcG9ydCBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV00gYW5kIGNXUlAgdG8gaW52b2tlIHRoZSBuZXcgc3RhdGljIGxpZmVjeWNsZS5cbiAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgUmVhY3Qgd2lsbCBpZ25vcmUgdGhlc2UgbGlmZWN5Y2xlcyBpZiBnRFNGUCBleGlzdHMuXG4gIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBjb21wb25lbnRXaWxsTW91bnQ7XG4gICAgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuICB9XG5cbiAgLy8gUmVhY3QgPD0gMTYuMiBkb2VzIG5vdCBzdXBwb3J0IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV1UgdG8gaW52b2tlIHRoZSBuZXcgbGlmZWN5Y2xlLlxuICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBSZWFjdCB3aWxsIGlnbm9yZSB0aGF0IGxpZmVjeWNsZSBpZiBnU0JVIGV4aXN0cy5cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwb2x5ZmlsbCBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGZvciBjb21wb25lbnRzIHRoYXQgZG8gbm90IGRlZmluZSBjb21wb25lbnREaWRVcGRhdGUoKSBvbiB0aGUgcHJvdG90eXBlJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGNvbXBvbmVudFdpbGxVcGRhdGU7XG5cbiAgICB2YXIgY29tcG9uZW50RGlkVXBkYXRlID0gcHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZTtcblxuICAgIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGVQb2x5ZmlsbChcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZSxcbiAgICAgIG1heWJlU25hcHNob3RcbiAgICApIHtcbiAgICAgIC8vIDE2LjMrIHdpbGwgbm90IGV4ZWN1dGUgb3VyIHdpbGwtdXBkYXRlIG1ldGhvZDtcbiAgICAgIC8vIEl0IHdpbGwgcGFzcyBhIHNuYXBzaG90IHZhbHVlIHRvIGRpZC11cGRhdGUgdGhvdWdoLlxuICAgICAgLy8gT2xkZXIgdmVyc2lvbnMgd2lsbCByZXF1aXJlIG91ciBwb2x5ZmlsbGVkIHdpbGwtdXBkYXRlIHZhbHVlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgYm90aCBjYXNlcywgYnV0IGNhbid0IGp1c3QgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBcIm1heWJlU25hcHNob3RcIixcbiAgICAgIC8vIEJlY2F1c2UgZm9yIDw9IDE1LnggdmVyc2lvbnMgdGhpcyBtaWdodCBiZSBhIFwicHJldkNvbnRleHRcIiBvYmplY3QuXG4gICAgICAvLyBXZSBhbHNvIGNhbid0IGp1c3QgY2hlY2sgXCJfX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFwiLFxuICAgICAgLy8gQmVjYXVzZSBnZXQtc25hcHNob3QgbWlnaHQgcmV0dXJuIGEgZmFsc3kgdmFsdWUuXG4gICAgICAvLyBTbyBjaGVjayBmb3IgdGhlIGV4cGxpY2l0IF9fcmVhY3RJbnRlcm5hbFNuYXBzaG90RmxhZyBmbGFnIHRvIGRldGVybWluZSBiZWhhdmlvci5cbiAgICAgIHZhciBzbmFwc2hvdCA9IHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnXG4gICAgICAgID8gdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFxuICAgICAgICA6IG1heWJlU25hcHNob3Q7XG5cbiAgICAgIGNvbXBvbmVudERpZFVwZGF0ZS5jYWxsKHRoaXMsIHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBDb21wb25lbnQ7XG59XG5cbmV4cG9ydCB7IHBvbHlmaWxsIH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0L3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0LmVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5jbGFzc05hbWVzU2hhcGUgPSBleHBvcnRzLnRpbWVvdXRzU2hhcGUgPSB2b2lkIDA7XG5cbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB0aW1lb3V0c1NoYXBlID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsIF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gIGVudGVyOiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICBleGl0OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyXG59KS5pc1JlcXVpcmVkXSkgOiBudWxsO1xuZXhwb3J0cy50aW1lb3V0c1NoYXBlID0gdGltZW91dHNTaGFwZTtcbnZhciBjbGFzc05hbWVzU2hhcGUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZywgX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgZW50ZXI6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGV4aXQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGFjdGl2ZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZ1xufSksIF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gIGVudGVyOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBlbnRlckRvbmU6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGVudGVyQWN0aXZlOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBleGl0OiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBleGl0RG9uZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgZXhpdEFjdGl2ZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZ1xufSldKSA6IG51bGw7XG5leHBvcnRzLmNsYXNzTmFtZXNTaGFwZSA9IGNsYXNzTmFtZXNTaGFwZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvdXRpbHMvUHJvcFR5cGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0TGlmZWN5Y2xlc0NvbXBhdCA9IHJlcXVpcmUoXCJyZWFjdC1saWZlY3ljbGVzLWNvbXBhdFwiKTtcblxudmFyIF9DaGlsZE1hcHBpbmcgPSByZXF1aXJlKFwiLi91dGlscy9DaGlsZE1hcHBpbmdcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG52YXIgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbiAoaykge1xuICAgIHJldHVybiBvYmpba107XG4gIH0pO1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50OiAnZGl2JyxcbiAgY2hpbGRGYWN0b3J5OiBmdW5jdGlvbiBjaGlsZEZhY3RvcnkoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBgPFRyYW5zaXRpb25Hcm91cD5gIGNvbXBvbmVudCBtYW5hZ2VzIGEgc2V0IG9mIHRyYW5zaXRpb24gY29tcG9uZW50c1xuICAgKiAoYDxUcmFuc2l0aW9uPmAgYW5kIGA8Q1NTVHJhbnNpdGlvbj5gKSBpbiBhIGxpc3QuIExpa2Ugd2l0aCB0aGUgdHJhbnNpdGlvblxuICAgKiBjb21wb25lbnRzLCBgPFRyYW5zaXRpb25Hcm91cD5gIGlzIGEgc3RhdGUgbWFjaGluZSBmb3IgbWFuYWdpbmcgdGhlIG1vdW50aW5nXG4gICAqIGFuZCB1bm1vdW50aW5nIG9mIGNvbXBvbmVudHMgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBDb25zaWRlciB0aGUgZXhhbXBsZSBiZWxvdy4gQXMgaXRlbXMgYXJlIHJlbW92ZWQgb3IgYWRkZWQgdG8gdGhlIFRvZG9MaXN0IHRoZVxuICAgKiBgaW5gIHByb3AgaXMgdG9nZ2xlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBgPFRyYW5zaXRpb25Hcm91cD5gLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYDxUcmFuc2l0aW9uR3JvdXA+YCAgZG9lcyBub3QgZGVmaW5lIGFueSBhbmltYXRpb24gYmVoYXZpb3IhXG4gICAqIEV4YWN0bHkgX2hvd18gYSBsaXN0IGl0ZW0gYW5pbWF0ZXMgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgdHJhbnNpdGlvblxuICAgKiBjb21wb25lbnQuIFRoaXMgbWVhbnMgeW91IGNhbiBtaXggYW5kIG1hdGNoIGFuaW1hdGlvbnMgYWNyb3NzIGRpZmZlcmVudCBsaXN0XG4gICAqIGl0ZW1zLlxuICAgKi9cblxufTtcblxudmFyIFRyYW5zaXRpb25Hcm91cCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShUcmFuc2l0aW9uR3JvdXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zaXRpb25Hcm91cChwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSB8fCB0aGlzO1xuXG4gICAgdmFyIGhhbmRsZUV4aXRlZCA9IF90aGlzLmhhbmRsZUV4aXRlZC5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTsgLy8gSW5pdGlhbCBjaGlsZHJlbiBzaG91bGQgYWxsIGJlIGVudGVyaW5nLCBkZXBlbmRlbnQgb24gYXBwZWFyXG5cblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgaGFuZGxlRXhpdGVkOiBoYW5kbGVFeGl0ZWQsXG4gICAgICBmaXJzdFJlbmRlcjogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zaXRpb25Hcm91cC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNpdGlvbkdyb3VwOiB7XG4gICAgICAgIGlzTW91bnRpbmc6ICF0aGlzLmFwcGVhcmVkXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmFwcGVhcmVkID0gdHJ1ZTtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICB9O1xuXG4gIFRyYW5zaXRpb25Hcm91cC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBfcmVmKSB7XG4gICAgdmFyIHByZXZDaGlsZE1hcHBpbmcgPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgICBoYW5kbGVFeGl0ZWQgPSBfcmVmLmhhbmRsZUV4aXRlZCxcbiAgICAgICAgZmlyc3RSZW5kZXIgPSBfcmVmLmZpcnN0UmVuZGVyO1xuICAgIHJldHVybiB7XG4gICAgICBjaGlsZHJlbjogZmlyc3RSZW5kZXIgPyAoMCwgX0NoaWxkTWFwcGluZy5nZXRJbml0aWFsQ2hpbGRNYXBwaW5nKShuZXh0UHJvcHMsIGhhbmRsZUV4aXRlZCkgOiAoMCwgX0NoaWxkTWFwcGluZy5nZXROZXh0Q2hpbGRNYXBwaW5nKShuZXh0UHJvcHMsIHByZXZDaGlsZE1hcHBpbmcsIGhhbmRsZUV4aXRlZCksXG4gICAgICBmaXJzdFJlbmRlcjogZmFsc2VcbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by5oYW5kbGVFeGl0ZWQgPSBmdW5jdGlvbiBoYW5kbGVFeGl0ZWQoY2hpbGQsIG5vZGUpIHtcbiAgICB2YXIgY3VycmVudENoaWxkTWFwcGluZyA9ICgwLCBfQ2hpbGRNYXBwaW5nLmdldENoaWxkTWFwcGluZykodGhpcy5wcm9wcy5jaGlsZHJlbik7XG4gICAgaWYgKGNoaWxkLmtleSBpbiBjdXJyZW50Q2hpbGRNYXBwaW5nKSByZXR1cm47XG5cbiAgICBpZiAoY2hpbGQucHJvcHMub25FeGl0ZWQpIHtcbiAgICAgIGNoaWxkLnByb3BzLm9uRXhpdGVkKG5vZGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vdW50ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF9leHRlbmRzKHt9LCBzdGF0ZS5jaGlsZHJlbik7XG5cbiAgICAgICAgZGVsZXRlIGNoaWxkcmVuW2NoaWxkLmtleV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgIGNoaWxkRmFjdG9yeSA9IF90aGlzJHByb3BzLmNoaWxkRmFjdG9yeSxcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiY29tcG9uZW50XCIsIFwiY2hpbGRGYWN0b3J5XCJdKTtcblxuICAgIHZhciBjaGlsZHJlbiA9IHZhbHVlcyh0aGlzLnN0YXRlLmNoaWxkcmVuKS5tYXAoY2hpbGRGYWN0b3J5KTtcbiAgICBkZWxldGUgcHJvcHMuYXBwZWFyO1xuICAgIGRlbGV0ZSBwcm9wcy5lbnRlcjtcbiAgICBkZWxldGUgcHJvcHMuZXhpdDtcblxuICAgIGlmIChDb21wb25lbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHByb3BzLCBjaGlsZHJlbik7XG4gIH07XG5cbiAgcmV0dXJuIFRyYW5zaXRpb25Hcm91cDtcbn0oX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbkdyb3VwLmNoaWxkQ29udGV4dFR5cGVzID0ge1xuICB0cmFuc2l0aW9uR3JvdXA6IF9wcm9wVHlwZXMuZGVmYXVsdC5vYmplY3QuaXNSZXF1aXJlZFxufTtcblRyYW5zaXRpb25Hcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKlxuICAgKiBgPFRyYW5zaXRpb25Hcm91cD5gIHJlbmRlcnMgYSBgPGRpdj5gIGJ5IGRlZmF1bHQuIFlvdSBjYW4gY2hhbmdlIHRoaXNcbiAgICogYmVoYXZpb3IgYnkgcHJvdmlkaW5nIGEgYGNvbXBvbmVudGAgcHJvcC5cbiAgICogSWYgeW91IHVzZSBSZWFjdCB2MTYrIGFuZCB3b3VsZCBsaWtlIHRvIGF2b2lkIGEgd3JhcHBpbmcgYDxkaXY+YCBlbGVtZW50XG4gICAqIHlvdSBjYW4gcGFzcyBpbiBgY29tcG9uZW50PXtudWxsfWAuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB3cmFwcGluZyBkaXZcbiAgICogYm9ya3MgeW91ciBjc3Mgc3R5bGVzLlxuICAgKi9cbiAgY29tcG9uZW50OiBfcHJvcFR5cGVzLmRlZmF1bHQuYW55LFxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiBgPFRyYW5zaXRpb24+YCBjb21wb25lbnRzLCB0aGF0IGFyZSB0b2dnbGVkIGBpbmAgYW5kIG91dCBhcyB0aGV5XG4gICAqIGxlYXZlLiB0aGUgYDxUcmFuc2l0aW9uR3JvdXA+YCB3aWxsIGluamVjdCBzcGVjaWZpYyB0cmFuc2l0aW9uIHByb3BzLCBzb1xuICAgKiByZW1lbWJlciB0byBzcHJlYWQgdGhlbSB0aHJvdWdoIGlmIHlvdSBhcmUgd3JhcHBpbmcgdGhlIGA8VHJhbnNpdGlvbj5gIGFzXG4gICAqIHdpdGggb3VyIGA8RmFkZT5gIGV4YW1wbGUuXG4gICAqL1xuICBjaGlsZHJlbjogX3Byb3BUeXBlcy5kZWZhdWx0Lm5vZGUsXG5cbiAgLyoqXG4gICAqIEEgY29udmVuaWVuY2UgcHJvcCB0aGF0IGVuYWJsZXMgb3IgZGlzYWJsZXMgYXBwZWFyIGFuaW1hdGlvbnNcbiAgICogZm9yIGFsbCBjaGlsZHJlbi4gTm90ZSB0aGF0IHNwZWNpZnlpbmcgdGhpcyB3aWxsIG92ZXJyaWRlIGFueSBkZWZhdWx0cyBzZXRcbiAgICogb24gaW5kaXZpZHVhbCBjaGlsZHJlbiBUcmFuc2l0aW9ucy5cbiAgICovXG4gIGFwcGVhcjogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgY29udmVuaWVuY2UgcHJvcCB0aGF0IGVuYWJsZXMgb3IgZGlzYWJsZXMgZW50ZXIgYW5pbWF0aW9uc1xuICAgKiBmb3IgYWxsIGNoaWxkcmVuLiBOb3RlIHRoYXQgc3BlY2lmeWluZyB0aGlzIHdpbGwgb3ZlcnJpZGUgYW55IGRlZmF1bHRzIHNldFxuICAgKiBvbiBpbmRpdmlkdWFsIGNoaWxkcmVuIFRyYW5zaXRpb25zLlxuICAgKi9cbiAgZW50ZXI6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBBIGNvbnZlbmllbmNlIHByb3AgdGhhdCBlbmFibGVzIG9yIGRpc2FibGVzIGV4aXQgYW5pbWF0aW9uc1xuICAgKiBmb3IgYWxsIGNoaWxkcmVuLiBOb3RlIHRoYXQgc3BlY2lmeWluZyB0aGlzIHdpbGwgb3ZlcnJpZGUgYW55IGRlZmF1bHRzIHNldFxuICAgKiBvbiBpbmRpdmlkdWFsIGNoaWxkcmVuIFRyYW5zaXRpb25zLlxuICAgKi9cbiAgZXhpdDogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIFlvdSBtYXkgbmVlZCB0byBhcHBseSByZWFjdGl2ZSB1cGRhdGVzIHRvIGEgY2hpbGQgYXMgaXQgaXMgZXhpdGluZy5cbiAgICogVGhpcyBpcyBnZW5lcmFsbHkgZG9uZSBieSB1c2luZyBgY2xvbmVFbGVtZW50YCBob3dldmVyIGluIHRoZSBjYXNlIG9mIGFuIGV4aXRpbmdcbiAgICogY2hpbGQgdGhlIGVsZW1lbnQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGFuZCBub3QgYWNjZXNzaWJsZSB0byB0aGUgY29uc3VtZXIuXG4gICAqXG4gICAqIElmIHlvdSBkbyBuZWVkIHRvIHVwZGF0ZSBhIGNoaWxkIGFzIGl0IGxlYXZlcyB5b3UgY2FuIHByb3ZpZGUgYSBgY2hpbGRGYWN0b3J5YFxuICAgKiB0byB3cmFwIGV2ZXJ5IGNoaWxkLCBldmVuIHRoZSBvbmVzIHRoYXQgYXJlIGxlYXZpbmcuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKGNoaWxkOiBSZWFjdEVsZW1lbnQpIC0+IFJlYWN0RWxlbWVudFxuICAgKi9cbiAgY2hpbGRGYWN0b3J5OiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuY1xufSA6IHt9O1xuVHJhbnNpdGlvbkdyb3VwLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxudmFyIF9kZWZhdWx0ID0gKDAsIF9yZWFjdExpZmVjeWNsZXNDb21wYXQucG9seWZpbGwpKFRyYW5zaXRpb25Hcm91cCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbkdyb3VwLmpzXG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanNcbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiaW1wb3J0IEJvb3RzdHJhcFRhYmxlIGZyb20gJy4vc3JjL2Jvb3RzdHJhcC10YWJsZSc7XG5pbXBvcnQgd2l0aENvbnRleHQgZnJvbSAnLi9zcmMvY29udGV4dHMnO1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQ29udGV4dChCb290c3RyYXBUYWJsZSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL2luZGV4LmpzIiwiLyogZXNsaW50IGNhbWVsY2FzZTogMCAqL1xuLyogZXNsaW50IGFycm93LWJvZHktc3R5bGU6IDAgKi9cblxuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY3MgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBIZWFkZXIgZnJvbSAnLi9oZWFkZXInO1xuaW1wb3J0IEZpbHRlcnMgZnJvbSAnLi9maWx0ZXJzJztcbmltcG9ydCBDYXB0aW9uIGZyb20gJy4vY2FwdGlvbic7XG5pbXBvcnQgQm9keSBmcm9tICcuL2JvZHknO1xuaW1wb3J0IEZvb3RlciBmcm9tICcuL2Zvb3Rlcic7XG5pbXBvcnQgUHJvcHNCYXNlUmVzb2x2ZXIgZnJvbSAnLi9wcm9wcy1yZXNvbHZlcic7XG5pbXBvcnQgQ29uc3QgZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQgXyBmcm9tICcuL3V0aWxzJztcblxuY2xhc3MgQm9vdHN0cmFwVGFibGUgZXh0ZW5kcyBQcm9wc0Jhc2VSZXNvbHZlcihDb21wb25lbnQpIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKCk7XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLm9uRGF0YVNpemVDaGFuZ2UgJiYgIW5leHRQcm9wcy5wYWdpbmF0aW9uKSB7XG4gICAgICBpZiAobmV4dFByb3BzLmRhdGEubGVuZ3RoICE9PSB0aGlzLnByb3BzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIG5leHRQcm9wcy5vbkRhdGFTaXplQ2hhbmdlKHsgZGF0YVNpemU6IG5leHRQcm9wcy5kYXRhLmxlbmd0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBFeHBvc2VkIEFQSXNcbiAgZ2V0RGF0YSA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cygpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgbG9hZGluZywgb3ZlcmxheSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgY29uc3QgTG9hZGluZ092ZXJsYXkgPSBvdmVybGF5KGxvYWRpbmcpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPExvYWRpbmdPdmVybGF5PlxuICAgICAgICAgIHsgdGhpcy5yZW5kZXJUYWJsZSgpIH1cbiAgICAgICAgPC9Mb2FkaW5nT3ZlcmxheT5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlclRhYmxlKCk7XG4gIH1cblxuICByZW5kZXJUYWJsZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb2x1bW5zLFxuICAgICAga2V5RmllbGQsXG4gICAgICB0YWJJbmRleENlbGwsXG4gICAgICBpZCxcbiAgICAgIGNsYXNzZXMsXG4gICAgICBib290c3RyYXA0LFxuICAgICAgc3RyaXBlZCxcbiAgICAgIGhvdmVyLFxuICAgICAgYm9yZGVyZWQsXG4gICAgICBjb25kZW5zZWQsXG4gICAgICBub0RhdGFJbmRpY2F0aW9uLFxuICAgICAgY2FwdGlvbixcbiAgICAgIHJvd1N0eWxlLFxuICAgICAgcm93Q2xhc3NlcyxcbiAgICAgIHdyYXBwZXJDbGFzc2VzLFxuICAgICAgcm93RXZlbnRzLFxuICAgICAgc2VsZWN0Um93LFxuICAgICAgZXhwYW5kUm93LFxuICAgICAgY2VsbEVkaXQsXG4gICAgICBmaWx0ZXJQb3NpdGlvblxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgdGFibGVXcmFwcGVyQ2xhc3MgPSBjcygncmVhY3QtYm9vdHN0cmFwLXRhYmxlJywgd3JhcHBlckNsYXNzZXMpO1xuXG4gICAgY29uc3QgdGFibGVDbGFzcyA9IGNzKCd0YWJsZScsIHtcbiAgICAgICd0YWJsZS1zdHJpcGVkJzogc3RyaXBlZCxcbiAgICAgICd0YWJsZS1ob3Zlcic6IGhvdmVyLFxuICAgICAgJ3RhYmxlLWJvcmRlcmVkJzogYm9yZGVyZWQsXG4gICAgICBbYm9vdHN0cmFwNCA/ICd0YWJsZS1zbScgOiAndGFibGUtY29uZGVuc2VkJ106IGNvbmRlbnNlZFxuICAgIH0sIGNsYXNzZXMpO1xuXG4gICAgY29uc3QgaGFzRmlsdGVycyA9IGNvbHVtbnMuc29tZShjb2wgPT4gY29sLmZpbHRlciB8fCBjb2wuZmlsdGVyUmVuZGVyZXIpO1xuXG4gICAgY29uc3QgaGFzRm9vdGVyID0gXy5maWx0ZXIoY29sdW1ucywgY29sID0+IF8uaGFzKGNvbCwgJ2Zvb3RlcicpKS5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgdGFibGVDYXB0aW9uID0gKFxuICAgICAgY2FwdGlvbiAmJiA8Q2FwdGlvbiBib290c3RyYXA0PXsgYm9vdHN0cmFwNCB9PnsgY2FwdGlvbiB9PC9DYXB0aW9uPlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9eyB0YWJsZVdyYXBwZXJDbGFzcyB9PlxuICAgICAgICA8dGFibGUgaWQ9eyBpZCB9IGNsYXNzTmFtZT17IHRhYmxlQ2xhc3MgfT5cbiAgICAgICAgICB7IHRhYmxlQ2FwdGlvbiB9XG4gICAgICAgICAgPEhlYWRlclxuICAgICAgICAgICAgY29sdW1ucz17IGNvbHVtbnMgfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXsgdGhpcy5wcm9wcy5oZWFkZXJDbGFzc2VzIH1cbiAgICAgICAgICAgIHdyYXBwZXJDbGFzc2VzPXsgdGhpcy5wcm9wcy5oZWFkZXJXcmFwcGVyQ2xhc3NlcyB9XG4gICAgICAgICAgICBzb3J0RmllbGQ9eyB0aGlzLnByb3BzLnNvcnRGaWVsZCB9XG4gICAgICAgICAgICBzb3J0T3JkZXI9eyB0aGlzLnByb3BzLnNvcnRPcmRlciB9XG4gICAgICAgICAgICBvblNvcnQ9eyB0aGlzLnByb3BzLm9uU29ydCB9XG4gICAgICAgICAgICBnbG9iYWxTb3J0Q2FyZXQ9eyB0aGlzLnByb3BzLnNvcnQgJiYgdGhpcy5wcm9wcy5zb3J0LnNvcnRDYXJldCB9XG4gICAgICAgICAgICBvbkZpbHRlcj17IHRoaXMucHJvcHMub25GaWx0ZXIgfVxuICAgICAgICAgICAgY3VyckZpbHRlcnM9eyB0aGlzLnByb3BzLmN1cnJGaWx0ZXJzIH1cbiAgICAgICAgICAgIG9uRXh0ZXJuYWxGaWx0ZXI9eyB0aGlzLnByb3BzLm9uRXh0ZXJuYWxGaWx0ZXIgfVxuICAgICAgICAgICAgc2VsZWN0Um93PXsgc2VsZWN0Um93IH1cbiAgICAgICAgICAgIGV4cGFuZFJvdz17IGV4cGFuZFJvdyB9XG4gICAgICAgICAgICBmaWx0ZXJQb3NpdGlvbj17IGZpbHRlclBvc2l0aW9uIH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtoYXNGaWx0ZXJzICYmIGZpbHRlclBvc2l0aW9uICE9PSBDb25zdC5GSUxURVJTX1BPU0lUSU9OX0lOTElORSAmJiAoXG4gICAgICAgICAgICA8RmlsdGVyc1xuICAgICAgICAgICAgICBjb2x1bW5zPXsgY29sdW1ucyB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17IHRoaXMucHJvcHMuZmlsdGVyc0NsYXNzZXMgfVxuICAgICAgICAgICAgICBvblNvcnQ9eyB0aGlzLnByb3BzLm9uU29ydCB9XG4gICAgICAgICAgICAgIG9uRmlsdGVyPXsgdGhpcy5wcm9wcy5vbkZpbHRlciB9XG4gICAgICAgICAgICAgIGN1cnJGaWx0ZXJzPXsgdGhpcy5wcm9wcy5jdXJyRmlsdGVycyB9XG4gICAgICAgICAgICAgIGZpbHRlclBvc2l0aW9uPXsgdGhpcy5wcm9wcy5maWx0ZXJQb3NpdGlvbiB9XG4gICAgICAgICAgICAgIG9uRXh0ZXJuYWxGaWx0ZXI9eyB0aGlzLnByb3BzLm9uRXh0ZXJuYWxGaWx0ZXIgfVxuICAgICAgICAgICAgICBzZWxlY3RSb3c9eyBzZWxlY3RSb3cgfVxuICAgICAgICAgICAgICBleHBhbmRSb3c9eyBleHBhbmRSb3cgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxCb2R5XG4gICAgICAgICAgICBjbGFzc05hbWU9eyB0aGlzLnByb3BzLmJvZHlDbGFzc2VzIH1cbiAgICAgICAgICAgIGRhdGE9eyB0aGlzLmdldERhdGEoKSB9XG4gICAgICAgICAgICBrZXlGaWVsZD17IGtleUZpZWxkIH1cbiAgICAgICAgICAgIHRhYkluZGV4Q2VsbD17IHRhYkluZGV4Q2VsbCB9XG4gICAgICAgICAgICBjb2x1bW5zPXsgY29sdW1ucyB9XG4gICAgICAgICAgICBpc0VtcHR5PXsgdGhpcy5pc0VtcHR5KCkgfVxuICAgICAgICAgICAgdmlzaWJsZUNvbHVtblNpemU9eyB0aGlzLnZpc2libGVDb2x1bW5TaXplKCkgfVxuICAgICAgICAgICAgbm9EYXRhSW5kaWNhdGlvbj17IG5vRGF0YUluZGljYXRpb24gfVxuICAgICAgICAgICAgY2VsbEVkaXQ9eyBjZWxsRWRpdCB9XG4gICAgICAgICAgICBzZWxlY3RSb3c9eyBzZWxlY3RSb3cgfVxuICAgICAgICAgICAgZXhwYW5kUm93PXsgZXhwYW5kUm93IH1cbiAgICAgICAgICAgIHJvd1N0eWxlPXsgcm93U3R5bGUgfVxuICAgICAgICAgICAgcm93Q2xhc3Nlcz17IHJvd0NsYXNzZXMgfVxuICAgICAgICAgICAgcm93RXZlbnRzPXsgcm93RXZlbnRzIH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtoYXNGb290ZXIgJiYgKFxuICAgICAgICAgICAgPEZvb3RlclxuICAgICAgICAgICAgICBkYXRhPXsgdGhpcy5nZXREYXRhKCkgfVxuICAgICAgICAgICAgICBjb2x1bW5zPXsgY29sdW1ucyB9XG4gICAgICAgICAgICAgIHNlbGVjdFJvdz17IHNlbGVjdFJvdyB9XG4gICAgICAgICAgICAgIGV4cGFuZFJvdz17IGV4cGFuZFJvdyB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17IHRoaXMucHJvcHMuZm9vdGVyQ2xhc3NlcyB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbkJvb3RzdHJhcFRhYmxlLnByb3BUeXBlcyA9IHtcbiAga2V5RmllbGQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZGF0YTogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGNvbHVtbnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICBib290c3RyYXA0OiBQcm9wVHlwZXMuYm9vbCxcbiAgcmVtb3RlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBwYWdpbmF0aW9uOiBQcm9wVHlwZXMuYm9vbFxuICB9KV0pLFxuICBub0RhdGFJbmRpY2F0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgc3RyaXBlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGJvcmRlcmVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgaG92ZXI6IFByb3BUeXBlcy5ib29sLFxuICB0YWJJbmRleENlbGw6IFByb3BUeXBlcy5ib29sLFxuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xhc3NlczogUHJvcFR5cGVzLnN0cmluZyxcbiAgaGVhZGVyQ2xhc3NlczogUHJvcFR5cGVzLnN0cmluZyxcbiAgYm9keUNsYXNzZXM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHdyYXBwZXJDbGFzc2VzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBoZWFkZXJXcmFwcGVyQ2xhc3NlczogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29uZGVuc2VkOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2FwdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm5vZGUsXG4gICAgUHJvcFR5cGVzLnN0cmluZ1xuICBdKSxcbiAgcGFnaW5hdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgZmlsdGVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjZWxsRWRpdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgc2VsZWN0Um93OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIG1vZGU6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICBDb25zdC5ST1dfU0VMRUNUX1NJTkdMRSxcbiAgICAgIENvbnN0LlJPV19TRUxFQ1RfTVVMVElQTEUsXG4gICAgICBDb25zdC5ST1dfU0VMRUNUX0RJU0FCTEVEXG4gICAgXSkuaXNSZXF1aXJlZCxcbiAgICBjbGlja1RvU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjbGlja1RvRXhwYW5kOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjbGlja1RvRWRpdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaGlkZVNlbGVjdEFsbDogUHJvcFR5cGVzLmJvb2wsXG4gICAgb25TZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uU2VsZWN0QWxsOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBjbGFzc2VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIG5vblNlbGVjdGFibGU6IFByb3BUeXBlcy5hcnJheSxcbiAgICBub25TZWxlY3RhYmxlU3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgbm9uU2VsZWN0YWJsZUNsYXNzZXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgYmdDb2xvcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBoaWRlU2VsZWN0Q29sdW1uOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzZWxlY3Rpb25SZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2VsZWN0aW9uSGVhZGVyUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGhlYWRlckNvbHVtblN0eWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHNlbGVjdENvbHVtblN0eWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHNlbGVjdENvbHVtblBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgQ29uc3QuSU5ESUNBVE9SX1BPU0lUSU9OX0xFRlQsXG4gICAgICBDb25zdC5JTkRJQ0FUT1JfUE9TSVRJT05fUklHSFRcbiAgICBdKVxuICB9KSxcbiAgZXhwYW5kUm93OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBleHBhbmRlZDogUHJvcFR5cGVzLmFycmF5LFxuICAgIG9uRXhwYW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbkV4cGFuZEFsbDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgbm9uRXhwYW5kYWJsZTogUHJvcFR5cGVzLmFycmF5LFxuICAgIHNob3dFeHBhbmRDb2x1bW46IFByb3BUeXBlcy5ib29sLFxuICAgIG9ubHlPbmVFeHBhbmRpbmc6IFByb3BUeXBlcy5ib29sLFxuICAgIGV4cGFuZEJ5Q29sdW1uT25seTogUHJvcFR5cGVzLmJvb2wsXG4gICAgZXhwYW5kQ29sdW1uUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGV4cGFuZEhlYWRlckNvbHVtblJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBleHBhbmRDb2x1bW5Qb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgIENvbnN0LklORElDQVRPUl9QT1NJVElPTl9MRUZULFxuICAgICAgQ29uc3QuSU5ESUNBVE9SX1BPU0lUSU9OX1JJR0hUXG4gICAgXSksXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHBhcmVudENsYXNzTmFtZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKVxuICB9KSxcbiAgcm93U3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSksXG4gIHJvd0V2ZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgcm93Q2xhc3NlczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgZmlsdGVyc0NsYXNzZXM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGZpbHRlclBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YoW1xuICAgIENvbnN0LkZJTFRFUlNfUE9TSVRJT05fVE9QLFxuICAgIENvbnN0LkZJTFRFUlNfUE9TSVRJT05fSU5MSU5FLFxuICAgIENvbnN0LkZJTFRFUlNfUE9TSVRJT05fQk9UVE9NXG4gIF0pLFxuICBmb290ZXJDbGFzc2VzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkZWZhdWx0U29ydGVkOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGRhdGFGaWVsZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIG9yZGVyOiBQcm9wVHlwZXMub25lT2YoW0NvbnN0LlNPUlRfREVTQywgQ29uc3QuU09SVF9BU0NdKS5pc1JlcXVpcmVkXG4gIH0pKSxcbiAgc29ydDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBkYXRhRmllbGQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgb3JkZXI6IFByb3BUeXBlcy5vbmVPZihbQ29uc3QuU09SVF9ERVNDLCBDb25zdC5TT1JUX0FTQ10pLFxuICAgIHNvcnRGdW5jOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzb3J0Q2FyZXQ6IFByb3BUeXBlcy5mdW5jXG4gIH0pLFxuICBkZWZhdWx0U29ydERpcmVjdGlvbjogUHJvcFR5cGVzLm9uZU9mKFtDb25zdC5TT1JUX0RFU0MsIENvbnN0LlNPUlRfQVNDXSksXG4gIG92ZXJsYXk6IFByb3BUeXBlcy5mdW5jLFxuICBvblRhYmxlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Tb3J0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25GaWx0ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBvbkV4dGVybmFsRmlsdGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25EYXRhU2l6ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8vIEluamVjdCBmcm9tIHRvb2xraXRcbiAgc2VhcmNoOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHNlYXJjaFRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgc2VhcmNoQ29udGV4dDogUHJvcFR5cGVzLmZ1bmNcbiAgfSksXG4gIHNldERlcGVuZGVuY3lNb2R1bGVzOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuQm9vdHN0cmFwVGFibGUuZGVmYXVsdFByb3BzID0ge1xuICBib290c3RyYXA0OiBmYWxzZSxcbiAgcmVtb3RlOiBmYWxzZSxcbiAgc3RyaXBlZDogZmFsc2UsXG4gIGJvcmRlcmVkOiB0cnVlLFxuICBob3ZlcjogZmFsc2UsXG4gIGNvbmRlbnNlZDogZmFsc2UsXG4gIG5vRGF0YUluZGljYXRpb246IG51bGwsXG4gIHNlbGVjdFJvdzoge1xuICAgIG1vZGU6IENvbnN0LlJPV19TRUxFQ1RfRElTQUJMRUQsXG4gICAgc2VsZWN0ZWQ6IFtdLFxuICAgIGhpZGVTZWxlY3RDb2x1bW46IHRydWVcbiAgfSxcbiAgZXhwYW5kUm93OiB7XG4gICAgcmVuZGVyZXI6IHVuZGVmaW5lZCxcbiAgICBleHBhbmRlZDogW10sXG4gICAgbm9uRXhwYW5kYWJsZTogW11cbiAgfSxcbiAgY2VsbEVkaXQ6IHtcbiAgICBtb2RlOiBudWxsLFxuICAgIG5vbkVkaXRhYmxlUm93czogW11cbiAgfSxcbiAgZmlsdGVyUG9zaXRpb246IENvbnN0LkZJTFRFUlNfUE9TSVRJT05fSU5MSU5FXG59O1xuXG5leHBvcnQgZGVmYXVsdCBCb290c3RyYXBUYWJsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2Jvb3RzdHJhcC10YWJsZS5qcyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge31cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQoKSB7fVxuZW1wdHlGdW5jdGlvbldpdGhSZXNldC5yZXNldFdhcm5pbmdDYWNoZSA9IGVtcHR5RnVuY3Rpb247XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIHNoaW0ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICBpZiAoc2VjcmV0ID09PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgLy8gSXQgaXMgc3RpbGwgc2FmZSB3aGVuIGNhbGxlZCBmcm9tIFJlYWN0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgJ1VzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgKTtcbiAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB0aHJvdyBlcnI7XG4gIH07XG4gIHNoaW0uaXNSZXF1aXJlZCA9IHNoaW07XG4gIGZ1bmN0aW9uIGdldFNoaW0oKSB7XG4gICAgcmV0dXJuIHNoaW07XG4gIH07XG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBlbGVtZW50VHlwZTogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltLFxuICAgIGV4YWN0OiBnZXRTaGltLFxuXG4gICAgY2hlY2tQcm9wVHlwZXM6IGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQsXG4gICAgcmVzZXRXYXJuaW5nQ2FjaGU6IGVtcHR5RnVuY3Rpb25cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanNcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiLyogZXNsaW50IHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wczogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBIZWFkZXJDZWxsIGZyb20gJy4vaGVhZGVyLWNlbGwnO1xuaW1wb3J0IFNlbGVjdGlvbkhlYWRlckNlbGwgZnJvbSAnLi9yb3ctc2VsZWN0aW9uL3NlbGVjdGlvbi1oZWFkZXItY2VsbCc7XG5pbXBvcnQgRXhwYW5kSGVhZGVyQ2VsbCBmcm9tICcuL3Jvdy1leHBhbmQvZXhwYW5kLWhlYWRlci1jZWxsJztcbmltcG9ydCB3aXRoSGVhZGVyU2VsZWN0aW9uIGZyb20gJy4vcm93LXNlbGVjdGlvbi9zZWxlY3Rpb24taGVhZGVyLWNlbGwtY29uc3VtZXInO1xuaW1wb3J0IHdpdGhIZWFkZXJFeHBhbnNpb24gZnJvbSAnLi9yb3ctZXhwYW5kL2V4cGFuZC1oZWFkZXItY2VsbC1jb25zdW1lcic7XG5pbXBvcnQgQ29uc3QgZnJvbSAnLi9jb25zdCc7XG5cbmNvbnN0IEhlYWRlciA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIGNvbHVtbnMsXG4gICAgb25Tb3J0LFxuICAgIG9uRmlsdGVyLFxuICAgIHNvcnRGaWVsZCxcbiAgICBzb3J0T3JkZXIsXG4gICAgc2VsZWN0Um93LFxuICAgIGV4cGFuZFJvdyxcbiAgICBjdXJyRmlsdGVycyxcbiAgICBvbkV4dGVybmFsRmlsdGVyLFxuICAgIGZpbHRlclBvc2l0aW9uLFxuICAgIGdsb2JhbFNvcnRDYXJldCxcbiAgICB3cmFwcGVyQ2xhc3Nlc1xuICB9ID0gcHJvcHM7XG5cbiAgbGV0IFNlbGVjdGlvbkhlYWRlckNlbGxDb21wID0gKCkgPT4gbnVsbDtcbiAgbGV0IEV4cGFuc2lvbkhlYWRlckNlbGxDb21wID0gKCkgPT4gbnVsbDtcblxuICBpZiAoZXhwYW5kUm93LnNob3dFeHBhbmRDb2x1bW4pIHtcbiAgICBFeHBhbnNpb25IZWFkZXJDZWxsQ29tcCA9IHdpdGhIZWFkZXJFeHBhbnNpb24oRXhwYW5kSGVhZGVyQ2VsbCk7XG4gIH1cblxuICBpZiAoc2VsZWN0Um93KSB7XG4gICAgU2VsZWN0aW9uSGVhZGVyQ2VsbENvbXAgPSB3aXRoSGVhZGVyU2VsZWN0aW9uKFNlbGVjdGlvbkhlYWRlckNlbGwpO1xuICB9XG5cbiAgY29uc3QgaXNSZW5kZXJGdW5jdGlvbkNvbHVtbkluTGVmdCA9IChcbiAgICBwb3NpdGlvbiA9IENvbnN0LklORElDQVRPUl9QT1NJVElPTl9MRUZUXG4gICkgPT4gcG9zaXRpb24gPT09IENvbnN0LklORElDQVRPUl9QT1NJVElPTl9MRUZUO1xuXG4gIGNvbnN0IGNoaWxkcmVucyA9IFtcbiAgICBjb2x1bW5zLm1hcCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICBjb25zdCBjdXJyU29ydCA9IGNvbHVtbi5kYXRhRmllbGQgPT09IHNvcnRGaWVsZDtcbiAgICAgIGNvbnN0IGlzTGFzdFNvcnRpbmcgPSBjb2x1bW4uZGF0YUZpZWxkID09PSBzb3J0RmllbGQ7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxIZWFkZXJDZWxsXG4gICAgICAgICAgaW5kZXg9eyBpIH1cbiAgICAgICAgICBrZXk9eyBjb2x1bW4uZGF0YUZpZWxkIH1cbiAgICAgICAgICBjb2x1bW49eyBjb2x1bW4gfVxuICAgICAgICAgIG9uU29ydD17IG9uU29ydCB9XG4gICAgICAgICAgc29ydGluZz17IGN1cnJTb3J0IH1cbiAgICAgICAgICBzb3J0T3JkZXI9eyBzb3J0T3JkZXIgfVxuICAgICAgICAgIGdsb2JhbFNvcnRDYXJldD17IGdsb2JhbFNvcnRDYXJldCB9XG4gICAgICAgICAgaXNMYXN0U29ydGluZz17IGlzTGFzdFNvcnRpbmcgfVxuICAgICAgICAgIG9uRmlsdGVyPXsgb25GaWx0ZXIgfVxuICAgICAgICAgIGN1cnJGaWx0ZXJzPXsgY3VyckZpbHRlcnMgfVxuICAgICAgICAgIG9uRXh0ZXJuYWxGaWx0ZXI9eyBvbkV4dGVybmFsRmlsdGVyIH1cbiAgICAgICAgICBmaWx0ZXJQb3NpdGlvbj17IGZpbHRlclBvc2l0aW9uIH1cbiAgICAgICAgLz4pO1xuICAgIH0pXG4gIF07XG5cbiAgaWYgKCFzZWxlY3RSb3cuaGlkZVNlbGVjdENvbHVtbikge1xuICAgIGlmIChpc1JlbmRlckZ1bmN0aW9uQ29sdW1uSW5MZWZ0KHNlbGVjdFJvdy5zZWxlY3RDb2x1bW5Qb3NpdGlvbikpIHtcbiAgICAgIGNoaWxkcmVucy51bnNoaWZ0KDxTZWxlY3Rpb25IZWFkZXJDZWxsQ29tcCBrZXk9XCJzZWxlY3Rpb25cIiAvPik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVucy5wdXNoKDxTZWxlY3Rpb25IZWFkZXJDZWxsQ29tcCBrZXk9XCJzZWxlY3Rpb25cIiAvPik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4cGFuZFJvdy5zaG93RXhwYW5kQ29sdW1uKSB7XG4gICAgaWYgKGlzUmVuZGVyRnVuY3Rpb25Db2x1bW5JbkxlZnQoZXhwYW5kUm93LmV4cGFuZENvbHVtblBvc2l0aW9uKSkge1xuICAgICAgY2hpbGRyZW5zLnVuc2hpZnQoPEV4cGFuc2lvbkhlYWRlckNlbGxDb21wIGtleT1cImV4cGFuc2lvblwiIC8+KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5zLnB1c2goPEV4cGFuc2lvbkhlYWRlckNlbGxDb21wIGtleT1cImV4cGFuc2lvblwiIC8+KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDx0aGVhZCBjbGFzc05hbWU9eyB3cmFwcGVyQ2xhc3NlcyB9PlxuICAgICAgPHRyIGNsYXNzTmFtZT17IGNsYXNzTmFtZSB9PlxuICAgICAgICB7IGNoaWxkcmVucyB9XG4gICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICk7XG59O1xuXG5IZWFkZXIucHJvcFR5cGVzID0ge1xuICBjb2x1bW5zOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgb25Tb3J0OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25GaWx0ZXI6IFByb3BUeXBlcy5mdW5jLFxuICBzb3J0RmllbGQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNvcnRPcmRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgc2VsZWN0Um93OiBQcm9wVHlwZXMub2JqZWN0LFxuICBjdXJyRmlsdGVyczogUHJvcFR5cGVzLm9iamVjdCxcbiAgb25FeHRlcm5hbEZpbHRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIGdsb2JhbFNvcnRDYXJldDogUHJvcFR5cGVzLmZ1bmMsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgd3JhcHBlckNsYXNzZXM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGV4cGFuZFJvdzogUHJvcFR5cGVzLm9iamVjdCxcbiAgZmlsdGVyUG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9UT1AsXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9JTkxJTkUsXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9CT1RUT01cbiAgXSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2hlYWRlci5qcyIsIi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3MgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgQ29uc3QgZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQgU29ydFN5bWJvbCBmcm9tICcuL3NvcnQvc3ltYm9sJztcbmltcG9ydCBTb3J0Q2FyZXQgZnJvbSAnLi9zb3J0L2NhcmV0JztcbmltcG9ydCBfIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGV2ZW50RGVsZWdhdGVyIGZyb20gJy4vY2VsbC1ldmVudC1kZWxlZ2F0ZXInO1xuXG5cbmNsYXNzIEhlYWRlckNlbGwgZXh0ZW5kcyBldmVudERlbGVnYXRlcihSZWFjdC5Db21wb25lbnQpIHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGluZGV4LFxuICAgICAgb25Tb3J0LFxuICAgICAgc29ydGluZyxcbiAgICAgIHNvcnRPcmRlcixcbiAgICAgIGlzTGFzdFNvcnRpbmcsXG4gICAgICBvbkZpbHRlcixcbiAgICAgIGN1cnJGaWx0ZXJzLFxuICAgICAgZmlsdGVyUG9zaXRpb24sXG4gICAgICBvbkV4dGVybmFsRmlsdGVyLFxuICAgICAgZ2xvYmFsU29ydENhcmV0XG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCB7XG4gICAgICB0ZXh0LFxuICAgICAgc29ydCxcbiAgICAgIHNvcnRDYXJldCxcbiAgICAgIGZpbHRlcixcbiAgICAgIGZpbHRlclJlbmRlcmVyLFxuICAgICAgaGVhZGVyVGl0bGUsXG4gICAgICBoZWFkZXJBbGlnbixcbiAgICAgIGhlYWRlckZvcm1hdHRlcixcbiAgICAgIGhlYWRlckV2ZW50cyxcbiAgICAgIGhlYWRlckNsYXNzZXMsXG4gICAgICBoZWFkZXJTdHlsZSxcbiAgICAgIGhlYWRlckF0dHJzLFxuICAgICAgaGVhZGVyU29ydGluZ0NsYXNzZXMsXG4gICAgICBoZWFkZXJTb3J0aW5nU3R5bGVcbiAgICB9ID0gY29sdW1uO1xuXG4gICAgY29uc3Qgc29ydENhcmV0ZnVuYyA9IHNvcnRDYXJldCB8fCBnbG9iYWxTb3J0Q2FyZXQ7XG5cbiAgICBjb25zdCBkZWxlZ2F0ZUV2ZW50cyA9IHRoaXMuZGVsZWdhdGUoaGVhZGVyRXZlbnRzKTtcblxuICAgIGNvbnN0IGN1c3RvbUF0dHJzID0gXy5pc0Z1bmN0aW9uKGhlYWRlckF0dHJzKVxuICAgICAgPyBoZWFkZXJBdHRycyhjb2x1bW4sIGluZGV4KVxuICAgICAgOiAoaGVhZGVyQXR0cnMgfHwge30pO1xuXG4gICAgY29uc3QgY2VsbEF0dHJzID0ge1xuICAgICAgLi4uY3VzdG9tQXR0cnMsXG4gICAgICAuLi5kZWxlZ2F0ZUV2ZW50cyxcbiAgICAgIHRhYkluZGV4OiBfLmlzRGVmaW5lZChjdXN0b21BdHRycy50YWJJbmRleCkgPyBjdXN0b21BdHRycy50YWJJbmRleCA6IDBcbiAgICB9O1xuXG4gICAgbGV0IHNvcnRTeW1ib2w7XG4gICAgbGV0IGZpbHRlckVsbTtcbiAgICBsZXQgY2VsbFN0eWxlID0ge307XG4gICAgbGV0IGNlbGxDbGFzc2VzID0gXy5pc0Z1bmN0aW9uKGhlYWRlckNsYXNzZXMpID8gaGVhZGVyQ2xhc3Nlcyhjb2x1bW4sIGluZGV4KSA6IGhlYWRlckNsYXNzZXM7XG5cbiAgICBpZiAoaGVhZGVyU3R5bGUpIHtcbiAgICAgIGNlbGxTdHlsZSA9IF8uaXNGdW5jdGlvbihoZWFkZXJTdHlsZSkgPyBoZWFkZXJTdHlsZShjb2x1bW4sIGluZGV4KSA6IGhlYWRlclN0eWxlO1xuICAgICAgY2VsbFN0eWxlID0gY2VsbFN0eWxlID8geyAuLi5jZWxsU3R5bGUgfSA6IGNlbGxTdHlsZTtcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyVGl0bGUpIHtcbiAgICAgIGNlbGxBdHRycy50aXRsZSA9IF8uaXNGdW5jdGlvbihoZWFkZXJUaXRsZSkgPyBoZWFkZXJUaXRsZShjb2x1bW4sIGluZGV4KSA6IHRleHQ7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlckFsaWduKSB7XG4gICAgICBjZWxsU3R5bGUudGV4dEFsaWduID0gXy5pc0Z1bmN0aW9uKGhlYWRlckFsaWduKSA/IGhlYWRlckFsaWduKGNvbHVtbiwgaW5kZXgpIDogaGVhZGVyQWxpZ247XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIGNvbnN0IGN1c3RvbUNsaWNrID0gY2VsbEF0dHJzLm9uQ2xpY2s7XG4gICAgICBjZWxsQXR0cnNbJ2FyaWEtbGFiZWwnXSA9IHNvcnRpbmcgPyBgJHt0ZXh0fSBzb3J0ICR7c29ydE9yZGVyfWAgOiBgJHt0ZXh0fSBzb3J0YWJsZWA7XG4gICAgICBjZWxsQXR0cnMub25LZXlVcCA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgIG9uU29ydChjb2x1bW4pO1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24oY3VzdG9tQ2xpY2spKSBjdXN0b21DbGljayhlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNlbGxBdHRycy5vbkNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgb25Tb3J0KGNvbHVtbik7XG4gICAgICAgIGlmIChfLmlzRnVuY3Rpb24oY3VzdG9tQ2xpY2spKSBjdXN0b21DbGljayhlKTtcbiAgICAgIH07XG4gICAgICBjZWxsQXR0cnMuY2xhc3NOYW1lID0gY3MoY2VsbEF0dHJzLmNsYXNzTmFtZSwgJ3NvcnRhYmxlJyk7XG5cbiAgICAgIGlmIChzb3J0aW5nKSB7XG4gICAgICAgIHNvcnRTeW1ib2wgPSBzb3J0Q2FyZXRmdW5jID9cbiAgICAgICAgICBzb3J0Q2FyZXRmdW5jKHNvcnRPcmRlciwgY29sdW1uKSA6XG4gICAgICAgICAgPFNvcnRDYXJldCBvcmRlcj17IHNvcnRPcmRlciB9IC8+O1xuXG4gICAgICAgIC8vIGFwcGVuZCBjdXN0b21pemVkIGNsYXNzZXMgb3Igc3R5bGUgaWYgdGFibGUgd2FzIHNvcnRpbmcgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29sdW1uLlxuICAgICAgICBjZWxsQ2xhc3NlcyA9IGNzKFxuICAgICAgICAgIGNlbGxDbGFzc2VzLFxuICAgICAgICAgIF8uaXNGdW5jdGlvbihoZWFkZXJTb3J0aW5nQ2xhc3NlcylcbiAgICAgICAgICAgID8gaGVhZGVyU29ydGluZ0NsYXNzZXMoY29sdW1uLCBzb3J0T3JkZXIsIGlzTGFzdFNvcnRpbmcsIGluZGV4KVxuICAgICAgICAgICAgOiBoZWFkZXJTb3J0aW5nQ2xhc3Nlc1xuICAgICAgICApO1xuXG4gICAgICAgIGNlbGxTdHlsZSA9IHtcbiAgICAgICAgICAuLi5jZWxsU3R5bGUsXG4gICAgICAgICAgLi4uXy5pc0Z1bmN0aW9uKGhlYWRlclNvcnRpbmdTdHlsZSlcbiAgICAgICAgICAgID8gaGVhZGVyU29ydGluZ1N0eWxlKGNvbHVtbiwgc29ydE9yZGVyLCBpc0xhc3RTb3J0aW5nLCBpbmRleClcbiAgICAgICAgICAgIDogaGVhZGVyU29ydGluZ1N0eWxlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3J0U3ltYm9sID0gc29ydENhcmV0ZnVuYyA/IHNvcnRDYXJldGZ1bmModW5kZWZpbmVkLCBjb2x1bW4pIDogPFNvcnRTeW1ib2wgLz47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNlbGxDbGFzc2VzKSBjZWxsQXR0cnMuY2xhc3NOYW1lID0gY3MoY2VsbEF0dHJzLmNsYXNzTmFtZSwgY2VsbENsYXNzZXMpO1xuICAgIGlmICghXy5pc0VtcHR5T2JqZWN0KGNlbGxTdHlsZSkpIGNlbGxBdHRycy5zdHlsZSA9IGNlbGxTdHlsZTtcblxuICAgIGlmIChmaWx0ZXJQb3NpdGlvbiA9PT0gQ29uc3QuRklMVEVSU19QT1NJVElPTl9JTkxJTkUpIHtcbiAgICAgIGlmIChmaWx0ZXJSZW5kZXJlcikge1xuICAgICAgICBjb25zdCBvbkN1c3RvbUZpbHRlciA9IG9uRXh0ZXJuYWxGaWx0ZXIoY29sdW1uLCBmaWx0ZXIucHJvcHMudHlwZSk7XG4gICAgICAgIGZpbHRlckVsbSA9IGZpbHRlclJlbmRlcmVyKG9uQ3VzdG9tRmlsdGVyLCBjb2x1bW4pO1xuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyRWxtID0gKFxuICAgICAgICAgIDxmaWx0ZXIuRmlsdGVyXG4gICAgICAgICAgICB7IC4uLmZpbHRlci5wcm9wcyB9XG4gICAgICAgICAgICBmaWx0ZXJTdGF0ZT17IGN1cnJGaWx0ZXJzW2NvbHVtbi5kYXRhRmllbGRdIH1cbiAgICAgICAgICAgIG9uRmlsdGVyPXsgb25GaWx0ZXIgfVxuICAgICAgICAgICAgY29sdW1uPXsgY29sdW1uIH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gaGVhZGVyRm9ybWF0dGVyID9cbiAgICAgIGhlYWRlckZvcm1hdHRlcihjb2x1bW4sIGluZGV4LCB7IHNvcnRFbGVtZW50OiBzb3J0U3ltYm9sLCBmaWx0ZXJFbGVtZW50OiBmaWx0ZXJFbG0gfSkgOlxuICAgICAgdGV4dDtcblxuICAgIGlmIChoZWFkZXJGb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCd0aCcsIGNlbGxBdHRycywgY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCd0aCcsIGNlbGxBdHRycywgY2hpbGRyZW4sIHNvcnRTeW1ib2wsIGZpbHRlckVsbSk7XG4gIH1cbn1cblxuSGVhZGVyQ2VsbC5wcm9wVHlwZXMgPSB7XG4gIGNvbHVtbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBkYXRhRmllbGQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB0ZXh0OiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgIENvbnN0LlRZUEVfU1RSSU5HLFxuICAgICAgQ29uc3QuVFlQRV9OVU1CRVIsXG4gICAgICBDb25zdC5UWVBFX0JPT0xFQU4sXG4gICAgICBDb25zdC5UWVBFX0RBVEVcbiAgICBdKSxcbiAgICBpc0R1bW15RmllbGQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGhpZGRlbjogUHJvcFR5cGVzLmJvb2wsXG4gICAgaGVhZGVyRm9ybWF0dGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBmb3JtYXR0ZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGZvcm1hdEV4dHJhRGF0YTogUHJvcFR5cGVzLmFueSxcbiAgICBoZWFkZXJDbGFzc2VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGNsYXNzZXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgaGVhZGVyU3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgaGVhZGVyVGl0bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHRpdGxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBoZWFkZXJFdmVudHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXZlbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGhlYWRlckFsaWduOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGFsaWduOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGhlYWRlckF0dHJzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGF0dHJzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHNvcnQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHNvcnRGdW5jOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblNvcnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIGVkaXRvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBlZGl0YWJsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZWRpdENlbGxTdHlsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBlZGl0Q2VsbENsYXNzZXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZWRpdG9yU3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZWRpdG9yQ2xhc3NlczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBlZGl0b3JSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgdmFsaWRhdG9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBmaWx0ZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZmlsdGVyUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGZpbHRlclZhbHVlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzZWFyY2hhYmxlOiBQcm9wVHlwZXMuYm9vbFxuICB9KS5pc1JlcXVpcmVkLFxuICBpbmRleDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBvblNvcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBzb3J0aW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgc29ydE9yZGVyOiBQcm9wVHlwZXMub25lT2YoW0NvbnN0LlNPUlRfQVNDLCBDb25zdC5TT1JUX0RFU0NdKSxcbiAgc29ydENhcmV0OiBQcm9wVHlwZXMuZnVuYyxcbiAgaXNMYXN0U29ydGluZzogUHJvcFR5cGVzLmJvb2wsXG4gIG9uRmlsdGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgZmlsdGVyUG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbQ29uc3QuRklMVEVSU19QT1NJVElPTl9JTkxJTkUsXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9CT1RUT00sIENvbnN0LkZJTFRFUlNfUE9TSVRJT05fVE9QXSksXG4gIGN1cnJGaWx0ZXJzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkV4dGVybmFsRmlsdGVyOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSGVhZGVyQ2VsbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2hlYWRlci1jZWxsLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJvb3RzdHJhcENvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0cy9ib290c3RyYXAnO1xuXG5jb25zdCBTb3J0U3ltYm9sID0gKCkgPT4gKFxuICA8Qm9vdHN0cmFwQ29udGV4dC5Db25zdW1lcj5cbiAgICB7XG4gICAgICAoeyBib290c3RyYXA0IH0pID0+IChib290c3RyYXA0ID8gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJvcmRlci00XCIgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm9yZGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZHJvcGRvd25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNhcmV0XCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZHJvcHVwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjYXJldFwiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICApKVxuICAgIH1cbiAgPC9Cb290c3RyYXBDb250ZXh0LkNvbnN1bWVyPlxuKTtcblxuZXhwb3J0IGRlZmF1bHQgU29ydFN5bWJvbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3NvcnQvc3ltYm9sLmpzIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBDb25zdCBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBCb290c3RyYXBDb250ZXh0IH0gZnJvbSAnLi4vY29udGV4dHMvYm9vdHN0cmFwJztcblxuXG5jb25zdCBTb3J0Q2FyZXQgPSAoeyBvcmRlciB9KSA9PiB7XG4gIGNvbnN0IG9yZGVyQ2xhc3MgPSBjcygncmVhY3QtYm9vdHN0cmFwLXRhYmxlLXNvcnQtb3JkZXInLCB7XG4gICAgZHJvcHVwOiBvcmRlciA9PT0gQ29uc3QuU09SVF9BU0NcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Qm9vdHN0cmFwQ29udGV4dC5Db25zdW1lcj5cbiAgICAgIHtcbiAgICAgICAgKHsgYm9vdHN0cmFwNCB9KSA9PiAoYm9vdHN0cmFwNCA/IChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9eyBgY2FyZXQtNC0ke29yZGVyfWAgfSAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17IG9yZGVyQ2xhc3MgfT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNhcmV0XCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICkpXG4gICAgICB9XG4gICAgPC9Cb290c3RyYXBDb250ZXh0LkNvbnN1bWVyPlxuICApO1xufTtcblxuU29ydENhcmV0LnByb3BUeXBlcyA9IHtcbiAgb3JkZXI6IFByb3BUeXBlcy5vbmVPZihbQ29uc3QuU09SVF9BU0MsIENvbnN0LlNPUlRfREVTQ10pLmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNvcnRDYXJldDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3NvcnQvY2FyZXQuanMiLCIvLyAgICAgVW5kZXJzY29yZS5qcyAxLjkuMVxuLy8gICAgIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4vLyAgICAgKGMpIDIwMDktMjAxOCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuLy8gICAgIFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblxuICAvLyBCYXNlbGluZSBzZXR1cFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIChgc2VsZmApIGluIHRoZSBicm93c2VyLCBgZ2xvYmFsYFxuICAvLyBvbiB0aGUgc2VydmVyLCBvciBgdGhpc2AgaW4gc29tZSB2aXJ0dWFsIG1hY2hpbmVzLiBXZSB1c2UgYHNlbGZgXG4gIC8vIGluc3RlYWQgb2YgYHdpbmRvd2AgZm9yIGBXZWJXb3JrZXJgIHN1cHBvcnQuXG4gIHZhciByb290ID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmICYmIHNlbGYgfHxcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsLmdsb2JhbCA9PT0gZ2xvYmFsICYmIGdsb2JhbCB8fFxuICAgICAgICAgICAgdGhpcyB8fFxuICAgICAgICAgICAge307XG5cbiAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGBfYCB2YXJpYWJsZS5cbiAgdmFyIHByZXZpb3VzVW5kZXJzY29yZSA9IHJvb3QuXztcblxuICAvLyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOlxuICB2YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwgT2JqUHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgU3ltYm9sUHJvdG8gPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyA/IFN5bWJvbC5wcm90b3R5cGUgOiBudWxsO1xuXG4gIC8vIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFyaWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLlxuICB2YXIgcHVzaCA9IEFycmF5UHJvdG8ucHVzaCxcbiAgICAgIHNsaWNlID0gQXJyYXlQcm90by5zbGljZSxcbiAgICAgIHRvU3RyaW5nID0gT2JqUHJvdG8udG9TdHJpbmcsXG4gICAgICBoYXNPd25Qcm9wZXJ0eSA9IE9ialByb3RvLmhhc093blByb3BlcnR5O1xuXG4gIC8vIEFsbCAqKkVDTUFTY3JpcHQgNSoqIG5hdGl2ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZSBob3BlIHRvIHVzZVxuICAvLyBhcmUgZGVjbGFyZWQgaGVyZS5cbiAgdmFyIG5hdGl2ZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5LFxuICAgICAgbmF0aXZlS2V5cyA9IE9iamVjdC5rZXlzLFxuICAgICAgbmF0aXZlQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuICAvLyBOYWtlZCBmdW5jdGlvbiByZWZlcmVuY2UgZm9yIHN1cnJvZ2F0ZS1wcm90b3R5cGUtc3dhcHBpbmcuXG4gIHZhciBDdG9yID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZSBhIHNhZmUgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgdXNlIGJlbG93LlxuICB2YXIgXyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBfKSByZXR1cm4gb2JqO1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfKSkgcmV0dXJuIG5ldyBfKG9iaik7XG4gICAgdGhpcy5fd3JhcHBlZCA9IG9iajtcbiAgfTtcblxuICAvLyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKk5vZGUuanMqKiwgd2l0aFxuICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlaXIgb2xkIG1vZHVsZSBBUEkuIElmIHdlJ3JlIGluXG4gIC8vIHRoZSBicm93c2VyLCBhZGQgYF9gIGFzIGEgZ2xvYmFsIG9iamVjdC5cbiAgLy8gKGBub2RlVHlwZWAgaXMgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCBgbW9kdWxlYFxuICAvLyBhbmQgYGV4cG9ydHNgIGFyZSBub3QgSFRNTCBlbGVtZW50cy4pXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPSAndW5kZWZpbmVkJyAmJiAhZXhwb3J0cy5ub2RlVHlwZSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF87XG4gICAgfVxuICAgIGV4cG9ydHMuXyA9IF87XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fID0gXztcbiAgfVxuXG4gIC8vIEN1cnJlbnQgdmVyc2lvbi5cbiAgXy5WRVJTSU9OID0gJzEuOS4xJztcblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZWZmaWNpZW50IChmb3IgY3VycmVudCBlbmdpbmVzKSB2ZXJzaW9uXG4gIC8vIG9mIHRoZSBwYXNzZWQtaW4gY2FsbGJhY2ssIHRvIGJlIHJlcGVhdGVkbHkgYXBwbGllZCBpbiBvdGhlciBVbmRlcnNjb3JlXG4gIC8vIGZ1bmN0aW9ucy5cbiAgdmFyIG9wdGltaXplQ2IgPSBmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHJldHVybiBmdW5jO1xuICAgIHN3aXRjaCAoYXJnQ291bnQgPT0gbnVsbCA/IDMgOiBhcmdDb3VudCkge1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgLy8gVGhlIDItYXJndW1lbnQgY2FzZSBpcyBvbWl0dGVkIGJlY2F1c2Ugd2XigJlyZSBub3QgdXNpbmcgaXQuXG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgYnVpbHRpbkl0ZXJhdGVlO1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNhbGxiYWNrcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGVhY2hcbiAgLy8gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZGVzaXJlZCByZXN1bHQg4oCUIGVpdGhlciBgaWRlbnRpdHlgLFxuICAvLyBhbiBhcmJpdHJhcnkgY2FsbGJhY2ssIGEgcHJvcGVydHkgbWF0Y2hlciwgb3IgYSBwcm9wZXJ0eSBhY2Nlc3Nvci5cbiAgdmFyIGNiID0gZnVuY3Rpb24odmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKF8uaXRlcmF0ZWUgIT09IGJ1aWx0aW5JdGVyYXRlZSkgcmV0dXJuIF8uaXRlcmF0ZWUodmFsdWUsIGNvbnRleHQpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXy5pZGVudGl0eTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuIG9wdGltaXplQ2IodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KTtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkgJiYgIV8uaXNBcnJheSh2YWx1ZSkpIHJldHVybiBfLm1hdGNoZXIodmFsdWUpO1xuICAgIHJldHVybiBfLnByb3BlcnR5KHZhbHVlKTtcbiAgfTtcblxuICAvLyBFeHRlcm5hbCB3cmFwcGVyIGZvciBvdXIgY2FsbGJhY2sgZ2VuZXJhdG9yLiBVc2VycyBtYXkgY3VzdG9taXplXG4gIC8vIGBfLml0ZXJhdGVlYCBpZiB0aGV5IHdhbnQgYWRkaXRpb25hbCBwcmVkaWNhdGUvaXRlcmF0ZWUgc2hvcnRoYW5kIHN0eWxlcy5cbiAgLy8gVGhpcyBhYnN0cmFjdGlvbiBoaWRlcyB0aGUgaW50ZXJuYWwtb25seSBhcmdDb3VudCBhcmd1bWVudC5cbiAgXy5pdGVyYXRlZSA9IGJ1aWx0aW5JdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNiKHZhbHVlLCBjb250ZXh0LCBJbmZpbml0eSk7XG4gIH07XG5cbiAgLy8gU29tZSBmdW5jdGlvbnMgdGFrZSBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIG9yIGEgZmV3IGV4cGVjdGVkXG4gIC8vIGFyZ3VtZW50cyBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGVuIGEgdmFyaWFibGUgbnVtYmVyIG9mIHZhbHVlcyB0byBvcGVyYXRlXG4gIC8vIG9uLiBUaGlzIGhlbHBlciBhY2N1bXVsYXRlcyBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBwYXN0IHRoZSBmdW5jdGlvbuKAmXNcbiAgLy8gYXJndW1lbnQgbGVuZ3RoIChvciBhbiBleHBsaWNpdCBgc3RhcnRJbmRleGApLCBpbnRvIGFuIGFycmF5IHRoYXQgYmVjb21lc1xuICAvLyB0aGUgbGFzdCBhcmd1bWVudC4gU2ltaWxhciB0byBFUzbigJlzIFwicmVzdCBwYXJhbWV0ZXJcIi5cbiAgdmFyIHJlc3RBcmd1bWVudHMgPSBmdW5jdGlvbihmdW5jLCBzdGFydEluZGV4KSB7XG4gICAgc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggPT0gbnVsbCA/IGZ1bmMubGVuZ3RoIC0gMSA6ICtzdGFydEluZGV4O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChhcmd1bWVudHMubGVuZ3RoIC0gc3RhcnRJbmRleCwgMCksXG4gICAgICAgICAgcmVzdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3RbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4ICsgc3RhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIHJlc3QpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJndW1lbnRzWzBdLCByZXN0KTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdLCByZXN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gQXJyYXkoc3RhcnRJbmRleCArIDEpO1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3RhcnRJbmRleDsgaW5kZXgrKykge1xuICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICBhcmdzW3N0YXJ0SW5kZXhdID0gcmVzdDtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gYW5vdGhlci5cbiAgdmFyIGJhc2VDcmVhdGUgPSBmdW5jdGlvbihwcm90b3R5cGUpIHtcbiAgICBpZiAoIV8uaXNPYmplY3QocHJvdG90eXBlKSkgcmV0dXJuIHt9O1xuICAgIGlmIChuYXRpdmVDcmVhdGUpIHJldHVybiBuYXRpdmVDcmVhdGUocHJvdG90eXBlKTtcbiAgICBDdG9yLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEN0b3I7XG4gICAgQ3Rvci5wcm90b3R5cGUgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIHNoYWxsb3dQcm9wZXJ0eSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogPT0gbnVsbCA/IHZvaWQgMCA6IG9ialtrZXldO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhcyA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcGF0aCk7XG4gIH1cblxuICB2YXIgZGVlcEdldCA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgICBvYmogPSBvYmpbcGF0aFtpXV07XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGggPyBvYmogOiB2b2lkIDA7XG4gIH07XG5cbiAgLy8gSGVscGVyIGZvciBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2xsZWN0aW9uXG4gIC8vIHNob3VsZCBiZSBpdGVyYXRlZCBhcyBhbiBhcnJheSBvciBhcyBhbiBvYmplY3QuXG4gIC8vIFJlbGF0ZWQ6IGh0dHA6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoXG4gIC8vIEF2b2lkcyBhIHZlcnkgbmFzdHkgaU9TIDggSklUIGJ1ZyBvbiBBUk0tNjQuICMyMDk0XG4gIHZhciBNQVhfQVJSQVlfSU5ERVggPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuICB2YXIgZ2V0TGVuZ3RoID0gc2hhbGxvd1Byb3BlcnR5KCdsZW5ndGgnKTtcbiAgdmFyIGlzQXJyYXlMaWtlID0gZnVuY3Rpb24oY29sbGVjdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgJiYgbGVuZ3RoID49IDAgJiYgbGVuZ3RoIDw9IE1BWF9BUlJBWV9JTkRFWDtcbiAgfTtcblxuICAvLyBDb2xsZWN0aW9uIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFRoZSBjb3JuZXJzdG9uZSwgYW4gYGVhY2hgIGltcGxlbWVudGF0aW9uLCBha2EgYGZvckVhY2hgLlxuICAvLyBIYW5kbGVzIHJhdyBvYmplY3RzIGluIGFkZGl0aW9uIHRvIGFycmF5LWxpa2VzLiBUcmVhdHMgYWxsXG4gIC8vIHNwYXJzZSBhcnJheS1saWtlcyBhcyBpZiB0aGV5IHdlcmUgZGVuc2UuXG4gIF8uZWFjaCA9IF8uZm9yRWFjaCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGg7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtrZXlzW2ldXSwga2V5c1tpXSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbiAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdHMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICByZXN1bHRzW2luZGV4XSA9IGl0ZXJhdGVlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgcmVkdWNpbmcgZnVuY3Rpb24gaXRlcmF0aW5nIGxlZnQgb3IgcmlnaHQuXG4gIHZhciBjcmVhdGVSZWR1Y2UgPSBmdW5jdGlvbihkaXIpIHtcbiAgICAvLyBXcmFwIGNvZGUgdGhhdCByZWFzc2lnbnMgYXJndW1lbnQgdmFyaWFibGVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gdGhhblxuICAgIC8vIHRoZSBvbmUgdGhhdCBhY2Nlc3NlcyBgYXJndW1lbnRzLmxlbmd0aGAgdG8gYXZvaWQgYSBwZXJmIGhpdC4gKCMxOTkxKVxuICAgIHZhciByZWR1Y2VyID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgaW5pdGlhbCkge1xuICAgICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgICBpbmRleCA9IGRpciA+IDAgPyAwIDogbGVuZ3RoIC0gMTtcbiAgICAgIGlmICghaW5pdGlhbCkge1xuICAgICAgICBtZW1vID0gb2JqW2tleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4XTtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuICAgICAgfVxuICAgICAgZm9yICg7IGluZGV4ID49IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IGRpcikge1xuICAgICAgICB2YXIgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgICBtZW1vID0gaXRlcmF0ZWUobWVtbywgb2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBtZW1vLCBjb250ZXh0KSB7XG4gICAgICB2YXIgaW5pdGlhbCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMztcbiAgICAgIHJldHVybiByZWR1Y2VyKG9iaiwgb3B0aW1pemVDYihpdGVyYXRlZSwgY29udGV4dCwgNCksIG1lbW8sIGluaXRpYWwpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gKipSZWR1Y2UqKiBidWlsZHMgdXAgYSBzaW5nbGUgcmVzdWx0IGZyb20gYSBsaXN0IG9mIHZhbHVlcywgYWthIGBpbmplY3RgLFxuICAvLyBvciBgZm9sZGxgLlxuICBfLnJlZHVjZSA9IF8uZm9sZGwgPSBfLmluamVjdCA9IGNyZWF0ZVJlZHVjZSgxKTtcblxuICAvLyBUaGUgcmlnaHQtYXNzb2NpYXRpdmUgdmVyc2lvbiBvZiByZWR1Y2UsIGFsc28ga25vd24gYXMgYGZvbGRyYC5cbiAgXy5yZWR1Y2VSaWdodCA9IF8uZm9sZHIgPSBjcmVhdGVSZWR1Y2UoLTEpO1xuXG4gIC8vIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggcGFzc2VzIGEgdHJ1dGggdGVzdC4gQWxpYXNlZCBhcyBgZGV0ZWN0YC5cbiAgXy5maW5kID0gXy5kZXRlY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBrZXlGaW5kZXIgPSBpc0FycmF5TGlrZShvYmopID8gXy5maW5kSW5kZXggOiBfLmZpbmRLZXk7XG4gICAgdmFyIGtleSA9IGtleUZpbmRlcihvYmosIHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwICYmIGtleSAhPT0gLTEpIHJldHVybiBvYmpba2V5XTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyB0aGF0IHBhc3MgYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBzZWxlY3RgLlxuICBfLmZpbHRlciA9IF8uc2VsZWN0ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgbGlzdCkpIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgZm9yIHdoaWNoIGEgdHJ1dGggdGVzdCBmYWlscy5cbiAgXy5yZWplY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBfLmZpbHRlcihvYmosIF8ubmVnYXRlKGNiKHByZWRpY2F0ZSkpLCBjb250ZXh0KTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgd2hldGhlciBhbGwgb2YgdGhlIGVsZW1lbnRzIG1hdGNoIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgYWxsYC5cbiAgXy5ldmVyeSA9IF8uYWxsID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAoIXByZWRpY2F0ZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoZSBvYmplY3QgbWF0Y2hlcyBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYGFueWAuXG4gIF8uc29tZSA9IF8uYW55ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFycmF5IG9yIG9iamVjdCBjb250YWlucyBhIGdpdmVuIGl0ZW0gKHVzaW5nIGA9PT1gKS5cbiAgLy8gQWxpYXNlZCBhcyBgaW5jbHVkZXNgIGFuZCBgaW5jbHVkZWAuXG4gIF8uY29udGFpbnMgPSBfLmluY2x1ZGVzID0gXy5pbmNsdWRlID0gZnVuY3Rpb24ob2JqLCBpdGVtLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgaWYgKCFpc0FycmF5TGlrZShvYmopKSBvYmogPSBfLnZhbHVlcyhvYmopO1xuICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ICE9ICdudW1iZXInIHx8IGd1YXJkKSBmcm9tSW5kZXggPSAwO1xuICAgIHJldHVybiBfLmluZGV4T2Yob2JqLCBpdGVtLCBmcm9tSW5kZXgpID49IDA7XG4gIH07XG5cbiAgLy8gSW52b2tlIGEgbWV0aG9kICh3aXRoIGFyZ3VtZW50cykgb24gZXZlcnkgaXRlbSBpbiBhIGNvbGxlY3Rpb24uXG4gIF8uaW52b2tlID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihvYmosIHBhdGgsIGFyZ3MpIHtcbiAgICB2YXIgY29udGV4dFBhdGgsIGZ1bmM7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXRoKSkge1xuICAgICAgZnVuYyA9IHBhdGg7XG4gICAgfSBlbHNlIGlmIChfLmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7XG4gICAgICBwYXRoID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICByZXR1cm4gXy5tYXAob2JqLCBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgICB2YXIgbWV0aG9kID0gZnVuYztcbiAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgIGlmIChjb250ZXh0UGF0aCAmJiBjb250ZXh0UGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZGVlcEdldChjb250ZXh0LCBjb250ZXh0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgbWV0aG9kID0gY29udGV4dFtwYXRoXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2QgPT0gbnVsbCA/IG1ldGhvZCA6IG1ldGhvZC5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgbWFwYDogZmV0Y2hpbmcgYSBwcm9wZXJ0eS5cbiAgXy5wbHVjayA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIF8ubWFwKG9iaiwgXy5wcm9wZXJ0eShrZXkpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaWx0ZXJgOiBzZWxlY3Rpbmcgb25seSBvYmplY3RzXG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ud2hlcmUgPSBmdW5jdGlvbihvYmosIGF0dHJzKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5tYXRjaGVyKGF0dHJzKSk7XG4gIH07XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgZmluZGA6IGdldHRpbmcgdGhlIGZpcnN0IG9iamVjdFxuICAvLyBjb250YWluaW5nIHNwZWNpZmljIGBrZXk6dmFsdWVgIHBhaXJzLlxuICBfLmZpbmRXaGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maW5kKG9iaiwgXy5tYXRjaGVyKGF0dHJzKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1heCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gLUluZmluaXR5LCBsYXN0Q29tcHV0ZWQgPSAtSW5maW5pdHksXG4gICAgICAgIHZhbHVlLCBjb21wdXRlZDtcbiAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCB8fCB0eXBlb2YgaXRlcmF0ZWUgPT0gJ251bWJlcicgJiYgdHlwZW9mIG9ialswXSAhPSAnb2JqZWN0JyAmJiBvYmogIT0gbnVsbCkge1xuICAgICAgb2JqID0gaXNBcnJheUxpa2Uob2JqKSA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odiwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2LCBpbmRleCwgbGlzdCk7XG4gICAgICAgIGlmIChjb21wdXRlZCA+IGxhc3RDb21wdXRlZCB8fCBjb21wdXRlZCA9PT0gLUluZmluaXR5ICYmIHJlc3VsdCA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdjtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1pbiA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgfHwgdHlwZW9mIGl0ZXJhdGVlID09ICdudW1iZXInICYmIHR5cGVvZiBvYmpbMF0gIT0gJ29iamVjdCcgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IGlzQXJyYXlMaWtlKG9iaikgPyBvYmogOiBfLnZhbHVlcyhvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IG9ialtpXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPCByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHYsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodiwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IEluZmluaXR5ICYmIHJlc3VsdCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2O1xuICAgICAgICAgIGxhc3RDb21wdXRlZCA9IGNvbXB1dGVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBTaHVmZmxlIGEgY29sbGVjdGlvbi5cbiAgXy5zaHVmZmxlID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIF8uc2FtcGxlKG9iaiwgSW5maW5pdHkpO1xuICB9O1xuXG4gIC8vIFNhbXBsZSAqKm4qKiByYW5kb20gdmFsdWVzIGZyb20gYSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBtb2Rlcm4gdmVyc2lvbiBvZiB0aGVcbiAgLy8gW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICAvLyBJZiAqKm4qKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIGEgc2luZ2xlIHJhbmRvbSBlbGVtZW50LlxuICAvLyBUaGUgaW50ZXJuYWwgYGd1YXJkYCBhcmd1bWVudCBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBtYXBgLlxuICBfLnNhbXBsZSA9IGZ1bmN0aW9uKG9iaiwgbiwgZ3VhcmQpIHtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSB7XG4gICAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IF8udmFsdWVzKG9iaik7XG4gICAgICByZXR1cm4gb2JqW18ucmFuZG9tKG9iai5sZW5ndGggLSAxKV07XG4gICAgfVxuICAgIHZhciBzYW1wbGUgPSBpc0FycmF5TGlrZShvYmopID8gXy5jbG9uZShvYmopIDogXy52YWx1ZXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gZ2V0TGVuZ3RoKHNhbXBsZSk7XG4gICAgbiA9IE1hdGgubWF4KE1hdGgubWluKG4sIGxlbmd0aCksIDApO1xuICAgIHZhciBsYXN0ID0gbGVuZ3RoIC0gMTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbjsgaW5kZXgrKykge1xuICAgICAgdmFyIHJhbmQgPSBfLnJhbmRvbShpbmRleCwgbGFzdCk7XG4gICAgICB2YXIgdGVtcCA9IHNhbXBsZVtpbmRleF07XG4gICAgICBzYW1wbGVbaW5kZXhdID0gc2FtcGxlW3JhbmRdO1xuICAgICAgc2FtcGxlW3JhbmRdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIHNhbXBsZS5zbGljZSgwLCBuKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24gcHJvZHVjZWQgYnkgYW4gaXRlcmF0ZWUuXG4gIF8uc29ydEJ5ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIF8ucGx1Y2soXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBsaXN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGluZGV4OiBpbmRleCsrLFxuICAgICAgICBjcml0ZXJpYTogaXRlcmF0ZWUodmFsdWUsIGtleSwgbGlzdClcbiAgICAgIH07XG4gICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhO1xuICAgICAgdmFyIGIgPSByaWdodC5jcml0ZXJpYTtcbiAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgIGlmIChhID4gYiB8fCBhID09PSB2b2lkIDApIHJldHVybiAxO1xuICAgICAgICBpZiAoYSA8IGIgfHwgYiA9PT0gdm9pZCAwKSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5pbmRleCAtIHJpZ2h0LmluZGV4O1xuICAgIH0pLCAndmFsdWUnKTtcbiAgfTtcblxuICAvLyBBbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGZvciBhZ2dyZWdhdGUgXCJncm91cCBieVwiIG9wZXJhdGlvbnMuXG4gIHZhciBncm91cCA9IGZ1bmN0aW9uKGJlaGF2aW9yLCBwYXJ0aXRpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcnRpdGlvbiA/IFtbXSwgW11dIDoge307XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gR3JvdXBzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24uIFBhc3MgZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZVxuICAvLyB0byBncm91cCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNyaXRlcmlvbi5cbiAgXy5ncm91cEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKGhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOyBlbHNlIHJlc3VsdFtrZXldID0gW3ZhbHVlXTtcbiAgfSk7XG5cbiAgLy8gSW5kZXhlcyB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uLCBzaW1pbGFyIHRvIGBncm91cEJ5YCwgYnV0IGZvclxuICAvLyB3aGVuIHlvdSBrbm93IHRoYXQgeW91ciBpbmRleCB2YWx1ZXMgd2lsbCBiZSB1bmlxdWUuXG4gIF8uaW5kZXhCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gIH0pO1xuXG4gIC8vIENvdW50cyBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0IHRoYXQgZ3JvdXAgYnkgYSBjZXJ0YWluIGNyaXRlcmlvbi4gUGFzc1xuICAvLyBlaXRoZXIgYSBzdHJpbmcgYXR0cmlidXRlIHRvIGNvdW50IGJ5LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgLy8gY3JpdGVyaW9uLlxuICBfLmNvdW50QnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0rKzsgZWxzZSByZXN1bHRba2V5XSA9IDE7XG4gIH0pO1xuXG4gIHZhciByZVN0clN5bWJvbCA9IC9bXlxcdWQ4MDAtXFx1ZGZmZl18W1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXXxbXFx1ZDgwMC1cXHVkZmZmXS9nO1xuICAvLyBTYWZlbHkgY3JlYXRlIGEgcmVhbCwgbGl2ZSBhcnJheSBmcm9tIGFueXRoaW5nIGl0ZXJhYmxlLlxuICBfLnRvQXJyYXkgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgIGlmIChfLmlzQXJyYXkob2JqKSkgcmV0dXJuIHNsaWNlLmNhbGwob2JqKTtcbiAgICBpZiAoXy5pc1N0cmluZyhvYmopKSB7XG4gICAgICAvLyBLZWVwIHN1cnJvZ2F0ZSBwYWlyIGNoYXJhY3RlcnMgdG9nZXRoZXJcbiAgICAgIHJldHVybiBvYmoubWF0Y2gocmVTdHJTeW1ib2wpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSkgcmV0dXJuIF8ubWFwKG9iaiwgXy5pZGVudGl0eSk7XG4gICAgcmV0dXJuIF8udmFsdWVzKG9iaik7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JqZWN0LlxuICBfLnNpemUgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiBpc0FycmF5TGlrZShvYmopID8gb2JqLmxlbmd0aCA6IF8ua2V5cyhvYmopLmxlbmd0aDtcbiAgfTtcblxuICAvLyBTcGxpdCBhIGNvbGxlY3Rpb24gaW50byB0d28gYXJyYXlzOiBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIHNhdGlzZnkgdGhlIGdpdmVuXG4gIC8vIHByZWRpY2F0ZSwgYW5kIG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAgXy5wYXJ0aXRpb24gPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBwYXNzKSB7XG4gICAgcmVzdWx0W3Bhc3MgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gIH0sIHRydWUpO1xuXG4gIC8vIEFycmF5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS1cblxuICAvLyBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGZpcnN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS4gQWxpYXNlZCBhcyBgaGVhZGAgYW5kIGB0YWtlYC4gVGhlICoqZ3VhcmQqKiBjaGVja1xuICAvLyBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuXG4gIF8uZmlyc3QgPSBfLmhlYWQgPSBfLnRha2UgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPCAxKSByZXR1cm4gbiA9PSBudWxsID8gdm9pZCAwIDogW107XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5WzBdO1xuICAgIHJldHVybiBfLmluaXRpYWwoYXJyYXksIGFycmF5Lmxlbmd0aCAtIG4pO1xuICB9O1xuXG4gIC8vIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgZW50cnkgb2YgdGhlIGFycmF5LiBFc3BlY2lhbGx5IHVzZWZ1bCBvblxuICAvLyB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiBhbGwgdGhlIHZhbHVlcyBpblxuICAvLyB0aGUgYXJyYXksIGV4Y2x1ZGluZyB0aGUgbGFzdCBOLlxuICBfLmluaXRpYWwgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgMCwgTWF0aC5tYXgoMCwgYXJyYXkubGVuZ3RoIC0gKG4gPT0gbnVsbCB8fCBndWFyZCA/IDEgOiBuKSkpO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgbGFzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBsYXN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS5cbiAgXy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwgfHwgYXJyYXkubGVuZ3RoIDwgMSkgcmV0dXJuIG4gPT0gbnVsbCA/IHZvaWQgMCA6IFtdO1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gXy5yZXN0KGFycmF5LCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSBuKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLlxuICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVyblxuICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gIF8ucmVzdCA9IF8udGFpbCA9IF8uZHJvcCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBuID09IG51bGwgfHwgZ3VhcmQgPyAxIDogbik7XG4gIH07XG5cbiAgLy8gVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LlxuICBfLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgQm9vbGVhbik7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYSByZWN1cnNpdmUgYGZsYXR0ZW5gIGZ1bmN0aW9uLlxuICB2YXIgZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0LCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCkge1xuICAgIG91dHB1dCA9IG91dHB1dCB8fCBbXTtcbiAgICB2YXIgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGlucHV0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiYgKF8uaXNBcnJheSh2YWx1ZSkgfHwgXy5pc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIC8vIEZsYXR0ZW4gY3VycmVudCBsZXZlbCBvZiBhcnJheSBvciBhcmd1bWVudHMgb2JqZWN0LlxuICAgICAgICBpZiAoc2hhbGxvdykge1xuICAgICAgICAgIHZhciBqID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChqIDwgbGVuKSBvdXRwdXRbaWR4KytdID0gdmFsdWVbaisrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCk7XG4gICAgICAgICAgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc3RyaWN0KSB7XG4gICAgICAgIG91dHB1dFtpZHgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICAvLyBGbGF0dGVuIG91dCBhbiBhcnJheSwgZWl0aGVyIHJlY3Vyc2l2ZWx5IChieSBkZWZhdWx0KSwgb3IganVzdCBvbmUgbGV2ZWwuXG4gIF8uZmxhdHRlbiA9IGZ1bmN0aW9uKGFycmF5LCBzaGFsbG93KSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oYXJyYXksIHNoYWxsb3csIGZhbHNlKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS5cbiAgXy53aXRob3V0ID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihhcnJheSwgb3RoZXJBcnJheXMpIHtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFycmF5LCBvdGhlckFycmF5cyk7XG4gIH0pO1xuXG4gIC8vIFByb2R1Y2UgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheS4gSWYgdGhlIGFycmF5IGhhcyBhbHJlYWR5XG4gIC8vIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS5cbiAgLy8gVGhlIGZhc3RlciBhbGdvcml0aG0gd2lsbCBub3Qgd29yayB3aXRoIGFuIGl0ZXJhdGVlIGlmIHRoZSBpdGVyYXRlZVxuICAvLyBpcyBub3QgYSBvbmUtdG8tb25lIGZ1bmN0aW9uLCBzbyBwcm92aWRpbmcgYW4gaXRlcmF0ZWUgd2lsbCBkaXNhYmxlXG4gIC8vIHRoZSBmYXN0ZXIgYWxnb3JpdGhtLlxuICAvLyBBbGlhc2VkIGFzIGB1bmlxdWVgLlxuICBfLnVuaXEgPSBfLnVuaXF1ZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKGlzU29ydGVkKSkge1xuICAgICAgY29udGV4dCA9IGl0ZXJhdGVlO1xuICAgICAgaXRlcmF0ZWUgPSBpc1NvcnRlZDtcbiAgICAgIGlzU29ydGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpdGVyYXRlZSAhPSBudWxsKSBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIHNlZW4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpXSxcbiAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUsIGksIGFycmF5KSA6IHZhbHVlO1xuICAgICAgaWYgKGlzU29ydGVkICYmICFpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIWkgfHwgc2VlbiAhPT0gY29tcHV0ZWQpIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoc2VlbiwgY29tcHV0ZWQpKSB7XG4gICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIV8uY29udGFpbnMocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdW5pb246IGVhY2ggZGlzdGluY3QgZWxlbWVudCBmcm9tIGFsbCBvZlxuICAvLyB0aGUgcGFzc2VkLWluIGFycmF5cy5cbiAgXy51bmlvbiA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgcmV0dXJuIF8udW5pcShmbGF0dGVuKGFycmF5cywgdHJ1ZSwgdHJ1ZSkpO1xuICB9KTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlXG4gIC8vIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoXy5jb250YWlucyhyZXN1bHQsIGl0ZW0pKSBjb250aW51ZTtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yIChqID0gMTsgaiA8IGFyZ3NMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoYXJndW1lbnRzW2pdLCBpdGVtKSkgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gYXJnc0xlbmd0aCkgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gVGFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhcnJheSBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgYXJyYXlzLlxuICAvLyBPbmx5IHRoZSBlbGVtZW50cyBwcmVzZW50IGluIGp1c3QgdGhlIGZpcnN0IGFycmF5IHdpbGwgcmVtYWluLlxuICBfLmRpZmZlcmVuY2UgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5LCByZXN0KSB7XG4gICAgcmVzdCA9IGZsYXR0ZW4ocmVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIF8uZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICByZXR1cm4gIV8uY29udGFpbnMocmVzdCwgdmFsdWUpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBDb21wbGVtZW50IG9mIF8uemlwLiBVbnppcCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyBhbmQgZ3JvdXBzXG4gIC8vIGVhY2ggYXJyYXkncyBlbGVtZW50cyBvbiBzaGFyZWQgaW5kaWNlcy5cbiAgXy51bnppcCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ICYmIF8ubWF4KGFycmF5LCBnZXRMZW5ndGgpLmxlbmd0aCB8fCAwO1xuICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IF8ucGx1Y2soYXJyYXksIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlXG4gIC8vIGFuIGluZGV4IGdvIHRvZ2V0aGVyLlxuICBfLnppcCA9IHJlc3RBcmd1bWVudHMoXy51bnppcCk7XG5cbiAgLy8gQ29udmVydHMgbGlzdHMgaW50byBvYmplY3RzLiBQYXNzIGVpdGhlciBhIHNpbmdsZSBhcnJheSBvZiBgW2tleSwgdmFsdWVdYFxuICAvLyBwYWlycywgb3IgdHdvIHBhcmFsbGVsIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGggLS0gb25lIG9mIGtleXMsIGFuZCBvbmUgb2ZcbiAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiBQYXNzaW5nIGJ5IHBhaXJzIGlzIHRoZSByZXZlcnNlIG9mIF8ucGFpcnMuXG4gIF8ub2JqZWN0ID0gZnVuY3Rpb24obGlzdCwgdmFsdWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgobGlzdCk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICByZXN1bHRbbGlzdFtpXV0gPSB2YWx1ZXNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbGlzdFtpXVswXV0gPSBsaXN0W2ldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIEdlbmVyYXRvciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpbmRJbmRleCBhbmQgZmluZExhc3RJbmRleCBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlciA9IGZ1bmN0aW9uKGRpcikge1xuICAgIHJldHVybiBmdW5jdGlvbihhcnJheSwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgICB2YXIgaW5kZXggPSBkaXIgPiAwID8gMCA6IGxlbmd0aCAtIDE7XG4gICAgICBmb3IgKDsgaW5kZXggPj0gMCAmJiBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gZGlyKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBvbiBhbiBhcnJheS1saWtlIHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3QuXG4gIF8uZmluZEluZGV4ID0gY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIoMSk7XG4gIF8uZmluZExhc3RJbmRleCA9IGNyZWF0ZVByZWRpY2F0ZUluZGV4RmluZGVyKC0xKTtcblxuICAvLyBVc2UgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoXG4gIC8vIGFuIG9iamVjdCBzaG91bGQgYmUgaW5zZXJ0ZWQgc28gYXMgdG8gbWFpbnRhaW4gb3JkZXIuIFVzZXMgYmluYXJ5IHNlYXJjaC5cbiAgXy5zb3J0ZWRJbmRleCA9IGZ1bmN0aW9uKGFycmF5LCBvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCwgMSk7XG4gICAgdmFyIHZhbHVlID0gaXRlcmF0ZWUob2JqKTtcbiAgICB2YXIgbG93ID0gMCwgaGlnaCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgIHZhciBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W21pZF0pIDwgdmFsdWUpIGxvdyA9IG1pZCArIDE7IGVsc2UgaGlnaCA9IG1pZDtcbiAgICB9XG4gICAgcmV0dXJuIGxvdztcbiAgfTtcblxuICAvLyBHZW5lcmF0b3IgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBpbmRleE9mIGFuZCBsYXN0SW5kZXhPZiBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVJbmRleEZpbmRlciA9IGZ1bmN0aW9uKGRpciwgcHJlZGljYXRlRmluZCwgc29ydGVkSW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGlkeCkge1xuICAgICAgdmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggPT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICBpID0gaWR4ID49IDAgPyBpZHggOiBNYXRoLm1heChpZHggKyBsZW5ndGgsIGkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxlbmd0aCA9IGlkeCA+PSAwID8gTWF0aC5taW4oaWR4ICsgMSwgbGVuZ3RoKSA6IGlkeCArIGxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc29ydGVkSW5kZXggJiYgaWR4ICYmIGxlbmd0aCkge1xuICAgICAgICBpZHggPSBzb3J0ZWRJbmRleChhcnJheSwgaXRlbSk7XG4gICAgICAgIHJldHVybiBhcnJheVtpZHhdID09PSBpdGVtID8gaWR4IDogLTE7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICBpZHggPSBwcmVkaWNhdGVGaW5kKHNsaWNlLmNhbGwoYXJyYXksIGksIGxlbmd0aCksIF8uaXNOYU4pO1xuICAgICAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggKyBpIDogLTE7XG4gICAgICB9XG4gICAgICBmb3IgKGlkeCA9IGRpciA+IDAgPyBpIDogbGVuZ3RoIC0gMTsgaWR4ID49IDAgJiYgaWR4IDwgbGVuZ3RoOyBpZHggKz0gZGlyKSB7XG4gICAgICAgIGlmIChhcnJheVtpZHhdID09PSBpdGVtKSByZXR1cm4gaWR4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LFxuICAvLyBvciAtMSBpZiB0aGUgaXRlbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGFycmF5LlxuICAvLyBJZiB0aGUgYXJyYXkgaXMgbGFyZ2UgYW5kIGFscmVhZHkgaW4gc29ydCBvcmRlciwgcGFzcyBgdHJ1ZWBcbiAgLy8gZm9yICoqaXNTb3J0ZWQqKiB0byB1c2UgYmluYXJ5IHNlYXJjaC5cbiAgXy5pbmRleE9mID0gY3JlYXRlSW5kZXhGaW5kZXIoMSwgXy5maW5kSW5kZXgsIF8uc29ydGVkSW5kZXgpO1xuICBfLmxhc3RJbmRleE9mID0gY3JlYXRlSW5kZXhGaW5kZXIoLTEsIF8uZmluZExhc3RJbmRleCk7XG5cbiAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZlxuICAvLyB0aGUgbmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZVxuICAvLyBbdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZnVuY3Rpb25zLmh0bWwjcmFuZ2UpLlxuICBfLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICBpZiAoc3RvcCA9PSBudWxsKSB7XG4gICAgICBzdG9wID0gc3RhcnQgfHwgMDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKCFzdGVwKSB7XG4gICAgICBzdGVwID0gc3RvcCA8IHN0YXJ0ID8gLTEgOiAxO1xuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG4gICAgdmFyIHJhbmdlID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyssIHN0YXJ0ICs9IHN0ZXApIHtcbiAgICAgIHJhbmdlW2lkeF0gPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgLy8gQ2h1bmsgYSBzaW5nbGUgYXJyYXkgaW50byBtdWx0aXBsZSBhcnJheXMsIGVhY2ggY29udGFpbmluZyBgY291bnRgIG9yIGZld2VyXG4gIC8vIGl0ZW1zLlxuICBfLmNodW5rID0gZnVuY3Rpb24oYXJyYXksIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IG51bGwgfHwgY291bnQgPCAxKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaChzbGljZS5jYWxsKGFycmF5LCBpLCBpICs9IGNvdW50KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gRnVuY3Rpb24gKGFoZW0pIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIGFzIGEgY29uc3RydWN0b3JcbiAgLy8gb3IgYSBub3JtYWwgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICB2YXIgZXhlY3V0ZUJvdW5kID0gZnVuY3Rpb24oc291cmNlRnVuYywgYm91bmRGdW5jLCBjb250ZXh0LCBjYWxsaW5nQ29udGV4dCwgYXJncykge1xuICAgIGlmICghKGNhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgYm91bmRGdW5jKSkgcmV0dXJuIHNvdXJjZUZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgdmFyIHNlbGYgPSBiYXNlQ3JlYXRlKHNvdXJjZUZ1bmMucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gc291cmNlRnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICBpZiAoXy5pc09iamVjdChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLFxuICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmXG4gIC8vIGF2YWlsYWJsZS5cbiAgXy5iaW5kID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdzKSB7XG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oZnVuYykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbicpO1xuICAgIHZhciBib3VuZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oY2FsbEFyZ3MpIHtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIGNvbnRleHQsIHRoaXMsIGFyZ3MuY29uY2F0KGNhbGxBcmdzKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICAvLyBQYXJ0aWFsbHkgYXBwbHkgYSBmdW5jdGlvbiBieSBjcmVhdGluZyBhIHZlcnNpb24gdGhhdCBoYXMgaGFkIHNvbWUgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cyBwcmUtZmlsbGVkLCB3aXRob3V0IGNoYW5naW5nIGl0cyBkeW5hbWljIGB0aGlzYCBjb250ZXh0LiBfIGFjdHNcbiAgLy8gYXMgYSBwbGFjZWhvbGRlciBieSBkZWZhdWx0LCBhbGxvd2luZyBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzIHRvIGJlXG4gIC8vIHByZS1maWxsZWQuIFNldCBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCBmb3IgYSBjdXN0b20gcGxhY2Vob2xkZXIgYXJndW1lbnQuXG4gIF8ucGFydGlhbCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oZnVuYywgYm91bmRBcmdzKSB7XG4gICAgdmFyIHBsYWNlaG9sZGVyID0gXy5wYXJ0aWFsLnBsYWNlaG9sZGVyO1xuICAgIHZhciBib3VuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gMCwgbGVuZ3RoID0gYm91bmRBcmdzLmxlbmd0aDtcbiAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJnc1tpXSA9IGJvdW5kQXJnc1tpXSA9PT0gcGxhY2Vob2xkZXIgPyBhcmd1bWVudHNbcG9zaXRpb24rK10gOiBib3VuZEFyZ3NbaV07XG4gICAgICB9XG4gICAgICB3aGlsZSAocG9zaXRpb24gPCBhcmd1bWVudHMubGVuZ3RoKSBhcmdzLnB1c2goYXJndW1lbnRzW3Bvc2l0aW9uKytdKTtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIHRoaXMsIHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICBfLnBhcnRpYWwucGxhY2Vob2xkZXIgPSBfO1xuXG4gIC8vIEJpbmQgYSBudW1iZXIgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gUmVtYWluaW5nIGFyZ3VtZW50c1xuICAvLyBhcmUgdGhlIG1ldGhvZCBuYW1lcyB0byBiZSBib3VuZC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0IGFsbCBjYWxsYmFja3NcbiAgLy8gZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LlxuICBfLmJpbmRBbGwgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIGtleXMgPSBmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgdmFyIGluZGV4ID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGluZGV4IDwgMSkgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzJyk7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIG9ialtrZXldID0gXy5iaW5kKG9ialtrZXldLCBvYmopO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTWVtb2l6ZSBhbiBleHBlbnNpdmUgZnVuY3Rpb24gYnkgc3RvcmluZyBpdHMgcmVzdWx0cy5cbiAgXy5tZW1vaXplID0gZnVuY3Rpb24oZnVuYywgaGFzaGVyKSB7XG4gICAgdmFyIG1lbW9pemUgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHZhciBjYWNoZSA9IG1lbW9pemUuY2FjaGU7XG4gICAgICB2YXIgYWRkcmVzcyA9ICcnICsgKGhhc2hlciA/IGhhc2hlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDoga2V5KTtcbiAgICAgIGlmICghaGFzKGNhY2hlLCBhZGRyZXNzKSkgY2FjaGVbYWRkcmVzc10gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY2FjaGVbYWRkcmVzc107XG4gICAgfTtcbiAgICBtZW1vaXplLmNhY2hlID0ge307XG4gICAgcmV0dXJuIG1lbW9pemU7XG4gIH07XG5cbiAgLy8gRGVsYXlzIGEgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiBjYWxsc1xuICAvLyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuXG4gIF8uZGVsYXkgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0sIHdhaXQpO1xuICB9KTtcblxuICAvLyBEZWZlcnMgYSBmdW5jdGlvbiwgc2NoZWR1bGluZyBpdCB0byBydW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXNcbiAgLy8gY2xlYXJlZC5cbiAgXy5kZWZlciA9IF8ucGFydGlhbChfLmRlbGF5LCBfLCAxKTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2VcbiAgLy8gZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIE5vcm1hbGx5LCB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHdpbGwgcnVuXG4gIC8vIGFzIG11Y2ggYXMgaXQgY2FuLCB3aXRob3V0IGV2ZXIgZ29pbmcgbW9yZSB0aGFuIG9uY2UgcGVyIGB3YWl0YCBkdXJhdGlvbjtcbiAgLy8gYnV0IGlmIHlvdSdkIGxpa2UgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2UsIHBhc3NcbiAgLy8gYHtsZWFkaW5nOiBmYWxzZX1gLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgZGl0dG8uXG4gIF8udGhyb3R0bGUgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIHRpbWVvdXQsIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogXy5ub3coKTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG5cbiAgICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbm93ID0gXy5ub3coKTtcbiAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhyb3R0bGVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgcHJldmlvdXMgPSAwO1xuICAgICAgdGltZW91dCA9IGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRocm90dGxlZDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gIC8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgLy8gTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlXG4gIC8vIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gIF8uZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgdGltZW91dCwgcmVzdWx0O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oY29udGV4dCwgYXJncykge1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICBpZiAoYXJncykgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9O1xuXG4gICAgdmFyIGRlYm91bmNlZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJncykge1xuICAgICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSAhdGltZW91dDtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVvdXQgPSBfLmRlbGF5KGxhdGVyLCB3YWl0LCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGRlYm91bmNlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVib3VuY2VkO1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2Vjb25kLFxuICAvLyBhbGxvd2luZyB5b3UgdG8gYWRqdXN0IGFyZ3VtZW50cywgcnVuIGNvZGUgYmVmb3JlIGFuZCBhZnRlciwgYW5kXG4gIC8vIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXG4gIF8ud3JhcCA9IGZ1bmN0aW9uKGZ1bmMsIHdyYXBwZXIpIHtcbiAgICByZXR1cm4gXy5wYXJ0aWFsKHdyYXBwZXIsIGZ1bmMpO1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBuZWdhdGVkIHZlcnNpb24gb2YgdGhlIHBhc3NlZC1pbiBwcmVkaWNhdGUuXG4gIF8ubmVnYXRlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2YgZnVuY3Rpb25zLCBlYWNoXG4gIC8vIGNvbnN1bWluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuXG4gIF8uY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBzdGFydCA9IGFyZ3MubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaSA9IHN0YXJ0O1xuICAgICAgdmFyIHJlc3VsdCA9IGFyZ3Nbc3RhcnRdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB3aGlsZSAoaS0tKSByZXN1bHQgPSBhcmdzW2ldLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgb24gYW5kIGFmdGVyIHRoZSBOdGggY2FsbC5cbiAgXy5hZnRlciA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPCAxKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgTnRoIGNhbGwuXG4gIF8uYmVmb3JlID0gZnVuY3Rpb24odGltZXMsIGZ1bmMpIHtcbiAgICB2YXIgbWVtbztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aW1lcyA+IDApIHtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lcyA8PSAxKSBmdW5jID0gbnVsbDtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0aW1lLCBubyBtYXR0ZXIgaG93XG4gIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uXG4gIF8ub25jZSA9IF8ucGFydGlhbChfLmJlZm9yZSwgMik7XG5cbiAgXy5yZXN0QXJndW1lbnRzID0gcmVzdEFyZ3VtZW50cztcblxuICAvLyBPYmplY3QgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBLZXlzIGluIElFIDwgOSB0aGF0IHdvbid0IGJlIGl0ZXJhdGVkIGJ5IGBmb3Iga2V5IGluIC4uLmAgYW5kIHRodXMgbWlzc2VkLlxuICB2YXIgaGFzRW51bUJ1ZyA9ICF7dG9TdHJpbmc6IG51bGx9LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWyd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuXG4gIHZhciBjb2xsZWN0Tm9uRW51bVByb3BzID0gZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIG5vbkVudW1JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgcHJvdG8gPSBfLmlzRnVuY3Rpb24oY29uc3RydWN0b3IpICYmIGNvbnN0cnVjdG9yLnByb3RvdHlwZSB8fCBPYmpQcm90bztcblxuICAgIC8vIENvbnN0cnVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlLlxuICAgIHZhciBwcm9wID0gJ2NvbnN0cnVjdG9yJztcbiAgICBpZiAoaGFzKG9iaiwgcHJvcCkgJiYgIV8uY29udGFpbnMoa2V5cywgcHJvcCkpIGtleXMucHVzaChwcm9wKTtcblxuICAgIHdoaWxlIChub25FbnVtSWR4LS0pIHtcbiAgICAgIHByb3AgPSBub25FbnVtZXJhYmxlUHJvcHNbbm9uRW51bUlkeF07XG4gICAgICBpZiAocHJvcCBpbiBvYmogJiYgb2JqW3Byb3BdICE9PSBwcm90b1twcm9wXSAmJiAhXy5jb250YWlucyhrZXlzLCBwcm9wKSkge1xuICAgICAgICBrZXlzLnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSBuYW1lcyBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYE9iamVjdC5rZXlzYC5cbiAgXy5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICBpZiAobmF0aXZlS2V5cykgcmV0dXJuIG5hdGl2ZUtleXMob2JqKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChoYXMob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgICAvLyBBaGVtLCBJRSA8IDkuXG4gICAgaWYgKGhhc0VudW1CdWcpIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvLyBSZXRyaWV2ZSBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdC5cbiAgXy5hbGxLZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICAgIC8vIEFoZW0sIElFIDwgOS5cbiAgICBpZiAoaGFzRW51bUJ1ZykgY29sbGVjdE5vbkVudW1Qcm9wcyhvYmosIGtleXMpO1xuICAgIHJldHVybiBrZXlzO1xuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgXy52YWx1ZXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgdmFsdWVzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBvYmpba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgaXRlcmF0ZWUgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBvYmplY3QuXG4gIC8vIEluIGNvbnRyYXN0IHRvIF8ubWFwIGl0IHJldHVybnMgYW4gb2JqZWN0LlxuICBfLm1hcE9iamVjdCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0cyA9IHt9O1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c1tpbmRleF07XG4gICAgICByZXN1bHRzW2N1cnJlbnRLZXldID0gaXRlcmF0ZWUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGEgbGlzdCBvZiBgW2tleSwgdmFsdWVdYCBwYWlycy5cbiAgLy8gVGhlIG9wcG9zaXRlIG9mIF8ub2JqZWN0LlxuICBfLnBhaXJzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIHBhaXJzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWlyc1tpXSA9IFtrZXlzW2ldLCBvYmpba2V5c1tpXV1dO1xuICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgYW4gb2JqZWN0LiBUaGUgdmFsdWVzIG11c3QgYmUgc2VyaWFsaXphYmxlLlxuICBfLmludmVydCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbb2JqW2tleXNbaV1dXSA9IGtleXNbaV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGF2YWlsYWJsZSBvbiB0aGUgb2JqZWN0LlxuICAvLyBBbGlhc2VkIGFzIGBtZXRob2RzYC5cbiAgXy5mdW5jdGlvbnMgPSBfLm1ldGhvZHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKG9ialtrZXldKSkgbmFtZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhc3NpZ25lciBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVBc3NpZ25lciA9IGZ1bmN0aW9uKGtleXNGdW5jLCBkZWZhdWx0cykge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKGRlZmF1bHRzKSBvYmogPSBPYmplY3Qob2JqKTtcbiAgICAgIGlmIChsZW5ndGggPCAyIHx8IG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XSxcbiAgICAgICAgICAgIGtleXMgPSBrZXlzRnVuYyhzb3VyY2UpLFxuICAgICAgICAgICAgbCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmICghZGVmYXVsdHMgfHwgb2JqW2tleV0gPT09IHZvaWQgMCkgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgcHJvcGVydGllcyBpbiBwYXNzZWQtaW4gb2JqZWN0KHMpLlxuICBfLmV4dGVuZCA9IGNyZWF0ZUFzc2lnbmVyKF8uYWxsS2V5cyk7XG5cbiAgLy8gQXNzaWducyBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgb3duIHByb3BlcnRpZXMgaW4gdGhlIHBhc3NlZC1pbiBvYmplY3QocykuXG4gIC8vIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduKVxuICBfLmV4dGVuZE93biA9IF8uYXNzaWduID0gY3JlYXRlQXNzaWduZXIoXy5rZXlzKTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBrZXkgb24gYW4gb2JqZWN0IHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3QuXG4gIF8uZmluZEtleSA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopLCBrZXk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtrZXldLCBrZXksIG9iaikpIHJldHVybiBrZXk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEludGVybmFsIHBpY2sgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBgb2JqYCBoYXMga2V5IGBrZXlgLlxuICB2YXIga2V5SW5PYmogPSBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmopIHtcbiAgICByZXR1cm4ga2V5IGluIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgb25seSBjb250YWluaW5nIHRoZSB3aGl0ZWxpc3RlZCBwcm9wZXJ0aWVzLlxuICBfLnBpY2sgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaXRlcmF0ZWUgPSBrZXlzWzBdO1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBrZXlzWzFdKTtcbiAgICAgIGtleXMgPSBfLmFsbEtleXMob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBrZXlJbk9iajtcbiAgICAgIGtleXMgPSBmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBvYmogPSBPYmplY3Qob2JqKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG4gICAgICBpZiAoaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdGhlIGJsYWNrbGlzdGVkIHByb3BlcnRpZXMuXG4gIF8ub21pdCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIGl0ZXJhdGVlID0ga2V5c1swXSwgY29udGV4dDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBfLm5lZ2F0ZShpdGVyYXRlZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSBjb250ZXh0ID0ga2V5c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IF8ubWFwKGZsYXR0ZW4oa2V5cywgZmFsc2UsIGZhbHNlKSwgU3RyaW5nKTtcbiAgICAgIGl0ZXJhdGVlID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICByZXR1cm4gIV8uY29udGFpbnMoa2V5cywga2V5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBfLnBpY2sob2JqLCBpdGVyYXRlZSwgY29udGV4dCk7XG4gIH0pO1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIF8uZGVmYXVsdHMgPSBjcmVhdGVBc3NpZ25lcihfLmFsbEtleXMsIHRydWUpO1xuXG4gIC8vIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG90eXBlIG9iamVjdC5cbiAgLy8gSWYgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGVcbiAgLy8gY3JlYXRlZCBvYmplY3QuXG4gIF8uY3JlYXRlID0gZnVuY3Rpb24ocHJvdG90eXBlLCBwcm9wcykge1xuICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3BzKSBfLmV4dGVuZE93bihyZXN1bHQsIHByb3BzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIChzaGFsbG93LWNsb25lZCkgZHVwbGljYXRlIG9mIGFuIG9iamVjdC5cbiAgXy5jbG9uZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICAgIHJldHVybiBfLmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogXy5leHRlbmQoe30sIG9iaik7XG4gIH07XG5cbiAgLy8gSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2JqLlxuICAvLyBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiwgaW5cbiAgLy8gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbiB0aGUgY2hhaW4uXG4gIF8udGFwID0gZnVuY3Rpb24ob2JqLCBpbnRlcmNlcHRvcikge1xuICAgIGludGVyY2VwdG9yKG9iaik7XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZiBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5pc01hdGNoID0gZnVuY3Rpb24ob2JqZWN0LCBhdHRycykge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKGF0dHJzKSwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gIWxlbmd0aDtcbiAgICB2YXIgb2JqID0gT2JqZWN0KG9iamVjdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoYXR0cnNba2V5XSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIHZhciBlcSwgZGVlcEVxO1xuICBlcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwpLlxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gICAgLy8gYG51bGxgIG9yIGB1bmRlZmluZWRgIG9ubHkgZXF1YWwgdG8gaXRzZWxmIChzdHJpY3QgY29tcGFyaXNvbikuXG4gICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAvLyBgTmFOYHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBub24tcmVmbGV4aXZlLlxuICAgIGlmIChhICE9PSBhKSByZXR1cm4gYiAhPT0gYjtcbiAgICAvLyBFeGhhdXN0IHByaW1pdGl2ZSBjaGVja3NcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBhO1xuICAgIGlmICh0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBiICE9ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGRlZXBFcShhLCBiLCBhU3RhY2ssIGJTdGFjayk7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgcmVjdXJzaXZlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGBpc0VxdWFsYC5cbiAgZGVlcEVxID0gZnVuY3Rpb24oYSwgYiwgYVN0YWNrLCBiU3RhY2spIHtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8pIGEgPSBhLl93cmFwcGVkO1xuICAgIGlmIChiIGluc3RhbmNlb2YgXykgYiA9IGIuX3dyYXBwZWQ7XG4gICAgLy8gQ29tcGFyZSBgW1tDbGFzc11dYCBuYW1lcy5cbiAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLlxuICAgICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzpcbiAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOLlxuICAgICAgICBpZiAoK2EgIT09ICthKSByZXR1cm4gK2IgIT09ICtiO1xuICAgICAgICAvLyBBbiBgZWdhbGAgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgZm9yIG90aGVyIG51bWVyaWMgdmFsdWVzLlxuICAgICAgICByZXR1cm4gK2EgPT09IDAgPyAxIC8gK2EgPT09IDEgLyBiIDogK2EgPT09ICtiO1xuICAgICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgICAgLy8gQ29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1lcmljIHByaW1pdGl2ZSB2YWx1ZXMuIERhdGVzIGFyZSBjb21wYXJlZCBieSB0aGVpclxuICAgICAgICAvLyBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnMuIE5vdGUgdGhhdCBpbnZhbGlkIGRhdGVzIHdpdGggbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zXG4gICAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgICAgcmV0dXJuICthID09PSArYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3ltYm9sXSc6XG4gICAgICAgIHJldHVybiBTeW1ib2xQcm90by52YWx1ZU9mLmNhbGwoYSkgPT09IFN5bWJvbFByb3RvLnZhbHVlT2YuY2FsbChiKTtcbiAgICB9XG5cbiAgICB2YXIgYXJlQXJyYXlzID0gY2xhc3NOYW1lID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIGlmICghYXJlQXJyYXlzKSB7XG4gICAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gT2JqZWN0cyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVpdmFsZW50LCBidXQgYE9iamVjdGBzIG9yIGBBcnJheWBzXG4gICAgICAvLyBmcm9tIGRpZmZlcmVudCBmcmFtZXMgYXJlLlxuICAgICAgdmFyIGFDdG9yID0gYS5jb25zdHJ1Y3RvciwgYkN0b3IgPSBiLmNvbnN0cnVjdG9yO1xuICAgICAgaWYgKGFDdG9yICE9PSBiQ3RvciAmJiAhKF8uaXNGdW5jdGlvbihhQ3RvcikgJiYgYUN0b3IgaW5zdGFuY2VvZiBhQ3RvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNGdW5jdGlvbihiQ3RvcikgJiYgYkN0b3IgaW5zdGFuY2VvZiBiQ3RvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCdjb25zdHJ1Y3RvcicgaW4gYSAmJiAnY29uc3RydWN0b3InIGluIGIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQXNzdW1lIGVxdWFsaXR5IGZvciBjeWNsaWMgc3RydWN0dXJlcy4gVGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpY1xuICAgIC8vIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjMsIGFic3RyYWN0IG9wZXJhdGlvbiBgSk9gLlxuXG4gICAgLy8gSW5pdGlhbGl6aW5nIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIC8vIEl0J3MgZG9uZSBoZXJlIHNpbmNlIHdlIG9ubHkgbmVlZCB0aGVtIGZvciBvYmplY3RzIGFuZCBhcnJheXMgY29tcGFyaXNvbi5cbiAgICBhU3RhY2sgPSBhU3RhY2sgfHwgW107XG4gICAgYlN0YWNrID0gYlN0YWNrIHx8IFtdO1xuICAgIHZhciBsZW5ndGggPSBhU3RhY2subGVuZ3RoO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgLy8gTGluZWFyIHNlYXJjaC4gUGVyZm9ybWFuY2UgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mXG4gICAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAgICBpZiAoYVN0YWNrW2xlbmd0aF0gPT09IGEpIHJldHVybiBiU3RhY2tbbGVuZ3RoXSA9PT0gYjtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGZpcnN0IG9iamVjdCB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgYVN0YWNrLnB1c2goYSk7XG4gICAgYlN0YWNrLnB1c2goYik7XG5cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAgICBpZiAoYXJlQXJyYXlzKSB7XG4gICAgICAvLyBDb21wYXJlIGFycmF5IGxlbmd0aHMgdG8gZGV0ZXJtaW5lIGlmIGEgZGVlcCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeS5cbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIERlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKCFlcShhW2xlbmd0aF0sIGJbbGVuZ3RoXSwgYVN0YWNrLCBiU3RhY2spKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZXAgY29tcGFyZSBvYmplY3RzLlxuICAgICAgdmFyIGtleXMgPSBfLmtleXMoYSksIGtleTtcbiAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgICAgLy8gRW5zdXJlIHRoYXQgYm90aCBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIHByb3BlcnRpZXMgYmVmb3JlIGNvbXBhcmluZyBkZWVwIGVxdWFsaXR5LlxuICAgICAgaWYgKF8ua2V5cyhiKS5sZW5ndGggIT09IGxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIC8vIERlZXAgY29tcGFyZSBlYWNoIG1lbWJlclxuICAgICAgICBrZXkgPSBrZXlzW2xlbmd0aF07XG4gICAgICAgIGlmICghKGhhcyhiLCBrZXkpICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaykpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIGFTdGFjay5wb3AoKTtcbiAgICBiU3RhY2sucG9wKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSBhIGRlZXAgY29tcGFyaXNvbiB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuXG4gIF8uaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXEoYSwgYik7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiBhcnJheSwgc3RyaW5nLCBvciBvYmplY3QgZW1wdHk/XG4gIC8vIEFuIFwiZW1wdHlcIiBvYmplY3QgaGFzIG5vIGVudW1lcmFibGUgb3duLXByb3BlcnRpZXMuXG4gIF8uaXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikgJiYgKF8uaXNBcnJheShvYmopIHx8IF8uaXNTdHJpbmcob2JqKSB8fCBfLmlzQXJndW1lbnRzKG9iaikpKSByZXR1cm4gb2JqLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gXy5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBET00gZWxlbWVudD9cbiAgXy5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSk7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhbiBhcnJheT9cbiAgLy8gRGVsZWdhdGVzIHRvIEVDTUE1J3MgbmF0aXZlIEFycmF5LmlzQXJyYXlcbiAgXy5pc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0P1xuICBfLmlzT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhb2JqO1xuICB9O1xuXG4gIC8vIEFkZCBzb21lIGlzVHlwZSBtZXRob2RzOiBpc0FyZ3VtZW50cywgaXNGdW5jdGlvbiwgaXNTdHJpbmcsIGlzTnVtYmVyLCBpc0RhdGUsIGlzUmVnRXhwLCBpc0Vycm9yLCBpc01hcCwgaXNXZWFrTWFwLCBpc1NldCwgaXNXZWFrU2V0LlxuICBfLmVhY2goWydBcmd1bWVudHMnLCAnRnVuY3Rpb24nLCAnU3RyaW5nJywgJ051bWJlcicsICdEYXRlJywgJ1JlZ0V4cCcsICdFcnJvcicsICdTeW1ib2wnLCAnTWFwJywgJ1dlYWtNYXAnLCAnU2V0JywgJ1dlYWtTZXQnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIF9bJ2lzJyArIG5hbWVdID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgbmFtZSArICddJztcbiAgICB9O1xuICB9KTtcblxuICAvLyBEZWZpbmUgYSBmYWxsYmFjayB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgaW4gYnJvd3NlcnMgKGFoZW0sIElFIDwgOSksIHdoZXJlXG4gIC8vIHRoZXJlIGlzbid0IGFueSBpbnNwZWN0YWJsZSBcIkFyZ3VtZW50c1wiIHR5cGUuXG4gIGlmICghXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpKSB7XG4gICAgXy5pc0FyZ3VtZW50cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIGhhcyhvYmosICdjYWxsZWUnKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gT3B0aW1pemUgYGlzRnVuY3Rpb25gIGlmIGFwcHJvcHJpYXRlLiBXb3JrIGFyb3VuZCBzb21lIHR5cGVvZiBidWdzIGluIG9sZCB2OCxcbiAgLy8gSUUgMTEgKCMxNjIxKSwgU2FmYXJpIDggKCMxOTI5KSwgYW5kIFBoYW50b21KUyAoIzIyMzYpLlxuICB2YXIgbm9kZWxpc3QgPSByb290LmRvY3VtZW50ICYmIHJvb3QuZG9jdW1lbnQuY2hpbGROb2RlcztcbiAgaWYgKHR5cGVvZiAvLi8gIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSW50OEFycmF5ICE9ICdvYmplY3QnICYmIHR5cGVvZiBub2RlbGlzdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICAgIH07XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gIV8uaXNTeW1ib2wob2JqKSAmJiBpc0Zpbml0ZShvYmopICYmICFpc05hTihwYXJzZUZsb2F0KG9iaikpO1xuICB9O1xuXG4gIC8vIElzIHRoZSBnaXZlbiB2YWx1ZSBgTmFOYD9cbiAgXy5pc05hTiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBfLmlzTnVtYmVyKG9iaikgJiYgaXNOYU4ob2JqKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj9cbiAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBlcXVhbCB0byBudWxsP1xuICBfLmlzTnVsbCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/XG4gIF8uaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7XG4gIH07XG5cbiAgLy8gU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eSBkaXJlY3RseVxuICAvLyBvbiBpdHNlbGYgKGluIG90aGVyIHdvcmRzLCBub3Qgb24gYSBwcm90b3R5cGUpLlxuICBfLmhhcyA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gaGFzKG9iaiwgcGF0aCk7XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcGF0aFtpXTtcbiAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfVxuICAgIHJldHVybiAhIWxlbmd0aDtcbiAgfTtcblxuICAvLyBVdGlsaXR5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFJ1biBVbmRlcnNjb3JlLmpzIGluICpub0NvbmZsaWN0KiBtb2RlLCByZXR1cm5pbmcgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHNcbiAgLy8gcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LlxuICBfLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICByb290Ll8gPSBwcmV2aW91c1VuZGVyc2NvcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gS2VlcCB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gYXJvdW5kIGZvciBkZWZhdWx0IGl0ZXJhdGVlcy5cbiAgXy5pZGVudGl0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIC8vIFByZWRpY2F0ZS1nZW5lcmF0aW5nIGZ1bmN0aW9ucy4gT2Z0ZW4gdXNlZnVsIG91dHNpZGUgb2YgVW5kZXJzY29yZS5cbiAgXy5jb25zdGFudCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgXy5ub29wID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIHBhc3NlZCBhbiBvYmplY3QsIHdpbGwgdHJhdmVyc2UgdGhhdCBvYmplY3TigJlzXG4gIC8vIHByb3BlcnRpZXMgZG93biB0aGUgZ2l2ZW4gYHBhdGhgLCBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2Yga2V5cyBvciBpbmRleGVzLlxuICBfLnByb3BlcnR5ID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gc2hhbGxvd1Byb3BlcnR5KHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gZGVlcEdldChvYmosIHBhdGgpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gR2VuZXJhdGVzIGEgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IHRoYXQgcmV0dXJucyBhIGdpdmVuIHByb3BlcnR5LlxuICBfLnByb3BlcnR5T2YgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpe307XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICByZXR1cm4gIV8uaXNBcnJheShwYXRoKSA/IG9ialtwYXRoXSA6IGRlZXBHZXQob2JqLCBwYXRoKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBwcmVkaWNhdGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZlxuICAvLyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5tYXRjaGVyID0gXy5tYXRjaGVzID0gZnVuY3Rpb24oYXR0cnMpIHtcbiAgICBhdHRycyA9IF8uZXh0ZW5kT3duKHt9LCBhdHRycyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIF8uaXNNYXRjaChvYmosIGF0dHJzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJ1biBhIGZ1bmN0aW9uICoqbioqIHRpbWVzLlxuICBfLnRpbWVzID0gZnVuY3Rpb24obiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgYWNjdW0gPSBBcnJheShNYXRoLm1heCgwLCBuKSk7XG4gICAgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgYWNjdW1baV0gPSBpdGVyYXRlZShpKTtcbiAgICByZXR1cm4gYWNjdW07XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAoaW5jbHVzaXZlKS5cbiAgXy5yYW5kb20gPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgbWF4ID0gbWluO1xuICAgICAgbWluID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIG1pbiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSk7XG4gIH07XG5cbiAgLy8gQSAocG9zc2libHkgZmFzdGVyKSB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBhbiBpbnRlZ2VyLlxuICBfLm5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfTtcblxuICAvLyBMaXN0IG9mIEhUTUwgZW50aXRpZXMgZm9yIGVzY2FwaW5nLlxuICB2YXIgZXNjYXBlTWFwID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjeDI3OycsXG4gICAgJ2AnOiAnJiN4NjA7J1xuICB9O1xuICB2YXIgdW5lc2NhcGVNYXAgPSBfLmludmVydChlc2NhcGVNYXApO1xuXG4gIC8vIEZ1bmN0aW9ucyBmb3IgZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcgc3RyaW5ncyB0by9mcm9tIEhUTUwgaW50ZXJwb2xhdGlvbi5cbiAgdmFyIGNyZWF0ZUVzY2FwZXIgPSBmdW5jdGlvbihtYXApIHtcbiAgICB2YXIgZXNjYXBlciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFwW21hdGNoXTtcbiAgICB9O1xuICAgIC8vIFJlZ2V4ZXMgZm9yIGlkZW50aWZ5aW5nIGEga2V5IHRoYXQgbmVlZHMgdG8gYmUgZXNjYXBlZC5cbiAgICB2YXIgc291cmNlID0gJyg/OicgKyBfLmtleXMobWFwKS5qb2luKCd8JykgKyAnKSc7XG4gICAgdmFyIHRlc3RSZWdleHAgPSBSZWdFeHAoc291cmNlKTtcbiAgICB2YXIgcmVwbGFjZVJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UsICdnJyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nID09IG51bGwgPyAnJyA6ICcnICsgc3RyaW5nO1xuICAgICAgcmV0dXJuIHRlc3RSZWdleHAudGVzdChzdHJpbmcpID8gc3RyaW5nLnJlcGxhY2UocmVwbGFjZVJlZ2V4cCwgZXNjYXBlcikgOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgXy5lc2NhcGUgPSBjcmVhdGVFc2NhcGVyKGVzY2FwZU1hcCk7XG4gIF8udW5lc2NhcGUgPSBjcmVhdGVFc2NhcGVyKHVuZXNjYXBlTWFwKTtcblxuICAvLyBUcmF2ZXJzZXMgdGhlIGNoaWxkcmVuIG9mIGBvYmpgIGFsb25nIGBwYXRoYC4gSWYgYSBjaGlsZCBpcyBhIGZ1bmN0aW9uLCBpdFxuICAvLyBpcyBpbnZva2VkIHdpdGggaXRzIHBhcmVudCBhcyBjb250ZXh0LiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmluYWxcbiAgLy8gY2hpbGQsIG9yIGBmYWxsYmFja2AgaWYgYW55IGNoaWxkIGlzIHVuZGVmaW5lZC5cbiAgXy5yZXN1bHQgPSBmdW5jdGlvbihvYmosIHBhdGgsIGZhbGxiYWNrKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkocGF0aCkpIHBhdGggPSBbcGF0aF07XG4gICAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKGZhbGxiYWNrKSA/IGZhbGxiYWNrLmNhbGwob2JqKSA6IGZhbGxiYWNrO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IG9iaiA9PSBudWxsID8gdm9pZCAwIDogb2JqW3BhdGhbaV1dO1xuICAgICAgaWYgKHByb3AgPT09IHZvaWQgMCkge1xuICAgICAgICBwcm9wID0gZmFsbGJhY2s7XG4gICAgICAgIGkgPSBsZW5ndGg7IC8vIEVuc3VyZSB3ZSBkb24ndCBjb250aW51ZSBpdGVyYXRpbmcuXG4gICAgICB9XG4gICAgICBvYmogPSBfLmlzRnVuY3Rpb24ocHJvcCkgPyBwcm9wLmNhbGwob2JqKSA6IHByb3A7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgaW50ZWdlciBpZCAodW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIGNsaWVudCBzZXNzaW9uKS5cbiAgLy8gVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy5cbiAgdmFyIGlkQ291bnRlciA9IDA7XG4gIF8udW5pcXVlSWQgPSBmdW5jdGlvbihwcmVmaXgpIHtcbiAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuICB9O1xuXG4gIC8vIEJ5IGRlZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hhbmdlIHRoZVxuICAvLyBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gIF8udGVtcGxhdGVTZXR0aW5ncyA9IHtcbiAgICBldmFsdWF0ZTogLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICBpbnRlcnBvbGF0ZTogLzwlPShbXFxzXFxTXSs/KSU+L2csXG4gICAgZXNjYXBlOiAvPCUtKFtcXHNcXFNdKz8pJT4vZ1xuICB9O1xuXG4gIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW5cbiAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC5cbiAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87XG5cbiAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGFcbiAgLy8gc3RyaW5nIGxpdGVyYWwuXG4gIHZhciBlc2NhcGVzID0ge1xuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIHZhciBlc2NhcGVSZWdFeHAgPSAvXFxcXHwnfFxccnxcXG58XFx1MjAyOHxcXHUyMDI5L2c7XG5cbiAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiAnXFxcXCcgKyBlc2NhcGVzW21hdGNoXTtcbiAgfTtcblxuICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLlxuICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsXG4gIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLlxuICAvLyBOQjogYG9sZFNldHRpbmdzYCBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gIF8udGVtcGxhdGUgPSBmdW5jdGlvbih0ZXh0LCBzZXR0aW5ncywgb2xkU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzICYmIG9sZFNldHRpbmdzKSBzZXR0aW5ncyA9IG9sZFNldHRpbmdzO1xuICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7XG5cbiAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi5cbiAgICB2YXIgbWF0Y2hlciA9IFJlZ0V4cChbXG4gICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlXG4gICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpO1xuXG4gICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS5cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBzb3VyY2UgPSBcIl9fcCs9J1wiO1xuICAgIHRleHQucmVwbGFjZShtYXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9mZnNldCkge1xuICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShlc2NhcGVSZWdFeHAsIGVzY2FwZUNoYXIpO1xuICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgIGlmIChlc2NhcGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBlc2NhcGUgKyBcIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xcbidcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBpbnRlcnBvbGF0ZSArIFwiKSk9PW51bGw/Jyc6X190KStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGV2YWx1YXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZSArIFwiXFxuX19wKz0nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkb2JlIFZNcyBuZWVkIHRoZSBtYXRjaCByZXR1cm5lZCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG9mZnNldC5cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcbiAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS5cbiAgICBpZiAoIXNldHRpbmdzLnZhcmlhYmxlKSBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcXG4nICsgc291cmNlICsgJ31cXG4nO1xuXG4gICAgc291cmNlID0gXCJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJvdG90eXBlLmpvaW4sXCIgK1xuICAgICAgXCJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xcblwiICtcbiAgICAgIHNvdXJjZSArICdyZXR1cm4gX19wO1xcbic7XG5cbiAgICB2YXIgcmVuZGVyO1xuICAgIHRyeSB7XG4gICAgICByZW5kZXIgPSBuZXcgRnVuY3Rpb24oc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaicsICdfJywgc291cmNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIHJlbmRlci5jYWxsKHRoaXMsIGRhdGEsIF8pO1xuICAgIH07XG5cbiAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBzb3VyY2UgYXMgYSBjb252ZW5pZW5jZSBmb3IgcHJlY29tcGlsYXRpb24uXG4gICAgdmFyIGFyZ3VtZW50ID0gc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaic7XG4gICAgdGVtcGxhdGUuc291cmNlID0gJ2Z1bmN0aW9uKCcgKyBhcmd1bWVudCArICcpe1xcbicgKyBzb3VyY2UgKyAnfSc7XG5cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgLy8gQWRkIGEgXCJjaGFpblwiIGZ1bmN0aW9uLiBTdGFydCBjaGFpbmluZyBhIHdyYXBwZWQgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8uY2hhaW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfKG9iaik7XG4gICAgaW5zdGFuY2UuX2NoYWluID0gdHJ1ZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgLy8gT09QXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAvLyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdFxuICAvLyBjYW4gYmUgdXNlZCBPTy1zdHlsZS4gVGhpcyB3cmFwcGVyIGhvbGRzIGFsdGVyZWQgdmVyc2lvbnMgb2YgYWxsIHRoZVxuICAvLyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLlxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb250aW51ZSBjaGFpbmluZyBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgdmFyIGNoYWluUmVzdWx0ID0gZnVuY3Rpb24oaW5zdGFuY2UsIG9iaikge1xuICAgIHJldHVybiBpbnN0YW5jZS5fY2hhaW4gPyBfKG9iaikuY2hhaW4oKSA6IG9iajtcbiAgfTtcblxuICAvLyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubWl4aW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICBfLmVhY2goXy5mdW5jdGlvbnMob2JqKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdO1xuICAgICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF07XG4gICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIGZ1bmMuYXBwbHkoXywgYXJncykpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbiAgfTtcblxuICAvLyBBZGQgYWxsIG9mIHRoZSBVbmRlcnNjb3JlIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlciBvYmplY3QuXG4gIF8ubWl4aW4oXyk7XG5cbiAgLy8gQWRkIGFsbCBtdXRhdG9yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsncG9wJywgJ3B1c2gnLCAncmV2ZXJzZScsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9iaiA9IHRoaXMuX3dyYXBwZWQ7XG4gICAgICBtZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKChuYW1lID09PSAnc2hpZnQnIHx8IG5hbWUgPT09ICdzcGxpY2UnKSAmJiBvYmoubGVuZ3RoID09PSAwKSBkZWxldGUgb2JqWzBdO1xuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG9iaik7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFsbCBhY2Nlc3NvciBBcnJheSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIuXG4gIF8uZWFjaChbJ2NvbmNhdCcsICdqb2luJywgJ3NsaWNlJ10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBFeHRyYWN0cyB0aGUgcmVzdWx0IGZyb20gYSB3cmFwcGVkIGFuZCBjaGFpbmVkIG9iamVjdC5cbiAgXy5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JhcHBlZDtcbiAgfTtcblxuICAvLyBQcm92aWRlIHVud3JhcHBpbmcgcHJveHkgZm9yIHNvbWUgbWV0aG9kcyB1c2VkIGluIGVuZ2luZSBvcGVyYXRpb25zXG4gIC8vIHN1Y2ggYXMgYXJpdGhtZXRpYyBhbmQgSlNPTiBzdHJpbmdpZmljYXRpb24uXG4gIF8ucHJvdG90eXBlLnZhbHVlT2YgPSBfLnByb3RvdHlwZS50b0pTT04gPSBfLnByb3RvdHlwZS52YWx1ZTtcblxuICBfLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5fd3JhcHBlZCk7XG4gIH07XG5cbiAgLy8gQU1EIHJlZ2lzdHJhdGlvbiBoYXBwZW5zIGF0IHRoZSBlbmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBTUQgbG9hZGVyc1xuICAvLyB0aGF0IG1heSBub3QgZW5mb3JjZSBuZXh0LXR1cm4gc2VtYW50aWNzIG9uIG1vZHVsZXMuIEV2ZW4gdGhvdWdoIGdlbmVyYWxcbiAgLy8gcHJhY3RpY2UgZm9yIEFNRCByZWdpc3RyYXRpb24gaXMgdG8gYmUgYW5vbnltb3VzLCB1bmRlcnNjb3JlIHJlZ2lzdGVyc1xuICAvLyBhcyBhIG5hbWVkIG1vZHVsZSBiZWNhdXNlLCBsaWtlIGpRdWVyeSwgaXQgaXMgYSBiYXNlIGxpYnJhcnkgdGhhdCBpc1xuICAvLyBwb3B1bGFyIGVub3VnaCB0byBiZSBidW5kbGVkIGluIGEgdGhpcmQgcGFydHkgbGliLCBidXQgbm90IGJlIHBhcnQgb2ZcbiAgLy8gYW4gQU1EIGxvYWQgcmVxdWVzdC4gVGhvc2UgY2FzZXMgY291bGQgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhblxuICAvLyBhbm9ueW1vdXMgZGVmaW5lKCkgaXMgY2FsbGVkIG91dHNpZGUgb2YgYSBsb2FkZXIgcmVxdWVzdC5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKCd1bmRlcnNjb3JlJywgW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbn0oKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3VuZGVyc2NvcmUvdW5kZXJzY29yZS5qc1xuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xyXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHR9XHJcblx0cmV0dXJuIG1vZHVsZTtcclxufTtcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IENvbnN0IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7IEJvb3RzdHJhcENvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0cy9ib290c3RyYXAnO1xuaW1wb3J0IF8gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgQ2hlY2tCb3ggPSAoeyBjbGFzc05hbWUsIGNoZWNrZWQsIGluZGV0ZXJtaW5hdGUgfSkgPT4gKFxuICA8aW5wdXRcbiAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgIGNoZWNrZWQ9eyBjaGVja2VkIH1cbiAgICBjbGFzc05hbWU9eyBjbGFzc05hbWUgfVxuICAgIHJlZj17IChpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0KSBpbnB1dC5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIH0gfVxuICAgIG9uQ2hhbmdlPXsgKCkgPT4ge30gfVxuICAvPlxuKTtcblxuQ2hlY2tCb3gucHJvcFR5cGVzID0ge1xuICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBpbmRldGVybWluYXRlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdGlvbkhlYWRlckNlbGwgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG1vZGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBjaGVja2VkU3RhdHVzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9uQWxsUm93c1NlbGVjdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaGlkZVNlbGVjdEFsbDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc2VsZWN0aW9uSGVhZGVyUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGhlYWRlckNvbHVtblN0eWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pXG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaGFuZGxlQ2hlY2tCb3hDbGljayA9IHRoaXMuaGFuZGxlQ2hlY2tCb3hDbGljay5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGF2b2lkIHVwZGF0aW5nIGlmIGJ1dHRvbiBpc1xuICAgKiAxLiByYWRpb1xuICAgKiAyLiBzdGF0dXMgd2FzIG5vdCBjaGFuZ2VkLlxuICAgKi9cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgIGNvbnN0IHsgUk9XX1NFTEVDVF9TSU5HTEUgfSA9IENvbnN0O1xuICAgIGNvbnN0IHsgbW9kZSwgY2hlY2tlZFN0YXR1cyB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmIChtb2RlID09PSBST1dfU0VMRUNUX1NJTkdMRSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIG5leHRQcm9wcy5jaGVja2VkU3RhdHVzICE9PSBjaGVja2VkU3RhdHVzO1xuICB9XG5cbiAgaGFuZGxlQ2hlY2tCb3hDbGljayhlKSB7XG4gICAgY29uc3QgeyBvbkFsbFJvd3NTZWxlY3QsIGNoZWNrZWRTdGF0dXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaXNVblNlbGVjdCA9XG4gICAgICBjaGVja2VkU3RhdHVzID09PSBDb25zdC5DSEVDS0JPWF9TVEFUVVNfQ0hFQ0tFRCB8fFxuICAgICAgY2hlY2tlZFN0YXR1cyA9PT0gQ29uc3QuQ0hFQ0tCT1hfU1RBVFVTX0lOREVURVJNSU5BVEU7XG5cbiAgICBvbkFsbFJvd3NTZWxlY3QoZSwgaXNVblNlbGVjdCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgQ0hFQ0tCT1hfU1RBVFVTX0NIRUNLRUQsIENIRUNLQk9YX1NUQVRVU19JTkRFVEVSTUlOQVRFLCBST1dfU0VMRUNUX01VTFRJUExFXG4gICAgfSA9IENvbnN0O1xuXG4gICAgY29uc3Qge1xuICAgICAgbW9kZSxcbiAgICAgIGNoZWNrZWRTdGF0dXMsXG4gICAgICBzZWxlY3Rpb25IZWFkZXJSZW5kZXJlcixcbiAgICAgIGhpZGVTZWxlY3RBbGwsXG4gICAgICBoZWFkZXJDb2x1bW5TdHlsZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChoaWRlU2VsZWN0QWxsKSB7XG4gICAgICByZXR1cm4gPHRoIGRhdGEtcm93LXNlbGVjdGlvbiAvPjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja2VkID0gY2hlY2tlZFN0YXR1cyA9PT0gQ0hFQ0tCT1hfU1RBVFVTX0NIRUNLRUQ7XG5cbiAgICBjb25zdCBpbmRldGVybWluYXRlID0gY2hlY2tlZFN0YXR1cyA9PT0gQ0hFQ0tCT1hfU1RBVFVTX0lOREVURVJNSU5BVEU7XG5cbiAgICBjb25zdCBhdHRycyA9IHt9O1xuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChzZWxlY3Rpb25IZWFkZXJSZW5kZXJlciB8fCBtb2RlID09PSBST1dfU0VMRUNUX01VTFRJUExFKSB7XG4gICAgICBhdHRycy5vbkNsaWNrID0gdGhpcy5oYW5kbGVDaGVja0JveENsaWNrO1xuICAgIH1cblxuICAgIGF0dHJzLnN0eWxlID0gXy5pc0Z1bmN0aW9uKGhlYWRlckNvbHVtblN0eWxlKSA/XG4gICAgICBoZWFkZXJDb2x1bW5TdHlsZShjaGVja2VkU3RhdHVzKSA6XG4gICAgICBoZWFkZXJDb2x1bW5TdHlsZTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Qm9vdHN0cmFwQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge1xuICAgICAgICAgICh7IGJvb3RzdHJhcDQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkhlYWRlclJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBzZWxlY3Rpb25IZWFkZXJSZW5kZXJlcih7XG4gICAgICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgICAgICBjaGVja2VkLFxuICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFJPV19TRUxFQ1RfTVVMVElQTEUpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8Q2hlY2tCb3hcbiAgICAgICAgICAgICAgICAgIHsgLi4udGhpcy5wcm9wcyB9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXsgY2hlY2tlZCB9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9eyBib290c3RyYXA0ID8gJ3NlbGVjdGlvbi1pbnB1dC00JyA6ICcnIH1cbiAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU9eyBpbmRldGVybWluYXRlIH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInNlbGVjdGlvbi1jZWxsLWhlYWRlclwiIGRhdGEtcm93LXNlbGVjdGlvbiB7IC4uLmF0dHJzIH0+eyBjb250ZW50IH08L3RoPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvQm9vdHN0cmFwQ29udGV4dC5Db25zdW1lcj5cbiAgICApO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9yb3ctc2VsZWN0aW9uL3NlbGVjdGlvbi1oZWFkZXItY2VsbC5qcyIsIi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cbi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4cGFuc2lvbkhlYWRlckNlbGwgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGlzQW55RXhwYW5kczogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBvbkFsbFJvd0V4cGFuZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBleHBhbmRIZWFkZXJDb2x1bW5SZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmNcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVDaGVja0JveENsaWNrID0gdGhpcy5oYW5kbGVDaGVja0JveENsaWNrLmJpbmQodGhpcyk7XG4gIH1cblxuICBoYW5kbGVDaGVja0JveENsaWNrKGUpIHtcbiAgICBjb25zdCB7IGlzQW55RXhwYW5kcywgb25BbGxSb3dFeHBhbmQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBvbkFsbFJvd0V4cGFuZChlLCAhaXNBbnlFeHBhbmRzKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGlzQW55RXhwYW5kcywgZXhwYW5kSGVhZGVyQ29sdW1uUmVuZGVyZXIgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoZWNrQm94Q2xpY2tcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0aCBjbGFzc05hbWU9XCJleHBhbmQtY2VsbC1oZWFkZXJcIiBkYXRhLXJvdy1zZWxlY3Rpb24geyAuLi5hdHRycyB9PlxuICAgICAgICB7XG4gICAgICAgICAgZXhwYW5kSGVhZGVyQ29sdW1uUmVuZGVyZXIgP1xuICAgICAgICAgICAgZXhwYW5kSGVhZGVyQ29sdW1uUmVuZGVyZXIoeyBpc0FueUV4cGFuZHMgfSkgOlxuICAgICAgICAgICAgKGlzQW55RXhwYW5kcyA/ICcoLSknIDogJygrKScpXG4gICAgICAgIH1cbiAgICAgIDwvdGg+XG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93LWV4cGFuZC9leHBhbmQtaGVhZGVyLWNlbGwuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNlbGVjdGlvbkNvbnRleHQgZnJvbSAnLi4vY29udGV4dHMvc2VsZWN0aW9uLWNvbnRleHQnO1xuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnQgPT4gKCkgPT4gKFxuICA8U2VsZWN0aW9uQ29udGV4dC5Db25zdW1lcj5cbiAgICB7IHNlbGVjdFJvdyA9PiA8Q29tcG9uZW50IHsgLi4uc2VsZWN0Um93IH0gLz4gfVxuICA8L1NlbGVjdGlvbkNvbnRleHQuQ29uc3VtZXI+XG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93LXNlbGVjdGlvbi9zZWxlY3Rpb24taGVhZGVyLWNlbGwtY29uc3VtZXIuanMiLCJpbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBnZXRSb3dCeVJvd0lkIH0gZnJvbSAnLi9yb3dzJztcblxuZXhwb3J0IGNvbnN0IGlzQW55RXhwYW5kcyA9IChcbiAgZGF0YSxcbiAga2V5RmllbGQsXG4gIGV4cGFuZGVkID0gW11cbikgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCByb3dLZXkgPSBfLmdldChkYXRhW2ldLCBrZXlGaWVsZCk7XG4gICAgaWYgKHR5cGVvZiBleHBhbmRlZC5maW5kKHggPT4geCA9PT0gcm93S2V5KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwYW5kYWJsZUtleXMgPSAoZGF0YSwga2V5RmllbGQsIHNraXBzID0gW10pID0+IHtcbiAgaWYgKHNraXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBkYXRhLm1hcChyb3cgPT4gXy5nZXQocm93LCBrZXlGaWVsZCkpO1xuICB9XG4gIHJldHVybiBkYXRhXG4gICAgLmZpbHRlcihyb3cgPT4gIV8uY29udGFpbnMoc2tpcHMsIF8uZ2V0KHJvdywga2V5RmllbGQpKSlcbiAgICAubWFwKHJvdyA9PiBfLmdldChyb3csIGtleUZpZWxkKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwYW5kZWRSb3dzID0gKGRhdGEsIGtleUZpZWxkLCBleHBhbmRlZCkgPT5cbiAgZXhwYW5kZWQubWFwKGsgPT4gZ2V0Um93QnlSb3dJZChkYXRhLCBrZXlGaWVsZCwgaykpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvc3RvcmUvZXhwYW5kLmpzIiwiaW1wb3J0IF8gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Um93QnlSb3dJZCB9IGZyb20gJy4vcm93cyc7XG5cbmV4cG9ydCBjb25zdCBlZGl0Q2VsbCA9IChkYXRhLCBrZXlGaWVsZCwgcm93SWQsIGRhdGFGaWVsZCwgbmV3VmFsdWUpID0+IHtcbiAgY29uc3Qgcm93ID0gZ2V0Um93QnlSb3dJZChkYXRhLCBrZXlGaWVsZCwgcm93SWQpO1xuICBpZiAocm93KSBfLnNldChyb3csIGRhdGFGaWVsZCwgbmV3VmFsdWUpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3N0b3JlL211dGF0ZS5qcyIsIi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuLyogZXNsaW50IG5vLWxvbmVseS1pZjogMCAqL1xuLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiAwICovXG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgQ29uc3QgZnJvbSAnLi4vY29uc3QnO1xuXG5mdW5jdGlvbiBjb21wYXJhdG9yKGEsIGIpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBiID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdCA9IGIubG9jYWxlQ29tcGFyZShhKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBhID4gYiA/IC0xIDogKChhIDwgYikgPyAxIDogMCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHNvcnQgPSAoZGF0YSwgc29ydE9yZGVyLCB7IGRhdGFGaWVsZCwgc29ydEZ1bmMsIHNvcnRWYWx1ZSB9KSA9PiB7XG4gIGNvbnN0IF9kYXRhID0gWy4uLmRhdGFdO1xuICBfZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBsZXQgdmFsdWVBID0gXy5nZXQoYSwgZGF0YUZpZWxkKTtcbiAgICBsZXQgdmFsdWVCID0gXy5nZXQoYiwgZGF0YUZpZWxkKTtcbiAgICBpZiAoc29ydFZhbHVlKSB7XG4gICAgICB2YWx1ZUEgPSBzb3J0VmFsdWUodmFsdWVBLCBhKTtcbiAgICAgIHZhbHVlQiA9IHNvcnRWYWx1ZSh2YWx1ZUIsIGIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZUEgPSBfLmlzRGVmaW5lZCh2YWx1ZUEpID8gdmFsdWVBIDogJyc7XG4gICAgICB2YWx1ZUIgPSBfLmlzRGVmaW5lZCh2YWx1ZUIpID8gdmFsdWVCIDogJyc7XG4gICAgfVxuXG4gICAgaWYgKHNvcnRGdW5jKSB7XG4gICAgICByZXN1bHQgPSBzb3J0RnVuYyh2YWx1ZUEsIHZhbHVlQiwgc29ydE9yZGVyLCBkYXRhRmllbGQsIGEsIGIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc29ydE9yZGVyID09PSBDb25zdC5TT1JUX0RFU0MpIHtcbiAgICAgICAgcmVzdWx0ID0gY29tcGFyYXRvcih2YWx1ZUEsIHZhbHVlQik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjb21wYXJhdG9yKHZhbHVlQiwgdmFsdWVBKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG4gIHJldHVybiBfZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXh0T3JkZXIgPSAoXG4gIGN1cnJlbnRTb3J0Q29sdW1uLFxuICB7IHNvcnRPcmRlciwgc29ydENvbHVtbiB9LFxuICBkZWZhdWx0T3JkZXIgPSBDb25zdC5TT1JUX0RFU0NcbikgPT4ge1xuICBpZiAoIXNvcnRDb2x1bW4gfHwgY3VycmVudFNvcnRDb2x1bW4uZGF0YUZpZWxkICE9PSBzb3J0Q29sdW1uLmRhdGFGaWVsZCkgcmV0dXJuIGRlZmF1bHRPcmRlcjtcbiAgcmV0dXJuIHNvcnRPcmRlciA9PT0gQ29uc3QuU09SVF9ERVNDID8gQ29uc3QuU09SVF9BU0MgOiBDb25zdC5TT1JUX0RFU0M7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvc3RvcmUvc29ydC5qcyIsImltcG9ydCBDb25zdCBmcm9tICcuLi9jb25zdCc7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ29udmVydCA9ICh0eXBlLCB2YWx1ZSkgPT4ge1xuICBpZiAodHlwZSA9PT0gQ29uc3QuVFlQRV9TVFJJTkcpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBDb25zdC5UWVBFX05VTUJFUikge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IENvbnN0LlRZUEVfQk9PTEVBTikge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBDb25zdC5UWVBFX0RBVEUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3N0b3JlL3R5cGUuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEV4cGFuc2lvbkNvbnRleHQgZnJvbSAnLi4vY29udGV4dHMvcm93LWV4cGFuZC1jb250ZXh0JztcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50ID0+ICgpID0+IChcbiAgPEV4cGFuc2lvbkNvbnRleHQuQ29uc3VtZXI+XG4gICAgeyBleHBhbmRSb3cgPT4gPENvbXBvbmVudCB7IC4uLmV4cGFuZFJvdyB9IC8+IH1cbiAgPC9FeHBhbnNpb25Db250ZXh0LkNvbnN1bWVyPlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1leHBhbmQvZXhwYW5kLWhlYWRlci1jZWxsLWNvbnN1bWVyLmpzIiwiLyogZXNsaW50IHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wczogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBGaWx0ZXJzQ2VsbCBmcm9tICcuL2ZpbHRlcnMtY2VsbCc7XG5pbXBvcnQgQ29uc3QgZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQgUm93VGVtcGxhdGUgZnJvbSAnLi9yb3cvcm93LXRlbXBsYXRlJztcblxuY29uc3QgRmlsdGVycyA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgY29sdW1ucyxcbiAgICBvbkZpbHRlcixcbiAgICBjdXJyRmlsdGVycyxcbiAgICBmaWx0ZXJQb3NpdGlvbixcbiAgICBvbkV4dGVybmFsRmlsdGVyLFxuICAgIGNsYXNzTmFtZSxcbiAgICBzZWxlY3RSb3csXG4gICAgZXhwYW5kUm93XG4gIH0gPSBwcm9wcztcblxuICBmdW5jdGlvbiByZW5kZXJDb250ZW50KCkge1xuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSBbXTtcbiAgICBsZXQgc2hvd0ZpbHRlcnNSb3cgPSBmYWxzZTtcblxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICBmaWx0ZXJDb2x1bW5zLnB1c2goPEZpbHRlcnNDZWxsXG4gICAgICAgIGluZGV4PXsgaSB9XG4gICAgICAgIGtleT17IGNvbHVtbi5kYXRhRmllbGQgfVxuICAgICAgICBjb2x1bW49eyBjb2x1bW4gfVxuICAgICAgICBjdXJyRmlsdGVycz17IGN1cnJGaWx0ZXJzIH1cbiAgICAgICAgb25FeHRlcm5hbEZpbHRlcj17IG9uRXh0ZXJuYWxGaWx0ZXIgfVxuICAgICAgICBvbkZpbHRlcj17IG9uRmlsdGVyIH1cbiAgICAgIC8+KTtcblxuICAgICAgaWYgKGNvbHVtbi5maWx0ZXJSZW5kZXJlciB8fCBjb2x1bW4uZmlsdGVyKSB7XG4gICAgICAgIGlmICghc2hvd0ZpbHRlcnNSb3cpIHtcbiAgICAgICAgICBzaG93RmlsdGVyc1JvdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyQ29sdW1ucztcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPHRib2R5XG4gICAgICBjbGFzc05hbWU9eyBjbGFzc05hbWUgfVxuICAgICAgc3R5bGU9eyB7XG4gICAgICAgIGRpc3BsYXk6XG4gICAgICAgIGZpbHRlclBvc2l0aW9uID09PSBDb25zdC5GSUxURVJTX1BPU0lUSU9OX1RPUFxuICAgICAgICAgID8gJ3RhYmxlLWhlYWRlci1ncm91cCdcbiAgICAgICAgICA6ICd0YWJsZS1mb290ZXItZ3JvdXAnXG4gICAgICB9IH1cbiAgICA+XG4gICAgICA8Um93VGVtcGxhdGVcbiAgICAgICAgcmVuZGVyQ29udGVudD17IHJlbmRlckNvbnRlbnQgfVxuICAgICAgICBzZWxlY3RSb3c9eyBzZWxlY3RSb3cgfVxuICAgICAgICBleHBhbmRSb3c9eyBleHBhbmRSb3cgfVxuICAgICAgICBjZWxsRWw9XCJ0ZFwiXG4gICAgICAvPlxuICAgIDwvdGJvZHk+XG4gICk7XG59O1xuXG5GaWx0ZXJzLnByb3BUeXBlcyA9IHtcbiAgY29sdW1uczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIG9uRmlsdGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgZmlsdGVyUG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9UT1AsXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9JTkxJTkUsXG4gICAgQ29uc3QuRklMVEVSU19QT1NJVElPTl9CT1RUT01cbiAgXSksXG4gIGN1cnJGaWx0ZXJzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkV4dGVybmFsRmlsdGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzZWxlY3RSb3c6IFByb3BUeXBlcy5vYmplY3QsXG4gIGV4cGFuZFJvdzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuRmlsdGVycy5kZWZhdWx0UHJvcHMgPSB7XG4gIHBvc2l0aW9uOiBDb25zdC5GSUxURVJTX1BPU0lUSU9OX1RPUFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsdGVycztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2ZpbHRlcnMuanMiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBfIGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBGaWx0ZXJzQ2VsbCA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgaW5kZXgsIGNvbHVtbiwgb25FeHRlcm5hbEZpbHRlcixcbiAgICBjdXJyRmlsdGVycywgb25GaWx0ZXJcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7IGZpbHRlclJlbmRlcmVyLCBmaWx0ZXIgfSA9IGNvbHVtbjtcbiAgbGV0IGZpbHRlckVsbTtcbiAgY29uc3QgY2VsbEF0dHJzID0ge307XG4gIGNvbnN0IGNlbGxTdHlsZSA9IHt9O1xuICBjZWxsQXR0cnMuc3R5bGUgPSBjZWxsU3R5bGU7XG4gIGlmIChjb2x1bW4uaGVhZGVyQWxpZ24pIHtcbiAgICBjZWxsU3R5bGUudGV4dEFsaWduID0gXy5pc0Z1bmN0aW9uKGNvbHVtbi5oZWFkZXJBbGlnbilcbiAgICAgID8gY29sdW1uLmhlYWRlckFsaWduKGNvbHVtbiwgaW5kZXgpXG4gICAgICA6IGNvbHVtbi5oZWFkZXJBbGlnbjtcbiAgfVxuICBpZiAoY29sdW1uLmZpbHRlclJlbmRlcmVyKSB7XG4gICAgY29uc3Qgb25DdXN0b21GaWx0ZXIgPSBvbkV4dGVybmFsRmlsdGVyKGNvbHVtbiwgZmlsdGVyLnByb3BzLnR5cGUpO1xuICAgIGZpbHRlckVsbSA9IGZpbHRlclJlbmRlcmVyKG9uQ3VzdG9tRmlsdGVyLCBjb2x1bW4pO1xuICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgIGZpbHRlckVsbSA9IChcbiAgICAgIDxmaWx0ZXIuRmlsdGVyXG4gICAgICAgIHsgLi4uZmlsdGVyLnByb3BzIH1cbiAgICAgICAgZmlsdGVyU3RhdGU9eyBjdXJyRmlsdGVyc1tjb2x1bW4uZGF0YUZpZWxkXSB9XG4gICAgICAgIG9uRmlsdGVyPXsgb25GaWx0ZXIgfVxuICAgICAgICBjb2x1bW49eyBjb2x1bW4gfVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCd0aCcsIGNlbGxBdHRycywgZmlsdGVyRWxtKTtcbn07XG5cbkZpbHRlcnNDZWxsLnByb3BUeXBlcyA9IHtcbiAgaW5kZXg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgY29sdW1uOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGN1cnJGaWx0ZXJzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIG9uRmlsdGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FeHRlcm5hbEZpbHRlcjogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbkZpbHRlcnNDZWxsLmRlZmF1bHRQcm9wcyA9IHtcbiAgb25GaWx0ZXI6ICgpID0+IHsgfSxcbiAgb25FeHRlcm5hbEZpbHRlcjogKCkgPT4geyB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJzQ2VsbDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2ZpbHRlcnMtY2VsbC5qcyIsIi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCBDYXB0aW9uID0gKHByb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuY2hpbGRyZW4pIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGNhcHRpb24gPSBwcm9wcy5ib290c3RyYXA0ID8gKFxuICAgIDxjYXB0aW9uIHN0eWxlPXsgeyBjYXB0aW9uU2lkZTogJ3RvcCcgfSB9Pntwcm9wcy5jaGlsZHJlbn08L2NhcHRpb24+XG4gICkgOiAoXG4gICAgPGNhcHRpb24+e3Byb3BzLmNoaWxkcmVufTwvY2FwdGlvbj5cbiAgKTtcblxuICByZXR1cm4gY2FwdGlvbjtcbn07XG5cbkNhcHRpb24ucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm5vZGUsXG4gICAgUHJvcFR5cGVzLnN0cmluZ1xuICBdKSxcbiAgYm9vdHN0cmFwNDogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENhcHRpb247XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9jYXB0aW9uLmpzIiwiLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBfIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IFNpbXBsZVJvdyBmcm9tICcuL3Jvdy9zaW1wbGUtcm93JztcbmltcG9ydCBSb3dBZ2dyZWdhdG9yIGZyb20gJy4vcm93L2FnZ3JlZ2F0ZS1yb3cnO1xuaW1wb3J0IFJvd1NlY3Rpb24gZnJvbSAnLi9yb3cvcm93LXNlY3Rpb24nO1xuaW1wb3J0IENvbnN0IGZyb20gJy4vY29uc3QnO1xuaW1wb3J0IHdpdGhSb3dTZWxlY3Rpb24gZnJvbSAnLi9yb3ctc2VsZWN0aW9uL3Jvdy1jb25zdW1lcic7XG5pbXBvcnQgd2l0aFJvd0V4cGFuc2lvbiBmcm9tICcuL3Jvdy1leHBhbmQvcm93LWNvbnN1bWVyJztcblxuY2xhc3MgQm9keSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIGNvbnN0IHtcbiAgICAgIGtleUZpZWxkLFxuICAgICAgY2VsbEVkaXQsXG4gICAgICBzZWxlY3RSb3csXG4gICAgICBleHBhbmRSb3dcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBDb25zdHJ1Y3QgRWRpdGluZyBDZWxsIENvbXBvbmVudFxuICAgIGlmIChjZWxsRWRpdC5jcmVhdGVDb250ZXh0KSB7XG4gICAgICB0aGlzLkVkaXRpbmdDZWxsID0gY2VsbEVkaXQuY3JlYXRlRWRpdGluZ0NlbGwoXywgY2VsbEVkaXQub3B0aW9ucy5vblN0YXJ0RWRpdCk7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IFJvdyBDb21wb25lbnRcbiAgICBsZXQgUm93Q29tcG9uZW50ID0gU2ltcGxlUm93O1xuICAgIGNvbnN0IHNlbGVjdFJvd0VuYWJsZWQgPSBzZWxlY3RSb3cubW9kZSAhPT0gQ29uc3QuUk9XX1NFTEVDVF9ESVNBQkxFRDtcbiAgICBjb25zdCBleHBhbmRSb3dFbmFibGVkID0gISFleHBhbmRSb3cucmVuZGVyZXI7XG5cbiAgICBpZiAoZXhwYW5kUm93RW5hYmxlZCkge1xuICAgICAgUm93Q29tcG9uZW50ID0gd2l0aFJvd0V4cGFuc2lvbihSb3dBZ2dyZWdhdG9yKTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0Um93RW5hYmxlZCkge1xuICAgICAgUm93Q29tcG9uZW50ID0gd2l0aFJvd1NlbGVjdGlvbihleHBhbmRSb3dFbmFibGVkID8gUm93Q29tcG9uZW50IDogUm93QWdncmVnYXRvcik7XG4gICAgfVxuXG4gICAgaWYgKGNlbGxFZGl0LmNyZWF0ZUNvbnRleHQpIHtcbiAgICAgIFJvd0NvbXBvbmVudCA9IGNlbGxFZGl0LndpdGhSb3dMZXZlbENlbGxFZGl0KFJvd0NvbXBvbmVudCwgc2VsZWN0Um93RW5hYmxlZCwga2V5RmllbGQsIF8pO1xuICAgIH1cbiAgICB0aGlzLlJvd0NvbXBvbmVudCA9IFJvd0NvbXBvbmVudDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb2x1bW5zLFxuICAgICAgZGF0YSxcbiAgICAgIHRhYkluZGV4Q2VsbCxcbiAgICAgIGtleUZpZWxkLFxuICAgICAgaXNFbXB0eSxcbiAgICAgIG5vRGF0YUluZGljYXRpb24sXG4gICAgICB2aXNpYmxlQ29sdW1uU2l6ZSxcbiAgICAgIGNlbGxFZGl0LFxuICAgICAgc2VsZWN0Um93LFxuICAgICAgcm93U3R5bGUsXG4gICAgICByb3dDbGFzc2VzLFxuICAgICAgcm93RXZlbnRzLFxuICAgICAgZXhwYW5kUm93LFxuICAgICAgY2xhc3NOYW1lXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBsZXQgY29udGVudDtcblxuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICBjb25zdCBpbmRpY2F0aW9uID0gXy5pc0Z1bmN0aW9uKG5vRGF0YUluZGljYXRpb24pID8gbm9EYXRhSW5kaWNhdGlvbigpIDogbm9EYXRhSW5kaWNhdGlvbjtcbiAgICAgIGlmICghaW5kaWNhdGlvbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSA8Um93U2VjdGlvbiBjb250ZW50PXsgaW5kaWNhdGlvbiB9IGNvbFNwYW49eyB2aXNpYmxlQ29sdW1uU2l6ZSB9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWxlY3RSb3dFbmFibGVkID0gc2VsZWN0Um93Lm1vZGUgIT09IENvbnN0LlJPV19TRUxFQ1RfRElTQUJMRUQ7XG4gICAgICBjb25zdCBleHBhbmRSb3dFbmFibGVkID0gISFleHBhbmRSb3cucmVuZGVyZXI7XG5cbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxSb3dQcm9wcyA9IHt9O1xuXG4gICAgICBpZiAoY2VsbEVkaXQuY3JlYXRlQ29udGV4dCkge1xuICAgICAgICBhZGRpdGlvbmFsUm93UHJvcHMuRWRpdGluZ0NlbGxDb21wb25lbnQgPSB0aGlzLkVkaXRpbmdDZWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0Um93RW5hYmxlZCB8fCBleHBhbmRSb3dFbmFibGVkKSB7XG4gICAgICAgIGFkZGl0aW9uYWxSb3dQcm9wcy5leHBhbmRSb3cgPSBleHBhbmRSb3c7XG4gICAgICAgIGFkZGl0aW9uYWxSb3dQcm9wcy5zZWxlY3RSb3cgPSBzZWxlY3RSb3c7XG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQgPSBkYXRhLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBfLmdldChyb3csIGtleUZpZWxkKTtcbiAgICAgICAgY29uc3QgYmFzZVJvd1Byb3BzID0ge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgdGFiSW5kZXhDZWxsLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAga2V5RmllbGQsXG4gICAgICAgICAgY2VsbEVkaXQsXG4gICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICByb3dJbmRleDogaW5kZXgsXG4gICAgICAgICAgdmlzaWJsZUNvbHVtblNpemUsXG4gICAgICAgICAgYXR0cnM6IHJvd0V2ZW50cyB8fCB7fSxcbiAgICAgICAgICAuLi5hZGRpdGlvbmFsUm93UHJvcHNcbiAgICAgICAgfTtcblxuICAgICAgICBiYXNlUm93UHJvcHMuc3R5bGUgPSBfLmlzRnVuY3Rpb24ocm93U3R5bGUpID8gcm93U3R5bGUocm93LCBpbmRleCkgOiByb3dTdHlsZTtcbiAgICAgICAgYmFzZVJvd1Byb3BzLmNsYXNzTmFtZSA9IChfLmlzRnVuY3Rpb24ocm93Q2xhc3NlcykgPyByb3dDbGFzc2VzKHJvdywgaW5kZXgpIDogcm93Q2xhc3Nlcyk7XG5cbiAgICAgICAgcmV0dXJuIDx0aGlzLlJvd0NvbXBvbmVudCB7IC4uLmJhc2VSb3dQcm9wcyB9IC8+O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0Ym9keSBjbGFzc05hbWU9eyBjbGFzc05hbWUgfT57IGNvbnRlbnQgfTwvdGJvZHk+XG4gICAgKTtcbiAgfVxufVxuXG5Cb2R5LnByb3BUeXBlcyA9IHtcbiAga2V5RmllbGQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZGF0YTogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGNvbHVtbnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICBzZWxlY3RSb3c6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJvZHk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9ib2R5LmpzIiwiLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbi8qIGVzbGludCByZWFjdC9uby1hcnJheS1pbmRleC1rZXk6IDAgKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgUm93UHVyZUNvbnRlbnQgZnJvbSAnLi9yb3ctcHVyZS1jb250ZW50JztcbmltcG9ydCBldmVudERlbGVnYXRlciBmcm9tICcuL2V2ZW50LWRlbGVnYXRlcic7XG5pbXBvcnQgc2hvdWxkVXBkYXRlciBmcm9tICcuL3Nob3VsZC11cGRhdGVyJztcblxuY2xhc3MgU2ltcGxlUm93IGV4dGVuZHMgc2hvdWxkVXBkYXRlcihldmVudERlbGVnYXRlcihDb21wb25lbnQpKSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc2hvdWxkVXBkYXRlUm93Q29udGVudCA9IGZhbHNlO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgIHRoaXMuc2hvdWxkVXBkYXRlUm93Q29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvdWxkVXBkYXRlUm93Q29udGVudCA9IHRoaXMuc2hvdWxkUm93Q29udGVudFVwZGF0ZShuZXh0UHJvcHMpO1xuICAgIGlmICh0aGlzLnNob3VsZFVwZGF0ZVJvd0NvbnRlbnQpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXMuc2hvdWxkVXBkYXRlZEJ5U2VsZlByb3BzKG5leHRQcm9wcyk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc3R5bGUsXG4gICAgICBhdHRycyxcbiAgICAgIHZpc2libGVDb2x1bW5TaXplLFxuICAgICAgdGFiSW5kZXhDZWxsLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHRyQXR0cnMgPSB0aGlzLmRlbGVnYXRlKGF0dHJzKTtcbiAgICBjb25zdCB0YWJJbmRleFN0YXJ0ID0gKHRoaXMucHJvcHMucm93SW5kZXggKiB2aXNpYmxlQ29sdW1uU2l6ZSkgKyAxO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0ciBzdHlsZT17IHN0eWxlIH0gY2xhc3NOYW1lPXsgY2xhc3NOYW1lIH0geyAuLi50ckF0dHJzIH0+XG4gICAgICAgIDxSb3dQdXJlQ29udGVudFxuICAgICAgICAgIHNob3VsZFVwZGF0ZT17IHRoaXMuc2hvdWxkVXBkYXRlUm93Q29udGVudCB9XG4gICAgICAgICAgdGFiSW5kZXhTdGFydD17IHRhYkluZGV4Q2VsbCA/IHRhYkluZGV4U3RhcnQgOiAtMSB9XG4gICAgICAgICAgeyAuLi5yZXN0IH1cbiAgICAgICAgLz5cbiAgICAgIDwvdHI+XG4gICAgKTtcbiAgfVxufVxuXG5TaW1wbGVSb3cucHJvcFR5cGVzID0ge1xuICByb3c6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgcm93SW5kZXg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgY29sdW1uczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGF0dHJzOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5TaW1wbGVSb3cuZGVmYXVsdFByb3BzID0ge1xuICBlZGl0YWJsZTogdHJ1ZSxcbiAgc3R5bGU6IHt9LFxuICBjbGFzc05hbWU6IG51bGwsXG4gIGF0dHJzOiB7fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2ltcGxlUm93O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L3NpbXBsZS1yb3cuanMiLCIvKiBlc2xpbnQgcmVhY3QvcHJvcC10eXBlczogMCAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBldmVudERlbGVnYXRlciBmcm9tICcuL2NlbGwtZXZlbnQtZGVsZWdhdGVyJztcbmltcG9ydCBfIGZyb20gJy4vdXRpbHMnO1xuXG5jbGFzcyBDZWxsIGV4dGVuZHMgZXZlbnREZWxlZ2F0ZXIoQ29tcG9uZW50KSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuY3JlYXRlSGFuZGxlRWRpdGluZ0NlbGwgPSB0aGlzLmNyZWF0ZUhhbmRsZUVkaXRpbmdDZWxsLmJpbmQodGhpcyk7XG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGlmIChuZXh0UHJvcHMuY29sdW1uLmlzRHVtbXlGaWVsZCkge1xuICAgICAgc2hvdWxkVXBkYXRlID0gIV8uaXNFcXVhbCh0aGlzLnByb3BzLnJvdywgbmV4dFByb3BzLnJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFVwZGF0ZSA9XG4gICAgICAgIF8uZ2V0KHRoaXMucHJvcHMucm93LCB0aGlzLnByb3BzLmNvbHVtbi5kYXRhRmllbGQpXG4gICAgICAgICAgIT09IF8uZ2V0KG5leHRQcm9wcy5yb3csIG5leHRQcm9wcy5jb2x1bW4uZGF0YUZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIGlmIChuZXh0UHJvcHMuZm9ybWF0dGVyKVxuXG4gICAgc2hvdWxkVXBkYXRlID1cbiAgICAgIChuZXh0UHJvcHMuY29sdW1uLmZvcm1hdHRlciA/ICFfLmlzRXF1YWwodGhpcy5wcm9wcy5yb3csIG5leHRQcm9wcy5yb3cpIDogZmFsc2UpIHx8XG4gICAgICB0aGlzLnByb3BzLmNvbHVtbi5oaWRkZW4gIT09IG5leHRQcm9wcy5jb2x1bW4uaGlkZGVuIHx8XG4gICAgICB0aGlzLnByb3BzLmNvbHVtbi5pc0R1bW15RmllbGQgIT09IG5leHRQcm9wcy5jb2x1bW4uaXNEdW1teUZpZWxkIHx8XG4gICAgICB0aGlzLnByb3BzLnJvd0luZGV4ICE9PSBuZXh0UHJvcHMucm93SW5kZXggfHxcbiAgICAgIHRoaXMucHJvcHMuY29sdW1uSW5kZXggIT09IG5leHRQcm9wcy5jb2x1bW5JbmRleCB8fFxuICAgICAgdGhpcy5wcm9wcy5jbGFzc05hbWUgIT09IG5leHRQcm9wcy5jbGFzc05hbWUgfHxcbiAgICAgIHRoaXMucHJvcHMudGl0bGUgIT09IG5leHRQcm9wcy50aXRsZSB8fFxuICAgICAgdGhpcy5wcm9wcy5lZGl0YWJsZSAhPT0gbmV4dFByb3BzLmVkaXRhYmxlIHx8XG4gICAgICB0aGlzLnByb3BzLmNsaWNrVG9FZGl0ICE9PSBuZXh0UHJvcHMuY2xpY2tUb0VkaXQgfHxcbiAgICAgIHRoaXMucHJvcHMuZGJjbGlja1RvRWRpdCAhPT0gbmV4dFByb3BzLmRiY2xpY2tUb0VkaXQgfHxcbiAgICAgICFfLmlzRXF1YWwodGhpcy5wcm9wcy5zdHlsZSwgbmV4dFByb3BzLnN0eWxlKSB8fFxuICAgICAgIV8uaXNFcXVhbCh0aGlzLnByb3BzLmNvbHVtbi5mb3JtYXRFeHRyYURhdGEsIG5leHRQcm9wcy5jb2x1bW4uZm9ybWF0RXh0cmFEYXRhKSB8fFxuICAgICAgIV8uaXNFcXVhbCh0aGlzLnByb3BzLmNvbHVtbi5ldmVudHMsIG5leHRQcm9wcy5jb2x1bW4uZXZlbnRzKSB8fFxuICAgICAgIV8uaXNFcXVhbCh0aGlzLnByb3BzLmNvbHVtbi5hdHRycywgbmV4dFByb3BzLmNvbHVtbi5hdHRycykgfHxcbiAgICAgIHRoaXMucHJvcHMudGFiSW5kZXggIT09IG5leHRQcm9wcy50YWJJbmRleDtcbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgY3JlYXRlSGFuZGxlRWRpdGluZ0NlbGwgPSBvcmlnaW5GdW5jID0+IChlKSA9PiB7XG4gICAgY29uc3QgeyBvblN0YXJ0LCByb3dJbmRleCwgY29sdW1uSW5kZXgsIGNsaWNrVG9FZGl0LCBkYmNsaWNrVG9FZGl0IH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICgoY2xpY2tUb0VkaXQgfHwgZGJjbGlja1RvRWRpdCkgJiYgXy5pc0Z1bmN0aW9uKG9yaWdpbkZ1bmMpKSB7XG4gICAgICBvcmlnaW5GdW5jKGUpO1xuICAgIH1cbiAgICBpZiAob25TdGFydCkge1xuICAgICAgb25TdGFydChyb3dJbmRleCwgY29sdW1uSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICByb3csXG4gICAgICByb3dJbmRleCxcbiAgICAgIGNvbHVtbixcbiAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgb25TdGFydCxcbiAgICAgIGVkaXRhYmxlLFxuICAgICAgY2xpY2tUb0VkaXQsXG4gICAgICBkYmNsaWNrVG9FZGl0LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGFGaWVsZCxcbiAgICAgIGZvcm1hdHRlcixcbiAgICAgIGZvcm1hdEV4dHJhRGF0YVxuICAgIH0gPSBjb2x1bW47XG4gICAgY29uc3QgYXR0cnMgPSB0aGlzLmRlbGVnYXRlKHsgLi4ucmVzdCB9KTtcbiAgICBsZXQgY29udGVudCA9IGNvbHVtbi5pc0R1bW15RmllbGQgPyBudWxsIDogXy5nZXQocm93LCBkYXRhRmllbGQpO1xuXG4gICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgY29udGVudCA9IGNvbHVtbi5mb3JtYXR0ZXIoY29udGVudCwgcm93LCByb3dJbmRleCwgZm9ybWF0RXh0cmFEYXRhKTtcbiAgICB9XG5cbiAgICBpZiAoY2xpY2tUb0VkaXQgJiYgZWRpdGFibGUpIHtcbiAgICAgIGF0dHJzLm9uQ2xpY2sgPSB0aGlzLmNyZWF0ZUhhbmRsZUVkaXRpbmdDZWxsKGF0dHJzLm9uQ2xpY2spO1xuICAgIH0gZWxzZSBpZiAoZGJjbGlja1RvRWRpdCAmJiBlZGl0YWJsZSkge1xuICAgICAgYXR0cnMub25Eb3VibGVDbGljayA9IHRoaXMuY3JlYXRlSGFuZGxlRWRpdGluZ0NlbGwoYXR0cnMub25Eb3VibGVDbGljayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZCB7IC4uLmF0dHJzIH0+XG4gICAgICAgIHsgdHlwZW9mIGNvbnRlbnQgPT09ICdib29sZWFuJyA/IGAke2NvbnRlbnR9YCA6IGNvbnRlbnQgfVxuICAgICAgPC90ZD5cbiAgICApO1xuICB9XG59XG5cbkNlbGwucHJvcFR5cGVzID0ge1xuICByb3c6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgcm93SW5kZXg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgY29sdW1uOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGNvbHVtbkluZGV4OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENlbGw7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9jZWxsLmpzIiwiLyogZXNsaW50IGNsYXNzLW1ldGhvZHMtdXNlLXRoaXM6IDAgKi9cbi8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOiAwICovXG4vKiBlc2xpbnQgbm8tcGx1c3BsdXM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IF8gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4cGFuZENlbGwgZnJvbSAnLi4vcm93LWV4cGFuZC9leHBhbmQtY2VsbCc7XG5pbXBvcnQgU2VsZWN0aW9uQ2VsbCBmcm9tICcuLi9yb3ctc2VsZWN0aW9uL3NlbGVjdGlvbi1jZWxsJztcbmltcG9ydCBzaG91bGRVcGRhdGVyIGZyb20gJy4vc2hvdWxkLXVwZGF0ZXInO1xuaW1wb3J0IGV2ZW50RGVsZWdhdGVyIGZyb20gJy4vZXZlbnQtZGVsZWdhdGVyJztcbmltcG9ydCBSb3dQdXJlQ29udGVudCBmcm9tICcuL3Jvdy1wdXJlLWNvbnRlbnQnO1xuaW1wb3J0IENvbnN0IGZyb20gJy4uL2NvbnN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm93QWdncmVnYXRvciBleHRlbmRzIHNob3VsZFVwZGF0ZXIoZXZlbnREZWxlZ2F0ZXIoUmVhY3QuQ29tcG9uZW50KSkge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGF0dHJzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGF0dHJzOiB7fSxcbiAgICBzdHlsZToge31cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuY2xpY2tOdW0gPSAwO1xuICAgIHRoaXMuc2hvdWxkVXBkYXRlUm93Q29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuY3JlYXRlQ2xpY2tFdmVudEhhbmRsZXIgPSB0aGlzLmNyZWF0ZUNsaWNrRXZlbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RlZCAhPT0gbmV4dFByb3BzLnNlbGVjdGVkIHx8XG4gICAgICB0aGlzLnByb3BzLmV4cGFuZGVkICE9PSBuZXh0UHJvcHMuZXhwYW5kZWQgfHxcbiAgICAgIHRoaXMucHJvcHMuZXhwYW5kYWJsZSAhPT0gbmV4dFByb3BzLmV4cGFuZGFibGUgfHxcbiAgICAgIHRoaXMucHJvcHMuc2VsZWN0YWJsZSAhPT0gbmV4dFByb3BzLnNlbGVjdGFibGUgfHxcbiAgICAgIHRoaXMucHJvcHMuc2VsZWN0Um93LmhpZGVTZWxlY3RDb2x1bW4gIT09IG5leHRQcm9wcy5zZWxlY3RSb3cuaGlkZVNlbGVjdENvbHVtbiB8fFxuICAgICAgdGhpcy5zaG91bGRVcGRhdGVkQnlTZWxmUHJvcHMobmV4dFByb3BzKVxuICAgICkge1xuICAgICAgdGhpcy5zaG91bGRVcGRhdGVSb3dDb250ZW50ID0gdGhpcy5zaG91bGRSb3dDb250ZW50VXBkYXRlKG5leHRQcm9wcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5zaG91bGRVcGRhdGVSb3dDb250ZW50ID0gdGhpcy5zaG91bGRSb3dDb250ZW50VXBkYXRlKG5leHRQcm9wcyk7XG5cbiAgICByZXR1cm4gdGhpcy5zaG91bGRVcGRhdGVSb3dDb250ZW50O1xuICB9XG5cbiAgaXNSZW5kZXJGdW5jdGlvbkNvbHVtbkluTGVmdChcbiAgICBwb3NpdGlvbiA9IENvbnN0LklORElDQVRPUl9QT1NJVElPTl9MRUZUXG4gICkge1xuICAgIHJldHVybiBwb3NpdGlvbiA9PT0gQ29uc3QuSU5ESUNBVE9SX1BPU0lUSU9OX0xFRlQ7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm93LFxuICAgICAgY29sdW1ucyxcbiAgICAgIGtleUZpZWxkLFxuICAgICAgcm93SW5kZXgsXG4gICAgICBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGF0dHJzLFxuICAgICAgc2VsZWN0Um93LFxuICAgICAgZXhwYW5kUm93LFxuICAgICAgZXhwYW5kZWQsXG4gICAgICBleHBhbmRhYmxlLFxuICAgICAgc2VsZWN0ZWQsXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgdmlzaWJsZUNvbHVtblNpemUsXG4gICAgICB0YWJJbmRleENlbGwsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qga2V5ID0gXy5nZXQocm93LCBrZXlGaWVsZCk7XG4gICAgY29uc3QgeyBoaWRlU2VsZWN0Q29sdW1uLCBzZWxlY3RDb2x1bW5Qb3NpdGlvbiwgY2xpY2tUb1NlbGVjdCB9ID0gc2VsZWN0Um93O1xuICAgIGNvbnN0IHsgc2hvd0V4cGFuZENvbHVtbiwgZXhwYW5kQ29sdW1uUG9zaXRpb24gfSA9IGV4cGFuZFJvdztcblxuICAgIGNvbnN0IG5ld0F0dHJzID0gdGhpcy5kZWxlZ2F0ZSh7IC4uLmF0dHJzIH0pO1xuICAgIGlmIChjbGlja1RvU2VsZWN0IHx8ICEhZXhwYW5kUm93LnJlbmRlcmVyKSB7XG4gICAgICBuZXdBdHRycy5vbkNsaWNrID0gdGhpcy5jcmVhdGVDbGlja0V2ZW50SGFuZGxlcihuZXdBdHRycy5vbkNsaWNrKTtcbiAgICB9XG5cbiAgICBsZXQgdGFiSW5kZXhTdGFydCA9IChyb3dJbmRleCAqIHZpc2libGVDb2x1bW5TaXplKSArIDE7XG5cbiAgICBjb25zdCBjaGlsZHJlbnMgPSBbKFxuICAgICAgPFJvd1B1cmVDb250ZW50XG4gICAgICAgIGtleT1cInJvd1wiXG4gICAgICAgIHJvdz17IHJvdyB9XG4gICAgICAgIGNvbHVtbnM9eyBjb2x1bW5zIH1cbiAgICAgICAga2V5RmllbGQ9eyBrZXlGaWVsZCB9XG4gICAgICAgIHJvd0luZGV4PXsgcm93SW5kZXggfVxuICAgICAgICBzaG91bGRVcGRhdGU9eyB0aGlzLnNob3VsZFVwZGF0ZVJvd0NvbnRlbnQgfVxuICAgICAgICB0YWJJbmRleFN0YXJ0PXsgdGFiSW5kZXhDZWxsID8gdGFiSW5kZXhTdGFydCA6IC0xIH1cbiAgICAgICAgeyAuLi5yZXN0IH1cbiAgICAgIC8+XG4gICAgKV07XG5cbiAgICBpZiAoIWhpZGVTZWxlY3RDb2x1bW4pIHtcbiAgICAgIGNvbnN0IHNlbGVjdENlbGwgPSAoXG4gICAgICAgIDxTZWxlY3Rpb25DZWxsXG4gICAgICAgICAgeyAuLi5zZWxlY3RSb3cgfVxuICAgICAgICAgIGtleT1cInNlbGVjdGlvbi1jZWxsXCJcbiAgICAgICAgICByb3dLZXk9eyBrZXkgfVxuICAgICAgICAgIHJvd0luZGV4PXsgcm93SW5kZXggfVxuICAgICAgICAgIHNlbGVjdGVkPXsgc2VsZWN0ZWQgfVxuICAgICAgICAgIGRpc2FibGVkPXsgIXNlbGVjdGFibGUgfVxuICAgICAgICAgIHRhYkluZGV4PXsgdGFiSW5kZXhDZWxsID8gdGFiSW5kZXhTdGFydCsrIDogLTEgfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLmlzUmVuZGVyRnVuY3Rpb25Db2x1bW5JbkxlZnQoc2VsZWN0Q29sdW1uUG9zaXRpb24pKSB7XG4gICAgICAgIGNoaWxkcmVucy51bnNoaWZ0KHNlbGVjdENlbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW5zLnB1c2goc2VsZWN0Q2VsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dFeHBhbmRDb2x1bW4pIHtcbiAgICAgIGNvbnN0IGV4cGFuZENlbGwgPSAoXG4gICAgICAgIDxFeHBhbmRDZWxsXG4gICAgICAgICAgeyAuLi5leHBhbmRSb3cgfVxuICAgICAgICAgIGtleT1cImV4cGFuZC1jZWxsXCJcbiAgICAgICAgICByb3dLZXk9eyBrZXkgfVxuICAgICAgICAgIHJvd0luZGV4PXsgcm93SW5kZXggfVxuICAgICAgICAgIGV4cGFuZGVkPXsgZXhwYW5kZWQgfVxuICAgICAgICAgIGV4cGFuZGFibGU9eyBleHBhbmRhYmxlIH1cbiAgICAgICAgICB0YWJJbmRleD17IHRhYkluZGV4Q2VsbCA/IHRhYkluZGV4U3RhcnQrKyA6IC0xIH1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5pc1JlbmRlckZ1bmN0aW9uQ29sdW1uSW5MZWZ0KGV4cGFuZENvbHVtblBvc2l0aW9uKSkge1xuICAgICAgICBjaGlsZHJlbnMudW5zaGlmdChleHBhbmRDZWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkcmVucy5wdXNoKGV4cGFuZENlbGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8dHJcbiAgICAgICAgc3R5bGU9eyBzdHlsZSB9XG4gICAgICAgIGNsYXNzTmFtZT17IGNsYXNzTmFtZSB9XG4gICAgICAgIHsgLi4ubmV3QXR0cnMgfVxuICAgICAgPlxuICAgICAgICB7IGNoaWxkcmVucyB9XG4gICAgICA8L3RyPlxuICAgICk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy9hZ2dyZWdhdGUtcm93LmpzIiwiLyogZXNsaW50XG4gIHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wczogMFxuICBqc3gtYTExeS9uby1ub25pbnRlcmFjdGl2ZS1lbGVtZW50LWludGVyYWN0aW9uczogMFxuKi9cbi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4cGFuZENlbGwgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIHJvd0tleTogUHJvcFR5cGVzLmFueSxcbiAgICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIG9uUm93RXhwYW5kOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGV4cGFuZENvbHVtblJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICByb3dJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB0YWJJbmRleDogUHJvcFR5cGVzLm51bWJlclxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZUNsaWNrID0gdGhpcy5oYW5kbGVDbGljay5iaW5kKHRoaXMpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9XG4gICAgICB0aGlzLnByb3BzLnJvd0luZGV4ICE9PSBuZXh0UHJvcHMucm93SW5kZXggfHxcbiAgICAgIHRoaXMucHJvcHMuZXhwYW5kZWQgIT09IG5leHRQcm9wcy5leHBhbmRlZCB8fFxuICAgICAgdGhpcy5wcm9wcy5yb3dLZXkgIT09IG5leHRQcm9wcy5yb3dLZXkgfHxcbiAgICAgIHRoaXMucHJvcHMudGFiSW5kZXggIT09IG5leHRQcm9wcy50YWJJbmRleDtcblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBoYW5kbGVDbGljayhlKSB7XG4gICAgY29uc3QgeyByb3dLZXksIGV4cGFuZGVkLCBvblJvd0V4cGFuZCwgcm93SW5kZXggfSA9IHRoaXMucHJvcHM7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBvblJvd0V4cGFuZChyb3dLZXksICFleHBhbmRlZCwgcm93SW5kZXgsIGUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgZXhwYW5kZWQsIGV4cGFuZGFibGUsIGV4cGFuZENvbHVtblJlbmRlcmVyLCB0YWJJbmRleCwgcm93S2V5IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGF0dHJzID0ge307XG4gICAgaWYgKHRhYkluZGV4ICE9PSAtMSkgYXR0cnMudGFiSW5kZXggPSB0YWJJbmRleDtcblxuICAgIHJldHVybiAoXG4gICAgICA8dGQgY2xhc3NOYW1lPVwiZXhwYW5kLWNlbGxcIiBvbkNsaWNrPXsgdGhpcy5oYW5kbGVDbGljayB9IHsgLi4uYXR0cnMgfT5cbiAgICAgICAge1xuICAgICAgICAgIGV4cGFuZENvbHVtblJlbmRlcmVyID8gZXhwYW5kQ29sdW1uUmVuZGVyZXIoe1xuICAgICAgICAgICAgZXhwYW5kYWJsZSxcbiAgICAgICAgICAgIGV4cGFuZGVkLFxuICAgICAgICAgICAgcm93S2V5XG4gICAgICAgICAgfSkgOiAoZXhwYW5kYWJsZSA/IChleHBhbmRlZCA/ICcoLSknIDogJygrKScpIDogJycpXG4gICAgICAgIH1cbiAgICAgIDwvdGQ+XG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93LWV4cGFuZC9leHBhbmQtY2VsbC5qcyIsIi8qIGVzbGludFxuICByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDBcbiAganN4LWExMXkvbm8tbm9uaW50ZXJhY3RpdmUtZWxlbWVudC1pbnRlcmFjdGlvbnM6IDBcbiovXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBDb25zdCBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBCb290c3RyYXBDb250ZXh0IH0gZnJvbSAnLi4vY29udGV4dHMvYm9vdHN0cmFwJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0aW9uQ2VsbCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgbW9kZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHJvd0tleTogUHJvcFR5cGVzLmFueSxcbiAgICBzZWxlY3RlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgb25Sb3dTZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICByb3dJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB0YWJJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBjbGlja1RvU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzZWxlY3Rpb25SZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc2VsZWN0Q29sdW1uU3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVDbGljayA9IHRoaXMuaGFuZGxlQ2xpY2suYmluZCh0aGlzKTtcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGUgPVxuICAgICAgdGhpcy5wcm9wcy5yb3dJbmRleCAhPT0gbmV4dFByb3BzLnJvd0luZGV4IHx8XG4gICAgICB0aGlzLnByb3BzLnNlbGVjdGVkICE9PSBuZXh0UHJvcHMuc2VsZWN0ZWQgfHxcbiAgICAgIHRoaXMucHJvcHMuZGlzYWJsZWQgIT09IG5leHRQcm9wcy5kaXNhYmxlZCB8fFxuICAgICAgdGhpcy5wcm9wcy5yb3dLZXkgIT09IG5leHRQcm9wcy5yb3dLZXkgfHxcbiAgICAgIHRoaXMucHJvcHMudGFiSW5kZXggIT09IG5leHRQcm9wcy50YWJJbmRleCB8fFxuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RDb2x1bW5TdHlsZSAhPT0gbmV4dFByb3BzLnNlbGVjdENvbHVtblN0eWxlO1xuXG4gICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBtb2RlOiBpbnB1dFR5cGUsXG4gICAgICByb3dLZXksXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIG9uUm93U2VsZWN0LFxuICAgICAgZGlzYWJsZWQsXG4gICAgICByb3dJbmRleFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGVja2VkID0gaW5wdXRUeXBlID09PSBDb25zdC5ST1dfU0VMRUNUX1NJTkdMRVxuICAgICAgPyB0cnVlXG4gICAgICA6ICFzZWxlY3RlZDtcblxuICAgIG9uUm93U2VsZWN0KHJvd0tleSwgY2hlY2tlZCwgcm93SW5kZXgsIGUpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvd0tleSxcbiAgICAgIG1vZGU6IGlucHV0VHlwZSxcbiAgICAgIHNlbGVjdGVkLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICB0YWJJbmRleCxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgc2VsZWN0aW9uUmVuZGVyZXIsXG4gICAgICBzZWxlY3RDb2x1bW5TdHlsZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgYXR0cnMgPSB7fTtcbiAgICBpZiAodGFiSW5kZXggIT09IC0xKSBhdHRycy50YWJJbmRleCA9IHRhYkluZGV4O1xuXG4gICAgYXR0cnMuc3R5bGUgPSBfLmlzRnVuY3Rpb24oc2VsZWN0Q29sdW1uU3R5bGUpID9cbiAgICAgIHNlbGVjdENvbHVtblN0eWxlKHtcbiAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWQsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICByb3dJbmRleCxcbiAgICAgICAgcm93S2V5XG4gICAgICB9KSA6XG4gICAgICBzZWxlY3RDb2x1bW5TdHlsZTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Qm9vdHN0cmFwQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge1xuICAgICAgICAgICh7IGJvb3RzdHJhcDQgfSkgPT4gKFxuICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInNlbGVjdGlvbi1jZWxsXCIgb25DbGljaz17IHRoaXMuaGFuZGxlQ2xpY2sgfSB7IC4uLmF0dHJzIH0+XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25SZW5kZXJlciA/IHNlbGVjdGlvblJlbmRlcmVyKHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6IGlucHV0VHlwZSxcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICByb3dJbmRleFxuICAgICAgICAgICAgICAgIH0pIDogKFxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9eyBpbnB1dFR5cGUgfVxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXsgc2VsZWN0ZWQgfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IGRpc2FibGVkIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXsgYm9vdHN0cmFwNCA/ICdzZWxlY3Rpb24taW5wdXQtNCcgOiAnJyB9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsgKCkgPT4ge30gfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICA8L0Jvb3RzdHJhcENvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93LXNlbGVjdGlvbi9zZWxlY3Rpb24tY2VsbC5qcyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCBSb3dTZWN0aW9uID0gKHsgY29udGVudCwgY29sU3BhbiB9KSA9PiAoXG4gIDx0cj5cbiAgICA8dGRcbiAgICAgIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIlxuICAgICAgY29sU3Bhbj17IGNvbFNwYW4gfVxuICAgICAgY2xhc3NOYW1lPVwicmVhY3QtYnMtdGFibGUtbm8tZGF0YVwiXG4gICAgPlxuICAgICAgeyBjb250ZW50IH1cbiAgICA8L3RkPlxuICA8L3RyPlxuKTtcblxuUm93U2VjdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGNvbnRlbnQ6IFByb3BUeXBlcy5hbnksXG4gIGNvbFNwYW46IFByb3BUeXBlcy5udW1iZXJcbn07XG5cblJvd1NlY3Rpb24uZGVmYXVsdFByb3BzID0ge1xuICBjb250ZW50OiBudWxsLFxuICBjb2xTcGFuOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSb3dTZWN0aW9uO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcm93L3Jvdy1zZWN0aW9uLmpzIiwiLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3MgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgU2VsZWN0aW9uQ29udGV4dCBmcm9tICcuLi9jb250ZXh0cy9zZWxlY3Rpb24tY29udGV4dCc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb21wb25lbnQpID0+IHtcbiAgY29uc3QgcmVuZGVyV2l0aFNlbGVjdGlvbiA9IChwcm9wcywgc2VsZWN0Um93KSA9PiB7XG4gICAgY29uc3Qga2V5ID0gcHJvcHMudmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBfLmNvbnRhaW5zKHNlbGVjdFJvdy5zZWxlY3RlZCwga2V5KTtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gIXNlbGVjdFJvdy5ub25TZWxlY3RhYmxlIHx8ICFfLmNvbnRhaW5zKHNlbGVjdFJvdy5ub25TZWxlY3RhYmxlLCBrZXkpO1xuICAgIGNvbnN0IG5vdFNlbGVjdGFibGUgPSBfLmNvbnRhaW5zKHNlbGVjdFJvdy5ub25TZWxlY3RhYmxlLCBrZXkpO1xuXG4gICAgbGV0IHtcbiAgICAgIHN0eWxlLFxuICAgICAgY2xhc3NOYW1lXG4gICAgfSA9IHByb3BzO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFN0eWxlID0gXy5pc0Z1bmN0aW9uKHNlbGVjdFJvdy5zdHlsZSlcbiAgICAgICAgPyBzZWxlY3RSb3cuc3R5bGUocHJvcHMucm93LCBwcm9wcy5yb3dJbmRleClcbiAgICAgICAgOiBzZWxlY3RSb3cuc3R5bGU7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xhc3NlcyA9IF8uaXNGdW5jdGlvbihzZWxlY3RSb3cuY2xhc3NlcylcbiAgICAgICAgPyBzZWxlY3RSb3cuY2xhc3Nlcyhwcm9wcy5yb3csIHByb3BzLnJvd0luZGV4KVxuICAgICAgICA6IHNlbGVjdFJvdy5jbGFzc2VzO1xuXG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgIC4uLnNlbGVjdGVkU3R5bGVcbiAgICAgIH07XG4gICAgICBjbGFzc05hbWUgPSBjcyhjbGFzc05hbWUsIHNlbGVjdGVkQ2xhc3NlcykgfHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoc2VsZWN0Um93LmJnQ29sb3IpIHtcbiAgICAgICAgc3R5bGUgPSBzdHlsZSB8fCB7fTtcbiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXy5pc0Z1bmN0aW9uKHNlbGVjdFJvdy5iZ0NvbG9yKVxuICAgICAgICAgID8gc2VsZWN0Um93LmJnQ29sb3IocHJvcHMucm93LCBwcm9wcy5yb3dJbmRleClcbiAgICAgICAgICA6IHNlbGVjdFJvdy5iZ0NvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub3RTZWxlY3RhYmxlKSB7XG4gICAgICBjb25zdCBub3RTZWxlY3RhYmxlU3R5bGUgPSBfLmlzRnVuY3Rpb24oc2VsZWN0Um93Lm5vblNlbGVjdGFibGVTdHlsZSlcbiAgICAgICAgPyBzZWxlY3RSb3cubm9uU2VsZWN0YWJsZVN0eWxlKHByb3BzLnJvdywgcHJvcHMucm93SW5kZXgpXG4gICAgICAgIDogc2VsZWN0Um93Lm5vblNlbGVjdGFibGVTdHlsZTtcblxuICAgICAgY29uc3Qgbm90U2VsZWN0YWJsZUNsYXNzZXMgPSBfLmlzRnVuY3Rpb24oc2VsZWN0Um93Lm5vblNlbGVjdGFibGVDbGFzc2VzKVxuICAgICAgICA/IHNlbGVjdFJvdy5ub25TZWxlY3RhYmxlQ2xhc3Nlcyhwcm9wcy5yb3csIHByb3BzLnJvd0luZGV4KVxuICAgICAgICA6IHNlbGVjdFJvdy5ub25TZWxlY3RhYmxlQ2xhc3NlcztcblxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAuLi5ub3RTZWxlY3RhYmxlU3R5bGVcbiAgICAgIH07XG4gICAgICBjbGFzc05hbWUgPSBjcyhjbGFzc05hbWUsIG5vdFNlbGVjdGFibGVDbGFzc2VzKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxDb21wb25lbnRcbiAgICAgICAgeyAuLi5wcm9wcyB9XG4gICAgICAgIHN0eWxlPXsgc3R5bGUgfVxuICAgICAgICBjbGFzc05hbWU9eyBjbGFzc05hbWUgfVxuICAgICAgICBzZWxlY3RSb3c9eyBzZWxlY3RSb3cgfVxuICAgICAgICBzZWxlY3RlZD17IHNlbGVjdGVkIH1cbiAgICAgICAgc2VsZWN0YWJsZT17IHNlbGVjdGFibGUgfVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHdpdGhDb25zdW1lcihwcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8U2VsZWN0aW9uQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgeyBzZWxlY3RSb3cgPT4gcmVuZGVyV2l0aFNlbGVjdGlvbihwcm9wcywgc2VsZWN0Um93KSB9XG4gICAgICA8L1NlbGVjdGlvbkNvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfVxuXG4gIHdpdGhDb25zdW1lci5kaXNwbGF5TmFtZSA9ICdXaXRoU2VsZWN0aW9uUm93Q29uc3VtZXInO1xuICByZXR1cm4gd2l0aENvbnN1bWVyO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1zZWxlY3Rpb24vcm93LWNvbnN1bWVyLmpzIiwiLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3MgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgRXhwYW5kUm93IGZyb20gJy4vZXhwYW5kLXJvdyc7XG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgRXhwYW5zaW9uQ29udGV4dCBmcm9tICcuLi9jb250ZXh0cy9yb3ctZXhwYW5kLWNvbnRleHQnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29tcG9uZW50KSA9PiB7XG4gIGNvbnN0IHJlbmRlcldpdGhFeHBhbnNpb24gPSAocHJvcHMsIGV4cGFuZFJvdykgPT4ge1xuICAgIGxldCBwYXJlbnRDbGFzc05hbWUgPSAnJztcbiAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gICAgY29uc3Qga2V5ID0gcHJvcHMudmFsdWU7XG5cbiAgICBjb25zdCBleHBhbmRlZCA9IF8uY29udGFpbnMoZXhwYW5kUm93LmV4cGFuZGVkLCBrZXkpO1xuICAgIGNvbnN0IGlzQ2xvc2luZyA9IF8uY29udGFpbnMoZXhwYW5kUm93LmlzQ2xvc2luZywga2V5KTtcbiAgICBjb25zdCBleHBhbmRhYmxlID0gIWV4cGFuZFJvdy5ub25FeHBhbmRhYmxlIHx8ICFfLmNvbnRhaW5zKGV4cGFuZFJvdy5ub25FeHBhbmRhYmxlLCBrZXkpO1xuICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgcGFyZW50Q2xhc3NOYW1lID0gXy5pc0Z1bmN0aW9uKGV4cGFuZFJvdy5wYXJlbnRDbGFzc05hbWUpID9cbiAgICAgICAgZXhwYW5kUm93LnBhcmVudENsYXNzTmFtZShleHBhbmRlZCwgcHJvcHMucm93LCBwcm9wcy5yb3dJbmRleCkgOlxuICAgICAgICAoZXhwYW5kUm93LnBhcmVudENsYXNzTmFtZSB8fCAnJyk7XG5cbiAgICAgIGNsYXNzTmFtZSA9IF8uaXNGdW5jdGlvbihleHBhbmRSb3cuY2xhc3NOYW1lKSA/XG4gICAgICAgIGV4cGFuZFJvdy5jbGFzc05hbWUoZXhwYW5kZWQsIHByb3BzLnJvdywgcHJvcHMucm93SW5kZXgpIDpcbiAgICAgICAgKGV4cGFuZFJvdy5jbGFzc05hbWUgfHwgJycpO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICA8Q29tcG9uZW50XG4gICAgICAgIHsgLi4ucHJvcHMgfVxuICAgICAgICBrZXk9eyBrZXkgfVxuICAgICAgICBleHBhbmRlZD17IGV4cGFuZGVkIH1cbiAgICAgICAgZXhwYW5kYWJsZT17IGV4cGFuZGFibGUgfVxuICAgICAgICBleHBhbmRSb3c9eyB7IC4uLmV4cGFuZFJvdyB9IH1cbiAgICAgICAgY2xhc3NOYW1lPXsgY3MocHJvcHMuY2xhc3NOYW1lLCBwYXJlbnRDbGFzc05hbWUpIH1cbiAgICAgIC8+LFxuICAgICAgZXhwYW5kZWQgfHwgaXNDbG9zaW5nID8gPEV4cGFuZFJvd1xuICAgICAgICBrZXk9eyBgJHtrZXl9LWV4cGFuZGluZ2AgfVxuICAgICAgICBjb2xTcGFuPXsgcHJvcHMudmlzaWJsZUNvbHVtblNpemUgfVxuICAgICAgICBleHBhbmRlZD17IGV4cGFuZGVkIH1cbiAgICAgICAgb25DbG9zZWQ9eyAoKSA9PiBleHBhbmRSb3cub25DbG9zZWQoa2V5KSB9XG4gICAgICAgIGNsYXNzTmFtZT17IGNsYXNzTmFtZSB9XG4gICAgICA+XG4gICAgICAgIHsgZXhwYW5kUm93LnJlbmRlcmVyKHByb3BzLnJvdywgcHJvcHMucm93SW5kZXgpIH1cbiAgICAgIDwvRXhwYW5kUm93PiA6IG51bGxcbiAgICBdO1xuICB9O1xuICByZXR1cm4gcHJvcHMgPT4gKFxuICAgIDxFeHBhbnNpb25Db250ZXh0LkNvbnN1bWVyPlxuICAgICAgeyBleHBhbmRSb3cgPT4gcmVuZGVyV2l0aEV4cGFuc2lvbihwcm9wcywgZXhwYW5kUm93KSB9XG4gICAgPC9FeHBhbnNpb25Db250ZXh0LkNvbnN1bWVyPlxuICApO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1leHBhbmQvcm93LWNvbnN1bWVyLmpzIiwiaW1wb3J0IGNzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBDU1NUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cCc7XG5cbmNvbnN0IEV4cGFuZFJvdyA9ICh7IGNoaWxkcmVuLCBleHBhbmRlZCwgb25DbG9zZWQsIGNsYXNzTmFtZSwgLi4ucmVzdCB9KSA9PiAoXG4gIDx0cj5cbiAgICA8dGQgY2xhc3NOYW1lPXsgY3MoJ3Jlc2V0LWV4cGFuc2lvbi1zdHlsZScsIGNsYXNzTmFtZSkgfSB7IC4uLnJlc3QgfT5cbiAgICAgIDxDU1NUcmFuc2l0aW9uXG4gICAgICAgIGFwcGVhclxuICAgICAgICBpbj17IGV4cGFuZGVkIH1cbiAgICAgICAgdGltZW91dD17IDQwMCB9XG4gICAgICAgIGNsYXNzTmFtZXM9XCJyb3ctZXhwYW5kLXNsaWRlXCJcbiAgICAgICAgb25FeGl0ZWQ9eyBvbkNsb3NlZCB9XG4gICAgICA+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3ctZXhwYW5zaW9uLXN0eWxlXCI+XG4gICAgICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0NTU1RyYW5zaXRpb24+XG4gICAgPC90ZD5cbiAgPC90cj5cbik7XG5cbkV4cGFuZFJvdy5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgZXhwYW5kZWQ6IFByb3BUeXBlcy5ib29sLFxuICBvbkNsb3NlZDogUHJvcFR5cGVzLmZ1bmMsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuRXhwYW5kUm93LmRlZmF1bHRQcm9wcyA9IHtcbiAgY2hpbGRyZW46IG51bGwsXG4gIGV4cGFuZGVkOiBmYWxzZSxcbiAgb25DbG9zZWQ6IG51bGwsXG4gIGNsYXNzTmFtZTogJydcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEV4cGFuZFJvdztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL3Jvdy1leHBhbmQvZXhwYW5kLXJvdy5qcyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX0NTU1RyYW5zaXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NTU1RyYW5zaXRpb25cIikpO1xuXG52YXIgX1JlcGxhY2VUcmFuc2l0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9SZXBsYWNlVHJhbnNpdGlvblwiKSk7XG5cbnZhciBfVHJhbnNpdGlvbkdyb3VwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UcmFuc2l0aW9uR3JvdXBcIikpO1xuXG52YXIgX1RyYW5zaXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1RyYW5zaXRpb25cIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgVHJhbnNpdGlvbjogX1RyYW5zaXRpb24uZGVmYXVsdCxcbiAgVHJhbnNpdGlvbkdyb3VwOiBfVHJhbnNpdGlvbkdyb3VwLmRlZmF1bHQsXG4gIFJlcGxhY2VUcmFuc2l0aW9uOiBfUmVwbGFjZVRyYW5zaXRpb24uZGVmYXVsdCxcbiAgQ1NTVHJhbnNpdGlvbjogX0NTU1RyYW5zaXRpb24uZGVmYXVsdFxufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBQcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cbnZhciBfYWRkQ2xhc3MgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJkb20taGVscGVycy9jbGFzcy9hZGRDbGFzc1wiKSk7XG5cbnZhciBfcmVtb3ZlQ2xhc3MgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJkb20taGVscGVycy9jbGFzcy9yZW1vdmVDbGFzc1wiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfVHJhbnNpdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVHJhbnNpdGlvblwiKSk7XG5cbnZhciBfUHJvcFR5cGVzID0gcmVxdWlyZShcIi4vdXRpbHMvUHJvcFR5cGVzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IHt9OyBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbGFzc2VzKSB7XG4gIHJldHVybiBub2RlICYmIGNsYXNzZXMgJiYgY2xhc3Nlcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gKDAsIF9hZGRDbGFzcy5kZWZhdWx0KShub2RlLCBjKTtcbiAgfSk7XG59O1xuXG52YXIgcmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiByZW1vdmVDbGFzcyhub2RlLCBjbGFzc2VzKSB7XG4gIHJldHVybiBub2RlICYmIGNsYXNzZXMgJiYgY2xhc3Nlcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gKDAsIF9yZW1vdmVDbGFzcy5kZWZhdWx0KShub2RlLCBjKTtcbiAgfSk7XG59O1xuLyoqXG4gKiBBIGBUcmFuc2l0aW9uYCBjb21wb25lbnQgdXNpbmcgQ1NTIHRyYW5zaXRpb25zIGFuZCBhbmltYXRpb25zLlxuICogSXQncyBpbnNwaXJlZCBieSB0aGUgZXhjZWxsZW50IFtuZy1hbmltYXRlXShodHRwOi8vd3d3Lm5nYW5pbWF0ZS5vcmcvKSBsaWJyYXJ5LlxuICpcbiAqIGBDU1NUcmFuc2l0aW9uYCBhcHBsaWVzIGEgcGFpciBvZiBjbGFzcyBuYW1lcyBkdXJpbmcgdGhlIGBhcHBlYXJgLCBgZW50ZXJgLFxuICogYW5kIGBleGl0YCBzdGFnZXMgb2YgdGhlIHRyYW5zaXRpb24uIFRoZSBmaXJzdCBjbGFzcyBpcyBhcHBsaWVkIGFuZCB0aGVuIGFcbiAqIHNlY29uZCBcImFjdGl2ZVwiIGNsYXNzIGluIG9yZGVyIHRvIGFjdGl2YXRlIHRoZSBjc3MgYW5pbWF0aW9uLiBBZnRlciB0aGUgYW5pbWF0aW9uLFxuICogbWF0Y2hpbmcgYGRvbmVgIGNsYXNzIG5hbWVzIGFyZSBhcHBsaWVkIHRvIHBlcnNpc3QgdGhlIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBXaGVuIHRoZSBgaW5gIHByb3AgaXMgdG9nZ2xlZCB0byBgdHJ1ZWAgdGhlIENvbXBvbmVudCB3aWxsIGdldFxuICogdGhlIGBleGFtcGxlLWVudGVyYCBDU1MgY2xhc3MgYW5kIHRoZSBgZXhhbXBsZS1lbnRlci1hY3RpdmVgIENTUyBjbGFzc1xuICogYWRkZWQgaW4gdGhlIG5leHQgdGljay4gVGhpcyBpcyBhIGNvbnZlbnRpb24gYmFzZWQgb24gdGhlIGBjbGFzc05hbWVzYCBwcm9wLlxuICovXG5cblxudmFyIENTU1RyYW5zaXRpb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoQ1NTVHJhbnNpdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ1NTVHJhbnNpdGlvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLm9uRW50ZXIgPSBmdW5jdGlvbiAobm9kZSwgYXBwZWFyaW5nKSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0Q2xhc3NOYW1lcyA9IF90aGlzLmdldENsYXNzTmFtZXMoYXBwZWFyaW5nID8gJ2FwcGVhcicgOiAnZW50ZXInKSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRnZXRDbGFzc05hbWVzLmNsYXNzTmFtZTtcblxuICAgICAgX3RoaXMucmVtb3ZlQ2xhc3Nlcyhub2RlLCAnZXhpdCcpO1xuXG4gICAgICBhZGRDbGFzcyhub2RlLCBjbGFzc05hbWUpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25FbnRlcikge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkVudGVyKG5vZGUsIGFwcGVhcmluZyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uRW50ZXJpbmcgPSBmdW5jdGlvbiAobm9kZSwgYXBwZWFyaW5nKSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0Q2xhc3NOYW1lczIgPSBfdGhpcy5nZXRDbGFzc05hbWVzKGFwcGVhcmluZyA/ICdhcHBlYXInIDogJ2VudGVyJyksXG4gICAgICAgICAgYWN0aXZlQ2xhc3NOYW1lID0gX3RoaXMkZ2V0Q2xhc3NOYW1lczIuYWN0aXZlQ2xhc3NOYW1lO1xuXG4gICAgICBfdGhpcy5yZWZsb3dBbmRBZGRDbGFzcyhub2RlLCBhY3RpdmVDbGFzc05hbWUpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25FbnRlcmluZykge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkVudGVyaW5nKG5vZGUsIGFwcGVhcmluZyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uRW50ZXJlZCA9IGZ1bmN0aW9uIChub2RlLCBhcHBlYXJpbmcpIHtcbiAgICAgIHZhciBfdGhpcyRnZXRDbGFzc05hbWVzMyA9IF90aGlzLmdldENsYXNzTmFtZXMoJ2VudGVyJyksXG4gICAgICAgICAgZG9uZUNsYXNzTmFtZSA9IF90aGlzJGdldENsYXNzTmFtZXMzLmRvbmVDbGFzc05hbWU7XG5cbiAgICAgIF90aGlzLnJlbW92ZUNsYXNzZXMobm9kZSwgYXBwZWFyaW5nID8gJ2FwcGVhcicgOiAnZW50ZXInKTtcblxuICAgICAgYWRkQ2xhc3Mobm9kZSwgZG9uZUNsYXNzTmFtZSk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkVudGVyZWQpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25FbnRlcmVkKG5vZGUsIGFwcGVhcmluZyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uRXhpdCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0Q2xhc3NOYW1lczQgPSBfdGhpcy5nZXRDbGFzc05hbWVzKCdleGl0JyksXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkZ2V0Q2xhc3NOYW1lczQuY2xhc3NOYW1lO1xuXG4gICAgICBfdGhpcy5yZW1vdmVDbGFzc2VzKG5vZGUsICdhcHBlYXInKTtcblxuICAgICAgX3RoaXMucmVtb3ZlQ2xhc3Nlcyhub2RlLCAnZW50ZXInKTtcblxuICAgICAgYWRkQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRXhpdCkge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkV4aXQobm9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uRXhpdGluZyA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0Q2xhc3NOYW1lczUgPSBfdGhpcy5nZXRDbGFzc05hbWVzKCdleGl0JyksXG4gICAgICAgICAgYWN0aXZlQ2xhc3NOYW1lID0gX3RoaXMkZ2V0Q2xhc3NOYW1lczUuYWN0aXZlQ2xhc3NOYW1lO1xuXG4gICAgICBfdGhpcy5yZWZsb3dBbmRBZGRDbGFzcyhub2RlLCBhY3RpdmVDbGFzc05hbWUpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25FeGl0aW5nKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uRXhpdGluZyhub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25FeGl0ZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIF90aGlzJGdldENsYXNzTmFtZXM2ID0gX3RoaXMuZ2V0Q2xhc3NOYW1lcygnZXhpdCcpLFxuICAgICAgICAgIGRvbmVDbGFzc05hbWUgPSBfdGhpcyRnZXRDbGFzc05hbWVzNi5kb25lQ2xhc3NOYW1lO1xuXG4gICAgICBfdGhpcy5yZW1vdmVDbGFzc2VzKG5vZGUsICdleGl0Jyk7XG5cbiAgICAgIGFkZENsYXNzKG5vZGUsIGRvbmVDbGFzc05hbWUpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25FeGl0ZWQpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25FeGl0ZWQobm9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmdldENsYXNzTmFtZXMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgdmFyIGNsYXNzTmFtZXMgPSBfdGhpcy5wcm9wcy5jbGFzc05hbWVzO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IHR5cGVvZiBjbGFzc05hbWVzICE9PSAnc3RyaW5nJyA/IGNsYXNzTmFtZXNbdHlwZV0gOiBjbGFzc05hbWVzICsgJy0nICsgdHlwZTtcbiAgICAgIHZhciBhY3RpdmVDbGFzc05hbWUgPSB0eXBlb2YgY2xhc3NOYW1lcyAhPT0gJ3N0cmluZycgPyBjbGFzc05hbWVzW3R5cGUgKyAnQWN0aXZlJ10gOiBjbGFzc05hbWUgKyAnLWFjdGl2ZSc7XG4gICAgICB2YXIgZG9uZUNsYXNzTmFtZSA9IHR5cGVvZiBjbGFzc05hbWVzICE9PSAnc3RyaW5nJyA/IGNsYXNzTmFtZXNbdHlwZSArICdEb25lJ10gOiBjbGFzc05hbWUgKyAnLWRvbmUnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgIGFjdGl2ZUNsYXNzTmFtZTogYWN0aXZlQ2xhc3NOYW1lLFxuICAgICAgICBkb25lQ2xhc3NOYW1lOiBkb25lQ2xhc3NOYW1lXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ1NTVHJhbnNpdGlvbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbW92ZUNsYXNzZXMgPSBmdW5jdGlvbiByZW1vdmVDbGFzc2VzKG5vZGUsIHR5cGUpIHtcbiAgICB2YXIgX3RoaXMkZ2V0Q2xhc3NOYW1lczcgPSB0aGlzLmdldENsYXNzTmFtZXModHlwZSksXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJGdldENsYXNzTmFtZXM3LmNsYXNzTmFtZSxcbiAgICAgICAgYWN0aXZlQ2xhc3NOYW1lID0gX3RoaXMkZ2V0Q2xhc3NOYW1lczcuYWN0aXZlQ2xhc3NOYW1lLFxuICAgICAgICBkb25lQ2xhc3NOYW1lID0gX3RoaXMkZ2V0Q2xhc3NOYW1lczcuZG9uZUNsYXNzTmFtZTtcblxuICAgIGNsYXNzTmFtZSAmJiByZW1vdmVDbGFzcyhub2RlLCBjbGFzc05hbWUpO1xuICAgIGFjdGl2ZUNsYXNzTmFtZSAmJiByZW1vdmVDbGFzcyhub2RlLCBhY3RpdmVDbGFzc05hbWUpO1xuICAgIGRvbmVDbGFzc05hbWUgJiYgcmVtb3ZlQ2xhc3Mobm9kZSwgZG9uZUNsYXNzTmFtZSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlZmxvd0FuZEFkZENsYXNzID0gZnVuY3Rpb24gcmVmbG93QW5kQWRkQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBmb3IgdG8gZm9yY2UgYSByZXBhaW50LFxuICAgIC8vIHdoaWNoIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byB0cmFuc2l0aW9uIHN0eWxlcyB3aGVuIGFkZGluZyBhIGNsYXNzIG5hbWUuXG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgICBub2RlICYmIG5vZGUuc2Nyb2xsVG9wO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cblxuICAgICAgYWRkQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcyk7XG5cbiAgICBkZWxldGUgcHJvcHMuY2xhc3NOYW1lcztcbiAgICByZXR1cm4gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfVHJhbnNpdGlvbi5kZWZhdWx0LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIG9uRW50ZXI6IHRoaXMub25FbnRlcixcbiAgICAgIG9uRW50ZXJlZDogdGhpcy5vbkVudGVyZWQsXG4gICAgICBvbkVudGVyaW5nOiB0aGlzLm9uRW50ZXJpbmcsXG4gICAgICBvbkV4aXQ6IHRoaXMub25FeGl0LFxuICAgICAgb25FeGl0aW5nOiB0aGlzLm9uRXhpdGluZyxcbiAgICAgIG9uRXhpdGVkOiB0aGlzLm9uRXhpdGVkXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDU1NUcmFuc2l0aW9uO1xufShfcmVhY3QuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5DU1NUcmFuc2l0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IF9leHRlbmRzKHt9LCBfVHJhbnNpdGlvbi5kZWZhdWx0LnByb3BUeXBlcywge1xuICAvKipcbiAgICogVGhlIGFuaW1hdGlvbiBjbGFzc05hbWVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudCBhcyBpdCBlbnRlcnMsIGV4aXRzIG9yIGhhcyBmaW5pc2hlZCB0aGUgdHJhbnNpdGlvbi5cbiAgICogQSBzaW5nbGUgbmFtZSBjYW4gYmUgcHJvdmlkZWQgYW5kIGl0IHdpbGwgYmUgc3VmZml4ZWQgZm9yIGVhY2ggc3RhZ2U6IGUuZy5cbiAgICpcbiAgICogYGNsYXNzTmFtZXM9XCJmYWRlXCJgIGFwcGxpZXMgYGZhZGUtZW50ZXJgLCBgZmFkZS1lbnRlci1hY3RpdmVgLCBgZmFkZS1lbnRlci1kb25lYCxcbiAgICogYGZhZGUtZXhpdGAsIGBmYWRlLWV4aXQtYWN0aXZlYCwgYGZhZGUtZXhpdC1kb25lYCwgYGZhZGUtYXBwZWFyYCwgYW5kIGBmYWRlLWFwcGVhci1hY3RpdmVgLlxuICAgKiBFYWNoIGluZGl2aWR1YWwgY2xhc3NOYW1lcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW5kZXBlbmRlbnRseSBsaWtlOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjbGFzc05hbWVzPXt7XG4gICAqICBhcHBlYXI6ICdteS1hcHBlYXInLFxuICAgKiAgYXBwZWFyQWN0aXZlOiAnbXktYWN0aXZlLWFwcGVhcicsXG4gICAqICBlbnRlcjogJ215LWVudGVyJyxcbiAgICogIGVudGVyQWN0aXZlOiAnbXktYWN0aXZlLWVudGVyJyxcbiAgICogIGVudGVyRG9uZTogJ215LWRvbmUtZW50ZXInLFxuICAgKiAgZXhpdDogJ215LWV4aXQnLFxuICAgKiAgZXhpdEFjdGl2ZTogJ215LWFjdGl2ZS1leGl0JyxcbiAgICogIGV4aXREb25lOiAnbXktZG9uZS1leGl0JyxcbiAgICogfX1cbiAgICogYGBgXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIHNldCB0aGVzZSBjbGFzc2VzIHVzaW5nIENTUyBNb2R1bGVzOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBpbXBvcnQgc3R5bGVzIGZyb20gJy4vc3R5bGVzLmNzcyc7XG4gICAqIGBgYFxuICAgKlxuICAgKiB5b3UgbWlnaHQgd2FudCB0byB1c2UgY2FtZWxDYXNlIGluIHlvdXIgQ1NTIGZpbGUsIHRoYXQgd2F5IGNvdWxkIHNpbXBseSBzcHJlYWRcbiAgICogdGhlbSBpbnN0ZWFkIG9mIGxpc3RpbmcgdGhlbSBvbmUgYnkgb25lOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjbGFzc05hbWVzPXt7IC4uLnN0eWxlcyB9fVxuICAgKiBgYGBcbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHtcbiAgICogIGFwcGVhcj86IHN0cmluZyxcbiAgICogIGFwcGVhckFjdGl2ZT86IHN0cmluZyxcbiAgICogIGVudGVyPzogc3RyaW5nLFxuICAgKiAgZW50ZXJBY3RpdmU/OiBzdHJpbmcsXG4gICAqICBlbnRlckRvbmU/OiBzdHJpbmcsXG4gICAqICBleGl0Pzogc3RyaW5nLFxuICAgKiAgZXhpdEFjdGl2ZT86IHN0cmluZyxcbiAgICogIGV4aXREb25lPzogc3RyaW5nLFxuICAgKiB9fVxuICAgKi9cbiAgY2xhc3NOYW1lczogX1Byb3BUeXBlcy5jbGFzc05hbWVzU2hhcGUsXG5cbiAgLyoqXG4gICAqIEEgYDxUcmFuc2l0aW9uPmAgY2FsbGJhY2sgZmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICdlbnRlcicgb3IgJ2FwcGVhcicgY2xhc3MgaXNcbiAgICogYXBwbGllZC5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQsIGlzQXBwZWFyaW5nOiBib29sKVxuICAgKi9cbiAgb25FbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEEgYDxUcmFuc2l0aW9uPmAgY2FsbGJhY2sgZmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICdlbnRlci1hY3RpdmUnIG9yXG4gICAqICdhcHBlYXItYWN0aXZlJyBjbGFzcyBpcyBhcHBsaWVkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCwgaXNBcHBlYXJpbmc6IGJvb2wpXG4gICAqL1xuICBvbkVudGVyaW5nOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQSBgPFRyYW5zaXRpb24+YCBjYWxsYmFjayBmaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJ2VudGVyJyBvclxuICAgKiAnYXBwZWFyJyBjbGFzc2VzIGFyZSAqKnJlbW92ZWQqKiBhbmQgdGhlIGBkb25lYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgRE9NIG5vZGUuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50LCBpc0FwcGVhcmluZzogYm9vbClcbiAgICovXG4gIG9uRW50ZXJlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEEgYDxUcmFuc2l0aW9uPmAgY2FsbGJhY2sgZmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICdleGl0JyBjbGFzcyBpc1xuICAgKiBhcHBsaWVkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudClcbiAgICovXG4gIG9uRXhpdDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEEgYDxUcmFuc2l0aW9uPmAgY2FsbGJhY2sgZmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlICdleGl0LWFjdGl2ZScgaXMgYXBwbGllZC5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQpXG4gICAqL1xuICBvbkV4aXRpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBBIGA8VHJhbnNpdGlvbj5gIGNhbGxiYWNrIGZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSAnZXhpdCcgY2xhc3Nlc1xuICAgKiBhcmUgKipyZW1vdmVkKiogYW5kIHRoZSBgZXhpdC1kb25lYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgRE9NIG5vZGUuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50KVxuICAgKi9cbiAgb25FeGl0ZWQ6IFByb3BUeXBlcy5mdW5jXG59KSA6IHt9O1xudmFyIF9kZWZhdWx0ID0gQ1NTVHJhbnNpdGlvbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvQ1NTVHJhbnNpdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBhZGRDbGFzcztcblxudmFyIF9oYXNDbGFzcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaGFzQ2xhc3NcIikpO1xuXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtlbHNlIGlmICghKDAsIF9oYXNDbGFzcy5kZWZhdWx0KShlbGVtZW50LCBjbGFzc05hbWUpKSBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJykgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZTtlbHNlIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIChlbGVtZW50LmNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTmFtZS5iYXNlVmFsIHx8ICcnKSArICcgJyArIGNsYXNzTmFtZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9jbGFzcy9hZGRDbGFzcy5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgIFwiZGVmYXVsdFwiOiBvYmpcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHQuanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBoYXNDbGFzcztcblxuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkgcmV0dXJuICEhY2xhc3NOYW1lICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7ZWxzZSByZXR1cm4gKFwiIFwiICsgKGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgZWxlbWVudC5jbGFzc05hbWUpICsgXCIgXCIpLmluZGV4T2YoXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIikgIT09IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvY2xhc3MvaGFzQ2xhc3MuanNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiByZXBsYWNlQ2xhc3NOYW1lKG9yaWdDbGFzcywgY2xhc3NUb1JlbW92ZSkge1xuICByZXR1cm4gb3JpZ0NsYXNzLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxcXHMpJyArIGNsYXNzVG9SZW1vdmUgKyAnKD86XFxcXHN8JCknLCAnZycpLCAnJDEnKS5yZXBsYWNlKC9cXHMrL2csICcgJykucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO2Vsc2UgaWYgKHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIGVsZW1lbnQuY2xhc3NOYW1lID0gcmVwbGFjZUNsYXNzTmFtZShlbGVtZW50LmNsYXNzTmFtZSwgY2xhc3NOYW1lKTtlbHNlIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHJlcGxhY2VDbGFzc05hbWUoZWxlbWVudC5jbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCB8fCAnJywgY2xhc3NOYW1lKSk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvY2xhc3MvcmVtb3ZlQ2xhc3MuanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG52YXIgX1RyYW5zaXRpb25Hcm91cCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVHJhbnNpdGlvbkdyb3VwXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBUaGUgYDxSZXBsYWNlVHJhbnNpdGlvbj5gIGNvbXBvbmVudCBpcyBhIHNwZWNpYWxpemVkIGBUcmFuc2l0aW9uYCBjb21wb25lbnRcbiAqIHRoYXQgYW5pbWF0ZXMgYmV0d2VlbiB0d28gY2hpbGRyZW4uXG4gKlxuICogYGBganN4XG4gKiA8UmVwbGFjZVRyYW5zaXRpb24gaW4+XG4gKiAgIDxGYWRlPjxkaXY+SSBhcHBlYXIgZmlyc3Q8L2Rpdj48L0ZhZGU+XG4gKiAgIDxGYWRlPjxkaXY+SSByZXBsYWNlIHRoZSBhYm92ZTwvZGl2PjwvRmFkZT5cbiAqIDwvUmVwbGFjZVRyYW5zaXRpb24+XG4gKiBgYGBcbiAqL1xudmFyIFJlcGxhY2VUcmFuc2l0aW9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFJlcGxhY2VUcmFuc2l0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBSZXBsYWNlVHJhbnNpdGlvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KF9hcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUVudGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUxpZmVjeWNsZSgnb25FbnRlcicsIDAsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVFbnRlcmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICBhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVMaWZlY3ljbGUoJ29uRW50ZXJpbmcnLCAwLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlRW50ZXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgICBhcmdzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVMaWZlY3ljbGUoJ29uRW50ZXJlZCcsIDAsIGFyZ3MpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVFeGl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjUgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleTVdID0gYXJndW1lbnRzW19rZXk1XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUxpZmVjeWNsZSgnb25FeGl0JywgMSwgYXJncyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUV4aXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuNiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICAgICAgYXJnc1tfa2V5Nl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMuaGFuZGxlTGlmZWN5Y2xlKCdvbkV4aXRpbmcnLCAxLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlRXhpdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjcgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW43KSwgX2tleTcgPSAwOyBfa2V5NyA8IF9sZW43OyBfa2V5NysrKSB7XG4gICAgICAgIGFyZ3NbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZUxpZmVjeWNsZSgnb25FeGl0ZWQnLCAxLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFJlcGxhY2VUcmFuc2l0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uaGFuZGxlTGlmZWN5Y2xlID0gZnVuY3Rpb24gaGFuZGxlTGlmZWN5Y2xlKGhhbmRsZXIsIGlkeCwgb3JpZ2luYWxBcmdzKSB7XG4gICAgdmFyIF9jaGlsZCRwcm9wcztcblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG5cbiAgICB2YXIgY2hpbGQgPSBfcmVhY3QuZGVmYXVsdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKVtpZHhdO1xuXG4gICAgaWYgKGNoaWxkLnByb3BzW2hhbmRsZXJdKSAoX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMpW2hhbmRsZXJdLmFwcGx5KF9jaGlsZCRwcm9wcywgb3JpZ2luYWxBcmdzKTtcbiAgICBpZiAodGhpcy5wcm9wc1toYW5kbGVyXSkgdGhpcy5wcm9wc1toYW5kbGVyXSgoMCwgX3JlYWN0RG9tLmZpbmRET01Ob2RlKSh0aGlzKSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBpblByb3AgPSBfdGhpcyRwcm9wcy5pbixcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJpblwiXSk7XG5cbiAgICB2YXIgX1JlYWN0JENoaWxkcmVuJHRvQXJyID0gX3JlYWN0LmRlZmF1bHQuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbiksXG4gICAgICAgIGZpcnN0ID0gX1JlYWN0JENoaWxkcmVuJHRvQXJyWzBdLFxuICAgICAgICBzZWNvbmQgPSBfUmVhY3QkQ2hpbGRyZW4kdG9BcnJbMV07XG5cbiAgICBkZWxldGUgcHJvcHMub25FbnRlcjtcbiAgICBkZWxldGUgcHJvcHMub25FbnRlcmluZztcbiAgICBkZWxldGUgcHJvcHMub25FbnRlcmVkO1xuICAgIGRlbGV0ZSBwcm9wcy5vbkV4aXQ7XG4gICAgZGVsZXRlIHByb3BzLm9uRXhpdGluZztcbiAgICBkZWxldGUgcHJvcHMub25FeGl0ZWQ7XG4gICAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX1RyYW5zaXRpb25Hcm91cC5kZWZhdWx0LCBwcm9wcywgaW5Qcm9wID8gX3JlYWN0LmRlZmF1bHQuY2xvbmVFbGVtZW50KGZpcnN0LCB7XG4gICAgICBrZXk6ICdmaXJzdCcsXG4gICAgICBvbkVudGVyOiB0aGlzLmhhbmRsZUVudGVyLFxuICAgICAgb25FbnRlcmluZzogdGhpcy5oYW5kbGVFbnRlcmluZyxcbiAgICAgIG9uRW50ZXJlZDogdGhpcy5oYW5kbGVFbnRlcmVkXG4gICAgfSkgOiBfcmVhY3QuZGVmYXVsdC5jbG9uZUVsZW1lbnQoc2Vjb25kLCB7XG4gICAgICBrZXk6ICdzZWNvbmQnLFxuICAgICAgb25FbnRlcjogdGhpcy5oYW5kbGVFeGl0LFxuICAgICAgb25FbnRlcmluZzogdGhpcy5oYW5kbGVFeGl0aW5nLFxuICAgICAgb25FbnRlcmVkOiB0aGlzLmhhbmRsZUV4aXRlZFxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gUmVwbGFjZVRyYW5zaXRpb247XG59KF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblJlcGxhY2VUcmFuc2l0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgaW46IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLmlzUmVxdWlyZWQsXG4gIGNoaWxkcmVuOiBmdW5jdGlvbiBjaGlsZHJlbihwcm9wcywgcHJvcE5hbWUpIHtcbiAgICBpZiAoX3JlYWN0LmRlZmF1bHQuQ2hpbGRyZW4uY291bnQocHJvcHNbcHJvcE5hbWVdKSAhPT0gMikgcmV0dXJuIG5ldyBFcnJvcihcIlxcXCJcIiArIHByb3BOYW1lICsgXCJcXFwiIG11c3QgYmUgZXhhY3RseSB0d28gdHJhbnNpdGlvbiBjb21wb25lbnRzLlwiKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSA6IHt9O1xudmFyIF9kZWZhdWx0ID0gUmVwbGFjZVRyYW5zaXRpb247XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL25vZGVfbW9kdWxlcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL1JlcGxhY2VUcmFuc2l0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5nZXRDaGlsZE1hcHBpbmcgPSBnZXRDaGlsZE1hcHBpbmc7XG5leHBvcnRzLm1lcmdlQ2hpbGRNYXBwaW5ncyA9IG1lcmdlQ2hpbGRNYXBwaW5ncztcbmV4cG9ydHMuZ2V0SW5pdGlhbENoaWxkTWFwcGluZyA9IGdldEluaXRpYWxDaGlsZE1hcHBpbmc7XG5leHBvcnRzLmdldE5leHRDaGlsZE1hcHBpbmcgPSBnZXROZXh0Q2hpbGRNYXBwaW5nO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKipcbiAqIEdpdmVuIGB0aGlzLnByb3BzLmNoaWxkcmVuYCwgcmV0dXJuIGFuIG9iamVjdCBtYXBwaW5nIGtleSB0byBjaGlsZC5cbiAqXG4gKiBAcGFyYW0geyp9IGNoaWxkcmVuIGB0aGlzLnByb3BzLmNoaWxkcmVuYFxuICogQHJldHVybiB7b2JqZWN0fSBNYXBwaW5nIG9mIGtleSB0byBjaGlsZFxuICovXG5mdW5jdGlvbiBnZXRDaGlsZE1hcHBpbmcoY2hpbGRyZW4sIG1hcEZuKSB7XG4gIHZhciBtYXBwZXIgPSBmdW5jdGlvbiBtYXBwZXIoY2hpbGQpIHtcbiAgICByZXR1cm4gbWFwRm4gJiYgKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkoY2hpbGQpID8gbWFwRm4oY2hpbGQpIDogY2hpbGQ7XG4gIH07XG5cbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmIChjaGlsZHJlbikgX3JlYWN0LkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gYztcbiAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAvLyBydW4gdGhlIG1hcCBmdW5jdGlvbiBoZXJlIGluc3RlYWQgc28gdGhhdCB0aGUga2V5IGlzIHRoZSBjb21wdXRlZCBvbmVcbiAgICByZXN1bHRbY2hpbGQua2V5XSA9IG1hcHBlcihjaGlsZCk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBXaGVuIHlvdSdyZSBhZGRpbmcgb3IgcmVtb3ZpbmcgY2hpbGRyZW4gc29tZSBtYXkgYmUgYWRkZWQgb3IgcmVtb3ZlZCBpbiB0aGVcbiAqIHNhbWUgcmVuZGVyIHBhc3MuIFdlIHdhbnQgdG8gc2hvdyAqYm90aCogc2luY2Ugd2Ugd2FudCB0byBzaW11bHRhbmVvdXNseVxuICogYW5pbWF0ZSBlbGVtZW50cyBpbiBhbmQgb3V0LiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcHJldmlvdXMgc2V0IG9mIGtleXNcbiAqIGFuZCBhIG5ldyBzZXQgb2Yga2V5cyBhbmQgbWVyZ2VzIHRoZW0gd2l0aCBpdHMgYmVzdCBndWVzcyBvZiB0aGUgY29ycmVjdFxuICogb3JkZXJpbmcuIEluIHRoZSBmdXR1cmUgd2UgbWF5IGV4cG9zZSBzb21lIG9mIHRoZSB1dGlsaXRpZXMgaW5cbiAqIFJlYWN0TXVsdGlDaGlsZCB0byBtYWtlIHRoaXMgZWFzeSwgYnV0IGZvciBub3cgUmVhY3QgaXRzZWxmIGRvZXMgbm90XG4gKiBkaXJlY3RseSBoYXZlIHRoaXMgY29uY2VwdCBvZiB0aGUgdW5pb24gb2YgcHJldkNoaWxkcmVuIGFuZCBuZXh0Q2hpbGRyZW5cbiAqIHNvIHdlIGltcGxlbWVudCBpdCBoZXJlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcmV2IHByZXYgY2hpbGRyZW4gYXMgcmV0dXJuZWQgZnJvbVxuICogYFJlYWN0VHJhbnNpdGlvbkNoaWxkTWFwcGluZy5nZXRDaGlsZE1hcHBpbmcoKWAuXG4gKiBAcGFyYW0ge29iamVjdH0gbmV4dCBuZXh0IGNoaWxkcmVuIGFzIHJldHVybmVkIGZyb21cbiAqIGBSZWFjdFRyYW5zaXRpb25DaGlsZE1hcHBpbmcuZ2V0Q2hpbGRNYXBwaW5nKClgLlxuICogQHJldHVybiB7b2JqZWN0fSBhIGtleSBzZXQgdGhhdCBjb250YWlucyBhbGwga2V5cyBpbiBgcHJldmAgYW5kIGFsbCBrZXlzXG4gKiBpbiBgbmV4dGAgaW4gYSByZWFzb25hYmxlIG9yZGVyLlxuICovXG5cblxuZnVuY3Rpb24gbWVyZ2VDaGlsZE1hcHBpbmdzKHByZXYsIG5leHQpIHtcbiAgcHJldiA9IHByZXYgfHwge307XG4gIG5leHQgPSBuZXh0IHx8IHt9O1xuXG4gIGZ1bmN0aW9uIGdldFZhbHVlRm9yS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkgaW4gbmV4dCA/IG5leHRba2V5XSA6IHByZXZba2V5XTtcbiAgfSAvLyBGb3IgZWFjaCBrZXkgb2YgYG5leHRgLCB0aGUgbGlzdCBvZiBrZXlzIHRvIGluc2VydCBiZWZvcmUgdGhhdCBrZXkgaW5cbiAgLy8gdGhlIGNvbWJpbmVkIGxpc3RcblxuXG4gIHZhciBuZXh0S2V5c1BlbmRpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgcGVuZGluZ0tleXMgPSBbXTtcblxuICBmb3IgKHZhciBwcmV2S2V5IGluIHByZXYpIHtcbiAgICBpZiAocHJldktleSBpbiBuZXh0KSB7XG4gICAgICBpZiAocGVuZGluZ0tleXMubGVuZ3RoKSB7XG4gICAgICAgIG5leHRLZXlzUGVuZGluZ1twcmV2S2V5XSA9IHBlbmRpbmdLZXlzO1xuICAgICAgICBwZW5kaW5nS2V5cyA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nS2V5cy5wdXNoKHByZXZLZXkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpO1xuICB2YXIgY2hpbGRNYXBwaW5nID0ge307XG5cbiAgZm9yICh2YXIgbmV4dEtleSBpbiBuZXh0KSB7XG4gICAgaWYgKG5leHRLZXlzUGVuZGluZ1tuZXh0S2V5XSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IG5leHRLZXlzUGVuZGluZ1tuZXh0S2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGVuZGluZ05leHRLZXkgPSBuZXh0S2V5c1BlbmRpbmdbbmV4dEtleV1baV07XG4gICAgICAgIGNoaWxkTWFwcGluZ1tuZXh0S2V5c1BlbmRpbmdbbmV4dEtleV1baV1dID0gZ2V0VmFsdWVGb3JLZXkocGVuZGluZ05leHRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoaWxkTWFwcGluZ1tuZXh0S2V5XSA9IGdldFZhbHVlRm9yS2V5KG5leHRLZXkpO1xuICB9IC8vIEZpbmFsbHksIGFkZCB0aGUga2V5cyB3aGljaCBkaWRuJ3QgYXBwZWFyIGJlZm9yZSBhbnkga2V5IGluIGBuZXh0YFxuXG5cbiAgZm9yIChpID0gMDsgaSA8IHBlbmRpbmdLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hpbGRNYXBwaW5nW3BlbmRpbmdLZXlzW2ldXSA9IGdldFZhbHVlRm9yS2V5KHBlbmRpbmdLZXlzW2ldKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZE1hcHBpbmc7XG59XG5cbmZ1bmN0aW9uIGdldFByb3AoY2hpbGQsIHByb3AsIHByb3BzKSB7XG4gIHJldHVybiBwcm9wc1twcm9wXSAhPSBudWxsID8gcHJvcHNbcHJvcF0gOiBjaGlsZC5wcm9wc1twcm9wXTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5pdGlhbENoaWxkTWFwcGluZyhwcm9wcywgb25FeGl0ZWQpIHtcbiAgcmV0dXJuIGdldENoaWxkTWFwcGluZyhwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwge1xuICAgICAgb25FeGl0ZWQ6IG9uRXhpdGVkLmJpbmQobnVsbCwgY2hpbGQpLFxuICAgICAgaW46IHRydWUsXG4gICAgICBhcHBlYXI6IGdldFByb3AoY2hpbGQsICdhcHBlYXInLCBwcm9wcyksXG4gICAgICBlbnRlcjogZ2V0UHJvcChjaGlsZCwgJ2VudGVyJywgcHJvcHMpLFxuICAgICAgZXhpdDogZ2V0UHJvcChjaGlsZCwgJ2V4aXQnLCBwcm9wcylcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDaGlsZE1hcHBpbmcobmV4dFByb3BzLCBwcmV2Q2hpbGRNYXBwaW5nLCBvbkV4aXRlZCkge1xuICB2YXIgbmV4dENoaWxkTWFwcGluZyA9IGdldENoaWxkTWFwcGluZyhuZXh0UHJvcHMuY2hpbGRyZW4pO1xuICB2YXIgY2hpbGRyZW4gPSBtZXJnZUNoaWxkTWFwcGluZ3MocHJldkNoaWxkTWFwcGluZywgbmV4dENoaWxkTWFwcGluZyk7XG4gIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltrZXldO1xuICAgIGlmICghKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkoY2hpbGQpKSByZXR1cm47XG4gICAgdmFyIGhhc1ByZXYgPSBrZXkgaW4gcHJldkNoaWxkTWFwcGluZztcbiAgICB2YXIgaGFzTmV4dCA9IGtleSBpbiBuZXh0Q2hpbGRNYXBwaW5nO1xuICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRNYXBwaW5nW2tleV07XG4gICAgdmFyIGlzTGVhdmluZyA9ICgwLCBfcmVhY3QuaXNWYWxpZEVsZW1lbnQpKHByZXZDaGlsZCkgJiYgIXByZXZDaGlsZC5wcm9wcy5pbjsgLy8gaXRlbSBpcyBuZXcgKGVudGVyaW5nKVxuXG4gICAgaWYgKGhhc05leHQgJiYgKCFoYXNQcmV2IHx8IGlzTGVhdmluZykpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdlbnRlcmluZycsIGtleSlcbiAgICAgIGNoaWxkcmVuW2tleV0gPSAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIHtcbiAgICAgICAgb25FeGl0ZWQ6IG9uRXhpdGVkLmJpbmQobnVsbCwgY2hpbGQpLFxuICAgICAgICBpbjogdHJ1ZSxcbiAgICAgICAgZXhpdDogZ2V0UHJvcChjaGlsZCwgJ2V4aXQnLCBuZXh0UHJvcHMpLFxuICAgICAgICBlbnRlcjogZ2V0UHJvcChjaGlsZCwgJ2VudGVyJywgbmV4dFByb3BzKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaGFzTmV4dCAmJiBoYXNQcmV2ICYmICFpc0xlYXZpbmcpIHtcbiAgICAgIC8vIGl0ZW0gaXMgb2xkIChleGl0aW5nKVxuICAgICAgLy8gY29uc29sZS5sb2coJ2xlYXZpbmcnLCBrZXkpXG4gICAgICBjaGlsZHJlbltrZXldID0gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7XG4gICAgICAgIGluOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChoYXNOZXh0ICYmIGhhc1ByZXYgJiYgKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkocHJldkNoaWxkKSkge1xuICAgICAgLy8gaXRlbSBoYXNuJ3QgY2hhbmdlZCB0cmFuc2l0aW9uIHN0YXRlc1xuICAgICAgLy8gY29weSBvdmVyIHRoZSBsYXN0IHRyYW5zaXRpb24gcHJvcHM7XG4gICAgICAvLyBjb25zb2xlLmxvZygndW5jaGFuZ2VkJywga2V5KVxuICAgICAgY2hpbGRyZW5ba2V5XSA9ICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwge1xuICAgICAgICBvbkV4aXRlZDogb25FeGl0ZWQuYmluZChudWxsLCBjaGlsZCksXG4gICAgICAgIGluOiBwcmV2Q2hpbGQucHJvcHMuaW4sXG4gICAgICAgIGV4aXQ6IGdldFByb3AoY2hpbGQsICdleGl0JywgbmV4dFByb3BzKSxcbiAgICAgICAgZW50ZXI6IGdldFByb3AoY2hpbGQsICdlbnRlcicsIG5leHRQcm9wcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvbm9kZV9tb2R1bGVzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvdXRpbHMvQ2hpbGRNYXBwaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsIi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQgUm93VGVtcGxhdGUgZnJvbSAnLi9yb3cvcm93LXRlbXBsYXRlJztcbmltcG9ydCBGb290ZXJDZWxsIGZyb20gJy4vZm9vdGVyLWNlbGwnO1xuaW1wb3J0IF8gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IEZvb3RlciA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGRhdGEsIGNsYXNzTmFtZSwgY29sdW1ucywgc2VsZWN0Um93LCBleHBhbmRSb3cgfSA9IHByb3BzO1xuXG4gIGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4sIGkpID0+IHtcbiAgICAgIGlmIChjb2x1bW4uZm9vdGVyID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmZvb3RlciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSBfLnBsdWNrKGRhdGEsIGNvbHVtbi5kYXRhRmllbGQpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Rm9vdGVyQ2VsbFxuICAgICAgICAgIGluZGV4PXsgaSB9XG4gICAgICAgICAga2V5PXsgY29sdW1uLmRhdGFGaWVsZCB9XG4gICAgICAgICAgY29sdW1uPXsgY29sdW1uIH1cbiAgICAgICAgICBjb2x1bW5EYXRhPXsgY29sdW1uRGF0YSB9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8dGZvb3Q+XG4gICAgICA8Um93VGVtcGxhdGVcbiAgICAgICAgcmVuZGVyQ29udGVudD17IHJlbmRlckNvbnRlbnQgfVxuICAgICAgICBzZWxlY3RSb3c9eyBzZWxlY3RSb3cgfVxuICAgICAgICBleHBhbmRSb3c9eyBleHBhbmRSb3cgfVxuICAgICAgICBjbGFzc05hbWU9eyBjbGFzc05hbWUgfVxuICAgICAgICBjZWxsRWw9XCJ0aFwiXG4gICAgICAvPlxuICAgIDwvdGZvb3Q+XG4gICk7XG59O1xuXG5Gb290ZXIucHJvcFR5cGVzID0ge1xuICBkYXRhOiBQcm9wVHlwZXMuYXJyYXksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY29sdW1uczogUHJvcFR5cGVzLmFycmF5LFxuICBzZWxlY3RSb3c6IFByb3BUeXBlcy5vYmplY3QsXG4gIGV4cGFuZFJvdzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9vdGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvZm9vdGVyLmpzIiwiLyogZXNsaW50IHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wczogMCAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBfIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGV2ZW50RGVsZWdhdGVyIGZyb20gJy4vY2VsbC1ldmVudC1kZWxlZ2F0ZXInO1xuXG5jbGFzcyBGb290ZXJDZWxsIGV4dGVuZHMgZXZlbnREZWxlZ2F0ZXIoUmVhY3QuQ29tcG9uZW50KSB7XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGluZGV4LCBjb2x1bW4sIGNvbHVtbkRhdGEgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCB7XG4gICAgICBmb290ZXIsXG4gICAgICBmb290ZXJUaXRsZSxcbiAgICAgIGZvb3RlckFsaWduLFxuICAgICAgZm9vdGVyRm9ybWF0dGVyLFxuICAgICAgZm9vdGVyRXZlbnRzLFxuICAgICAgZm9vdGVyQ2xhc3NlcyxcbiAgICAgIGZvb3RlclN0eWxlLFxuICAgICAgZm9vdGVyQXR0cnNcbiAgICB9ID0gY29sdW1uO1xuXG4gICAgY29uc3QgZGVsZWdhdGVFdmVudHMgPSB0aGlzLmRlbGVnYXRlKGZvb3RlckV2ZW50cyk7XG4gICAgY29uc3QgY2VsbEF0dHJzID0ge1xuICAgICAgLi4uKF8uaXNGdW5jdGlvbihmb290ZXJBdHRycykgPyBmb290ZXJBdHRycyhjb2x1bW4sIGluZGV4KSA6IGZvb3RlckF0dHJzKSxcbiAgICAgIC4uLmRlbGVnYXRlRXZlbnRzXG4gICAgfTtcblxuXG4gICAgbGV0IHRleHQgPSAnJztcbiAgICBpZiAoXy5pc1N0cmluZyhmb290ZXIpKSB7XG4gICAgICB0ZXh0ID0gZm9vdGVyO1xuICAgIH0gZWxzZSBpZiAoXy5pc0Z1bmN0aW9uKGZvb3RlcikpIHtcbiAgICAgIHRleHQgPSBmb290ZXIoY29sdW1uRGF0YSwgY29sdW1uLCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGV0IGNlbGxTdHlsZSA9IHt9O1xuICAgIGNvbnN0IGNlbGxDbGFzc2VzID0gXy5pc0Z1bmN0aW9uKGZvb3RlckNsYXNzZXMpID8gZm9vdGVyQ2xhc3Nlcyhjb2x1bW4sIGluZGV4KSA6IGZvb3RlckNsYXNzZXM7XG5cbiAgICBpZiAoZm9vdGVyU3R5bGUpIHtcbiAgICAgIGNlbGxTdHlsZSA9IF8uaXNGdW5jdGlvbihmb290ZXJTdHlsZSkgPyBmb290ZXJTdHlsZShjb2x1bW4sIGluZGV4KSA6IGZvb3RlclN0eWxlO1xuICAgICAgY2VsbFN0eWxlID0gY2VsbFN0eWxlID8geyAuLi5jZWxsU3R5bGUgfSA6IGNlbGxTdHlsZTtcbiAgICB9XG5cbiAgICBpZiAoZm9vdGVyVGl0bGUpIHtcbiAgICAgIGNlbGxBdHRycy50aXRsZSA9IF8uaXNGdW5jdGlvbihmb290ZXJUaXRsZSkgPyBmb290ZXJUaXRsZShjb2x1bW4sIGluZGV4KSA6IHRleHQ7XG4gICAgfVxuXG4gICAgaWYgKGZvb3RlckFsaWduKSB7XG4gICAgICBjZWxsU3R5bGUudGV4dEFsaWduID0gXy5pc0Z1bmN0aW9uKGZvb3RlckFsaWduKSA/IGZvb3RlckFsaWduKGNvbHVtbiwgaW5kZXgpIDogZm9vdGVyQWxpZ247XG4gICAgfVxuXG4gICAgaWYgKGNlbGxDbGFzc2VzKSBjZWxsQXR0cnMuY2xhc3NOYW1lID0gY3MoY2VsbEF0dHJzLmNsYXNzTmFtZSwgY2VsbENsYXNzZXMpO1xuICAgIGlmICghXy5pc0VtcHR5T2JqZWN0KGNlbGxTdHlsZSkpIGNlbGxBdHRycy5zdHlsZSA9IGNlbGxTdHlsZTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gZm9vdGVyRm9ybWF0dGVyID8gZm9vdGVyRm9ybWF0dGVyKGNvbHVtbiwgaW5kZXgpIDogdGV4dDtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCd0aCcsIGNlbGxBdHRycywgY2hpbGRyZW4pO1xuICB9XG59XG5cbkZvb3RlckNlbGwucHJvcFR5cGVzID0ge1xuICBjb2x1bW5EYXRhOiBQcm9wVHlwZXMuYXJyYXksXG4gIGluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBjb2x1bW46IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvb3RlckNlbGw7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9mb290ZXItY2VsbC5qcyIsImltcG9ydCBfIGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBDb2x1bW5SZXNvbHZlciBmcm9tICcuL2NvbHVtbi1yZXNvbHZlcic7XG5cbmV4cG9ydCBkZWZhdWx0IEV4dGVuZEJhc2UgPT5cbiAgY2xhc3MgVGFibGVSZXNvbHZlciBleHRlbmRzIENvbHVtblJlc29sdmVyKEV4dGVuZEJhc2UpIHtcbiAgICB2YWxpZGF0ZVByb3BzKCkge1xuICAgICAgY29uc3QgeyBrZXlGaWVsZCB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICgha2V5RmllbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2Ugc3BlY2lmeSBhIGZpZWxkIGFzIGtleSB2aWEga2V5RmllbGQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZpc2libGVDb2x1bW5TaXplKGZhbHNlKSA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmlzaWJsZSBjb2x1bW5zIGRldGVjdGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmRhdGEubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHZpc2libGVSb3dzKCkge1xuICAgICAgY29uc3QgeyBkYXRhLCBoaWRkZW5Sb3dzLCBrZXlGaWVsZCB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICghaGlkZGVuUm93cyB8fCBoaWRkZW5Sb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRhdGE7XG4gICAgICByZXR1cm4gZGF0YS5maWx0ZXIoKHJvdykgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBfLmdldChyb3csIGtleUZpZWxkKTtcbiAgICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKGhpZGRlblJvd3MsIGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9wcm9wcy1yZXNvbHZlci9pbmRleC5qcyIsImV4cG9ydCBkZWZhdWx0IEV4dGVuZEJhc2UgPT5cbiAgY2xhc3MgQ29sdW1uUmVzb2x2ZXIgZXh0ZW5kcyBFeHRlbmRCYXNlIHtcbiAgICB2aXNpYmxlQ29sdW1uU2l6ZShpbmNsdWRlU2VsZWN0Q29sdW1uID0gdHJ1ZSkge1xuICAgICAgbGV0IGNvbHVtbkxlbjtcbiAgICAgIGlmICh0aGlzLnByb3BzLmNvbHVtblRvZ2dsZSAmJiB0aGlzLnByb3BzLmNvbHVtblRvZ2dsZS50b2dnbGVzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLnByb3BzLmNvbHVtblRvZ2dsZS50b2dnbGVzO1xuICAgICAgICBjb2x1bW5MZW4gPSBPYmplY3Qua2V5cyhjb2x1bW5zKS5maWx0ZXIobmFtZSA9PiBjb2x1bW5zW25hbWVdKS5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2x1bW5MZW4gPSB0aGlzLnByb3BzLmNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaGlkZGVuKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoIWluY2x1ZGVTZWxlY3RDb2x1bW4pIHJldHVybiBjb2x1bW5MZW47XG4gICAgICBpZiAodGhpcy5wcm9wcy5zZWxlY3RSb3cgJiYgIXRoaXMucHJvcHMuc2VsZWN0Um93LmhpZGVTZWxlY3RDb2x1bW4pIHtcbiAgICAgICAgY29sdW1uTGVuICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9wcy5leHBhbmRSb3cgJiYgdGhpcy5wcm9wcy5leHBhbmRSb3cuc2hvd0V4cGFuZENvbHVtbikge1xuICAgICAgICBjb2x1bW5MZW4gKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW5MZW47XG4gICAgfVxuICB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvcHJvcHMtcmVzb2x2ZXIvY29sdW1uLXJlc29sdmVyLmpzIiwiLyogZXNsaW50IGNhbWVsY2FzZTogMCAqL1xuLyogZXNsaW50IG5vLXJldHVybi1hc3NpZ246IDAgKi9cbi8qIGVzbGludCBuby1wYXJhbS1yZWFzc2lnbjogMCAqL1xuLyogZXNsaW50IGNsYXNzLW1ldGhvZHMtdXNlLXRoaXM6IDAgKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgXyBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgY3JlYXRlRGF0YUNvbnRleHQgZnJvbSAnLi9kYXRhLWNvbnRleHQnO1xuaW1wb3J0IGNyZWF0ZUNvbHVtbk1ndENvbnRleHQgZnJvbSAnLi9jb2x1bW4tY29udGV4dCc7XG5pbXBvcnQgY3JlYXRlU29ydENvbnRleHQgZnJvbSAnLi9zb3J0LWNvbnRleHQnO1xuaW1wb3J0IFNlbGVjdGlvbkNvbnRleHQgZnJvbSAnLi9zZWxlY3Rpb24tY29udGV4dCc7XG5pbXBvcnQgUm93RXhwYW5kQ29udGV4dCBmcm9tICcuL3Jvdy1leHBhbmQtY29udGV4dCc7XG5pbXBvcnQgcmVtb3RlUmVzb2x2ZXIgZnJvbSAnLi4vcHJvcHMtcmVzb2x2ZXIvcmVtb3RlLXJlc29sdmVyJztcbmltcG9ydCB7IEJvb3RzdHJhcENvbnRleHQgfSBmcm9tICcuL2Jvb3RzdHJhcCc7XG5pbXBvcnQgZGF0YU9wZXJhdG9yIGZyb20gJy4uL3N0b3JlL29wZXJhdG9ycyc7XG5cbmNvbnN0IHdpdGhDb250ZXh0ID0gQmFzZSA9PlxuICBjbGFzcyBCb290c3RyYXBUYWJsZUNvbnRhaW5lciBleHRlbmRzIHJlbW90ZVJlc29sdmVyKENvbXBvbmVudCkge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICBzdXBlcihwcm9wcyk7XG4gICAgICB0aGlzLkRhdGFDb250ZXh0ID0gY3JlYXRlRGF0YUNvbnRleHQoKTtcblxuICAgICAgaWYgKHByb3BzLnJlZ2lzdGVyRXhwb3NlZEFQSSkge1xuICAgICAgICBjb25zdCBleHBvc2VkQVBJRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgZXhwb3NlZEFQSUVtaXR0ZXIub24oJ2dldC50YWJsZS5kYXRhJywgcGF5bG9hZCA9PiBwYXlsb2FkLnJlc3VsdCA9IHRoaXMudGFibGUuZ2V0RGF0YSgpKTtcbiAgICAgICAgZXhwb3NlZEFQSUVtaXR0ZXIub24oJ2dldC5zZWxlY3RlZC5yb3dzJywgcGF5bG9hZCA9PiBwYXlsb2FkLnJlc3VsdCA9IHRoaXMuc2VsZWN0aW9uQ29udGV4dC5nZXRTZWxlY3RlZCgpKTtcbiAgICAgICAgZXhwb3NlZEFQSUVtaXR0ZXIub24oJ2dldC5maWx0ZXJlZC5yb3dzJywgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hDb250ZXh0KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlc3VsdCA9IHRoaXMuc2VhcmNoQ29udGV4dC5nZXRTZWFyY2hlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJDb250ZXh0KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlc3VsdCA9IHRoaXMuZmlsdGVyQ29udGV4dC5nZXRGaWx0ZXJlZCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlc3VsdCA9IHRoaXMudGFibGUuZ2V0RGF0YSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHByb3BzLnJlZ2lzdGVyRXhwb3NlZEFQSShleHBvc2VkQVBJRW1pdHRlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnNvcnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5Tb3J0Q29udGV4dCA9IGNyZWF0ZVNvcnRDb250ZXh0KFxuICAgICAgICAgIGRhdGFPcGVyYXRvciwgdGhpcy5pc1JlbW90ZVNvcnQsIHRoaXMuaGFuZGxlUmVtb3RlU29ydENoYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuY29sdW1uVG9nZ2xlIHx8XG4gICAgICAgIHByb3BzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuaGlkZGVuKS5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5Db2x1bW5NYW5hZ2VtZW50Q29udGV4dCA9IGNyZWF0ZUNvbHVtbk1ndENvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnNlbGVjdFJvdykge1xuICAgICAgICB0aGlzLlNlbGVjdGlvbkNvbnRleHQgPSBTZWxlY3Rpb25Db250ZXh0O1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZXhwYW5kUm93KSB7XG4gICAgICAgIHRoaXMuUm93RXhwYW5kQ29udGV4dCA9IFJvd0V4cGFuZENvbnRleHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5jZWxsRWRpdCAmJiBwcm9wcy5jZWxsRWRpdC5jcmVhdGVDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuQ2VsbEVkaXRDb250ZXh0ID0gcHJvcHMuY2VsbEVkaXQuY3JlYXRlQ29udGV4dChcbiAgICAgICAgICBfLCBkYXRhT3BlcmF0b3IsIHRoaXMuaXNSZW1vdGVDZWxsRWRpdCwgdGhpcy5oYW5kbGVSZW1vdGVDZWxsQ2hhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmZpbHRlcikge1xuICAgICAgICB0aGlzLkZpbHRlckNvbnRleHQgPSBwcm9wcy5maWx0ZXIuY3JlYXRlQ29udGV4dChcbiAgICAgICAgICBfLCB0aGlzLmlzUmVtb3RlRmlsdGVyaW5nLCB0aGlzLmhhbmRsZVJlbW90ZUZpbHRlckNoYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5wYWdpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuUGFnaW5hdGlvbkNvbnRleHQgPSBwcm9wcy5wYWdpbmF0aW9uLmNyZWF0ZUNvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnNlYXJjaCAmJiBwcm9wcy5zZWFyY2guc2VhcmNoQ29udGV4dCkge1xuICAgICAgICB0aGlzLlNlYXJjaENvbnRleHQgPSBwcm9wcy5zZWFyY2guc2VhcmNoQ29udGV4dChcbiAgICAgICAgICBfLCB0aGlzLmlzUmVtb3RlU2VhcmNoLCB0aGlzLmhhbmRsZVJlbW90ZVNlYXJjaENoYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5zZXREZXBlbmRlbmN5TW9kdWxlcykge1xuICAgICAgICBwcm9wcy5zZXREZXBlbmRlbmN5TW9kdWxlcyhfKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnNldFBhZ2luYXRpb25SZW1vdGVFbWl0dGVyKSB7XG4gICAgICAgIHByb3BzLnNldFBhZ2luYXRpb25SZW1vdGVFbWl0dGVyKHRoaXMucmVtb3RlRW1pdHRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICBpZiAobmV4dFByb3BzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuc29ydCkubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgdGhpcy5Tb3J0Q29udGV4dCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLlNvcnRDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuU29ydENvbnRleHQgPSBjcmVhdGVTb3J0Q29udGV4dChcbiAgICAgICAgICBkYXRhT3BlcmF0b3IsIHRoaXMuaXNSZW1vdGVTb3J0LCB0aGlzLmhhbmRsZVJlbW90ZVNvcnRDaGFuZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKCFuZXh0UHJvcHMucGFnaW5hdGlvbiAmJiB0aGlzLnByb3BzLnBhZ2luYXRpb24pIHtcbiAgICAgICAgdGhpcy5QYWdpbmF0aW9uQ29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAobmV4dFByb3BzLnBhZ2luYXRpb24gJiYgIXRoaXMucHJvcHMucGFnaW5hdGlvbikge1xuICAgICAgICB0aGlzLlBhZ2luYXRpb25Db250ZXh0ID0gbmV4dFByb3BzLnBhZ2luYXRpb24uY3JlYXRlQ29udGV4dChcbiAgICAgICAgICB0aGlzLmlzUmVtb3RlUGFnaW5hdGlvbiwgdGhpcy5oYW5kbGVSZW1vdGVQYWdlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICAgIGlmICghbmV4dFByb3BzLmNlbGxFZGl0ICYmIHRoaXMucHJvcHMuY2VsbEVkaXQpIHtcbiAgICAgICAgdGhpcy5DZWxsRWRpdENvbnRleHQgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRQcm9wcy5jZWxsRWRpdCAmJiAhdGhpcy5wcm9wcy5jZWxsRWRpdCkge1xuICAgICAgICB0aGlzLkNlbGxFZGl0Q29udGV4dCA9IG5leHRQcm9wcy5jZWxsRWRpdC5jcmVhdGVDb250ZXh0KFxuICAgICAgICAgIF8sIGRhdGFPcGVyYXRvciwgdGhpcy5pc1JlbW90ZUNlbGxFZGl0LCB0aGlzLmhhbmRsZVJlbW90ZUNlbGxDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckJhc2UoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICByb290UHJvcHMsXG4gICAgICAgIGZpbHRlclByb3BzLFxuICAgICAgICBzZWFyY2hQcm9wcyxcbiAgICAgICAgc29ydFByb3BzLFxuICAgICAgICBwYWdpbmF0aW9uUHJvcHMsXG4gICAgICAgIGNvbHVtblRvZ2dsZVByb3BzXG4gICAgICApID0+IChcbiAgICAgICAgPEJhc2VcbiAgICAgICAgICByZWY9eyBuID0+IHRoaXMudGFibGUgPSBuIH1cbiAgICAgICAgICB7IC4uLnRoaXMucHJvcHMgfVxuICAgICAgICAgIHsgLi4uc29ydFByb3BzIH1cbiAgICAgICAgICB7IC4uLmZpbHRlclByb3BzIH1cbiAgICAgICAgICB7IC4uLnNlYXJjaFByb3BzIH1cbiAgICAgICAgICB7IC4uLnBhZ2luYXRpb25Qcm9wcyB9XG4gICAgICAgICAgeyAuLi5jb2x1bW5Ub2dnbGVQcm9wcyB9XG4gICAgICAgICAgZGF0YT17IHJvb3RQcm9wcy5nZXREYXRhKGZpbHRlclByb3BzLCBzZWFyY2hQcm9wcywgc29ydFByb3BzLCBwYWdpbmF0aW9uUHJvcHMpIH1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyV2l0aENvbHVtbk1hbmFnZW1lbnRDdHgoYmFzZSwgYmFzZVByb3BzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICByb290UHJvcHMsXG4gICAgICAgIGZpbHRlclByb3BzLFxuICAgICAgICBzZWFyY2hQcm9wcyxcbiAgICAgICAgc29ydFByb3BzLFxuICAgICAgICBwYWdpbmF0aW9uUHJvcHNcbiAgICAgICkgPT4gKFxuICAgICAgICA8dGhpcy5Db2x1bW5NYW5hZ2VtZW50Q29udGV4dC5Qcm92aWRlclxuICAgICAgICAgIHsgLi4uYmFzZVByb3BzIH1cbiAgICAgICAgICB0b2dnbGVzPXsgdGhpcy5wcm9wcy5jb2x1bW5Ub2dnbGUgPyB0aGlzLnByb3BzLmNvbHVtblRvZ2dsZS50b2dnbGVzIDogbnVsbCB9XG4gICAgICAgID5cbiAgICAgICAgICA8dGhpcy5Db2x1bW5NYW5hZ2VtZW50Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sdW1uVG9nZ2xlUHJvcHMgPT4gYmFzZShcbiAgICAgICAgICAgICAgICByb290UHJvcHMsXG4gICAgICAgICAgICAgICAgZmlsdGVyUHJvcHMsXG4gICAgICAgICAgICAgICAgc2VhcmNoUHJvcHMsXG4gICAgICAgICAgICAgICAgc29ydFByb3BzLFxuICAgICAgICAgICAgICAgIHBhZ2luYXRpb25Qcm9wcyxcbiAgICAgICAgICAgICAgICBjb2x1bW5Ub2dnbGVQcm9wc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90aGlzLkNvbHVtbk1hbmFnZW1lbnRDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICA8L3RoaXMuQ29sdW1uTWFuYWdlbWVudENvbnRleHQuUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcldpdGhTZWxlY3Rpb25DdHgoYmFzZSwgYmFzZVByb3BzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICByb290UHJvcHMsXG4gICAgICAgIGZpbHRlclByb3BzLFxuICAgICAgICBzZWFyY2hQcm9wcyxcbiAgICAgICAgc29ydFByb3BzLFxuICAgICAgICBwYWdpbmF0aW9uUHJvcHNcbiAgICAgICkgPT4gKFxuICAgICAgICA8dGhpcy5TZWxlY3Rpb25Db250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgeyAuLi5iYXNlUHJvcHMgfVxuICAgICAgICAgIHJlZj17IG4gPT4gdGhpcy5zZWxlY3Rpb25Db250ZXh0ID0gbiB9XG4gICAgICAgICAgc2VsZWN0Um93PXsgdGhpcy5wcm9wcy5zZWxlY3RSb3cgfVxuICAgICAgICAgIGRhdGE9eyByb290UHJvcHMuZ2V0RGF0YShmaWx0ZXJQcm9wcywgc2VhcmNoUHJvcHMsIHNvcnRQcm9wcywgcGFnaW5hdGlvblByb3BzKSB9XG4gICAgICAgID5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBiYXNlKFxuICAgICAgICAgICAgICByb290UHJvcHMsXG4gICAgICAgICAgICAgIGZpbHRlclByb3BzLFxuICAgICAgICAgICAgICBzZWFyY2hQcm9wcyxcbiAgICAgICAgICAgICAgc29ydFByb3BzLFxuICAgICAgICAgICAgICBwYWdpbmF0aW9uUHJvcHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIDwvdGhpcy5TZWxlY3Rpb25Db250ZXh0LlByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXJXaXRoUm93RXhwYW5kQ3R4KGJhc2UsIGJhc2VQcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgcm9vdFByb3BzLFxuICAgICAgICBmaWx0ZXJQcm9wcyxcbiAgICAgICAgc2VhcmNoUHJvcHMsXG4gICAgICAgIHNvcnRQcm9wcyxcbiAgICAgICAgcGFnaW5hdGlvblByb3BzXG4gICAgICApID0+IChcbiAgICAgICAgPHRoaXMuUm93RXhwYW5kQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgIHsgLi4uYmFzZVByb3BzIH1cbiAgICAgICAgICByZWY9eyBuID0+IHRoaXMucm93RXhwYW5kQ29udGV4dCA9IG4gfVxuICAgICAgICAgIGV4cGFuZFJvdz17IHRoaXMucHJvcHMuZXhwYW5kUm93IH1cbiAgICAgICAgICBkYXRhPXsgcm9vdFByb3BzLmdldERhdGEoZmlsdGVyUHJvcHMsIHNlYXJjaFByb3BzLCBzb3J0UHJvcHMsIHBhZ2luYXRpb25Qcm9wcykgfVxuICAgICAgICA+XG4gICAgICAgICAge1xuICAgICAgICAgICAgYmFzZShcbiAgICAgICAgICAgICAgcm9vdFByb3BzLFxuICAgICAgICAgICAgICBmaWx0ZXJQcm9wcyxcbiAgICAgICAgICAgICAgc2VhcmNoUHJvcHMsXG4gICAgICAgICAgICAgIHNvcnRQcm9wcyxcbiAgICAgICAgICAgICAgcGFnaW5hdGlvblByb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICA8L3RoaXMuUm93RXhwYW5kQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyV2l0aFBhZ2luYXRpb25DdHgoYmFzZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgcm9vdFByb3BzLFxuICAgICAgICBmaWx0ZXJQcm9wcyxcbiAgICAgICAgc2VhcmNoUHJvcHMsXG4gICAgICAgIHNvcnRQcm9wc1xuICAgICAgKSA9PiAoXG4gICAgICAgIDx0aGlzLlBhZ2luYXRpb25Db250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgcmVmPXsgbiA9PiB0aGlzLnBhZ2luYXRpb25Db250ZXh0ID0gbiB9XG4gICAgICAgICAgcGFnaW5hdGlvbj17IHRoaXMucHJvcHMucGFnaW5hdGlvbiB9XG4gICAgICAgICAgZGF0YT17IHJvb3RQcm9wcy5nZXREYXRhKGZpbHRlclByb3BzLCBzZWFyY2hQcm9wcywgc29ydFByb3BzKSB9XG4gICAgICAgICAgYm9vdHN0cmFwND17IHRoaXMucHJvcHMuYm9vdHN0cmFwNCB9XG4gICAgICAgICAgaXNSZW1vdGVQYWdpbmF0aW9uPXsgdGhpcy5pc1JlbW90ZVBhZ2luYXRpb24gfVxuICAgICAgICAgIHJlbW90ZUVtaXR0ZXI9eyB0aGlzLnJlbW90ZUVtaXR0ZXIgfVxuICAgICAgICAgIG9uRGF0YVNpemVDaGFuZ2U9eyB0aGlzLnByb3BzLm9uRGF0YVNpemVDaGFuZ2UgfVxuICAgICAgICA+XG4gICAgICAgICAgPHRoaXMuUGFnaW5hdGlvbkNvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhZ2luYXRpb25Qcm9wcyA9PiBiYXNlKFxuICAgICAgICAgICAgICAgIHJvb3RQcm9wcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJQcm9wcyxcbiAgICAgICAgICAgICAgICBzZWFyY2hQcm9wcyxcbiAgICAgICAgICAgICAgICBzb3J0UHJvcHMsXG4gICAgICAgICAgICAgICAgcGFnaW5hdGlvblByb3BzXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoaXMuUGFnaW5hdGlvbkNvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIDwvdGhpcy5QYWdpbmF0aW9uQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyV2l0aFNvcnRDdHgoYmFzZSwgYmFzZVByb3BzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICByb290UHJvcHMsXG4gICAgICAgIGZpbHRlclByb3BzLFxuICAgICAgICBzZWFyY2hQcm9wc1xuICAgICAgKSA9PiAoXG4gICAgICAgIDx0aGlzLlNvcnRDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgeyAuLi5iYXNlUHJvcHMgfVxuICAgICAgICAgIHJlZj17IG4gPT4gdGhpcy5zb3J0Q29udGV4dCA9IG4gfVxuICAgICAgICAgIGRlZmF1bHRTb3J0ZWQ9eyB0aGlzLnByb3BzLmRlZmF1bHRTb3J0ZWQgfVxuICAgICAgICAgIGRlZmF1bHRTb3J0RGlyZWN0aW9uPXsgdGhpcy5wcm9wcy5kZWZhdWx0U29ydERpcmVjdGlvbiB9XG4gICAgICAgICAgc29ydD17IHRoaXMucHJvcHMuc29ydCB9XG4gICAgICAgICAgZGF0YT17IHJvb3RQcm9wcy5nZXREYXRhKGZpbHRlclByb3BzLCBzZWFyY2hQcm9wcykgfVxuICAgICAgICA+XG4gICAgICAgICAgPHRoaXMuU29ydENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNvcnRQcm9wcyA9PiBiYXNlKFxuICAgICAgICAgICAgICAgIHJvb3RQcm9wcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJQcm9wcyxcbiAgICAgICAgICAgICAgICBzZWFyY2hQcm9wcyxcbiAgICAgICAgICAgICAgICBzb3J0UHJvcHMsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoaXMuU29ydENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIDwvdGhpcy5Tb3J0Q29udGV4dC5Qcm92aWRlcj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyV2l0aFNlYXJjaEN0eChiYXNlLCBiYXNlUHJvcHMpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJvb3RQcm9wcyxcbiAgICAgICAgZmlsdGVyUHJvcHNcbiAgICAgICkgPT4gKFxuICAgICAgICA8dGhpcy5TZWFyY2hDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgeyAuLi5iYXNlUHJvcHMgfVxuICAgICAgICAgIHJlZj17IG4gPT4gdGhpcy5zZWFyY2hDb250ZXh0ID0gbiB9XG4gICAgICAgICAgZGF0YT17IHJvb3RQcm9wcy5nZXREYXRhKGZpbHRlclByb3BzKSB9XG4gICAgICAgICAgc2VhcmNoVGV4dD17IHRoaXMucHJvcHMuc2VhcmNoLnNlYXJjaFRleHQgfVxuICAgICAgICAgIGRhdGFDaGFuZ2VMaXN0ZW5lcj17IHRoaXMucHJvcHMuZGF0YUNoYW5nZUxpc3RlbmVyIH1cbiAgICAgICAgPlxuICAgICAgICAgIDx0aGlzLlNlYXJjaENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNlYXJjaFByb3BzID0+IGJhc2UoXG4gICAgICAgICAgICAgICAgcm9vdFByb3BzLFxuICAgICAgICAgICAgICAgIGZpbHRlclByb3BzLFxuICAgICAgICAgICAgICAgIHNlYXJjaFByb3BzXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoaXMuU2VhcmNoQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgPC90aGlzLlNlYXJjaENvbnRleHQuUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcldpdGhGaWx0ZXJDdHgoYmFzZSwgYmFzZVByb3BzKSB7XG4gICAgICByZXR1cm4gcm9vdFByb3BzID0+IChcbiAgICAgICAgPHRoaXMuRmlsdGVyQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgIHsgLi4uYmFzZVByb3BzIH1cbiAgICAgICAgICByZWY9eyBuID0+IHRoaXMuZmlsdGVyQ29udGV4dCA9IG4gfVxuICAgICAgICAgIGRhdGE9eyByb290UHJvcHMuZ2V0RGF0YSgpIH1cbiAgICAgICAgICBkYXRhQ2hhbmdlTGlzdGVuZXI9eyB0aGlzLnByb3BzLmRhdGFDaGFuZ2VMaXN0ZW5lciB9XG4gICAgICAgID5cbiAgICAgICAgICA8dGhpcy5GaWx0ZXJDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWx0ZXJQcm9wcyA9PiBiYXNlKFxuICAgICAgICAgICAgICAgIHJvb3RQcm9wcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJQcm9wc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90aGlzLkZpbHRlckNvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIDwvdGhpcy5GaWx0ZXJDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXJXaXRoQ2VsbEVkaXRDdHgoYmFzZSwgYmFzZVByb3BzKSB7XG4gICAgICByZXR1cm4gcm9vdFByb3BzID0+IChcbiAgICAgICAgPHRoaXMuQ2VsbEVkaXRDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgeyAuLi5iYXNlUHJvcHMgfVxuICAgICAgICAgIHJlZj17IG4gPT4gdGhpcy5jZWxsRWRpdENvbnRleHQgPSBuIH1cbiAgICAgICAgICBzZWxlY3RSb3c9eyB0aGlzLnByb3BzLnNlbGVjdFJvdyB9XG4gICAgICAgICAgY2VsbEVkaXQ9eyB0aGlzLnByb3BzLmNlbGxFZGl0IH1cbiAgICAgICAgICBkYXRhPXsgcm9vdFByb3BzLmdldERhdGEoKSB9XG4gICAgICAgID5cbiAgICAgICAgICB7IGJhc2Uocm9vdFByb3BzKSB9XG4gICAgICAgIDwvdGhpcy5DZWxsRWRpdENvbnRleHQuUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHsga2V5RmllbGQsIGNvbHVtbnMsIGJvb3RzdHJhcDQgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBiYXNlUHJvcHMgPSB7IGtleUZpZWxkLCBjb2x1bW5zIH07XG5cbiAgICAgIGxldCBiYXNlID0gdGhpcy5yZW5kZXJCYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLkNvbHVtbk1hbmFnZW1lbnRDb250ZXh0KSB7XG4gICAgICAgIGJhc2UgPSB0aGlzLnJlbmRlcldpdGhDb2x1bW5NYW5hZ2VtZW50Q3R4KGJhc2UsIGJhc2VQcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLlNlbGVjdGlvbkNvbnRleHQpIHtcbiAgICAgICAgYmFzZSA9IHRoaXMucmVuZGVyV2l0aFNlbGVjdGlvbkN0eChiYXNlLCBiYXNlUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5Sb3dFeHBhbmRDb250ZXh0KSB7XG4gICAgICAgIGJhc2UgPSB0aGlzLnJlbmRlcldpdGhSb3dFeHBhbmRDdHgoYmFzZSwgYmFzZVByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuUGFnaW5hdGlvbkNvbnRleHQpIHtcbiAgICAgICAgYmFzZSA9IHRoaXMucmVuZGVyV2l0aFBhZ2luYXRpb25DdHgoYmFzZSwgYmFzZVByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuU29ydENvbnRleHQpIHtcbiAgICAgICAgYmFzZSA9IHRoaXMucmVuZGVyV2l0aFNvcnRDdHgoYmFzZSwgYmFzZVByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuU2VhcmNoQ29udGV4dCkge1xuICAgICAgICBiYXNlID0gdGhpcy5yZW5kZXJXaXRoU2VhcmNoQ3R4KGJhc2UsIGJhc2VQcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLkZpbHRlckNvbnRleHQpIHtcbiAgICAgICAgYmFzZSA9IHRoaXMucmVuZGVyV2l0aEZpbHRlckN0eChiYXNlLCBiYXNlUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5DZWxsRWRpdENvbnRleHQpIHtcbiAgICAgICAgYmFzZSA9IHRoaXMucmVuZGVyV2l0aENlbGxFZGl0Q3R4KGJhc2UsIGJhc2VQcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb290c3RyYXBDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXsgeyBib290c3RyYXA0IH0gfT5cbiAgICAgICAgICA8dGhpcy5EYXRhQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgICAgeyAuLi5iYXNlUHJvcHMgfVxuICAgICAgICAgICAgZGF0YT17IHRoaXMucHJvcHMuZGF0YSB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRoaXMuRGF0YUNvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiYXNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGhpcy5EYXRhQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICA8L3RoaXMuRGF0YUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgIDwvQm9vdHN0cmFwQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQ29udGV4dDtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL2luZGV4LmpzIiwiLyogZXNsaW50IGNhbWVsY2FzZTogMCAqL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcbiAgY29uc3QgRGF0YUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KCk7XG5cbiAgY2xhc3MgRGF0YVByb3ZpZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgZGF0YTogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZFxuICAgIH1cblxuICAgIHN0YXRlID0geyBkYXRhOiB0aGlzLnByb3BzLmRhdGEgfTtcblxuICAgIGdldERhdGEgPSAoZmlsdGVyUHJvcHMsIHNlYXJjaFByb3BzLCBzb3J0UHJvcHMsIHBhZ2luYXRpb25Qcm9wcykgPT4ge1xuICAgICAgaWYgKHBhZ2luYXRpb25Qcm9wcykgcmV0dXJuIHBhZ2luYXRpb25Qcm9wcy5kYXRhO1xuICAgICAgZWxzZSBpZiAoc29ydFByb3BzKSByZXR1cm4gc29ydFByb3BzLmRhdGE7XG4gICAgICBlbHNlIGlmIChzZWFyY2hQcm9wcykgcmV0dXJuIHNlYXJjaFByb3BzLmRhdGE7XG4gICAgICBlbHNlIGlmIChmaWx0ZXJQcm9wcykgcmV0dXJuIGZpbHRlclByb3BzLmRhdGE7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5kYXRhO1xuICAgIH1cblxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoKSA9PiAoeyBkYXRhOiBuZXh0UHJvcHMuZGF0YSB9KSk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERhdGFDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9eyB7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXG4gICAgICAgICAgICBnZXREYXRhOiB0aGlzLmdldERhdGFcbiAgICAgICAgICB9IH1cbiAgICAgICAgPlxuICAgICAgICAgIHsgdGhpcy5wcm9wcy5jaGlsZHJlbiB9XG4gICAgICAgIDwvRGF0YUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIFByb3ZpZGVyOiBEYXRhUHJvdmlkZXIsXG4gICAgQ29uc3VtZXI6IERhdGFDb250ZXh0LkNvbnN1bWVyXG4gIH07XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvcmVhY3QtYm9vdHN0cmFwLXRhYmxlMi9zcmMvY29udGV4dHMvZGF0YS1jb250ZXh0LmpzIiwiLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbi8qIGVzbGludCByZWFjdC9wcmVmZXItc3RhdGVsZXNzLWZ1bmN0aW9uOiAwICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICBjb25zdCBDb2x1bW5NYW5hZ2VtZW50Q29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoKTtcblxuICBjbGFzcyBDb2x1bW5NYW5hZ2VtZW50UHJvdmlkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBjb2x1bW5zOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICAgIHRvZ2dsZXM6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgdG9nZ2xlczogbnVsbFxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGxldCB0b2dnbGVDb2x1bW47XG4gICAgICBjb25zdCB7IGNvbHVtbnMsIHRvZ2dsZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgICBpZiAodG9nZ2xlcykge1xuICAgICAgICB0b2dnbGVDb2x1bW4gPSBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gdG9nZ2xlc1tjb2x1bW4uZGF0YUZpZWxkXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2dnbGVDb2x1bW4gPSBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5oaWRkZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENvbHVtbk1hbmFnZW1lbnRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXsgeyBjb2x1bW5zOiB0b2dnbGVDb2x1bW4gfSB9PlxuICAgICAgICAgIHsgdGhpcy5wcm9wcy5jaGlsZHJlbiB9XG4gICAgICAgIDwvQ29sdW1uTWFuYWdlbWVudENvbnRleHQuUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgUHJvdmlkZXI6IENvbHVtbk1hbmFnZW1lbnRQcm92aWRlcixcbiAgICBDb25zdW1lcjogQ29sdW1uTWFuYWdlbWVudENvbnRleHQuQ29uc3VtZXJcbiAgfTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9jb250ZXh0cy9jb2x1bW4tY29udGV4dC5qcyIsIi8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi9cbi8qIGVzbGludCByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IENvbnN0IGZyb20gJy4uL2NvbnN0JztcblxuZXhwb3J0IGRlZmF1bHQgKFxuICBkYXRhT3BlcmF0b3IsXG4gIGlzUmVtb3RlU29ydCxcbiAgaGFuZGxlU29ydENoYW5nZVxuKSA9PiB7XG4gIGNvbnN0IFNvcnRDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCgpO1xuXG4gIGNsYXNzIFNvcnRQcm92aWRlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIGRhdGE6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICAgICAgY29sdW1uczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICAgIGRlZmF1bHRTb3J0ZWQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGRhdGFGaWVsZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgICBvcmRlcjogUHJvcFR5cGVzLm9uZU9mKFtDb25zdC5TT1JUX0RFU0MsIENvbnN0LlNPUlRfQVNDXSkuaXNSZXF1aXJlZFxuICAgICAgfSkpLFxuICAgICAgc29ydDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgZGF0YUZpZWxkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBvcmRlcjogUHJvcFR5cGVzLm9uZU9mKFtDb25zdC5TT1JUX0RFU0MsIENvbnN0LlNPUlRfQVNDXSksXG4gICAgICAgIHNvcnRGdW5jOiBQcm9wVHlwZXMuZnVuY1xuICAgICAgfSksXG4gICAgICBkZWZhdWx0U29ydERpcmVjdGlvbjogUHJvcFR5cGVzLm9uZU9mKFtDb25zdC5TT1JUX0RFU0MsIENvbnN0LlNPUlRfQVNDXSlcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgbGV0IHNvcnRPcmRlcjtcbiAgICAgIGxldCBzb3J0Q29sdW1uO1xuICAgICAgY29uc3QgeyBkZWZhdWx0U29ydGVkLCBkZWZhdWx0U29ydERpcmVjdGlvbiwgc29ydCB9ID0gcHJvcHM7XG5cbiAgICAgIGlmIChkZWZhdWx0U29ydGVkICYmIGRlZmF1bHRTb3J0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzb3J0T3JkZXIgPSBkZWZhdWx0U29ydGVkWzBdLm9yZGVyIHx8IGRlZmF1bHRTb3J0RGlyZWN0aW9uO1xuICAgICAgICBzb3J0Q29sdW1uID0gdGhpcy5pbml0U29ydChkZWZhdWx0U29ydGVkWzBdLmRhdGFGaWVsZCwgc29ydE9yZGVyKTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydCAmJiBzb3J0LmRhdGFGaWVsZCAmJiBzb3J0Lm9yZGVyKSB7XG4gICAgICAgIHNvcnRPcmRlciA9IHNvcnQub3JkZXI7XG4gICAgICAgIHNvcnRDb2x1bW4gPSB0aGlzLmluaXRTb3J0KHNvcnQuZGF0YUZpZWxkLCBzb3J0T3JkZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZSA9IHsgc29ydE9yZGVyLCBzb3J0Q29sdW1uIH07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBjb25zdCB7IHNvcnRPcmRlciwgc29ydENvbHVtbiB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmIChpc1JlbW90ZVNvcnQoKSAmJiBzb3J0T3JkZXIgJiYgc29ydENvbHVtbikge1xuICAgICAgICBoYW5kbGVTb3J0Q2hhbmdlKHNvcnRDb2x1bW4uZGF0YUZpZWxkLCBzb3J0T3JkZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgY29uc3QgeyBzb3J0LCBjb2x1bW5zIH0gPSBuZXh0UHJvcHM7XG4gICAgICBpZiAoc29ydCAmJiBzb3J0LmRhdGFGaWVsZCAmJiBzb3J0Lm9yZGVyKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNvcnRPcmRlcjogc29ydC5vcmRlcixcbiAgICAgICAgICBzb3J0Q29sdW1uOiBjb2x1bW5zLmZpbmQoY29sID0+IGNvbC5kYXRhRmllbGQgPT09IHNvcnQuZGF0YUZpZWxkKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0U29ydChzb3J0RmllbGQsIHNvcnRPcmRlcikge1xuICAgICAgbGV0IHNvcnRDb2x1bW47XG4gICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBzb3J0Q29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZGF0YUZpZWxkID09PSBzb3J0RmllbGQpO1xuICAgICAgaWYgKHNvcnRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc29ydENvbHVtbiA9IHNvcnRDb2x1bW5zWzBdO1xuXG4gICAgICAgIGlmIChzb3J0Q29sdW1uLm9uU29ydCkge1xuICAgICAgICAgIHNvcnRDb2x1bW4ub25Tb3J0KHNvcnRGaWVsZCwgc29ydE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNvcnRDb2x1bW47XG4gICAgfVxuXG4gICAgaGFuZGxlU29ydCA9IChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHNvcnRPcmRlciA9IGRhdGFPcGVyYXRvci5uZXh0T3JkZXIoY29sdW1uLCB0aGlzLnN0YXRlLCB0aGlzLnByb3BzLmRlZmF1bHRTb3J0RGlyZWN0aW9uKTtcblxuICAgICAgaWYgKGNvbHVtbi5vblNvcnQpIHtcbiAgICAgICAgY29sdW1uLm9uU29ydChjb2x1bW4uZGF0YUZpZWxkLCBzb3J0T3JkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZW1vdGVTb3J0KCkpIHtcbiAgICAgICAgaGFuZGxlU29ydENoYW5nZShjb2x1bW4uZGF0YUZpZWxkLCBzb3J0T3JkZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZSgoKSA9PiAoe1xuICAgICAgICBzb3J0T3JkZXIsXG4gICAgICAgIHNvcnRDb2x1bW46IGNvbHVtblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGxldCB7IGRhdGEgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7IHNvcnQgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7IHNvcnRPcmRlciwgc29ydENvbHVtbiB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmICghaXNSZW1vdGVTb3J0KCkgJiYgc29ydENvbHVtbikge1xuICAgICAgICBjb25zdCBzb3J0RnVuYyA9IHNvcnRDb2x1bW4uc29ydEZ1bmMgPyBzb3J0Q29sdW1uLnNvcnRGdW5jIDogKHNvcnQgJiYgc29ydC5zb3J0RnVuYyk7XG4gICAgICAgIGRhdGEgPSBkYXRhT3BlcmF0b3Iuc29ydChkYXRhLCBzb3J0T3JkZXIsIHsgLi4uc29ydENvbHVtbiwgc29ydEZ1bmMgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTb3J0Q29udGV4dC5Qcm92aWRlclxuICAgICAgICAgIHZhbHVlPXsge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgICAgIG9uU29ydDogdGhpcy5oYW5kbGVTb3J0LFxuICAgICAgICAgICAgc29ydEZpZWxkOiBzb3J0Q29sdW1uID8gc29ydENvbHVtbi5kYXRhRmllbGQgOiBudWxsXG4gICAgICAgICAgfSB9XG4gICAgICAgID5cbiAgICAgICAgICB7IHRoaXMucHJvcHMuY2hpbGRyZW4gfVxuICAgICAgICA8L1NvcnRDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBQcm92aWRlcjogU29ydFByb3ZpZGVyLFxuICAgIENvbnN1bWVyOiBTb3J0Q29udGV4dC5Db25zdW1lclxuICB9O1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL3JlYWN0LWJvb3RzdHJhcC10YWJsZTIvc3JjL2NvbnRleHRzL3NvcnQtY29udGV4dC5qcyIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBfIGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5kQmFzZSA9PlxuICBjbGFzcyBSZW1vdGVSZXNvbHZlciBleHRlbmRzIEV4dGVuZEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICBzdXBlcihwcm9wcyk7XG4gICAgICB0aGlzLnJlbW90ZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICB0aGlzLnJlbW90ZUVtaXR0ZXIub24oJ3BhZ2luYXRpb25DaGFuZ2UnLCB0aGlzLmhhbmRsZVJlbW90ZVBhZ2VDaGFuZ2UpO1xuICAgICAgdGhpcy5yZW1vdGVFbWl0dGVyLm9uKCdpc1JlbW90ZVBhZ2luYXRpb24nLCB0aGlzLmlzUmVtb3RlUGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0TmV3ZXN0U3RhdGUgPSAoc3RhdGUgPSB7fSkgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlcjtcbiAgICAgIGxldCBzb3J0RmllbGQ7XG4gICAgICBsZXQgcGFnZTtcbiAgICAgIGxldCBzaXplUGVyUGFnZTtcbiAgICAgIGxldCBzZWFyY2hUZXh0O1xuICAgICAgbGV0IGZpbHRlcnMgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuc29ydENvbnRleHQpIHtcbiAgICAgICAgc29ydE9yZGVyID0gdGhpcy5zb3J0Q29udGV4dC5zdGF0ZS5zb3J0T3JkZXI7XG4gICAgICAgIHNvcnRGaWVsZCA9IHRoaXMuc29ydENvbnRleHQuc3RhdGUuc29ydENvbHVtbiA/XG4gICAgICAgICAgdGhpcy5zb3J0Q29udGV4dC5zdGF0ZS5zb3J0Q29sdW1uLmRhdGFGaWVsZCA6XG4gICAgICAgICAgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZmlsdGVyQ29udGV4dCkge1xuICAgICAgICBmaWx0ZXJzID0gdGhpcy5maWx0ZXJDb250ZXh0LmN1cnJGaWx0ZXJzO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wYWdpbmF0aW9uQ29udGV4dCkge1xuICAgICAgICBwYWdlID0gdGhpcy5wYWdpbmF0aW9uQ29udGV4dC5jdXJyUGFnZTtcbiAgICAgICAgc2l6ZVBlclBhZ2UgPSB0aGlzLnBhZ2luYXRpb25Db250ZXh0LmN1cnJTaXplUGVyUGFnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2VhcmNoQ29udGV4dCkge1xuICAgICAgICBzZWFyY2hUZXh0ID0gdGhpcy5wcm9wcy5zZWFyY2guc2VhcmNoVGV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc29ydE9yZGVyLFxuICAgICAgICBzb3J0RmllbGQsXG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHNpemVQZXJQYWdlLFxuICAgICAgICBzZWFyY2hUZXh0LFxuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5kYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlzUmVtb3RlU2VhcmNoID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyByZW1vdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgICByZXR1cm4gcmVtb3RlID09PSB0cnVlIHx8IChfLmlzT2JqZWN0KHJlbW90ZSkgJiYgcmVtb3RlLnNlYXJjaCkgfHwgdGhpcy5pc1JlbW90ZVBhZ2luYXRpb24oKTtcbiAgICB9XG5cbiAgICBpc1JlbW90ZVBhZ2luYXRpb24gPSAoZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IHJlbW90ZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGUucmVzdWx0ID0gKHJlbW90ZSA9PT0gdHJ1ZSB8fCAoXy5pc09iamVjdChyZW1vdGUpICYmIHJlbW90ZS5wYWdpbmF0aW9uKSk7XG4gICAgICByZXR1cm4gZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaXNSZW1vdGVGaWx0ZXJpbmcgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlbW90ZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIHJldHVybiByZW1vdGUgPT09IHRydWUgfHwgKF8uaXNPYmplY3QocmVtb3RlKSAmJiByZW1vdGUuZmlsdGVyKSB8fCB0aGlzLmlzUmVtb3RlUGFnaW5hdGlvbigpO1xuICAgIH1cblxuICAgIGlzUmVtb3RlU29ydCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVtb3RlIH0gPSB0aGlzLnByb3BzO1xuICAgICAgcmV0dXJuIHJlbW90ZSA9PT0gdHJ1ZSB8fCAoXy5pc09iamVjdChyZW1vdGUpICYmIHJlbW90ZS5zb3J0KSB8fCB0aGlzLmlzUmVtb3RlUGFnaW5hdGlvbigpO1xuICAgIH1cblxuICAgIGlzUmVtb3RlQ2VsbEVkaXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlbW90ZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIHJldHVybiByZW1vdGUgPT09IHRydWUgfHwgKF8uaXNPYmplY3QocmVtb3RlKSAmJiByZW1vdGUuY2VsbEVkaXQpO1xuICAgIH1cblxuICAgIGhhbmRsZVJlbW90ZVBhZ2VDaGFuZ2UgPSAocGFnZSwgc2l6ZVBlclBhZ2UpID0+IHtcbiAgICAgIHRoaXMucHJvcHMub25UYWJsZUNoYW5nZSgncGFnaW5hdGlvbicsIHRoaXMuZ2V0TmV3ZXN0U3RhdGUoeyBwYWdlLCBzaXplUGVyUGFnZSB9KSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUmVtb3RlRmlsdGVyQ2hhbmdlID0gKGZpbHRlcnMpID0+IHtcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0geyBmaWx0ZXJzIH07XG4gICAgICBpZiAodGhpcy5pc1JlbW90ZVBhZ2luYXRpb24oKSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5wcm9wcy5wYWdpbmF0aW9uLm9wdGlvbnMgfHwge307XG4gICAgICAgIG5ld1N0YXRlLnBhZ2UgPSBfLmlzRGVmaW5lZChvcHRpb25zLnBhZ2VTdGFydEluZGV4KSA/IG9wdGlvbnMucGFnZVN0YXJ0SW5kZXggOiAxO1xuICAgICAgfVxuICAgICAgdGhpcy5wcm9wcy5vblRhYmxlQ2hhbmdlKCdmaWx0ZXInLCB0aGlzLmdldE5ld2VzdFN0YXRlKG5ld1N0YXRlKSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUmVtb3RlU29ydENoYW5nZSA9IChzb3J0RmllbGQsIHNvcnRPcmRlcikgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vblRhYmxlQ2hhbmdlKCdzb3J0JywgdGhpcy5nZXROZXdlc3RTdGF0ZSh7IHNvcnRGaWVsZCwgc29ydE9yZGVyIH0pKTtcbiAgICB9XG5cbiAgICBoYW5kbGVSZW1vdGVDZWxsQ2hhbmdlID0gKHJvd0lkLCBkYXRhRmllbGQsIG5ld1ZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBjZWxsRWRpdCA9IHsgcm93SWQsIGRhdGFGaWVsZCwgbmV3VmFsdWUgfTtcbiAgICAgIHRoaXMucHJvcHMub25UYWJsZUNoYW5nZSgnY2VsbEVkaXQnLCB0aGlzLmdldE5ld2VzdFN0YXRlKHsgY2VsbEVkaXQgfSkpO1xuICAgIH1cblxuICAgIGhhbmRsZVJlbW90ZVNlYXJjaENoYW5nZSA9IChzZWFyY2hUZXh0KSA9PiB7XG4gICAgICB0aGlzLnByb3BzLm9uVGFibGVDaGFuZ2UoJ3NlYXJjaCcsIHRoaXMuZ2V0TmV3ZXN0U3RhdGUoeyBzZWFyY2hUZXh0IH0pKTtcbiAgICB9XG4gIH07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9yZWFjdC1ib290c3RyYXAtdGFibGUyL3NyYy9wcm9wcy1yZXNvbHZlci9yZW1vdGUtcmVzb2x2ZXIuanMiXSwic291cmNlUm9vdCI6IiJ9
|
||
//# sourceMappingURL=react-bootstrap-table-next.js.map
|