mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 20:30:33 +00:00
12435 lines
1.2 MiB
12435 lines
1.2 MiB
/******/ (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, { enumerable: true, get: getter });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // define __esModule on exports
|
|
/******/ __webpack_require__.r = function(exports) {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/
|
|
/******/ // create a fake namespace object
|
|
/******/ // mode & 1: value is a module id, require it
|
|
/******/ // mode & 2: merge all properties of value into the ns
|
|
/******/ // mode & 4: return value when already ns object
|
|
/******/ // mode & 8|1: behave like require
|
|
/******/ __webpack_require__.t = function(value, mode) {
|
|
/******/ if(mode & 1) value = __webpack_require__(value);
|
|
/******/ if(mode & 8) return value;
|
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
|
/******/ var ns = Object.create(null);
|
|
/******/ __webpack_require__.r(ns);
|
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
|
/******/ return ns;
|
|
/******/ };
|
|
/******/
|
|
/******/ // 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 = "dist/";
|
|
/******/
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(__webpack_require__.s = 0);
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ({
|
|
|
|
/***/ "./config/config.js":
|
|
/*!**************************!*\
|
|
!*** ./config/config.js ***!
|
|
\**************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
module.exports = {
|
|
system: {
|
|
db_client: 'mysql',
|
|
db_host: '127.0.0.1',
|
|
db_user: 'root',
|
|
db_password: 'root',
|
|
db_name: 'bigcapital_system',
|
|
migrations_dir: './src/system/migrations' },
|
|
|
|
tenant: {
|
|
db_client: 'mysql',
|
|
db_name_prefix: 'bigcapital_tenant_',
|
|
db_host: '127.0.0.1',
|
|
db_user: 'root',
|
|
db_password: 'root',
|
|
charset: 'utf8',
|
|
migrations_dir: 'src/database/migrations',
|
|
seeds_dir: 'src/database/seeds' },
|
|
|
|
manager: {
|
|
superUser: 'root',
|
|
superPassword: 'root' },
|
|
|
|
mail: {
|
|
host: 'smtp.mailtrap.io',
|
|
port: 587,
|
|
secure: false,
|
|
username: '842f331d3dc005',
|
|
password: '172f97b34f1a17' } };
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./config/index.js":
|
|
/*!*************************!*\
|
|
!*** ./config/index.js ***!
|
|
\*************************/
|
|
/*! no exports provided */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var dotenv__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dotenv */ "dotenv");
|
|
/* harmony import */ var dotenv__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dotenv__WEBPACK_IMPORTED_MODULE_1__);
|
|
|
|
|
|
|
|
dotenv__WEBPACK_IMPORTED_MODULE_1___default.a.config({
|
|
path: path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(process.cwd(), '.env.test') });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./config/systemKnexfile.js":
|
|
/*!**********************************!*\
|
|
!*** ./config/systemKnexfile.js ***!
|
|
\**********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var config = __webpack_require__(/*! ./config */ "./config/config.js");
|
|
|
|
var configEnv = {
|
|
client: config.system.db_client,
|
|
connection: {
|
|
host: config.system.db_host,
|
|
user: config.system.db_user,
|
|
password: config.system.db_password,
|
|
database: config.system.db_name,
|
|
charset: 'utf8' },
|
|
|
|
migrations: {
|
|
directory: config.system.migrations_dir },
|
|
|
|
pool: { min: 0, max: 7 } };
|
|
|
|
|
|
module.exports = {
|
|
development: configEnv,
|
|
production: configEnv };
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/app.js":
|
|
/*!********************!*\
|
|
!*** ./src/app.js ***!
|
|
\********************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var helmet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! helmet */ "helmet");
|
|
/* harmony import */ var helmet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(helmet__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var express_boom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! express-boom */ "express-boom");
|
|
/* harmony import */ var express_boom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(express_boom__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! i18n */ "i18n");
|
|
/* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(i18n__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var app_root_path__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! app-root-path */ "app-root-path");
|
|
/* harmony import */ var app_root_path__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(app_root_path__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_fileupload__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-fileupload */ "express-fileupload");
|
|
/* harmony import */ var express_fileupload__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_fileupload__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../config */ "./config/index.js");
|
|
/* harmony import */ var _database_objection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/database/objection */ "./src/database/objection.js");
|
|
/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http */ "./src/http/index.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
global.rootPath = app_root_path__WEBPACK_IMPORTED_MODULE_4___default.a.path;
|
|
|
|
var app = express__WEBPACK_IMPORTED_MODULE_0___default()();
|
|
|
|
// i18n.configure({
|
|
// locales: ['en'],
|
|
// directory: `${__dirname}/resources/locale`,
|
|
// });
|
|
|
|
// // i18n init parses req for language headers, cookies, etc.
|
|
// app.use(i18n.init);
|
|
|
|
// Express configuration
|
|
app.set('port', process.env.PORT || 3000);
|
|
|
|
app.use(helmet__WEBPACK_IMPORTED_MODULE_1___default()());
|
|
app.use(express_boom__WEBPACK_IMPORTED_MODULE_2___default()());
|
|
app.use(express__WEBPACK_IMPORTED_MODULE_0___default.a.json());
|
|
app.use(express_fileupload__WEBPACK_IMPORTED_MODULE_5___default()({
|
|
createParentPath: true }));
|
|
|
|
|
|
Object(_http__WEBPACK_IMPORTED_MODULE_8__["default"])(app);
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (app);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/collection/NestedSet/index.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/collection/NestedSet/index.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return NestedSet; });
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}var
|
|
NestedSet = /*#__PURE__*/function () {
|
|
/**
|
|
* Constructor method.
|
|
* @param {Object} options -
|
|
*/
|
|
function NestedSet(items, options) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, NestedSet);
|
|
this.options = _objectSpread({
|
|
parentId: 'parent_id',
|
|
id: 'id' },
|
|
options);
|
|
|
|
this.items = items || [];
|
|
this.tree = this.linkChildren();
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(NestedSet, [{ key: "setItems", value: function setItems(
|
|
|
|
items) {
|
|
this.items = items;
|
|
this.tree = this.linkChildren();
|
|
}
|
|
|
|
/**
|
|
* Link nodes children.
|
|
*/ }, { key: "linkChildren", value: function linkChildren()
|
|
{var _this = this;
|
|
if (this.items.length <= 0) return false;
|
|
|
|
var map = {};
|
|
this.items.forEach(function (item) {
|
|
map[item.id] = item;
|
|
map[item.id].children = {};
|
|
});
|
|
|
|
this.items.forEach(function (item) {
|
|
var parentNodeId = item[_this.options.parentId];
|
|
if (parentNodeId) {
|
|
map[parentNodeId].children[item.id] = item;
|
|
}
|
|
});
|
|
return map;
|
|
} }, { key: "toArray", value: function toArray()
|
|
|
|
{var _this2 = this;
|
|
var stack = [];
|
|
var treeNodes = this.items.map(function (i) {return _objectSpread({}, i);});
|
|
|
|
var walk = function walk(nodes) {
|
|
nodes.forEach(function (node) {
|
|
if (!node[_this2.options.parentId]) {
|
|
stack.push(node);
|
|
}
|
|
if (node.children) {
|
|
var childrenNodes = Object.values(node.children).
|
|
map(function (i) {return _objectSpread({}, i);});
|
|
|
|
node.children = childrenNodes;
|
|
walk(childrenNodes);
|
|
}
|
|
});
|
|
};
|
|
walk(treeNodes);
|
|
return stack;
|
|
} }, { key: "getTree", value: function getTree()
|
|
|
|
{
|
|
return this.tree;
|
|
} }, { key: "getElementById", value: function getElementById(
|
|
|
|
id) {
|
|
return this.tree[id] || null;
|
|
} }, { key: "getParents", value: function getParents(
|
|
|
|
id) {var _this3 = this;
|
|
var item = this.getElementById(id);
|
|
var parents = [];
|
|
var index = 0;
|
|
|
|
var walk = function walk(_item) {
|
|
if (!item) return;
|
|
|
|
if (index) {
|
|
parents.push(_item);
|
|
}
|
|
if (_item[_this3.options.parentId]) {
|
|
var parentItem = _this3.getElementById(_item[_this3.options.parentId]);
|
|
|
|
index++;
|
|
walk(parentItem);
|
|
}
|
|
};
|
|
walk(item);
|
|
return parents;
|
|
} }, { key: "toFlattenArray", value: function toFlattenArray(
|
|
|
|
nodeMapper) {
|
|
var flattenTree = [];
|
|
|
|
var traversal = function traversal(nodes, parentNode) {
|
|
nodes.forEach(function (node) {
|
|
var nodeMapped = node;
|
|
|
|
if (typeof nodeMapper === 'function') {
|
|
nodeMapped = nodeMapper(nodeMapped, parentNode);
|
|
}
|
|
flattenTree.push(nodeMapped);
|
|
|
|
if (node.children && node.children.length > 0) {
|
|
traversal(node.children, node);
|
|
}
|
|
});
|
|
};
|
|
traversal(this.collection);
|
|
|
|
return flattenTree;
|
|
} }]);return NestedSet;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/collection/ResourceFieldMetadataCollection.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./src/collection/ResourceFieldMetadataCollection.js ***!
|
|
\***********************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ResourceFieldMetadataCollection; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/Metable/MetableCollection */ "./src/lib/Metable/MetableCollection.js");
|
|
/* harmony import */ var _models_ResourceFieldMetadata__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/ResourceFieldMetadata */ "./src/models/ResourceFieldMetadata.js");
|
|
|
|
var
|
|
|
|
ResourceFieldMetadataCollection = /*#__PURE__*/function (_MetableCollection) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(ResourceFieldMetadataCollection, _MetableCollection);
|
|
/**
|
|
* Constructor method.
|
|
*/
|
|
function ResourceFieldMetadataCollection() {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResourceFieldMetadataCollection);
|
|
_this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(ResourceFieldMetadataCollection).call(this));
|
|
|
|
_this.setModel(_models_ResourceFieldMetadata__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
_this.extraColumns = ['resource_id', 'resource_item_id'];return _this;
|
|
}return ResourceFieldMetadataCollection;}(_lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_4__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/data/ResourceFieldsKeys.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/data/ResourceFieldsKeys.js ***!
|
|
\****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* eslint-disable quote-props */
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
// Expenses.
|
|
'expenses': {
|
|
'expense_account': {
|
|
column: ' ',
|
|
relation: 'accounts.name' },
|
|
|
|
'payment_account': {
|
|
column: 'payment_account_id',
|
|
relation: 'accounts.id' },
|
|
|
|
'account_type': {
|
|
column: 'account_type_id',
|
|
relation: 'account_types.id' } },
|
|
|
|
|
|
|
|
// Accounts
|
|
'accounts': {
|
|
'name': {
|
|
column: 'name' },
|
|
|
|
'type': {
|
|
column: 'account_type_id',
|
|
relation: 'account_types.id',
|
|
relationColumn: 'account_types.name' },
|
|
|
|
'description': {
|
|
column: 'description' },
|
|
|
|
'code': {
|
|
column: 'code' },
|
|
|
|
'root_type': {
|
|
column: 'account_type_id',
|
|
relation: 'account_types.id',
|
|
relationColumn: 'account_types.root_type' } },
|
|
|
|
|
|
|
|
// Items
|
|
'items': {
|
|
'type': {
|
|
column: 'type' },
|
|
|
|
'name': {
|
|
column: 'name' } },
|
|
|
|
|
|
|
|
// Manual Journals
|
|
'manual_journals': {
|
|
'type': {
|
|
column: 'transaction_type' },
|
|
|
|
'status': {
|
|
column: 'status' },
|
|
|
|
'date': {
|
|
column: 'date' },
|
|
|
|
'journal_number': {
|
|
column: 'journal_number' },
|
|
|
|
'amount': {
|
|
column: 'amount' },
|
|
|
|
'created_at': {
|
|
column: 'created_at' } } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/data/options.js":
|
|
/*!*****************************!*\
|
|
!*** ./src/data/options.js ***!
|
|
\*****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
organization: [
|
|
{
|
|
key: 'name',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'base_currency',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'industry',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'location',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'fiscal_year',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'language',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'time_zone',
|
|
type: 'string' },
|
|
|
|
{
|
|
key: 'date_format',
|
|
type: 'string' }] });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/database/knex.js":
|
|
/*!******************************!*\
|
|
!*** ./src/database/knex.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! knex */ "knex");
|
|
/* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(knex__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/../config/systemKnexfile */ "./config/systemKnexfile.js");
|
|
/* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3__);
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
var config = _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_3___default.a["development"];
|
|
|
|
var knex = knex__WEBPACK_IMPORTED_MODULE_1___default()(_objectSpread({},
|
|
config, {},
|
|
Object(objection__WEBPACK_IMPORTED_MODULE_2__["knexSnakeCaseMappers"])({ upperCase: true })));
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (knex);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/database/manager.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/database/manager.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var knex_db_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knex-db-manager */ "knex-db-manager");
|
|
/* harmony import */ var knex_db_manager__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knex_db_manager__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/../config/systemKnexfile */ "./config/systemKnexfile.js");
|
|
/* harmony import */ var _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/../config/config */ "./config/config.js");
|
|
/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_config_config__WEBPACK_IMPORTED_MODULE_2__);
|
|
|
|
|
|
|
|
|
|
var knexConfig = _config_systemKnexfile__WEBPACK_IMPORTED_MODULE_1___default.a["development"];
|
|
|
|
var dbManager = knex_db_manager__WEBPACK_IMPORTED_MODULE_0___default.a.databaseManagerFactory({
|
|
knex: knexConfig,
|
|
dbManager: {
|
|
collate: [],
|
|
superUser: _config_config__WEBPACK_IMPORTED_MODULE_2___default.a.manager.superUser,
|
|
superPassword: _config_config__WEBPACK_IMPORTED_MODULE_2___default.a.manager.superPassword } });
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (dbManager);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/database/objection.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/database/objection.js ***!
|
|
\***********************************/
|
|
/*! no exports provided */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _database_knex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/database/knex */ "./src/database/knex.js");
|
|
|
|
|
|
|
|
// Bind all Models to a knex instance. If you only have one database in
|
|
// your server this is all you have to do. For multi database systems, see
|
|
// the Model.bindKnex() method.
|
|
objection__WEBPACK_IMPORTED_MODULE_0__["Model"].knex(_database_knex__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/AccountTypes.js":
|
|
/*!**********************************************!*\
|
|
!*** ./src/http/controllers/AccountTypes.js ***!
|
|
\**********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_2___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.getAccountTypesList.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_3__["default"])(this.getAccountTypesList.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve accounts types list.
|
|
*/
|
|
getAccountTypesList: {
|
|
validation: [],
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var AccountType, accountTypes;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
AccountType = req.models.AccountType;_context.next = 3;return (
|
|
AccountType.query());case 3:accountTypes = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
account_types: accountTypes }));case 5:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Accounting.js":
|
|
/*!********************************************!*\
|
|
!*** ./src/http/controllers/Accounting.js ***!
|
|
\********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/services/Accounting/JournalEntry */ "./src/services/Accounting/JournalEntry.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
/* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_5___default.a.Router();
|
|
|
|
router.get('/manual-journals/:id',
|
|
this.getManualJournal.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.getManualJournal.handler));
|
|
|
|
router.get('/manual-journals',
|
|
this.manualJournals.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.manualJournals.handler));
|
|
|
|
router.post('/make-journal-entries',
|
|
this.makeJournalEntries.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.makeJournalEntries.handler));
|
|
|
|
router.post('/manual-journals/:id/publish',
|
|
this.publishManualJournal.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.publishManualJournal.handler));
|
|
|
|
router.post('/manual-journals/:id',
|
|
this.editManualJournal.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.editManualJournal.handler));
|
|
|
|
router["delete"]('/manual-journals/:id',
|
|
this.deleteManualJournal.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.deleteManualJournal.handler));
|
|
|
|
router["delete"]('/manual-journals',
|
|
this.deleteBulkManualJournals.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.deleteBulkManualJournals.handler));
|
|
|
|
router.post('/recurring-journal-entries',
|
|
this.recurringJournalEntries.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.recurringJournalEntries.handler));
|
|
|
|
router.post('quick-journal-entries',
|
|
this.quickJournalEntries.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.quickJournalEntries.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve manual journals,
|
|
*/
|
|
manualJournals: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('custom_view_id').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(req, res) {var validationErrors, filter, _req$models, Resource, View, ManualJournal, errorReasons, manualJournalsResource, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, manualJournals;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({
|
|
filter_roles: [],
|
|
page: 1,
|
|
page_size: 999 },
|
|
req.query);
|
|
|
|
if (filter.stringified_filter_roles) {
|
|
filter.filter_roles = JSON.parse(filter.stringified_filter_roles);
|
|
}_req$models =
|
|
req.models, Resource = _req$models.Resource, View = _req$models.View, ManualJournal = _req$models.ManualJournal;
|
|
|
|
errorReasons = [];_context.next = 9;return (
|
|
Resource.query().
|
|
where('name', 'manual_journals').
|
|
withGraphFetched('fields').
|
|
first());case 9:manualJournalsResource = _context.sent;if (
|
|
|
|
manualJournalsResource) {_context.next = 12;break;}return _context.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'MANUAL_JOURNALS.RESOURCE.NOT.FOUND', code: 200 }] }));case 12:_context.next = 14;return (
|
|
|
|
|
|
|
|
View.query().onBuild(function (builder) {
|
|
if (filter.custom_view_id) {
|
|
builder.where('id', filter.custom_view_id);
|
|
} else {
|
|
builder.where('favourite', true);
|
|
}
|
|
builder.where('resource_id', manualJournalsResource.id);
|
|
builder.withGraphFetched('roles.field');
|
|
builder.withGraphFetched('columns');
|
|
builder.first();
|
|
builder.remember();
|
|
}));case 14:view = _context.sent;
|
|
|
|
resourceFieldsKeys = manualJournalsResource.fields.map(function (c) {return c.key;});
|
|
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilter"](ManualJournal.tableName);
|
|
|
|
// Dynamic filter with view roles.
|
|
if (view && view.roles.length > 0) {
|
|
viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterViews"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__["mapViewRolesToConditionals"])(view.roles),
|
|
view.rolesLogicExpression);
|
|
|
|
if (!viewFilter.validateFilterRoles()) {
|
|
errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 });
|
|
}
|
|
dynamicFilter.setFilter(viewFilter);
|
|
}
|
|
|
|
// Dynamic filter with filter roles.
|
|
if (filter.filter_roles.length > 0) {
|
|
// Validate the accounts resource fields.
|
|
filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterFilterRoles"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_11__["mapFilterRolesToDynamicFilter"])(filter.filter_roles),
|
|
manualJournalsResource.fields);
|
|
|
|
dynamicFilter.setFilter(filterRoles);
|
|
|
|
if (filterRoles.validateFilterRoles().length > 0) {
|
|
errorReasons.push({ type: 'MANUAL.JOURNAL.HAS.NO.FIELDS', code: 500 });
|
|
}
|
|
}
|
|
// Dynamic filter with column sort order.
|
|
if (filter.column_sort_order) {
|
|
if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) {
|
|
errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 });
|
|
}
|
|
sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterSortBy"](
|
|
filter.column_sort_order,
|
|
filter.sort_order);
|
|
|
|
dynamicFilter.setFilter(sortByFilter);
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context.next = 22;break;}return _context.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 22:_context.next = 24;return (
|
|
|
|
|
|
ManualJournal.query().onBuild(function (builder) {
|
|
dynamicFilter.buildQuery()(builder);
|
|
}).pagination(filter.page - 1, filter.page_size));case 24:manualJournals = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
manualJournals: manualJournals }));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Make journal entrires.
|
|
*/
|
|
makeJournalEntries: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('journal_number').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('transaction_type').optional({ nullable: true }).trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference').optional({ nullable: true }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('status').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries').isArray({ min: 2 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.credit').optional({ nullable: true }).isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.debit').optional({ nullable: true }).isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.account_id').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.note').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids').optional().isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids.*').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res) {var validationErrors, form, _req$models2, ManualJournal, Account, Media, MediaLink, totalCredit, totalDebit, user, errorReasons, entries, formattedDate, accountsIds, accounts, storedAccountsIds, storedMedia, notFoundMedia, journalNumber, manualJournal, accountsDepGraph, journalPoster, bulkSaveMediaLink;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({
|
|
date: new Date(),
|
|
transaction_type: 'journal',
|
|
reference: '',
|
|
media_ids: [] },
|
|
req.body);_req$models2 =
|
|
|
|
req.models, ManualJournal = _req$models2.ManualJournal, Account = _req$models2.Account, Media = _req$models2.Media, MediaLink = _req$models2.MediaLink;
|
|
|
|
totalCredit = 0;
|
|
totalDebit = 0;
|
|
|
|
user = req.user;
|
|
errorReasons = [];
|
|
entries = form.entries.filter(function (entry) {return entry.credit || entry.debit;});
|
|
formattedDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(form.date).format('YYYY-MM-DD');
|
|
|
|
entries.forEach(function (entry) {
|
|
if (entry.credit > 0) {
|
|
totalCredit += entry.credit;
|
|
}
|
|
if (entry.debit > 0) {
|
|
totalDebit += entry.debit;
|
|
}
|
|
});
|
|
if (totalCredit <= 0 || totalDebit <= 0) {
|
|
errorReasons.push({
|
|
type: 'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO',
|
|
code: 400 });
|
|
|
|
}
|
|
if (totalCredit !== totalDebit) {
|
|
errorReasons.push({ type: 'CREDIT.DEBIT.NOT.EQUALS', code: 100 });
|
|
}
|
|
accountsIds = entries.map(function (entry) {return entry.account_id;});_context2.next = 17;return (
|
|
Account.query().
|
|
whereIn('id', accountsIds).
|
|
withGraphFetched('type').
|
|
remember());case 17:accounts = _context2.sent;
|
|
|
|
storedAccountsIds = accounts.map(function (account) {return account.id;});if (!(
|
|
|
|
form.media_ids.length > 0)) {_context2.next = 25;break;}_context2.next = 22;return (
|
|
Media.query().whereIn('id', form.media_ids));case 22:storedMedia = _context2.sent;
|
|
notFoundMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(form.media_ids, storedMedia.map(function (m) {return m.id;}));
|
|
|
|
if (notFoundMedia.length > 0) {
|
|
errorReasons.push({ type: 'MEDIA.IDS.NOT.FOUND', code: 400, ids: notFoundMedia });
|
|
}case 25:
|
|
|
|
if (Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(accountsIds, storedAccountsIds).length > 0) {
|
|
errorReasons.push({ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200 });
|
|
}_context2.next = 28;return (
|
|
|
|
ManualJournal.query().
|
|
where('journal_number', form.journal_number));case 28:journalNumber = _context2.sent;
|
|
|
|
if (journalNumber.length > 0) {
|
|
errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context2.next = 32;break;}return _context2.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 32:_context2.next = 34;return (
|
|
|
|
|
|
ManualJournal.query().insert({
|
|
reference: form.reference,
|
|
transaction_type: 'Journal',
|
|
journal_number: form.journal_number,
|
|
amount: totalCredit,
|
|
date: formattedDate,
|
|
description: form.description,
|
|
status: form.status,
|
|
user_id: user.id }));case 34:manualJournal = _context2.sent;_context2.next = 37;return (
|
|
|
|
|
|
Account.depGraph().query());case 37:accountsDepGraph = _context2.sent;
|
|
journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
|
|
|
|
entries.forEach(function (entry) {
|
|
var account = accounts.find(function (a) {return a.id === entry.account_id;});
|
|
var jouranlEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_10__["default"]({
|
|
debit: entry.debit,
|
|
credit: entry.credit,
|
|
account: account.id,
|
|
referenceType: 'Journal',
|
|
referenceId: manualJournal.id,
|
|
accountNormal: account.type.normal,
|
|
note: entry.note,
|
|
date: formattedDate,
|
|
userId: user.id,
|
|
draft: !form.status });
|
|
|
|
if (entry.debit) {
|
|
journalPoster.debit(jouranlEntry);
|
|
} else {
|
|
journalPoster.credit(jouranlEntry);
|
|
}
|
|
});
|
|
|
|
// Save linked media to the journal model.
|
|
bulkSaveMediaLink = [];
|
|
|
|
form.media_ids.forEach(function (mediaId) {
|
|
var oper = MediaLink.query().insert({
|
|
model_name: 'Journal',
|
|
model_id: manualJournal.id,
|
|
media_id: mediaId });
|
|
|
|
bulkSaveMediaLink.push(oper);
|
|
});
|
|
|
|
// Saves the journal entries and accounts balance changes.
|
|
_context2.next = 44;return Promise.all([].concat(
|
|
bulkSaveMediaLink, [
|
|
journalPoster.saveEntries(),
|
|
form.status && journalPoster.saveBalance()]));case 44:return _context2.abrupt("return",
|
|
|
|
res.status(200).send({ id: manualJournal.id }));case 45:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Saves recurring journal entries template.
|
|
*/
|
|
recurringJournalEntries: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('template_name').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('recurrence').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('active').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries').isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.credit').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.debit').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.account_id').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.note').optional()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res) {var validationErrors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Edit the given manual journal.
|
|
*/
|
|
editManualJournal: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('journal_number').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('transaction_type').optional({ nullable: true }).trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference').optional({ nullable: true }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries').isArray({ min: 2 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.credit').optional({ nullable: true }).isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.debit').optional({ nullable: true }).isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.account_id').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.note').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids').optional().isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('media_ids.*').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(req, res) {var validationErrors, form, id, _req$models3, ManualJournal, AccountTransaction, Account, Media, MediaLink, manualJournal, totalCredit, totalDebit, user, errorReasons, entries, formattedDate, journalNumber, accountsIds, accounts, storedAccountsIds, storedMedia, notFoundMedia, transactions, accountsDepGraph, journal, journalMediaIds, newInsertedMedia, bulkSaveMediaLink;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({
|
|
date: new Date(),
|
|
transaction_type: 'journal',
|
|
reference: '',
|
|
media_ids: [] },
|
|
req.body);
|
|
|
|
id = req.params.id;_req$models3 =
|
|
|
|
|
|
req.models, ManualJournal = _req$models3.ManualJournal, AccountTransaction = _req$models3.AccountTransaction, Account = _req$models3.Account, Media = _req$models3.Media, MediaLink = _req$models3.MediaLink;_context4.next = 8;return (
|
|
|
|
ManualJournal.query().
|
|
where('id', id).
|
|
withGraphFetched('media').first());case 8:manualJournal = _context4.sent;if (
|
|
|
|
manualJournal) {_context4.next = 11;break;}return _context4.abrupt("return",
|
|
res.status(4040).send({
|
|
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 11:
|
|
|
|
|
|
totalCredit = 0;
|
|
totalDebit = 0;
|
|
|
|
user = req.user;
|
|
errorReasons = [];
|
|
entries = form.entries.filter(function (entry) {return entry.credit || entry.debit;});
|
|
formattedDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(form.date).format('YYYY-MM-DD');
|
|
|
|
entries.forEach(function (entry) {
|
|
if (entry.credit > 0) {
|
|
totalCredit += entry.credit;
|
|
}
|
|
if (entry.debit > 0) {
|
|
totalDebit += entry.debit;
|
|
}
|
|
});
|
|
if (totalCredit <= 0 || totalDebit <= 0) {
|
|
errorReasons.push({
|
|
type: 'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO',
|
|
code: 400 });
|
|
|
|
}
|
|
if (totalCredit !== totalDebit) {
|
|
errorReasons.push({ type: 'CREDIT.DEBIT.NOT.EQUALS', code: 100 });
|
|
}_context4.next = 22;return (
|
|
ManualJournal.query().
|
|
where('journal_number', form.journal_number).
|
|
whereNot('id', id).
|
|
first());case 22:journalNumber = _context4.sent;
|
|
|
|
if (journalNumber) {
|
|
errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 });
|
|
}
|
|
accountsIds = entries.map(function (entry) {return entry.account_id;});_context4.next = 27;return (
|
|
Account.query().whereIn('id', accountsIds).
|
|
withGraphFetched('type'));case 27:accounts = _context4.sent;
|
|
|
|
storedAccountsIds = accounts.map(function (account) {return account.id;});
|
|
|
|
if (Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(accountsIds, storedAccountsIds).length > 0) {
|
|
errorReasons.push({ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200 });
|
|
}
|
|
|
|
// Validate if media ids was not already exists on the storage.
|
|
if (!(form.media_ids.length > 0)) {_context4.next = 36;break;}_context4.next = 33;return (
|
|
Media.query().whereIn('id', form.media_ids));case 33:storedMedia = _context4.sent;
|
|
notFoundMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(form.media_ids, storedMedia.map(function (m) {return m.id;}));
|
|
|
|
if (notFoundMedia.length > 0) {
|
|
errorReasons.push({ type: 'MEDIA.IDS.NOT.FOUND', code: 400, ids: notFoundMedia });
|
|
}case 36:if (!(
|
|
|
|
errorReasons.length > 0)) {_context4.next = 38;break;}return _context4.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 38:_context4.next = 40;return (
|
|
|
|
|
|
ManualJournal.query().
|
|
where('id', manualJournal.id).
|
|
update({
|
|
reference: form.reference,
|
|
transaction_type: 'Journal',
|
|
journalNumber: form.journal_number,
|
|
amount: totalCredit,
|
|
date: formattedDate,
|
|
description: form.description }));case 40:_context4.next = 42;return (
|
|
|
|
|
|
AccountTransaction.query().
|
|
whereIn('reference_type', ['Journal']).
|
|
where('reference_id', manualJournal.id).
|
|
withGraphFetched('account.type'));case 42:transactions = _context4.sent;_context4.next = 45;return (
|
|
|
|
Account.depGraph().query().remember());case 45:accountsDepGraph = _context4.sent;
|
|
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
|
|
|
|
journal.loadEntries(transactions);
|
|
journal.removeEntries();
|
|
|
|
entries.forEach(function (entry) {
|
|
var account = accounts.find(function (a) {return a.id === entry.account_id;});
|
|
|
|
var jouranlEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_10__["default"]({
|
|
debit: entry.debit,
|
|
credit: entry.credit,
|
|
account: account.id,
|
|
referenceType: 'Journal',
|
|
referenceId: manualJournal.id,
|
|
accountNormal: account.type.normal,
|
|
note: entry.note,
|
|
date: formattedDate,
|
|
userId: user.id });
|
|
|
|
if (entry.debit) {
|
|
journal.debit(jouranlEntry);
|
|
} else {
|
|
journal.credit(jouranlEntry);
|
|
}
|
|
});
|
|
|
|
// Save links of new inserted media that associated to the journal model.
|
|
journalMediaIds = manualJournal.media.map(function (m) {return m.id;});
|
|
newInsertedMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(form.media_ids, journalMediaIds);
|
|
bulkSaveMediaLink = [];
|
|
|
|
newInsertedMedia.forEach(function (mediaId) {
|
|
var oper = MediaLink.query().insert({
|
|
model_name: 'Journal',
|
|
model_id: manualJournal.id,
|
|
media_id: mediaId });
|
|
|
|
bulkSaveMediaLink.push(oper);
|
|
});_context4.next = 56;return (
|
|
|
|
Promise.all([].concat(
|
|
bulkSaveMediaLink, [
|
|
journal.deleteEntries(),
|
|
journal.saveEntries(),
|
|
journal.saveBalance()])));case 56:return _context4.abrupt("return",
|
|
|
|
|
|
res.status(200).send({}));case 57:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
publishManualJournal: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee5(req, res) {var validationErrors, _req$models4, ManualJournal, AccountTransaction, Account, id, manualJournal, updateJournalTransactionOper, transactions, accountsDepGraph, journal, updateAccountsTransactionsOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models4 =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
req.models, ManualJournal = _req$models4.ManualJournal, AccountTransaction = _req$models4.AccountTransaction, Account = _req$models4.Account;
|
|
|
|
id = req.params.id;_context5.next = 7;return (
|
|
ManualJournal.query().
|
|
where('id', id).first());case 7:manualJournal = _context5.sent;if (
|
|
|
|
manualJournal) {_context5.next = 10;break;}return _context5.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:if (!
|
|
|
|
|
|
manualJournal.status) {_context5.next = 12;break;}return _context5.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'MANUAL.JOURNAL.PUBLISHED.ALREADY', code: 200 }] }));case 12:
|
|
|
|
|
|
updateJournalTransactionOper = ManualJournal.query().
|
|
where('id', manualJournal.id).
|
|
update({ status: 1 });_context5.next = 15;return (
|
|
|
|
AccountTransaction.query().
|
|
whereIn('reference_type', ['Journal', 'ManualJournal']).
|
|
where('reference_id', manualJournal.id).
|
|
withGraphFetched('account.type'));case 15:transactions = _context5.sent;_context5.next = 18;return (
|
|
|
|
Account.depGraph().query().remember());case 18:accountsDepGraph = _context5.sent;
|
|
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
|
|
|
|
journal.loadEntries(transactions);
|
|
journal.calculateEntriesBalanceChange();
|
|
|
|
updateAccountsTransactionsOper = AccountTransaction.query().
|
|
whereIn('id', transactions.map(function (t) {return t.id;})).
|
|
update({ draft: 0 });_context5.next = 25;return (
|
|
|
|
Promise.all([
|
|
updateJournalTransactionOper,
|
|
updateAccountsTransactionsOper,
|
|
journal.saveBalance()]));case 25:return _context5.abrupt("return",
|
|
|
|
res.status(200).send({ id: id }));case 26:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
getManualJournal: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee6(req, res) {var validationErrors, _req$models5, ManualJournal, AccountTransaction, id, manualJournal, transactions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models5 =
|
|
|
|
|
|
|
|
|
|
req.models, ManualJournal = _req$models5.ManualJournal, AccountTransaction = _req$models5.AccountTransaction;
|
|
|
|
id = req.params.id;_context6.next = 7;return (
|
|
ManualJournal.query().
|
|
where('id', id).
|
|
withGraphFetched('media').
|
|
first());case 7:manualJournal = _context6.sent;if (
|
|
|
|
manualJournal) {_context6.next = 10;break;}return _context6.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:_context6.next = 12;return (
|
|
|
|
|
|
AccountTransaction.query().
|
|
whereIn('reference_type', ['Journal', 'ManualJournal']).
|
|
where('reference_id', manualJournal.id));case 12:transactions = _context6.sent;return _context6.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
manual_journal: _objectSpread({},
|
|
manualJournal.toJSON(), {
|
|
entries: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(
|
|
transactions) }) }));case 14:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Deletes manual journal transactions and associated
|
|
* accounts transactions.
|
|
*/
|
|
deleteManualJournal: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler7 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee7(req, res) {var validationErrors, id, _req$models6, ManualJournal, AccountTransaction, MediaLink, Account, manualJournal, transactions, accountsDepGraph, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context7.next = 3;break;}return _context7.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
id = req.params.id;_req$models6 =
|
|
|
|
|
|
|
|
|
|
|
|
req.models, ManualJournal = _req$models6.ManualJournal, AccountTransaction = _req$models6.AccountTransaction, MediaLink = _req$models6.MediaLink, Account = _req$models6.Account;_context7.next = 7;return (
|
|
|
|
ManualJournal.query().
|
|
where('id', id).first());case 7:manualJournal = _context7.sent;if (
|
|
|
|
manualJournal) {_context7.next = 10;break;}return _context7.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:_context7.next = 12;return (
|
|
|
|
|
|
AccountTransaction.query().
|
|
whereIn('reference_type', ['Journal', 'ManualJournal']).
|
|
where('reference_id', manualJournal.id).
|
|
withGraphFetched('account.type'));case 12:transactions = _context7.sent;_context7.next = 15;return (
|
|
|
|
Account.depGraph().query().remember());case 15:accountsDepGraph = _context7.sent;
|
|
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
|
|
|
|
journal.loadEntries(transactions);
|
|
journal.removeEntries();_context7.next = 21;return (
|
|
|
|
MediaLink.query().
|
|
where('model_name', 'Journal').
|
|
where('model_id', manualJournal.id)["delete"]());case 21:_context7.next = 23;return (
|
|
|
|
|
|
ManualJournal.query().
|
|
where('id', manualJournal.id)["delete"]());case 23:_context7.next = 25;return (
|
|
|
|
|
|
Promise.all([
|
|
journal.deleteEntries(),
|
|
journal.saveBalance()]));case 25:return _context7.abrupt("return",
|
|
|
|
res.status(200).send({ id: id }));case 26:case "end":return _context7.stop();}}}, _callee7);}));function handler(_x13, _x14) {return _handler7.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
recurringJournalsList: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('template_name').optional()],
|
|
|
|
handler: function () {var _handler8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee8(req, res) {var validationErrors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context8.next = 3;break;}return _context8.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:case "end":return _context8.stop();}}}, _callee8);}));function handler(_x15, _x16) {return _handler8.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
|
|
quickJournalEntries: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('amount').exists().isNumeric().toFloat(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('credit_account_id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('debit_account_id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('transaction_type').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('note').optional()],
|
|
|
|
handler: function () {var _handler9 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee9(req, res) {var validationErrors, errorReasons, form, Account, foundAccounts, creditAccount, debitAccount;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context9.next = 3;break;}return _context9.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
errorReasons = [];
|
|
form = _objectSpread({}, req.body);
|
|
Account = req.models.Account;_context9.next = 8;return (
|
|
|
|
Account.query().
|
|
where('id', form.credit_account_id).
|
|
orWhere('id', form.debit_account_id));case 8:foundAccounts = _context9.sent;
|
|
|
|
creditAccount = foundAccounts.find(function (a) {return a.id === form.credit_account_id;});
|
|
debitAccount = foundAccounts.find(function (a) {return a.id === form.debit_account_id;});
|
|
|
|
if (!creditAccount) {
|
|
errorReasons.push({ type: 'CREDIT_ACCOUNT.NOT.EXIST', code: 100 });
|
|
}
|
|
if (!debitAccount) {
|
|
errorReasons.push({ type: 'DEBIT_ACCOUNT.NOT.EXIST', code: 200 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context9.next = 15;break;}return _context9.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 15:return _context9.abrupt("return",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
res.status(200).send());case 16:case "end":return _context9.stop();}}}, _callee9);}));function handler(_x17, _x18) {return _handler9.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Deletes bulk manual journals.
|
|
*/
|
|
deleteBulkManualJournals: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler10 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee10(req, res) {var validationErrors, filter, _req$models7, ManualJournal, AccountTransaction, Account, MediaLink, manualJournals, notFoundManualJournals, transactions, accountsDepGraph, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee10$(_context10) {while (1) {switch (_context10.prev = _context10.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context10.next = 3;break;}return _context10.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({}, req.query);_req$models7 =
|
|
req.models, ManualJournal = _req$models7.ManualJournal, AccountTransaction = _req$models7.AccountTransaction, Account = _req$models7.Account, MediaLink = _req$models7.MediaLink;_context10.next = 7;return (
|
|
|
|
ManualJournal.query().
|
|
whereIn('id', filter.ids));case 7:manualJournals = _context10.sent;
|
|
|
|
notFoundManualJournals = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, manualJournals.map(function (m) {return m.id;}));if (!(
|
|
|
|
notFoundManualJournals.length > 0)) {_context10.next = 11;break;}return _context10.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 200 }] }));case 11:_context10.next = 13;return (
|
|
|
|
|
|
AccountTransaction.query().
|
|
whereIn('reference_type', ['Journal', 'ManualJournal']).
|
|
whereIn('reference_id', filter.ids));case 13:transactions = _context10.sent;_context10.next = 16;return (
|
|
|
|
Account.depGraph().query().remember());case 16:accountsDepGraph = _context10.sent;
|
|
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
|
|
|
|
journal.loadEntries(transactions);
|
|
journal.removeEntries();_context10.next = 22;return (
|
|
|
|
MediaLink.query().
|
|
where('model_name', 'Journal').
|
|
whereIn('model_id', filter.ids)["delete"]());case 22:_context10.next = 24;return (
|
|
|
|
|
|
ManualJournal.query().
|
|
whereIn('id', filter.ids)["delete"]());case 24:_context10.next = 26;return (
|
|
|
|
Promise.all([
|
|
journal.deleteEntries(),
|
|
journal.saveBalance()]));case 26:return _context10.abrupt("return",
|
|
|
|
res.status(200).send({ ids: filter.ids }));case 27:case "end":return _context10.stop();}}}, _callee10);}));function handler(_x19, _x20) {return _handler10.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Accounts.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/http/controllers/Accounts.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "@babel/runtime/helpers/slicedToArray");
|
|
/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _collection_NestedSet__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/collection/NestedSet */ "./src/collection/NestedSet/index.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
/* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor method.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.post('/',
|
|
this.newAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.newAccount.handler));
|
|
|
|
router.post('/:id',
|
|
this.editAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.editAccount.handler));
|
|
|
|
router.get('/:id',
|
|
this.getAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.getAccount.handler));
|
|
|
|
router.get('/',
|
|
this.getAccountsList.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.getAccountsList.handler));
|
|
|
|
router["delete"]('/',
|
|
this.deleteBulkAccounts.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteBulkAccounts.handler));
|
|
|
|
router["delete"]('/:id',
|
|
this.deleteAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteAccount.handler));
|
|
|
|
router.post('/:id/active',
|
|
this.activeAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.activeAccount.handler));
|
|
|
|
router.post('/:id/inactive',
|
|
this.inactiveAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.inactiveAccount.handler));
|
|
|
|
router.post('/:id/recalculate-balance',
|
|
this.recalcualteBalanace.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.recalcualteBalanace.handler));
|
|
|
|
router.post('/:id/transfer_account/:toAccount',
|
|
this.transferToAnotherAccount.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.transferToAnotherAccount.handler));
|
|
|
|
router.post('/bulk/:type(activate|inactivate)',
|
|
this.bulkInactivateAccounts.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.bulkInactivateAccounts.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Creates a new account.
|
|
*/
|
|
newAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().isLength({ min: 3 }).
|
|
trim().
|
|
escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('code').optional().isLength({ max: 10 }).
|
|
trim().
|
|
escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('account_type_id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('description').optional().trim().escape()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, form, _req$models, AccountType, Account, foundAccountCodePromise, foundAccountTypePromise, _ref, _ref2, foundAccountCode, foundAccountType;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);_req$models =
|
|
req.models, AccountType = _req$models.AccountType, Account = _req$models.Account;
|
|
|
|
foundAccountCodePromise = form.code ?
|
|
Account.query().where('code', form.code) : null;
|
|
|
|
foundAccountTypePromise = AccountType.query().
|
|
findById(form.account_type_id);_context.next = 9;return (
|
|
|
|
Promise.all([
|
|
foundAccountCodePromise, foundAccountTypePromise]));case 9:_ref = _context.sent;_ref2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1___default()(_ref, 2);foundAccountCode = _ref2[0];foundAccountType = _ref2[1];if (!(
|
|
|
|
|
|
foundAccountCodePromise && foundAccountCode.length > 0)) {_context.next = 15;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'NOT_UNIQUE_CODE', code: 100 }] }));case 15:if (
|
|
|
|
|
|
foundAccountType) {_context.next = 17;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'NOT_EXIST_ACCOUNT_TYPE', code: 200 }] }));case 17:_context.next = 19;return (
|
|
|
|
|
|
Account.query().insert(_objectSpread({}, form)));case 19:return _context.abrupt("return",
|
|
|
|
res.status(200).send({ item: {} }));case 20:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Edit the given account details.
|
|
*/
|
|
editAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().isLength({ min: 3 }).
|
|
trim().
|
|
escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('code').exists().isLength({ max: 10 }).
|
|
trim().
|
|
escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('account_type_id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('description').optional().trim().escape()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var id, validationErrors, _req$models2, Account, AccountType, form, account, foundAccountCodePromise, foundAccountTypePromise, _ref3, _ref4, foundAccountCode, foundAccountType;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
id = req.params.id;
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 4;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 4:_req$models2 =
|
|
|
|
|
|
req.models, Account = _req$models2.Account, AccountType = _req$models2.AccountType;
|
|
form = _objectSpread({}, req.body);_context2.next = 8;return (
|
|
Account.query().findById(id));case 8:account = _context2.sent;if (
|
|
|
|
account) {_context2.next = 11;break;}return _context2.abrupt("return",
|
|
res.boom.notFound());case 11:
|
|
|
|
foundAccountCodePromise = form.code && form.code !== account.code ?
|
|
Account.query().where('code', form.code).whereNot('id', account.id) : null;
|
|
|
|
foundAccountTypePromise = form.account_type_id !== account.account_type_id ?
|
|
AccountType.query().where('id', form.account_type_id) : null;_context2.next = 15;return (
|
|
|
|
Promise.all([
|
|
foundAccountCodePromise, foundAccountTypePromise]));case 15:_ref3 = _context2.sent;_ref4 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_1___default()(_ref3, 2);foundAccountCode = _ref4[0];foundAccountType = _ref4[1];if (!(
|
|
|
|
foundAccountCode.length > 0 && foundAccountCodePromise)) {_context2.next = 21;break;}return _context2.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'NOT_UNIQUE_CODE', code: 100 }] }));case 21:if (!(
|
|
|
|
|
|
foundAccountType.length <= 0 && foundAccountTypePromise)) {_context2.next = 23;break;}return _context2.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'NOT_EXIST_ACCOUNT_TYPE', code: 110 }] }));case 23:_context2.next = 25;return (
|
|
|
|
|
|
account.patch(_objectSpread({}, form)));case 25:return _context2.abrupt("return",
|
|
|
|
res.status(200).send());case 26:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Get details of the given account.
|
|
*/
|
|
getAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').toInt()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var id, Account, account;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
id = req.params.id;
|
|
Account = req.models.Account;_context3.next = 4;return (
|
|
Account.query().remember().where('id', id).first());case 4:account = _context3.sent;if (
|
|
|
|
account) {_context3.next = 7;break;}return _context3.abrupt("return",
|
|
res.boom.notFound());case 7:return _context3.abrupt("return",
|
|
|
|
res.status(200).send({ account: _objectSpread({}, account) }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Delete the given account.
|
|
*/
|
|
deleteAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').toInt()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var id, _req$models3, Account, AccountTransaction, account, accountTransactions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
id = req.params.id;_req$models3 =
|
|
req.models, Account = _req$models3.Account, AccountTransaction = _req$models3.AccountTransaction;_context4.next = 4;return (
|
|
Account.query().findById(id));case 4:account = _context4.sent;if (
|
|
|
|
account) {_context4.next = 7;break;}return _context4.abrupt("return",
|
|
res.boom.notFound());case 7:if (!
|
|
|
|
account.predefined) {_context4.next = 9;break;}return _context4.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'ACCOUNT.PREDEFINED', code: 200 }] }));case 9:_context4.next = 11;return (
|
|
|
|
|
|
AccountTransaction.query().
|
|
where('account_id', account.id));case 11:accountTransactions = _context4.sent;if (!(
|
|
|
|
accountTransactions.length > 0)) {_context4.next = 14;break;}return _context4.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'ACCOUNT.HAS.ASSOCIATED.TRANSACTIONS', code: 100 }] }));case 14:_context4.next = 16;return (
|
|
|
|
|
|
Account.query().deleteById(account.id));case 16:return _context4.abrupt("return",
|
|
|
|
res.status(200).send());case 17:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve accounts list.
|
|
*/
|
|
getAccountsList: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_type').optional().isIn(['tree', 'flat']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_types').optional().isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_types.*').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('custom_view_id').optional().isNumeric().toInt(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('stringified_filter_roles').optional().isJSON(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('column_sort_by').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('sort_order').optional().isIn(['desc', 'asc'])],
|
|
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, filter, _req$models4, Resource, Account, View, errorReasons, accountsResource, resourceFieldsKeys, view, dynamicFilter, sortByFilter, viewFilter, filterRoles, accounts, nestedAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({
|
|
account_types: [],
|
|
display_type: 'tree',
|
|
filter_roles: [],
|
|
sort_order: 'asc' },
|
|
req.query);
|
|
|
|
if (filter.stringified_filter_roles) {
|
|
filter.filter_roles = JSON.parse(filter.stringified_filter_roles);
|
|
}_req$models4 =
|
|
|
|
req.models, Resource = _req$models4.Resource, Account = _req$models4.Account, View = _req$models4.View;
|
|
errorReasons = [];_context5.next = 9;return (
|
|
|
|
Resource.query().
|
|
remember().
|
|
where('name', 'accounts').
|
|
withGraphFetched('fields').
|
|
first());case 9:accountsResource = _context5.sent;if (
|
|
|
|
accountsResource) {_context5.next = 12;break;}return _context5.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ACCOUNTS_RESOURCE_NOT_FOUND', code: 200 }] }));case 12:
|
|
|
|
|
|
resourceFieldsKeys = accountsResource.fields.map(function (c) {return c.key;});_context5.next = 15;return (
|
|
|
|
View.query().onBuild(function (builder) {
|
|
if (filter.custom_view_id) {
|
|
builder.where('id', filter.custom_view_id);
|
|
} else {
|
|
builder.where('favourite', true);
|
|
}
|
|
// builder.where('resource_id', accountsResource.id);
|
|
builder.withGraphFetched('roles.field');
|
|
builder.withGraphFetched('columns');
|
|
builder.first();
|
|
|
|
builder.remember();
|
|
}));case 15:view = _context5.sent;
|
|
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilter"](Account.tableName);
|
|
|
|
if (filter.column_sort_by) {
|
|
if (resourceFieldsKeys.indexOf(filter.column_sort_by) === -1) {
|
|
errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 });
|
|
}
|
|
sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterSortBy"](
|
|
filter.column_sort_by,
|
|
filter.sort_order);
|
|
|
|
dynamicFilter.setFilter(sortByFilter);
|
|
}
|
|
|
|
// View roles.
|
|
if (view && view.roles.length > 0) {
|
|
viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterViews"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapViewRolesToConditionals"])(view.roles),
|
|
view.rolesLogicExpression);
|
|
|
|
if (!viewFilter.validateFilterRoles()) {
|
|
errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 });
|
|
}
|
|
dynamicFilter.setFilter(viewFilter);
|
|
}
|
|
// Filter roles.
|
|
if (filter.filter_roles.length > 0) {
|
|
// Validate the accounts resource fields.
|
|
filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterFilterRoles"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapFilterRolesToDynamicFilter"])(filter.filter_roles),
|
|
accountsResource.fields);
|
|
|
|
dynamicFilter.setFilter(filterRoles);
|
|
|
|
if (filterRoles.validateFilterRoles().length > 0) {
|
|
errorReasons.push({ type: 'ACCOUNTS.RESOURCE.HAS.NO.GIVEN.FIELDS', code: 500 });
|
|
}
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context5.next = 22;break;}return _context5.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 22:_context5.next = 24;return (
|
|
|
|
Account.query().
|
|
remember().
|
|
onBuild(function (builder) {
|
|
builder.modify('filterAccountTypes', filter.account_types);
|
|
builder.withGraphFetched('type');
|
|
builder.withGraphFetched('balance');
|
|
|
|
dynamicFilter.buildQuery()(builder);
|
|
}));case 24:accounts = _context5.sent;
|
|
|
|
nestedAccounts = Account.toNestedArray(accounts);return _context5.abrupt("return",
|
|
|
|
res.status(200).send(_objectSpread({
|
|
accounts: nestedAccounts },
|
|
view ? {
|
|
customViewId: view.id } :
|
|
{})));case 27:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Re-calculates balance of the given account.
|
|
*/
|
|
recalcualteBalanace: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var id, _req$models5, Account, AccountTransaction, AccountBalance, account, accountTransactions, journalEntries;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
|
|
id = req.params.id;_req$models5 =
|
|
|
|
|
|
|
|
|
|
req.models, Account = _req$models5.Account, AccountTransaction = _req$models5.AccountTransaction, AccountBalance = _req$models5.AccountBalance;_context6.next = 4;return (
|
|
Account.findById(id));case 4:account = _context6.sent;if (
|
|
|
|
account) {_context6.next = 7;break;}return _context6.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ACCOUNT.NOT.FOUND', code: 100 }] }));case 7:
|
|
|
|
|
|
accountTransactions = AccountTransaction.query().
|
|
where('account_id', account.id);
|
|
|
|
journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"]();
|
|
journalEntries.loadFromCollection(accountTransactions);
|
|
|
|
// Delete the balance of the given account id.
|
|
_context6.next = 12;return AccountBalance.query().where('account_id', account.id)["delete"]();case 12:_context6.next = 14;return (
|
|
|
|
|
|
journalEntries.saveBalance());case 14:return _context6.abrupt("return",
|
|
|
|
res.status(200).send());case 15:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Active the given account.
|
|
*/
|
|
activeAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler7 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee7(req, res) {var id, Account, account;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee7$(_context7) {while (1) {switch (_context7.prev = _context7.next) {case 0:
|
|
id = req.params.id;
|
|
Account = req.models.Account;_context7.next = 4;return (
|
|
Account.query().findById(id));case 4:account = _context7.sent;if (
|
|
|
|
account) {_context7.next = 7;break;}return _context7.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ACCOUNT.NOT.FOUND', code: 100 }] }));case 7:_context7.next = 9;return (
|
|
|
|
|
|
Account.query().
|
|
where('id', id).
|
|
patch({ active: true }));case 9:return _context7.abrupt("return",
|
|
|
|
res.status(200).send({ id: account.id }));case 10:case "end":return _context7.stop();}}}, _callee7);}));function handler(_x13, _x14) {return _handler7.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Inactive the given account.
|
|
*/
|
|
inactiveAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee8(req, res) {var id, Account, account;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee8$(_context8) {while (1) {switch (_context8.prev = _context8.next) {case 0:
|
|
id = req.params.id;
|
|
Account = req.models.Account;_context8.next = 4;return (
|
|
Account.query().findById(id));case 4:account = _context8.sent;if (
|
|
|
|
account) {_context8.next = 7;break;}return _context8.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ACCOUNT.NOT.FOUND', code: 100 }] }));case 7:_context8.next = 9;return (
|
|
|
|
|
|
Account.query().
|
|
where('id', id).
|
|
patch({ active: false }));case 9:return _context8.abrupt("return",
|
|
|
|
res.status(200).send({ id: account.id }));case 10:case "end":return _context8.stop();}}}, _callee8);}));function handler(_x15, _x16) {return _handler8.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Transfer all journal entries of the given account to another account.
|
|
*/
|
|
transferToAnotherAccount: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('toAccount').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler9 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee9(req, res) {var validationErrors;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee9$(_context9) {while (1) {switch (_context9.prev = _context9.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context9.next = 3;break;}return _context9.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:case "end":return _context9.stop();}}}, _callee9);}));function handler(_x17, _x18) {return _handler9.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deleteBulkAccounts: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids').isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids.*').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler10 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee10(req, res) {var validationErrors, filter, _req$models6, Account, AccountTransaction, accounts, accountsIds, notFoundAccounts, predefinedAccounts, errorReasons, accountsTransactions, accountsHasTransactions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee10$(_context10) {while (1) {switch (_context10.prev = _context10.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context10.next = 3;break;}return _context10.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({ ids: [] }, req.query);_req$models6 =
|
|
req.models, Account = _req$models6.Account, AccountTransaction = _req$models6.AccountTransaction;_context10.next = 7;return (
|
|
|
|
Account.query().onBuild(function (builder) {
|
|
if (filter.ids.length) {
|
|
builder.whereIn('id', filter.ids);
|
|
}
|
|
}));case 7:accounts = _context10.sent;
|
|
accountsIds = accounts.map(function (a) {return a.id;});
|
|
notFoundAccounts = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, accountsIds);
|
|
predefinedAccounts = accounts.filter(function (account) {return account.predefined;});
|
|
errorReasons = [];if (!(
|
|
|
|
notFoundAccounts.length > 0)) {_context10.next = 14;break;}return _context10.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{
|
|
type: 'ACCOUNTS.IDS.NOT.FOUND',
|
|
code: 200,
|
|
ids: notFoundAccounts }] }));case 14:
|
|
|
|
|
|
|
|
if (predefinedAccounts.length > 0) {
|
|
errorReasons.push({
|
|
type: 'ACCOUNT.PREDEFINED',
|
|
code: 200,
|
|
ids: predefinedAccounts.map(function (a) {return a.id;}) });
|
|
|
|
}_context10.next = 17;return (
|
|
AccountTransaction.query().
|
|
whereIn('account_id', accountsIds).
|
|
count('id as transactions_count').
|
|
groupBy('account_id').
|
|
select('account_id'));case 17:accountsTransactions = _context10.sent;
|
|
|
|
accountsHasTransactions = [];
|
|
|
|
accountsTransactions.forEach(function (transaction) {
|
|
if (transaction.transactionsCount > 0) {
|
|
accountsHasTransactions.push(transaction.accountId);
|
|
}
|
|
});
|
|
if (accountsHasTransactions.length > 0) {
|
|
errorReasons.push({
|
|
type: 'ACCOUNT.HAS.ASSOCIATED.TRANSACTIONS',
|
|
code: 300,
|
|
ids: accountsHasTransactions });
|
|
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context10.next = 23;break;}return _context10.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 23:_context10.next = 25;return (
|
|
|
|
Account.query().
|
|
whereIn('id', accounts.map(function (a) {return a.id;}))["delete"]());case 25:return _context10.abrupt("return",
|
|
|
|
|
|
res.status(200).send());case 26:case "end":return _context10.stop();}}}, _callee10);}));function handler(_x19, _x20) {return _handler10.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Bulk acvtivate/inactivate the given accounts.
|
|
*/
|
|
bulkInactivateAccounts: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids').isArray({ min: 2 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('ids.*').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('type').exists().isIn(['activate', 'inactivate'])],
|
|
|
|
handler: function () {var _handler11 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee11(req, res) {var validationErrors, filter, Account, type, storedAccounts, storedAccountsIds, notFoundAccounts, updatedAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee11$(_context11) {while (1) {switch (_context11.prev = _context11.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context11.next = 3;break;}return _context11.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({
|
|
ids: [] },
|
|
req.query);
|
|
|
|
Account = req.models.Account;
|
|
type = req.params.type;_context11.next = 8;return (
|
|
|
|
Account.query().whereIn('id', filter.ids));case 8:storedAccounts = _context11.sent;
|
|
storedAccountsIds = storedAccounts.map(function (account) {return account.id;});
|
|
notFoundAccounts = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, storedAccountsIds);if (!(
|
|
|
|
notFoundAccounts.length > 0)) {_context11.next = 13;break;}return _context11.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ACCOUNTS.NOT.FOUND', code: 200 }] }));case 13:_context11.next = 15;return (
|
|
|
|
|
|
Account.query().
|
|
whereIn('id', storedAccountsIds).
|
|
patch({
|
|
active: type === 'activate' ? 1 : 0 }));case 15:updatedAccounts = _context11.sent;return _context11.abrupt("return",
|
|
|
|
|
|
res.status(200).send({ ids: storedAccountsIds }));case 17:case "end":return _context11.stop();}}}, _callee11);}));function handler(_x21, _x22) {return _handler11.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Authentication.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/http/controllers/Authentication.js ***!
|
|
\************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! mustache */ "mustache");
|
|
/* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(mustache__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jsonwebtoken */ "jsonwebtoken");
|
|
/* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(jsonwebtoken__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_9__);
|
|
/* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! uniqid */ "uniqid");
|
|
/* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(uniqid__WEBPACK_IMPORTED_MODULE_10__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_11__);
|
|
/* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js");
|
|
/* harmony import */ var _services_mail__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/services/mail */ "./src/services/mail.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _database_manager__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/database/manager */ "./src/database/manager.js");
|
|
/* harmony import */ var _system_models_Tenant__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js");
|
|
/* harmony import */ var _models_TenantUser__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js");
|
|
/* harmony import */ var _system_TenantsManager__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/system/TenantsManager */ "./src/system/TenantsManager.js");
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/system/models/PasswordReset */ "./src/system/models/PasswordReset.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Constructor method.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.post('/login',
|
|
this.login.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.login.handler));
|
|
|
|
router.post('/register',
|
|
this.register.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.register.handler));
|
|
|
|
router.post('/send_reset_password',
|
|
this.sendResetPassword.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.sendResetPassword.handler));
|
|
|
|
router.post('/reset/:token',
|
|
this.resetPassword.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.resetPassword.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* User login authentication request.
|
|
*/
|
|
login: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('crediential').exists().isEmail(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('password').exists().isLength({ min: 5 })],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, form, JWT_SECRET_KEY, user, lastLoginAt, updateTenantUser, updateSystemUser, token;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
JWT_SECRET_KEY = process.env.JWT_SECRET_KEY;
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'Someone trying to login.', { form: form });_context.next = 8;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().
|
|
withGraphFetched('tenant').
|
|
where('email', form.crediential).
|
|
orWhere('phone_number', form.crediential).
|
|
first());case 8:user = _context.sent;if (
|
|
|
|
user) {_context.next = 11;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'INVALID_DETAILS', code: 100 }] }));case 11:if (
|
|
|
|
|
|
user.verifyPassword(form.password)) {_context.next = 13;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'INVALID_DETAILS', code: 100 }] }));case 13:if (
|
|
|
|
|
|
user.active) {_context.next = 15;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'USER_INACTIVE', code: 110 }] }));case 15:
|
|
|
|
|
|
lastLoginAt = moment__WEBPACK_IMPORTED_MODULE_11___default()().format('YYYY/MM/DD HH:mm:ss');
|
|
|
|
updateTenantUser = _models_TenantUser__WEBPACK_IMPORTED_MODULE_19__["default"].tenant().query().
|
|
where('id', user.id).
|
|
update({ last_login_at: lastLoginAt });
|
|
|
|
updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().
|
|
where('id', user.id).
|
|
update({ last_login_at: lastLoginAt });_context.next = 20;return (
|
|
|
|
Promise.all([updateTenantUser, updateSystemUser]));case 20:
|
|
|
|
token = jsonwebtoken__WEBPACK_IMPORTED_MODULE_8___default.a.sign(
|
|
{ email: user.email, _id: user.id },
|
|
JWT_SECRET_KEY,
|
|
{ expiresIn: '1d' });
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'Logging success.', { form: form });return _context.abrupt("return",
|
|
|
|
res.status(200).send({ token: token, user: user }));case 23:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Registers a new organization.
|
|
*/
|
|
register: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('organization_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('phone_number').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('password').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('country').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, form, user, errorReasons, organizationId, tenantOrganization, hashedPassword, userInsert, registeredUser, tenantDb, filePath, template, rendered, mailOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'Someone trying to register.', { form: form });_context2.next = 7;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().
|
|
where('email', form.email).
|
|
orWhere('phone_number', form.phone_number).
|
|
first());case 7:user = _context2.sent;
|
|
|
|
errorReasons = [];
|
|
|
|
if (user && user.phoneNumber === form.phone_number) {
|
|
errorReasons.push({ type: 'PHONE_NUMBER_EXISTS', code: 100 });
|
|
}
|
|
if (user && user.email === form.email) {
|
|
errorReasons.push({ type: 'EMAIL_EXISTS', code: 200 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context2.next = 13;break;}return _context2.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 13:
|
|
|
|
organizationId = uniqid__WEBPACK_IMPORTED_MODULE_10___default()();_context2.next = 16;return (
|
|
_system_models_Tenant__WEBPACK_IMPORTED_MODULE_18__["default"].query().insert({
|
|
organization_id: organizationId }));case 16:tenantOrganization = _context2.sent;_context2.next = 19;return (
|
|
|
|
|
|
Object(_utils__WEBPACK_IMPORTED_MODULE_16__["hashPassword"])(form.password));case 19:hashedPassword = _context2.sent;
|
|
userInsert = _objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_9__["pick"])(form, ['first_name', 'last_name', 'email', 'phone_number']), {
|
|
active: true });_context2.next = 23;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().insert(_objectSpread({},
|
|
userInsert, {
|
|
password: hashedPassword,
|
|
tenant_id: tenantOrganization.id })));case 23:registeredUser = _context2.sent;_context2.next = 26;return (
|
|
|
|
_database_manager__WEBPACK_IMPORTED_MODULE_17__["default"].createDb("bigcapital_tenant_".concat(organizationId)));case 26:
|
|
|
|
tenantDb = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_20__["default"].knexInstance(organizationId);_context2.next = 29;return (
|
|
tenantDb.migrate.latest());case 29:
|
|
|
|
_models_TenantModel__WEBPACK_IMPORTED_MODULE_21__["default"].knexBinded = tenantDb;_context2.next = 32;return (
|
|
|
|
_models_TenantUser__WEBPACK_IMPORTED_MODULE_19__["default"].bindKnex(tenantDb).query().insert(_objectSpread({},
|
|
userInsert, {
|
|
invite_accepted_at: moment__WEBPACK_IMPORTED_MODULE_11___default()().format('YYYY/MM/DD HH:mm:ss') })));case 32:
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'New tenant has been created.', { organizationId: organizationId });
|
|
|
|
filePath = path__WEBPACK_IMPORTED_MODULE_5___default.a.join(global.rootPath, 'views/mail/Welcome.html');
|
|
template = fs__WEBPACK_IMPORTED_MODULE_6___default.a.readFileSync(filePath, 'utf8');
|
|
rendered = mustache__WEBPACK_IMPORTED_MODULE_7___default.a.render(template, _objectSpread({}, form));
|
|
mailOptions = {
|
|
to: userInsert.email,
|
|
from: "".concat(process.env.MAIL_FROM_NAME, " ").concat(process.env.MAIL_FROM_ADDRESS),
|
|
subject: 'Welcome to Bigcapital',
|
|
html: rendered };
|
|
|
|
_services_mail__WEBPACK_IMPORTED_MODULE_15__["default"].sendMail(mailOptions, function (error) {
|
|
if (error) {
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Failed send welcome mail', { error: error, form: form });
|
|
return;
|
|
}
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User has been sent welcome email successfuly.', { form: form });
|
|
});return _context2.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
organization_id: organizationId }));case 39:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Send reset password link via email or SMS.
|
|
*/
|
|
sendResetPassword: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').exists().isEmail()],
|
|
|
|
// eslint-disable-next-line consistent-return
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, form, user, token, passwordReset, filePath, template, rendered, mailOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User trying to send reset password.', { form: form });_context3.next = 7;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().where('email', form.email).first());case 7:user = _context3.sent;if (
|
|
|
|
user) {_context3.next = 10;break;}return _context3.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'EMAIL.NOT.REGISTERED', code: 200 }] }));case 10:_context3.next = 12;return (
|
|
|
|
|
|
|
|
_system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query().
|
|
where('email', form.email)["delete"]());case 12:
|
|
|
|
|
|
token = uniqid__WEBPACK_IMPORTED_MODULE_10___default()();_context3.next = 15;return (
|
|
_system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query().
|
|
insert({ email: form.email, token: token }));case 15:passwordReset = _context3.sent;
|
|
|
|
filePath = path__WEBPACK_IMPORTED_MODULE_5___default.a.join(global.rootPath, 'views/mail/ResetPassword.html');
|
|
template = fs__WEBPACK_IMPORTED_MODULE_6___default.a.readFileSync(filePath, 'utf8');
|
|
rendered = mustache__WEBPACK_IMPORTED_MODULE_7___default.a.render(template, {
|
|
url: "".concat(req.protocol, "://").concat(req.hostname, "/reset/").concat(passwordReset.token),
|
|
first_name: user.firstName,
|
|
last_name: user.lastName
|
|
// contact_us_email: config.contactUsMail,
|
|
});
|
|
|
|
mailOptions = {
|
|
to: user.email,
|
|
from: "".concat(process.env.MAIL_FROM_NAME, " ").concat(process.env.MAIL_FROM_ADDRESS),
|
|
subject: 'Bigcapital - Password Reset',
|
|
html: rendered };
|
|
|
|
_services_mail__WEBPACK_IMPORTED_MODULE_15__["default"].sendMail(mailOptions, function (error) {
|
|
if (error) {
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Failed send reset password mail', { error: error, form: form });
|
|
return;
|
|
}
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User has been sent reset password email successfuly.', { form: form });
|
|
});
|
|
res.status(200).send({ email: passwordReset.email });case 22:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Reset password.
|
|
*/
|
|
resetPassword: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('password').exists().isLength({ min: 5 }).custom(function (value, _ref) {var req = _ref.req;
|
|
if (value !== req.body.confirm_password) {
|
|
throw new Error("Passwords don't match");
|
|
} else {
|
|
return value;
|
|
}
|
|
})],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, token, password, tokenModel, user, hashedPassword;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User trying to reset password.');
|
|
token = req.params.token;
|
|
password = req.body.password;_context4.next = 8;return (
|
|
|
|
_system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query().
|
|
where('token', token)
|
|
// .where('created_at', '>=', Date.now() - 3600000)
|
|
.first());case 8:tokenModel = _context4.sent;if (
|
|
|
|
tokenModel) {_context4.next = 11;break;}return _context4.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'TOKEN_INVALID', code: 100 }] }));case 11:_context4.next = 13;return (
|
|
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().
|
|
where('email', tokenModel.email).first());case 13:user = _context4.sent;if (
|
|
|
|
user) {_context4.next = 16;break;}return _context4.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'USER_NOT_FOUND', code: 120 }] }));case 16:_context4.next = 18;return (
|
|
|
|
|
|
Object(_utils__WEBPACK_IMPORTED_MODULE_16__["hashPassword"])(password));case 18:hashedPassword = _context4.sent;_context4.next = 21;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().
|
|
where('email', tokenModel.email).
|
|
update({
|
|
password: hashedPassword }));case 21:_context4.next = 23;return (
|
|
|
|
|
|
|
|
_system_models_PasswordReset__WEBPACK_IMPORTED_MODULE_22__["default"].query().where('token', token)["delete"]());case 23:
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('info', 'User password has been reset successfully.');return _context4.abrupt("return",
|
|
|
|
res.status(200).send({}));case 25:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Currencies.js":
|
|
/*!********************************************!*\
|
|
!*** ./src/http/controllers/Currencies.js ***!
|
|
\********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.all.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.all.handler));
|
|
|
|
router.post('/',
|
|
this.newCurrency.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newCurrency.handler));
|
|
|
|
router.post('/:id',
|
|
this.editCurrency.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editCurrency.handler));
|
|
|
|
router["delete"]('/:currency_code',
|
|
this.deleteCurrecy.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteCurrecy.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve all registered currency details.
|
|
*/
|
|
all: {
|
|
validation: [],
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(req, res) {var Currency, currencies;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
Currency = req.models.Currency;_context.next = 3;return (
|
|
Currency.query());case 3:currencies = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
currencies: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(
|
|
currencies) }));case 5:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
|
|
newCurrency: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_code').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res) {var validationErrors, form, Currency, foundCurrency;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
Currency = req.models.Currency;_context2.next = 7;return (
|
|
|
|
Currency.query().
|
|
where('currency_code', form.currency_code));case 7:foundCurrency = _context2.sent;if (!(
|
|
|
|
foundCurrency.length > 0)) {_context2.next = 10;break;}return _context2.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'CURRENCY.CODE.ALREADY.EXISTS', code: 100 }] }));case 10:_context2.next = 12;return (
|
|
|
|
|
|
Currency.query().
|
|
insert(_objectSpread({}, form)));case 12:return _context2.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
currency: _objectSpread({}, form) }));case 13:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
deleteCurrecy: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('currency_code').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res) {var validationErrors, Currency, currencyCode;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
Currency = req.models.Currency;
|
|
currencyCode = req.params.currency_code;_context3.next = 7;return (
|
|
|
|
Currency.query().
|
|
where('currency_code', currencyCode)["delete"]());case 7:return _context3.abrupt("return",
|
|
|
|
|
|
res.status(200).send({ currency_code: currencyCode }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
editCurrency: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('currency_code').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(req, res) {var validationErrors, form, id, Currency, foundCurrency;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
id = req.params.id;
|
|
Currency = req.models.Currency;_context4.next = 8;return (
|
|
|
|
Currency.query().
|
|
where('currency_code', form.currency_code).whereNot('id', id));case 8:foundCurrency = _context4.sent;if (!(
|
|
|
|
foundCurrency.length > 0)) {_context4.next = 11;break;}return _context4.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'CURRENCY.CODE.ALREADY.EXISTS', code: 100 }] }));case 11:_context4.next = 13;return (
|
|
|
|
|
|
Currency.query().where('id', id).update(_objectSpread({}, form)));case 13:return _context4.abrupt("return",
|
|
|
|
res.status(200).send({ currency: _objectSpread({}, form) }));case 14:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/ExchangeRates.js":
|
|
/*!***********************************************!*\
|
|
!*** ./src/http/controllers/ExchangeRates.js ***!
|
|
\***********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Constructor method.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.exchangeRates.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.exchangeRates.handler));
|
|
|
|
router.post('/',
|
|
this.addExchangeRate.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.addExchangeRate.handler));
|
|
|
|
router.post('/:id',
|
|
this.editExchangeRate.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.editExchangeRate.handler));
|
|
|
|
router["delete"]('/bulk',
|
|
this.bulkDeleteExchangeRates.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.bulkDeleteExchangeRates.handler));
|
|
|
|
router["delete"]('/:id',
|
|
this.deleteExchangeRate.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteExchangeRate.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve exchange rates.
|
|
*/
|
|
exchangeRates: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, filter, ExchangeRate, exchangeRates;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({
|
|
page: 1,
|
|
page_size: 10 },
|
|
req.query);
|
|
|
|
ExchangeRate = req.models.ExchangeRate;_context.next = 7;return (
|
|
ExchangeRate.query().
|
|
pagination(filter.page - 1, filter.page_size));case 7:exchangeRates = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({ exchange_rates: exchangeRates }));case 9:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Adds a new exchange rate on the given date.
|
|
*/
|
|
addExchangeRate: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').exists().isNumeric().toFloat(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('currency_code').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('date').exists().isISO8601()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, ExchangeRate, form, foundExchangeRate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
ExchangeRate = req.models.ExchangeRate;
|
|
form = _objectSpread({}, req.body);_context2.next = 7;return (
|
|
ExchangeRate.query().
|
|
where('currency_code', form.currency_code).
|
|
where('date', form.date));case 7:foundExchangeRate = _context2.sent;if (!(
|
|
|
|
foundExchangeRate.length > 0)) {_context2.next = 10;break;}return _context2.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'EXCHANGE.RATE.DATE.PERIOD.DEFINED', code: 200 }] }));case 10:_context2.next = 12;return (
|
|
|
|
|
|
ExchangeRate.query().insert(_objectSpread({},
|
|
form, {
|
|
date: moment__WEBPACK_IMPORTED_MODULE_5___default()(form.date).format('YYYY-MM-DD') })));case 12:return _context2.abrupt("return",
|
|
|
|
|
|
res.status(200).send());case 13:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Edit the given exchange rate.
|
|
*/
|
|
editExchangeRate: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').exists().isNumeric().toFloat()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, id, form, ExchangeRate, foundExchangeRate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
id = req.params.id;
|
|
form = _objectSpread({}, req.body);
|
|
ExchangeRate = req.models.ExchangeRate;_context3.next = 8;return (
|
|
|
|
ExchangeRate.query().
|
|
where('id', id));case 8:foundExchangeRate = _context3.sent;if (
|
|
|
|
foundExchangeRate.length) {_context3.next = 11;break;}return _context3.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'EXCHANGE.RATE.NOT.FOUND', code: 200 }] }));case 11:_context3.next = 13;return (
|
|
|
|
|
|
ExchangeRate.query().
|
|
where('id', id).
|
|
update(_objectSpread({}, form)));case 13:return _context3.abrupt("return",
|
|
|
|
res.status(200).send({ id: id }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Delete the given exchange rate from the storage.
|
|
*/
|
|
deleteExchangeRate: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, id, ExchangeRate, foundExchangeRate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
id = req.params.id;
|
|
ExchangeRate = req.models.ExchangeRate;_context4.next = 7;return (
|
|
ExchangeRate.query().where('id', id));case 7:foundExchangeRate = _context4.sent;if (
|
|
|
|
foundExchangeRate.length) {_context4.next = 10;break;}return _context4.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'EXCHANGE.RATE.NOT.FOUND', code: 200 }] }));case 10:_context4.next = 12;return (
|
|
|
|
|
|
ExchangeRate.query().where('id', id)["delete"]());case 12:return _context4.abrupt("return",
|
|
|
|
res.status(200).send({ id: id }));case 13:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
bulkDeleteExchangeRates: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').isArray({ min: 2 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, filter, ExchangeRate, exchangeRates, exchangeRatesIds, notFoundExRates;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
|
|
filter = _objectSpread({
|
|
ids: [] },
|
|
req.query);
|
|
|
|
ExchangeRate = req.models.ExchangeRate;_context5.next = 7;return (
|
|
|
|
ExchangeRate.query().whereIn('id', filter.ids));case 7:exchangeRates = _context5.sent;
|
|
exchangeRatesIds = exchangeRates.map(function (category) {return category.id;});
|
|
notFoundExRates = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, exchangeRatesIds);if (!(
|
|
|
|
notFoundExRates.length > 0)) {_context5.next = 12;break;}return _context5.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'EXCHANGE.RATES.IS.NOT.FOUND', code: 200, ids: notFoundExRates }] }));case 12:_context5.next = 14;return (
|
|
|
|
|
|
ExchangeRate.query().whereIn('id', exchangeRatesIds)["delete"]());case 14:return _context5.abrupt("return",
|
|
|
|
res.status(200).send({ ids: exchangeRatesIds }));case 15:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements.js ***!
|
|
\*****************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _FinancialStatements_BalanceSheet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FinancialStatements/BalanceSheet */ "./src/http/controllers/FinancialStatements/BalanceSheet.js");
|
|
/* harmony import */ var _FinancialStatements_TrialBalanceSheet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FinancialStatements/TrialBalanceSheet */ "./src/http/controllers/FinancialStatements/TrialBalanceSheet.js");
|
|
/* harmony import */ var _FinancialStatements_generalLedger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FinancialStatements/generalLedger */ "./src/http/controllers/FinancialStatements/generalLedger.js");
|
|
/* harmony import */ var _FinancialStatements_JournalSheet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FinancialStatements/JournalSheet */ "./src/http/controllers/FinancialStatements/JournalSheet.js");
|
|
/* harmony import */ var _FinancialStatements_ProfitLossSheet__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FinancialStatements/ProfitLossSheet */ "./src/http/controllers/FinancialStatements/ProfitLossSheet.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_0___default.a.Router();
|
|
|
|
router.use('/balance_sheet', _FinancialStatements_BalanceSheet__WEBPACK_IMPORTED_MODULE_1__["default"].router());
|
|
router.use('/profit_loss_sheet', _FinancialStatements_ProfitLossSheet__WEBPACK_IMPORTED_MODULE_5__["default"].router());
|
|
router.use('/general_ledger', _FinancialStatements_generalLedger__WEBPACK_IMPORTED_MODULE_3__["default"].router());
|
|
router.use('/trial_balance_sheet', _FinancialStatements_TrialBalanceSheet__WEBPACK_IMPORTED_MODULE_2__["default"].router());
|
|
router.use('/journal', _FinancialStatements_JournalSheet__WEBPACK_IMPORTED_MODULE_4__["default"].router());
|
|
|
|
return router;
|
|
} });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements/BalanceSheet.js":
|
|
/*!******************************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements/BalanceSheet.js ***!
|
|
\******************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.balanceSheet.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_11__["default"])(this.balanceSheet.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve the balance sheet.
|
|
*/
|
|
balanceSheet: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('accounting_method').optional().isIn(['cash', 'accural']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_type').optional().isIn(['date_periods', 'total']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_by').optional({ nullable: true, checkFalsy: true }).
|
|
isIn(['year', 'month', 'week', 'day', 'quarter']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.divide_1000').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids').isArray().optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids.*').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Account, AccountType, filter, balanceFormatter, comparatorDateType, balanceSheetTypes, accounts, accountsGraph, journalEntriesCollected, journalEntries, dateRangeSet, totalPeriods, accountsMapperToResponse, assetsAccounts, liabilitiesAccounts, assetsAccountsResponse, liabilitiesEquityResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models =
|
|
|
|
|
|
req.models, Account = _req$models.Account, AccountType = _req$models.AccountType;
|
|
|
|
filter = _objectSpread({
|
|
display_columns_type: 'total',
|
|
display_columns_by: '',
|
|
from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'),
|
|
to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'),
|
|
number_format: {
|
|
no_cents: false,
|
|
divide_1000: false },
|
|
|
|
none_zero: false,
|
|
basis: 'cash',
|
|
account_ids: [] },
|
|
req.query);
|
|
|
|
if (!Array.isArray(filter.account_ids)) {
|
|
filter.account_ids = [filter.account_ids];
|
|
}
|
|
|
|
// Account balance formmatter based on the given query.
|
|
balanceFormatter = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_12__["formatNumberClosure"])(filter.number_format);
|
|
comparatorDateType = filter.display_columns_type === 'total' ? 'day' : filter.display_columns_by;_context.next = 10;return (
|
|
|
|
AccountType.query().where('balance_sheet', true));case 10:balanceSheetTypes = _context.sent;_context.next = 13;return (
|
|
|
|
|
|
Account.query()
|
|
// .remember('balance_sheet_accounts')
|
|
.whereIn('account_type_id', balanceSheetTypes.map(function (a) {return a.id;})).
|
|
modify('filterAccounts', filter.account_ids).
|
|
withGraphFetched('type').
|
|
withGraphFetched('transactions').
|
|
modifyGraph('transactions', function (builder) {
|
|
builder.modify('filterDateRange', null, filter.to_date);
|
|
}));case 13:accounts = _context.sent;
|
|
|
|
// Accounts dependency graph.
|
|
accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_10__["default"].fromArray(
|
|
accounts, { itemId: 'id', parentItemId: 'parentAccountId' });
|
|
|
|
// Load all entries that associated to the given accounts.
|
|
journalEntriesCollected = Account.collectJournalEntries(accounts);
|
|
journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph);
|
|
|
|
journalEntries.loadEntries(journalEntriesCollected);
|
|
|
|
// Date range collection.
|
|
dateRangeSet = filter.display_columns_type === 'date_periods' ?
|
|
Object(_utils__WEBPACK_IMPORTED_MODULE_9__["dateRangeCollection"])(
|
|
filter.from_date, filter.to_date, comparatorDateType) :
|
|
[];
|
|
|
|
// Gets the date range set from start to end date.
|
|
totalPeriods = function totalPeriods(account) {return {
|
|
total_periods: dateRangeSet.map(function (date) {
|
|
var amount = journalEntries.getAccountBalance(account.id, date, comparatorDateType);
|
|
|
|
return {
|
|
amount: amount,
|
|
formatted_amount: balanceFormatter(amount),
|
|
date: date };
|
|
|
|
}) };};
|
|
|
|
|
|
accountsMapperToResponse = function accountsMapperToResponse(account) {
|
|
// Calculates the closing balance to the given date.
|
|
var closingBalance = journalEntries.getAccountBalance(account.id, filter.to_date);
|
|
|
|
return _objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(account, ['id', 'index', 'name', 'code', 'parentAccountId']), {},
|
|
|
|
|
|
filter.display_columns_type === 'date_periods' && totalPeriods(account), {
|
|
|
|
total: {
|
|
amount: closingBalance,
|
|
formatted_amount: balanceFormatter(closingBalance),
|
|
date: filter.to_date } });
|
|
|
|
|
|
};
|
|
|
|
// Retrieve all assets accounts.
|
|
assetsAccounts = accounts.filter(function (account) {return (
|
|
account.type.normal === 'debit' && (
|
|
account.transactions.length > 0 || !filter.none_zero));}).
|
|
map(accountsMapperToResponse);
|
|
|
|
// Retrieve all liability accounts.
|
|
liabilitiesAccounts = accounts.filter(function (account) {return (
|
|
account.type.normal === 'credit' && (
|
|
account.transactions.length > 0 || !filter.none_zero));}).
|
|
map(accountsMapperToResponse);
|
|
|
|
// Retrieve the asset balance sheet.
|
|
assetsAccountsResponse = Account.toNestedArray(assetsAccounts);
|
|
|
|
// Retrieve liabilities and equity balance sheet.
|
|
liabilitiesEquityResponse = Account.toNestedArray(liabilitiesAccounts);
|
|
|
|
// Response.
|
|
return _context.abrupt("return", res.status(200).send({
|
|
query: _objectSpread({}, filter),
|
|
columns: _objectSpread({}, dateRangeSet),
|
|
accounts: [
|
|
{
|
|
name: 'Assets',
|
|
type: 'assets',
|
|
children: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(assetsAccountsResponse) },
|
|
|
|
{
|
|
name: 'Liabilities & Equity',
|
|
type: 'liabilities_equity',
|
|
children: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(liabilitiesEquityResponse) }] }));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js":
|
|
/*!*****************************************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements/FinancialStatementMixin.js ***!
|
|
\*****************************************************************************/
|
|
/*! exports provided: formatNumberClosure */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatNumberClosure", function() { return formatNumberClosure; });
|
|
|
|
|
|
var formatNumberClosure = function formatNumberClosure(filter) {return function (balance) {
|
|
var formattedBalance = parseFloat(balance);
|
|
|
|
if (filter.no_cents) {
|
|
formattedBalance = parseInt(formattedBalance, 10);
|
|
}
|
|
if (filter.divide_1000) {
|
|
formattedBalance /= 1000;
|
|
}
|
|
return formattedBalance;
|
|
};};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements/JournalSheet.js":
|
|
/*!******************************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements/JournalSheet.js ***!
|
|
\******************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.journal.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.journal.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve the ledger report of the given account.
|
|
*/
|
|
journal: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('from_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('to_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["oneOf"])([
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('transaction_types').optional().isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('transaction_types.*').optional().isNumeric().toInt()],
|
|
[
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('transaction_types').optional().trim().escape()]),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["oneOf"])([
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('account_ids').optional().isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('account_ids.*').optional().isNumeric().toInt()],
|
|
[
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('account_ids').optional().isNumeric().toInt()]),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('from_range').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('to_range').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('number_format.divide_1000').optional().isBoolean().toBoolean()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, AccountTransaction, filter, accountsJournalEntries, formatNumber, journalGrouped, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
AccountTransaction = req.models.AccountTransaction;
|
|
|
|
filter = _objectSpread({
|
|
from_date: moment__WEBPACK_IMPORTED_MODULE_5___default()().startOf('year').format('YYYY-MM-DD'),
|
|
to_date: moment__WEBPACK_IMPORTED_MODULE_5___default()().endOf('year').format('YYYY-MM-DD'),
|
|
from_range: null,
|
|
to_range: null,
|
|
account_ids: [],
|
|
transaction_types: [],
|
|
number_format: {
|
|
no_cents: false,
|
|
divide_1000: false } },
|
|
|
|
req.query);
|
|
|
|
if (!Array.isArray(filter.transaction_types)) {
|
|
filter.transaction_types = [filter.transaction_types];
|
|
}
|
|
if (!Array.isArray(filter.account_ids)) {
|
|
filter.account_ids = [filter.account_ids];
|
|
}
|
|
filter.account_ids = filter.account_ids.map(function (id) {return parseInt(id, 10);});_context.next = 10;return (
|
|
|
|
AccountTransaction.query()
|
|
// .remember()
|
|
.modify('filterDateRange', filter.from_date, filter.to_date).
|
|
modify('filterAccounts', filter.account_ids).
|
|
modify('filterTransactionTypes', filter.transaction_types).
|
|
modify('filterAmountRange', filter.from_range, filter.to_range).
|
|
withGraphFetched('account.type'));case 10:accountsJournalEntries = _context.sent;
|
|
|
|
formatNumber = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__["formatNumberClosure"])(filter.number_format);
|
|
|
|
journalGrouped = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["groupBy"])(accountsJournalEntries,
|
|
function (entry) {return "".concat(entry.referenceId, "-").concat(entry.referenceType);});
|
|
|
|
journal = Object.keys(journalGrouped).map(function (key) {
|
|
var transactionsGroup = journalGrouped[key];
|
|
|
|
var journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__["default"]();
|
|
journalPoster.loadEntries(transactionsGroup);
|
|
|
|
var trialBalance = journalPoster.getTrialBalance();
|
|
|
|
return {
|
|
id: key,
|
|
entries: transactionsGroup,
|
|
|
|
credit: trialBalance.credit,
|
|
debit: trialBalance.debit,
|
|
|
|
formatted_credit: formatNumber(trialBalance.credit),
|
|
formatted_debit: formatNumber(trialBalance.debit) };
|
|
|
|
});return _context.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
query: _objectSpread({}, filter),
|
|
journal: journal }));case 15:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements/ProfitLossSheet.js":
|
|
/*!*********************************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements/ProfitLossSheet.js ***!
|
|
\*********************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js");
|
|
/* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.profitLossSheet.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__["default"])(this.profitLossSheet.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve profit/loss financial statement.
|
|
*/
|
|
profitLossSheet: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.divide_1000').optional().isBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids').isArray().optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids.*').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_type').optional().isIn([
|
|
'total', 'date_periods']),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('display_columns_by').optional({ nullable: true, checkFalsy: true }).
|
|
isIn(['year', 'month', 'week', 'day', 'quarter'])],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Account, AccountType, filter, incomeStatementTypes, accounts, accountsGraph, filteredAccounts, journalEntriesCollected, journalEntries, numberFormatter, comparatorDateType, dateRangeSet, accountsMapper, totalAccountsReducer, accountsIncome, accountsExpenses, totalPeriodsMapper, netIncomePeriodsMapper, netIncomeTotal, incomeResponse, expenseResponse, netIncomeResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models =
|
|
|
|
|
|
req.models, Account = _req$models.Account, AccountType = _req$models.AccountType;
|
|
filter = _objectSpread({
|
|
from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'),
|
|
to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'),
|
|
number_format: {
|
|
no_cents: false,
|
|
divide_1000: false },
|
|
|
|
basis: 'accural',
|
|
none_zero: false,
|
|
display_columns_type: 'total',
|
|
display_columns_by: 'month',
|
|
account_ids: [] },
|
|
req.query);
|
|
|
|
if (!Array.isArray(filter.account_ids)) {
|
|
filter.account_ids = [filter.account_ids];
|
|
}_context.next = 8;return (
|
|
AccountType.query().where('income_sheet', true));case 8:incomeStatementTypes = _context.sent;_context.next = 11;return (
|
|
|
|
|
|
Account.query()
|
|
// .remember('profit_loss_accounts')
|
|
.modify('filterAccounts', filter.account_ids).
|
|
whereIn('account_type_id', incomeStatementTypes.map(function (t) {return t.id;})).
|
|
withGraphFetched('type').
|
|
withGraphFetched('transactions'));case 11:accounts = _context.sent;
|
|
|
|
// Accounts dependency graph.
|
|
accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_12__["default"].fromArray(
|
|
accounts, { itemId: 'id', parentItemId: 'parentAccountId' });
|
|
|
|
|
|
// Filter all none zero accounts if it was enabled.
|
|
filteredAccounts = accounts.filter(function (account) {return (
|
|
account.transactions.length > 0 || !filter.none_zero);});
|
|
|
|
journalEntriesCollected = Account.collectJournalEntries(accounts);
|
|
journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph);
|
|
journalEntries.loadEntries(journalEntriesCollected);
|
|
|
|
// Account balance formmatter based on the given query.
|
|
numberFormatter = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_11__["formatNumberClosure"])(filter.number_format);
|
|
comparatorDateType = filter.display_columns_type === 'total' ?
|
|
'day' : filter.display_columns_by;
|
|
|
|
// Gets the date range set from start to end date.
|
|
dateRangeSet = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["dateRangeCollection"])(
|
|
filter.from_date,
|
|
filter.to_date,
|
|
comparatorDateType);
|
|
|
|
|
|
accountsMapper = function accountsMapper(incomeExpenseAccounts) {return (
|
|
incomeExpenseAccounts.map(function (account) {return _objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(account, ['id', 'index', 'name', 'code', 'parentAccountId']), {},
|
|
|
|
|
|
filter.display_columns_type === 'total' && {
|
|
total: function () {
|
|
var amount = journalEntries.getAccountBalance(account.id, filter.to_date);
|
|
return { amount: amount, date: filter.to_date, formatted_amount: numberFormatter(amount) };
|
|
}() }, {},
|
|
|
|
|
|
filter.display_columns_type === 'date_periods' && {
|
|
periods: dateRangeSet.map(function (date) {
|
|
var type = comparatorDateType;
|
|
var amount = journalEntries.getAccountBalance(account.id, date, type);
|
|
|
|
return { date: date, amount: amount, formatted_amount: numberFormatter(amount) };
|
|
}) });}));};
|
|
|
|
|
|
|
|
totalAccountsReducer = function totalAccountsReducer(incomeExpenseAccounts) {return (
|
|
incomeExpenseAccounts.reduce(function (acc, account) {
|
|
var amount = account ? account.total.amount : 0;
|
|
return amount + acc;
|
|
}, 0));};
|
|
|
|
accountsIncome = Account.toNestedArray(accountsMapper(filteredAccounts.
|
|
filter(function (account) {return account.type.normal === 'credit';})));
|
|
|
|
accountsExpenses = Account.toNestedArray(accountsMapper(filteredAccounts.
|
|
filter(function (account) {return account.type.normal === 'debit';})));
|
|
|
|
// @return {Array}
|
|
totalPeriodsMapper = function totalPeriodsMapper(incomeExpenseAccounts) {return (
|
|
Object.values(dateRangeSet.reduce(function (acc, date, index) {
|
|
var amount = 0;
|
|
|
|
incomeExpenseAccounts.forEach(function (account) {
|
|
var currentDate = account.periods[index];
|
|
amount += currentDate.amount || 0;
|
|
});
|
|
acc[date] = { date: date, amount: amount, formatted_amount: numberFormatter(amount) };
|
|
return acc;
|
|
}, {})));};
|
|
|
|
// Total income(date) - Total expenses(date) = Net income(date)
|
|
// @return {Array}
|
|
netIncomePeriodsMapper = function netIncomePeriodsMapper(totalIncomeAcocunts, totalExpenseAccounts) {return (
|
|
dateRangeSet.map(function (date, index) {
|
|
var totalIncome = totalIncomeAcocunts[index];
|
|
var totalExpenses = totalExpenseAccounts[index];
|
|
|
|
var amount = totalIncome.amount || 0;
|
|
amount -= totalExpenses.amount || 0;
|
|
return { date: date, amount: amount, formatted_amount: numberFormatter(amount) };
|
|
}));};
|
|
|
|
// @return {Object}
|
|
netIncomeTotal = function netIncomeTotal(totalIncome, totalExpenses) {
|
|
var netIncomeAmount = totalIncome.amount - totalExpenses.amount;
|
|
return { amount: netIncomeAmount, formatted_amount: netIncomeAmount, date: filter.to_date };
|
|
};
|
|
|
|
incomeResponse = _objectSpread({
|
|
entry_normal: 'credit',
|
|
accounts: accountsIncome },
|
|
filter.display_columns_type === 'total' && function () {
|
|
var totalIncomeAccounts = totalAccountsReducer(accountsIncome);
|
|
return {
|
|
total: {
|
|
amount: totalIncomeAccounts,
|
|
date: filter.to_date,
|
|
formatted_amount: numberFormatter(totalIncomeAccounts) } };
|
|
|
|
|
|
}(), {},
|
|
filter.display_columns_type === 'date_periods' && {
|
|
total_periods: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(
|
|
totalPeriodsMapper(accountsIncome)) });
|
|
|
|
|
|
|
|
expenseResponse = _objectSpread({
|
|
entry_normal: 'debit',
|
|
accounts: accountsExpenses },
|
|
filter.display_columns_type === 'total' && function () {
|
|
var totalExpensesAccounts = totalAccountsReducer(accountsExpenses);
|
|
return {
|
|
total: {
|
|
amount: totalExpensesAccounts,
|
|
date: filter.to_date,
|
|
formatted_amount: numberFormatter(totalExpensesAccounts) } };
|
|
|
|
|
|
}(), {},
|
|
filter.display_columns_type === 'date_periods' && {
|
|
total_periods: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(
|
|
totalPeriodsMapper(accountsExpenses)) });
|
|
|
|
|
|
|
|
netIncomeResponse = _objectSpread({},
|
|
filter.display_columns_type === 'total' && {
|
|
total: _objectSpread({},
|
|
netIncomeTotal(incomeResponse.total, expenseResponse.total)) }, {},
|
|
|
|
|
|
filter.display_columns_type === 'date_periods' && {
|
|
total_periods: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(
|
|
netIncomePeriodsMapper(
|
|
incomeResponse.total_periods,
|
|
expenseResponse.total_periods)) });return _context.abrupt("return",
|
|
|
|
|
|
|
|
|
|
res.status(200).send({
|
|
query: _objectSpread({}, filter),
|
|
columns: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(dateRangeSet),
|
|
profitLoss: {
|
|
income: incomeResponse,
|
|
expenses: expenseResponse,
|
|
net_income: netIncomeResponse } }));case 31:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements/TrialBalanceSheet.js":
|
|
/*!***********************************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements/TrialBalanceSheet.js ***!
|
|
\***********************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js");
|
|
/* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.trialBalanceSheet.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_8__["default"])(this.trialBalanceSheet.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve the trial balance sheet.
|
|
*/
|
|
trialBalanceSheet: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.1000_divide').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids').isArray().optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('account_ids.*').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, Account, filter, accounts, accountsGraph, journalEntriesCollect, journalEntries, balanceFormatter, accountsResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
Account = req.models.Account;
|
|
filter = _objectSpread({
|
|
from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'),
|
|
to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'),
|
|
number_format: {
|
|
no_cents: false,
|
|
divide_1000: false },
|
|
|
|
basis: 'accural',
|
|
none_zero: false,
|
|
account_ids: [] },
|
|
req.query);
|
|
|
|
if (!Array.isArray(filter.account_ids)) {
|
|
filter.account_ids = [filter.account_ids];
|
|
}_context.next = 8;return (
|
|
|
|
Account.query()
|
|
// .remember('trial_balance_accounts')
|
|
.modify('filterAccounts', filter.account_ids).
|
|
withGraphFetched('type').
|
|
withGraphFetched('transactions').
|
|
modifyGraph('transactions', function (builder) {
|
|
builder.modify('sumationCreditDebit');
|
|
builder.modify('filterDateRange', filter.from_date, filter.to_date);
|
|
}));case 8:accounts = _context.sent;
|
|
|
|
// Accounts dependency graph.
|
|
accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_9__["default"].fromArray(
|
|
accounts, { itemId: 'id', parentItemId: 'parentAccountId' });
|
|
|
|
|
|
journalEntriesCollect = Account.collectJournalEntries(accounts);
|
|
journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_7__["default"](accountsGraph);
|
|
journalEntries.loadEntries(journalEntriesCollect);
|
|
|
|
// Account balance formmatter based on the given query.
|
|
balanceFormatter = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_10__["formatNumberClosure"])(filter.number_format);
|
|
|
|
accountsResponse = accounts.
|
|
filter(function (account) {return (
|
|
account.transactions.length > 0 || !filter.none_zero);}).
|
|
|
|
map(function (account) {
|
|
var trial = journalEntries.getTrialBalanceWithDepands(account.id);
|
|
|
|
return {
|
|
id: account.id,
|
|
parentAccountId: account.parentAccountId,
|
|
name: account.name,
|
|
code: account.code,
|
|
accountNormal: account.type.normal,
|
|
|
|
credit: trial.credit,
|
|
debit: trial.debit,
|
|
balance: trial.balance,
|
|
|
|
formatted_credit: balanceFormatter(trial.credit),
|
|
formatted_debit: balanceFormatter(trial.debit),
|
|
formatted_balance: balanceFormatter(trial.balance) };
|
|
|
|
});return _context.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
query: _objectSpread({}, filter),
|
|
accounts: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(Account.toNestedArray(accountsResponse)) }));case 16:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/FinancialStatements/generalLedger.js":
|
|
/*!*******************************************************************!*\
|
|
!*** ./src/http/controllers/FinancialStatements/generalLedger.js ***!
|
|
\*******************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
|
|
/* harmony import */ var _FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FinancialStatementMixin */ "./src/http/controllers/FinancialStatements/FinancialStatementMixin.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.generalLedger.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_10__["default"])(this.generalLedger.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve the general ledger financial statement.
|
|
*/
|
|
generalLedger: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('from_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('to_date').optional().isISO8601(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('basis').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('number_format.divide_1000').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('none_zero').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('accounts_ids').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('accounts_ids.*').isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('orderBy').optional().isIn(['created_at', 'name', 'code']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('order').optional().isIn(['desc', 'asc'])],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, AccountTransaction, Account, filter, errorReasons, _accounts, accountsIds, accounts, accountsGraph, openingBalanceTransactions, closingBalanceTransactions, opeingBalanceCollection, closingBalanceCollection, formatNumber, accountsResponse;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models =
|
|
|
|
|
|
req.models, AccountTransaction = _req$models.AccountTransaction, Account = _req$models.Account;
|
|
|
|
filter = _objectSpread({
|
|
from_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().startOf('year').format('YYYY-MM-DD'),
|
|
to_date: moment__WEBPACK_IMPORTED_MODULE_6___default()().endOf('year').format('YYYY-MM-DD'),
|
|
basis: 'cash',
|
|
number_format: {
|
|
no_cents: false,
|
|
divide_1000: false },
|
|
|
|
none_zero: false,
|
|
accounts_ids: [] },
|
|
req.query);
|
|
|
|
if (!Array.isArray(filter.accounts_ids)) {
|
|
filter.accounts_ids = [filter.accounts_ids];
|
|
}
|
|
filter.accounts_ids = filter.accounts_ids.map(function (id) {return parseInt(id, 10);});
|
|
|
|
errorReasons = [];if (!(
|
|
|
|
filter.accounts_ids.length > 0)) {_context.next = 14;break;}_context.next = 11;return (
|
|
Account.query().whereIn('id', filter.accounts_ids));case 11:_accounts = _context.sent;
|
|
accountsIds = _accounts.map(function (a) {return a.id;});
|
|
|
|
if (Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(filter.accounts_ids, accountsIds).length > 0) {
|
|
errorReasons.push({ type: 'FILTER.ACCOUNTS.IDS.NOT.FOUND', code: 200 });
|
|
}case 14:if (!(
|
|
|
|
errorReasons.length > 0)) {_context.next = 16;break;}return _context.abrupt("return",
|
|
res.status(400).send({ error: errorReasons }));case 16:_context.next = 18;return (
|
|
|
|
Account.query()
|
|
// .remember('general_ledger_accounts')
|
|
.orderBy('index', 'DESC').
|
|
modify('filterAccounts', filter.accounts_ids).
|
|
withGraphFetched('type').
|
|
withGraphFetched('transactions').
|
|
modifyGraph('transactions', function (builder) {
|
|
builder.modify('filterDateRange', filter.from_date, filter.to_date);
|
|
}));case 18:accounts = _context.sent;
|
|
|
|
// Accounts dependency graph.
|
|
accountsGraph = _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_11__["default"].fromArray(
|
|
accounts, { itemId: 'id', parentItemId: 'parentAccountId' });_context.next = 22;return (
|
|
|
|
|
|
AccountTransaction.query()
|
|
// .remember()
|
|
.modify('filterDateRange', null, filter.from_date).
|
|
modify('sumationCreditDebit').
|
|
withGraphFetched('account.type'));case 22:openingBalanceTransactions = _context.sent;_context.next = 25;return (
|
|
|
|
AccountTransaction.query()
|
|
// .remember()
|
|
.modify('filterDateRange', null, filter.to_date).
|
|
modify('sumationCreditDebit').
|
|
withGraphFetched('account.type'));case 25:closingBalanceTransactions = _context.sent;
|
|
|
|
opeingBalanceCollection = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph);
|
|
closingBalanceCollection = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsGraph);
|
|
|
|
opeingBalanceCollection.loadEntries(openingBalanceTransactions);
|
|
closingBalanceCollection.loadEntries(closingBalanceTransactions);
|
|
|
|
// Transaction amount formatter based on the given query.
|
|
formatNumber = Object(_FinancialStatementMixin__WEBPACK_IMPORTED_MODULE_9__["formatNumberClosure"])(filter.number_format);
|
|
|
|
accountsResponse = accounts.
|
|
filter(function (account) {return (
|
|
account.transactions.length > 0 || !filter.none_zero);}).
|
|
|
|
map(function (account) {return _objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(account, ['id', 'name', 'code', 'index', 'parentAccountId']), {
|
|
transactions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(
|
|
account.transactions.map(function (transaction) {
|
|
var amount = 0;
|
|
|
|
if (account.type.normal === 'credit') {
|
|
amount += transaction.credit - transaction.debit;
|
|
} else if (account.type.normal === 'debit') {
|
|
amount += transaction.debit - transaction.credit;
|
|
}
|
|
return _objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_7__["pick"])(transaction, ['id', 'note', 'transactionType', 'referenceType',
|
|
'referenceId', 'date', 'createdAt']), {
|
|
amount: amount,
|
|
formatted_amount: formatNumber(amount) });
|
|
|
|
})),
|
|
|
|
opening: function () {
|
|
var openingAmount = opeingBalanceCollection.getAccountBalance(account.id);
|
|
|
|
return {
|
|
date: filter.from_date,
|
|
amount: openingAmount,
|
|
formatted_amount: formatNumber(openingAmount) };
|
|
|
|
}(),
|
|
closing: function () {
|
|
var closingAmount = closingBalanceCollection.getAccountBalance(account.id);
|
|
|
|
return {
|
|
date: filter.to_date,
|
|
amount: closingAmount,
|
|
formatted_amount: formatNumber(closingAmount) };
|
|
|
|
}() });});return _context.abrupt("return",
|
|
|
|
|
|
res.status(200).send({
|
|
query: _objectSpread({}, filter),
|
|
accounts: Account.toNestedArray(accountsResponse) }));case 33:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/InviteUsers.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/http/controllers/InviteUsers.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! uniqid */ "uniqid");
|
|
/* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(uniqid__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! mustache */ "mustache");
|
|
/* harmony import */ var mustache__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(mustache__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_9__);
|
|
/* harmony import */ var _services_mail__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/services/mail */ "./src/services/mail.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js");
|
|
/* harmony import */ var _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/system/models/Invite */ "./src/system/models/Invite.js");
|
|
/* harmony import */ var _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js");
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _system_models_Tenant__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js");
|
|
/* harmony import */ var _system_TenantsManager__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/system/TenantsManager */ "./src/system/TenantsManager.js");
|
|
/* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.js");
|
|
/* harmony import */ var _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/http/middleware/TenancyMiddleware */ "./src/http/middleware/TenancyMiddleware.js");
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js");
|
|
/* harmony import */ var _models_Option__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/models/Option */ "./src/models/Option.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.use('/send', _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_18__["default"]);
|
|
router.use('/send', _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_19__["default"]);
|
|
|
|
router.post('/send',
|
|
this.invite.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__["default"])(this.invite.handler));
|
|
|
|
router.post('/accept/:token',
|
|
this.accept.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__["default"])(this.accept.handler));
|
|
|
|
router.get('/invited/:token',
|
|
this.invited.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_15__["default"])(this.invited.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Invite a user to the authorized user organization.
|
|
*/
|
|
invite: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["body"])('email').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, form, user, TenantUser, foundUser, token, invite, tenantUser, Option, organizationOptions, filePath, template, rendered, mailOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
user = req.user;
|
|
TenantUser = req.models.TenantUser;_context.next = 8;return (
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__["default"].query().
|
|
where('email', form.email).first());case 8:foundUser = _context.sent;if (!
|
|
|
|
foundUser) {_context.next = 11;break;}return _context.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'USER.EMAIL.ALREADY.REGISTERED', code: 100 }] }));case 11:
|
|
|
|
|
|
token = uniqid__WEBPACK_IMPORTED_MODULE_4___default()();_context.next = 14;return (
|
|
_system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query().insert({
|
|
email: form.email,
|
|
tenant_id: user.tenantId,
|
|
token: token }));case 14:invite = _context.sent;_context.next = 17;return (
|
|
|
|
TenantUser.query().insert({
|
|
first_name: form.email,
|
|
email: form.email }));case 17:tenantUser = _context.sent;
|
|
|
|
Option = req.models.Option;_context.next = 21;return (
|
|
Option.query().
|
|
where('key', 'organization_name'));case 21:organizationOptions = _context.sent;
|
|
|
|
filePath = path__WEBPACK_IMPORTED_MODULE_6___default.a.join(global.rootPath, 'views/mail/UserInvite.html');
|
|
template = fs__WEBPACK_IMPORTED_MODULE_7___default.a.readFileSync(filePath, 'utf8');
|
|
|
|
rendered = mustache__WEBPACK_IMPORTED_MODULE_8___default.a.render(template, {
|
|
acceptUrl: "".concat(req.protocol, "://").concat(req.hostname, "/invite/accept/").concat(invite.token),
|
|
fullName: "".concat(user.firstName, " ").concat(user.lastName),
|
|
firstName: user.firstName,
|
|
lastName: user.lastName,
|
|
email: user.email,
|
|
organizationName: organizationOptions.getMeta('organization_name') });
|
|
|
|
mailOptions = {
|
|
to: user.email,
|
|
from: "".concat(process.env.MAIL_FROM_NAME, " ").concat(process.env.MAIL_FROM_ADDRESS),
|
|
subject: "".concat(user.fullName, " has invited you to join a Bigcapital"),
|
|
html: rendered };
|
|
|
|
_services_mail__WEBPACK_IMPORTED_MODULE_10__["default"].sendMail(mailOptions, function (error) {
|
|
if (error) {
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_21__["default"].log('error', 'Failed send user invite mail', { error: error, form: form });
|
|
}
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_21__["default"].log('info', 'User has been sent invite user email successfuly.', { form: form });
|
|
});return _context.abrupt("return",
|
|
res.status(200).send());case 28:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Acceprt the inviation.
|
|
*/
|
|
accept: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('first_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('last_name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('phone_number').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('password').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('token').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, token, inviteToken, form, systemUser, errorReasons, tenant, tenantDb, hashedPassword, userForm, foundTenantUser, insertUserOper, insertSysUserOper, deleteInviteTokenOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
|
|
token = req.params.token;_context2.next = 6;return (
|
|
_system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query().
|
|
where('token', token).first());case 6:inviteToken = _context2.sent;if (
|
|
|
|
inviteToken) {_context2.next = 9;break;}return _context2.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'INVITE.TOKEN.NOT.FOUND', code: 300 }] }));case 9:
|
|
|
|
|
|
form = _objectSpread({
|
|
language: 'en' },
|
|
req.body);_context2.next = 12;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__["default"].query().
|
|
where('phone_number', form.phone_number).
|
|
first());case 12:systemUser = _context2.sent;
|
|
|
|
errorReasons = [];
|
|
|
|
// Validate there is already registered phone number.
|
|
if (systemUser && systemUser.phoneNumber === form.phone_number) {
|
|
errorReasons.push({
|
|
type: 'PHONE_MUMNER.ALREADY.EXISTS', code: 400 });
|
|
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context2.next = 17;break;}return _context2.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 17:_context2.next = 19;return (
|
|
|
|
|
|
_system_models_Tenant__WEBPACK_IMPORTED_MODULE_16__["default"].query().
|
|
where('id', inviteToken.tenantId).first());case 19:tenant = _context2.sent;
|
|
|
|
tenantDb = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_17__["default"].knexInstance(tenant.organizationId);_context2.next = 23;return (
|
|
Object(_utils__WEBPACK_IMPORTED_MODULE_11__["hashPassword"])(form.password));case 23:hashedPassword = _context2.sent;
|
|
|
|
userForm = {
|
|
first_name: form.first_name,
|
|
last_name: form.last_name,
|
|
email: inviteToken.email,
|
|
phone_number: form.phone_number,
|
|
language: form.language,
|
|
active: 1 };
|
|
|
|
_models_TenantModel__WEBPACK_IMPORTED_MODULE_20__["default"].knexBinded = tenantDb;_context2.next = 28;return (
|
|
|
|
_models_TenantUser__WEBPACK_IMPORTED_MODULE_14__["default"].query().
|
|
where('phone_number', form.phone_number).first());case 28:foundTenantUser = _context2.sent;if (!
|
|
|
|
foundTenantUser) {_context2.next = 31;break;}return _context2.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'PHONE_NUMBER.ALREADY.EXISTS', code: 400 }] }));case 31:
|
|
|
|
|
|
|
|
insertUserOper = _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__["default"].bindKnex(tenantDb).
|
|
query().
|
|
where('email', userForm.email).
|
|
patch(_objectSpread({},
|
|
userForm, {
|
|
invite_accepted_at: moment__WEBPACK_IMPORTED_MODULE_9___default()().format('YYYY/MM/DD') }));
|
|
|
|
|
|
insertSysUserOper = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_12__["default"].query().insert(_objectSpread({},
|
|
userForm, {
|
|
password: hashedPassword,
|
|
tenant_id: inviteToken.tenantId }));
|
|
|
|
|
|
deleteInviteTokenOper = _system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query().
|
|
where('token', inviteToken.token)["delete"]();_context2.next = 36;return (
|
|
|
|
Promise.all([
|
|
insertUserOper,
|
|
insertSysUserOper,
|
|
deleteInviteTokenOper]));case 36:return _context2.abrupt("return",
|
|
|
|
res.status(200).send());case 37:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Get
|
|
*/
|
|
invited: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('token').exists().trim().escape()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var token, inviteToken, tenant, tenantDb, organizationOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
token = req.params.token;_context3.next = 3;return (
|
|
_system_models_Invite__WEBPACK_IMPORTED_MODULE_13__["default"].query().
|
|
where('token', token).first());case 3:inviteToken = _context3.sent;if (
|
|
|
|
inviteToken) {_context3.next = 6;break;}return _context3.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'INVITE.TOKEN.NOT.FOUND', code: 300 }] }));case 6:_context3.next = 8;return (
|
|
|
|
|
|
|
|
_system_models_Tenant__WEBPACK_IMPORTED_MODULE_16__["default"].query().
|
|
where('id', inviteToken.tenantId).first());case 8:tenant = _context3.sent;
|
|
|
|
tenantDb = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_17__["default"].knexInstance(tenant.organizationId);_context3.next = 12;return (
|
|
_models_Option__WEBPACK_IMPORTED_MODULE_22__["default"].bindKnex(tenantDb).query().
|
|
where('key', 'organization_name'));case 12:organizationOptions = _context3.sent;return _context3.abrupt("return",
|
|
|
|
res.status(200).send({
|
|
data: {
|
|
organization_name: organizationOptions.getMeta('organization_name', ''),
|
|
invited_email: inviteToken.email } }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/ItemCategories.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/http/controllers/ItemCategories.js ***!
|
|
\************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor method.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
// const permit = Authorization('items_categories');
|
|
|
|
router.post('/:id',
|
|
this.editCategory.validation,
|
|
Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editCategory.handler));
|
|
|
|
router.post('/',
|
|
this.newCategory.validation,
|
|
Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newCategory.handler));
|
|
|
|
router["delete"]('/bulk',
|
|
this.bulkDeleteCategories.validation,
|
|
Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.bulkDeleteCategories.handler));
|
|
|
|
router["delete"]('/:id',
|
|
this.deleteItem.validation,
|
|
Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteItem.handler));
|
|
|
|
router.get('/:id',
|
|
this.getCategory.validation,
|
|
Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getCategory.handler));
|
|
|
|
router.get('/',
|
|
this.getList.validation,
|
|
Object(_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getList.handler));
|
|
|
|
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Creates a new item category.
|
|
*/
|
|
newCategory: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('parent_category_id').
|
|
optional({ nullable: true, checkFalsy: true }).
|
|
isNumeric().
|
|
toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').
|
|
optional().
|
|
trim().
|
|
escape()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, user, form, ItemCategory, foundParentCategory, category;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
user = req.user;
|
|
form = _objectSpread({}, req.body);
|
|
ItemCategory = req.models.ItemCategory;if (!
|
|
|
|
form.parent_category_id) {_context.next = 12;break;}_context.next = 9;return (
|
|
ItemCategory.query().
|
|
where('id', form.parent_category_id).
|
|
first());case 9:foundParentCategory = _context.sent;if (
|
|
|
|
foundParentCategory) {_context.next = 12;break;}return _context.abrupt("return",
|
|
res.boom.notFound('The parent category ID is not found.', {
|
|
errors: [{ type: 'PARENT_CATEGORY_NOT_FOUND', code: 100 }] }));case 12:_context.next = 14;return (
|
|
|
|
|
|
|
|
ItemCategory.query().insert(_objectSpread({},
|
|
form, {
|
|
user_id: user.id })));case 14:category = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({ category: category }));case 16:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Edit details of the given category item.
|
|
*/
|
|
editCategory: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('name').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('parent_category_id').
|
|
optional({ nullable: true, checkFalsy: true }).
|
|
isNumeric().
|
|
toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional().trim().escape()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var id, validationErrors, form, ItemCategory, itemCategory, foundParentCategory, updateItemCategory;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
id = req.params.id;
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 4;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' },
|
|
validationErrors)));case 4:
|
|
|
|
|
|
|
|
form = _objectSpread({}, req.body);
|
|
ItemCategory = req.models.ItemCategory;_context2.next = 8;return (
|
|
ItemCategory.query().
|
|
where('id', id).
|
|
first());case 8:itemCategory = _context2.sent;if (
|
|
|
|
itemCategory) {_context2.next = 11;break;}return _context2.abrupt("return",
|
|
res.boom.notFound({
|
|
errors: [{ type: 'ITEM_CATEGORY.NOT.FOUND', code: 100 }] }));case 11:if (!(
|
|
|
|
|
|
|
|
form.parent_category_id &&
|
|
form.parent_category_id !== itemCategory.parent_category_id)) {_context2.next = 17;break;}_context2.next = 14;return (
|
|
|
|
ItemCategory.query().
|
|
where('id', form.parent_category_id).
|
|
first());case 14:foundParentCategory = _context2.sent;if (
|
|
|
|
foundParentCategory) {_context2.next = 17;break;}return _context2.abrupt("return",
|
|
res.boom.notFound('The parent category ID is not found.', {
|
|
errors: [{ type: 'PARENT_CATEGORY_NOT_FOUND', code: 100 }] }));case 17:_context2.next = 19;return (
|
|
|
|
|
|
|
|
ItemCategory.query().
|
|
where('id', id).
|
|
update(_objectSpread({}, form)));case 19:updateItemCategory = _context2.sent;return _context2.abrupt("return",
|
|
|
|
res.status(200).send({ id: id }));case 21:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Delete the give item category.
|
|
*/
|
|
deleteItem: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().toInt()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var id, ItemCategory, itemCategory;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
id = req.params.id;
|
|
ItemCategory = req.models.ItemCategory;_context3.next = 4;return (
|
|
ItemCategory.query().
|
|
where('id', id).
|
|
first());case 4:itemCategory = _context3.sent;if (
|
|
|
|
itemCategory) {_context3.next = 7;break;}return _context3.abrupt("return",
|
|
res.boom.notFound());case 7:_context3.next = 9;return (
|
|
|
|
ItemCategory.query().
|
|
where('id', itemCategory.id)["delete"]());case 9:return _context3.abrupt("return",
|
|
|
|
|
|
res.status(200).send());case 10:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve the list of items.
|
|
*/
|
|
getList: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_order').optional().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().trim().escape().isIn(['desc', 'asc']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, _req$models, Resource, ItemCategory, categoriesResource, filter, errorReasons, resourceFieldsKeys, dynamicFilter, filterRoles, sortByFilter, categories;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models =
|
|
|
|
|
|
|
|
req.models, Resource = _req$models.Resource, ItemCategory = _req$models.ItemCategory;_context4.next = 6;return (
|
|
Resource.query().
|
|
where('name', 'items_categories').
|
|
withGraphFetched('fields').
|
|
first());case 6:categoriesResource = _context4.sent;if (
|
|
|
|
categoriesResource) {_context4.next = 9;break;}return _context4.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ITEMS.CATEGORIES.RESOURCE.NOT.FOUND', code: 200 }] }));case 9:
|
|
|
|
|
|
|
|
filter = _objectSpread({
|
|
column_sort_order: '',
|
|
sort_order: '',
|
|
filter_roles: [] },
|
|
req.query);
|
|
|
|
if (filter.stringified_filter_roles) {
|
|
filter.filter_roles = JSON.parse(filter.stringified_filter_roles);
|
|
}
|
|
errorReasons = [];
|
|
resourceFieldsKeys = categoriesResource.fields.map(function (c) {return c.key;});
|
|
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__["DynamicFilter"](ItemCategory.tableName);
|
|
|
|
// Dynamic filter with filter roles.
|
|
if (filter.filter_roles.length > 0) {
|
|
// Validate the accounts resource fields.
|
|
filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__["DynamicFilterFilterRoles"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__["mapFilterRolesToDynamicFilter"])(filter.filter_roles),
|
|
categoriesResource.fields);
|
|
|
|
categoriesResource.setFilter(filterRoles);
|
|
|
|
if (filterRoles.validateFilterRoles().length > 0) {
|
|
errorReasons.push({ type: 'ITEMS.RESOURCE.HAS.NO.FIELDS', code: 500 });
|
|
}
|
|
}
|
|
|
|
// Dynamic filter with column sort order.
|
|
if (filter.column_sort_order) {
|
|
if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) {
|
|
errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 });
|
|
}
|
|
sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_7__["DynamicFilterSortBy"](
|
|
filter.column_sort_order,
|
|
filter.sort_order);
|
|
|
|
dynamicFilter.setFilter(sortByFilter);
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context4.next = 18;break;}return _context4.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 18:_context4.next = 20;return (
|
|
|
|
|
|
ItemCategory.query().onBuild(function (builder) {
|
|
dynamicFilter.buildQuery()(builder);
|
|
|
|
builder.select([
|
|
'*',
|
|
ItemCategory.relatedQuery('items').count().as('count')]);
|
|
|
|
}));case 20:categories = _context4.sent;return _context4.abrupt("return",
|
|
|
|
res.status(200).send({ categories: categories }));case 22:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve details of the given category.
|
|
*/
|
|
getCategory: {
|
|
validation: [Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('category_id').toInt()],
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var categoryId, ItemCategory, item;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
categoryId = req.params.category_id;
|
|
ItemCategory = req.models.ItemCategory;_context5.next = 4;return (
|
|
ItemCategory.where('id', categoryId).fetch());case 4:item = _context5.sent;if (
|
|
|
|
item) {_context5.next = 7;break;}return _context5.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'CATEGORY_NOT_FOUND', code: 100 }] }));case 7:return _context5.abrupt("return",
|
|
|
|
|
|
res.status(200).send({ category: item.toJSON() }));case 8:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Bulk delete the given item categories.
|
|
*/
|
|
bulkDeleteCategories: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').isArray({ min: 2 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var validationErrors, filter, ItemCategory, itemCategories, itemCategoriesIds, notFoundCategories;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({
|
|
ids: [] },
|
|
req.query);
|
|
|
|
ItemCategory = req.models.ItemCategory;_context6.next = 7;return (
|
|
|
|
ItemCategory.query().whereIn('id', filter.ids));case 7:itemCategories = _context6.sent;
|
|
itemCategoriesIds = itemCategories.map(function (category) {return category.id;});
|
|
notFoundCategories = Object(lodash__WEBPACK_IMPORTED_MODULE_5__["difference"])(filter.ids, itemCategoriesIds);if (!(
|
|
|
|
notFoundCategories.length > 0)) {_context6.next = 12;break;}return _context6.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ITEM.CATEGORIES.IDS.NOT.FOUND', code: 200 }] }));case 12:_context6.next = 14;return (
|
|
|
|
|
|
|
|
ItemCategory.query().whereIn('id', filter.ids)["delete"]());case 14:return _context6.abrupt("return",
|
|
|
|
res.status(200).send({ ids: filter.ids }));case 15:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Items.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/http/controllers/Items.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "@babel/runtime/helpers/slicedToArray");
|
|
/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
/* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/DynamicFilter */ "./src/lib/DynamicFilter/index.js");
|
|
/* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var fsPromises = fs__WEBPACK_IMPORTED_MODULE_8___default.a.promises;
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_5___default.a.Router();
|
|
|
|
router.post('/:id',
|
|
this.editItem.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.editItem.handler));
|
|
|
|
router.post('/',
|
|
this.newItem.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.newItem.handler));
|
|
|
|
router["delete"]('/:id',
|
|
this.deleteItem.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.deleteItem.handler));
|
|
|
|
router["delete"]('/',
|
|
this.bulkDeleteItems.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.bulkDeleteItems.handler));
|
|
|
|
router.get('/',
|
|
this.listItems.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_9__["default"])(this.listItems.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Creates a new item.
|
|
*/
|
|
newItem: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('name').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('type').exists().trim().escape().
|
|
isIn(['service', 'non-inventory', 'inventory']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sku').optional({ nullable: true }).trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_price').exists().isNumeric().toFloat(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_price').exists().isNumeric().toFloat(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_account_id').exists().isInt().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_account_id').exists().isInt().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('inventory_account_id')["if"](
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('type').equals('inventory')).
|
|
exists().
|
|
isInt().
|
|
toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('category_id').optional({ nullable: true }).isInt().toInt(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('custom_fields').optional().isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('custom_fields.*.key').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('custom_fields.*.value').exists(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('note').optional(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('media_ids').optional().isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('media_ids.*').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(req, res) {var validationErrors, user, form, _req$models, Account, Resource, ResourceField, ItemCategory, Item, MediaLink, errorReasons, costAccountPromise, sellAccountPromise, inventoryAccountPromise, itemCategoryPromise, customFieldsKeys, resource, fields, storedFieldsKey, notFoundFields, _ref, _ref2, costAccount, sellAccount, itemCategory, inventoryAccount, bulkSaveMediaLinks, item;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
user = req.user;
|
|
form = _objectSpread({
|
|
custom_fields: [],
|
|
media_ids: [] },
|
|
req.body);_req$models =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
req.models, Account = _req$models.Account, Resource = _req$models.Resource, ResourceField = _req$models.ResourceField, ItemCategory = _req$models.ItemCategory, Item = _req$models.Item, MediaLink = _req$models.MediaLink;
|
|
errorReasons = [];
|
|
|
|
costAccountPromise = Account.query().findById(form.cost_account_id);
|
|
sellAccountPromise = Account.query().findById(form.sell_account_id);
|
|
inventoryAccountPromise = form.type === 'inventory' ?
|
|
Account.query().findById(form.inventory_account_id) : null;
|
|
|
|
itemCategoryPromise = form.category_id ?
|
|
ItemCategory.query().findById(form.category_id) : null;
|
|
|
|
// Validate the custom fields key and value type.
|
|
if (!(form.custom_fields.length > 0)) {_context.next = 22;break;}
|
|
customFieldsKeys = form.custom_fields.map(function (field) {return field.key;});
|
|
|
|
// Get resource id than get all resource fields.
|
|
_context.next = 15;return Resource.where('name', 'items').fetch();case 15:resource = _context.sent;_context.next = 18;return (
|
|
ResourceField.query(function (builder) {
|
|
builder.where('resource_id', resource.id);
|
|
builder.whereIn('key', customFieldsKeys);
|
|
}).fetchAll());case 18:fields = _context.sent;
|
|
|
|
storedFieldsKey = fields.map(function (f) {return f.attributes.key;});
|
|
|
|
// Get all not defined resource fields.
|
|
notFoundFields = Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(customFieldsKeys, storedFieldsKey);
|
|
|
|
if (notFoundFields.length > 0) {
|
|
errorReasons.push({ type: 'FIELD_KEY_NOT_FOUND', code: 150, fields: notFoundFields });
|
|
}case 22:_context.next = 24;return (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Promise.all([
|
|
costAccountPromise,
|
|
sellAccountPromise,
|
|
itemCategoryPromise,
|
|
inventoryAccountPromise]));case 24:_ref = _context.sent;_ref2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_ref, 4);costAccount = _ref2[0];sellAccount = _ref2[1];itemCategory = _ref2[2];inventoryAccount = _ref2[3];
|
|
|
|
if (!costAccount) {
|
|
errorReasons.push({ type: 'COST_ACCOUNT_NOT_FOUND', code: 100 });
|
|
}
|
|
if (!sellAccount) {
|
|
errorReasons.push({ type: 'SELL_ACCOUNT_NOT_FOUND', code: 120 });
|
|
}
|
|
if (!itemCategory && form.category_id) {
|
|
errorReasons.push({ type: 'ITEM_CATEGORY_NOT_FOUND', code: 140 });
|
|
}
|
|
if (!inventoryAccount && form.type === 'inventory') {
|
|
errorReasons.push({ type: 'INVENTORY_ACCOUNT_NOT_FOUND', code: 150 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context.next = 36;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, { errors: errorReasons }));case 36:
|
|
|
|
|
|
bulkSaveMediaLinks = [];_context.next = 39;return (
|
|
Item.query().insertAndFetch({
|
|
name: form.name,
|
|
type: form.type,
|
|
sku: form.sku,
|
|
cost_price: form.cost_price,
|
|
sell_price: form.sell_price,
|
|
sell_account_id: form.sell_account_id,
|
|
cost_account_id: form.cost_account_id,
|
|
currency_code: form.currency_code,
|
|
category_id: form.category_id,
|
|
user_id: user.id,
|
|
note: form.note }));case 39:item = _context.sent;
|
|
|
|
|
|
form.media_ids.forEach(function (mediaId) {
|
|
var oper = MediaLink.query().insert({
|
|
model_name: 'Item',
|
|
media_id: mediaId,
|
|
model_id: item.id });
|
|
|
|
bulkSaveMediaLinks.push(oper);
|
|
});
|
|
|
|
// Save the media links.
|
|
_context.next = 43;return Promise.all([].concat(
|
|
bulkSaveMediaLinks));case 43:return _context.abrupt("return",
|
|
|
|
res.status(200).send({ id: item.id }));case 44:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Edit the given item.
|
|
*/
|
|
editItem: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('name').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('type').
|
|
exists().
|
|
trim().
|
|
escape().
|
|
isIn(['product', 'service']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_price').exists().isNumeric(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_price').exists().isNumeric(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('cost_account_id').exists().isInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('sell_account_id').exists().isInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('category_id').optional({ nullable: true }).isInt().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('note').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('attachment').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["check"])('')],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res) {var validationErrors, _req$models2, Account, Item, ItemCategory, MediaLink, id, form, item, errorReasons, costAccountPromise, sellAccountPromise, itemCategoryPromise, _ref3, _ref4, costAccount, sellAccount, itemCategory, attachment, attachmentsMimes, publicPath, tenantPath, updatedItem, itemMediaIds, newInsertedMedia, bulkSaveMediaLink;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models2 =
|
|
|
|
|
|
req.models, Account = _req$models2.Account, Item = _req$models2.Item, ItemCategory = _req$models2.ItemCategory, MediaLink = _req$models2.MediaLink;
|
|
id = req.params.id;
|
|
|
|
form = _objectSpread({
|
|
custom_fields: [] },
|
|
req.body);_context2.next = 8;return (
|
|
|
|
Item.query().findById(id).withGraphFetched('media'));case 8:item = _context2.sent;if (
|
|
|
|
item) {_context2.next = 11;break;}return _context2.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'ITEM.NOT.FOUND', code: 100 }] }));case 11:
|
|
|
|
|
|
errorReasons = [];
|
|
|
|
costAccountPromise = Account.query().findById(form.cost_account_id);
|
|
sellAccountPromise = Account.query().findById(form.sell_account_id);
|
|
itemCategoryPromise = form.category_id ?
|
|
ItemCategory.query().findById(form.category_id) : null;_context2.next = 17;return (
|
|
|
|
Promise.all([
|
|
costAccountPromise, sellAccountPromise, itemCategoryPromise]));case 17:_ref3 = _context2.sent;_ref4 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_ref3, 3);costAccount = _ref4[0];sellAccount = _ref4[1];itemCategory = _ref4[2];
|
|
|
|
if (!costAccount) {
|
|
errorReasons.push({ type: 'COST_ACCOUNT_NOT_FOUND', code: 100 });
|
|
}
|
|
if (!sellAccount) {
|
|
errorReasons.push({ type: 'SELL_ACCOUNT_NOT_FOUND', code: 120 });
|
|
}
|
|
if (!itemCategory && form.category_id) {
|
|
errorReasons.push({ type: 'ITEM_CATEGORY_NOT_FOUND', code: 140 });
|
|
}
|
|
|
|
attachment = req.files && req.files.attachment ? req.files.attachment : null;
|
|
attachmentsMimes = ['image/png', 'image/jpeg'];
|
|
|
|
// Validate the attachment.
|
|
if (attachment && attachmentsMimes.indexOf(attachment.mimetype) === -1) {
|
|
errorReasons.push({ type: 'ATTACHMENT.MINETYPE.NOT.SUPPORTED', code: 160 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context2.next = 30;break;}return _context2.abrupt("return",
|
|
res.boom.badRequest(null, { errors: errorReasons }));case 30:if (!
|
|
|
|
attachment) {_context2.next = 49;break;}
|
|
publicPath = 'storage/app/public/';
|
|
tenantPath = "".concat(publicPath).concat(req.organizationId);_context2.prev = 33;_context2.next = 36;return (
|
|
|
|
|
|
fsPromises.unlink("".concat(tenantPath, "/").concat(item.attachmentFile)));case 36:_context2.next = 41;break;case 38:_context2.prev = 38;_context2.t0 = _context2["catch"](33);
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Delete item attachment file delete failed.', { error: _context2.t0 });case 41:_context2.prev = 41;_context2.next = 44;return (
|
|
|
|
|
|
attachment.mv("".concat(tenantPath, "/").concat(attachment.md5, ".png")));case 44:_context2.next = 49;break;case 46:_context2.prev = 46;_context2.t1 = _context2["catch"](41);return _context2.abrupt("return",
|
|
|
|
res.status(400).send({
|
|
errors: [{ type: 'ATTACHMENT.UPLOAD.FAILED', code: 600 }] }));case 49:_context2.next = 51;return (
|
|
|
|
|
|
|
|
|
|
Item.query().findById(id).patch({
|
|
name: form.name,
|
|
type: form.type,
|
|
cost_price: form.cost_price,
|
|
sell_price: form.sell_price,
|
|
currency_code: form.currency_code,
|
|
sell_account_id: form.sell_account_id,
|
|
cost_account_id: form.cost_account_id,
|
|
category_id: form.category_id,
|
|
note: form.note }));case 51:updatedItem = _context2.sent;
|
|
|
|
|
|
// Save links of new inserted media that associated to the item model.
|
|
itemMediaIds = item.media.map(function (m) {return m.id;});
|
|
newInsertedMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(form.media_ids, itemMediaIds);
|
|
bulkSaveMediaLink = [];
|
|
|
|
newInsertedMedia.forEach(function (mediaId) {
|
|
var oper = MediaLink.query().insert({
|
|
model_name: 'Journal',
|
|
model_id: manualJournal.id,
|
|
media_id: mediaId });
|
|
|
|
bulkSaveMediaLink.push(oper);
|
|
});_context2.next = 58;return (
|
|
Promise.all(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(newInsertedMedia)));case 58:return _context2.abrupt("return",
|
|
|
|
res.status(200).send({ id: updatedItem.id }));case 59:case "end":return _context2.stop();}}}, _callee2, null, [[33, 38], [41, 46]]);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Delete the given item from the storage.
|
|
*/
|
|
deleteItem: {
|
|
validation: [],
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res) {var id, Item, item, publicPath, tenantPath;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
id = req.params.id;
|
|
Item = req.models.Item;_context3.next = 4;return (
|
|
Item.query().findById(id));case 4:item = _context3.sent;if (
|
|
|
|
item) {_context3.next = 7;break;}return _context3.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'ITEM_NOT_FOUND', code: 100 }] }));case 7:_context3.next = 9;return (
|
|
|
|
|
|
|
|
Item.query().findById(item.id)["delete"]());case 9:if (!
|
|
|
|
item.attachmentFile) {_context3.next = 20;break;}
|
|
publicPath = 'storage/app/public/';
|
|
tenantPath = "".concat(publicPath).concat(req.organizationId);_context3.prev = 12;_context3.next = 15;return (
|
|
|
|
|
|
fsPromises.unlink("".concat(tenantPath, "/").concat(item.attachmentFile)));case 15:_context3.next = 20;break;case 17:_context3.prev = 17;_context3.t0 = _context3["catch"](12);
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_12__["default"].log('error', 'Delete item attachment file delete failed.', { error: _context3.t0 });case 20:return _context3.abrupt("return",
|
|
|
|
|
|
res.status(200).send());case 21:case "end":return _context3.stop();}}}, _callee3, null, [[12, 17]]);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Bulk delete the given items ids.
|
|
*/
|
|
bulkDeleteItems: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('ids').isArray({ min: 2 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('ids.*').isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(req, res) {var validationErrors, filter, Item, items, storedItemsIds, notFoundItems;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
filter = _objectSpread({ ids: [] }, req.query);
|
|
Item = req.models.Item;_context4.next = 7;return (
|
|
|
|
Item.query().whereIn('id', filter.ids));case 7:items = _context4.sent;
|
|
|
|
storedItemsIds = items.map(function (a) {return a.id;});
|
|
notFoundItems = Object(lodash__WEBPACK_IMPORTED_MODULE_7__["difference"])(filter.ids, storedItemsIds);
|
|
|
|
// Validate the not found items.
|
|
if (!(notFoundItems.length > 0)) {_context4.next = 12;break;}return _context4.abrupt("return",
|
|
res.status(404).send({
|
|
errors: [{ type: 'ITEMS.NOT.FOUND', code: 200, ids: notFoundItems }] }));case 12:_context4.next = 14;return (
|
|
|
|
|
|
|
|
|
|
Item.query().whereIn('id', storedItemsIds)["delete"]());case 14:return _context4.abrupt("return",
|
|
|
|
res.status(200).send());case 15:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrive the list items with pagination meta.
|
|
*/
|
|
listItems: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('column_sort_order').optional().isIn(['created_at', 'name', 'amount', 'sku']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('sort_order').optional().isIn(['desc', 'asc']),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('page').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('page_size').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('custom_view_id').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["query"])('stringified_filter_roles').optional().isJSON()],
|
|
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee5(req, res) {var validationErrors, errorReasons, viewConditions, _req$models3, Resource, Item, View, itemsResource, filter, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, items;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_6__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
errorReasons = [];
|
|
viewConditions = [];_req$models3 =
|
|
req.models, Resource = _req$models3.Resource, Item = _req$models3.Item, View = _req$models3.View;_context5.next = 8;return (
|
|
Resource.query().
|
|
where('name', 'items').
|
|
withGraphFetched('fields').
|
|
first());case 8:itemsResource = _context5.sent;if (
|
|
|
|
itemsResource) {_context5.next = 11;break;}return _context5.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ITEMS_RESOURCE_NOT_FOUND', code: 200 }] }));case 11:
|
|
|
|
|
|
filter = _objectSpread({
|
|
column_sort_order: '',
|
|
sort_order: '',
|
|
page: 1,
|
|
page_size: 10,
|
|
custom_view_id: null,
|
|
filter_roles: [] },
|
|
req.query);
|
|
|
|
if (filter.stringified_filter_roles) {
|
|
filter.filter_roles = JSON.parse(filter.stringified_filter_roles);
|
|
}_context5.next = 15;return (
|
|
|
|
View.query().onBuild(function (builder) {
|
|
if (filter.custom_view_id) {
|
|
builder.where('id', filter.custom_view_id);
|
|
} else {
|
|
builder.where('favourite', true);
|
|
}
|
|
builder.where('resource_id', itemsResource.id);
|
|
builder.withGraphFetched('roles.field');
|
|
builder.withGraphFetched('columns');
|
|
builder.first();
|
|
}));case 15:view = _context5.sent;
|
|
resourceFieldsKeys = itemsResource.fields.map(function (c) {return c.key;});
|
|
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilter"](Item.tableName);
|
|
|
|
// Dynamic filter with view roles.
|
|
if (view && view.roles.length > 0) {
|
|
viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterViews"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapViewRolesToConditionals"])(view.roles),
|
|
view.rolesLogicExpression);
|
|
|
|
if (!viewFilter.validateFilterRoles()) {
|
|
errorReasons.push({ type: 'VIEW.LOGIC.EXPRESSION.INVALID', code: 400 });
|
|
}
|
|
dynamicFilter.setFilter(viewFilter);
|
|
}
|
|
|
|
// Dynamic filter with filter roles.
|
|
if (filter.filter_roles.length > 0) {
|
|
// Validate the accounts resource fields.
|
|
filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterFilterRoles"](
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["mapFilterRolesToDynamicFilter"])(filter.filter_roles),
|
|
itemsResource.fields);
|
|
|
|
dynamicFilter.setFilter(filterRoles);
|
|
|
|
if (filterRoles.validateFilterRoles().length > 0) {
|
|
errorReasons.push({ type: 'ITEMS.RESOURCE.HAS.NO.FIELDS', code: 500 });
|
|
}
|
|
}
|
|
|
|
// Dynamic filter with column sort order.
|
|
if (filter.column_sort_order) {
|
|
if (resourceFieldsKeys.indexOf(filter.column_sort_order) === -1) {
|
|
errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 });
|
|
}
|
|
sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_11__["DynamicFilterSortBy"](
|
|
filter.column_sort_order,
|
|
filter.sort_order);
|
|
|
|
dynamicFilter.setFilter(sortByFilter);
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context5.next = 23;break;}return _context5.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 23:_context5.next = 25;return (
|
|
|
|
Item.query().onBuild(function (builder) {
|
|
builder.withGraphFetched('costAccount');
|
|
builder.withGraphFetched('sellAccount');
|
|
builder.withGraphFetched('inventoryAccount');
|
|
builder.withGraphFetched('category');
|
|
|
|
dynamicFilter.buildQuery()(builder);
|
|
}).pagination(filter.page - 1, filter.page_size));case 25:items = _context5.sent;return _context5.abrupt("return",
|
|
|
|
res.status(200).send(_objectSpread({
|
|
items: items },
|
|
view && {
|
|
customViewId: view.id,
|
|
viewColumns: view.columns,
|
|
viewConditions: viewConditions })));case 27:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Media.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/http/controllers/Media.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _services_Logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Logger */ "./src/services/Logger/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var fsPromises = fs__WEBPACK_IMPORTED_MODULE_5___default.a.promises;
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.post('/upload',
|
|
this.upload.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.upload.handler));
|
|
|
|
router["delete"]('/',
|
|
this["delete"].validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this["delete"].handler));
|
|
|
|
router.get('/',
|
|
this.get.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.get.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve all or the given attachment ids.
|
|
*/
|
|
get: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids')],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, Media, media;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
Media = req.models.Media;_context.next = 6;return (
|
|
Media.query().onBuild(function (builder) {
|
|
|
|
if (req.query.ids) {
|
|
var ids = Array.isArray(req.query.ids) ? req.query.ids : [req.query.ids];
|
|
builder.whereIn('id', ids);
|
|
}
|
|
}));case 6:media = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({ media: media }));case 8:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Uploads the given attachment file.
|
|
*/
|
|
upload: {
|
|
validation: [
|
|
// check('attachment').exists(),
|
|
],
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var publicPath, attachmentsMimes, attachment, Media, errorReasons, media;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:if (
|
|
req.files.attachment) {_context2.next = 2;break;}return _context2.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'ATTACHMENT.NOT.FOUND', code: 200 }] }));case 2:
|
|
|
|
|
|
publicPath = 'storage/app/public/';
|
|
attachmentsMimes = ['image/png', 'image/jpeg'];
|
|
attachment = req.files.attachment;
|
|
Media = req.models.Media;
|
|
|
|
errorReasons = [];
|
|
|
|
// Validate the attachment.
|
|
if (attachment && attachmentsMimes.indexOf(attachment.mimetype) === -1) {
|
|
errorReasons.push({ type: 'ATTACHMENT.MINETYPE.NOT.SUPPORTED', code: 160 });
|
|
}
|
|
// Catch all error reasons to response 400.
|
|
if (!(errorReasons.length > 0)) {_context2.next = 10;break;}return _context2.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 10:_context2.prev = 10;_context2.next = 13;return (
|
|
|
|
|
|
|
|
attachment.mv("".concat(publicPath).concat(req.organizationId, "/").concat(attachment.md5, ".png")));case 13:
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('info', 'Attachment uploaded successfully');_context2.next = 19;break;case 16:_context2.prev = 16;_context2.t0 = _context2["catch"](10);
|
|
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('info', 'Attachment uploading failed.', { error: _context2.t0 });case 19:_context2.next = 21;return (
|
|
|
|
|
|
Media.query().insert({
|
|
attachment_file: "".concat(attachment.md5, ".png") }));case 21:media = _context2.sent;return _context2.abrupt("return",
|
|
|
|
res.status(200).send({ media: media }));case 23:case "end":return _context2.stop();}}}, _callee2, null, [[10, 16]]);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Deletes the given attachment ids from file system and database.
|
|
*/
|
|
"delete": {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids').exists().isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('ids.*').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var validationErrors, _req$models, Media, MediaLink, ids, media, mediaIds, notFoundMedia, publicPath, tenantPath, unlinkOpers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context3.next = 3;break;}return _context3.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models =
|
|
|
|
|
|
req.models, Media = _req$models.Media, MediaLink = _req$models.MediaLink;
|
|
ids = Array.isArray(req.query.ids) ? req.query.ids : [req.query.ids];_context3.next = 7;return (
|
|
Media.query().whereIn('id', ids));case 7:media = _context3.sent;
|
|
mediaIds = media.map(function (m) {return m.id;});
|
|
notFoundMedia = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(ids, mediaIds);if (!
|
|
|
|
notFoundMedia.length) {_context3.next = 12;break;}return _context3.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'MEDIA.IDS.NOT.FOUND', code: 200, ids: notFoundMedia }] }));case 12:
|
|
|
|
|
|
publicPath = 'storage/app/public/';
|
|
tenantPath = "".concat(publicPath).concat(req.organizationId);
|
|
unlinkOpers = [];
|
|
|
|
media.forEach(function (mediaModel) {
|
|
var oper = fsPromises.unlink("".concat(tenantPath, "/").concat(mediaModel.attachmentFile));
|
|
unlinkOpers.push(oper);
|
|
});_context3.next = 18;return (
|
|
Promise.all(unlinkOpers).then(function (resolved) {
|
|
resolved.forEach(function () {
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('error', 'Attachment file has been deleted.');
|
|
});
|
|
})["catch"](
|
|
function (errors) {
|
|
errors.forEach(function (error) {
|
|
_services_Logger__WEBPACK_IMPORTED_MODULE_8__["default"].log('error', 'Delete item attachment file delete failed.', { error: error });
|
|
});
|
|
}));case 18:_context3.next = 20;return (
|
|
|
|
MediaLink.query().whereIn('media_id', mediaIds)["delete"]());case 20:_context3.next = 22;return (
|
|
Media.query().whereIn('id', mediaIds)["delete"]());case 22:return _context3.abrupt("return",
|
|
|
|
res.status(200).send());case 23:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Options.js":
|
|
/*!*****************************************!*\
|
|
!*** ./src/http/controllers/Options.js ***!
|
|
\*****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.post('/',
|
|
this.saveOptions.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.saveOptions.handler));
|
|
|
|
router.get('/',
|
|
this.getOptions.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getOptions.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Saves the given options to the storage.
|
|
*/
|
|
saveOptions: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options').isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options.*.key').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options.*.value').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["body"])('options.*.group').exists()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, Option, form, optionsCollections, errorReasons, notDefinedOptions;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 3;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'VALIDATION_ERROR' }, validationErrors)));case 3:
|
|
|
|
|
|
Option = req.models.Option;
|
|
form = _objectSpread({}, req.body);_context.next = 7;return (
|
|
Option.query());case 7:optionsCollections = _context.sent;
|
|
|
|
errorReasons = [];
|
|
notDefinedOptions = Option.validateDefined(form.options);
|
|
|
|
if (notDefinedOptions.length) {
|
|
errorReasons.push({
|
|
type: 'OPTIONS.KEY.NOT.DEFINED',
|
|
code: 200,
|
|
keys: notDefinedOptions.map(function (o) {return _objectSpread({}, Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(o, ['key', 'group']));}) });
|
|
|
|
}if (!
|
|
errorReasons.length) {_context.next = 13;break;}return _context.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 13:
|
|
|
|
form.options.forEach(function (option) {
|
|
optionsCollections.setMeta(_objectSpread({}, option));
|
|
});_context.next = 16;return (
|
|
optionsCollections.saveMeta());case 16:return _context.abrupt("return",
|
|
|
|
res.status(200).send({ options: form }));case 17:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve the application options from the storage.
|
|
*/
|
|
getOptions: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('key').optional(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('group').optional()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var validationErrors, Option, filter, options;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context2.next = 3;break;}return _context2.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'VALIDATION_ERROR' }, validationErrors)));case 3:
|
|
|
|
|
|
Option = req.models.Option;
|
|
filter = _objectSpread({}, req.query);_context2.next = 7;return (
|
|
Option.query().onBuild(function (builder) {
|
|
if (filter.key) {
|
|
builder.where('key', filter.key);
|
|
}
|
|
if (filter.group) {
|
|
builder.where('group', filter.group);
|
|
}
|
|
}));case 7:options = _context2.sent;return _context2.abrupt("return",
|
|
res.status(200).send({ options: options.metadata }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Resources.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/http/controllers/Resources.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_2___default.a.Router();
|
|
|
|
router.get('/:resource_slug/columns',
|
|
this.resourceColumns.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__["default"])(this.resourceColumns.handler));
|
|
|
|
router.get('/:resource_slug/fields',
|
|
this.resourceFields.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__["default"])(this.resourceFields.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Retrieve resource columns of the given resource.
|
|
*/
|
|
resourceColumns: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["param"])('resource_slug').trim().escape().exists()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var resourceSlug, Resource, resource, resourceFields;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
resourceSlug = req.params.resource_slug;
|
|
Resource = req.models.Resource;_context.next = 4;return (
|
|
|
|
Resource.query().
|
|
where('name', resourceSlug).
|
|
withGraphFetched('fields').
|
|
first());case 4:resource = _context.sent;if (
|
|
|
|
resource) {_context.next = 7;break;}return _context.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'RESOURCE.SLUG.NOT.FOUND', code: 200 }] }));case 7:
|
|
|
|
|
|
resourceFields = resource.fields.
|
|
filter(function (field) {return field.columnable;}).
|
|
map(function (field) {return {
|
|
id: field.id,
|
|
label: field.labelName,
|
|
key: field.key };});return _context.abrupt("return",
|
|
|
|
|
|
res.status(200).send({
|
|
resource_columns: resourceFields,
|
|
resource_slug: resourceSlug }));case 9:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve resource fields of the given resource.
|
|
*/
|
|
resourceFields: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["param"])('resource_slug').trim().escape().exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["query"])('predefined').optional().isBoolean().toBoolean(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_3__["query"])('builtin').optional().isBoolean().toBoolean()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var resourceSlug, Resource, resource;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
resourceSlug = req.params.resource_slug;
|
|
Resource = req.models.Resource;_context2.next = 4;return (
|
|
|
|
Resource.query().
|
|
where('name', resourceSlug).
|
|
withGraphFetched('fields').
|
|
first());case 4:resource = _context2.sent;if (
|
|
|
|
resource) {_context2.next = 7;break;}return _context2.abrupt("return",
|
|
res.status(400).send({
|
|
errors: [{ type: 'RESOURCE.SLUG.NOT.FOUND', code: 200 }] }));case 7:return _context2.abrupt("return",
|
|
|
|
|
|
res.status(200).send({
|
|
resource_fields: resource.fields,
|
|
resource_slug: resourceSlug }));case 8:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Users.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/http/controllers/Users.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
|
|
|
|
router.put('/:id/inactive',
|
|
this.inactiveUser.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.inactiveUser.handler));
|
|
|
|
router.put('/:id/active',
|
|
this.activeUser.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.activeUser.handler));
|
|
|
|
router.post('/:id',
|
|
this.editUser.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.editUser.handler));
|
|
|
|
router.get('/',
|
|
this.listUsers.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.listUsers.handler));
|
|
|
|
router.get('/:id',
|
|
this.getUser.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.getUser.handler));
|
|
|
|
router["delete"]('/:id',
|
|
this.deleteUser.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_5__["default"])(this.deleteUser.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* Edit details of the given user.
|
|
*/
|
|
editUser: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').exists().isEmail(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('phone_number').optional().isMobilePhone()],
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var id, validationErrors, TenantUser, user, form, foundUsers, foundUserEmail, foundUserPhone, errorReasons, userForm, updateTenantUser, updateSystemUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
id = req.params.id;
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context.next = 4;break;}return _context.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 4:
|
|
|
|
|
|
TenantUser = req.models.TenantUser;
|
|
user = req.user;
|
|
form = _objectSpread({}, req.body);_context.next = 9;return (
|
|
|
|
TenantUser.query().
|
|
whereNot('id', id).
|
|
andWhere(function (q) {
|
|
q.where('email', form.email);
|
|
q.orWhere('phone_number', form.phone_number);
|
|
}));case 9:foundUsers = _context.sent;
|
|
|
|
foundUserEmail = foundUsers.find(function (u) {return u.email === form.email;});
|
|
foundUserPhone = foundUsers.find(function (u) {return u.phoneNumber === form.phone_number;});
|
|
|
|
errorReasons = [];
|
|
|
|
if (foundUserEmail) {
|
|
errorReasons.push({ type: 'EMAIL_ALREADY_EXIST', code: 100 });
|
|
}
|
|
if (foundUserPhone) {
|
|
errorReasons.push({ type: 'PHONE_NUMBER_ALREADY_EXIST', code: 120 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context.next = 17;break;}return _context.abrupt("return",
|
|
res.boom.badRequest(null, { errors: errorReasons }));case 17:
|
|
|
|
userForm = {
|
|
first_name: form.first_name,
|
|
last_name: form.last_name,
|
|
email: form.email,
|
|
phone_number: form.phone_number };
|
|
|
|
updateTenantUser = TenantUser.query().
|
|
where('id', id).update(_objectSpread({}, userForm));
|
|
|
|
updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query().
|
|
where('id', user.id).update(_objectSpread({}, userForm));_context.next = 22;return (
|
|
|
|
Promise.all([
|
|
updateTenantUser, updateSystemUser]));case 22:return _context.abrupt("return",
|
|
|
|
res.status(200).send());case 23:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Soft deleting the given user.
|
|
*/
|
|
deleteUser: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var id, TenantUser, user, tenantUserDel, systemUserDel;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
id = req.params.id;
|
|
TenantUser = req.models.TenantUser;_context2.next = 4;return (
|
|
TenantUser.query().where('id', id).first());case 4:user = _context2.sent;if (
|
|
|
|
user) {_context2.next = 7;break;}return _context2.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'USER_NOT_FOUND', code: 100 }] }));case 7:
|
|
|
|
|
|
tenantUserDel = TenantUser.query().where('id', id)["delete"]();
|
|
systemUserDel = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query().where('id', id)["delete"]();_context2.next = 11;return (
|
|
|
|
Promise.all([
|
|
tenantUserDel,
|
|
systemUserDel]));case 11:return _context2.abrupt("return",
|
|
|
|
res.status(200).send());case 12:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve user details of the given user id.
|
|
*/
|
|
getUser: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var id, TenantUser, user;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
id = req.params.id;
|
|
TenantUser = req.models.TenantUser;_context3.next = 4;return (
|
|
TenantUser.query().where('id', id).first());case 4:user = _context3.sent;if (
|
|
|
|
user) {_context3.next = 7;break;}return _context3.abrupt("return",
|
|
res.boom.notFound());case 7:return _context3.abrupt("return",
|
|
|
|
res.status(200).send({ user: user }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve the list of users.
|
|
*/
|
|
listUsers: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page_size').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('page').optional().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var filter, TenantUser, users;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
filter = _objectSpread({
|
|
page_size: 10,
|
|
page: 1 },
|
|
req.query);
|
|
|
|
TenantUser = req.models.TenantUser;_context4.next = 4;return (
|
|
TenantUser.query().
|
|
page(filter.page - 1, filter.page_size));case 4:users = _context4.sent;return _context4.abrupt("return",
|
|
|
|
res.status(200).send({ users: users }));case 6:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
inactiveUser: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var validationErrors, id, user, TenantUser, tenantUser, updateTenantUser, updateSystemUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context5.next = 3;break;}return _context5.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
id = req.params.id;
|
|
user = req.user;
|
|
TenantUser = req.models.TenantUser;
|
|
tenantUser = TenantUser.query().where('id', id).first();if (
|
|
|
|
tenantUser) {_context5.next = 9;break;}return _context5.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'USER.NOT.FOUND', code: 100 }] }));case 9:
|
|
|
|
|
|
updateTenantUser = TenantUser.query().
|
|
where('id', id).update({ active: false });
|
|
|
|
updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query().
|
|
where('id', user.id).update({ active: false });_context5.next = 13;return (
|
|
|
|
Promise.all([
|
|
updateTenantUser, updateSystemUser]));case 13:return _context5.abrupt("return",
|
|
|
|
|
|
res.status(200).send({ id: tenantUser.id }));case 14:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
activeUser: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var validationErrors, id, user, TenantUser, tenantUser, updateTenantUser, updateSystemUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context6.next = 3;break;}return _context6.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:
|
|
|
|
|
|
id = req.params.id;
|
|
user = req.user;
|
|
TenantUser = req.models.TenantUser;
|
|
tenantUser = TenantUser.query().where('id', id).first();if (
|
|
|
|
tenantUser) {_context6.next = 9;break;}return _context6.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'USER.NOT.FOUND', code: 100 }] }));case 9:
|
|
|
|
|
|
updateTenantUser = TenantUser.query().
|
|
where('id', id).update({ active: true });
|
|
|
|
updateSystemUser = _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_6__["default"].query().
|
|
where('id', user.id).update({ active: true });_context6.next = 13;return (
|
|
|
|
Promise.all([
|
|
updateTenantUser, updateSystemUser]));case 13:return _context6.abrupt("return",
|
|
|
|
res.status(200).send({ id: tenantUser.id }));case 14:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/controllers/Views.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/http/controllers/Views.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! express-validator */ "express-validator");
|
|
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
resource: 'items',
|
|
|
|
/**
|
|
* Router constructor.
|
|
*/
|
|
router: function router() {
|
|
var router = express__WEBPACK_IMPORTED_MODULE_4___default.a.Router();
|
|
|
|
router.get('/',
|
|
this.listViews.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.listViews.handler));
|
|
|
|
router.post('/',
|
|
this.createView.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.createView.handler));
|
|
|
|
router.post('/:view_id',
|
|
this.editView.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editView.handler));
|
|
|
|
router["delete"]('/:view_id',
|
|
this.deleteView.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteView.handler));
|
|
|
|
router.get('/:view_id',
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getView.handler));
|
|
|
|
router.get('/:view_id/resource',
|
|
this.getViewResource.validation,
|
|
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getViewResource.handler));
|
|
|
|
return router;
|
|
},
|
|
|
|
/**
|
|
* List all views that associated with the given resource.
|
|
*/
|
|
listViews: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["oneOf"])([
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('resource_name').exists().trim().escape()],
|
|
[
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["query"])('resource_id').exists().isNumeric().toInt()])],
|
|
|
|
|
|
handler: function () {var _handler = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var _req$models, Resource, View, filter, resource, views;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_req$models =
|
|
req.models, Resource = _req$models.Resource, View = _req$models.View;
|
|
filter = _objectSpread({}, req.query);_context.next = 4;return (
|
|
|
|
Resource.query().onBuild(function (builder) {
|
|
if (filter.resource_id) {
|
|
builder.where('id', filter.resource_id);
|
|
}
|
|
if (filter.resource_name) {
|
|
builder.where('name', filter.resource_name);
|
|
}
|
|
builder.first();
|
|
}));case 4:resource = _context.sent;_context.next = 7;return (
|
|
|
|
View.query().where('resource_id', resource.id));case 7:views = _context.sent;return _context.abrupt("return",
|
|
|
|
res.status(200).send({ views: views }));case 9:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve view details of the given view id.
|
|
*/
|
|
getView: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(req, res) {var viewId, View, view;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
viewId = req.params.view_id;
|
|
View = req.models.View;_context2.next = 4;return (
|
|
|
|
View.query().
|
|
where('id', viewId).
|
|
withGraphFetched('resource').
|
|
withGraphFetched('columns').
|
|
withGraphFetched('roles.field').
|
|
first());case 4:view = _context2.sent;if (
|
|
|
|
view) {_context2.next = 7;break;}return _context2.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'VIEW_NOT_FOUND', code: 100 }] }));case 7:return _context2.abrupt("return",
|
|
|
|
|
|
res.status(200).send({ view: view.toJSON() }));case 8:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Delete the given view of the resource.
|
|
*/
|
|
deleteView: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var View, viewId, view;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
View = req.models.View;
|
|
viewId = req.params.view_id;_context3.next = 4;return (
|
|
View.query().findById(viewId));case 4:view = _context3.sent;if (
|
|
|
|
view) {_context3.next = 7;break;}return _context3.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'VIEW_NOT_FOUND', code: 100 }] }));case 7:if (!
|
|
|
|
|
|
view.predefined) {_context3.next = 9;break;}return _context3.abrupt("return",
|
|
res.boom.badRequest(null, {
|
|
errors: [{ type: 'PREDEFINED_VIEW', code: 200 }] }));case 9:_context3.next = 11;return (
|
|
|
|
|
|
Promise.all([
|
|
view.$relatedQuery('roles')["delete"](),
|
|
view.$relatedQuery('columns')["delete"]()]));case 11:_context3.next = 13;return (
|
|
|
|
View.query().where('id', view.id)["delete"]());case 13:return _context3.abrupt("return",
|
|
|
|
res.status(200).send({ id: view.id }));case 14:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Creates a new view.
|
|
*/
|
|
createView: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('resource_name').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('logic_expression').exists().trim().escape(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles').isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.field_key').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.comparator').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.value').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.index').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns').exists().isArray({ min: 1 }),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.key').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.index').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee4(req, res) {var validationErrors, _req$models2, Resource, View, ViewColumn, ViewRole, form, resource, errorReasons, fieldsSlugs, resourceFields, resourceFieldsKeys, resourceFieldsKeysMap, columnsKeys, notFoundFields, notFoundColumns, view, saveViewRolesOpers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context4.next = 3;break;}return _context4.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 3:_req$models2 =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
req.models, Resource = _req$models2.Resource, View = _req$models2.View, ViewColumn = _req$models2.ViewColumn, ViewRole = _req$models2.ViewRole;
|
|
form = _objectSpread({ roles: [] }, req.body);_context4.next = 7;return (
|
|
Resource.query().where('name', form.resource_name).first());case 7:resource = _context4.sent;if (
|
|
|
|
resource) {_context4.next = 10;break;}return _context4.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'RESOURCE_NOT_FOUND', code: 100 }] }));case 10:
|
|
|
|
|
|
errorReasons = [];
|
|
fieldsSlugs = form.roles.map(function (role) {return role.field_key;});_context4.next = 14;return (
|
|
|
|
resource.$relatedQuery('fields'));case 14:resourceFields = _context4.sent;
|
|
resourceFieldsKeys = resourceFields.map(function (f) {return f.key;});
|
|
resourceFieldsKeysMap = new Map(resourceFields.map(function (field) {return [field.key, field];}));
|
|
columnsKeys = form.columns.map(function (c) {return c.key;});
|
|
|
|
// The difference between the stored resource fields and submit fields keys.
|
|
notFoundFields = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(fieldsSlugs, resourceFieldsKeys);
|
|
|
|
if (notFoundFields.length > 0) {
|
|
errorReasons.push({ type: 'RESOURCE_FIELDS_NOT_EXIST', code: 100, fields: notFoundFields });
|
|
}
|
|
// The difference between the stored resource fields and the submit columns keys.
|
|
notFoundColumns = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(columnsKeys, resourceFieldsKeys);
|
|
|
|
if (notFoundColumns.length > 0) {
|
|
errorReasons.push({ type: 'COLUMNS_NOT_EXIST', code: 200, columns: notFoundColumns });
|
|
}
|
|
// Validates the view conditional logic expression.
|
|
if (!Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["validateViewRoles"])(form.roles, form.logic_expression)) {
|
|
errorReasons.push({ type: 'VIEW.ROLES.LOGIC.EXPRESSION.INVALID', code: 400 });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context4.next = 25;break;}return _context4.abrupt("return",
|
|
res.boom.badRequest(null, { errors: errorReasons }));case 25:_context4.next = 27;return (
|
|
|
|
|
|
|
|
View.query().insert({
|
|
name: form.name,
|
|
predefined: false,
|
|
resource_id: resource.id,
|
|
roles_logic_expression: form.logic_expression }));case 27:view = _context4.sent;
|
|
|
|
// Save view roles async operations.
|
|
saveViewRolesOpers = [];
|
|
|
|
form.roles.forEach(function (role) {
|
|
var fieldModel = resourceFieldsKeysMap.get(role.field_key);
|
|
|
|
var saveViewRoleOper = ViewRole.query().insert(_objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_3__["pick"])(role, ['comparator', 'value', 'index']), {
|
|
field_id: fieldModel.id,
|
|
view_id: view.id }));
|
|
|
|
saveViewRolesOpers.push(saveViewRoleOper);
|
|
});
|
|
|
|
form.columns.forEach(function (column) {
|
|
var fieldModel = resourceFieldsKeysMap.get(column.key);
|
|
|
|
var saveViewColumnOper = ViewColumn.query().insert({
|
|
field_id: fieldModel.id,
|
|
view_id: view.id,
|
|
index: column.index });
|
|
|
|
saveViewRolesOpers.push(saveViewColumnOper);
|
|
});_context4.next = 33;return (
|
|
Promise.all(saveViewRolesOpers));case 33:return _context4.abrupt("return",
|
|
|
|
res.status(200).send({ id: view.id }));case 34:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Edit the given custom view metadata.
|
|
*/
|
|
editView: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('name').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('logic_expression').exists().trim().escape(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns').exists().isArray({ min: 1 }),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.id').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.key').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('columns.*.index').exists().isNumeric().toInt(),
|
|
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles').isArray(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.id').optional().isNumeric().toInt(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.field_key').exists().escape().trim(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.comparator').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.value').exists(),
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["check"])('roles.*.index').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee5(req, res) {var viewId, validationErrors, _req$models3, View, ViewRole, ViewColumn, Resource, view, form, resource, errorReasons, fieldsSlugs, resourceFieldsKeys, resourceFieldsKeysMap, columnsKeys, notFoundFields, notFoundColumns, viewRolesIds, viewColumnsIds, formUpdatedRoles, formInsertRoles, formRolesIds, formUpdatedColumns, formInsertedColumns, formColumnsIds, rolesIdsShouldDeleted, columnsIdsShouldDelete, notFoundViewRolesIds, notFoundViewColumnsIds, asyncOpers, deleteOper, _deleteOper;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:
|
|
viewId = req.params.view_id;
|
|
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["validationResult"])(req);if (
|
|
|
|
validationErrors.isEmpty()) {_context5.next = 4;break;}return _context5.abrupt("return",
|
|
res.boom.badData(null, _objectSpread({
|
|
code: 'validation_error' }, validationErrors)));case 4:_req$models3 =
|
|
|
|
|
|
|
|
|
|
req.models, View = _req$models3.View, ViewRole = _req$models3.ViewRole, ViewColumn = _req$models3.ViewColumn, Resource = _req$models3.Resource;_context5.next = 7;return (
|
|
View.query().where('id', viewId).
|
|
withGraphFetched('roles.field').
|
|
withGraphFetched('columns').
|
|
first());case 7:view = _context5.sent;if (
|
|
|
|
view) {_context5.next = 10;break;}return _context5.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'ROLE_NOT_FOUND', code: 100 }] }));case 10:
|
|
|
|
|
|
form = _objectSpread({}, req.body);_context5.next = 13;return (
|
|
Resource.query().
|
|
where('id', view.resourceId).
|
|
withGraphFetched('fields').
|
|
withGraphFetched('views').
|
|
first());case 13:resource = _context5.sent;
|
|
|
|
errorReasons = [];
|
|
fieldsSlugs = form.roles.map(function (role) {return role.field_key;});
|
|
resourceFieldsKeys = resource.fields.map(function (f) {return f.key;});
|
|
resourceFieldsKeysMap = new Map(resource.fields.map(function (field) {return [field.key, field];}));
|
|
columnsKeys = form.columns.map(function (c) {return c.key;});
|
|
|
|
// The difference between the stored resource fields and submit fields keys.
|
|
notFoundFields = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(fieldsSlugs, resourceFieldsKeys);
|
|
|
|
// Validate not found resource fields keys.
|
|
if (notFoundFields.length > 0) {
|
|
errorReasons.push({
|
|
type: 'RESOURCE_FIELDS_NOT_EXIST', code: 100, fields: notFoundFields });
|
|
|
|
}
|
|
// The difference between the stored resource fields and the submit columns keys.
|
|
notFoundColumns = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(columnsKeys, resourceFieldsKeys);
|
|
|
|
// Validate not found view columns.
|
|
if (notFoundColumns.length > 0) {
|
|
errorReasons.push({ type: 'RESOURCE_COLUMNS_NOT_EXIST', code: 200, columns: notFoundColumns });
|
|
}
|
|
// Validates the view conditional logic expression.
|
|
if (!Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["validateViewRoles"])(form.roles, form.logic_expression)) {
|
|
errorReasons.push({ type: 'VIEW.ROLES.LOGIC.EXPRESSION.INVALID', code: 400 });
|
|
}
|
|
|
|
viewRolesIds = view.roles.map(function (r) {return r.id;});
|
|
viewColumnsIds = view.columns.map(function (c) {return c.id;});
|
|
|
|
formUpdatedRoles = form.roles.filter(function (r) {return r.id;});
|
|
formInsertRoles = form.roles.filter(function (r) {return !r.id;});
|
|
|
|
formRolesIds = formUpdatedRoles.map(function (r) {return r.id;});
|
|
|
|
formUpdatedColumns = form.columns.filter(function (r) {return r.id;});
|
|
formInsertedColumns = form.columns.filter(function (r) {return !r.id;});
|
|
formColumnsIds = formUpdatedColumns.map(function (r) {return r.id;});
|
|
|
|
rolesIdsShouldDeleted = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(viewRolesIds, formRolesIds);
|
|
columnsIdsShouldDelete = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(viewColumnsIds, formColumnsIds);
|
|
|
|
notFoundViewRolesIds = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(formRolesIds, viewRolesIds);
|
|
notFoundViewColumnsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["difference"])(viewColumnsIds, viewColumnsIds);
|
|
|
|
// Validate the not found view roles ids.
|
|
if (notFoundViewRolesIds.length) {
|
|
errorReasons.push({ type: 'VIEW.ROLES.IDS.NOT.FOUND', code: 500, ids: notFoundViewRolesIds });
|
|
}
|
|
// Validate the not found view columns ids.
|
|
if (notFoundViewColumnsIds.length) {
|
|
errorReasons.push({ type: 'VIEW.COLUMNS.IDS.NOT.FOUND', code: 600, ids: notFoundViewColumnsIds });
|
|
}if (!(
|
|
errorReasons.length > 0)) {_context5.next = 40;break;}return _context5.abrupt("return",
|
|
res.status(400).send({ errors: errorReasons }));case 40:
|
|
|
|
asyncOpers = [];
|
|
|
|
// Save view details.
|
|
_context5.next = 43;return View.query().
|
|
where('id', view.id).
|
|
patch({
|
|
name: form.name,
|
|
roles_logic_expression: form.logic_expression });case 43:
|
|
|
|
|
|
// Update view roles.
|
|
if (formUpdatedRoles.length > 0) {
|
|
formUpdatedRoles.forEach(function (role) {
|
|
var fieldModel = resourceFieldsKeysMap.get(role.field_key);
|
|
var updateOper = ViewRole.query().
|
|
where('id', role.id).
|
|
update(_objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_3__["pick"])(role, ['comparator', 'value', 'index']), {
|
|
field_id: fieldModel.id }));
|
|
|
|
asyncOpers.push(updateOper);
|
|
});
|
|
}
|
|
// Insert a new view roles.
|
|
if (formInsertRoles.length > 0) {
|
|
formInsertRoles.forEach(function (role) {
|
|
var fieldModel = resourceFieldsKeysMap.get(role.field_key);
|
|
var insertOper = ViewRole.query().
|
|
insert(_objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_3__["pick"])(role, ['comparator', 'value', 'index']), {
|
|
field_id: fieldModel.id,
|
|
view_id: view.id }));
|
|
|
|
asyncOpers.push(insertOper);
|
|
});
|
|
}
|
|
// Delete view roles.
|
|
if (rolesIdsShouldDeleted.length > 0) {
|
|
deleteOper = ViewRole.query().
|
|
whereIn('id', rolesIdsShouldDeleted)["delete"]();
|
|
|
|
asyncOpers.push(deleteOper);
|
|
}
|
|
// Insert a new view columns to the storage.
|
|
if (formInsertedColumns.length > 0) {
|
|
formInsertedColumns.forEach(function (column) {
|
|
var fieldModel = resourceFieldsKeysMap.get(column.key);
|
|
var insertOper = ViewColumn.query().
|
|
insert({
|
|
field_id: fieldModel.id,
|
|
index: column.index,
|
|
view_id: view.id });
|
|
|
|
asyncOpers.push(insertOper);
|
|
});
|
|
}
|
|
// Update the view columns on the storage.
|
|
if (formUpdatedColumns.length > 0) {
|
|
formUpdatedColumns.forEach(function (column) {
|
|
var updateOper = ViewColumn.query().
|
|
where('id', column.id).
|
|
update({
|
|
index: column.index });
|
|
|
|
asyncOpers.push(updateOper);
|
|
});
|
|
}
|
|
// Delete the view columns from the storage.
|
|
if (columnsIdsShouldDelete.length > 0) {
|
|
_deleteOper = ViewColumn.query().
|
|
whereIn('id', columnsIdsShouldDelete)["delete"]();
|
|
|
|
asyncOpers.push(_deleteOper);
|
|
}_context5.next = 51;return (
|
|
Promise.all(asyncOpers));case 51:return _context5.abrupt("return",
|
|
|
|
res.status(200).send());case 52:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() },
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve resource columns that associated to the given custom view.
|
|
*/
|
|
getViewResource: {
|
|
validation: [
|
|
Object(express_validator__WEBPACK_IMPORTED_MODULE_5__["param"])('view_id').exists().isNumeric().toInt()],
|
|
|
|
handler: function () {var _handler6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee6(req, res) {var viewId, View, view, resourceColumns;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
|
|
viewId = req.params.view_id;
|
|
View = req.models.View;_context6.next = 4;return (
|
|
|
|
View.query().
|
|
where('id', viewId).
|
|
withGraphFetched('resource.fields').
|
|
first());case 4:view = _context6.sent;if (
|
|
|
|
view) {_context6.next = 7;break;}return _context6.abrupt("return",
|
|
res.boom.notFound(null, {
|
|
errors: [{ type: 'VIEW.NOT.FOUND', code: 100 }] }));case 7:if (
|
|
|
|
|
|
view.resource) {_context6.next = 9;break;}return _context6.abrupt("return",
|
|
res.boom.badData(null, {
|
|
errors: [{ type: 'VIEW.HAS.NOT.ASSOCIATED.RESOURCE', code: 200 }] }));case 9:
|
|
|
|
|
|
|
|
resourceColumns = view.resource.fields.
|
|
filter(function (field) {return field.columnable;}).
|
|
map(function (field) {return {
|
|
id: field.id,
|
|
label: field.labelName,
|
|
key: field.key };});return _context6.abrupt("return",
|
|
|
|
|
|
res.status(200).send({
|
|
resource_slug: view.resource.name,
|
|
resource_columns: resourceColumns,
|
|
resource_fields: view.resource.fields }));case 11:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.apply(this, arguments);}return handler;}() } });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/index.js":
|
|
/*!***************************!*\
|
|
!*** ./src/http/index.js ***!
|
|
\***************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! express */ "express");
|
|
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _http_controllers_Authentication__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/http/controllers/Authentication */ "./src/http/controllers/Authentication.js");
|
|
/* harmony import */ var _http_controllers_InviteUsers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/http/controllers/InviteUsers */ "./src/http/controllers/InviteUsers.js");
|
|
/* harmony import */ var _http_controllers_Users__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/http/controllers/Users */ "./src/http/controllers/Users.js");
|
|
/* harmony import */ var _http_controllers_Items__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/http/controllers/Items */ "./src/http/controllers/Items.js");
|
|
/* harmony import */ var _http_controllers_ItemCategories__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/http/controllers/ItemCategories */ "./src/http/controllers/ItemCategories.js");
|
|
/* harmony import */ var _http_controllers_Accounts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/http/controllers/Accounts */ "./src/http/controllers/Accounts.js");
|
|
/* harmony import */ var _http_controllers_AccountTypes__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/http/controllers/AccountTypes */ "./src/http/controllers/AccountTypes.js");
|
|
/* harmony import */ var _http_controllers_Views__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/http/controllers/Views */ "./src/http/controllers/Views.js");
|
|
/* harmony import */ var _http_controllers_Accounting__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/http/controllers/Accounting */ "./src/http/controllers/Accounting.js");
|
|
/* harmony import */ var _http_controllers_FinancialStatements__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/controllers/FinancialStatements */ "./src/http/controllers/FinancialStatements.js");
|
|
/* harmony import */ var _http_controllers_Options__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/http/controllers/Options */ "./src/http/controllers/Options.js");
|
|
/* harmony import */ var _http_controllers_Currencies__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/http/controllers/Currencies */ "./src/http/controllers/Currencies.js");
|
|
/* harmony import */ var _controllers_Resources__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./controllers/Resources */ "./src/http/controllers/Resources.js");
|
|
/* harmony import */ var _http_controllers_ExchangeRates__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/ExchangeRates */ "./src/http/controllers/ExchangeRates.js");
|
|
/* harmony import */ var _http_controllers_Media__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/http/controllers/Media */ "./src/http/controllers/Media.js");
|
|
/* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.js");
|
|
/* harmony import */ var _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/http/middleware/TenancyMiddleware */ "./src/http/middleware/TenancyMiddleware.js");
|
|
// import OAuth2 from '@/http/controllers/OAuth2';
|
|
|
|
|
|
|
|
|
|
// import Roles from '@/http/controllers/Roles';
|
|
|
|
|
|
|
|
|
|
// import AccountOpeningBalance from '@/http/controllers/AccountOpeningBalance';
|
|
|
|
// import CustomFields from '@/http/controllers/Fields';
|
|
|
|
|
|
// import Expenses from '@/http/controllers/Expenses';
|
|
|
|
// import Budget from '@/http/controllers/Budget';
|
|
// import BudgetReports from '@/http/controllers/BudgetReports';
|
|
|
|
// import Customers from '@/http/controllers/Customers';
|
|
// import Suppliers from '@/http/controllers/Suppliers';
|
|
// import Bills from '@/http/controllers/Bills';
|
|
// import CurrencyAdjustment from './controllers/CurrencyAdjustment';
|
|
|
|
|
|
// import SalesReports from '@/http/controllers/SalesReports';
|
|
// import PurchasesReports from '@/http/controllers/PurchasesReports';
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (function (app) {
|
|
// app.use('/api/oauth2', OAuth2.router());
|
|
app.use('/api/auth', _http_controllers_Authentication__WEBPACK_IMPORTED_MODULE_1__["default"].router());
|
|
app.use('/api/invite', _http_controllers_InviteUsers__WEBPACK_IMPORTED_MODULE_2__["default"].router());
|
|
|
|
var dashboard = express__WEBPACK_IMPORTED_MODULE_0___default.a.Router();
|
|
|
|
dashboard.use(_http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_16__["default"]);
|
|
dashboard.use(_http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_17__["default"]);
|
|
|
|
dashboard.use('/api/currencies', _http_controllers_Currencies__WEBPACK_IMPORTED_MODULE_12__["default"].router());
|
|
dashboard.use('/api/users', _http_controllers_Users__WEBPACK_IMPORTED_MODULE_3__["default"].router());
|
|
// app.use('/api/roles', Roles.router());
|
|
dashboard.use('/api/accounts', _http_controllers_Accounts__WEBPACK_IMPORTED_MODULE_6__["default"].router());
|
|
dashboard.use('/api/account_types', _http_controllers_AccountTypes__WEBPACK_IMPORTED_MODULE_7__["default"].router());
|
|
dashboard.use('/api/accounting', _http_controllers_Accounting__WEBPACK_IMPORTED_MODULE_9__["default"].router());
|
|
// app.use('/api/accounts_opening_balances', AccountOpeningBalance.router());
|
|
dashboard.use('/api/views', _http_controllers_Views__WEBPACK_IMPORTED_MODULE_8__["default"].router());
|
|
// app.use('/api/fields', CustomFields.router());
|
|
dashboard.use('/api/items', _http_controllers_Items__WEBPACK_IMPORTED_MODULE_4__["default"].router());
|
|
dashboard.use('/api/item_categories', _http_controllers_ItemCategories__WEBPACK_IMPORTED_MODULE_5__["default"].router());
|
|
// app.use('/api/expenses', Expenses.router());
|
|
dashboard.use('/api/financial_statements', _http_controllers_FinancialStatements__WEBPACK_IMPORTED_MODULE_10__["default"].router());
|
|
dashboard.use('/api/options', _http_controllers_Options__WEBPACK_IMPORTED_MODULE_11__["default"].router());
|
|
// app.use('/api/budget_reports', BudgetReports.router());
|
|
// app.use('/api/customers', Customers.router());
|
|
// app.use('/api/suppliers', Suppliers.router());
|
|
// app.use('/api/bills', Bills.router());
|
|
// app.use('/api/budget', Budget.router());
|
|
dashboard.use('/api/resources', _controllers_Resources__WEBPACK_IMPORTED_MODULE_13__["default"].router());
|
|
dashboard.use('/api/exchange_rates', _http_controllers_ExchangeRates__WEBPACK_IMPORTED_MODULE_14__["default"].router());
|
|
dashboard.use('/api/media', _http_controllers_Media__WEBPACK_IMPORTED_MODULE_15__["default"].router());
|
|
|
|
app.use('/', dashboard);
|
|
// app.use('/api/currency_adjustment', CurrencyAdjustment.router());
|
|
// app.use('/api/reports/sales', SalesReports.router());
|
|
// app.use('/api/reports/purchases', PurchasesReports.router());
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/middleware/TenancyMiddleware.js":
|
|
/*!**************************************************!*\
|
|
!*** ./src/http/middleware/TenancyMiddleware.js ***!
|
|
\**************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* WEBPACK VAR INJECTION */(function(__dirname) {/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _system_TenantsManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/TenantsManager */ "./src/system/TenantsManager.js");
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
function loadModelsFromDirectory() {
|
|
var models = {};
|
|
fs__WEBPACK_IMPORTED_MODULE_3___default.a.readdirSync('src/models/').forEach(function (filename) {
|
|
var model = {
|
|
path: path__WEBPACK_IMPORTED_MODULE_4___default.a.join(__dirname, 'src/models/', filename),
|
|
name: filename.replace(/\.[^/.]+$/, '') };
|
|
|
|
// eslint-disable-next-line global-require
|
|
model.resource = __webpack_require__("./src/models sync recursive ^\\.\\/.*$")("./".concat(model.name));
|
|
models[model.name] = model;
|
|
});
|
|
return models;
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (/*#__PURE__*/(function () {var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res, next) {var organizationId, notFoundOrganization, tenant, knex, models;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
organizationId = req.headers['organization-id'] || req.query.organization;
|
|
notFoundOrganization = function notFoundOrganization() {return res.boom.unauthorized(
|
|
'Organization identication not found.',
|
|
{ errors: [{ type: 'ORGANIZATION.ID.NOT.FOUND', code: 100 }] });};if (
|
|
|
|
|
|
organizationId) {_context.next = 4;break;}return _context.abrupt("return",
|
|
notFoundOrganization());case 4:_context.next = 6;return (
|
|
|
|
_system_TenantsManager__WEBPACK_IMPORTED_MODULE_5__["default"].getTenant(organizationId));case 6:tenant = _context.sent;if (
|
|
|
|
|
|
tenant) {_context.next = 9;break;}return _context.abrupt("return",
|
|
notFoundOrganization());case 9:if (!(
|
|
|
|
|
|
tenant.id !== req.user.tenantId)) {_context.next = 11;break;}return _context.abrupt("return",
|
|
res.boom.unauthorized());case 11:
|
|
|
|
knex = _system_TenantsManager__WEBPACK_IMPORTED_MODULE_5__["default"].knexInstance(organizationId);
|
|
models = loadModelsFromDirectory();
|
|
|
|
_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"].knexBinded = knex;
|
|
|
|
req.knex = knex;
|
|
req.organizationId = organizationId;
|
|
req.models = _objectSpread({},
|
|
Object.values(models).reduce(function (acc, model) {
|
|
if (typeof model.resource["default"].requestModel === 'function' &&
|
|
model.resource["default"].requestModel() &&
|
|
model.name !== 'TenantModel') {
|
|
acc[model.name] = model.resource["default"].bindKnex(knex);
|
|
}
|
|
return acc;
|
|
}, {}));
|
|
|
|
next();case 18:case "end":return _context.stop();}}}, _callee);}));return function (_x, _x2, _x3) {return _ref.apply(this, arguments);};})());
|
|
/* WEBPACK VAR INJECTION */}.call(this, "/"))
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/middleware/asyncMiddleware.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/http/middleware/asyncMiddleware.js ***!
|
|
\************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
var asyncMiddleware = function asyncMiddleware(fn) {return function (req, res, next) {
|
|
Promise.resolve(fn(req, res, next))["catch"](
|
|
function (error) {
|
|
console.log(error);
|
|
next(error);
|
|
});
|
|
};};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (asyncMiddleware);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/http/middleware/jwtAuth.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/http/middleware/jwtAuth.js ***!
|
|
\****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jsonwebtoken */ "jsonwebtoken");
|
|
/* harmony import */ var jsonwebtoken__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jsonwebtoken__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js");
|
|
/* eslint-disable consistent-return */
|
|
|
|
|
|
|
|
var authMiddleware = function authMiddleware(req, res, next) {var
|
|
JWT_SECRET_KEY = process.env.JWT_SECRET_KEY;
|
|
var token = req.headers['x-access-token'] || req.query.token;
|
|
|
|
var onError = function onError() {res.boom.unauthorized();};
|
|
|
|
if (!token) {return onError();}
|
|
|
|
var verify = new Promise(function (resolve, reject) {
|
|
jsonwebtoken__WEBPACK_IMPORTED_MODULE_2___default.a.verify(token, JWT_SECRET_KEY, /*#__PURE__*/function () {var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(error, decoded) {return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:if (!
|
|
error) {_context.next = 4;break;}
|
|
reject(error);_context.next = 10;break;case 4:_context.next = 6;return (
|
|
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_3__["default"].query().findById(decoded._id));case 6:req.user = _context.sent;if (
|
|
|
|
req.user) {_context.next = 9;break;}return _context.abrupt("return",
|
|
onError());case 9:
|
|
|
|
resolve(decoded);case 10:case "end":return _context.stop();}}}, _callee);}));return function (_x, _x2) {return _ref.apply(this, arguments);};}());
|
|
|
|
|
|
});
|
|
|
|
verify.then(function () {next();})["catch"](onError);
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = (authMiddleware);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/Cachable/CachableModel.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/lib/Cachable/CachableModel.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js");
|
|
/* harmony import */ var _services_Cache__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/services/Cache */ "./src/services/Cache/index.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (function (Model) {
|
|
return (/*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CachableModel, _Model);function CachableModel() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CachableModel);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CachableModel).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CachableModel, null, [{ key: "flushCache", value: function flushCache(
|
|
key) {
|
|
var modelName = this.name;
|
|
|
|
if (key) {
|
|
_services_Cache__WEBPACK_IMPORTED_MODULE_6__["default"].del("".concat(modelName, ".").concat(key));
|
|
} else {
|
|
_services_Cache__WEBPACK_IMPORTED_MODULE_6__["default"].delStartWith(modelName);
|
|
}
|
|
} }]);return CachableModel;}(Model));
|
|
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/Cachable/CachableQueryBuilder.js":
|
|
/*!**************************************************!*\
|
|
!*** ./src/lib/Cachable/CachableQueryBuilder.js ***!
|
|
\**************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CachableQueryBuilder; });
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! crypto */ "crypto");
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_9__);
|
|
/* harmony import */ var _services_Cache__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/services/Cache */ "./src/services/Cache/index.js");
|
|
|
|
|
|
var
|
|
|
|
CachableQueryBuilder = /*#__PURE__*/function (_QueryBuilder) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(CachableQueryBuilder, _QueryBuilder);function CachableQueryBuilder() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, CachableQueryBuilder);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(CachableQueryBuilder).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(CachableQueryBuilder, [{ key: "then", value: function () {var _then = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee() {var _this = this;var _this$getOrStoreCache,_promise$then,promise,_args = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
|
|
|
|
// Flush model cache after insert, delete or update transaction.
|
|
if (this.isInsert() || this.isDelete() || this.isUpdate()) {
|
|
this.modelClass().flushCache();
|
|
}if (!(
|
|
this.cacheTag && this.isFind())) {_context.next = 6;break;}
|
|
this.setCacheKey();return _context.abrupt("return",
|
|
(_this$getOrStoreCache = this.getOrStoreCache()).then.apply(_this$getOrStoreCache, _args));case 6:
|
|
|
|
promise = this.execute();return _context.abrupt("return",
|
|
|
|
(_promise$then = promise.then(function (result) {
|
|
_this.setCache(result);
|
|
return result;
|
|
})).then.apply(_promise$then, _args));case 8:case "end":return _context.stop();}}}, _callee, this);}));function then() {return _then.apply(this, arguments);}return then;}() }, { key: "getOrStoreCache", value: function getOrStoreCache()
|
|
|
|
|
|
|
|
{var _this2 = this;
|
|
var storeFunction = function storeFunction() {return _this2.execute();};
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
_services_Cache__WEBPACK_IMPORTED_MODULE_10__["default"].get(_this2.cacheKey, storeFunction).
|
|
then(function (result) {resolve(result);});
|
|
});
|
|
} }, { key: "setCache", value: function setCache(
|
|
|
|
results) {
|
|
_services_Cache__WEBPACK_IMPORTED_MODULE_10__["default"].set("".concat(this.cacheKey), results, this.cacheSeconds);
|
|
} }, { key: "generateCacheKey", value: function generateCacheKey()
|
|
|
|
{
|
|
var knexSql = this.toKnexQuery().toSQL();
|
|
var hashedQuery = crypto__WEBPACK_IMPORTED_MODULE_9___default.a.createHash('md5').update(knexSql.sql).digest("hex");
|
|
|
|
return hashedQuery;
|
|
} }, { key: "remember", value: function remember(
|
|
|
|
key, seconds) {
|
|
var modelName = this.modelClass().name;
|
|
|
|
this.cacheSeconds = seconds;
|
|
this.cacheTag = key ? "".concat(modelName, ".").concat(key) : modelName;
|
|
|
|
return this;
|
|
} }, { key: "withGraphFetched", value: function withGraphFetched(
|
|
|
|
relation, settings) {
|
|
if (!this.graphAppends) {
|
|
this.graphAppends = [relation];
|
|
} else {
|
|
this.graphAppends.push(relation);
|
|
}
|
|
return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_6___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(CachableQueryBuilder.prototype), "withGraphFetched", this).call(this, relation, settings);
|
|
} }, { key: "setCacheKey", value: function setCacheKey()
|
|
|
|
{
|
|
var hashedQuery = this.generateCacheKey();
|
|
var appends = (this.graphAppends || []).join(this.graphAppends, ',');
|
|
|
|
this.cacheKey = "".concat(this.cacheTag, ".").concat(hashedQuery, ".").concat(appends);
|
|
} }]);return CachableQueryBuilder;}(objection__WEBPACK_IMPORTED_MODULE_8__["QueryBuilder"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DependencyGraph/index.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/lib/DependencyGraph/index.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/**
|
|
* A simple dependency graph
|
|
*/
|
|
|
|
/**
|
|
* Helper for creating a Topological Sort using Depth-First-Search on a set of edges.
|
|
*
|
|
* Detects cycles and throws an Error if one is detected (unless the "circular"
|
|
* parameter is "true" in which case it ignores them).
|
|
*
|
|
* @param edges The set of edges to DFS through
|
|
* @param leavesOnly Whether to only return "leaf" nodes (ones who have no edges)
|
|
* @param result An array in which the results will be populated
|
|
* @param circular A boolean to allow circular dependencies
|
|
*/
|
|
function createDFS(edges, leavesOnly, result, circular) {
|
|
var visited = {};
|
|
return function (start) {
|
|
if (visited[start]) {
|
|
return;
|
|
}
|
|
var inCurrentPath = {};
|
|
var currentPath = [];
|
|
var todo = []; // used as a stack
|
|
todo.push({ node: start, processed: false });
|
|
while (todo.length > 0) {
|
|
var current = todo[todo.length - 1]; // peek at the todo stack
|
|
var processed = current.processed;
|
|
var node = current.node;
|
|
if (!processed) {
|
|
// Haven't visited edges yet (visiting phase)
|
|
if (visited[node]) {
|
|
todo.pop();
|
|
continue;
|
|
} else if (inCurrentPath[node]) {
|
|
// It's not a DAG
|
|
if (circular) {
|
|
todo.pop();
|
|
// If we're tolerating cycles, don't revisit the node
|
|
continue;
|
|
}
|
|
currentPath.push(node);
|
|
throw new DepGraphCycleError(currentPath);
|
|
}
|
|
|
|
inCurrentPath[node] = true;
|
|
currentPath.push(node);
|
|
var nodeEdges = edges[node];
|
|
// (push edges onto the todo stack in reverse order to be order-compatible with the old DFS implementation)
|
|
for (var i = nodeEdges.length - 1; i >= 0; i--) {
|
|
todo.push({ node: nodeEdges[i], processed: false });
|
|
}
|
|
current.processed = true;
|
|
} else {
|
|
// Have visited edges (stack unrolling phase)
|
|
todo.pop();
|
|
currentPath.pop();
|
|
inCurrentPath[node] = false;
|
|
visited[node] = true;
|
|
if (!leavesOnly || edges[node].length === 0) {
|
|
result.push(node);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Simple Dependency Graph
|
|
*/
|
|
var DepGraph = DepGraph = function DepGraph(opts) {
|
|
this.nodes = {}; // Node -> Node/Data (treated like a Set)
|
|
this.outgoingEdges = {}; // Node -> [Dependency Node]
|
|
this.incomingEdges = {}; // Node -> [Dependant Node]
|
|
this.circular = opts && !!opts.circular; // Allows circular deps
|
|
};
|
|
|
|
DepGraph.fromArray = function (items) {var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { itemId: 'id', parentItemId: 'parent_id' };
|
|
var depGraph = new DepGraph();
|
|
|
|
items.forEach(function (item) {
|
|
depGraph.addNode(item[options.itemId], item);
|
|
});
|
|
items.forEach(function (item) {
|
|
if (item[options.parentItemId]) {
|
|
depGraph.addDependency(item[options.parentItemId], item[options.itemId]);
|
|
}
|
|
});
|
|
return depGraph;
|
|
};
|
|
|
|
DepGraph.prototype = {
|
|
/**
|
|
* The number of nodes in the graph.
|
|
*/
|
|
size: function size() {
|
|
return Object.keys(this.nodes).length;
|
|
},
|
|
/**
|
|
* Add a node to the dependency graph. If a node already exists, this method will do nothing.
|
|
*/
|
|
addNode: function addNode(node, data) {
|
|
if (!this.hasNode(node)) {
|
|
// Checking the arguments length allows the user to add a node with undefined data
|
|
if (arguments.length === 2) {
|
|
this.nodes[node] = data;
|
|
} else {
|
|
this.nodes[node] = node;
|
|
}
|
|
this.outgoingEdges[node] = [];
|
|
this.incomingEdges[node] = [];
|
|
}
|
|
},
|
|
/**
|
|
* Remove a node from the dependency graph. If a node does not exist, this method will do nothing.
|
|
*/
|
|
removeNode: function removeNode(node) {
|
|
if (this.hasNode(node)) {
|
|
delete this.nodes[node];
|
|
delete this.outgoingEdges[node];
|
|
delete this.incomingEdges[node];
|
|
[this.incomingEdges, this.outgoingEdges].forEach(function (edgeList) {
|
|
Object.keys(edgeList).forEach(function (key) {
|
|
var idx = edgeList[key].indexOf(node);
|
|
if (idx >= 0) {
|
|
edgeList[key].splice(idx, 1);
|
|
}
|
|
}, this);
|
|
});
|
|
}
|
|
},
|
|
/**
|
|
* Check if a node exists in the graph
|
|
*/
|
|
hasNode: function hasNode(node) {
|
|
return this.nodes.hasOwnProperty(node);
|
|
},
|
|
/**
|
|
* Get the data associated with a node name
|
|
*/
|
|
getNodeData: function getNodeData(node) {
|
|
if (this.hasNode(node)) {
|
|
return this.nodes[node];
|
|
} else {
|
|
throw new Error("Node does not exist: " + node);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Set the associated data for a given node name. If the node does not exist, this method will throw an error
|
|
*/
|
|
setNodeData: function setNodeData(node, data) {
|
|
if (this.hasNode(node)) {
|
|
this.nodes[node] = data;
|
|
} else {
|
|
throw new Error("Node does not exist: " + node);
|
|
}
|
|
},
|
|
/**
|
|
* Add a dependency between two nodes. If either of the nodes does not exist,
|
|
* an Error will be thrown.
|
|
*/
|
|
addDependency: function addDependency(from, to) {
|
|
if (!this.hasNode(from)) {
|
|
throw new Error("Node does not exist: " + from);
|
|
}
|
|
if (!this.hasNode(to)) {
|
|
throw new Error("Node does not exist: " + to);
|
|
}
|
|
if (this.outgoingEdges[from].indexOf(to) === -1) {
|
|
this.outgoingEdges[from].push(to);
|
|
}
|
|
if (this.incomingEdges[to].indexOf(from) === -1) {
|
|
this.incomingEdges[to].push(from);
|
|
}
|
|
return true;
|
|
},
|
|
/**
|
|
* Remove a dependency between two nodes.
|
|
*/
|
|
removeDependency: function removeDependency(from, to) {
|
|
var idx;
|
|
if (this.hasNode(from)) {
|
|
idx = this.outgoingEdges[from].indexOf(to);
|
|
if (idx >= 0) {
|
|
this.outgoingEdges[from].splice(idx, 1);
|
|
}
|
|
}
|
|
|
|
if (this.hasNode(to)) {
|
|
idx = this.incomingEdges[to].indexOf(from);
|
|
if (idx >= 0) {
|
|
this.incomingEdges[to].splice(idx, 1);
|
|
}
|
|
}
|
|
},
|
|
/**
|
|
* Return a clone of the dependency graph. If any custom data is attached
|
|
* to the nodes, it will only be shallow copied.
|
|
*/
|
|
clone: function clone() {
|
|
var source = this;
|
|
var result = new DepGraph();
|
|
var keys = Object.keys(source.nodes);
|
|
keys.forEach(function (n) {
|
|
result.nodes[n] = source.nodes[n];
|
|
result.outgoingEdges[n] = source.outgoingEdges[n].slice(0);
|
|
result.incomingEdges[n] = source.incomingEdges[n].slice(0);
|
|
});
|
|
return result;
|
|
},
|
|
/**
|
|
* Get an array containing the nodes that the specified node depends on (transitively).
|
|
*
|
|
* Throws an Error if the graph has a cycle, or the specified node does not exist.
|
|
*
|
|
* If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned
|
|
* in the array.
|
|
*/
|
|
dependenciesOf: function dependenciesOf(node, leavesOnly) {
|
|
if (this.hasNode(node)) {
|
|
var result = [];
|
|
var DFS = createDFS(
|
|
this.outgoingEdges,
|
|
leavesOnly,
|
|
result,
|
|
this.circular);
|
|
|
|
DFS(node);
|
|
var idx = result.indexOf(node);
|
|
if (idx >= 0) {
|
|
result.splice(idx, 1);
|
|
}
|
|
return result;
|
|
} else {
|
|
throw new Error("Node does not exist: " + node);
|
|
}
|
|
},
|
|
/**
|
|
* get an array containing the nodes that depend on the specified node (transitively).
|
|
*
|
|
* Throws an Error if the graph has a cycle, or the specified node does not exist.
|
|
*
|
|
* If `leavesOnly` is true, only nodes that do not have any dependants will be returned in the array.
|
|
*/
|
|
dependantsOf: function dependantsOf(node, leavesOnly) {
|
|
if (this.hasNode(node)) {
|
|
var result = [];
|
|
var DFS = createDFS(
|
|
this.incomingEdges,
|
|
leavesOnly,
|
|
result,
|
|
this.circular);
|
|
|
|
DFS(node);
|
|
var idx = result.indexOf(node);
|
|
if (idx >= 0) {
|
|
result.splice(idx, 1);
|
|
}
|
|
return result;
|
|
} else {
|
|
throw new Error("Node does not exist: " + node);
|
|
}
|
|
},
|
|
/**
|
|
* Construct the overall processing order for the dependency graph.
|
|
*
|
|
* Throws an Error if the graph has a cycle.
|
|
*
|
|
* If `leavesOnly` is true, only nodes that do not depend on any other nodes will be returned.
|
|
*/
|
|
overallOrder: function overallOrder(leavesOnly) {
|
|
var self = this;
|
|
var result = [];
|
|
var keys = Object.keys(this.nodes);
|
|
if (keys.length === 0) {
|
|
return result; // Empty graph
|
|
} else {
|
|
if (!this.circular) {
|
|
// Look for cycles - we run the DFS starting at all the nodes in case there
|
|
// are several disconnected subgraphs inside this dependency graph.
|
|
var CycleDFS = createDFS(this.outgoingEdges, false, [], this.circular);
|
|
keys.forEach(function (n) {
|
|
CycleDFS(n);
|
|
});
|
|
}
|
|
|
|
var DFS = createDFS(
|
|
this.outgoingEdges,
|
|
leavesOnly,
|
|
result,
|
|
this.circular);
|
|
|
|
// Find all potential starting points (nodes with nothing depending on them) an
|
|
// run a DFS starting at these points to get the order
|
|
keys.
|
|
filter(function (node) {
|
|
return self.incomingEdges[node].length === 0;
|
|
}).
|
|
forEach(function (n) {
|
|
DFS(n);
|
|
});
|
|
|
|
// If we're allowing cycles - we need to run the DFS against any remaining
|
|
// nodes that did not end up in the initial result (as they are part of a
|
|
// subgraph that does not have a clear starting point)
|
|
if (this.circular) {
|
|
keys.
|
|
filter(function (node) {
|
|
return result.indexOf(node) === -1;
|
|
}).
|
|
forEach(function (n) {
|
|
DFS(n);
|
|
});
|
|
}
|
|
|
|
return result;
|
|
}
|
|
},
|
|
|
|
mapNodes: function mapNodes(mapper) {
|
|
|
|
} };
|
|
|
|
|
|
/**
|
|
* Cycle error, including the path of the cycle.
|
|
*/
|
|
var DepGraphCycleError = exports.DepGraphCycleError = function (cyclePath) {
|
|
var message = "Dependency Cycle Found: " + cyclePath.join(" -> ");
|
|
var instance = new Error(message);
|
|
instance.cyclePath = cyclePath;
|
|
Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(instance, DepGraphCycleError);
|
|
}
|
|
return instance;
|
|
};
|
|
DepGraphCycleError.prototype = Object.create(Error.prototype, {
|
|
constructor: {
|
|
value: Error,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true } });
|
|
|
|
|
|
Object.setPrototypeOf(DepGraphCycleError, Error);
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (DepGraph);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DynamicFilter/DynamicFilter.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/lib/DynamicFilter/DynamicFilter.js ***!
|
|
\************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilter; });
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
|
|
var
|
|
|
|
DynamicFilter = /*#__PURE__*/function () {
|
|
/**
|
|
* Constructor.
|
|
* @param {String} tableName -
|
|
*/
|
|
function DynamicFilter(tableName) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, DynamicFilter);
|
|
this.tableName = tableName;
|
|
this.filters = [];
|
|
}
|
|
|
|
/**
|
|
* Set filter.
|
|
* @param {*} filterRole -
|
|
*/_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(DynamicFilter, [{ key: "setFilter", value: function setFilter(
|
|
filterRole) {
|
|
filterRole.setTableName(this.tableName);
|
|
this.filters.push(filterRole);
|
|
}
|
|
|
|
/**
|
|
* Builds queries of filter roles.
|
|
*/ }, { key: "buildQuery", value: function buildQuery()
|
|
{var _this = this;
|
|
var buildersCallbacks = [];
|
|
var tableColumns = [];
|
|
|
|
this.filters.forEach(function (filter) {var
|
|
filterRoles = filter.filterRoles;
|
|
buildersCallbacks.push(filter.buildQuery());
|
|
tableColumns.push.apply(tableColumns, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(Array.isArray(filterRoles) ? filterRoles : [filterRoles]));
|
|
});
|
|
return function (builder) {
|
|
buildersCallbacks.forEach(function (builderCallback) {
|
|
builderCallback(builder);
|
|
});
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_4__["buildFilterRolesJoins"])(_this.tableName, Object(lodash__WEBPACK_IMPORTED_MODULE_3__["uniqBy"])(tableColumns, 'columnKey'))(builder);
|
|
};
|
|
} }]);return DynamicFilter;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DynamicFilter/DynamicFilterFilterRoles.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./src/lib/DynamicFilter/DynamicFilterFilterRoles.js ***!
|
|
\***********************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FilterRoles; });
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/DynamicFilter/DynamicFilterRoleAbstructor */ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
var
|
|
|
|
FilterRoles = /*#__PURE__*/function (_DynamicFilterRoleAbs) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(FilterRoles, _DynamicFilterRoleAbs);
|
|
/**
|
|
* Constructor method.
|
|
* @param {Array} filterRoles -
|
|
* @param {Array} resourceFields -
|
|
*/
|
|
function FilterRoles(filterRoles, resourceFields) {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, FilterRoles);
|
|
_this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(FilterRoles).call(this));
|
|
|
|
_this.filterRoles = filterRoles.map(function (role, index) {return _objectSpread({},
|
|
role, {
|
|
index: index + 1,
|
|
columnKey: role.field_key,
|
|
condition: role.comparator === 'AND' ? '&&' : '||' });});
|
|
|
|
_this.resourceFields = resourceFields;return _this;
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(FilterRoles, [{ key: "validateFilterRoles", value: function validateFilterRoles()
|
|
|
|
{
|
|
var filterFieldsKeys = this.filterRoles.map(function (r) {return r.field_key;});
|
|
var resourceFieldsKeys = this.resourceFields.map(function (r) {return r.key;});
|
|
|
|
return Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filterFieldsKeys, resourceFieldsKeys);
|
|
}
|
|
|
|
// @private
|
|
}, { key: "buildLogicExpression", value: function buildLogicExpression() {
|
|
var expression = '';
|
|
this.filterRoles.forEach(function (role, index) {
|
|
expression += index === 0 ? "".concat(
|
|
role.index, " ") : "".concat(role.condition, " ").concat(role.index, " ");
|
|
});
|
|
return expression.trim();
|
|
}
|
|
|
|
/**
|
|
* Builds database query of view roles.
|
|
*/ }, { key: "buildQuery", value: function buildQuery()
|
|
{var _this2 = this;
|
|
return function (builder) {
|
|
var logicExpression = _this2.buildLogicExpression();
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_8__["buildFilterQuery"])(_this2.tableName, _this2.filterRoles, logicExpression)(builder);
|
|
};
|
|
} }]);return FilterRoles;}(_lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_7__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js":
|
|
/*!**************************************************************!*\
|
|
!*** ./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js ***!
|
|
\**************************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilterAbstructor; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
var
|
|
DynamicFilterAbstructor = /*#__PURE__*/function () {
|
|
function DynamicFilterAbstructor() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DynamicFilterAbstructor);
|
|
this.filterRoles = [];
|
|
this.tableName = '';
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DynamicFilterAbstructor, [{ key: "setTableName", value: function setTableName(
|
|
|
|
tableName) {
|
|
this.tableName = tableName;
|
|
}
|
|
|
|
/**
|
|
* @interface
|
|
*/
|
|
// eslint-disable-next-line class-methods-use-this
|
|
}, { key: "buildLogicExpression", value: function buildLogicExpression() {}
|
|
|
|
/**
|
|
* @interface
|
|
*/
|
|
// eslint-disable-next-line class-methods-use-this
|
|
}, { key: "validateFilterRoles", value: function validateFilterRoles() {}
|
|
|
|
/**
|
|
* @interface
|
|
*/
|
|
// eslint-disable-next-line class-methods-use-this
|
|
}, { key: "buildQuery", value: function buildQuery() {} }]);return DynamicFilterAbstructor;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DynamicFilter/DynamicFilterSortBy.js":
|
|
/*!******************************************************!*\
|
|
!*** ./src/lib/DynamicFilter/DynamicFilterSortBy.js ***!
|
|
\******************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilterSortBy; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/DynamicFilter/DynamicFilterRoleAbstructor */ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
|
|
var
|
|
|
|
DynamicFilterSortBy = /*#__PURE__*/function (_DynamicFilterRoleAbs) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DynamicFilterSortBy, _DynamicFilterRoleAbs);
|
|
|
|
function DynamicFilterSortBy(sortByFieldKey, sortDirection) {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DynamicFilterSortBy);
|
|
_this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DynamicFilterSortBy).call(this));
|
|
|
|
_this.filterRoles = {
|
|
columnKey: sortByFieldKey,
|
|
value: sortDirection,
|
|
comparator: 'sort_by' };return _this;
|
|
|
|
}
|
|
|
|
/**
|
|
* Builds database query of sort by column on the given direction.
|
|
*/_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DynamicFilterSortBy, [{ key: "buildQuery", value: function buildQuery()
|
|
{var _this2 = this;var _this$filterRoles =
|
|
this.filterRoles,_this$filterRoles$col = _this$filterRoles.columnKey,columnKey = _this$filterRoles$col === void 0 ? null : _this$filterRoles$col,_this$filterRoles$val = _this$filterRoles.value,value = _this$filterRoles$val === void 0 ? null : _this$filterRoles$val;
|
|
|
|
return function (builder) {
|
|
var fieldRelation = Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__["getRoleFieldColumn"])(_this2.tableName, columnKey);
|
|
if (columnKey) {
|
|
builder.orderBy("".concat(_this2.tableName, ".").concat(fieldRelation.column), value.toLowerCase());
|
|
}
|
|
};
|
|
} }]);return DynamicFilterSortBy;}(_lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DynamicFilter/DynamicFilterViews.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./src/lib/DynamicFilter/DynamicFilterViews.js ***!
|
|
\*****************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DynamicFilterViews; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/DynamicFilter/DynamicFilterRoleAbstructor */ "./src/lib/DynamicFilter/DynamicFilterRoleAbstructor.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
|
|
var
|
|
|
|
DynamicFilterViews = /*#__PURE__*/function (_DynamicFilterRoleAbs) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DynamicFilterViews, _DynamicFilterRoleAbs);
|
|
/**
|
|
* Constructor method.
|
|
* @param {*} filterRoles -
|
|
* @param {*} logicExpression -
|
|
*/
|
|
function DynamicFilterViews(filterRoles, logicExpression) {var _this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DynamicFilterViews);
|
|
_this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DynamicFilterViews).call(this));
|
|
|
|
_this.filterRoles = filterRoles;
|
|
_this.logicExpression = logicExpression.
|
|
replace('AND', '&&').
|
|
replace('OR', '||');
|
|
|
|
_this.tableName = '';return _this;
|
|
}
|
|
|
|
/**
|
|
* Retrieve logic expression.
|
|
*/_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DynamicFilterViews, [{ key: "buildLogicExpression", value: function buildLogicExpression()
|
|
{
|
|
return this.logicExpression;
|
|
}
|
|
|
|
/**
|
|
* Validates filter roles.
|
|
*/ }, { key: "validateFilterRoles", value: function validateFilterRoles()
|
|
{
|
|
return Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__["validateViewRoles"])(this.filterRoles, this.logicExpression);
|
|
}
|
|
|
|
/**
|
|
* Builds database query of view roles.
|
|
*/ }, { key: "buildQuery", value: function buildQuery()
|
|
{var _this2 = this;
|
|
return function (builder) {
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_6__["buildFilterQuery"])(_this2.tableName, _this2.filterRoles, _this2.logicExpression)(builder);
|
|
};
|
|
} }]);return DynamicFilterViews;}(_lib_DynamicFilter_DynamicFilterRoleAbstructor__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/DynamicFilter/index.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/lib/DynamicFilter/index.js ***!
|
|
\****************************************/
|
|
/*! exports provided: DynamicFilter, DynamicFilterSortBy, DynamicFilterViews, DynamicFilterFilterRoles */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _DynamicFilter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DynamicFilter */ "./src/lib/DynamicFilter/DynamicFilter.js");
|
|
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilter", function() { return _DynamicFilter__WEBPACK_IMPORTED_MODULE_0__["default"]; });
|
|
|
|
/* harmony import */ var _DynamicFilterSortBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DynamicFilterSortBy */ "./src/lib/DynamicFilter/DynamicFilterSortBy.js");
|
|
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilterSortBy", function() { return _DynamicFilterSortBy__WEBPACK_IMPORTED_MODULE_1__["default"]; });
|
|
|
|
/* harmony import */ var _DynamicFilterViews__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DynamicFilterViews */ "./src/lib/DynamicFilter/DynamicFilterViews.js");
|
|
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilterViews", function() { return _DynamicFilterViews__WEBPACK_IMPORTED_MODULE_2__["default"]; });
|
|
|
|
/* harmony import */ var _DynamicFilterFilterRoles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DynamicFilterFilterRoles */ "./src/lib/DynamicFilter/DynamicFilterFilterRoles.js");
|
|
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DynamicFilterFilterRoles", function() { return _DynamicFilterFilterRoles__WEBPACK_IMPORTED_MODULE_3__["default"]; });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/LogicEvaluation/Lexer.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/lib/LogicEvaluation/Lexer.js ***!
|
|
\******************************************/
|
|
/*! exports provided: Lexer, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Lexer", function() { return Lexer; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return token; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
|
|
var OperationType = {
|
|
LOGIC: 'LOGIC',
|
|
STRING: 'STRING',
|
|
COMPARISON: 'COMPARISON',
|
|
MATH: 'MATH' };
|
|
|
|
|
|
var Lexer = /*#__PURE__*/function () {_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Lexer, null, [{ key: "optable",
|
|
// operation table
|
|
get: function get() {
|
|
return {
|
|
'=': OperationType.LOGIC,
|
|
'&': OperationType.LOGIC,
|
|
'|': OperationType.LOGIC,
|
|
'?': OperationType.LOGIC,
|
|
':': OperationType.LOGIC,
|
|
|
|
'\'': OperationType.STRING,
|
|
'"': OperationType.STRING,
|
|
|
|
'!': OperationType.COMPARISON,
|
|
'>': OperationType.COMPARISON,
|
|
'<': OperationType.COMPARISON,
|
|
|
|
'(': OperationType.MATH,
|
|
')': OperationType.MATH,
|
|
'+': OperationType.MATH,
|
|
'-': OperationType.MATH,
|
|
'*': OperationType.MATH,
|
|
'/': OperationType.MATH,
|
|
'%': OperationType.MATH };
|
|
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param {*} expression -
|
|
*/ }]);
|
|
function Lexer(expression) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Lexer);
|
|
this.currentIndex = 0;
|
|
this.input = expression;
|
|
this.tokenList = [];
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Lexer, [{ key: "getTokens", value: function getTokens()
|
|
|
|
{
|
|
var tok;
|
|
do {
|
|
// read current token, so step should be -1
|
|
tok = this.pickNext(-1);
|
|
var pos = this.currentIndex;
|
|
switch (Lexer.optable[tok]) {
|
|
case OperationType.LOGIC:
|
|
// == && || ===
|
|
this.readLogicOpt(tok);
|
|
break;
|
|
|
|
case OperationType.STRING:
|
|
this.readString(tok);
|
|
break;
|
|
|
|
case OperationType.COMPARISON:
|
|
this.readCompare(tok);
|
|
break;
|
|
|
|
case OperationType.MATH:
|
|
this.receiveToken();
|
|
break;
|
|
|
|
default:
|
|
this.readValue(tok);}
|
|
|
|
|
|
// if the pos not changed, this loop will go into a infinite loop, every step of while loop,
|
|
// we must move the pos forward
|
|
// so here we should throw error, for example `1 & 2`
|
|
if (pos === this.currentIndex && tok !== undefined) {
|
|
var err = new Error("unkonw token ".concat(tok, " from input string ").concat(this.input));
|
|
err.name = 'UnknowToken';
|
|
throw err;
|
|
}
|
|
} while (tok !== undefined);
|
|
|
|
return this.tokenList;
|
|
}
|
|
|
|
/**
|
|
* read next token, the index param can set next step, default go foward 1 step
|
|
*
|
|
* @param index next postion
|
|
*/ }, { key: "pickNext", value: function pickNext()
|
|
{var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
return this.input[index + this.currentIndex + 1];
|
|
}
|
|
|
|
/**
|
|
* Store token into result tokenList, and move the pos index
|
|
*
|
|
* @param index
|
|
*/ }, { key: "receiveToken", value: function receiveToken()
|
|
{var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
|
|
var tok = this.input.slice(this.currentIndex, this.currentIndex + index).trim();
|
|
// skip empty string
|
|
if (tok) {
|
|
this.tokenList.push(tok);
|
|
}
|
|
|
|
this.currentIndex += index;
|
|
}
|
|
|
|
// ' or "
|
|
}, { key: "readString", value: function readString(tok) {
|
|
var next;
|
|
var index = 0;
|
|
do {
|
|
next = this.pickNext(index);
|
|
index += 1;
|
|
} while (next !== tok && next !== undefined);
|
|
this.receiveToken(index + 1);
|
|
}
|
|
|
|
// > or < or >= or <= or !==
|
|
// tok in (>, <, !)
|
|
}, { key: "readCompare", value: function readCompare(tok) {
|
|
if (this.pickNext() !== '=') {
|
|
this.receiveToken(1);
|
|
return;
|
|
}
|
|
// !==
|
|
if (tok === '!' && this.pickNext(1) === '=') {
|
|
this.receiveToken(3);
|
|
return;
|
|
}
|
|
this.receiveToken(2);
|
|
}
|
|
|
|
// === or ==
|
|
// && ||
|
|
}, { key: "readLogicOpt", value: function readLogicOpt(tok) {
|
|
if (this.pickNext() === tok) {
|
|
// ===
|
|
if (tok === '=' && this.pickNext(1) === tok) {
|
|
return this.receiveToken(3);
|
|
}
|
|
// == && ||
|
|
return this.receiveToken(2);
|
|
}
|
|
// handle as &&
|
|
// a ? b : c is equal to a && b || c
|
|
if (tok === '?' || tok === ':') {
|
|
return this.receiveToken(1);
|
|
}
|
|
} }, { key: "readValue", value: function readValue(
|
|
|
|
tok) {
|
|
if (!tok) {
|
|
return;
|
|
}
|
|
|
|
var index = 0;
|
|
while (!Lexer.optable[tok] && tok !== undefined) {
|
|
tok = this.pickNext(index);
|
|
index += 1;
|
|
}
|
|
this.receiveToken(index);
|
|
} }]);return Lexer;}();
|
|
|
|
|
|
function token(expression) {
|
|
var lexer = new Lexer(expression);
|
|
return lexer.getTokens();
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/LogicEvaluation/Parser.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/lib/LogicEvaluation/Parser.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: OPERATION, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OPERATION", function() { return OPERATION; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Parser; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
var OPERATION = {
|
|
'!': 5,
|
|
'*': 4,
|
|
'/': 4,
|
|
'%': 4,
|
|
'+': 3,
|
|
'-': 3,
|
|
'>': 2,
|
|
'<': 2,
|
|
'>=': 2,
|
|
'<=': 2,
|
|
'===': 2,
|
|
'!==': 2,
|
|
'==': 2,
|
|
'!=': 2,
|
|
'&&': 1,
|
|
'||': 1,
|
|
'?': 1,
|
|
':': 1 };
|
|
|
|
|
|
// export interface Node {
|
|
// left: Node | string | null;
|
|
// right: Node | string | null;
|
|
// operation: string;
|
|
// grouped?: boolean;
|
|
// };
|
|
var
|
|
Parser = /*#__PURE__*/function () {
|
|
|
|
function Parser(token) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Parser);
|
|
this.index = -1;
|
|
this.blockLevel = 0;
|
|
this.token = token;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return {Node | string} =-
|
|
*/_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Parser, [{ key: "parse", value: function parse()
|
|
{
|
|
var tok;
|
|
var root = {
|
|
left: null,
|
|
right: null,
|
|
operation: null };
|
|
|
|
|
|
do {
|
|
tok = this.parseStatement();
|
|
|
|
if (tok === null || tok === undefined) {
|
|
break;
|
|
}
|
|
|
|
if (root.left === null) {
|
|
root.left = tok;
|
|
root.operation = this.nextToken();
|
|
|
|
if (!root.operation) {
|
|
return tok;
|
|
}
|
|
|
|
root.right = this.parseStatement();
|
|
} else {
|
|
if (typeof tok !== 'string') {
|
|
throw new Error('operation must be string, but get ' + JSON.stringify(tok));
|
|
}
|
|
root = this.addNode(tok, this.parseStatement(), root);
|
|
}
|
|
} while (tok);
|
|
|
|
return root;
|
|
} }, { key: "nextToken", value: function nextToken()
|
|
|
|
{
|
|
this.index += 1;
|
|
return this.token[this.index];
|
|
} }, { key: "prevToken", value: function prevToken()
|
|
|
|
{
|
|
return this.token[this.index - 1];
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} operation
|
|
* @param {Node|String|null} right
|
|
* @param {Node} root
|
|
*/ }, { key: "addNode", value: function addNode(
|
|
operation, right, root) {
|
|
var pre = root;
|
|
|
|
if (this.compare(pre.operation, operation) < 0 && !pre.grouped) {
|
|
|
|
while (pre.right !== null &&
|
|
typeof pre.right !== 'string' &&
|
|
this.compare(pre.right.operation, operation) < 0 && !pre.right.grouped) {
|
|
pre = pre.right;
|
|
}
|
|
|
|
pre.right = {
|
|
operation: operation,
|
|
left: pre.right,
|
|
right: right };
|
|
|
|
return root;
|
|
}
|
|
return {
|
|
left: pre,
|
|
right: right,
|
|
operation: operation };
|
|
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {String} a
|
|
* @param {String} b
|
|
*/ }, { key: "compare", value: function compare(
|
|
a, b) {
|
|
if (!OPERATION.hasOwnProperty(a) || !OPERATION.hasOwnProperty(b)) {
|
|
throw new Error("unknow operation ".concat(a, " or ").concat(b));
|
|
}
|
|
return OPERATION[a] - OPERATION[b];
|
|
}
|
|
|
|
/**
|
|
* @return string | Node | null
|
|
*/ }, { key: "parseStatement", value: function parseStatement()
|
|
{
|
|
var token = this.nextToken();
|
|
if (token === '(') {
|
|
this.blockLevel += 1;
|
|
var node = this.parse();
|
|
this.blockLevel -= 1;
|
|
|
|
if (typeof node !== 'string') {
|
|
node.grouped = true;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
if (token === ')') {
|
|
return null;
|
|
}
|
|
|
|
if (token === '!') {
|
|
return { left: null, operation: token, right: this.parseStatement() };
|
|
}
|
|
|
|
// 3 > -12 or -12 + 10
|
|
if (token === '-' && (OPERATION[this.prevToken()] > 0 || this.prevToken() === undefined)) {
|
|
return { left: '0', operation: token, right: this.parseStatement(), grouped: true };
|
|
}
|
|
|
|
return token;
|
|
} }]);return Parser;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/LogicEvaluation/QueryParser.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/lib/LogicEvaluation/QueryParser.js ***!
|
|
\************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return QueryParser; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _Parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Parser */ "./src/lib/LogicEvaluation/Parser.js");
|
|
var
|
|
|
|
QueryParser = /*#__PURE__*/function () {
|
|
|
|
function QueryParser(tree, queries) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, QueryParser);
|
|
this.tree = tree;
|
|
this.queries = queries;
|
|
this.query = null;
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(QueryParser, [{ key: "setQuery", value: function setQuery(
|
|
|
|
query) {
|
|
this.query = query.clone();
|
|
} }, { key: "parse", value: function parse()
|
|
|
|
{
|
|
return this.parseNode(this.tree);
|
|
} }, { key: "parseNode", value: function parseNode(
|
|
|
|
node) {
|
|
if (typeof node === 'string') {
|
|
var nodeQuery = this.getQuery(node);
|
|
return function (query) {nodeQuery(query);};
|
|
}
|
|
if (_Parser__WEBPACK_IMPORTED_MODULE_2__["OPERATION"][node.operation] === undefined) {
|
|
throw new Error("unknow expression ".concat(node.operation));
|
|
}
|
|
var leftQuery = this.getQuery(node.left);
|
|
var rightQuery = this.getQuery(node.right);
|
|
|
|
switch (node.operation) {
|
|
case '&&':
|
|
case 'AND':
|
|
default:
|
|
return function (nodeQuery) {return nodeQuery.where(function (query) {
|
|
query.where(function (q) {leftQuery(q);});
|
|
query.andWhere(function (q) {rightQuery(q);});
|
|
});};
|
|
case '||':
|
|
case 'OR':
|
|
return function (nodeQuery) {return nodeQuery.where(function (query) {
|
|
query.where(function (q) {leftQuery(q);});
|
|
query.orWhere(function (q) {rightQuery(q);});
|
|
});};}
|
|
|
|
} }, { key: "getQuery", value: function getQuery(
|
|
|
|
node) {
|
|
if (typeof node !== 'string' && node !== null) {
|
|
return this.parseNode(node);
|
|
}
|
|
var value = parseFloat(node);
|
|
|
|
if (!isNaN(value)) {
|
|
if (typeof this.queries[node] === 'undefined') {
|
|
throw new Error("unknow query under index ".concat(node));
|
|
}
|
|
return this.queries[node];
|
|
}
|
|
return null;
|
|
} }]);return QueryParser;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/Metable/MetableCollection.js":
|
|
/*!**********************************************!*\
|
|
!*** ./src/lib/Metable/MetableCollection.js ***!
|
|
\**********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MetableCollection; });
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "@babel/runtime/helpers/typeof");
|
|
/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
|
|
/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6__);
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}var
|
|
MetableCollection = /*#__PURE__*/function () {
|
|
/**
|
|
* Constructor method.
|
|
*/
|
|
function MetableCollection() {var _this = this;_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_5___default()(this, MetableCollection);
|
|
this.metadata = [];
|
|
this.KEY_COLUMN = 'key';
|
|
this.VALUE_COLUMN = 'value';
|
|
this.TYPE_COLUMN = 'type';
|
|
this.model = null;
|
|
this.extraColumns = [];
|
|
|
|
this.extraQuery = function (query, meta) {
|
|
query.where('key', meta[_this.KEY_COLUMN]);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Set model of this metadata collection.
|
|
* @param {Object} model -
|
|
*/_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_6___default()(MetableCollection, [{ key: "setModel", value: function setModel(
|
|
model) {
|
|
this.model = model;
|
|
}
|
|
|
|
/**
|
|
* Sets a extra columns.
|
|
* @param {Array} columns -
|
|
*/ }, { key: "setExtraColumns", value: function setExtraColumns(
|
|
columns) {
|
|
this.extraColumns = columns;
|
|
}
|
|
|
|
/**
|
|
* Find the given metadata key.
|
|
* @param {String} key -
|
|
* @return {object} - Metadata object.
|
|
*/ }, { key: "findMeta", value: function findMeta(
|
|
payload) {var _this2 = this;var _this$parsePayload =
|
|
this.parsePayload(payload),key = _this$parsePayload.key,extraColumns = _this$parsePayload.extraColumns;
|
|
|
|
return this.allMetadata().find(function (meta) {
|
|
var isSameKey = meta.key === key;
|
|
var sameExtraColumns = _this2.extraColumns.some(function (extraColumn) {
|
|
return !extraColumns || extraColumns[extraColumn] === meta[extraColumn];
|
|
});
|
|
return isSameKey && sameExtraColumns;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Retrieve all metadata.
|
|
*/ }, { key: "allMetadata", value: function allMetadata()
|
|
{
|
|
return this.metadata.filter(function (meta) {return !meta.markAsDeleted;});
|
|
}
|
|
|
|
/**
|
|
* Retrieve metadata of the given key.
|
|
* @param {String} key -
|
|
* @param {Mixied} defaultValue -
|
|
*/ }, { key: "getMeta", value: function getMeta(
|
|
payload, defaultValue) {
|
|
var metadata = this.findMeta(payload);
|
|
return metadata ? metadata.value : defaultValue || false;
|
|
}
|
|
|
|
/**
|
|
* Markes the metadata to should be deleted.
|
|
* @param {String} key -
|
|
*/ }, { key: "removeMeta", value: function removeMeta(
|
|
key) {
|
|
var metadata = this.findMeta(key);
|
|
|
|
if (metadata) {
|
|
metadata.markAsDeleted = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove all meta data of the given group.
|
|
* @param {*} group
|
|
*/ }, { key: "removeAllMeta", value: function removeAllMeta()
|
|
{var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default';
|
|
this.metadata = this.metadata.map(function (meta) {return _objectSpread({},
|
|
meta, {
|
|
markAsDeleted: true });});
|
|
|
|
} }, { key: "setExtraQuery", value: function setExtraQuery(
|
|
|
|
callback) {
|
|
this.extraQuery = callback;
|
|
}
|
|
|
|
/**
|
|
* Set the meta data to the stack.
|
|
* @param {String} key -
|
|
* @param {String} value -
|
|
*/ }, { key: "setMeta", value: function setMeta(
|
|
payload) {var _this3 = this;
|
|
if (Array.isArray(key)) {
|
|
var _metadata = key;
|
|
|
|
_metadata.forEach(function (meta) {
|
|
_this3.setMeta(meta.key, meta.value);
|
|
});
|
|
return;
|
|
}var _this$parsePayload2 =
|
|
this.parsePayload(payload, arguments.length <= 1 ? undefined : arguments[1]),key = _this$parsePayload2.key,value = _this$parsePayload2.value,extraColumns = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3___default()(_this$parsePayload2, ["key", "value"]);
|
|
var metadata = this.findMeta(payload);
|
|
|
|
if (metadata) {
|
|
metadata.value = value;
|
|
metadata.markAsUpdated = true;
|
|
} else {
|
|
this.metadata.push(_objectSpread({
|
|
value: value, key: key }, extraColumns, { markAsInserted: true }));
|
|
|
|
}
|
|
} }, { key: "parsePayload", value: function parsePayload(
|
|
|
|
payload, value) {
|
|
return _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default()(payload) !== 'object' ? { key: payload, value: value } : _objectSpread({}, payload);
|
|
}
|
|
|
|
/**
|
|
* Saved the modified/deleted and inserted metadata.
|
|
*/ }, { key: "saveMeta", value: function () {var _saveMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee() {var _this4 = this;var inserted, updated, deleted, opers;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
|
|
inserted = this.metadata.filter(function (m) {return m.markAsInserted === true;});
|
|
updated = this.metadata.filter(function (m) {return m.markAsUpdated === true;});
|
|
deleted = this.metadata.filter(function (m) {return m.markAsDeleted === true;});
|
|
opers = [];
|
|
|
|
if (deleted.length > 0) {
|
|
deleted.forEach(function (meta) {
|
|
var deleteOper = _this4.model.query().onBuild(function (query, result) {
|
|
_this4.extraQuery(query, meta);
|
|
return result;
|
|
})["delete"]();
|
|
opers.push(deleteOper);
|
|
});
|
|
}
|
|
inserted.forEach(function (meta) {var _objectSpread2;
|
|
var insertOper = _this4.model.query().insert(_objectSpread((_objectSpread2 = {}, _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(_objectSpread2,
|
|
_this4.KEY_COLUMN, meta.key), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()(_objectSpread2,
|
|
_this4.VALUE_COLUMN, meta.value), _objectSpread2),
|
|
_this4.extraColumns.reduce(function (obj, column) {
|
|
if (typeof meta[column] !== 'undefined') {
|
|
obj[column] = meta[column];
|
|
}
|
|
return obj;
|
|
}, {})));
|
|
|
|
opers.push(insertOper);
|
|
});
|
|
updated.forEach(function (meta) {
|
|
var updateOper = _this4.model.query().onBuild(function (query) {
|
|
_this4.extraQuery(query, meta);
|
|
}).patch(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()({},
|
|
_this4.VALUE_COLUMN, meta.value));
|
|
|
|
opers.push(updateOper);
|
|
});_context.next = 9;return (
|
|
Promise.all(opers));case 9:case "end":return _context.stop();}}}, _callee, this);}));function saveMeta() {return _saveMeta.apply(this, arguments);}return saveMeta;}()
|
|
|
|
|
|
/**
|
|
* Loads the metadata from the storage.
|
|
* @param {String|Array} key -
|
|
* @param {Boolean} force -
|
|
*/ }, { key: "load", value: function () {var _load = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2() {var _this5 = this;var metadata, metadataArray;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_context2.next = 2;return (
|
|
|
|
this.query());case 2:metadata = _context2.sent;
|
|
|
|
metadataArray = this.mapMetadataCollection(metadata);
|
|
metadataArray.forEach(function (meta) {
|
|
_this5.metadata.push(meta);
|
|
});case 5:case "end":return _context2.stop();}}}, _callee2, this);}));function load() {return _load.apply(this, arguments);}return load;}()
|
|
|
|
|
|
/**
|
|
* Format the metadata before saving to the database.
|
|
* @param {String|Number|Boolean} value -
|
|
* @param {String} valueType -
|
|
* @return {String|Number|Boolean} -
|
|
*/ }, { key: "mapMetadata",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Mapping and parse metadata to collection entries.
|
|
* @param {Meta} attr -
|
|
* @param {String} parseType -
|
|
*/value: function mapMetadata(
|
|
attr) {var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse';
|
|
return _objectSpread({
|
|
key: attr[this.KEY_COLUMN],
|
|
value: parseType === 'parse' ?
|
|
MetableCollection.parseMetaValue(
|
|
attr[this.VALUE_COLUMN],
|
|
this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) :
|
|
|
|
MetableCollection.formatMetaValue(
|
|
attr[this.VALUE_COLUMN],
|
|
this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) },
|
|
|
|
this.extraColumns.map(function (extraCol) {return _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_4___default()({},
|
|
extraCol, attr[extraCol] || null);}));
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
* Parse the metadata to the collection.
|
|
* @param {Array} collection -
|
|
*/ }, { key: "mapMetadataToCollection", value: function mapMetadataToCollection(
|
|
metadata) {var _this6 = this;var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse';
|
|
return metadata.map(function (model) {return _this6.mapMetadataToCollection(model, parseType);});
|
|
}
|
|
|
|
/**
|
|
* Load metadata to the metable collection.
|
|
* @param {Array} meta -
|
|
*/ }, { key: "from", value: function from(
|
|
meta) {var _this7 = this;
|
|
if (Array.isArray(meta)) {
|
|
meta.forEach(function (m) {_this7.from(m);});
|
|
return;
|
|
}
|
|
this.metadata.push(meta);
|
|
} }, { key: "toArray", value: function toArray()
|
|
|
|
{
|
|
return this.metadata;
|
|
}
|
|
|
|
/**
|
|
* Static method to load metadata to the collection.
|
|
* @param {Array} meta
|
|
*/ }], [{ key: "formatMetaValue", value: function formatMetaValue(value, valueType) {var parsedValue;switch (valueType) {case 'number':parsedValue = "".concat(value);break;case 'boolean':parsedValue = value ? '1' : '0';break;case 'json':parsedValue = JSON.stringify(parsedValue);break;default:parsedValue = value;break;}return parsedValue;} }, { key: "from", value: function from(
|
|
meta) {
|
|
var collection = new MetableCollection();
|
|
collection.from(meta);
|
|
|
|
return collection;
|
|
} }]);return MetableCollection;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/lib/ViewRolesBuilder/index.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/lib/ViewRolesBuilder/index.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: getRoleFieldColumn, buildRoleQuery, getTableFromRelationColumn, buildFilterRolesJoins, buildSortColumnJoin, buildFilterRolesQuery, buildFilterQuery, validateFilterLogicExpression, validateViewRoles, mapViewRolesToConditionals, mapFilterRolesToDynamicFilter, buildSortColumnQuery */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRoleFieldColumn", function() { return getRoleFieldColumn; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildRoleQuery", function() { return buildRoleQuery; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTableFromRelationColumn", function() { return getTableFromRelationColumn; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFilterRolesJoins", function() { return buildFilterRolesJoins; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildSortColumnJoin", function() { return buildSortColumnJoin; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFilterRolesQuery", function() { return buildFilterRolesQuery; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFilterQuery", function() { return buildFilterQuery; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateFilterLogicExpression", function() { return validateFilterLogicExpression; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateViewRoles", function() { return validateViewRoles; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapViewRolesToConditionals", function() { return mapViewRolesToConditionals; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapFilterRolesToDynamicFilter", function() { return mapFilterRolesToDynamicFilter; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildSortColumnQuery", function() { return buildSortColumnQuery; });
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _lib_LogicEvaluation_Lexer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/LogicEvaluation/Lexer */ "./src/lib/LogicEvaluation/Lexer.js");
|
|
/* harmony import */ var _lib_LogicEvaluation_Parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/LogicEvaluation/Parser */ "./src/lib/LogicEvaluation/Parser.js");
|
|
/* harmony import */ var _lib_LogicEvaluation_QueryParser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/LogicEvaluation/QueryParser */ "./src/lib/LogicEvaluation/QueryParser.js");
|
|
/* harmony import */ var _data_ResourceFieldsKeys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/ResourceFieldsKeys */ "./src/data/ResourceFieldsKeys.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
// const role = {
|
|
// compatotor: String,
|
|
// value: String,
|
|
// columnKey: String,
|
|
// columnSlug: String,
|
|
// index: Number,
|
|
// }
|
|
|
|
/**
|
|
* Get field column metadata and its relation with other tables.
|
|
* @param {String} tableName - Table name of target column.
|
|
* @param {String} columnKey - Target column key that stored in resource field.
|
|
*/
|
|
function getRoleFieldColumn(tableName, columnKey) {
|
|
var tableFields = _data_ResourceFieldsKeys__WEBPACK_IMPORTED_MODULE_5__["default"][tableName];
|
|
return tableFields[columnKey] ? tableFields[columnKey] : null;
|
|
}
|
|
|
|
/**
|
|
* Builds roles queries.
|
|
* @param {String} tableName -
|
|
* @param {Object} role -
|
|
*/
|
|
function buildRoleQuery(tableName, role) {
|
|
var fieldRelation = getRoleFieldColumn(tableName, role.columnKey);
|
|
var comparatorColumn = fieldRelation.relationColumn || "".concat(tableName, ".").concat(fieldRelation.column);
|
|
|
|
switch (role.comparator) {
|
|
case 'equals':
|
|
default:
|
|
return function (builder) {
|
|
builder.where(comparatorColumn, role.value);
|
|
};
|
|
case 'not_equal':
|
|
case 'not_equals':
|
|
return function (builder) {
|
|
builder.whereNot(comparatorColumn, role.value);
|
|
};
|
|
case 'contain':
|
|
case 'contains':
|
|
return function (builder) {
|
|
builder.where(comparatorColumn, 'LIKE', "%".concat(role.value, "%"));
|
|
};}
|
|
|
|
}
|
|
|
|
/**
|
|
* Extract relation table name from relation.
|
|
* @param {String} column -
|
|
* @return {String} - join relation table.
|
|
*/
|
|
var getTableFromRelationColumn = function getTableFromRelationColumn(column) {
|
|
var splitedColumn = column.split('.');
|
|
return splitedColumn.length > 0 ? splitedColumn[0] : '';
|
|
};
|
|
|
|
/**
|
|
* Builds view roles join queries.
|
|
* @param {String} tableName -
|
|
* @param {Array} roles -
|
|
*/
|
|
function buildFilterRolesJoins(tableName, roles) {
|
|
return function (builder) {
|
|
roles.forEach(function (role) {
|
|
var fieldColumn = getRoleFieldColumn(tableName, role.columnKey);
|
|
|
|
if (fieldColumn.relation) {
|
|
var joinTable = getTableFromRelationColumn(fieldColumn.relation);
|
|
builder.join(joinTable, "".concat(tableName, ".").concat(fieldColumn.column), '=', fieldColumn.relation);
|
|
}
|
|
});
|
|
};
|
|
}
|
|
|
|
function buildSortColumnJoin(tableName, sortColumnKey) {
|
|
return function (builder) {
|
|
var fieldColumn = getRoleFieldColumn(tableName, sortColumnKey);
|
|
|
|
if (fieldColumn.relation) {
|
|
var joinTable = getTableFromRelationColumn(fieldColumn.relation);
|
|
builder.join(joinTable, "".concat(tableName, ".").concat(fieldColumn.column), '=', fieldColumn.relation);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Builds database query from stored view roles.
|
|
*
|
|
* @param {Array} roles -
|
|
* @return {Function}
|
|
*/
|
|
function buildFilterRolesQuery(tableName, roles) {var logicExpression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
|
var rolesIndexSet = {};
|
|
|
|
roles.forEach(function (role) {
|
|
rolesIndexSet[role.index] = buildRoleQuery(tableName, role);
|
|
});
|
|
// Lexer for logic expression.
|
|
var lexer = new _lib_LogicEvaluation_Lexer__WEBPACK_IMPORTED_MODULE_2__["Lexer"](logicExpression);
|
|
var tokens = lexer.getTokens();
|
|
|
|
// Parse the logic expression.
|
|
var parser = new _lib_LogicEvaluation_Parser__WEBPACK_IMPORTED_MODULE_3__["default"](tokens);
|
|
var parsedTree = parser.parse();
|
|
|
|
var queryParser = new _lib_LogicEvaluation_QueryParser__WEBPACK_IMPORTED_MODULE_4__["default"](parsedTree, rolesIndexSet);
|
|
return queryParser.parse();
|
|
}
|
|
|
|
/**
|
|
* Builds filter query for query builder.
|
|
* @param {String} tableName -
|
|
* @param {Array} roles -
|
|
* @param {String} logicExpression -
|
|
*/
|
|
var buildFilterQuery = function buildFilterQuery(tableName, roles, logicExpression) {
|
|
return function (builder) {
|
|
buildFilterRolesQuery(tableName, roles, logicExpression)(builder);
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Validates the view logic expression.
|
|
* @param {String} logicExpression -
|
|
* @param {Array} indexes -
|
|
*/
|
|
function validateFilterLogicExpression(logicExpression, indexes) {
|
|
var logicExpIndexes = logicExpression.match(/\d+/g) || [];
|
|
return !Object(lodash__WEBPACK_IMPORTED_MODULE_1__["difference"])(logicExpIndexes.map(Number), indexes).length;
|
|
}
|
|
|
|
/**
|
|
* Validates view roles.
|
|
* @param {Array} roles -
|
|
* @param {String} logicExpression -
|
|
* @return {Boolean}
|
|
*/
|
|
function validateViewRoles(roles, logicExpression) {
|
|
return validateFilterLogicExpression(logicExpression, roles.map(function (r) {return r.index;}));
|
|
}
|
|
|
|
/**
|
|
* Mapes the view roles to view conditionals.
|
|
* @param {Array} viewRoles -
|
|
* @return {Array}
|
|
*/
|
|
function mapViewRolesToConditionals(viewRoles) {
|
|
return viewRoles.map(function (viewRole) {return {
|
|
comparator: viewRole.comparator,
|
|
value: viewRole.value,
|
|
columnKey: viewRole.field.key,
|
|
slug: viewRole.field.slug,
|
|
index: viewRole.index };});
|
|
|
|
}
|
|
|
|
|
|
function mapFilterRolesToDynamicFilter(roles) {
|
|
return roles.map(function (role) {return _objectSpread({},
|
|
role, {
|
|
columnKey: role.fieldKey });});
|
|
|
|
}
|
|
|
|
/**
|
|
* Builds sort column query.
|
|
* @param {String} tableName -
|
|
* @param {String} columnKey -
|
|
* @param {String} sortDirection -
|
|
*/
|
|
function buildSortColumnQuery(tableName, columnKey, sortDirection) {
|
|
var fieldRelation = getRoleFieldColumn(tableName, columnKey);
|
|
var sortColumn = fieldRelation.relation || "".concat(tableName, ".").concat(fieldRelation.column);
|
|
|
|
return function (builder) {
|
|
builder.orderBy(sortColumn, sortDirection);
|
|
buildSortColumnJoin(tableName, columnKey)(builder);
|
|
};
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models sync recursive ^\\.\\/.*$":
|
|
/*!**********************************!*\
|
|
!*** ./src/models sync ^\.\/.*$ ***!
|
|
\**********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var map = {
|
|
"./Account": "./src/models/Account.js",
|
|
"./Account.js": "./src/models/Account.js",
|
|
"./AccountBalance": "./src/models/AccountBalance.js",
|
|
"./AccountBalance.js": "./src/models/AccountBalance.js",
|
|
"./AccountTransaction": "./src/models/AccountTransaction.js",
|
|
"./AccountTransaction.js": "./src/models/AccountTransaction.js",
|
|
"./AccountType": "./src/models/AccountType.js",
|
|
"./AccountType.js": "./src/models/AccountType.js",
|
|
"./Auth": "./src/models/Auth.js",
|
|
"./Auth.js": "./src/models/Auth.js",
|
|
"./Budget": "./src/models/Budget.js",
|
|
"./Budget.js": "./src/models/Budget.js",
|
|
"./BudgetEntry": "./src/models/BudgetEntry.js",
|
|
"./BudgetEntry.js": "./src/models/BudgetEntry.js",
|
|
"./Currency": "./src/models/Currency.js",
|
|
"./Currency.js": "./src/models/Currency.js",
|
|
"./DateSession": "./src/models/DateSession.js",
|
|
"./DateSession.js": "./src/models/DateSession.js",
|
|
"./ExchangeRate": "./src/models/ExchangeRate.js",
|
|
"./ExchangeRate.js": "./src/models/ExchangeRate.js",
|
|
"./Expense": "./src/models/Expense.js",
|
|
"./Expense.js": "./src/models/Expense.js",
|
|
"./Item": "./src/models/Item.js",
|
|
"./Item.js": "./src/models/Item.js",
|
|
"./ItemCategory": "./src/models/ItemCategory.js",
|
|
"./ItemCategory.js": "./src/models/ItemCategory.js",
|
|
"./ManualJournal": "./src/models/ManualJournal.js",
|
|
"./ManualJournal.js": "./src/models/ManualJournal.js",
|
|
"./Media": "./src/models/Media.js",
|
|
"./Media.js": "./src/models/Media.js",
|
|
"./MediaLink": "./src/models/MediaLink.js",
|
|
"./MediaLink.js": "./src/models/MediaLink.js",
|
|
"./Metable": "./src/models/Metable.js",
|
|
"./Metable.js": "./src/models/Metable.js",
|
|
"./Model": "./src/models/Model.js",
|
|
"./Model.js": "./src/models/Model.js",
|
|
"./Option": "./src/models/Option.js",
|
|
"./Option.js": "./src/models/Option.js",
|
|
"./Pagination": "./src/models/Pagination.js",
|
|
"./Pagination.js": "./src/models/Pagination.js",
|
|
"./Permission": "./src/models/Permission.js",
|
|
"./Permission.js": "./src/models/Permission.js",
|
|
"./Resource": "./src/models/Resource.js",
|
|
"./Resource.js": "./src/models/Resource.js",
|
|
"./ResourceField": "./src/models/ResourceField.js",
|
|
"./ResourceField.js": "./src/models/ResourceField.js",
|
|
"./ResourceFieldMetadata": "./src/models/ResourceFieldMetadata.js",
|
|
"./ResourceFieldMetadata.js": "./src/models/ResourceFieldMetadata.js",
|
|
"./Role": "./src/models/Role.js",
|
|
"./Role.js": "./src/models/Role.js",
|
|
"./Setting": "./src/models/Setting.js",
|
|
"./Setting.js": "./src/models/Setting.js",
|
|
"./TenantModel": "./src/models/TenantModel.js",
|
|
"./TenantModel.js": "./src/models/TenantModel.js",
|
|
"./TenantUser": "./src/models/TenantUser.js",
|
|
"./TenantUser.js": "./src/models/TenantUser.js",
|
|
"./View": "./src/models/View.js",
|
|
"./View.js": "./src/models/View.js",
|
|
"./ViewColumn": "./src/models/ViewColumn.js",
|
|
"./ViewColumn.js": "./src/models/ViewColumn.js",
|
|
"./ViewRole": "./src/models/ViewRole.js",
|
|
"./ViewRole.js": "./src/models/ViewRole.js"
|
|
};
|
|
|
|
|
|
function webpackContext(req) {
|
|
var id = webpackContextResolve(req);
|
|
return __webpack_require__(id);
|
|
}
|
|
function webpackContextResolve(req) {
|
|
if(!__webpack_require__.o(map, req)) {
|
|
var e = new Error("Cannot find module '" + req + "'");
|
|
e.code = 'MODULE_NOT_FOUND';
|
|
throw e;
|
|
}
|
|
return map[req];
|
|
}
|
|
webpackContext.keys = function webpackContextKeys() {
|
|
return Object.keys(map);
|
|
};
|
|
webpackContext.resolve = webpackContextResolve;
|
|
module.exports = webpackContext;
|
|
webpackContext.id = "./src/models sync recursive ^\\.\\/.*$";
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Account.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/models/Account.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Account; });
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
/* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js");
|
|
/* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js");
|
|
/* harmony import */ var _models_DateSession__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/models/DateSession */ "./src/models/DateSession.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/lib/DependencyGraph */ "./src/lib/DependencyGraph/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;} /* eslint-disable global-require */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
Account = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(Account, _mixin);function Account() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, Account);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Account).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(Account, null, [{ key: "query",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Query return override.
|
|
* @param {...any} args
|
|
*/value: function query()
|
|
{var _get2,_this = this;for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}
|
|
return (_get2 = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_5___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Account), "query", this)).call.apply(_get2, [this].concat(args)).runAfter(function (result) {
|
|
if (Array.isArray(result)) {
|
|
return _this.isDepGraph ?
|
|
Account.toDependencyGraph(result) :
|
|
_this.collection.from(result);
|
|
}
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Convert the array result to dependency graph.
|
|
*/ }, { key: "depGraph", value: function depGraph()
|
|
{
|
|
this.isDepGraph = true;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Model modifiers.
|
|
*/ }, { key: "collectJournalEntries", value: function collectJournalEntries(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
accounts) {
|
|
return Object(lodash__WEBPACK_IMPORTED_MODULE_8__["flatten"])(accounts.map(function (account) {return account.transactions.map(function (transaction) {return _objectSpread({
|
|
accountId: account.id },
|
|
transaction, {
|
|
accountNormal: account.type.normal });});}));
|
|
|
|
}
|
|
|
|
/**
|
|
* Converts flatten accounts list to nested array.
|
|
* @param {Array} accounts
|
|
* @param {Object} options
|
|
*/ }, { key: "toNestedArray", value: function toNestedArray(
|
|
accounts) {var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { children: 'children' };
|
|
return Object(_utils__WEBPACK_IMPORTED_MODULE_14__["flatToNestedArray"])(accounts, { id: 'id', parentId: 'parentAccountId' });
|
|
} }, { key: "toDependencyGraph", value: function toDependencyGraph(
|
|
|
|
accounts) {
|
|
return _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_15__["default"].fromArray(
|
|
accounts, { itemId: 'id', parentItemId: 'parentAccountId' });
|
|
|
|
} }, { key: "tableName", /**
|
|
* Table name
|
|
*/get: function get() {return 'accounts';} /**
|
|
* Extend query builder model.
|
|
*/ }, { key: "QueryBuilder", get: function get() {return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_11__["default"];} }, { key: "modifiers", get: function get() {var TABLE_NAME = Account.tableName;return { filterAccounts: function filterAccounts(query, accountIds) {if (accountIds.length > 0) {query.whereIn("".concat(TABLE_NAME, ".id"), accountIds);}}, filterAccountTypes: function filterAccountTypes(query, typesIds) {if (typesIds.length > 0) {query.whereIn('account_types.accoun_type_id', typesIds);}}, viewRolesBuilder: function viewRolesBuilder(query, conditionals, expression) {Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["buildFilterQuery"])(Account.tableName, conditionals, expression)(query);}, sortColumnBuilder: function sortColumnBuilder(query, columnKey, direction) {Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_10__["buildSortColumnQuery"])(Account.tableName, columnKey, direction)(query);} };} /**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get() {var AccountType = __webpack_require__(/*! @/models/AccountType */ "./src/models/AccountType.js");var AccountBalance = __webpack_require__(/*! @/models/AccountBalance */ "./src/models/AccountBalance.js");var AccountTransaction = __webpack_require__(/*! @/models/AccountTransaction */ "./src/models/AccountTransaction.js");return { /**
|
|
* Account model may belongs to account type.
|
|
*/type: { relation: objection__WEBPACK_IMPORTED_MODULE_7__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(AccountType["default"]), join: { from: 'accounts.accountTypeId', to: 'account_types.id' } }, /**
|
|
* Account model may has many balances accounts.
|
|
*/balance: { relation: objection__WEBPACK_IMPORTED_MODULE_7__["Model"].HasOneRelation, modelClass: this.relationBindKnex(AccountBalance["default"]), join: { from: 'accounts.id', to: 'account_balances.accountId' } }, /**
|
|
* Account model may has many transactions.
|
|
*/transactions: { relation: objection__WEBPACK_IMPORTED_MODULE_7__["Model"].HasManyRelation, modelClass: this.relationBindKnex(AccountTransaction["default"]), join: { from: 'accounts.id', to: 'accounts_transactions.accountId' } } };} }]);return Account;}(Object(objection__WEBPACK_IMPORTED_MODULE_7__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_9__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_12__["default"], _models_DateSession__WEBPACK_IMPORTED_MODULE_13__["default"]]));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/AccountBalance.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/models/AccountBalance.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AccountBalance; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
var
|
|
|
|
AccountBalance = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountBalance, _TenantModel);function AccountBalance() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AccountBalance);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AccountBalance).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AccountBalance, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'account_balances';
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
|
|
|
|
return {
|
|
account: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'account_balances.account_id',
|
|
to: 'accounts.id' } } };
|
|
|
|
|
|
|
|
} }]);return AccountBalance;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/AccountTransaction.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/models/AccountTransaction.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AccountTransaction; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js");
|
|
/* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js");
|
|
/* harmony import */ var _models_DateSession__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/models/DateSession */ "./src/models/DateSession.js");
|
|
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
|
|
AccountTransaction = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountTransaction, _mixin);function AccountTransaction() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AccountTransaction);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AccountTransaction).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AccountTransaction, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'accounts_transactions';
|
|
}
|
|
|
|
/**
|
|
* Extend query builder model.
|
|
*/ }, { key: "QueryBuilder", get: function get()
|
|
{
|
|
return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_8__["default"];
|
|
}
|
|
|
|
/**
|
|
* Model modifiers.
|
|
*/ }, { key: "modifiers", get: function get()
|
|
{
|
|
return {
|
|
filterAccounts: function filterAccounts(query, accountsIds) {
|
|
if (accountsIds.length > 0) {
|
|
query.whereIn('account_id', accountsIds);
|
|
}
|
|
},
|
|
filterTransactionTypes: function filterTransactionTypes(query, types) {
|
|
if (Array.isArray(types) && types.length > 0) {
|
|
query.whereIn('reference_type', types);
|
|
} else if (typeof types === 'string') {
|
|
query.where('reference_type', types);
|
|
}
|
|
},
|
|
filterDateRange: function filterDateRange(query, startDate, endDate) {var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'day';
|
|
var dateFormat = 'YYYY-MM-DD HH:mm:ss';
|
|
var fromDate = moment__WEBPACK_IMPORTED_MODULE_6___default()(startDate).startOf(type).format(dateFormat);
|
|
var toDate = moment__WEBPACK_IMPORTED_MODULE_6___default()(endDate).endOf(type).format(dateFormat);
|
|
|
|
if (startDate) {
|
|
query.where('date', '>=', fromDate);
|
|
}
|
|
if (endDate) {
|
|
query.where('date', '<=', toDate);
|
|
}
|
|
},
|
|
filterAmountRange: function filterAmountRange(query, fromAmount, toAmount) {
|
|
if (fromAmount) {
|
|
query.andWhere(function (q) {
|
|
q.where('credit', '>=', fromAmount);
|
|
q.orWhere('debit', '>=', fromAmount);
|
|
});
|
|
}
|
|
if (toAmount) {
|
|
query.andWhere(function (q) {
|
|
q.where('credit', '<=', toAmount);
|
|
q.orWhere('debit', '<=', toAmount);
|
|
});
|
|
}
|
|
},
|
|
sumationCreditDebit: function sumationCreditDebit(query) {
|
|
query.sum('credit as credit');
|
|
query.sum('debit as debit');
|
|
query.groupBy('account_id');
|
|
} };
|
|
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
|
|
|
|
return {
|
|
account: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'accounts_transactions.accountId',
|
|
to: 'accounts.id' } } };
|
|
|
|
|
|
|
|
} }]);return AccountTransaction;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_9__["default"], _models_DateSession__WEBPACK_IMPORTED_MODULE_10__["default"]]));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/AccountType.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/models/AccountType.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AccountType; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
// import path from 'path';
|
|
|
|
var
|
|
|
|
AccountType = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountType, _TenantModel);function AccountType() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AccountType);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AccountType).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AccountType, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'account_types';
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
|
|
|
|
return {
|
|
/**
|
|
* Account type may has many associated accounts.
|
|
*/
|
|
accounts: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'account_types.id',
|
|
to: 'accounts.accountTypeId' } } };
|
|
|
|
|
|
|
|
} }]);return AccountType;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Auth.js":
|
|
/*!****************************!*\
|
|
!*** ./src/models/Auth.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Auth; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
var
|
|
Auth = /*#__PURE__*/function () {function Auth() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Auth);}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Auth, null, [{ key: "setAuthenticatedUser",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Sets the authenticated user.
|
|
* @param {User} user
|
|
*/value: function setAuthenticatedUser(
|
|
user) {
|
|
this.user = user;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the authenticated user ID.
|
|
*/ }, { key: "userId", value: function userId()
|
|
{
|
|
if (!this.user) {
|
|
return false;
|
|
}
|
|
return this.user.id;
|
|
}
|
|
|
|
/**
|
|
* Whether the user is logged or not.
|
|
*/ }, { key: "isLogged", value: function isLogged()
|
|
{
|
|
return !!this.user;
|
|
} }, { key: "loggedOut", value: function loggedOut()
|
|
|
|
{
|
|
this.user = null;
|
|
} }, { key: "user", /**
|
|
* Retrieve the authenticated user.
|
|
*/get: function get() {return null;} }]);return Auth;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Budget.js":
|
|
/*!******************************!*\
|
|
!*** ./src/models/Budget.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Budget; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js");
|
|
var
|
|
|
|
Budget = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Budget, _TenantModel);function Budget() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Budget);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Budget).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Budget, [{ key: "rangeBy", get: function get()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
switch (this.period) {
|
|
case 'half-year':
|
|
case 'quarter':
|
|
return 'month';
|
|
default:
|
|
return this.period;}
|
|
|
|
} }, { key: "rangeIncrement", get: function get()
|
|
|
|
{
|
|
switch (this.period) {
|
|
case 'half-year':
|
|
return 6;
|
|
case 'quarter':
|
|
return 3;
|
|
default:
|
|
return 1;}
|
|
|
|
} }, { key: "rangeOffset", get: function get()
|
|
|
|
{
|
|
switch (this.period) {
|
|
case 'half-year':return 5;
|
|
case 'quarter':return 2;
|
|
default:return 0;}
|
|
|
|
} }], [{ key: "tableName", /**
|
|
* Table name
|
|
*/get: function get() {return 'budgets';} }, { key: "virtualAttributes", get: function get() {return ['rangeBy', 'rangeIncrement'];} /**
|
|
* Model modifiers.
|
|
*/ }, { key: "modifiers", get: function get() {return { filterByYear: function filterByYear(query, year) {query.where('year', year);}, filterByIncomeStatement: function filterByIncomeStatement(query) {query.where('account_types', 'income_statement');}, filterByProfitLoss: function filterByProfitLoss(query) {query.where('accounts_types', 'profit_loss');} };} }]);return Budget;}(_models_Model__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/BudgetEntry.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/models/BudgetEntry.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Budget; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
var
|
|
|
|
Budget = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Budget, _TenantModel);function Budget() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Budget);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Budget).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Budget, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'budget_entries';
|
|
} }]);return Budget;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Currency.js":
|
|
/*!********************************!*\
|
|
!*** ./src/models/Currency.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Currency; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
var
|
|
|
|
Currency = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Currency, _TenantModel);function Currency() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Currency);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Currency).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Currency, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'currencies';
|
|
} }]);return Currency;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/DateSession.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/models/DateSession.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (function (Model) {
|
|
return (/*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(DateSession, _Model);function DateSession() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DateSession);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DateSession).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DateSession, [{ key: "$beforeUpdate", value: function $beforeUpdate(
|
|
|
|
|
|
|
|
|
|
|
|
opt, context) {var _this = this;
|
|
var maybePromise = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DateSession.prototype), "$beforeUpdate", this).call(this, opt, context);
|
|
|
|
return Promise.resolve(maybePromise).then(function () {
|
|
if (DateSession.timestamps[1]) {
|
|
_this[DateSession.timestamps[1]] = moment__WEBPACK_IMPORTED_MODULE_6___default()().format('YYYY/MM/DD HH:mm:ss');
|
|
}
|
|
});
|
|
} }, { key: "$beforeInsert", value: function $beforeInsert(
|
|
|
|
context) {var _this2 = this;
|
|
var maybePromise = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DateSession.prototype), "$beforeInsert", this).call(this, context);
|
|
|
|
return Promise.resolve(maybePromise).then(function () {
|
|
if (DateSession.timestamps[0]) {
|
|
_this2[DateSession.timestamps[0]] = moment__WEBPACK_IMPORTED_MODULE_6___default()().format('YYYY/MM/DD HH:mm:ss');
|
|
}
|
|
});
|
|
} }], [{ key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} }]);return DateSession;}(Model));
|
|
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ExchangeRate.js":
|
|
/*!************************************!*\
|
|
!*** ./src/models/ExchangeRate.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ExchangeRate; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bcryptjs */ "bcryptjs");
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
|
|
var
|
|
|
|
ExchangeRate = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ExchangeRate, _TenantModel);function ExchangeRate() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ExchangeRate);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ExchangeRate).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ExchangeRate, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'exchange_rates';
|
|
} }]);return ExchangeRate;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Expense.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/models/Expense.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Expense; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
|
|
|
|
var
|
|
|
|
Expense = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Expense, _TenantModel);function Expense() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Expense);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Expense).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Expense, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'expenses';
|
|
} }, { key: "referenceType", get: function get()
|
|
|
|
{
|
|
return 'Expense';
|
|
}
|
|
|
|
/**
|
|
* Model modifiers.
|
|
*/ }, { key: "modifiers", get: function get()
|
|
{
|
|
return {
|
|
filterByDateRange: function filterByDateRange(query, startDate, endDate) {
|
|
if (startDate) {
|
|
query.where('date', '>=', startDate);
|
|
}
|
|
if (endDate) {
|
|
query.where('date', '<=', endDate);
|
|
}
|
|
},
|
|
filterByAmountRange: function filterByAmountRange(query, from, to) {
|
|
if (from) {
|
|
query.where('amount', '>=', from);
|
|
}
|
|
if (to) {
|
|
query.where('amount', '<=', to);
|
|
}
|
|
},
|
|
filterByExpenseAccount: function filterByExpenseAccount(query, accountId) {
|
|
if (accountId) {
|
|
query.where('expense_account_id', accountId);
|
|
}
|
|
},
|
|
filterByPaymentAccount: function filterByPaymentAccount(query, accountId) {
|
|
if (accountId) {
|
|
query.where('payment_account_id', accountId);
|
|
}
|
|
},
|
|
|
|
viewRolesBuilder: function viewRolesBuilder(query, conditionals, expression) {
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["viewRolesBuilder"])(conditionals, expression)(query);
|
|
},
|
|
|
|
orderBy: function orderBy(query) {
|
|
|
|
} };
|
|
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
|
|
var User = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js");
|
|
|
|
return {
|
|
paymentAccount: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'expenses.paymentAccountId',
|
|
to: 'accounts.id' } },
|
|
|
|
|
|
|
|
expenseAccount: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'expenses.expenseAccountId',
|
|
to: 'accounts.id' } },
|
|
|
|
|
|
|
|
user: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(User["default"]),
|
|
join: {
|
|
from: 'expenses.userId',
|
|
to: 'users.id' } } };
|
|
|
|
|
|
|
|
} }]);return Expense;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Item.js":
|
|
/*!****************************!*\
|
|
!*** ./src/models/Item.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Item; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
|
|
|
|
|
|
var
|
|
|
|
Item = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Item, _TenantModel);function Item() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Item);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Item).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Item, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'items';
|
|
}
|
|
|
|
/**
|
|
* Model modifiers.
|
|
*/ }, { key: "modifiers", get: function get()
|
|
{
|
|
var TABLE_NAME = Item.tableName;
|
|
|
|
return {
|
|
sortBy: function sortBy(query, columnSort, sortDirection) {
|
|
query.orderBy(columnSort, sortDirection);
|
|
},
|
|
viewRolesBuilder: function viewRolesBuilder(query, conditions, logicExpression) {
|
|
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["buildFilterQuery"])(Item.tableName, conditions, logicExpression)(query);
|
|
} };
|
|
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Media = __webpack_require__(/*! @/models/Media */ "./src/models/Media.js");
|
|
var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
|
|
var ItemCategory = __webpack_require__(/*! @/models/ItemCategory */ "./src/models/ItemCategory.js");
|
|
|
|
return {
|
|
/**
|
|
* Item may belongs to cateogory model.
|
|
*/
|
|
category: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(ItemCategory["default"]),
|
|
join: {
|
|
from: 'items.categoryId',
|
|
to: 'items_categories.id' } },
|
|
|
|
|
|
|
|
costAccount: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'items.costAccountId',
|
|
to: 'accounts.id' } },
|
|
|
|
|
|
|
|
sellAccount: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'items.sellAccountId',
|
|
to: 'accounts.id' } },
|
|
|
|
|
|
|
|
inventoryAccount: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Account["default"]),
|
|
join: {
|
|
from: 'items.inventoryAccountId',
|
|
to: 'accounts.id' } },
|
|
|
|
|
|
|
|
media: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation,
|
|
modelClass: this.relationBindKnex(Media["default"]),
|
|
join: {
|
|
from: 'items.id',
|
|
through: {
|
|
from: 'media_links.model_id',
|
|
to: 'media_links.media_id' },
|
|
|
|
to: 'media.id' } } };
|
|
|
|
|
|
|
|
} }]);return Item;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ItemCategory.js":
|
|
/*!************************************!*\
|
|
!*** ./src/models/ItemCategory.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ItemCategory; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
|
|
var
|
|
|
|
ItemCategory = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ItemCategory, _TenantModel);function ItemCategory() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ItemCategory);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ItemCategory).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ItemCategory, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'items_categories';
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Item = __webpack_require__(/*! @/models/Item */ "./src/models/Item.js");
|
|
|
|
return {
|
|
/**
|
|
* Item category may has many items.
|
|
*/
|
|
items: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_6__["Model"].HasManyRelation,
|
|
modelClass: this.relationBindKnex(Item["default"]),
|
|
join: {
|
|
from: 'items_categories.id',
|
|
to: 'items.categoryId' } } };
|
|
|
|
|
|
|
|
} }]);return ItemCategory;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ManualJournal.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/models/ManualJournal.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ManualJournal; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
var
|
|
|
|
ManualJournal = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ManualJournal, _TenantModel);function ManualJournal() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ManualJournal);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ManualJournal).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ManualJournal, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'manual_journals';
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Media = __webpack_require__(/*! @/models/Media */ "./src/models/Media.js");
|
|
|
|
return {
|
|
media: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation,
|
|
modelClass: this.relationBindKnex(Media["default"]),
|
|
join: {
|
|
from: 'manual_journals.id',
|
|
through: {
|
|
from: 'media_links.model_id',
|
|
to: 'media_links.media_id' },
|
|
|
|
to: 'media.id' } } };
|
|
|
|
|
|
|
|
} }]);return ManualJournal;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Media.js":
|
|
/*!*****************************!*\
|
|
!*** ./src/models/Media.js ***!
|
|
\*****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Media; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
var
|
|
|
|
Media = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Media, _TenantModel);function Media() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Media);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Media).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Media, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'media';
|
|
} }]);return Media;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/MediaLink.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/models/MediaLink.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MediaLink; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
var
|
|
|
|
MediaLink = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(MediaLink, _TenantModel);function MediaLink() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MediaLink);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(MediaLink).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MediaLink, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'media_links';
|
|
} }]);return MediaLink;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Metable.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/models/Metable.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _database_knex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/database/knex */ "./src/database/knex.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
// import cache from 'memory-cache';
|
|
|
|
// Metadata
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
METADATA_GROUP: 'default',
|
|
KEY_COLUMN: 'key',
|
|
VALUE_COLUMN: 'value',
|
|
TYPE_COLUMN: 'type',
|
|
|
|
extraColumns: [],
|
|
metadata: [],
|
|
shouldReload: true,
|
|
extraMetadataQuery: function extraMetadataQuery() {},
|
|
|
|
/**
|
|
* Set the value column key to query from.
|
|
* @param {String} name -
|
|
*/
|
|
setKeyColumnName: function setKeyColumnName(name) {
|
|
this.KEY_COLUMN = name;
|
|
},
|
|
|
|
/**
|
|
* Set the key column name to query from.
|
|
* @param {String} name -
|
|
*/
|
|
setValueColumnName: function setValueColumnName(name) {
|
|
this.VALUE_COLUMN = name;
|
|
},
|
|
|
|
/**
|
|
* Set extra columns to be added to the rows.
|
|
* @param {Array} columns -
|
|
*/
|
|
setExtraColumns: function setExtraColumns(columns) {
|
|
this.extraColumns = columns;
|
|
},
|
|
|
|
/**
|
|
* Metadata database query.
|
|
* @param {Object} query -
|
|
* @param {String} groupName -
|
|
*/
|
|
whereQuery: function whereQuery(query, key) {
|
|
var groupName = this.METADATA_GROUP;
|
|
|
|
if (groupName) {
|
|
query.where('group', groupName);
|
|
}
|
|
if (key) {
|
|
if (Array.isArray(key)) {
|
|
query.whereIn('key', key);
|
|
} else {
|
|
query.where('key', key);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Loads the metadata from the storage.
|
|
* @param {String|Array} key -
|
|
* @param {Boolean} force -
|
|
*/
|
|
load: function () {var _load = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee() {var _this = this;var force,metadataCollection,metadataArray,_args = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:force = _args.length > 0 && _args[0] !== undefined ? _args[0] : false;if (!(
|
|
this.shouldReload || force)) {_context.next = 9;break;}_context.next = 4;return (
|
|
this.query(function (query) {
|
|
_this.whereQuery(query);
|
|
_this.extraMetadataQuery(query);
|
|
}).fetchAll());case 4:metadataCollection = _context.sent;
|
|
|
|
this.shouldReload = false;
|
|
this.metadata = [];
|
|
|
|
metadataArray = this.mapMetadataCollection(metadataCollection);
|
|
metadataArray.forEach(function (metadata) {_this.metadata.push(metadata);});case 9:case "end":return _context.stop();}}}, _callee, this);}));function load() {return _load.apply(this, arguments);}return load;}(),
|
|
|
|
|
|
|
|
/**
|
|
* Fetches all the metadata that associate with the current group.
|
|
*/
|
|
allMeta: function () {var _allMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() {var force,_args2 = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:force = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : false;_context2.next = 3;return (
|
|
this.load(force));case 3:return _context2.abrupt("return",
|
|
this.metadata);case 4:case "end":return _context2.stop();}}}, _callee2, this);}));function allMeta() {return _allMeta.apply(this, arguments);}return allMeta;}(),
|
|
|
|
|
|
/**
|
|
* Find the given metadata key.
|
|
* @param {String} key -
|
|
* @return {object} - Metadata object.
|
|
*/
|
|
findMeta: function findMeta(key) {
|
|
return this.metadata.find(function (meta) {return meta.key === key;});
|
|
},
|
|
|
|
/**
|
|
* Fetch the metadata of the current group.
|
|
* @param {*} key -
|
|
*/
|
|
getMeta: function () {var _getMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(key, defaultValue) {var force,metadata,_args3 = arguments;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:force = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : false;_context3.next = 3;return (
|
|
this.load(force));case 3:
|
|
|
|
metadata = this.findMeta(key);return _context3.abrupt("return",
|
|
metadata ? metadata.value : defaultValue || false);case 5:case "end":return _context3.stop();}}}, _callee3, this);}));function getMeta(_x, _x2) {return _getMeta.apply(this, arguments);}return getMeta;}(),
|
|
|
|
|
|
/**
|
|
* Markes the metadata to should be deleted.
|
|
* @param {String} key -
|
|
*/
|
|
removeMeta: function () {var _removeMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(key) {var metadata;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:_context4.next = 2;return (
|
|
this.load());case 2:
|
|
metadata = this.findMeta(key);
|
|
|
|
if (metadata) {
|
|
metadata.markAsDeleted = true;
|
|
}
|
|
this.shouldReload = true;case 5:case "end":return _context4.stop();}}}, _callee4, this);}));function removeMeta(_x3) {return _removeMeta.apply(this, arguments);}return removeMeta;}(),
|
|
|
|
|
|
/**
|
|
* Remove all meta data of the given group.
|
|
* @param {*} group
|
|
*/
|
|
removeAllMeta: function removeAllMeta() {var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'default';
|
|
this.metdata.map(function (meta) {return _objectSpread({},
|
|
meta.group !== group ? { markAsDeleted: true } : {}, {},
|
|
meta);});
|
|
|
|
this.shouldReload = true;
|
|
},
|
|
|
|
/**
|
|
* Set the meta data to the stack.
|
|
* @param {String} key -
|
|
* @param {String} value -
|
|
*/
|
|
setMeta: function () {var _setMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee5(key, value, payload) {var _this2 = this;var _metadata, metadata;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee5$(_context5) {while (1) {switch (_context5.prev = _context5.next) {case 0:if (!
|
|
Array.isArray(key)) {_context5.next = 4;break;}
|
|
_metadata = key;
|
|
_metadata.forEach(function (meta) {
|
|
_this2.setMeta(meta.key, meta.value);
|
|
});return _context5.abrupt("return");case 4:_context5.next = 6;return (
|
|
|
|
|
|
|
|
this.load());case 6:
|
|
metadata = this.findMeta(key);
|
|
|
|
if (metadata) {
|
|
metadata.value = value;
|
|
metadata.markAsUpdated = true;
|
|
} else {
|
|
this.metadata.push(_objectSpread({
|
|
value: value, key: key }, payload, { markAsInserted: true }));
|
|
|
|
}case 8:case "end":return _context5.stop();}}}, _callee5, this);}));function setMeta(_x4, _x5, _x6) {return _setMeta.apply(this, arguments);}return setMeta;}(),
|
|
|
|
|
|
/**
|
|
* Saved the modified metadata.
|
|
*/
|
|
saveMeta: function () {var _saveMeta = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee6() {var _this3 = this;var inserted, updated, deleted, metadataDeletedKeys, metadataInserted, metadataUpdated, batchUpdate;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee6$(_context6) {while (1) {switch (_context6.prev = _context6.next) {case 0:
|
|
inserted = this.metadata.filter(function (m) {return m.markAsInserted === true;});
|
|
updated = this.metadata.filter(function (m) {return m.markAsUpdated === true;});
|
|
deleted = this.metadata.filter(function (m) {return m.markAsDeleted === true;});
|
|
|
|
metadataDeletedKeys = deleted.map(function (m) {return m.key;});
|
|
metadataInserted = inserted.map(function (m) {return _this3.mapMetadata(m, 'format');});
|
|
metadataUpdated = updated.map(function (m) {return _this3.mapMetadata(m, 'format');});
|
|
|
|
batchUpdate = function batchUpdate(collection) {return _database_knex__WEBPACK_IMPORTED_MODULE_3__["default"].transaction(function (trx) {
|
|
var queries = collection.map(function (tuple) {
|
|
var query = Object(_database_knex__WEBPACK_IMPORTED_MODULE_3__["default"])(_this3.tableName);
|
|
_this3.whereQuery(query, tuple.key);
|
|
_this3.extraMetadataQuery(query);
|
|
return query.update(tuple).transacting(trx);
|
|
});
|
|
return Promise.all(queries).then(trx.commit)["catch"](trx.rollback);
|
|
});};_context6.next = 9;return (
|
|
|
|
Promise.all([
|
|
_database_knex__WEBPACK_IMPORTED_MODULE_3__["default"].insert(metadataInserted).into(this.tableName),
|
|
batchUpdate(metadataUpdated),
|
|
metadataDeletedKeys.length > 0 ?
|
|
this.query('whereIn', this.KEY_COLUMN, metadataDeletedKeys).destroy({
|
|
require: true }) :
|
|
null]));case 9:
|
|
|
|
this.shouldReload = true;case 10:case "end":return _context6.stop();}}}, _callee6, this);}));function saveMeta() {return _saveMeta.apply(this, arguments);}return saveMeta;}(),
|
|
|
|
|
|
/**
|
|
* Purge all the cached metadata in the memory.
|
|
*/
|
|
purgeMetadata: function purgeMetadata() {
|
|
this.metadata = [];
|
|
this.shouldReload = true;
|
|
},
|
|
|
|
/**
|
|
* Parses the metadata value.
|
|
* @param {String} value -
|
|
* @param {String} valueType -
|
|
*/
|
|
parseMetaValue: function parseMetaValue(value, valueType) {
|
|
var parsedValue;
|
|
|
|
switch (valueType) {
|
|
case 'integer':
|
|
parsedValue = parseInt(value, 10);
|
|
break;
|
|
case 'float':
|
|
parsedValue = parseFloat(value);
|
|
break;
|
|
case 'boolean':
|
|
parsedValue = Boolean(value);
|
|
break;
|
|
case 'json':
|
|
parsedValue = JSON.parse(parsedValue);
|
|
break;
|
|
default:
|
|
parsedValue = value;
|
|
break;}
|
|
|
|
return parsedValue;
|
|
},
|
|
|
|
/**
|
|
* Format the metadata before saving to the database.
|
|
* @param {String|Number|Boolean} value -
|
|
* @param {String} valueType -
|
|
* @return {String|Number|Boolean} -
|
|
*/
|
|
formatMetaValue: function formatMetaValue(value, valueType) {
|
|
var parsedValue;
|
|
|
|
switch (valueType) {
|
|
case 'number':
|
|
parsedValue = "".concat(value);
|
|
break;
|
|
case 'boolean':
|
|
parsedValue = value ? '1' : '0';
|
|
break;
|
|
case 'json':
|
|
parsedValue = JSON.stringify(parsedValue);
|
|
break;
|
|
default:
|
|
parsedValue = value;
|
|
break;}
|
|
|
|
return parsedValue;
|
|
},
|
|
|
|
mapMetadata: function mapMetadata(attr) {var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse';
|
|
return _objectSpread({
|
|
key: attr[this.KEY_COLUMN],
|
|
value: parseType === 'parse' ?
|
|
this.parseMetaValue(
|
|
attr[this.VALUE_COLUMN],
|
|
this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) :
|
|
|
|
this.formatMetaValue(
|
|
attr[this.VALUE_COLUMN],
|
|
this.TYPE_COLUMN ? attr[this.TYPE_COLUMN] : false) },
|
|
|
|
this.extraColumns.map(function (extraCol) {return _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()({},
|
|
extraCol, attr[extraCol] || null);}));
|
|
|
|
|
|
},
|
|
|
|
/**
|
|
* Parse the metadata collection.
|
|
* @param {Array} collection -
|
|
*/
|
|
mapMetadataCollection: function mapMetadataCollection(collection) {var _this4 = this;var parseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'parse';
|
|
return collection.map(function (model) {return _this4.mapMetadata(model.attributes, parseType);});
|
|
} });
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Model.js":
|
|
/*!*****************************!*\
|
|
!*** ./src/models/Model.js ***!
|
|
\*****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ModelBase; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _models_Pagination__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/Pagination */ "./src/models/Pagination.js");
|
|
|
|
|
|
|
|
var
|
|
|
|
ModelBase = /*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(ModelBase, _Model);function ModelBase() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ModelBase);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ModelBase).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ModelBase, [{ key: "$formatJson", value: function $formatJson(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
json, opt) {
|
|
var transformed = Object(_utils__WEBPACK_IMPORTED_MODULE_8__["mapKeysDeep"])(json, function (value, key) {
|
|
return Object(lodash__WEBPACK_IMPORTED_MODULE_7__["snakeCase"])(key);
|
|
});
|
|
var parsedJson = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ModelBase.prototype), "$formatJson", this).call(this, transformed, opt);
|
|
return parsedJson;
|
|
} }], [{ key: "query", value: function query() {var _get2,_this = this;for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}return (_get2 = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ModelBase), "query", this)).call.apply(_get2, [this].concat(args)).runAfter(function (result) {if (Array.isArray(result)) {return _this.collection.from(result);}return result;});} }, { key: "relationBindKnex", value: function relationBindKnex(
|
|
|
|
|
|
|
|
|
|
|
|
model) {
|
|
return this.knexBinded ? model.bindKnex(this.knexBinded) : model;
|
|
} }, { key: "knexBinded", get: function get() {return this.knexBindInstance;}, set: function set(knex) {this.knexBindInstance = knex;} }, { key: "collection", get: function get() {return Array;} }, { key: "QueryBuilder", get: function get() {return _models_Pagination__WEBPACK_IMPORTED_MODULE_9__["default"];} }]);return ModelBase;}(objection__WEBPACK_IMPORTED_MODULE_6__["Model"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Option.js":
|
|
/*!******************************!*\
|
|
!*** ./src/models/Option.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Option; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Metable/MetableCollection */ "./src/lib/Metable/MetableCollection.js");
|
|
/* harmony import */ var _data_options__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/data/options */ "./src/data/options.js");
|
|
|
|
|
|
var
|
|
|
|
|
|
Option = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(Option, _TenantModel);function Option() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Option);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Option).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Option, null, [{ key: "query",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Override the model query.
|
|
* @param {...any} args -
|
|
*/value: function query()
|
|
{var _get2,_this = this;for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}
|
|
return (_get2 = _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Option), "query", this)).call.apply(_get2, [this].concat(args)).runAfter(function (result) {
|
|
if (result instanceof _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_7__["default"]) {
|
|
result.setModel(_this.tenant());
|
|
result.setExtraColumns(['group']);
|
|
}
|
|
return result;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Model collection.
|
|
*/ }, { key: "validateDefined",
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Validates the given options is defined or either not.
|
|
* @param {Array} options
|
|
* @return {Boolean}
|
|
*/value: function validateDefined(
|
|
options) {
|
|
var notDefined = [];
|
|
|
|
options.forEach(function (option) {
|
|
if (!_data_options__WEBPACK_IMPORTED_MODULE_8__["default"][option.group]) {
|
|
notDefined.push(option);
|
|
} else if (!_data_options__WEBPACK_IMPORTED_MODULE_8__["default"][option.group].some(function (o) {return o.key === option.key;})) {
|
|
notDefined.push(option);
|
|
}
|
|
});
|
|
return notDefined;
|
|
} }, { key: "tableName", /**
|
|
* Table name.
|
|
*/get: function get() {return 'options';} }, { key: "collection", get: function get() {return _lib_Metable_MetableCollection__WEBPACK_IMPORTED_MODULE_7__["default"];} }]);return Option;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Pagination.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/models/Pagination.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PaginationQueryBuilder; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
var
|
|
|
|
PaginationQueryBuilder = /*#__PURE__*/function (_Model$QueryBuilder) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PaginationQueryBuilder, _Model$QueryBuilder);function PaginationQueryBuilder() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PaginationQueryBuilder);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PaginationQueryBuilder).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PaginationQueryBuilder, [{ key: "pagination", value: function pagination(
|
|
page, pageSize) {
|
|
return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PaginationQueryBuilder.prototype), "page", this).call(this, page, pageSize).runAfter(
|
|
function (_ref) {var results = _ref.results,total = _ref.total;
|
|
return {
|
|
results: results,
|
|
pagination: {
|
|
total: total,
|
|
page: page + 1,
|
|
pageSize: pageSize } };
|
|
|
|
|
|
});
|
|
} }]);return PaginationQueryBuilder;}(objection__WEBPACK_IMPORTED_MODULE_6__["Model"].QueryBuilder);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Permission.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/models/Permission.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Permission; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
|
|
var
|
|
|
|
Permission = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Permission, _TenantModel);function Permission() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Permission);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Permission).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Permission, null, [{ key: "tableName",
|
|
/**
|
|
* Table name of Role model.
|
|
* @type {String}
|
|
*/get: function get()
|
|
{
|
|
return 'permissions';
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Role = __webpack_require__(/*! @/models/Role */ "./src/models/Role.js");
|
|
|
|
return {
|
|
/**
|
|
* Permission model may belongs to role model.
|
|
*/
|
|
// role: {
|
|
// relation: Model.BelongsToOneRelation,
|
|
// modelBase: path.join(__dirname, 'Role').bindKnex(this.knexBinded),
|
|
// join: {
|
|
// from: 'permissions.role_id',
|
|
// to: 'roles.id',
|
|
// },
|
|
// },
|
|
|
|
// resource: {
|
|
// relation: Model.BelongsToOneRelation,
|
|
// modelBase: path.join(__dirname, 'Resource'),
|
|
// join: {
|
|
// from: 'permissions.',
|
|
// to: '',
|
|
// }
|
|
// }
|
|
};
|
|
} }]);return Permission;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Resource.js":
|
|
/*!********************************!*\
|
|
!*** ./src/models/Resource.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Resource; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js");
|
|
/* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js");
|
|
|
|
|
|
|
|
var
|
|
|
|
Resource = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Resource, _mixin);function Resource() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Resource);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Resource).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Resource, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'resources';
|
|
}
|
|
|
|
/**
|
|
* Extend query builder model.
|
|
*/ }, { key: "QueryBuilder", get: function get()
|
|
{
|
|
return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__["default"];
|
|
}
|
|
|
|
/**
|
|
* Timestamp columns.
|
|
*/ }, { key: "hasTimestamps", get: function get()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var View = __webpack_require__(/*! @/models/View */ "./src/models/View.js");
|
|
var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js");
|
|
var Permission = __webpack_require__(/*! @/models/Permission */ "./src/models/Permission.js");
|
|
|
|
return {
|
|
/**
|
|
* Resource model may has many views.
|
|
*/
|
|
views: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation,
|
|
modelClass: this.relationBindKnex(View["default"]),
|
|
join: {
|
|
from: 'resources.id',
|
|
to: 'views.resourceId' } },
|
|
|
|
|
|
|
|
/**
|
|
* Resource model may has many fields.
|
|
*/
|
|
fields: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation,
|
|
modelClass: this.relationBindKnex(ResourceField["default"]),
|
|
join: {
|
|
from: 'resources.id',
|
|
to: 'resource_fields.resourceId' } },
|
|
|
|
|
|
|
|
/**
|
|
* Resource model may has many associated permissions.
|
|
*/
|
|
permissions: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation,
|
|
modelClass: this.relationBindKnex(Permission["default"]),
|
|
join: {
|
|
from: 'resources.id',
|
|
through: {
|
|
from: 'role_has_permissions.resourceId',
|
|
to: 'role_has_permissions.permissionId' },
|
|
|
|
to: 'permissions.id' } } };
|
|
|
|
|
|
|
|
} }]);return Resource;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__["default"]]));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ResourceField.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/models/ResourceField.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ResourceField; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
|
|
|
|
var
|
|
|
|
ResourceField = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ResourceField, _TenantModel);function ResourceField() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResourceField);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ResourceField).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ResourceField, [{ key: "key",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Resource field key.
|
|
*/value: function key()
|
|
{
|
|
return Object(lodash__WEBPACK_IMPORTED_MODULE_5__["snakeCase"])(this.labelName);
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }], [{ key: "tableName", /**
|
|
* Table name.
|
|
*/get: function get() {return 'resource_fields';} }, { key: "jsonAttributes", get: function get() {return ['options'];} /**
|
|
* Model modifiers.
|
|
*/ }, { key: "modifiers", get: function get() {return { whereNotPredefined: function whereNotPredefined(query) {query.whereNot('predefined', true);} };} /**
|
|
* Timestamp columns.
|
|
*/ }, { key: "hasTimestamps", get: function get() {return false;} /**
|
|
* Virtual attributes.
|
|
*/ }, { key: "virtualAttributes", get: function get() {return ['key'];} }, { key: "relationMappings", get: function get() {var Resource = __webpack_require__(/*! @/models/Resource */ "./src/models/Resource.js");return { /**
|
|
* Resource field may belongs to resource model.
|
|
*/resource: { relation: objection__WEBPACK_IMPORTED_MODULE_6__["Model"].BelongsToOneRelation, modelClass: this.relationBindKnex(Resource["default"]),
|
|
join: {
|
|
from: 'resource_fields.resourceId',
|
|
to: 'resources.id' } } };
|
|
|
|
|
|
|
|
} }]);return ResourceField;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_8__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ResourceFieldMetadata.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/models/ResourceFieldMetadata.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ResourceFieldMetadata; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _collection_ResourceFieldMetadataCollection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/collection/ResourceFieldMetadataCollection */ "./src/collection/ResourceFieldMetadataCollection.js");
|
|
|
|
var
|
|
|
|
ResourceFieldMetadata = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ResourceFieldMetadata, _TenantModel);function ResourceFieldMetadata() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ResourceFieldMetadata);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ResourceFieldMetadata).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ResourceFieldMetadata, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'resource_custom_fields_metadata';
|
|
}
|
|
|
|
/**
|
|
* Override the resource field metadata collection.
|
|
*/ }, { key: "collection", get: function get()
|
|
{
|
|
return _collection_ResourceFieldMetadataCollection__WEBPACK_IMPORTED_MODULE_6__["default"];
|
|
} }]);return ResourceFieldMetadata;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Role.js":
|
|
/*!****************************!*\
|
|
!*** ./src/models/Role.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Role; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
var
|
|
|
|
Role = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Role, _TenantModel);function Role() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Role);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Role).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Role, null, [{ key: "tableName",
|
|
/**
|
|
* Table name of Role model.
|
|
* @type {String}
|
|
*/get: function get()
|
|
{
|
|
return 'roles';
|
|
}
|
|
|
|
/**
|
|
* Timestamp columns.
|
|
*/ }, { key: "hasTimestamps", get: function get()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Permission = __webpack_require__(/*! @/models/Permission */ "./src/models/Permission.js");
|
|
var Resource = __webpack_require__(/*! @/models/Resource */ "./src/models/Resource.js");
|
|
var User = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js");
|
|
var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js");
|
|
|
|
return {
|
|
/**
|
|
* Role may has many permissions.
|
|
*/
|
|
permissions: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation,
|
|
modelClass: Permission["default"].bindKnex(this.knexBinded),
|
|
join: {
|
|
from: 'roles.id',
|
|
through: {
|
|
from: 'role_has_permissions.roleId',
|
|
to: 'role_has_permissions.permissionId' },
|
|
|
|
to: 'permissions.id' } },
|
|
|
|
|
|
|
|
/**
|
|
* Role may has many resources.
|
|
*/
|
|
resources: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation,
|
|
modelClass: Resource["default"].bindKnex(this.knexBinded),
|
|
join: {
|
|
from: 'roles.id',
|
|
through: {
|
|
from: 'role_has_permissions.roleId',
|
|
to: 'role_has_permissions.resourceId' },
|
|
|
|
to: 'resources.id' } },
|
|
|
|
|
|
|
|
/**
|
|
* Role may has resource field.
|
|
*/
|
|
field: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: ResourceField["default"].bindKnex(this.knexBinded),
|
|
join: {
|
|
from: 'roles.fieldId',
|
|
to: 'resource_fields.id' } },
|
|
|
|
|
|
|
|
/**
|
|
* Role may has many associated users.
|
|
*/
|
|
users: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].ManyToManyRelation,
|
|
modelClass: User["default"].bindKnex(this.knexBinded),
|
|
join: {
|
|
from: 'roles.id',
|
|
through: {
|
|
from: 'user_has_roles.roleId',
|
|
to: 'user_has_roles.userId' },
|
|
|
|
to: 'users.id' } } };
|
|
|
|
|
|
|
|
} }]);return Role;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/Setting.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/models/Setting.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Setting; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _Auth__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Auth */ "./src/models/Auth.js");
|
|
|
|
var
|
|
|
|
Setting = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Setting, _TenantModel);function Setting() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Setting);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Setting).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Setting, null, [{ key: "extraMetadataQuery",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Extra metadata query to query with the current authenticate user.
|
|
* @param {Object} query
|
|
*/value: function extraMetadataQuery(
|
|
query) {
|
|
if (_Auth__WEBPACK_IMPORTED_MODULE_6__["default"].isLogged()) {
|
|
query.where('user_id', _Auth__WEBPACK_IMPORTED_MODULE_6__["default"].userId());
|
|
}
|
|
} }, { key: "tableName", /**
|
|
* Table name
|
|
*/get: function get() {return 'settings';} /**
|
|
* Timestamp columns.
|
|
*/ }, { key: "hasTimestamps", get: function get() {return false;} }]);return Setting;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/TenantModel.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/models/TenantModel.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TenantModel; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/get */ "@babel/runtime/helpers/get");
|
|
/* harmony import */ var _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js");
|
|
var
|
|
|
|
TenantModel = /*#__PURE__*/function (_BaseModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(TenantModel, _BaseModel);function TenantModel() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TenantModel);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TenantModel).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TenantModel, null, [{ key: "tenant", value: function tenant()
|
|
{
|
|
if (!this.knexBinded) {
|
|
throw new Error('Tenant knex is not binded yet.');
|
|
}
|
|
return _babel_runtime_helpers_get__WEBPACK_IMPORTED_MODULE_4___default()(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TenantModel), "bindKnex", this).call(this, this.knexBinded);
|
|
}
|
|
|
|
/**
|
|
* Allow to embed models to express request.
|
|
*/ }, { key: "requestModel", value: function requestModel()
|
|
{
|
|
return true;
|
|
} }]);return TenantModel;}(_models_Model__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/TenantUser.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/models/TenantUser.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TenantUser; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bcryptjs */ "bcryptjs");
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _models_DateSession__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/models/DateSession */ "./src/models/DateSession.js");
|
|
|
|
|
|
|
|
|
|
// import PermissionsService from '@/services/PermissionsService';
|
|
var
|
|
TenantUser = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(TenantUser, _mixin);function TenantUser() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TenantUser);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TenantUser).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TenantUser, [{ key: "verifyPassword",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Verify the password of the user.
|
|
* @param {String} password - The given password.
|
|
* @return {Boolean}
|
|
*/value: function verifyPassword(
|
|
password) {
|
|
return bcryptjs__WEBPACK_IMPORTED_MODULE_5___default.a.compareSync(password, this.password);
|
|
} }, { key: "fullName", value: function fullName()
|
|
|
|
{
|
|
return "".concat(this.firstName, " ").concat(this.lastName || '');
|
|
} }], [{ key: "virtualAttributes", /**
|
|
* Virtual attributes.
|
|
*/get: function get() {return ['fullName'];} /**
|
|
* Table name
|
|
*/ }, { key: "tableName", get: function get() {return 'users';} /**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get() {var Role = __webpack_require__(/*! @/models/Role */ "./src/models/Role.js");return { roles: { relation: objection__WEBPACK_IMPORTED_MODULE_6__["Model"].ManyToManyRelation, modelClass: this.relationBindKnex(Role["default"]), join: { from: 'users.id', through: { from: 'user_has_roles.userId', to: 'user_has_roles.roleId' }, to: 'roles.id' } } };} }]);return TenantUser;}(Object(objection__WEBPACK_IMPORTED_MODULE_6__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"], [_models_DateSession__WEBPACK_IMPORTED_MODULE_8__["default"]]));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/View.js":
|
|
/*!****************************!*\
|
|
!*** ./src/models/View.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return View; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Cachable/CachableQueryBuilder */ "./src/lib/Cachable/CachableQueryBuilder.js");
|
|
/* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js");
|
|
|
|
|
|
|
|
var
|
|
|
|
View = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(View, _mixin);function View() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, View);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(View).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(View, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'views';
|
|
}
|
|
|
|
/**
|
|
* Extend query builder model.
|
|
*/ }, { key: "QueryBuilder", get: function get()
|
|
{
|
|
return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_7__["default"];
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var Resource = __webpack_require__(/*! @/models/Resource */ "./src/models/Resource.js");
|
|
var ViewColumn = __webpack_require__(/*! @/models/ViewColumn */ "./src/models/ViewColumn.js");
|
|
var ViewRole = __webpack_require__(/*! @/models/ViewRole */ "./src/models/ViewRole.js");
|
|
|
|
return {
|
|
/**
|
|
* View model belongs to resource model.
|
|
*/
|
|
resource: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(Resource["default"]),
|
|
join: {
|
|
from: 'views.resourceId',
|
|
to: 'resources.id' } },
|
|
|
|
|
|
|
|
/**
|
|
* View model may has many columns.
|
|
*/
|
|
columns: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation,
|
|
modelClass: this.relationBindKnex(ViewColumn["default"]),
|
|
join: {
|
|
from: 'views.id',
|
|
to: 'view_has_columns.viewId' } },
|
|
|
|
|
|
|
|
/**
|
|
* View model may has many view roles.
|
|
*/
|
|
roles: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation,
|
|
modelClass: this.relationBindKnex(ViewRole["default"]),
|
|
join: {
|
|
from: 'views.id',
|
|
to: 'view_roles.viewId' } } };
|
|
|
|
|
|
|
|
} }]);return View;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_8__["default"]]));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ViewColumn.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/models/ViewColumn.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ViewColumn; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
var
|
|
|
|
ViewColumn = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ViewColumn, _TenantModel);function ViewColumn() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ViewColumn);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ViewColumn).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ViewColumn, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'view_has_columns';
|
|
}
|
|
|
|
/**
|
|
* Timestamp columns.
|
|
*/ }, { key: "hasTimestamps", get: function get()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js");
|
|
|
|
return {
|
|
/**
|
|
* View role model may belongs to resource field model.
|
|
*/
|
|
field: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(ResourceField["default"]),
|
|
join: {
|
|
from: 'view_has_columns.fieldId',
|
|
to: 'resource_fields.id' } } };
|
|
|
|
|
|
|
|
} }]);return ViewColumn;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/models/ViewRole.js":
|
|
/*!********************************!*\
|
|
!*** ./src/models/ViewRole.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ViewRole; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
|
|
var
|
|
|
|
ViewRole = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ViewRole, _TenantModel);function ViewRole() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ViewRole);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ViewRole).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ViewRole, null, [{ key: "virtualAttributes",
|
|
|
|
/**
|
|
* Virtual attributes.
|
|
*/get: function get()
|
|
{
|
|
return ['comparators'];
|
|
} }, { key: "comparators", get: function get()
|
|
|
|
{
|
|
return [
|
|
'equals', 'not_equal', 'contains', 'not_contain'];
|
|
|
|
}
|
|
|
|
/**
|
|
* Table name.
|
|
*/ }, { key: "tableName", get: function get()
|
|
{
|
|
return 'view_roles';
|
|
}
|
|
|
|
/**
|
|
* Timestamp columns.
|
|
*/ }, { key: "hasTimestamps", get: function get()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get()
|
|
{
|
|
var ResourceField = __webpack_require__(/*! @/models/ResourceField */ "./src/models/ResourceField.js");
|
|
var View = __webpack_require__(/*! @/models/View */ "./src/models/View.js");
|
|
|
|
return {
|
|
/**
|
|
* View role model may belongs to view model.
|
|
*/
|
|
view: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(View["default"]),
|
|
join: {
|
|
from: 'view_roles.viewId',
|
|
to: 'views.id' } },
|
|
|
|
|
|
|
|
/**
|
|
* View role model may belongs to resource field model.
|
|
*/
|
|
field: {
|
|
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
|
|
modelClass: this.relationBindKnex(ResourceField["default"]),
|
|
join: {
|
|
from: 'view_roles.fieldId',
|
|
to: 'resource_fields.id' } } };
|
|
|
|
|
|
|
|
} }]);return ViewRole;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/server.js":
|
|
/*!***********************!*\
|
|
!*** ./src/server.js ***!
|
|
\***********************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var errorhandler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! errorhandler */ "errorhandler");
|
|
/* harmony import */ var errorhandler__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(errorhandler__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/app */ "./src/app.js");
|
|
|
|
|
|
|
|
_app__WEBPACK_IMPORTED_MODULE_1__["default"].use(errorhandler__WEBPACK_IMPORTED_MODULE_0___default.a);
|
|
|
|
var server = _app__WEBPACK_IMPORTED_MODULE_1__["default"].listen(_app__WEBPACK_IMPORTED_MODULE_1__["default"].get('port'), function () {
|
|
console.log(
|
|
' App is running at http://localhost:%d in %s mode',
|
|
_app__WEBPACK_IMPORTED_MODULE_1__["default"].get('port'),
|
|
_app__WEBPACK_IMPORTED_MODULE_1__["default"].get('env'));
|
|
|
|
console.log(' Press CTRL-C to stop');
|
|
});
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (server);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/services/Accounting/JournalEntry.js":
|
|
/*!*************************************************!*\
|
|
!*** ./src/services/Accounting/JournalEntry.js ***!
|
|
\*************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return JournalEntry; });
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}var
|
|
JournalEntry =
|
|
function JournalEntry(entry) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, JournalEntry);
|
|
var defaults = {
|
|
credit: 0,
|
|
debit: 0 };
|
|
|
|
this.entry = _objectSpread({}, defaults, {}, entry);
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/services/Accounting/JournalPoster.js":
|
|
/*!**************************************************!*\
|
|
!*** ./src/services/Accounting/JournalPoster.js ***!
|
|
\**************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return JournalPoster; });
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray");
|
|
/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalEntry */ "./src/services/Accounting/JournalEntry.js");
|
|
/* harmony import */ var _models_AccountTransaction__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/AccountTransaction */ "./src/models/AccountTransaction.js");
|
|
/* harmony import */ var _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/models/AccountBalance */ "./src/models/AccountBalance.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
|
|
/* harmony import */ var _models_Account__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
|
|
/* harmony import */ var _collection_NestedSet__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../collection/NestedSet */ "./src/collection/NestedSet/index.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
|
|
JournalPoster = /*#__PURE__*/function () {
|
|
/**
|
|
* Journal poster constructor.
|
|
*/
|
|
function JournalPoster(accountsGraph) {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, JournalPoster);
|
|
this.entries = [];
|
|
this.balancesChange = {};
|
|
this.deletedEntriesIds = [];
|
|
|
|
this.accountsBalanceTable = {};
|
|
this.accountsGraph = accountsGraph;
|
|
}
|
|
|
|
/**
|
|
* Writes the credit entry for the given account.
|
|
* @param {JournalEntry} entry -
|
|
*/_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(JournalPoster, [{ key: "credit", value: function credit(
|
|
entryModel) {
|
|
if (entryModel instanceof _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_8__["default"] === false) {
|
|
throw new Error('The entry is not instance of JournalEntry.');
|
|
}
|
|
this.entries.push(entryModel.entry);
|
|
this.setAccountBalanceChange(entryModel.entry, 'credit');
|
|
}
|
|
|
|
/**
|
|
* Writes the debit entr y for the given account.
|
|
* @param {JournalEntry} entry -
|
|
*/ }, { key: "debit", value: function debit(
|
|
entryModel) {
|
|
if (entryModel instanceof _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_8__["default"] === false) {
|
|
throw new Error('The entry is not instance of JournalEntry.');
|
|
}
|
|
this.entries.push(entryModel.entry);
|
|
this.setAccountBalanceChange(entryModel.entry, 'debit');
|
|
}
|
|
|
|
/**
|
|
* Sets account balance change.
|
|
* @param {JournalEntry} entry
|
|
* @param {String} type
|
|
*/ }, { key: "setAccountBalanceChange", value: function setAccountBalanceChange(
|
|
entry, entryType) {var _this = this;
|
|
var depAccountsIds = this.accountsGraph.dependantsOf(entry.account);
|
|
|
|
var balanceChangeEntry = {
|
|
debit: entry.debit,
|
|
credit: entry.credit,
|
|
entryType: entryType,
|
|
accountNormal: entry.accountNormal };
|
|
|
|
this._setAccountBalanceChange(_objectSpread({},
|
|
balanceChangeEntry, {
|
|
accountId: entry.account }));
|
|
|
|
|
|
// Effect parent accounts of the given account id.
|
|
depAccountsIds.forEach(function (accountId) {
|
|
_this._setAccountBalanceChange(_objectSpread({},
|
|
balanceChangeEntry, {
|
|
accountId: accountId }));
|
|
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Sets account balance change.
|
|
* @private
|
|
*/ }, { key: "_setAccountBalanceChange", value: function _setAccountBalanceChange(_ref)
|
|
|
|
|
|
{var accountId = _ref.accountId,accountNormal = _ref.accountNormal,debit = _ref.debit,credit = _ref.credit,entryType = _ref.entryType;
|
|
if (!this.balancesChange[accountId]) {
|
|
this.balancesChange[accountId] = 0;
|
|
}
|
|
var change = 0;
|
|
|
|
if (accountNormal === 'credit') {
|
|
change = entryType === 'credit' ? credit : -1 * debit;
|
|
} else if (accountNormal === 'debit') {
|
|
change = entryType === 'debit' ? debit : -1 * credit;
|
|
}
|
|
this.balancesChange[accountId] += change;
|
|
}
|
|
|
|
/**
|
|
* Mapping the balance change to list.
|
|
*/ }, { key: "mapBalanceChangesToList", value: function mapBalanceChangesToList()
|
|
{var _this2 = this;
|
|
var mappedList = [];
|
|
|
|
Object.keys(this.balancesChange).forEach(function (accountId) {
|
|
var balance = _this2.balancesChange[accountId];
|
|
|
|
mappedList.push({
|
|
account_id: accountId,
|
|
amount: balance });
|
|
|
|
});
|
|
return mappedList;
|
|
}
|
|
|
|
/**
|
|
* Saves the balance change of journal entries.
|
|
*/ }, { key: "saveBalance", value: function () {var _saveBalance = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee() {var balancesList, balanceUpdateOpers, balanceInsertOpers, balanceFindOneOpers, balanceAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
|
|
|
|
balancesList = this.mapBalanceChangesToList();
|
|
balanceUpdateOpers = [];
|
|
balanceInsertOpers = [];
|
|
balanceFindOneOpers = [];
|
|
balanceAccounts = [];
|
|
|
|
balancesList.forEach(function (balance) {
|
|
var oper = _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__["default"].tenant().
|
|
query().
|
|
findOne('account_id', balance.account_id);
|
|
balanceFindOneOpers.push(oper);
|
|
});_context.next = 8;return (
|
|
Promise.all(balanceFindOneOpers));case 8:balanceAccounts = _context.sent;
|
|
|
|
balancesList.forEach(function (balance) {
|
|
var method = balance.amount < 0 ? 'decrement' : 'increment';
|
|
|
|
// Detarmine if the account balance is already exists or not.
|
|
var foundAccBalance = balanceAccounts.some(function (account) {return (
|
|
account && account.account_id === balance.account_id);});
|
|
|
|
|
|
if (foundAccBalance) {
|
|
var query = _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__["default"].tenant().
|
|
query()[
|
|
method]('amount', Math.abs(balance.amount)).
|
|
where('account_id', balance.account_id);
|
|
|
|
balanceUpdateOpers.push(query);
|
|
} else {
|
|
var _query = _models_AccountBalance__WEBPACK_IMPORTED_MODULE_10__["default"].tenant().query().insert({
|
|
account_id: balance.account_id,
|
|
amount: balance.amount,
|
|
currency_code: 'USD' });
|
|
|
|
balanceInsertOpers.push(_query);
|
|
}
|
|
});_context.next = 12;return (
|
|
Promise.all([].concat(
|
|
balanceUpdateOpers, balanceInsertOpers)));case 12:case "end":return _context.stop();}}}, _callee, this);}));function saveBalance() {return _saveBalance.apply(this, arguments);}return saveBalance;}()
|
|
|
|
|
|
|
|
/**
|
|
* Saves the stacked journal entries to the storage.
|
|
*/ }, { key: "saveEntries", value: function () {var _saveEntries = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() {var saveOperations;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
|
|
saveOperations = [];
|
|
|
|
this.entries.forEach(function (entry) {
|
|
var oper = _models_AccountTransaction__WEBPACK_IMPORTED_MODULE_9__["default"].tenant().query().insert(_objectSpread({
|
|
accountId: entry.account },
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_6__["pick"])(entry, ['credit', 'debit', 'transactionType', 'date', 'userId',
|
|
'referenceType', 'referenceId', 'note'])));
|
|
|
|
saveOperations.push(function () {return oper;});
|
|
});_context2.next = 4;return (
|
|
Object(_utils__WEBPACK_IMPORTED_MODULE_11__["promiseSerial"])(saveOperations));case 4:case "end":return _context2.stop();}}}, _callee2, this);}));function saveEntries() {return _saveEntries.apply(this, arguments);}return saveEntries;}()
|
|
|
|
|
|
/**
|
|
* Reverses the stacked journal entries.
|
|
*/ }, { key: "reverseEntries", value: function reverseEntries()
|
|
{
|
|
var reverseEntries = [];
|
|
|
|
this.entries.forEach(function (entry) {
|
|
var reverseEntry = _objectSpread({}, entry);
|
|
|
|
if (entry.credit) {
|
|
reverseEntry.debit = entry.credit;
|
|
}
|
|
if (entry.debit) {
|
|
reverseEntry.credit = entry.debit;
|
|
}
|
|
reverseEntries.push(reverseEntry);
|
|
});
|
|
this.entries = reverseEntries;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {Array} ids -
|
|
*/ }, { key: "removeEntries", value: function removeEntries()
|
|
{var _this3 = this,_this$deletedEntriesI;var ids = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
var targetIds = ids.length <= 0 ? this.entries.map(function (e) {return e.id;}) : ids;
|
|
var removeEntries = this.entries.filter(function (e) {return targetIds.indexOf(e.id) !== -1;});
|
|
|
|
this.entries = this.entries.
|
|
filter(function (e) {return targetIds.indexOf(e.id) === -1;});
|
|
|
|
removeEntries.forEach(function (entry) {
|
|
entry.credit = -1 * entry.credit;
|
|
entry.debit = -1 * entry.debit;
|
|
|
|
_this3.setAccountBalanceChange(entry, entry.accountNormal);
|
|
});
|
|
(_this$deletedEntriesI = this.deletedEntriesIds).push.apply(_this$deletedEntriesI, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(
|
|
removeEntries.map(function (entry) {return entry.id;})));
|
|
|
|
}
|
|
|
|
/**
|
|
* Delete all the stacked entries.
|
|
*/ }, { key: "deleteEntries", value: function () {var _deleteEntries = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() {return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:if (!(
|
|
|
|
this.deletedEntriesIds.length > 0)) {_context3.next = 3;break;}_context3.next = 3;return (
|
|
_models_AccountTransaction__WEBPACK_IMPORTED_MODULE_9__["default"].tenant().query().
|
|
whereIn('id', this.deletedEntriesIds)["delete"]());case 3:case "end":return _context3.stop();}}}, _callee3, this);}));function deleteEntries() {return _deleteEntries.apply(this, arguments);}return deleteEntries;}()
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve the closing balance for the given account and closing date.
|
|
* @param {Number} accountId -
|
|
* @param {Date} closingDate -
|
|
*/ }, { key: "getClosingBalance", value: function getClosingBalance(
|
|
accountId, closingDate) {var dateType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'day';
|
|
var closingBalance = 0;
|
|
var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate);
|
|
|
|
this.entries.forEach(function (entry) {
|
|
// Can not continue if not before or event same closing date.
|
|
if (!momentClosingDate.isAfter(entry.date, dateType) &&
|
|
!momentClosingDate.isSame(entry.date, dateType) ||
|
|
entry.account !== accountId && accountId) {
|
|
return;
|
|
}
|
|
if (entry.accountNormal === 'credit') {
|
|
closingBalance += entry.credit ? entry.credit : -1 * entry.debit;
|
|
} else if (entry.accountNormal === 'debit') {
|
|
closingBalance += entry.debit ? entry.debit : -1 * entry.credit;
|
|
}
|
|
});
|
|
return closingBalance;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the given account balance with dependencies accounts.
|
|
* @param {Number} accountId
|
|
* @param {Date} closingDate
|
|
* @param {String} dateType
|
|
* @return {Number}
|
|
*/ }, { key: "getAccountBalance", value: function getAccountBalance(
|
|
accountId, closingDate, dateType) {var _this4 = this;
|
|
var accountNode = this.accountsGraph.getNodeData(accountId);
|
|
var depAccountsIds = this.accountsGraph.dependenciesOf(accountId);
|
|
var depAccounts = depAccountsIds.map(function (id) {return _this4.accountsGraph.getNodeData(id);});
|
|
var balance = 0;
|
|
|
|
[].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(depAccounts), [accountNode]).forEach(function (account) {
|
|
// if (!this.accountsBalanceTable[account.id]) {
|
|
var closingBalance = _this4.getClosingBalance(account.id, closingDate, dateType);
|
|
_this4.accountsBalanceTable[account.id] = closingBalance;
|
|
// }
|
|
balance += _this4.accountsBalanceTable[account.id];
|
|
});
|
|
return balance;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the credit/debit sumation for the given account and date.
|
|
* @param {Number} account -
|
|
* @param {Date|String} closingDate -
|
|
*/ }, { key: "getTrialBalance", value: function getTrialBalance(
|
|
accountId, closingDate, dateType) {
|
|
var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate);
|
|
var result = {
|
|
credit: 0,
|
|
debit: 0,
|
|
balance: 0 };
|
|
|
|
this.entries.forEach(function (entry) {
|
|
if (!momentClosingDate.isAfter(entry.date, dateType) &&
|
|
!momentClosingDate.isSame(entry.date, dateType) ||
|
|
entry.account !== accountId && accountId) {
|
|
return;
|
|
}
|
|
result.credit += entry.credit;
|
|
result.debit += entry.debit;
|
|
|
|
if (entry.accountNormal === 'credit') {
|
|
result.balance += entry.credit - entry.debit;
|
|
} else if (entry.accountNormal === 'debit') {
|
|
result.balance += entry.debit - entry.credit;
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Retrieve trial balance of the given account with depends.
|
|
* @param {Number} accountId
|
|
* @param {Date} closingDate
|
|
* @param {String} dateType
|
|
* @return {Number}
|
|
*/ }, { key: "getTrialBalanceWithDepands", value: function getTrialBalanceWithDepands(
|
|
accountId, closingDate, dateType) {var _this5 = this;
|
|
var accountNode = this.accountsGraph.getNodeData(accountId);
|
|
var depAccountsIds = this.accountsGraph.dependenciesOf(accountId);
|
|
var depAccounts = depAccountsIds.map(function (id) {return _this5.accountsGraph.getNodeData(id);});
|
|
|
|
var trialBalance = { credit: 0, debit: 0, balance: 0 };
|
|
|
|
[].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(depAccounts), [accountNode]).forEach(function (account) {
|
|
var _trialBalance = _this5.getTrialBalance(account.id, closingDate, dateType);
|
|
|
|
trialBalance.credit += _trialBalance.credit;
|
|
trialBalance.debit += _trialBalance.debit;
|
|
trialBalance.balance += _trialBalance.balance;
|
|
});
|
|
return trialBalance;
|
|
}
|
|
|
|
/**
|
|
* Load fetched accounts journal entries.
|
|
* @param {Array} entries -
|
|
*/ }, { key: "loadEntries", value: function loadEntries(
|
|
entries) {var _this6 = this;
|
|
entries.forEach(function (entry) {
|
|
_this6.entries.push(_objectSpread({},
|
|
entry, {
|
|
account: entry.account ? entry.account.id : entry.accountId,
|
|
accountNormal: entry.account && entry.account.type ?
|
|
entry.account.type.normal : entry.accountNormal }));
|
|
|
|
});
|
|
} }, { key: "calculateEntriesBalanceChange", value: function calculateEntriesBalanceChange()
|
|
|
|
{var _this7 = this;
|
|
this.entries.forEach(function (entry) {
|
|
if (entry.credit) {
|
|
_this7.setAccountBalanceChange(entry, 'credit');
|
|
}
|
|
if (entry.debit) {
|
|
_this7.setAccountBalanceChange(entry, 'debit');
|
|
}
|
|
});
|
|
} }]);return JournalPoster;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/services/Cache/index.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/services/Cache/index.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var node_cache__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-cache */ "node-cache");
|
|
/* harmony import */ var node_cache__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_cache__WEBPACK_IMPORTED_MODULE_2__);
|
|
var
|
|
|
|
Cache = /*#__PURE__*/function () {
|
|
|
|
function Cache() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Cache);
|
|
this.cache = new node_cache__WEBPACK_IMPORTED_MODULE_2___default.a({
|
|
// stdTTL: 9999999,
|
|
// checkperiod: 9999999 * 0.2,
|
|
useClones: false });
|
|
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Cache, [{ key: "get", value: function get(
|
|
|
|
key, storeFunction) {var _this = this;
|
|
var value = this.cache.get(key);
|
|
|
|
if (value) {
|
|
return Promise.resolve(value);
|
|
}
|
|
return storeFunction().then(function (result) {
|
|
_this.cache.set(key, result);
|
|
return result;
|
|
});
|
|
} }, { key: "set", value: function set(
|
|
|
|
key, results) {
|
|
this.cache.set(key, results);
|
|
} }, { key: "del", value: function del(
|
|
|
|
keys) {
|
|
this.cache.del(keys);
|
|
} }, { key: "delStartWith", value: function delStartWith()
|
|
|
|
{var startStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
if (!startStr) {
|
|
return;
|
|
}
|
|
|
|
var keys = this.cache.keys();var _iteratorNormalCompletion = true;var _didIteratorError = false;var _iteratorError = undefined;try {
|
|
for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {var key = _step.value;
|
|
if (key.indexOf(startStr) === 0) {
|
|
this.del(key);
|
|
}
|
|
}} catch (err) {_didIteratorError = true;_iteratorError = err;} finally {try {if (!_iteratorNormalCompletion && _iterator["return"] != null) {_iterator["return"]();}} finally {if (_didIteratorError) {throw _iteratorError;}}}
|
|
} }, { key: "flush", value: function flush()
|
|
|
|
{
|
|
this.cache.flushAll();
|
|
} }]);return Cache;}();
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new Cache());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/services/Logger/index.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/services/Logger/index.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var winston__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! winston */ "winston");
|
|
/* harmony import */ var winston__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(winston__WEBPACK_IMPORTED_MODULE_0__);
|
|
|
|
|
|
var transports = {
|
|
console: new winston__WEBPACK_IMPORTED_MODULE_0___default.a.transports.Console({ level: 'warn' }),
|
|
file: new winston__WEBPACK_IMPORTED_MODULE_0___default.a.transports.File({ filename: 'stdout.log' }) };
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (winston__WEBPACK_IMPORTED_MODULE_0___default.a.createLogger({
|
|
transports: [
|
|
transports.console,
|
|
transports.file] }));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/services/Subscription/UserSubscription.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./src/services/Subscription/UserSubscription.js ***!
|
|
\*******************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (function (Model) {
|
|
return (/*#__PURE__*/function (_Model) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(UserSubscription, _Model);function UserSubscription() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, UserSubscription);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(UserSubscription).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(UserSubscription, [{ key: "onTrial", value: function onTrial()
|
|
|
|
{
|
|
|
|
} }, { key: "getSubscription", value: function getSubscription()
|
|
|
|
{
|
|
|
|
} }, { key: "newSubscription", value: function newSubscription()
|
|
|
|
{
|
|
|
|
} }, { key: "isSubcribedTo", value: function isSubcribedTo(
|
|
|
|
plan) {
|
|
|
|
} }]);return UserSubscription;}(Model));
|
|
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/services/mail.js":
|
|
/*!******************************!*\
|
|
!*** ./src/services/mail.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var nodemailer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! nodemailer */ "nodemailer");
|
|
/* harmony import */ var nodemailer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(nodemailer__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/../config/config */ "./config/config.js");
|
|
/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_config__WEBPACK_IMPORTED_MODULE_1__);
|
|
|
|
|
|
|
|
// create reusable transporter object using the default SMTP transport
|
|
var transporter = nodemailer__WEBPACK_IMPORTED_MODULE_0___default.a.createTransport({
|
|
host: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.host,
|
|
port: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.port,
|
|
secure: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.secure, // true for 465, false for other ports
|
|
auth: {
|
|
user: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.username,
|
|
pass: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.password } });
|
|
|
|
|
|
|
|
console.log({
|
|
host: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.host,
|
|
port: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.port,
|
|
secure: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.secure, // true for 465, false for other ports
|
|
auth: {
|
|
user: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.username,
|
|
pass: _config_config__WEBPACK_IMPORTED_MODULE_1___default.a.mail.password } });
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (transporter);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/TenantsManager.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/system/TenantsManager.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TenantsManager; });
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
|
|
/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator");
|
|
/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator");
|
|
/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! knex */ "knex");
|
|
/* harmony import */ var knex__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(knex__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js");
|
|
/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/../config/config */ "./config/config.js");
|
|
/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_config_config__WEBPACK_IMPORTED_MODULE_8__);
|
|
/* harmony import */ var _models_TenantModel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/models/TenantModel */ "./src/models/TenantModel.js");
|
|
/* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! uniqid */ "uniqid");
|
|
/* harmony import */ var uniqid__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(uniqid__WEBPACK_IMPORTED_MODULE_10__);
|
|
/* harmony import */ var _database_manager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/database/manager */ "./src/database/manager.js");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_12__);
|
|
/* harmony import */ var _system_models_SystemUser__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/system/models/SystemUser */ "./src/system/models/SystemUser.js");
|
|
/* harmony import */ var _models_TenantUser__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/models/TenantUser */ "./src/models/TenantUser.js");
|
|
function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(source, true).forEach(function (key) {_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(source).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// import TenantModel from '@/models/TenantModel';
|
|
|
|
// const TenantWebsite: {
|
|
// tenantDb: Knex,
|
|
// tenantId: Number,
|
|
// tenantOrganizationId: String,
|
|
// }
|
|
var
|
|
TenantsManager = /*#__PURE__*/function () {
|
|
|
|
function TenantsManager() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, TenantsManager);
|
|
this.knexCache = new Map();
|
|
}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(TenantsManager, null, [{ key: "getTenant", value: function () {var _getTenant = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(
|
|
|
|
organizationId) {var tenant;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.next = 2;return (
|
|
_system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__["default"].query().
|
|
where('organization_id', organizationId).first());case 2:tenant = _context.sent;return _context.abrupt("return",
|
|
|
|
tenant);case 4:case "end":return _context.stop();}}}, _callee);}));function getTenant(_x) {return _getTenant.apply(this, arguments);}return getTenant;}()
|
|
|
|
|
|
/**
|
|
* Creates a new tenant database.
|
|
* @param {Integer} uniqId
|
|
* @return {TenantWebsite}
|
|
*/ }, { key: "createTenant", value: function () {var _createTenant = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(
|
|
uniqId) {var organizationId, tenantOrganization, tenantDbName, tenantDb;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
|
|
organizationId = uniqId || uniqid__WEBPACK_IMPORTED_MODULE_10___default()();_context2.next = 3;return (
|
|
_system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__["default"].query().insert({
|
|
organization_id: organizationId }));case 3:tenantOrganization = _context2.sent;
|
|
|
|
|
|
tenantDbName = "bigcapital_tenant_".concat(organizationId);_context2.next = 7;return (
|
|
_database_manager__WEBPACK_IMPORTED_MODULE_11__["default"].createDb(tenantDbName));case 7:
|
|
|
|
tenantDb = TenantsManager.knexInstance(organizationId);_context2.next = 10;return (
|
|
tenantDb.migrate.latest());case 10:return _context2.abrupt("return",
|
|
|
|
{
|
|
tenantDb: tenantDb,
|
|
tenantId: tenantOrganization.id,
|
|
organizationId: organizationId });case 11:case "end":return _context2.stop();}}}, _callee2);}));function createTenant(_x2) {return _createTenant.apply(this, arguments);}return createTenant;}()
|
|
|
|
|
|
|
|
/**
|
|
* Drop tenant database of the given tenant website.
|
|
* @param {TenantWebsite} tenantWebsite
|
|
*/ }, { key: "dropTenant", value: function () {var _dropTenant = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(
|
|
tenantWebsite) {var tenantDbName;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
|
|
tenantDbName = "bigcapital_tenant_".concat(tenantWebsite.organizationId);_context3.next = 3;return (
|
|
_database_manager__WEBPACK_IMPORTED_MODULE_11__["default"].dropDb(tenantDbName));case 3:_context3.next = 5;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_13__["default"].query().
|
|
where('tenant_id', tenantWebsite.tenantId));case 5:case "end":return _context3.stop();}}}, _callee3);}));function dropTenant(_x3) {return _dropTenant.apply(this, arguments);}return dropTenant;}()
|
|
|
|
|
|
/**
|
|
* Creates a user that associate to the given tenant.
|
|
*/ }, { key: "createTenantUser", value: function () {var _createTenantUser = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee4(
|
|
tenantWebsite, user) {var userInsert, systemUser, tenantUser;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee4$(_context4) {while (1) {switch (_context4.prev = _context4.next) {case 0:
|
|
userInsert = _objectSpread({}, user);_context4.next = 3;return (
|
|
|
|
_system_models_SystemUser__WEBPACK_IMPORTED_MODULE_13__["default"].query().insert(_objectSpread({},
|
|
user, {
|
|
tenant_id: tenantWebsite.tenantId })));case 3:systemUser = _context4.sent;
|
|
|
|
_models_TenantModel__WEBPACK_IMPORTED_MODULE_9__["default"].knexBinded = tenantWebsite.tenantDb;_context4.next = 7;return (
|
|
|
|
_models_TenantUser__WEBPACK_IMPORTED_MODULE_14__["default"].bindKnex(tenantWebsite.tenantDb).
|
|
query().
|
|
insert(_objectSpread({},
|
|
Object(lodash__WEBPACK_IMPORTED_MODULE_12__["omit"])(userInsert, ['password']))));case 7:tenantUser = _context4.sent;return _context4.abrupt("return", _objectSpread({},
|
|
|
|
|
|
tenantUser, {},
|
|
systemUser));case 9:case "end":return _context4.stop();}}}, _callee4);}));function createTenantUser(_x4, _x5) {return _createTenantUser.apply(this, arguments);}return createTenantUser;}()
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve all tenants metadata from system storage.
|
|
*/ }, { key: "getAllTenants", value: function getAllTenants()
|
|
{
|
|
return _system_models_Tenant__WEBPACK_IMPORTED_MODULE_7__["default"].query();
|
|
}
|
|
|
|
/**
|
|
* Retrieve the given organization id knex configuration.
|
|
* @param {String} organizationId -
|
|
*/ }, { key: "getTenantKnexConfig", value: function getTenantKnexConfig(
|
|
organizationId) {
|
|
return {
|
|
client: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_client,
|
|
connection: {
|
|
host: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_host,
|
|
user: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_user,
|
|
password: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_password,
|
|
database: "".concat(_config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.db_name_prefix).concat(organizationId),
|
|
charset: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.charset },
|
|
|
|
migrations: {
|
|
directory: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.migrations_dir },
|
|
|
|
seeds: {
|
|
directory: _config_config__WEBPACK_IMPORTED_MODULE_8___default.a.tenant.seeds_dir },
|
|
|
|
pool: { min: 0, max: 5 } };
|
|
|
|
} }, { key: "knexInstance", value: function knexInstance(
|
|
|
|
organizationId) {
|
|
var knexCache = new Map();
|
|
var knex = knexCache.get(organizationId);
|
|
|
|
if (!knex) {
|
|
knex = knex__WEBPACK_IMPORTED_MODULE_5___default()(_objectSpread({},
|
|
this.getTenantKnexConfig(organizationId), {},
|
|
Object(objection__WEBPACK_IMPORTED_MODULE_6__["knexSnakeCaseMappers"])({ upperCase: true })));
|
|
|
|
knexCache.set(organizationId, knex);
|
|
}
|
|
return knex;
|
|
} }]);return TenantsManager;}();
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/models/Invite.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/system/models/Invite.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return UserInvite; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js");
|
|
var
|
|
|
|
UserInvite = /*#__PURE__*/function (_SystemModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(UserInvite, _SystemModel);function UserInvite() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, UserInvite);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(UserInvite).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(UserInvite, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'user_invites';
|
|
} }]);return UserInvite;}(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/models/PasswordReset.js":
|
|
/*!********************************************!*\
|
|
!*** ./src/system/models/PasswordReset.js ***!
|
|
\********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PasswordResets; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js");
|
|
var
|
|
|
|
PasswordResets = /*#__PURE__*/function (_SystemModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(PasswordResets, _SystemModel);function PasswordResets() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PasswordResets);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PasswordResets).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PasswordResets, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'password_resets';
|
|
} }]);return PasswordResets;}(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/models/SubscriptionUsage.js":
|
|
/*!************************************************!*\
|
|
!*** ./src/system/models/SubscriptionUsage.js ***!
|
|
\************************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SubscriptionUsage; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js");
|
|
var
|
|
|
|
SubscriptionUsage = /*#__PURE__*/function (_SystemModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(SubscriptionUsage, _SystemModel);function SubscriptionUsage() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SubscriptionUsage);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(SubscriptionUsage).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SubscriptionUsage, null, [{ key: "tableName",
|
|
/**
|
|
* Table name
|
|
*/get: function get()
|
|
{
|
|
return 'subscriptions_usage';
|
|
} }]);return SubscriptionUsage;}(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/models/SystemModel.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/system/models/SystemModel.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SystemModel; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js");
|
|
var
|
|
|
|
SystemModel = /*#__PURE__*/function (_BaseModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(SystemModel, _BaseModel);function SystemModel() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SystemModel);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(SystemModel).apply(this, arguments));}return SystemModel;}(_models_Model__WEBPACK_IMPORTED_MODULE_4__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/models/SystemUser.js":
|
|
/*!*****************************************!*\
|
|
!*** ./src/system/models/SystemUser.js ***!
|
|
\*****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SystemUser; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! objection */ "objection");
|
|
/* harmony import */ var objection__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(objection__WEBPACK_IMPORTED_MODULE_5__);
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! bcryptjs */ "bcryptjs");
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _system_models_SystemModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/system/models/SystemModel */ "./src/system/models/SystemModel.js");
|
|
/* harmony import */ var _models_DateSession__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/models/DateSession */ "./src/models/DateSession.js");
|
|
/* harmony import */ var _services_Subscription_UserSubscription__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/services/Subscription/UserSubscription */ "./src/services/Subscription/UserSubscription.js");
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
|
|
SystemUser = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(SystemUser, _mixin);function SystemUser() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SystemUser);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(SystemUser).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SystemUser, [{ key: "verifyPassword",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Verify the password of the user.
|
|
* @param {String} password - The given password.
|
|
* @return {Boolean}
|
|
*/value: function verifyPassword(
|
|
password) {
|
|
return bcryptjs__WEBPACK_IMPORTED_MODULE_6___default.a.compareSync(password, this.password);
|
|
} }], [{ key: "tableName", /**
|
|
* Table name.
|
|
*/get: function get() {return 'users';} /**
|
|
* Relationship mapping.
|
|
*/ }, { key: "relationMappings", get: function get() {var Tenant = __webpack_require__(/*! @/system/models/Tenant */ "./src/system/models/Tenant.js");var SubscriptionUsage = __webpack_require__(/*! @/system/models/SubscriptionUsage */ "./src/system/models/SubscriptionUsage.js");return { tenant: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: Tenant["default"], join: { from: 'users.tenantId', to: 'tenants.id' } }, subscriptionUsage: { relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation, modelClass: SubscriptionUsage["default"], join: { from: 'users.id', to: 'subscriptions_usage.user_id' } } };} }]);return SystemUser;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_system_models_SystemModel__WEBPACK_IMPORTED_MODULE_7__["default"], [_models_DateSession__WEBPACK_IMPORTED_MODULE_8__["default"], _services_Subscription_UserSubscription__WEBPACK_IMPORTED_MODULE_9__["default"]]));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/system/models/Tenant.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/system/models/Tenant.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Tenant; });
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "@babel/runtime/helpers/classCallCheck");
|
|
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "@babel/runtime/helpers/createClass");
|
|
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
|
|
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
|
|
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
|
|
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
|
|
/* harmony import */ var _models_Model__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/models/Model */ "./src/models/Model.js");
|
|
var
|
|
|
|
Tenant = /*#__PURE__*/function (_BaseModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Tenant, _BaseModel);function Tenant() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Tenant);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Tenant).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Tenant, null, [{ key: "tableName",
|
|
/**
|
|
* Table name.
|
|
*/get: function get()
|
|
{
|
|
return 'tenants';
|
|
} }]);return Tenant;}(_models_Model__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/utils/index.js":
|
|
/*!****************************!*\
|
|
!*** ./src/utils/index.js ***!
|
|
\****************************/
|
|
/*! exports provided: hashPassword, origin, dateRangeCollection, dateRangeFormat, mapValuesDeep, mapKeysDeep, promiseSerial, flatToNestedArray */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hashPassword", function() { return hashPassword; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "origin", function() { return origin; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dateRangeCollection", function() { return dateRangeCollection; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dateRangeFormat", function() { return dateRangeFormat; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapValuesDeep", function() { return mapValuesDeep; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapKeysDeep", function() { return mapKeysDeep; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "promiseSerial", function() { return promiseSerial; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flatToNestedArray", function() { return flatToNestedArray; });
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bcryptjs */ "bcryptjs");
|
|
/* harmony import */ var bcryptjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bcryptjs__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! moment */ "moment");
|
|
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash */ "lodash");
|
|
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_2__);
|
|
|
|
|
|
var _require =
|
|
__webpack_require__(/*! lodash */ "lodash"),map = _require.map,isArray = _require.isArray,isPlainObject = _require.isPlainObject,mapKeys = _require.mapKeys,mapValues = _require.mapValues;
|
|
|
|
|
|
var hashPassword = function hashPassword(password) {return new Promise(function (resolve) {
|
|
bcryptjs__WEBPACK_IMPORTED_MODULE_0___default.a.genSalt(10, function (error, salt) {
|
|
bcryptjs__WEBPACK_IMPORTED_MODULE_0___default.a.hash(password, salt, function (err, hash) {resolve(hash);});
|
|
});
|
|
});};
|
|
|
|
var origin = function origin(request) {return "".concat(request.protocol, "://").concat(request.hostname);};
|
|
|
|
var dateRangeCollection = function dateRangeCollection(fromDate, toDate) {var addType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'day';var increment = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
|
|
var collection = [];
|
|
var momentFromDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(fromDate);
|
|
var dateFormat = '';
|
|
|
|
switch (addType) {
|
|
case 'day':
|
|
default:
|
|
dateFormat = 'YYYY-MM-DD';break;
|
|
case 'month':
|
|
case 'quarter':
|
|
dateFormat = 'YYYY-MM';break;
|
|
case 'year':
|
|
dateFormat = 'YYYY';break;}
|
|
|
|
for (var i = momentFromDate;
|
|
i.isBefore(toDate, addType) || i.isSame(toDate, addType);
|
|
i.add(increment, "".concat(addType, "s"))) {
|
|
collection.push(i.endOf(addType).format(dateFormat));
|
|
}
|
|
return collection;
|
|
};
|
|
|
|
var dateRangeFormat = function dateRangeFormat(rangeType) {
|
|
switch (rangeType) {
|
|
case 'year':
|
|
return 'YYYY';
|
|
case 'month':
|
|
case 'quarter':
|
|
default:
|
|
return 'YYYY-MM';}
|
|
|
|
};
|
|
|
|
|
|
var mapKeysDeep = function mapKeysDeep(obj, cb) {
|
|
if (lodash__WEBPACK_IMPORTED_MODULE_2___default.a.isArray(obj)) {
|
|
return obj.map(function (innerObj) {return mapKeysDeep(innerObj, cb);});
|
|
} else
|
|
if (lodash__WEBPACK_IMPORTED_MODULE_2___default.a.isObject(obj)) {
|
|
return lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapValues(
|
|
lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapKeys(obj, cb),
|
|
function (val) {return mapKeysDeep(val, cb);});
|
|
|
|
} else {
|
|
return obj;
|
|
}
|
|
};
|
|
|
|
var mapValuesDeep = function mapValuesDeep(v, callback) {return (
|
|
lodash__WEBPACK_IMPORTED_MODULE_2___default.a.isObject(v) ?
|
|
lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapValues(v, function (v) {return mapValuesDeep(v, callback);}) :
|
|
callback(v));};
|
|
|
|
|
|
var promiseSerial = function promiseSerial(funcs) {
|
|
return funcs.reduce(function (promise, func) {return promise.then(function (result) {return func().then(Array.prototype.concat.bind(result));});},
|
|
Promise.resolve([]));
|
|
};
|
|
|
|
var flatToNestedArray = function flatToNestedArray(data) {var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { id: 'id', parentId: 'parent_id' };
|
|
var map = {};
|
|
var nestedArray = [];
|
|
|
|
data.forEach(function (item) {
|
|
map[item[config.id]] = item;
|
|
map[item[config.id]].children = [];
|
|
});
|
|
|
|
data.forEach(function (item) {
|
|
var parentItemId = item[config.parentId];
|
|
|
|
if (!item[config.parentId]) {
|
|
nestedArray.push(item);
|
|
}
|
|
if (parentItemId) {
|
|
map[parentItemId].children.push(item);
|
|
}
|
|
});
|
|
|
|
return nestedArray;
|
|
};
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 0:
|
|
/*!*********************************************************!*\
|
|
!*** multi @babel/plugin-transform-runtime @/server.js ***!
|
|
\*********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
__webpack_require__(/*! @babel/plugin-transform-runtime */"@babel/plugin-transform-runtime");
|
|
module.exports = __webpack_require__(/*! @/server.js */"./src/server.js");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/plugin-transform-runtime":
|
|
/*!**************************************************!*\
|
|
!*** external "@babel/plugin-transform-runtime" ***!
|
|
\**************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/plugin-transform-runtime");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/asyncToGenerator":
|
|
/*!**********************************************************!*\
|
|
!*** external "@babel/runtime/helpers/asyncToGenerator" ***!
|
|
\**********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/asyncToGenerator");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/classCallCheck":
|
|
/*!********************************************************!*\
|
|
!*** external "@babel/runtime/helpers/classCallCheck" ***!
|
|
\********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/classCallCheck");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/createClass":
|
|
/*!*****************************************************!*\
|
|
!*** external "@babel/runtime/helpers/createClass" ***!
|
|
\*****************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/createClass");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/defineProperty":
|
|
/*!********************************************************!*\
|
|
!*** external "@babel/runtime/helpers/defineProperty" ***!
|
|
\********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/defineProperty");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/get":
|
|
/*!*********************************************!*\
|
|
!*** external "@babel/runtime/helpers/get" ***!
|
|
\*********************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/get");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/getPrototypeOf":
|
|
/*!********************************************************!*\
|
|
!*** external "@babel/runtime/helpers/getPrototypeOf" ***!
|
|
\********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/getPrototypeOf");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/inherits":
|
|
/*!**************************************************!*\
|
|
!*** external "@babel/runtime/helpers/inherits" ***!
|
|
\**************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/inherits");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/objectWithoutProperties":
|
|
/*!*****************************************************************!*\
|
|
!*** external "@babel/runtime/helpers/objectWithoutProperties" ***!
|
|
\*****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/objectWithoutProperties");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/possibleConstructorReturn":
|
|
/*!*******************************************************************!*\
|
|
!*** external "@babel/runtime/helpers/possibleConstructorReturn" ***!
|
|
\*******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/possibleConstructorReturn");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/slicedToArray":
|
|
/*!*******************************************************!*\
|
|
!*** external "@babel/runtime/helpers/slicedToArray" ***!
|
|
\*******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/slicedToArray");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/toConsumableArray":
|
|
/*!***********************************************************!*\
|
|
!*** external "@babel/runtime/helpers/toConsumableArray" ***!
|
|
\***********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/toConsumableArray");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/helpers/typeof":
|
|
/*!************************************************!*\
|
|
!*** external "@babel/runtime/helpers/typeof" ***!
|
|
\************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/helpers/typeof");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@babel/runtime/regenerator":
|
|
/*!*********************************************!*\
|
|
!*** external "@babel/runtime/regenerator" ***!
|
|
\*********************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("@babel/runtime/regenerator");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "app-root-path":
|
|
/*!********************************!*\
|
|
!*** external "app-root-path" ***!
|
|
\********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("app-root-path");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "bcryptjs":
|
|
/*!***************************!*\
|
|
!*** external "bcryptjs" ***!
|
|
\***************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("bcryptjs");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "crypto":
|
|
/*!*************************!*\
|
|
!*** external "crypto" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("crypto");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dotenv":
|
|
/*!*************************!*\
|
|
!*** external "dotenv" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("dotenv");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "errorhandler":
|
|
/*!*******************************!*\
|
|
!*** external "errorhandler" ***!
|
|
\*******************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("errorhandler");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "express":
|
|
/*!**************************!*\
|
|
!*** external "express" ***!
|
|
\**************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("express");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "express-boom":
|
|
/*!*******************************!*\
|
|
!*** external "express-boom" ***!
|
|
\*******************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("express-boom");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "express-fileupload":
|
|
/*!*************************************!*\
|
|
!*** external "express-fileupload" ***!
|
|
\*************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("express-fileupload");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "express-validator":
|
|
/*!************************************!*\
|
|
!*** external "express-validator" ***!
|
|
\************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("express-validator");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fs":
|
|
/*!*********************!*\
|
|
!*** external "fs" ***!
|
|
\*********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("fs");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "helmet":
|
|
/*!*************************!*\
|
|
!*** external "helmet" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("helmet");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "i18n":
|
|
/*!***********************!*\
|
|
!*** external "i18n" ***!
|
|
\***********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("i18n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "jsonwebtoken":
|
|
/*!*******************************!*\
|
|
!*** external "jsonwebtoken" ***!
|
|
\*******************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("jsonwebtoken");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "knex":
|
|
/*!***********************!*\
|
|
!*** external "knex" ***!
|
|
\***********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("knex");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "knex-db-manager":
|
|
/*!**********************************!*\
|
|
!*** external "knex-db-manager" ***!
|
|
\**********************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("knex-db-manager");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "lodash":
|
|
/*!*************************!*\
|
|
!*** external "lodash" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("lodash");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "moment":
|
|
/*!*************************!*\
|
|
!*** external "moment" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("moment");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "mustache":
|
|
/*!***************************!*\
|
|
!*** external "mustache" ***!
|
|
\***************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("mustache");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node-cache":
|
|
/*!*****************************!*\
|
|
!*** external "node-cache" ***!
|
|
\*****************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("node-cache");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "nodemailer":
|
|
/*!*****************************!*\
|
|
!*** external "nodemailer" ***!
|
|
\*****************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("nodemailer");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "objection":
|
|
/*!****************************!*\
|
|
!*** external "objection" ***!
|
|
\****************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("objection");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "path":
|
|
/*!***********************!*\
|
|
!*** external "path" ***!
|
|
\***********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("path");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "uniqid":
|
|
/*!*************************!*\
|
|
!*** external "uniqid" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("uniqid");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "winston":
|
|
/*!**************************!*\
|
|
!*** external "winston" ***!
|
|
\**************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("winston");
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9jb25maWcvY29uZmlnLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL2NvbmZpZy9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9jb25maWcvc3lzdGVtS25leGZpbGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2FwcC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvY29sbGVjdGlvbi9OZXN0ZWRTZXQvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2NvbGxlY3Rpb24vUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YS9SZXNvdXJjZUZpZWxkc0tleXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2RhdGEvb3B0aW9ucy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2Uva25leC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2UvbWFuYWdlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2Uvb2JqZWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0FjY291bnRUeXBlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9BY2NvdW50aW5nLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0FjY291bnRzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0F1dGhlbnRpY2F0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0N1cnJlbmNpZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRXhjaGFuZ2VSYXRlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvQmFsYW5jZVNoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvRmluYW5jaWFsU3RhdGVtZW50TWl4aW4uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9Kb3VybmFsU2hlZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9Qcm9maXRMb3NzU2hlZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9UcmlhbEJhbGFuY2VTaGVldC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL2dlbmVyYWxMZWRnZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvSW52aXRlVXNlcnMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvSXRlbUNhdGVnb3JpZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvSXRlbXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvTWVkaWEuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvT3B0aW9ucy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9SZXNvdXJjZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvVXNlcnMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvVmlld3MuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvbWlkZGxld2FyZS9UZW5hbmN5TWlkZGxld2FyZS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9taWRkbGV3YXJlL2p3dEF1dGguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9DYWNoYWJsZS9DYWNoYWJsZU1vZGVsLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9EZXBlbmRlbmN5R3JhcGgvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyU29ydEJ5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyVmlld3MuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9EeW5hbWljRmlsdGVyL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvTG9naWNFdmFsdWF0aW9uL0xleGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvTG9naWNFdmFsdWF0aW9uL1BhcnNlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0xvZ2ljRXZhbHVhdGlvbi9RdWVyeVBhcnNlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL01ldGFibGUvTWV0YWJsZUNvbGxlY3Rpb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9WaWV3Um9sZXNCdWlsZGVyL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMgc3luYyAvXlxcLlxcLy4qJC8iLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9BY2NvdW50LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudEJhbGFuY2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9BY2NvdW50VHlwZS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0F1dGguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9CdWRnZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9CdWRnZXRFbnRyeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0N1cnJlbmN5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvRGF0ZVNlc3Npb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9FeGNoYW5nZVJhdGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9FeHBlbnNlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvSXRlbS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0l0ZW1DYXRlZ29yeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01hbnVhbEpvdXJuYWwuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9NZWRpYS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01lZGlhTGluay5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01ldGFibGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9Nb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL09wdGlvbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1BhZ2luYXRpb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9QZXJtaXNzaW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUmVzb3VyY2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUmVzb3VyY2VGaWVsZE1ldGFkYXRhLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUm9sZS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1NldHRpbmcuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9UZW5hbnRNb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1RlbmFudFVzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9WaWV3LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvVmlld0NvbHVtbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1ZpZXdSb2xlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbEVudHJ5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL0NhY2hlL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9Mb2dnZXIvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL1N1YnNjcmlwdGlvbi9Vc2VyU3Vic2NyaXB0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9tYWlsLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zeXN0ZW0vVGVuYW50c01hbmFnZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvSW52aXRlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zeXN0ZW0vbW9kZWxzL1Bhc3N3b3JkUmVzZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3Vic2NyaXB0aW9uVXNhZ2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvc3lzdGVtL21vZGVscy9UZW5hbnQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3V0aWxzL2luZGV4LmpzIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcGx1Z2luLXRyYW5zZm9ybS1ydW50aW1lXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIiIsImV4dGVybmFsIFwiYXBwLXJvb3QtcGF0aFwiIiwiZXh0ZXJuYWwgXCJiY3J5cHRqc1wiIiwiZXh0ZXJuYWwgXCJjcnlwdG9cIiIsImV4dGVybmFsIFwiZG90ZW52XCIiLCJleHRlcm5hbCBcImVycm9yaGFuZGxlclwiIiwiZXh0ZXJuYWwgXCJleHByZXNzXCIiLCJleHRlcm5hbCBcImV4cHJlc3MtYm9vbVwiIiwiZXh0ZXJuYWwgXCJleHByZXNzLWZpbGV1cGxvYWRcIiIsImV4dGVybmFsIFwiZXhwcmVzcy12YWxpZGF0b3JcIiIsImV4dGVybmFsIFwiZnNcIiIsImV4dGVybmFsIFwiaGVsbWV0XCIiLCJleHRlcm5hbCBcImkxOG5cIiIsImV4dGVybmFsIFwianNvbndlYnRva2VuXCIiLCJleHRlcm5hbCBcImtuZXhcIiIsImV4dGVybmFsIFwia25leC1kYi1tYW5hZ2VyXCIiLCJleHRlcm5hbCBcImxvZGFzaFwiIiwiZXh0ZXJuYWwgXCJtb21lbnRcIiIsImV4dGVybmFsIFwibXVzdGFjaGVcIiIsImV4dGVybmFsIFwibm9kZS1jYWNoZVwiIiwiZXh0ZXJuYWwgXCJub2RlbWFpbGVyXCIiLCJleHRlcm5hbCBcIm9iamVjdGlvblwiIiwiZXh0ZXJuYWwgXCJwYXRoXCIiLCJleHRlcm5hbCBcInVuaXFpZFwiIiwiZXh0ZXJuYWwgXCJ3aW5zdG9uXCIiXSwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJkaXN0L1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeXN0ZW06IHtcbiAgICBkYl9jbGllbnQ6ICdteXNxbCcsXG4gICAgZGJfaG9zdDogJzEyNy4wLjAuMScsXG4gICAgZGJfdXNlcjogJ3Jvb3QnLFxuICAgIGRiX3Bhc3N3b3JkOiAncm9vdCcsXG4gICAgZGJfbmFtZTogJ2JpZ2NhcGl0YWxfc3lzdGVtJyxcbiAgICBtaWdyYXRpb25zX2RpcjogJy4vc3JjL3N5c3RlbS9taWdyYXRpb25zJyxcbiAgfSxcbiAgdGVuYW50OiB7XG4gICAgZGJfY2xpZW50OiAnbXlzcWwnLFxuICAgIGRiX25hbWVfcHJlZml4OiAnYmlnY2FwaXRhbF90ZW5hbnRfJyxcbiAgICBkYl9ob3N0OiAnMTI3LjAuMC4xJyxcbiAgICBkYl91c2VyOiAncm9vdCcsXG4gICAgZGJfcGFzc3dvcmQ6ICdyb290JyxcbiAgICBjaGFyc2V0OiAndXRmOCcsXG4gICAgbWlncmF0aW9uc19kaXI6ICdzcmMvZGF0YWJhc2UvbWlncmF0aW9ucycsXG4gICAgc2VlZHNfZGlyOiAnc3JjL2RhdGFiYXNlL3NlZWRzJyxcbiAgfSxcbiAgbWFuYWdlcjoge1xuICAgIHN1cGVyVXNlcjogJ3Jvb3QnLFxuICAgIHN1cGVyUGFzc3dvcmQ6ICdyb290JyxcbiAgfSxcbiAgbWFpbDoge1xuICAgIGhvc3Q6ICdzbXRwLm1haWx0cmFwLmlvJyxcbiAgICBwb3J0OiA1ODcsXG4gICAgc2VjdXJlOiBmYWxzZSxcbiAgICB1c2VybmFtZTogJzg0MmYzMzFkM2RjMDA1JyxcbiAgICBwYXNzd29yZDogJzE3MmY5N2IzNGYxYTE3JyxcbiAgfVxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuXG5kb3RlbnYuY29uZmlnKHtcbiAgcGF0aDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LnRlc3QnKSxcbn0pO1xuIiwiY29uc3QgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxuY29uc3QgY29uZmlnRW52ID0ge1xuICBjbGllbnQ6IGNvbmZpZy5zeXN0ZW0uZGJfY2xpZW50LFxuICBjb25uZWN0aW9uOiB7XG4gICAgaG9zdDogY29uZmlnLnN5c3RlbS5kYl9ob3N0LFxuICAgIHVzZXI6IGNvbmZpZy5zeXN0ZW0uZGJfdXNlcixcbiAgICBwYXNzd29yZDogY29uZmlnLnN5c3RlbS5kYl9wYXNzd29yZCxcbiAgICBkYXRhYmFzZTogY29uZmlnLnN5c3RlbS5kYl9uYW1lLFxuICAgIGNoYXJzZXQ6ICd1dGY4JyxcbiAgfSxcbiAgbWlncmF0aW9uczoge1xuICAgIGRpcmVjdG9yeTogY29uZmlnLnN5c3RlbS5taWdyYXRpb25zX2RpcixcbiAgfSxcbiAgcG9vbDogeyBtaW46IDAsIG1heDogNyB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRldmVsb3BtZW50OiBjb25maWdFbnYsXG4gIHByb2R1Y3Rpb246IGNvbmZpZ0Vudixcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBib29tIGZyb20gJ2V4cHJlc3MtYm9vbSc7XG5pbXBvcnQgaTE4biBmcm9tICdpMThuJztcbmltcG9ydCByb290UGF0aCBmcm9tICdhcHAtcm9vdC1wYXRoJztcbmltcG9ydCBmaWxlVXBsb2FkIGZyb20gJ2V4cHJlc3MtZmlsZXVwbG9hZCc7XG5pbXBvcnQgJy4uL2NvbmZpZyc7XG5pbXBvcnQgJ0AvZGF0YWJhc2Uvb2JqZWN0aW9uJztcbmltcG9ydCByb3V0ZXMgZnJvbSAnQC9odHRwJztcblxuZ2xvYmFsLnJvb3RQYXRoID0gcm9vdFBhdGgucGF0aDtcblxuY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4vLyBpMThuLmNvbmZpZ3VyZSh7XG4vLyAgIGxvY2FsZXM6IFsnZW4nXSxcbi8vICAgZGlyZWN0b3J5OiBgJHtfX2Rpcm5hbWV9L3Jlc291cmNlcy9sb2NhbGVgLFxuLy8gfSk7XG5cbi8vIC8vIGkxOG4gaW5pdCBwYXJzZXMgcmVxIGZvciBsYW5ndWFnZSBoZWFkZXJzLCBjb29raWVzLCBldGMuXG4vLyBhcHAudXNlKGkxOG4uaW5pdCk7XG5cbi8vIEV4cHJlc3MgY29uZmlndXJhdGlvblxuYXBwLnNldCgncG9ydCcsIHByb2Nlc3MuZW52LlBPUlQgfHwgMzAwMCk7XG5cbmFwcC51c2UoaGVsbWV0KCkpO1xuYXBwLnVzZShib29tKCkpO1xuYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5hcHAudXNlKGZpbGVVcGxvYWQoe1xuICBjcmVhdGVQYXJlbnRQYXRoOiB0cnVlLFxufSkpO1xuXG5yb3V0ZXMoYXBwKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwO1xuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXN0ZWRTZXQge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpdGVtcywgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHBhcmVudElkOiAncGFyZW50X2lkJyxcbiAgICAgIGlkOiAnaWQnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuaXRlbXMgPSBpdGVtcyB8fCBbXTtcbiAgICB0aGlzLnRyZWUgPSB0aGlzLmxpbmtDaGlsZHJlbigpO1xuICB9XG5cbiAgc2V0SXRlbXMoaXRlbXMpIHtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy50cmVlID0gdGhpcy5saW5rQ2hpbGRyZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIG5vZGVzIGNoaWxkcmVuLlxuICAgKi9cbiAgbGlua0NoaWxkcmVuKCkge1xuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBtYXAgPSB7fTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIG1hcFtpdGVtLmlkXSA9IGl0ZW07XG4gICAgICBtYXBbaXRlbS5pZF0uY2hpbGRyZW4gPSB7fTtcbiAgICB9KTtcblxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZUlkID0gaXRlbVt0aGlzLm9wdGlvbnMucGFyZW50SWRdO1xuICAgICAgaWYgKHBhcmVudE5vZGVJZCkge1xuICAgICAgICBtYXBbcGFyZW50Tm9kZUlkXS5jaGlsZHJlbltpdGVtLmlkXSA9IGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLml0ZW1zLm1hcCgoaSkgPT4gKHsgLi4uaSB9KSk7XG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGVzKSA9PiB7XG4gICAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghbm9kZVt0aGlzLm9wdGlvbnMucGFyZW50SWRdKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuTm9kZXMgPSBPYmplY3QudmFsdWVzKG5vZGUuY2hpbGRyZW4pXG4gICAgICAgICAgICAubWFwKChpKSA9PiAoeyAuLi5pIH0pKTtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbk5vZGVzO1xuICAgICAgICAgIHdhbGsoY2hpbGRyZW5Ob2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2Fsayh0cmVlTm9kZXMpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxuXG4gIGdldFRyZWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZTtcbiAgfVxuXG4gIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZVtpZF0gfHwgbnVsbFxuICB9XG5cbiAgZ2V0UGFyZW50cyhpZCkge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIGNvbnN0IHdhbGsgPSAoX2l0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgcGFyZW50cy5wdXNoKF9pdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXRlbVt0aGlzLm9wdGlvbnMucGFyZW50SWRdKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmdldEVsZW1lbnRCeUlkKF9pdGVtW3RoaXMub3B0aW9ucy5wYXJlbnRJZF0pOyAgXG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgd2FsayhwYXJlbnRJdGVtKTtcbiAgICAgIH0gICAgICBcbiAgICB9O1xuICAgIHdhbGsoaXRlbSk7XG4gICAgcmV0dXJuIHBhcmVudHM7XG4gIH1cblxuICB0b0ZsYXR0ZW5BcnJheShub2RlTWFwcGVyKSB7XG4gICAgY29uc3QgZmxhdHRlblRyZWUgPSBbXTtcblxuICAgIGNvbnN0IHRyYXZlcnNhbCA9IChub2RlcywgcGFyZW50Tm9kZSkgPT4ge1xuICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBsZXQgbm9kZU1hcHBlZCA9IG5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBub2RlTWFwcGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbm9kZU1hcHBlZCA9IG5vZGVNYXBwZXIobm9kZU1hcHBlZCwgcGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdHRlblRyZWUucHVzaChub2RlTWFwcGVkKTtcblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0cmF2ZXJzYWwobm9kZS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgdHJhdmVyc2FsKHRoaXMuY29sbGVjdGlvbik7XG5cbiAgICByZXR1cm4gZmxhdHRlblRyZWU7XG4gIH1cbn1cbiIsImltcG9ydCBNZXRhYmxlQ29sbGVjdGlvbiBmcm9tICdAL2xpYi9NZXRhYmxlL01ldGFibGVDb2xsZWN0aW9uJztcbmltcG9ydCBSZXNvdXJjZUZpZWxkTWV0YWRhdGEgZnJvbSAnQC9tb2RlbHMvUmVzb3VyY2VGaWVsZE1ldGFkYXRhJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbiBleHRlbmRzIE1ldGFibGVDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNldE1vZGVsKFJlc291cmNlRmllbGRNZXRhZGF0YSk7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBbJ3Jlc291cmNlX2lkJywgJ3Jlc291cmNlX2l0ZW1faWQnXTtcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBFeHBlbnNlcy5cbiAgJ2V4cGVuc2VzJzoge1xuICAgICdleHBlbnNlX2FjY291bnQnOiB7XG4gICAgICBjb2x1bW46ICcgJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudHMubmFtZScsXG4gICAgfSxcbiAgICAncGF5bWVudF9hY2NvdW50Jzoge1xuICAgICAgY29sdW1uOiAncGF5bWVudF9hY2NvdW50X2lkJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudHMuaWQnLFxuICAgIH0sXG4gICAgJ2FjY291bnRfdHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ2FjY291bnRfdHlwZV9pZCcsXG4gICAgICByZWxhdGlvbjogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gQWNjb3VudHNcbiAgJ2FjY291bnRzJzoge1xuICAgICduYW1lJzoge1xuICAgICAgY29sdW1uOiAnbmFtZScsXG4gICAgfSxcbiAgICAndHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ2FjY291bnRfdHlwZV9pZCcsXG4gICAgICByZWxhdGlvbjogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgICAgcmVsYXRpb25Db2x1bW46ICdhY2NvdW50X3R5cGVzLm5hbWUnLFxuICAgIH0sXG4gICAgJ2Rlc2NyaXB0aW9uJzoge1xuICAgICAgY29sdW1uOiAnZGVzY3JpcHRpb24nLFxuICAgIH0sXG4gICAgJ2NvZGUnOiB7XG4gICAgICBjb2x1bW46ICdjb2RlJyxcbiAgICB9LFxuICAgICdyb290X3R5cGUnOiB7XG4gICAgICBjb2x1bW46ICdhY2NvdW50X3R5cGVfaWQnLFxuICAgICAgcmVsYXRpb246ICdhY2NvdW50X3R5cGVzLmlkJyxcbiAgICAgIHJlbGF0aW9uQ29sdW1uOiAnYWNjb3VudF90eXBlcy5yb290X3R5cGUnLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gSXRlbXNcbiAgJ2l0ZW1zJzoge1xuICAgICd0eXBlJzoge1xuICAgICAgY29sdW1uOiAndHlwZScsXG4gICAgfSxcbiAgICAnbmFtZSc6IHtcbiAgICAgIGNvbHVtbjogJ25hbWUnLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTWFudWFsIEpvdXJuYWxzXG4gICdtYW51YWxfam91cm5hbHMnOiB7XG4gICAgJ3R5cGUnOiB7XG4gICAgICBjb2x1bW46ICd0cmFuc2FjdGlvbl90eXBlJyxcbiAgICB9LFxuICAgICdzdGF0dXMnOiB7XG4gICAgICBjb2x1bW46ICdzdGF0dXMnLFxuICAgIH0sXG4gICAgJ2RhdGUnOiB7XG4gICAgICBjb2x1bW46ICdkYXRlJyxcbiAgICB9LFxuICAgICdqb3VybmFsX251bWJlcic6IHtcbiAgICAgIGNvbHVtbjogJ2pvdXJuYWxfbnVtYmVyJyxcbiAgICB9LFxuICAgICdhbW91bnQnOiB7XG4gICAgICBjb2x1bW46ICdhbW91bnQnLFxuICAgIH0sXG4gICAgJ2NyZWF0ZWRfYXQnOiB7XG4gICAgICBjb2x1bW46ICdjcmVhdGVkX2F0JyxcbiAgICB9LFxuICB9XG59O1xuIiwiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb3JnYW5pemF0aW9uOiBbXG4gICAge1xuICAgICAga2V5OiAnbmFtZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2Jhc2VfY3VycmVuY3knLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdpbmR1c3RyeScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2xvY2F0aW9uJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZmlzY2FsX3llYXInLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdsYW5ndWFnZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHsgXG4gICAgICBrZXk6ICd0aW1lX3pvbmUnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdkYXRlX2Zvcm1hdCcsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICBdLFxufTsiLCJpbXBvcnQgS25leCBmcm9tICdrbmV4JztcbmltcG9ydCB7IGtuZXhTbmFrZUNhc2VNYXBwZXJzIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBrbmV4ZmlsZSBmcm9tICdALy4uL2NvbmZpZy9zeXN0ZW1LbmV4ZmlsZSc7XG5cbmNvbnN0IGNvbmZpZyA9IGtuZXhmaWxlW3Byb2Nlc3MuZW52Lk5PREVfRU5WXTtcblxuY29uc3Qga25leCA9IEtuZXgoe1xuICAuLi5jb25maWcsXG4gIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHsgdXBwZXJDYXNlOiB0cnVlIH0pLFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGtuZXg7XG4iLCJpbXBvcnQga25leE1hbmFnZXIgZnJvbSAna25leC1kYi1tYW5hZ2VyJztcbmltcG9ydCBrbmV4ZmlsZSBmcm9tICdALy4uL2NvbmZpZy9zeXN0ZW1LbmV4ZmlsZSc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ0AvLi4vY29uZmlnL2NvbmZpZyc7XG5cbmNvbnN0IGtuZXhDb25maWcgPSBrbmV4ZmlsZVtwcm9jZXNzLmVudi5OT0RFX0VOVl07XG5cbmNvbnN0IGRiTWFuYWdlciA9IGtuZXhNYW5hZ2VyLmRhdGFiYXNlTWFuYWdlckZhY3Rvcnkoe1xuICBrbmV4OiBrbmV4Q29uZmlnLFxuICBkYk1hbmFnZXI6IHtcbiAgICBjb2xsYXRlOiBbXSxcbiAgICBzdXBlclVzZXI6IGNvbmZpZy5tYW5hZ2VyLnN1cGVyVXNlcixcbiAgICBzdXBlclBhc3N3b3JkOiBjb25maWcubWFuYWdlci5zdXBlclBhc3N3b3JkLFxuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRiTWFuYWdlcjsiLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQga25leCBmcm9tICdAL2RhdGFiYXNlL2tuZXgnO1xuXG4vLyBCaW5kIGFsbCBNb2RlbHMgdG8gYSBrbmV4IGluc3RhbmNlLiBJZiB5b3Ugb25seSBoYXZlIG9uZSBkYXRhYmFzZSBpblxuLy8geW91ciBzZXJ2ZXIgdGhpcyBpcyBhbGwgeW91IGhhdmUgdG8gZG8uIEZvciBtdWx0aSBkYXRhYmFzZSBzeXN0ZW1zLCBzZWVcbi8vIHRoZSBNb2RlbC5iaW5kS25leCgpIG1ldGhvZC5cbk1vZGVsLmtuZXgoa25leCk7XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMuZ2V0QWNjb3VudFR5cGVzTGlzdC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0QWNjb3VudFR5cGVzTGlzdC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhY2NvdW50cyB0eXBlcyBsaXN0LlxuICAgKi9cbiAgZ2V0QWNjb3VudFR5cGVzTGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgQWNjb3VudFR5cGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50VHlwZXMgPSBhd2FpdCBBY2NvdW50VHlwZS5xdWVyeSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBhY2NvdW50X3R5cGVzOiBhY2NvdW50VHlwZXMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsImltcG9ydCB7IGNoZWNrLCBxdWVyeSwgdmFsaWRhdGlvblJlc3VsdCwgcGFyYW0gfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IEpvdXJuYWxQb3N0ZXIgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXInO1xuaW1wb3J0IEpvdXJuYWxFbnRyeSBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbEVudHJ5JztcbmltcG9ydCB7XG4gIG1hcFZpZXdSb2xlc1RvQ29uZGl0aW9uYWxzLFxuICBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcixcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5pbXBvcnQge1xuICBEeW5hbWljRmlsdGVyLFxuICBEeW5hbWljRmlsdGVyU29ydEJ5LFxuICBEeW5hbWljRmlsdGVyVmlld3MsXG4gIER5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcyxcbn0gZnJvbSAnQC9saWIvRHluYW1pY0ZpbHRlcic7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvbWFudWFsLWpvdXJuYWxzLzppZCcsXG4gICAgICB0aGlzLmdldE1hbnVhbEpvdXJuYWwudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldE1hbnVhbEpvdXJuYWwuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnL21hbnVhbC1qb3VybmFscycsXG4gICAgICB0aGlzLm1hbnVhbEpvdXJuYWxzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5tYW51YWxKb3VybmFscy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL21ha2Utam91cm5hbC1lbnRyaWVzJyxcbiAgICAgIHRoaXMubWFrZUpvdXJuYWxFbnRyaWVzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5tYWtlSm91cm5hbEVudHJpZXMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9tYW51YWwtam91cm5hbHMvOmlkL3B1Ymxpc2gnLFxuICAgICAgdGhpcy5wdWJsaXNoTWFudWFsSm91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucHVibGlzaE1hbnVhbEpvdXJuYWwuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9tYW51YWwtam91cm5hbHMvOmlkJyxcbiAgICAgIHRoaXMuZWRpdE1hbnVhbEpvdXJuYWwudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmVkaXRNYW51YWxKb3VybmFsLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9tYW51YWwtam91cm5hbHMvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlTWFudWFsSm91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlTWFudWFsSm91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvbWFudWFsLWpvdXJuYWxzJyxcbiAgICAgIHRoaXMuZGVsZXRlQnVsa01hbnVhbEpvdXJuYWxzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVCdWxrTWFudWFsSm91cm5hbHMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9yZWN1cnJpbmctam91cm5hbC1lbnRyaWVzJyxcbiAgICAgIHRoaXMucmVjdXJyaW5nSm91cm5hbEVudHJpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnJlY3VycmluZ0pvdXJuYWxFbnRyaWVzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCdxdWljay1qb3VybmFsLWVudHJpZXMnLFxuICAgICAgdGhpcy5xdWlja0pvdXJuYWxFbnRyaWVzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5xdWlja0pvdXJuYWxFbnRyaWVzLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIG1hbnVhbCBqb3VybmFscyxcbiAgICovXG4gIG1hbnVhbEpvdXJuYWxzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2N1c3RvbV92aWV3X2lkJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3N0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcycpLm9wdGlvbmFsKCkuaXNKU09OKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBwYWdlX3NpemU6IDk5OSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXJfcm9sZXMgPSBKU09OLnBhcnNlKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBSZXNvdXJjZSwgVmlldywgTWFudWFsSm91cm5hbCB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnbWFudWFsX2pvdXJuYWxzJylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIW1hbnVhbEpvdXJuYWxzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdNQU5VQUxfSk9VUk5BTFMuUkVTT1VSQ0UuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdpZCcsIGZpbHRlci5jdXN0b21fdmlld19pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnZmF2b3VyaXRlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci53aGVyZSgncmVzb3VyY2VfaWQnLCBtYW51YWxKb3VybmFsc1Jlc291cmNlLmlkKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NvbHVtbnMnKTtcbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgICBidWlsZGVyLnJlbWVtYmVyKCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gbWFudWFsSm91cm5hbHNSZXNvdXJjZS5maWVsZHMubWFwKChjKSA9PiBjLmtleSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoTWFudWFsSm91cm5hbC50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIHZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIG1hbnVhbEpvdXJuYWxzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnTUFOVUFMLkpPVVJOQUwuSEFTLk5PLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRHluYW1pYyBmaWx0ZXIgd2l0aCBjb2x1bW4gc29ydCBvcmRlci5cbiAgICAgIGlmIChmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIpIHtcbiAgICAgICAgaWYgKHJlc291cmNlRmllbGRzS2V5cy5pbmRleE9mKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikgPT09IC0xKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09MVU1OLlNPUlQuT1JERVIuTk9ULkZPVU5EJywgY29kZTogMzAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvcnRCeUZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyU29ydEJ5KFxuICAgICAgICAgIGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcixcbiAgICAgICAgICBmaWx0ZXIuc29ydF9vcmRlcixcbiAgICAgICAgKTtcbiAgICAgICAgZHluYW1pY0ZpbHRlci5zZXRGaWx0ZXIoc29ydEJ5RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIE1hbnVhbCBqb3VybmFscy5cbiAgICAgIGNvbnN0IG1hbnVhbEpvdXJuYWxzID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZHluYW1pY0ZpbHRlci5idWlsZFF1ZXJ5KCkoYnVpbGRlcik7XG4gICAgICB9KS5wYWdpbmF0aW9uKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIG1hbnVhbEpvdXJuYWxzLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogTWFrZSBqb3VybmFsIGVudHJpcmVzLlxuICAgKi9cbiAgbWFrZUpvdXJuYWxFbnRyaWVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2RhdGUnKS5leGlzdHMoKS5pc0lTTzg2MDEoKSxcbiAgICAgIGNoZWNrKCdqb3VybmFsX251bWJlcicpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCd0cmFuc2FjdGlvbl90eXBlJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncmVmZXJlbmNlJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3N0YXR1cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBjaGVjaygnZW50cmllcycpLmlzQXJyYXkoeyBtaW46IDIgfSksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmNyZWRpdCcpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouZGViaXQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmFjY291bnRfaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5ub3RlJykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoKSxcbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMuKicpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybSA9IHtcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdHJhbnNhY3Rpb25fdHlwZTogJ2pvdXJuYWwnLFxuICAgICAgICByZWZlcmVuY2U6ICcnLFxuICAgICAgICBtZWRpYV9pZHM6IFtdLFxuICAgICAgICAuLi5yZXEuYm9keSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IE1hbnVhbEpvdXJuYWwsIEFjY291bnQsIE1lZGlhLCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGxldCB0b3RhbENyZWRpdCA9IDA7XG4gICAgICBsZXQgdG90YWxEZWJpdCA9IDA7XG5cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBlbnRyaWVzID0gZm9ybS5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IChlbnRyeS5jcmVkaXQgfHwgZW50cnkuZGViaXQpKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBtb21lbnQoZm9ybS5kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBpZiAoZW50cnkuY3JlZGl0ID4gMCkge1xuICAgICAgICAgIHRvdGFsQ3JlZGl0ICs9IGVudHJ5LmNyZWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGViaXQgPiAwKSB7XG4gICAgICAgICAgdG90YWxEZWJpdCArPSBlbnRyeS5kZWJpdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAodG90YWxDcmVkaXQgPD0gMCB8fCB0b3RhbERlYml0IDw9IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdDUkVESVQuREVCSVQuU1VNQVRJT04uU0hPVUxELk5PVC5FUVVBTC5aRVJPJyxcbiAgICAgICAgICBjb2RlOiA0MDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsQ3JlZGl0ICE9PSB0b3RhbERlYml0KSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NSRURJVC5ERUJJVC5OT1QuRVFVQUxTJywgY29kZTogMTAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmFjY291bnRfaWQpO1xuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgYWNjb3VudHNJZHMpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0eXBlJylcbiAgICAgICAgLnJlbWVtYmVyKCk7XG5cbiAgICAgIGNvbnN0IHN0b3JlZEFjY291bnRzSWRzID0gYWNjb3VudHMubWFwKChhY2NvdW50KSA9PiBhY2NvdW50LmlkKTtcblxuICAgICAgaWYgKGZvcm0ubWVkaWFfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3RvcmVkTWVkaWEgPSBhd2FpdCBNZWRpYS5xdWVyeSgpLndoZXJlSW4oJ2lkJywgZm9ybS5tZWRpYV9pZHMpO1xuICAgICAgICBjb25zdCBub3RGb3VuZE1lZGlhID0gZGlmZmVyZW5jZShmb3JtLm1lZGlhX2lkcywgc3RvcmVkTWVkaWEubWFwKChtKSA9PiBtLmlkKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobm90Rm91bmRNZWRpYS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnTUVESUEuSURTLk5PVC5GT1VORCcsIGNvZGU6IDQwMCwgaWRzOiBub3RGb3VuZE1lZGlhIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlmZmVyZW5jZShhY2NvdW50c0lkcywgc3RvcmVkQWNjb3VudHNJZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQUNDT1VOVFMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam91cm5hbE51bWJlciA9IGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2pvdXJuYWxfbnVtYmVyJywgZm9ybS5qb3VybmFsX251bWJlcik7XG5cbiAgICAgIGlmIChqb3VybmFsTnVtYmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSk9VUk5BTC5OVU1CRVIuQUxSRUFEWS5FWElTVFMnLCBjb2RlOiAzMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBTYXZlIG1hbnVhbCBqb3VybmFsIHRyYW5zYWN0aW9uLlxuICAgICAgY29uc3QgbWFudWFsSm91cm5hbCA9IGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICByZWZlcmVuY2U6IGZvcm0ucmVmZXJlbmNlLFxuICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnSm91cm5hbCcsXG4gICAgICAgIGpvdXJuYWxfbnVtYmVyOiBmb3JtLmpvdXJuYWxfbnVtYmVyLFxuICAgICAgICBhbW91bnQ6IHRvdGFsQ3JlZGl0LFxuICAgICAgICBkYXRlOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICBkZXNjcmlwdGlvbjogZm9ybS5kZXNjcmlwdGlvbixcbiAgICAgICAgc3RhdHVzOiBmb3JtLnN0YXR1cyxcbiAgICAgICAgdXNlcl9pZDogdXNlci5pZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCk7XG4gICAgICBjb25zdCBqb3VybmFsUG9zdGVyID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNEZXBHcmFwaCk7XG5cbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IGFjY291bnRzLmZpbmQoKGEpID0+IGEuaWQgPT09IGVudHJ5LmFjY291bnRfaWQpO1xuICAgICAgICBjb25zdCBqb3VyYW5sRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBkZWJpdDogZW50cnkuZGViaXQsXG4gICAgICAgICAgY3JlZGl0OiBlbnRyeS5jcmVkaXQsXG4gICAgICAgICAgYWNjb3VudDogYWNjb3VudC5pZCxcbiAgICAgICAgICByZWZlcmVuY2VUeXBlOiAnSm91cm5hbCcsXG4gICAgICAgICAgcmVmZXJlbmNlSWQ6IG1hbnVhbEpvdXJuYWwuaWQsXG4gICAgICAgICAgYWNjb3VudE5vcm1hbDogYWNjb3VudC50eXBlLm5vcm1hbCxcbiAgICAgICAgICBub3RlOiBlbnRyeS5ub3RlLFxuICAgICAgICAgIGRhdGU6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICAgIGRyYWZ0OiAhZm9ybS5zdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgICBqb3VybmFsUG9zdGVyLmRlYml0KGpvdXJhbmxFbnRyeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgam91cm5hbFBvc3Rlci5jcmVkaXQoam91cmFubEVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhdmUgbGlua2VkIG1lZGlhIHRvIHRoZSBqb3VybmFsIG1vZGVsLlxuICAgICAgY29uc3QgYnVsa1NhdmVNZWRpYUxpbmsgPSBbXTtcblxuICAgICAgZm9ybS5tZWRpYV9pZHMuZm9yRWFjaCgobWVkaWFJZCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gTWVkaWFMaW5rLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgICBtb2RlbF9uYW1lOiAnSm91cm5hbCcsXG4gICAgICAgICAgbW9kZWxfaWQ6IG1hbnVhbEpvdXJuYWwuaWQsXG4gICAgICAgICAgbWVkaWFfaWQ6IG1lZGlhSWQsXG4gICAgICAgIH0pO1xuICAgICAgICBidWxrU2F2ZU1lZGlhTGluay5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhdmVzIHRoZSBqb3VybmFsIGVudHJpZXMgYW5kIGFjY291bnRzIGJhbGFuY2UgY2hhbmdlcy5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uYnVsa1NhdmVNZWRpYUxpbmssXG4gICAgICAgIGpvdXJuYWxQb3N0ZXIuc2F2ZUVudHJpZXMoKSxcbiAgICAgICAgKGZvcm0uc3RhdHVzKSAmJiBqb3VybmFsUG9zdGVyLnNhdmVCYWxhbmNlKCksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiBtYW51YWxKb3VybmFsLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmVzIHJlY3VycmluZyBqb3VybmFsIGVudHJpZXMgdGVtcGxhdGUuXG4gICAqL1xuICByZWN1cnJpbmdKb3VybmFsRW50cmllczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCd0ZW1wbGF0ZV9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncmVjdXJyZW5jZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ2FjdGl2ZScpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBjaGVjaygnZW50cmllcycpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmNyZWRpdCcpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmRlYml0JykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouYWNjb3VudF9pZCcpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLm5vdGUnKS5vcHRpb25hbCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBnaXZlbiBtYW51YWwgam91cm5hbC5cbiAgICovXG4gIGVkaXRNYW51YWxKb3VybmFsOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkYXRlJykuZXhpc3RzKCkuaXNJU084NjAxKCksXG4gICAgICBjaGVjaygnam91cm5hbF9udW1iZXInKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygndHJhbnNhY3Rpb25fdHlwZScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3JlZmVyZW5jZScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSksXG4gICAgICBjaGVjaygnZGVzY3JpcHRpb24nKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzJykuaXNBcnJheSh7IG1pbjogMiB9KSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY3JlZGl0Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5kZWJpdCcpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouYWNjb3VudF9pZCcpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLm5vdGUnKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnam91cm5hbCcsXG4gICAgICAgIHJlZmVyZW5jZTogJycsXG4gICAgICAgIG1lZGlhX2lkczogW10sXG4gICAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsIEFjY291bnRUcmFuc2FjdGlvbiwgQWNjb3VudCwgTWVkaWEsIE1lZGlhTGluayxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ21lZGlhJykuZmlyc3QoKTtcblxuICAgICAgaWYgKCFtYW51YWxKb3VybmFsKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgdG90YWxDcmVkaXQgPSAwO1xuICAgICAgbGV0IHRvdGFsRGViaXQgPSAwO1xuXG4gICAgICBjb25zdCB7IHVzZXIgfSA9IHJlcTtcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZvcm0uZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAoZW50cnkuY3JlZGl0IHx8IGVudHJ5LmRlYml0KSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbW9tZW50KGZvcm0uZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG5cbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5LmNyZWRpdCA+IDApIHtcbiAgICAgICAgICB0b3RhbENyZWRpdCArPSBlbnRyeS5jcmVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRlYml0ID4gMCkge1xuICAgICAgICAgIHRvdGFsRGViaXQgKz0gZW50cnkuZGViaXQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRvdGFsQ3JlZGl0IDw9IDAgfHwgdG90YWxEZWJpdCA8PSAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQ1JFRElULkRFQklULlNVTUFUSU9OLlNIT1VMRC5OT1QuRVFVQUwuWkVSTycsXG4gICAgICAgICAgY29kZTogNDAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbENyZWRpdCAhPT0gdG90YWxEZWJpdCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDUkVESVQuREVCSVQuTk9ULkVRVUFMUycsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpvdXJuYWxOdW1iZXIgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdqb3VybmFsX251bWJlcicsIGZvcm0uam91cm5hbF9udW1iZXIpXG4gICAgICAgIC53aGVyZU5vdCgnaWQnLCBpZClcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmIChqb3VybmFsTnVtYmVyKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0pPVVJOQUwuTlVNQkVSLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmFjY291bnRfaWQpO1xuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBhY2NvdW50c0lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKTtcblxuICAgICAgY29uc3Qgc3RvcmVkQWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuaWQpO1xuXG4gICAgICBpZiAoZGlmZmVyZW5jZShhY2NvdW50c0lkcywgc3RvcmVkQWNjb3VudHNJZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQUNDT1VOVFMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgaWYgbWVkaWEgaWRzIHdhcyBub3QgYWxyZWFkeSBleGlzdHMgb24gdGhlIHN0b3JhZ2UuXG4gICAgICBpZiAoZm9ybS5tZWRpYV9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzdG9yZWRNZWRpYSA9IGF3YWl0IE1lZGlhLnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmb3JtLm1lZGlhX2lkcyk7XG4gICAgICAgIGNvbnN0IG5vdEZvdW5kTWVkaWEgPSBkaWZmZXJlbmNlKGZvcm0ubWVkaWFfaWRzLCBzdG9yZWRNZWRpYS5tYXAoKG0pID0+IG0uaWQpKTtcblxuICAgICAgICBpZiAobm90Rm91bmRNZWRpYS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnTUVESUEuSURTLk5PVC5GT1VORCcsIGNvZGU6IDQwMCwgaWRzOiBub3RGb3VuZE1lZGlhIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgbWFudWFsSm91cm5hbC5pZClcbiAgICAgICAgLnVwZGF0ZSh7XG4gICAgICAgICAgcmVmZXJlbmNlOiBmb3JtLnJlZmVyZW5jZSxcbiAgICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnSm91cm5hbCcsXG4gICAgICAgICAgam91cm5hbE51bWJlcjogZm9ybS5qb3VybmFsX251bWJlcixcbiAgICAgICAgICBhbW91bnQ6IHRvdGFsQ3JlZGl0LFxuICAgICAgICAgIGRhdGU6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGZvcm0uZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0pvdXJuYWwnXSlcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50ID0gYWNjb3VudHMuZmluZCgoYSkgPT4gYS5pZCA9PT0gZW50cnkuYWNjb3VudF9pZCk7XG5cbiAgICAgICAgY29uc3Qgam91cmFubEVudHJ5ID0gbmV3IEpvdXJuYWxFbnRyeSh7XG4gICAgICAgICAgZGViaXQ6IGVudHJ5LmRlYml0LFxuICAgICAgICAgIGNyZWRpdDogZW50cnkuY3JlZGl0LFxuICAgICAgICAgIGFjY291bnQ6IGFjY291bnQuaWQsXG4gICAgICAgICAgcmVmZXJlbmNlVHlwZTogJ0pvdXJuYWwnLFxuICAgICAgICAgIHJlZmVyZW5jZUlkOiBtYW51YWxKb3VybmFsLmlkLFxuICAgICAgICAgIGFjY291bnROb3JtYWw6IGFjY291bnQudHlwZS5ub3JtYWwsXG4gICAgICAgICAgbm90ZTogZW50cnkubm90ZSxcbiAgICAgICAgICBkYXRlOiBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgIHVzZXJJZDogdXNlci5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlbnRyeS5kZWJpdCkge1xuICAgICAgICAgIGpvdXJuYWwuZGViaXQoam91cmFubEVudHJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb3VybmFsLmNyZWRpdChqb3VyYW5sRW50cnkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZSBsaW5rcyBvZiBuZXcgaW5zZXJ0ZWQgbWVkaWEgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBqb3VybmFsIG1vZGVsLlxuICAgICAgY29uc3Qgam91cm5hbE1lZGlhSWRzID0gbWFudWFsSm91cm5hbC5tZWRpYS5tYXAoKG0pID0+IG0uaWQpO1xuICAgICAgY29uc3QgbmV3SW5zZXJ0ZWRNZWRpYSA9IGRpZmZlcmVuY2UoZm9ybS5tZWRpYV9pZHMsIGpvdXJuYWxNZWRpYUlkcyk7XG4gICAgICBjb25zdCBidWxrU2F2ZU1lZGlhTGluayA9IFtdO1xuXG4gICAgICBuZXdJbnNlcnRlZE1lZGlhLmZvckVhY2goKG1lZGlhSWQpID0+IHtcbiAgICAgICAgY29uc3Qgb3BlciA9IE1lZGlhTGluay5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgbW9kZWxfbmFtZTogJ0pvdXJuYWwnLFxuICAgICAgICAgIG1vZGVsX2lkOiBtYW51YWxKb3VybmFsLmlkLFxuICAgICAgICAgIG1lZGlhX2lkOiBtZWRpYUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVsa1NhdmVNZWRpYUxpbmsucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIC4uLmJ1bGtTYXZlTWVkaWFMaW5rLFxuICAgICAgICBqb3VybmFsLmRlbGV0ZUVudHJpZXMoKSxcbiAgICAgICAgam91cm5hbC5zYXZlRW50cmllcygpLFxuICAgICAgICBqb3VybmFsLnNhdmVCYWxhbmNlKCksXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHt9KTtcbiAgICB9LFxuICB9LFxuXG4gIHB1Ymxpc2hNYW51YWxKb3VybmFsOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsXG4gICAgICAgIEFjY291bnRUcmFuc2FjdGlvbixcbiAgICAgICAgQWNjb3VudCxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgbWFudWFsSm91cm5hbCA9IGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghbWFudWFsSm91cm5hbCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAobWFudWFsSm91cm5hbC5zdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5QVUJMSVNIRUQuQUxSRUFEWScsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVKb3VybmFsVHJhbnNhY3Rpb25PcGVyID0gTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAudXBkYXRlKHsgc3RhdHVzOiAxIH0pO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0pvdXJuYWwnLCAnTWFudWFsSm91cm5hbCddKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV9pZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdhY2NvdW50LnR5cGUnKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNEZXBHcmFwaCA9IGF3YWl0IEFjY291bnQuZGVwR3JhcGgoKS5xdWVyeSgpLnJlbWVtYmVyKCk7XG4gICAgICBjb25zdCBqb3VybmFsID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNEZXBHcmFwaCk7XG5cbiAgICAgIGpvdXJuYWwubG9hZEVudHJpZXModHJhbnNhY3Rpb25zKTtcbiAgICAgIGpvdXJuYWwuY2FsY3VsYXRlRW50cmllc0JhbGFuY2VDaGFuZ2UoKTtcblxuICAgICAgY29uc3QgdXBkYXRlQWNjb3VudHNUcmFuc2FjdGlvbnNPcGVyID0gQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgdHJhbnNhY3Rpb25zLm1hcCgodCkgPT4gdC5pZCkpXG4gICAgICAgIC51cGRhdGUoeyBkcmFmdDogMCB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB1cGRhdGVKb3VybmFsVHJhbnNhY3Rpb25PcGVyLFxuICAgICAgICB1cGRhdGVBY2NvdW50c1RyYW5zYWN0aW9uc09wZXIsXG4gICAgICAgIGpvdXJuYWwuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICBnZXRNYW51YWxKb3VybmFsOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsIEFjY291bnRUcmFuc2FjdGlvbixcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgbWFudWFsSm91cm5hbCA9IGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdtZWRpYScpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIW1hbnVhbEpvdXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfSAgICAgXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0pvdXJuYWwnLCAnTWFudWFsSm91cm5hbCddKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV9pZCcsIG1hbnVhbEpvdXJuYWwuaWQpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBtYW51YWxfam91cm5hbDoge1xuICAgICAgICAgIC4uLm1hbnVhbEpvdXJuYWwudG9KU09OKCksXG4gICAgICAgICAgZW50cmllczogW1xuICAgICAgICAgICAgLi4udHJhbnNhY3Rpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIG1hbnVhbCBqb3VybmFsIHRyYW5zYWN0aW9ucyBhbmQgYXNzb2NpYXRlZFxuICAgKiBhY2NvdW50cyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICBkZWxldGVNYW51YWxKb3VybmFsOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3Qge1xuICAgICAgICBNYW51YWxKb3VybmFsLFxuICAgICAgICBBY2NvdW50VHJhbnNhY3Rpb24sXG4gICAgICAgIE1lZGlhTGluayxcbiAgICAgICAgQWNjb3VudCxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFtYW51YWxKb3VybmFsKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTUFOVUFMLkpPVVJOQUwuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCcsICdNYW51YWxKb3VybmFsJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgbWFudWFsSm91cm5hbC5pZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCkucmVtZW1iZXIoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgam91cm5hbC5sb2FkRW50cmllcyh0cmFuc2FjdGlvbnMpO1xuICAgICAgam91cm5hbC5yZW1vdmVFbnRyaWVzKCk7XG5cbiAgICAgIGF3YWl0IE1lZGlhTGluay5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbW9kZWxfbmFtZScsICdKb3VybmFsJylcbiAgICAgICAgLndoZXJlKCdtb2RlbF9pZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC5kZWxldGUoKTtcblxuICAgICAgYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgam91cm5hbC5kZWxldGVFbnRyaWVzKCksXG4gICAgICAgIGpvdXJuYWwuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICByZWN1cnJpbmdKb3VybmFsc0xpc3Q6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgndGVtcGxhdGVfbmFtZScpLm9wdGlvbmFsKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG5cbiAgcXVpY2tKb3VybmFsRW50cmllczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdkYXRlJykuZXhpc3RzKCkuaXNJU084NjAxKCksXG4gICAgICBjaGVjaygnYW1vdW50JykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2NyZWRpdF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZWJpdF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCd0cmFuc2FjdGlvbl90eXBlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnbm90ZScpLm9wdGlvbmFsKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBmb3VuZEFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBmb3JtLmNyZWRpdF9hY2NvdW50X2lkKVxuICAgICAgICAub3JXaGVyZSgnaWQnLCBmb3JtLmRlYml0X2FjY291bnRfaWQpO1xuXG4gICAgICBjb25zdCBjcmVkaXRBY2NvdW50ID0gZm91bmRBY2NvdW50cy5maW5kKChhKSA9PiBhLmlkID09PSBmb3JtLmNyZWRpdF9hY2NvdW50X2lkKTtcbiAgICAgIGNvbnN0IGRlYml0QWNjb3VudCA9IGZvdW5kQWNjb3VudHMuZmluZCgoYSkgPT4gYS5pZCA9PT0gZm9ybS5kZWJpdF9hY2NvdW50X2lkKTtcblxuICAgICAgaWYgKCFjcmVkaXRBY2NvdW50KSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NSRURJVF9BQ0NPVU5ULk5PVC5FWElTVCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghZGViaXRBY2NvdW50KSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0RFQklUX0FDQ09VTlQuTk9ULkVYSVNUJywgY29kZTogMjAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zdCBqb3VybmFsUG9zdGVyID0gbmV3IEpvdXJuYWxQb3N0ZXIoKTtcbiAgICAgIC8vIGNvbnN0IGpvdXJuYWxDcmVkaXQgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgIC8vICAgZGViaXQ6IFxuICAgICAgLy8gICBhY2NvdW50OiBkZWJpdEFjY291bnQuaWQsXG4gICAgICAvLyAgIHJlZmVyZW5jZUlkOiBcbiAgICAgIC8vIH0pXG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYnVsayBtYW51YWwgam91cm5hbHMuXG4gICAqL1xuICBkZWxldGVCdWxrTWFudWFsSm91cm5hbHM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0geyAuLi5yZXEucXVlcnkgfTtcbiAgICAgIGNvbnN0IHsgTWFudWFsSm91cm5hbCwgQWNjb3VudFRyYW5zYWN0aW9uLCBBY2NvdW50LCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IG1hbnVhbEpvdXJuYWxzID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuXG4gICAgICBjb25zdCBub3RGb3VuZE1hbnVhbEpvdXJuYWxzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBtYW51YWxKb3VybmFscy5tYXAobSA9PiBtLmlkKSk7XG5cbiAgICAgIGlmIChub3RGb3VuZE1hbnVhbEpvdXJuYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ3JlZmVyZW5jZV90eXBlJywgWydKb3VybmFsJywgJ01hbnVhbEpvdXJuYWwnXSlcbiAgICAgICAgLndoZXJlSW4oJ3JlZmVyZW5jZV9pZCcsIGZpbHRlci5pZHMpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCkucmVtZW1iZXIoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgam91cm5hbC5sb2FkRW50cmllcyh0cmFuc2FjdGlvbnMpO1xuICAgICAgam91cm5hbC5yZW1vdmVFbnRyaWVzKCk7XG5cbiAgICAgIGF3YWl0IE1lZGlhTGluay5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbW9kZWxfbmFtZScsICdKb3VybmFsJylcbiAgICAgICAgLndoZXJlSW4oJ21vZGVsX2lkJywgZmlsdGVyLmlkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuXG4gICAgICBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcykuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgam91cm5hbC5kZWxldGVFbnRyaWVzKCksXG4gICAgICAgIGpvdXJuYWwuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWRzOiBmaWx0ZXIuaWRzIH0pO1xuICAgIH0sXG4gIH1cbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICB2YWxpZGF0aW9uUmVzdWx0LFxuICBwYXJhbSxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IEpvdXJuYWxQb3N0ZXIgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXInO1xuaW1wb3J0IE5lc3RlZFNldCBmcm9tICdAL2NvbGxlY3Rpb24vTmVzdGVkU2V0JztcbmltcG9ydCB7XG4gIG1hcFZpZXdSb2xlc1RvQ29uZGl0aW9uYWxzLFxuICBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcixcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5pbXBvcnQge1xuICBEeW5hbWljRmlsdGVyLFxuICBEeW5hbWljRmlsdGVyU29ydEJ5LFxuICBEeW5hbWljRmlsdGVyVmlld3MsXG4gIER5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcyxcbn0gZnJvbSAnQC9saWIvRHluYW1pY0ZpbHRlcic7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy8nLFxuICAgICAgdGhpcy5uZXdBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEFjY291bnQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmVkaXRBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5nZXRBY2NvdW50c0xpc3QudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldEFjY291bnRzTGlzdC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuZGVsZXRlQnVsa0FjY291bnRzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVCdWxrQWNjb3VudHMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnLzppZCcsXG4gICAgICB0aGlzLmRlbGV0ZUFjY291bnQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQvYWN0aXZlJyxcbiAgICAgIHRoaXMuYWN0aXZlQWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYWN0aXZlQWNjb3VudC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZC9pbmFjdGl2ZScsXG4gICAgICB0aGlzLmluYWN0aXZlQWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuaW5hY3RpdmVBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkL3JlY2FsY3VsYXRlLWJhbGFuY2UnLFxuICAgICAgdGhpcy5yZWNhbGN1YWx0ZUJhbGFuYWNlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZWNhbGN1YWx0ZUJhbGFuYWNlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkL3RyYW5zZmVyX2FjY291bnQvOnRvQWNjb3VudCcsXG4gICAgICB0aGlzLnRyYW5zZmVyVG9Bbm90aGVyQWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMudHJhbnNmZXJUb0Fub3RoZXJBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvYnVsay86dHlwZShhY3RpdmF0ZXxpbmFjdGl2YXRlKScsXG4gICAgICB0aGlzLmJ1bGtJbmFjdGl2YXRlQWNjb3VudHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJ1bGtJbmFjdGl2YXRlQWNjb3VudHMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBhY2NvdW50LlxuICAgKi9cbiAgbmV3QWNjb3VudDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCduYW1lJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDMgfSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKCksXG4gICAgICBjaGVjaygnY29kZScpLm9wdGlvbmFsKCkuaXNMZW5ndGgoeyBtYXg6IDEwIH0pXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2FjY291bnRfdHlwZV9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZGVzY3JpcHRpb24nKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBBY2NvdW50VHlwZSwgQWNjb3VudCB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZm91bmRBY2NvdW50Q29kZVByb21pc2UgPSBmb3JtLmNvZGVcbiAgICAgICAgPyBBY2NvdW50LnF1ZXJ5KCkud2hlcmUoJ2NvZGUnLCBmb3JtLmNvZGUpIDogbnVsbDtcblxuICAgICAgY29uc3QgZm91bmRBY2NvdW50VHlwZVByb21pc2UgPSBBY2NvdW50VHlwZS5xdWVyeSgpXG4gICAgICAgIC5maW5kQnlJZChmb3JtLmFjY291bnRfdHlwZV9pZCk7XG5cbiAgICAgIGNvbnN0IFtmb3VuZEFjY291bnRDb2RlLCBmb3VuZEFjY291bnRUeXBlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZm91bmRBY2NvdW50Q29kZVByb21pc2UsIGZvdW5kQWNjb3VudFR5cGVQcm9taXNlLFxuICAgICAgXSk7XG5cbiAgICAgIGlmIChmb3VuZEFjY291bnRDb2RlUHJvbWlzZSAmJiBmb3VuZEFjY291bnRDb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ05PVF9VTklRVUVfQ09ERScsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kQWNjb3VudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ05PVF9FWElTVF9BQ0NPVU5UX1RZUEUnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpLmluc2VydCh7IC4uLmZvcm0gfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGl0ZW06IHsgfSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBnaXZlbiBhY2NvdW50IGRldGFpbHMuXG4gICAqL1xuICBlZGl0QWNjb3VudDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLnRvSW50KCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmlzTGVuZ3RoKHsgbWluOiAzIH0pXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2NvZGUnKS5leGlzdHMoKS5pc0xlbmd0aCh7IG1heDogMTAgfSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKCksXG4gICAgICBjaGVjaygnYWNjb3VudF90eXBlX2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEFjY291bnQsIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWFjY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSA9IChmb3JtLmNvZGUgJiYgZm9ybS5jb2RlICE9PSBhY2NvdW50LmNvZGUpXG4gICAgICAgID8gQWNjb3VudC5xdWVyeSgpLndoZXJlKCdjb2RlJywgZm9ybS5jb2RlKS53aGVyZU5vdCgnaWQnLCBhY2NvdW50LmlkKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IGZvdW5kQWNjb3VudFR5cGVQcm9taXNlID0gKGZvcm0uYWNjb3VudF90eXBlX2lkICE9PSBhY2NvdW50LmFjY291bnRfdHlwZV9pZClcbiAgICAgICAgPyBBY2NvdW50VHlwZS5xdWVyeSgpLndoZXJlKCdpZCcsIGZvcm0uYWNjb3VudF90eXBlX2lkKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IFtmb3VuZEFjY291bnRDb2RlLCBmb3VuZEFjY291bnRUeXBlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZm91bmRBY2NvdW50Q29kZVByb21pc2UsIGZvdW5kQWNjb3VudFR5cGVQcm9taXNlLFxuICAgICAgXSk7XG4gICAgICBpZiAoZm91bmRBY2NvdW50Q29kZS5sZW5ndGggPiAwICYmIGZvdW5kQWNjb3VudENvZGVQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdOT1RfVU5JUVVFX0NPREUnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGZvdW5kQWNjb3VudFR5cGUubGVuZ3RoIDw9IDAgJiYgZm91bmRBY2NvdW50VHlwZVByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ05PVF9FWElTVF9BQ0NPVU5UX1RZUEUnLCBjb2RlOiAxMTAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgYWNjb3VudC5wYXRjaCh7IC4uLmZvcm0gfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBkZXRhaWxzIG9mIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKi9cbiAgZ2V0QWNjb3VudDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5yZW1lbWJlcigpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIWFjY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBhY2NvdW50OiB7IC4uLmFjY291bnQgfSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICBkZWxldGVBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IEFjY291bnQsIEFjY291bnRUcmFuc2FjdGlvbiB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWFjY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoYWNjb3VudC5wcmVkZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5ULlBSRURFRklORUQnICwgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjY291bnRUcmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2FjY291bnRfaWQnLCBhY2NvdW50LmlkKTtcblxuICAgICAgaWYgKGFjY291bnRUcmFuc2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVC5IQVMuQVNTT0NJQVRFRC5UUkFOU0FDVElPTlMnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpLmRlbGV0ZUJ5SWQoYWNjb3VudC5pZCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFjY291bnRzIGxpc3QuXG4gICAqL1xuICBnZXRBY2NvdW50c0xpc3Q6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnZGlzcGxheV90eXBlJykub3B0aW9uYWwoKS5pc0luKFsndHJlZScsICdmbGF0J10pLFxuICAgICAgcXVlcnkoJ2FjY291bnRfdHlwZXMnKS5vcHRpb25hbCgpLmlzQXJyYXkoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50X3R5cGVzLionKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG5cbiAgICAgIHF1ZXJ5KCdzdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMnKS5vcHRpb25hbCgpLmlzSlNPTigpLFxuXG4gICAgICBxdWVyeSgnY29sdW1uX3NvcnRfYnknKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLmlzSW4oWydkZXNjJywgJ2FzYyddKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGFjY291bnRfdHlwZXM6IFtdLFxuICAgICAgICBkaXNwbGF5X3R5cGU6ICd0cmVlJyxcbiAgICAgICAgZmlsdGVyX3JvbGVzOiBbXSxcbiAgICAgICAgc29ydF9vcmRlcjogJ2FzYycsXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcykge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyX3JvbGVzID0gSlNPTi5wYXJzZShmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBSZXNvdXJjZSwgQWNjb3VudCwgVmlldyB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICBjb25zdCBhY2NvdW50c1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAucmVtZW1iZXIoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnYWNjb3VudHMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghYWNjb3VudHNSZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0FDQ09VTlRTX1JFU09VUkNFX05PVF9GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSBhY2NvdW50c1Jlc291cmNlLmZpZWxkcy5tYXAoKGMpID0+IGMua2V5KTtcblxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdpZCcsIGZpbHRlci5jdXN0b21fdmlld19pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnZmF2b3VyaXRlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnVpbGRlci53aGVyZSgncmVzb3VyY2VfaWQnLCBhY2NvdW50c1Jlc291cmNlLmlkKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NvbHVtbnMnKTtcbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuXG4gICAgICAgIGJ1aWxkZXIucmVtZW1iZXIoKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZHluYW1pY0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyKEFjY291bnQudGFibGVOYW1lKTtcblxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9ieSkge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X2J5KSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X2J5LFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWaWV3IHJvbGVzLlxuICAgICAgaWYgKHZpZXcgJiYgdmlldy5yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZpZXdGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclZpZXdzKFxuICAgICAgICAgIG1hcFZpZXdSb2xlc1RvQ29uZGl0aW9uYWxzKHZpZXcucm9sZXMpLFxuICAgICAgICAgIHZpZXcucm9sZXNMb2dpY0V4cHJlc3Npb24sXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdmlld0ZpbHRlci52YWxpZGF0ZUZpbHRlclJvbGVzKCkpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdWSUVXLkxPR0lDLkVYUFJFU1NJT04uSU5WQUxJRCcsIGNvZGU6IDQwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcih2aWV3RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIGFjY291bnRzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQUNDT1VOVFMuUkVTT1VSQ0UuSEFTLk5PLkdJVkVOLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLnJlbWVtYmVyKClcbiAgICAgICAgLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm1vZGlmeSgnZmlsdGVyQWNjb3VudFR5cGVzJywgZmlsdGVyLmFjY291bnRfdHlwZXMpO1xuICAgICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgndHlwZScpO1xuICAgICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnYmFsYW5jZScpO1xuXG4gICAgICAgICAgZHluYW1pY0ZpbHRlci5idWlsZFF1ZXJ5KCkoYnVpbGRlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXN0ZWRBY2NvdW50cyA9IEFjY291bnQudG9OZXN0ZWRBcnJheShhY2NvdW50cyk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIGFjY291bnRzOiBuZXN0ZWRBY2NvdW50cyxcbiAgICAgICAgLi4uKHZpZXcpID8ge1xuICAgICAgICAgIGN1c3RvbVZpZXdJZDogdmlldy5pZCxcbiAgICAgICAgfSA6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmUtY2FsY3VsYXRlcyBiYWxhbmNlIG9mIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKi9cbiAgcmVjYWxjdWFsdGVCYWxhbmFjZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3Qge1xuICAgICAgICBBY2NvdW50LFxuICAgICAgICBBY2NvdW50VHJhbnNhY3Rpb24sXG4gICAgICAgIEFjY291bnRCYWxhbmNlLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgQWNjb3VudC5maW5kQnlJZChpZCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0FDQ09VTlQuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjY291bnRUcmFuc2FjdGlvbnMgPSBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2FjY291bnRfaWQnLCBhY2NvdW50LmlkKTtcblxuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXMgPSBuZXcgSm91cm5hbFBvc3RlcigpO1xuICAgICAgam91cm5hbEVudHJpZXMubG9hZEZyb21Db2xsZWN0aW9uKGFjY291bnRUcmFuc2FjdGlvbnMpO1xuXG4gICAgICAvLyBEZWxldGUgdGhlIGJhbGFuY2Ugb2YgdGhlIGdpdmVuIGFjY291bnQgaWQuXG4gICAgICBhd2FpdCBBY2NvdW50QmFsYW5jZS5xdWVyeSgpLndoZXJlKCdhY2NvdW50X2lkJywgYWNjb3VudC5pZCkuZGVsZXRlKCk7XG5cbiAgICAgIC8vIFNhdmUgY2FsY3VhbHRlZCBhY2NvdW50IGJhbGFuY2UuXG4gICAgICBhd2FpdCBqb3VybmFsRW50cmllcy5zYXZlQmFsYW5jZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBBY3RpdmUgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICBhY3RpdmVBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGlkKTtcblxuICAgICAgaWYgKCFhY2NvdW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLnBhdGNoKHsgYWN0aXZlOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogYWNjb3VudC5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBJbmFjdGl2ZSB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGluYWN0aXZlQWNjb3VudDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0FDQ09VTlQuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC5wYXRjaCh7IGFjdGl2ZTogZmFsc2UgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiBhY2NvdW50LmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyYW5zZmVyIGFsbCBqb3VybmFsIGVudHJpZXMgb2YgdGhlIGdpdmVuIGFjY291bnQgdG8gYW5vdGhlciBhY2NvdW50LlxuICAgKi9cbiAgdHJhbnNmZXJUb0Fub3RoZXJBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHBhcmFtKCd0b0FjY291bnQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uc3QgeyBpZCwgdG9BY2NvdW50OiB0b0FjY291bnRJZCB9ID0gcmVxLnBhcmFtcztcblxuICAgICAgLy8gY29uc3QgW2Zyb21BY2NvdW50LCB0b0FjY291bnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgLy8gICBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoaWQpLFxuICAgICAgLy8gICBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQodG9BY2NvdW50SWQpLFxuICAgICAgLy8gXSk7XG5cbiAgICAgIC8vIGNvbnN0IGZyb21BY2NvdW50VHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgIC8vICAgLndoZXJlKCdhY2NvdW50X2lkJywgZnJvbUFjY291bnQpO1xuXG4gICAgICAvLyByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIGRlbGV0ZUJ1bGtBY2NvdW50czoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KCksXG4gICAgICBxdWVyeSgnaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlciA9IHsgaWRzOiBbXSwgLi4ucmVxLnF1ZXJ5IH07XG4gICAgICBjb25zdCB7IEFjY291bnQsIEFjY291bnRUcmFuc2FjdGlvbiB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmlkcy5sZW5ndGgpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGEpID0+IGEuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRBY2NvdW50cyA9IGRpZmZlcmVuY2UoZmlsdGVyLmlkcywgYWNjb3VudHNJZHMpO1xuICAgICAgY29uc3QgcHJlZGVmaW5lZEFjY291bnRzID0gYWNjb3VudHMuZmlsdGVyKGFjY291bnQgPT4gYWNjb3VudC5wcmVkZWZpbmVkKTtcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICBpZiAobm90Rm91bmRBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ0FDQ09VTlRTLklEUy5OT1QuRk9VTkQnLFxuICAgICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgICAgaWRzOiBub3RGb3VuZEFjY291bnRzLFxuICAgICAgICAgIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVkZWZpbmVkQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ0FDQ09VTlQuUFJFREVGSU5FRCcsXG4gICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgIGlkczogcHJlZGVmaW5lZEFjY291bnRzLm1hcChhID0+IGEuaWQpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjY291bnRzVHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2FjY291bnRfaWQnLCBhY2NvdW50c0lkcylcbiAgICAgICAgLmNvdW50KCdpZCBhcyB0cmFuc2FjdGlvbnNfY291bnQnKVxuICAgICAgICAuZ3JvdXBCeSgnYWNjb3VudF9pZCcpXG4gICAgICAgIC5zZWxlY3QoJ2FjY291bnRfaWQnKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNIYXNUcmFuc2FjdGlvbnMgPSBbXTtcblxuICAgICAgYWNjb3VudHNUcmFuc2FjdGlvbnMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uc0NvdW50ID4gMCkge1xuICAgICAgICAgIGFjY291bnRzSGFzVHJhbnNhY3Rpb25zLnB1c2godHJhbnNhY3Rpb24uYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYWNjb3VudHNIYXNUcmFuc2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ0FDQ09VTlQuSEFTLkFTU09DSUFURUQuVFJBTlNBQ1RJT05TJyxcbiAgICAgICAgICBjb2RlOiAzMDAsXG4gICAgICAgICAgaWRzOiBhY2NvdW50c0hhc1RyYW5zYWN0aW9uc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignaWQnLCBhY2NvdW50cy5tYXAoKGEpID0+IGEuaWQpKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEJ1bGsgYWN2dGl2YXRlL2luYWN0aXZhdGUgdGhlIGdpdmVuIGFjY291bnRzLlxuICAgKi9cbiAgYnVsa0luYWN0aXZhdGVBY2NvdW50czoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHBhcmFtKCd0eXBlJykuZXhpc3RzKCkuaXNJbihbJ2FjdGl2YXRlJywgJ2luYWN0aXZhdGUnXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBpZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyB0eXBlIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBjb25zdCBzdG9yZWRBY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKS53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuICAgICAgY29uc3Qgc3RvcmVkQWNjb3VudHNJZHMgPSBzdG9yZWRBY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRBY2NvdW50cyA9IGRpZmZlcmVuY2UoZmlsdGVyLmlkcywgc3RvcmVkQWNjb3VudHNJZHMpO1xuXG4gICAgICBpZiAobm90Rm91bmRBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVFMuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRBY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignaWQnLCBzdG9yZWRBY2NvdW50c0lkcylcbiAgICAgICAgLnBhdGNoKHtcbiAgICAgICAgICBhY3RpdmU6IHR5cGUgPT09ICdhY3RpdmF0ZScgPyAxIDogMCxcbiAgICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkczogc3RvcmVkQWNjb3VudHNJZHMgfSk7XG4gICAgfVxuICB9XG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVjaywgdmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB1bmlxaWQgZnJvbSAndW5pcWlkJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IFN5c3RlbVVzZXIgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1N5c3RlbVVzZXInO1xuaW1wb3J0IG1haWwgZnJvbSAnQC9zZXJ2aWNlcy9tYWlsJztcbmltcG9ydCB7IGhhc2hQYXNzd29yZCB9IGZyb20gJ0AvdXRpbHMnO1xuaW1wb3J0IGRiTWFuYWdlciBmcm9tICdAL2RhdGFiYXNlL21hbmFnZXInO1xuaW1wb3J0IFRlbmFudCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvVGVuYW50JztcbmltcG9ydCBUZW5hbnRVc2VyIGZyb20gJ0AvbW9kZWxzL1RlbmFudFVzZXInO1xuaW1wb3J0IFRlbmFudHNNYW5hZ2VyIGZyb20gJ0Avc3lzdGVtL1RlbmFudHNNYW5hZ2VyJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgUGFzc3dvcmRSZXNldCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvUGFzc3dvcmRSZXNldCc7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucG9zdCgnL2xvZ2luJyxcbiAgICAgIHRoaXMubG9naW4udmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxvZ2luLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvcmVnaXN0ZXInLFxuICAgICAgdGhpcy5yZWdpc3Rlci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVnaXN0ZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9zZW5kX3Jlc2V0X3Bhc3N3b3JkJyxcbiAgICAgIHRoaXMuc2VuZFJlc2V0UGFzc3dvcmQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnNlbmRSZXNldFBhc3N3b3JkLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvcmVzZXQvOnRva2VuJyxcbiAgICAgIHRoaXMucmVzZXRQYXNzd29yZC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVzZXRQYXNzd29yZC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVc2VyIGxvZ2luIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuXG4gICAqL1xuICBsb2dpbjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdjcmVkaWVudGlhbCcpLmV4aXN0cygpLmlzRW1haWwoKSxcbiAgICAgIGNoZWNrKCdwYXNzd29yZCcpLmV4aXN0cygpLmlzTGVuZ3RoKHsgbWluOiA1IH0pLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEpXVF9TRUNSRVRfS0VZIH0gPSBwcm9jZXNzLmVudjtcblxuICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdTb21lb25lIHRyeWluZyB0byBsb2dpbi4nLCB7IGZvcm0gfSk7XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3RlbmFudCcpXG4gICAgICAgIC53aGVyZSgnZW1haWwnLCBmb3JtLmNyZWRpZW50aWFsKVxuICAgICAgICAub3JXaGVyZSgncGhvbmVfbnVtYmVyJywgZm9ybS5jcmVkaWVudGlhbClcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSU5WQUxJRF9ERVRBSUxTJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlci52ZXJpZnlQYXNzd29yZChmb3JtLnBhc3N3b3JkKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSU5WQUxJRF9ERVRBSUxTJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlci5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1VTRVJfSU5BQ1RJVkUnLCBjb2RlOiAxMTAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdExvZ2luQXQgPSBtb21lbnQoKS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcblxuICAgICAgY29uc3QgdXBkYXRlVGVuYW50VXNlciA9IFRlbmFudFVzZXIudGVuYW50KCkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZClcbiAgICAgICAgLnVwZGF0ZSh7IGxhc3RfbG9naW5fYXQ6IGxhc3RMb2dpbkF0IH0pO1xuXG4gICAgICBjb25zdCB1cGRhdGVTeXN0ZW1Vc2VyID0gU3lzdGVtVXNlci5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCB1c2VyLmlkKVxuICAgICAgICAudXBkYXRlKHsgbGFzdF9sb2dpbl9hdDogbGFzdExvZ2luQXQgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFt1cGRhdGVUZW5hbnRVc2VyLCB1cGRhdGVTeXN0ZW1Vc2VyXSk7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gand0LnNpZ24oXG4gICAgICAgIHsgZW1haWw6IHVzZXIuZW1haWwsIF9pZDogdXNlci5pZCB9LFxuICAgICAgICBKV1RfU0VDUkVUX0tFWSxcbiAgICAgICAgeyBleHBpcmVzSW46ICcxZCcgfSxcbiAgICAgICk7XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0xvZ2dpbmcgc3VjY2Vzcy4nLCB7IGZvcm0gfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHRva2VuLCB1c2VyIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBvcmdhbml6YXRpb24uXG4gICAqL1xuICByZWdpc3Rlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdvcmdhbml6YXRpb25fbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdmaXJzdF9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2xhc3RfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdlbWFpbCcpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdwaG9uZV9udW1iZXInKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGFzc3dvcmQnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnY291bnRyeScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdTb21lb25lIHRyeWluZyB0byByZWdpc3Rlci4nLCB7IGZvcm0gfSk7XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIGZvcm0uZW1haWwpXG4gICAgICAgIC5vcldoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcilcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICBpZiAodXNlciAmJiB1c2VyLnBob25lTnVtYmVyID09PSBmb3JtLnBob25lX251bWJlcikge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdQSE9ORV9OVU1CRVJfRVhJU1RTJywgY29kZTogMTAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXIgJiYgdXNlci5lbWFpbCA9PT0gZm9ybS5lbWFpbCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdFTUFJTF9FWElTVFMnLCBjb2RlOiAyMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9IHVuaXFpZCgpO1xuICAgICAgY29uc3QgdGVuYW50T3JnYW5pemF0aW9uID0gYXdhaXQgVGVuYW50LnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IGhhc2hQYXNzd29yZChmb3JtLnBhc3N3b3JkKTtcbiAgICAgIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgICAgIC4uLnBpY2soZm9ybSwgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsICdwaG9uZV9udW1iZXInXSksXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZWdpc3RlcmVkVXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi51c2VySW5zZXJ0LFxuICAgICAgICBwYXNzd29yZDogaGFzaGVkUGFzc3dvcmQsXG4gICAgICAgIHRlbmFudF9pZDogdGVuYW50T3JnYW5pemF0aW9uLmlkLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBkYk1hbmFnZXIuY3JlYXRlRGIoYGJpZ2NhcGl0YWxfdGVuYW50XyR7b3JnYW5pemF0aW9uSWR9YCk7XG5cbiAgICAgIGNvbnN0IHRlbmFudERiID0gVGVuYW50c01hbmFnZXIua25leEluc3RhbmNlKG9yZ2FuaXphdGlvbklkKTtcbiAgICAgIGF3YWl0IHRlbmFudERiLm1pZ3JhdGUubGF0ZXN0KCk7XG5cbiAgICAgIFRlbmFudE1vZGVsLmtuZXhCaW5kZWQgPSB0ZW5hbnREYjtcblxuICAgICAgYXdhaXQgVGVuYW50VXNlci5iaW5kS25leCh0ZW5hbnREYikucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi51c2VySW5zZXJ0LFxuICAgICAgICBpbnZpdGVfYWNjZXB0ZWRfYXQ6IG1vbWVudCgpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxuICAgICAgfSk7XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ05ldyB0ZW5hbnQgaGFzIGJlZW4gY3JlYXRlZC4nLCB7IG9yZ2FuaXphdGlvbklkIH0pO1xuXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihnbG9iYWwucm9vdFBhdGgsICd2aWV3cy9tYWlsL1dlbGNvbWUuaHRtbCcpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCByZW5kZXJlZCA9IE11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSwgeyAuLi5mb3JtIH0pO1xuICAgICAgY29uc3QgbWFpbE9wdGlvbnMgPSB7XG4gICAgICAgIHRvOiB1c2VySW5zZXJ0LmVtYWlsLFxuICAgICAgICBmcm9tOiBgJHtwcm9jZXNzLmVudi5NQUlMX0ZST01fTkFNRX0gJHtwcm9jZXNzLmVudi5NQUlMX0ZST01fQUREUkVTU31gLFxuICAgICAgICBzdWJqZWN0OiAnV2VsY29tZSB0byBCaWdjYXBpdGFsJyxcbiAgICAgICAgaHRtbDogcmVuZGVyZWQsXG4gICAgICB9O1xuICAgICAgbWFpbC5zZW5kTWFpbChtYWlsT3B0aW9ucywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCBzZW5kIHdlbGNvbWUgbWFpbCcsIHsgZXJyb3IsIGZvcm0gfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnVXNlciBoYXMgYmVlbiBzZW50IHdlbGNvbWUgZW1haWwgc3VjY2Vzc2Z1bHkuJywgeyBmb3JtIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIG9yZ2FuaXphdGlvbl9pZDogb3JnYW5pemF0aW9uSWQsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBTZW5kIHJlc2V0IHBhc3N3b3JkIGxpbmsgdmlhIGVtYWlsIG9yIFNNUy5cbiAgICovXG4gIHNlbmRSZXNldFBhc3N3b3JkOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2VtYWlsJykuZXhpc3RzKCkuaXNFbWFpbCgpLFxuICAgIF0sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgdHJ5aW5nIHRvIHNlbmQgcmVzZXQgcGFzc3dvcmQuJywgeyBmb3JtIH0pO1xuXG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgU3lzdGVtVXNlci5xdWVyeSgpLndoZXJlKCdlbWFpbCcsIGZvcm0uZW1haWwpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0VNQUlMLk5PVC5SRUdJU1RFUkVEJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSBhbGwgc3RvcmVkIHRva2VucyBvZiByZXNldCBwYXNzd29yZCB0aGF0IGFzc29jaWF0ZSB0byB0aGUgZ2l2ZSBlbWFpbC5cbiAgICAgIGF3YWl0IFBhc3N3b3JkUmVzZXQucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbClcbiAgICAgICAgLmRlbGV0ZSgpO1xuXG4gICAgICBjb25zdCB0b2tlbiA9IHVuaXFpZCgpO1xuICAgICAgY29uc3QgcGFzc3dvcmRSZXNldCA9IGF3YWl0IFBhc3N3b3JkUmVzZXQucXVlcnkoKVxuICAgICAgICAuaW5zZXJ0KHsgZW1haWw6IGZvcm0uZW1haWwsIHRva2VuIH0pO1xuXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihnbG9iYWwucm9vdFBhdGgsICd2aWV3cy9tYWlsL1Jlc2V0UGFzc3dvcmQuaHRtbCcpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCByZW5kZXJlZCA9IE11c3RhY2hlLnJlbmRlcih0ZW1wbGF0ZSwge1xuICAgICAgICB1cmw6IGAke3JlcS5wcm90b2NvbH06Ly8ke3JlcS5ob3N0bmFtZX0vcmVzZXQvJHtwYXNzd29yZFJlc2V0LnRva2VufWAsXG4gICAgICAgIGZpcnN0X25hbWU6IHVzZXIuZmlyc3ROYW1lLFxuICAgICAgICBsYXN0X25hbWU6IHVzZXIubGFzdE5hbWUsXG4gICAgICAgIC8vIGNvbnRhY3RfdXNfZW1haWw6IGNvbmZpZy5jb250YWN0VXNNYWlsLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1haWxPcHRpb25zID0ge1xuICAgICAgICB0bzogdXNlci5lbWFpbCxcbiAgICAgICAgZnJvbTogYCR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX05BTUV9ICR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX0FERFJFU1N9YCxcbiAgICAgICAgc3ViamVjdDogJ0JpZ2NhcGl0YWwgLSBQYXNzd29yZCBSZXNldCcsXG4gICAgICAgIGh0bWw6IHJlbmRlcmVkLFxuICAgICAgfTtcbiAgICAgIG1haWwuc2VuZE1haWwobWFpbE9wdGlvbnMsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBMb2dnZXIubG9nKCdlcnJvcicsICdGYWlsZWQgc2VuZCByZXNldCBwYXNzd29yZCBtYWlsJywgeyBlcnJvciwgZm9ybSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdVc2VyIGhhcyBiZWVuIHNlbnQgcmVzZXQgcGFzc3dvcmQgZW1haWwgc3VjY2Vzc2Z1bHkuJywgeyBmb3JtIH0pO1xuICAgICAgfSk7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGVtYWlsOiBwYXNzd29yZFJlc2V0LmVtYWlsIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhc3N3b3JkLlxuICAgKi9cbiAgcmVzZXRQYXNzd29yZDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdwYXNzd29yZCcpLmV4aXN0cygpLmlzTGVuZ3RoKHsgbWluOiA1IH0pLmN1c3RvbSgodmFsdWUsIHsgcmVxIH0pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSByZXEuYm9keS5jb25maXJtX3Bhc3N3b3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFzc3dvcmRzIGRvbid0IG1hdGNoXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdVc2VyIHRyeWluZyB0byByZXNldCBwYXNzd29yZC4nKTtcbiAgICAgIGNvbnN0IHsgdG9rZW4gfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IHBhc3N3b3JkIH0gPSByZXEuYm9keTtcblxuICAgICAgY29uc3QgdG9rZW5Nb2RlbCA9IGF3YWl0IFBhc3N3b3JkUmVzZXQucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Rva2VuJywgdG9rZW4pXG4gICAgICAgIC8vIC53aGVyZSgnY3JlYXRlZF9hdCcsICc+PScsIERhdGUubm93KCkgLSAzNjAwMDAwKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCF0b2tlbk1vZGVsKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdUT0tFTl9JTlZBTElEJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIHRva2VuTW9kZWwuZW1haWwpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVVNFUl9OT1RfRk9VTkQnLCBjb2RlOiAxMjAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzaGVkUGFzc3dvcmQgPSBhd2FpdCBoYXNoUGFzc3dvcmQocGFzc3dvcmQpO1xuXG4gICAgICBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIHRva2VuTW9kZWwuZW1haWwpXG4gICAgICAgIC51cGRhdGUoe1xuICAgICAgICAgIHBhc3N3b3JkOiBoYXNoZWRQYXNzd29yZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgcmVzZXQgcGFzc3dvcmQgdG9rZW4uXG4gICAgICBhd2FpdCBQYXNzd29yZFJlc2V0LnF1ZXJ5KCkud2hlcmUoJ3Rva2VuJywgdG9rZW4pLmRlbGV0ZSgpO1xuICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdVc2VyIHBhc3N3b3JkIGhhcyBiZWVuIHJlc2V0IHN1Y2Nlc3NmdWxseS4nKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHt9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgY2hlY2ssIHBhcmFtLCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5hbGwudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmFsbC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLm5ld0N1cnJlbmN5LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdDdXJyZW5jeS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZCcsXG4gICAgICB0aGlzLmVkaXRDdXJyZW5jeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEN1cnJlbmN5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86Y3VycmVuY3lfY29kZScsXG4gICAgICB0aGlzLmRlbGV0ZUN1cnJlY3kudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUN1cnJlY3kuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgYWxsIHJlZ2lzdGVyZWQgY3VycmVuY3kgZGV0YWlscy5cbiAgICovXG4gIGFsbDoge1xuICAgIHZhbGlkYXRpb246IFtdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgQ3VycmVuY3kgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBjdXJyZW5jaWVzID0gYXdhaXQgQ3VycmVuY3kucXVlcnkoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgY3VycmVuY2llczogW1xuICAgICAgICAgIC4uLmN1cnJlbmNpZXMsXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIG5ld0N1cnJlbmN5OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2N1cnJlbmN5X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfY29kZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBDdXJyZW5jeSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZm91bmRDdXJyZW5jeSA9IGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgZm9ybS5jdXJyZW5jeV9jb2RlKTtcblxuICAgICAgaWYgKGZvdW5kQ3VycmVuY3kubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0NVUlJFTkNZLkNPREUuQUxSRUFEWS5FWElTVFMnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQ3VycmVuY3kucXVlcnkoKVxuICAgICAgICAuaW5zZXJ0KHsgLi4uZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgY3VycmVuY3k6IHsgLi4uZm9ybSB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcblxuICBkZWxldGVDdXJyZWN5OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2N1cnJlbmN5X2NvZGUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBDdXJyZW5jeSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnY3VycmVuY3lfY29kZScsIGN1cnJlbmN5Q29kZSlcbiAgICAgICAgLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUgfSk7XG4gICAgfSxcbiAgfSxcblxuICBlZGl0Q3VycmVuY3k6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2N1cnJlbmN5X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfY29kZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgQ3VycmVuY3kgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvdW5kQ3VycmVuY3kgPSBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnY3VycmVuY3lfY29kZScsIGZvcm0uY3VycmVuY3lfY29kZSkud2hlcmVOb3QoJ2lkJywgaWQpO1xuXG4gICAgICBpZiAoZm91bmRDdXJyZW5jeS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQ1VSUkVOQ1kuQ09ERS5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS51cGRhdGUoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjdXJyZW5jeTogeyAuLi5mb3JtIH0gfSk7XG4gICAgfSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBwYXJhbSxcbiAgcXVlcnksXG4gIHZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5leGNoYW5nZVJhdGVzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5leGNoYW5nZVJhdGVzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMuYWRkRXhjaGFuZ2VSYXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5hZGRFeGNoYW5nZVJhdGUuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0RXhjaGFuZ2VSYXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0RXhjaGFuZ2VSYXRlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9idWxrJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUV4Y2hhbmdlUmF0ZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJ1bGtEZWxldGVFeGNoYW5nZVJhdGVzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVFeGNoYW5nZVJhdGUudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUV4Y2hhbmdlUmF0ZS5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBleGNoYW5nZSByYXRlcy5cbiAgICovXG4gIGV4Y2hhbmdlUmF0ZXM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBwYWdlX3NpemU6IDEwLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBleGNoYW5nZVJhdGVzID0gYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KClcbiAgICAgICAgLnBhZ2luYXRpb24oZmlsdGVyLnBhZ2UgLSAxLCBmaWx0ZXIucGFnZV9zaXplKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgZXhjaGFuZ2VfcmF0ZXM6IGV4Y2hhbmdlUmF0ZXMgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBleGNoYW5nZSByYXRlIG9uIHRoZSBnaXZlbiBkYXRlLlxuICAgKi9cbiAgYWRkRXhjaGFuZ2VSYXRlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2V4Y2hhbmdlX3JhdGUnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfY29kZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdkYXRlJykuZXhpc3RzKCkuaXNJU084NjAxKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgZm91bmRFeGNoYW5nZVJhdGUgPSBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2N1cnJlbmN5X2NvZGUnLCBmb3JtLmN1cnJlbmN5X2NvZGUpXG4gICAgICAgIC53aGVyZSgnZGF0ZScsIGZvcm0uZGF0ZSk7XG5cbiAgICAgIGlmIChmb3VuZEV4Y2hhbmdlUmF0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRVhDSEFOR0UuUkFURS5EQVRFLlBFUklPRC5ERUZJTkVEJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIC4uLmZvcm0sXG4gICAgICAgIGRhdGU6IG1vbWVudChmb3JtLmRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cblxuICAvKipcbiAgICogRWRpdCB0aGUgZ2l2ZW4gZXhjaGFuZ2UgcmF0ZS5cbiAgICovXG4gIGVkaXRFeGNoYW5nZVJhdGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2V4Y2hhbmdlX3JhdGUnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEV4Y2hhbmdlUmF0ZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZm91bmRFeGNoYW5nZVJhdGUgPSBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpO1xuXG4gICAgICBpZiAoIWZvdW5kRXhjaGFuZ2VSYXRlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0VYQ0hBTkdFLlJBVEUuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLnVwZGF0ZSh7IC4uLmZvcm0gfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gZXhjaGFuZ2UgcmF0ZSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKi9cbiAgZGVsZXRlRXhjaGFuZ2VSYXRlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3VuZEV4Y2hhbmdlUmF0ZSA9IGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKTtcblxuICAgICAgaWYgKCFmb3VuZEV4Y2hhbmdlUmF0ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWENIQU5HRS5SQVRFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgYnVsa0RlbGV0ZUV4Y2hhbmdlUmF0ZXM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuaXNBcnJheSh7IG1pbjogMiB9KSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGlkczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IEV4Y2hhbmdlUmF0ZSB9ID0gcmVxLm1vZGVscztcbiAgICAgIFxuICAgICAgY29uc3QgZXhjaGFuZ2VSYXRlcyA9IGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcyk7XG4gICAgICBjb25zdCBleGNoYW5nZVJhdGVzSWRzID0gZXhjaGFuZ2VSYXRlcy5tYXAoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEV4UmF0ZXMgPSBkaWZmZXJlbmNlKGZpbHRlci5pZHMsIGV4Y2hhbmdlUmF0ZXNJZHMpO1xuICAgICAgXG4gICAgICBpZiAobm90Rm91bmRFeFJhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWENIQU5HRS5SQVRFUy5JUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAsIGlkczogbm90Rm91bmRFeFJhdGVzIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpLndoZXJlSW4oJ2lkJywgZXhjaGFuZ2VSYXRlc0lkcykuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkczogZXhjaGFuZ2VSYXRlc0lkcyB9KTtcbiAgICB9LFxuICB9LFxufSIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuXG5pbXBvcnQgQmFsYW5jZVNoZWV0Q29udHJvbGxlciBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvQmFsYW5jZVNoZWV0JztcbmltcG9ydCBUcmlhbEJhbGFuY2VTaGVldENvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL1RyaWFsQmFsYW5jZVNoZWV0JztcbmltcG9ydCBHZW5lcmFsTGVkZ2VyQ29udHJvbGxlciBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvZ2VuZXJhbExlZGdlcic7XG5pbXBvcnQgSm91cm5hbFNoZWV0Q29udHJvbGxlciBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvSm91cm5hbFNoZWV0JztcbmltcG9ydCBQcm9maXRMb3NzQ29udHJvbGxlciBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvUHJvZml0TG9zc1NoZWV0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIudXNlKCcvYmFsYW5jZV9zaGVldCcsIEJhbGFuY2VTaGVldENvbnRyb2xsZXIucm91dGVyKCkpO1xuICAgIHJvdXRlci51c2UoJy9wcm9maXRfbG9zc19zaGVldCcsIFByb2ZpdExvc3NDb250cm9sbGVyLnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvZ2VuZXJhbF9sZWRnZXInLCBHZW5lcmFsTGVkZ2VyQ29udHJvbGxlci5yb3V0ZXIoKSk7XG4gICAgcm91dGVyLnVzZSgnL3RyaWFsX2JhbGFuY2Vfc2hlZXQnLCBUcmlhbEJhbGFuY2VTaGVldENvbnRyb2xsZXIucm91dGVyKCkpO1xuICAgIHJvdXRlci51c2UoJy9qb3VybmFsJywgSm91cm5hbFNoZWV0Q29udHJvbGxlci5yb3V0ZXIoKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxufTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIG9uZU9mLCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgcGljaywgZGlmZmVyZW5jZSwgZ3JvdXBCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgeyBkYXRlUmFuZ2VDb2xsZWN0aW9uIH0gZnJvbSAnQC91dGlscyc7XG5pbXBvcnQgRGVwZW5kZW5jeUdyYXBoIGZyb20gJ0AvbGliL0RlcGVuZGVuY3lHcmFwaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSdcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLCBcbiAgICAgIHRoaXMuYmFsYW5jZVNoZWV0LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5iYWxhbmNlU2hlZXQuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgYmFsYW5jZSBzaGVldC5cbiAgICovXG4gIGJhbGFuY2VTaGVldDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdhY2NvdW50aW5nX21ldGhvZCcpLm9wdGlvbmFsKCkuaXNJbihbJ2Nhc2gnLCAnYWNjdXJhbCddKSxcbiAgICAgIHF1ZXJ5KCdmcm9tX2RhdGUnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ3RvX2RhdGUnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ2Rpc3BsYXlfY29sdW1uc190eXBlJykub3B0aW9uYWwoKS5pc0luKFsnZGF0ZV9wZXJpb2RzJywgJ3RvdGFsJ10pLFxuICAgICAgcXVlcnkoJ2Rpc3BsYXlfY29sdW1uc19ieScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUsIGNoZWNrRmFsc3k6IHRydWUgfSlcbiAgICAgICAgLmlzSW4oWyd5ZWFyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ3F1YXJ0ZXInXSksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5ub19jZW50cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5kaXZpZGVfMTAwMCcpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMnKS5pc0FycmF5KCkub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdub25lX3plcm8nKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFR5cGUgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgZGlzcGxheV9jb2x1bW5zX3R5cGU6ICd0b3RhbCcsXG4gICAgICAgIGRpc3BsYXlfY29sdW1uc19ieTogJycsXG4gICAgICAgIGZyb21fZGF0ZTogbW9tZW50KCkuc3RhcnRPZigneWVhcicpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgICB0b19kYXRlOiBtb21lbnQoKS5lbmRPZigneWVhcicpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgICBudW1iZXJfZm9ybWF0OiB7XG4gICAgICAgICAgbm9fY2VudHM6IGZhbHNlLFxuICAgICAgICAgIGRpdmlkZV8xMDAwOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgbm9uZV96ZXJvOiBmYWxzZSxcbiAgICAgICAgYmFzaXM6ICdjYXNoJyxcbiAgICAgICAgYWNjb3VudF9pZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hY2NvdW50X2lkcykpIHtcbiAgICAgICAgZmlsdGVyLmFjY291bnRfaWRzID0gW2ZpbHRlci5hY2NvdW50X2lkc107XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFjY291bnQgYmFsYW5jZSBmb3JtbWF0dGVyIGJhc2VkIG9uIHRoZSBnaXZlbiBxdWVyeS5cbiAgICAgIGNvbnN0IGJhbGFuY2VGb3JtYXR0ZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcbiAgICAgIGNvbnN0IGNvbXBhcmF0b3JEYXRlVHlwZSA9IGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ3RvdGFsJyA/ICdkYXknIDogZmlsdGVyLmRpc3BsYXlfY29sdW1uc19ieTtcblxuICAgICAgY29uc3QgYmFsYW5jZVNoZWV0VHlwZXMgPSBhd2FpdCBBY2NvdW50VHlwZS5xdWVyeSgpLndoZXJlKCdiYWxhbmNlX3NoZWV0JywgdHJ1ZSk7XG5cbiAgICAgIC8vIEZldGNoIGFsbCBiYWxhbmNlIHNoZWV0IGFjY291bnRzIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoJ2JhbGFuY2Vfc2hlZXRfYWNjb3VudHMnKVxuICAgICAgICAud2hlcmVJbignYWNjb3VudF90eXBlX2lkJywgYmFsYW5jZVNoZWV0VHlwZXMubWFwKChhKSA9PiBhLmlkKSlcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudF9pZHMpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0eXBlJylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3RyYW5zYWN0aW9ucycpXG4gICAgICAgIC5tb2RpZnlHcmFwaCgndHJhbnNhY3Rpb25zJywgKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm1vZGlmeSgnZmlsdGVyRGF0ZVJhbmdlJywgbnVsbCwgZmlsdGVyLnRvX2RhdGUpO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gQWNjb3VudHMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgIGNvbnN0IGFjY291bnRzR3JhcGggPSBEZXBlbmRlbmN5R3JhcGguZnJvbUFycmF5KFxuICAgICAgICBhY2NvdW50cywgeyBpdGVtSWQ6ICdpZCcsIHBhcmVudEl0ZW1JZDogJ3BhcmVudEFjY291bnRJZCcgfVxuICAgICAgKTtcbiAgICAgIC8vIExvYWQgYWxsIGVudHJpZXMgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBhY2NvdW50cy5cbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzQ29sbGVjdGVkID0gQWNjb3VudC5jb2xsZWN0Sm91cm5hbEVudHJpZXMoYWNjb3VudHMpO1xuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXMgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0dyYXBoKTtcblxuICAgICAgam91cm5hbEVudHJpZXMubG9hZEVudHJpZXMoam91cm5hbEVudHJpZXNDb2xsZWN0ZWQpO1xuXG4gICAgICAvLyBEYXRlIHJhbmdlIGNvbGxlY3Rpb24uIFxuICAgICAgY29uc3QgZGF0ZVJhbmdlU2V0ID0gKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ2RhdGVfcGVyaW9kcycpXG4gICAgICAgID8gZGF0ZVJhbmdlQ29sbGVjdGlvbihcbiAgICAgICAgICBmaWx0ZXIuZnJvbV9kYXRlLCBmaWx0ZXIudG9fZGF0ZSwgY29tcGFyYXRvckRhdGVUeXBlLFxuICAgICAgICApIDogW107XG5cbiAgICAgIC8vIEdldHMgdGhlIGRhdGUgcmFuZ2Ugc2V0IGZyb20gc3RhcnQgdG8gZW5kIGRhdGUuXG4gICAgICBjb25zdCB0b3RhbFBlcmlvZHMgPSAoYWNjb3VudCkgPT4gKHtcbiAgICAgICAgdG90YWxfcGVyaW9kczogZGF0ZVJhbmdlU2V0Lm1hcCgoZGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IGpvdXJuYWxFbnRyaWVzLmdldEFjY291bnRCYWxhbmNlKGFjY291bnQuaWQsIGRhdGUsIGNvbXBhcmF0b3JEYXRlVHlwZSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogYmFsYW5jZUZvcm1hdHRlcihhbW91bnQpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhY2NvdW50c01hcHBlclRvUmVzcG9uc2UgPSAoYWNjb3VudCkgPT4ge1xuICAgICAgICAvLyBDYWxjdWxhdGVzIHRoZSBjbG9zaW5nIGJhbGFuY2UgdG8gdGhlIGdpdmVuIGRhdGUuXG4gICAgICAgIGNvbnN0IGNsb3NpbmdCYWxhbmNlID0gam91cm5hbEVudHJpZXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCwgZmlsdGVyLnRvX2RhdGUpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucGljayhhY2NvdW50LCBbJ2lkJywgJ2luZGV4JywgJ25hbWUnLCAnY29kZScsICdwYXJlbnRBY2NvdW50SWQnXSksXG5cbiAgICAgICAgICAvLyBEYXRlIHBlcmlvZHMgd2hlbiBkaXNwbGF5IGNvbHVtbnMuXG4gICAgICAgICAgLi4uKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ2RhdGVfcGVyaW9kcycpICYmIHRvdGFsUGVyaW9kcyhhY2NvdW50KSxcblxuICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICBhbW91bnQ6IGNsb3NpbmdCYWxhbmNlLFxuICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogYmFsYW5jZUZvcm1hdHRlcihjbG9zaW5nQmFsYW5jZSksXG4gICAgICAgICAgICBkYXRlOiBmaWx0ZXIudG9fZGF0ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgLy8gUmV0cmlldmUgYWxsIGFzc2V0cyBhY2NvdW50cy5cbiAgICAgIGNvbnN0IGFzc2V0c0FjY291bnRzID0gYWNjb3VudHMuZmlsdGVyKChhY2NvdW50KSA9PiAoXG4gICAgICAgIGFjY291bnQudHlwZS5ub3JtYWwgPT09ICdkZWJpdCdcbiAgICAgICAgICAmJiAoYWNjb3VudC50cmFuc2FjdGlvbnMubGVuZ3RoID4gMCB8fCAhZmlsdGVyLm5vbmVfemVybykpKVxuICAgICAgICAgIC5tYXAoYWNjb3VudHNNYXBwZXJUb1Jlc3BvbnNlKTtcblxuICAgICAgLy8gUmV0cmlldmUgYWxsIGxpYWJpbGl0eSBhY2NvdW50cy5cbiAgICAgIGNvbnN0IGxpYWJpbGl0aWVzQWNjb3VudHMgPSBhY2NvdW50cy5maWx0ZXIoKGFjY291bnQpID0+IChcbiAgICAgICAgYWNjb3VudC50eXBlLm5vcm1hbCA9PT0gJ2NyZWRpdCdcbiAgICAgICAgICAmJiAoYWNjb3VudC50cmFuc2FjdGlvbnMubGVuZ3RoID4gMCB8fCAhZmlsdGVyLm5vbmVfemVybykpKVxuICAgICAgICAgIC5tYXAoYWNjb3VudHNNYXBwZXJUb1Jlc3BvbnNlKTtcblxuICAgICAgLy8gUmV0cmlldmUgdGhlIGFzc2V0IGJhbGFuY2Ugc2hlZXQuXG4gICAgICBjb25zdCBhc3NldHNBY2NvdW50c1Jlc3BvbnNlID0gQWNjb3VudC50b05lc3RlZEFycmF5KGFzc2V0c0FjY291bnRzKTtcblxuICAgICAgLy8gUmV0cmlldmUgbGlhYmlsaXRpZXMgYW5kIGVxdWl0eSBiYWxhbmNlIHNoZWV0LlxuICAgICAgY29uc3QgbGlhYmlsaXRpZXNFcXVpdHlSZXNwb25zZSA9IEFjY291bnQudG9OZXN0ZWRBcnJheShsaWFiaWxpdGllc0FjY291bnRzKTtcblxuICAgICAgLy8gUmVzcG9uc2UuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBxdWVyeTogeyAuLi5maWx0ZXIgfSxcbiAgICAgICAgY29sdW1uczogeyAuLi5kYXRlUmFuZ2VTZXQgfSxcbiAgICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQXNzZXRzJyxcbiAgICAgICAgICAgIHR5cGU6ICdhc3NldHMnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFsuLi5hc3NldHNBY2NvdW50c1Jlc3BvbnNlXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdMaWFiaWxpdGllcyAmIEVxdWl0eScsXG4gICAgICAgICAgICB0eXBlOiAnbGlhYmlsaXRpZXNfZXF1aXR5JyxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbLi4ubGlhYmlsaXRpZXNFcXVpdHlSZXNwb25zZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59IiwiXG5cbmV4cG9ydCBjb25zdCBmb3JtYXROdW1iZXJDbG9zdXJlID0gKGZpbHRlcikgPT4gKGJhbGFuY2UpID0+IHtcbiAgbGV0IGZvcm1hdHRlZEJhbGFuY2UgPSBwYXJzZUZsb2F0KGJhbGFuY2UpO1xuXG4gIGlmIChmaWx0ZXIubm9fY2VudHMpIHtcbiAgICBmb3JtYXR0ZWRCYWxhbmNlID0gcGFyc2VJbnQoZm9ybWF0dGVkQmFsYW5jZSwgMTApO1xuICB9XG4gIGlmIChmaWx0ZXIuZGl2aWRlXzEwMDApIHtcbiAgICBmb3JtYXR0ZWRCYWxhbmNlIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdHRlZEJhbGFuY2U7XG59OyIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIG9uZU9mLCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXJDbG9zdXJlIH0gZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRNaXhpbic7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJywgXG4gICAgICB0aGlzLmpvdXJuYWwudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmpvdXJuYWwuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGxlZGdlciByZXBvcnQgb2YgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICBqb3VybmFsOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBvbmVPZihbXG4gICAgICAgIHF1ZXJ5KCd0cmFuc2FjdGlvbl90eXBlcycpLm9wdGlvbmFsKCkuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgICAgcXVlcnkoJ3RyYW5zYWN0aW9uX3R5cGVzLionKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBdLCBbXG4gICAgICAgIHF1ZXJ5KCd0cmFuc2FjdGlvbl90eXBlcycpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgXSksXG4gICAgICBvbmVPZihbXG4gICAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcycpLm9wdGlvbmFsKCkuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgICAgcXVlcnkoJ2FjY291bnRfaWRzLionKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBdLCBbXG4gICAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcycpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIF0pLFxuICAgICAgcXVlcnkoJ2Zyb21fcmFuZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgndG9fcmFuZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5ub19jZW50cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5kaXZpZGVfMTAwMCcpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50VHJhbnNhY3Rpb24gfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIGZyb21fcmFuZ2U6IG51bGwsXG4gICAgICAgIHRvX3JhbmdlOiBudWxsLFxuICAgICAgICBhY2NvdW50X2lkczogW10sXG4gICAgICAgIHRyYW5zYWN0aW9uX3R5cGVzOiBbXSxcbiAgICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICAgIG5vX2NlbnRzOiBmYWxzZSxcbiAgICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLnRyYW5zYWN0aW9uX3R5cGVzKSkge1xuICAgICAgICBmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXMgPSBbZmlsdGVyLnRyYW5zYWN0aW9uX3R5cGVzXTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIuYWNjb3VudF9pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50X2lkcyA9IFtmaWx0ZXIuYWNjb3VudF9pZHNdO1xuICAgICAgfVxuICAgICAgZmlsdGVyLmFjY291bnRfaWRzID0gZmlsdGVyLmFjY291bnRfaWRzLm1hcCgoaWQpID0+IHBhcnNlSW50KGlkLCAxMCkpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0pvdXJuYWxFbnRyaWVzID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKClcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyRGF0ZVJhbmdlJywgZmlsdGVyLmZyb21fZGF0ZSwgZmlsdGVyLnRvX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckFjY291bnRzJywgZmlsdGVyLmFjY291bnRfaWRzKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJUcmFuc2FjdGlvblR5cGVzJywgZmlsdGVyLnRyYW5zYWN0aW9uX3R5cGVzKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJBbW91bnRSYW5nZScsIGZpbHRlci5mcm9tX3JhbmdlLCBmaWx0ZXIudG9fcmFuZ2UpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdhY2NvdW50LnR5cGUnKTtcblxuICAgICAgY29uc3QgZm9ybWF0TnVtYmVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG5cbiAgICAgIGNvbnN0IGpvdXJuYWxHcm91cGVkID0gZ3JvdXBCeShhY2NvdW50c0pvdXJuYWxFbnRyaWVzLFxuICAgICAgICAoZW50cnkpID0+IGAke2VudHJ5LnJlZmVyZW5jZUlkfS0ke2VudHJ5LnJlZmVyZW5jZVR5cGV9YCk7XG5cbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBPYmplY3Qua2V5cyhqb3VybmFsR3JvdXBlZCkubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25zR3JvdXAgPSBqb3VybmFsR3JvdXBlZFtrZXldO1xuXG4gICAgICAgIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcigpO1xuICAgICAgICBqb3VybmFsUG9zdGVyLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9uc0dyb3VwKTtcblxuICAgICAgICBjb25zdCB0cmlhbEJhbGFuY2UgPSBqb3VybmFsUG9zdGVyLmdldFRyaWFsQmFsYW5jZSgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGtleSxcbiAgICAgICAgICBlbnRyaWVzOiB0cmFuc2FjdGlvbnNHcm91cCxcblxuICAgICAgICAgIGNyZWRpdDogdHJpYWxCYWxhbmNlLmNyZWRpdCxcbiAgICAgICAgICBkZWJpdDogdHJpYWxCYWxhbmNlLmRlYml0LFxuXG4gICAgICAgICAgZm9ybWF0dGVkX2NyZWRpdDogZm9ybWF0TnVtYmVyKHRyaWFsQmFsYW5jZS5jcmVkaXQpLFxuICAgICAgICAgIGZvcm1hdHRlZF9kZWJpdDogZm9ybWF0TnVtYmVyKHRyaWFsQmFsYW5jZS5kZWJpdCksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcXVlcnk6IHsgLi4uZmlsdGVyIH0sXG4gICAgICAgIGpvdXJuYWwsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIFxufSIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIG9uZU9mLCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgeyBkYXRlUmFuZ2VDb2xsZWN0aW9uIH0gZnJvbSAnQC91dGlscyc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXJDbG9zdXJlIH0gZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRNaXhpbic7XG5pbXBvcnQgRGVwZW5kZW5jeUdyYXBoIGZyb20gJ0AvbGliL0RlcGVuZGVuY3lHcmFwaCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLmdldCgnLycsIFxuICAgICAgdGhpcy5wcm9maXRMb3NzU2hlZXQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnByb2ZpdExvc3NTaGVldC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBwcm9maXQvbG9zcyBmaW5hbmNpYWwgc3RhdGVtZW50LlxuICAgKi9cbiAgcHJvZml0TG9zc1NoZWV0OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Jhc2lzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdmcm9tX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ3RvX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuZGl2aWRlXzEwMDAnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ2Jhc2lzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdub25lX3plcm8nKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykuaXNBcnJheSgpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX3R5cGUnKS5vcHRpb25hbCgpLmlzSW4oW1xuICAgICAgICAndG90YWwnLCAnZGF0ZV9wZXJpb2RzJyxcbiAgICAgIF0pLFxuICAgICAgcXVlcnkoJ2Rpc3BsYXlfY29sdW1uc19ieScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUsIGNoZWNrRmFsc3k6IHRydWUgfSlcbiAgICAgICAgLmlzSW4oWyd5ZWFyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ3F1YXJ0ZXInXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50LCBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgICAgZGl2aWRlXzEwMDA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBiYXNpczogJ2FjY3VyYWwnLFxuICAgICAgICBub25lX3plcm86IGZhbHNlLFxuICAgICAgICBkaXNwbGF5X2NvbHVtbnNfdHlwZTogJ3RvdGFsJyxcbiAgICAgICAgZGlzcGxheV9jb2x1bW5zX2J5OiAnbW9udGgnLFxuICAgICAgICBhY2NvdW50X2lkczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLmFjY291bnRfaWRzKSkge1xuICAgICAgICBmaWx0ZXIuYWNjb3VudF9pZHMgPSBbZmlsdGVyLmFjY291bnRfaWRzXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY29tZVN0YXRlbWVudFR5cGVzID0gYXdhaXQgQWNjb3VudFR5cGUucXVlcnkoKS53aGVyZSgnaW5jb21lX3NoZWV0JywgdHJ1ZSk7XG5cbiAgICAgIC8vIEZldGNoIGFsbCBpbmNvbWUgYWNjb3VudHMgZnJvbSBzdG9yYWdlLlxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKCdwcm9maXRfbG9zc19hY2NvdW50cycpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckFjY291bnRzJywgZmlsdGVyLmFjY291bnRfaWRzKVxuICAgICAgICAud2hlcmVJbignYWNjb3VudF90eXBlX2lkJywgaW5jb21lU3RhdGVtZW50VHlwZXMubWFwKCh0KSA9PiB0LmlkKSlcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHJhbnNhY3Rpb25zJyk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbHRlciBhbGwgbm9uZSB6ZXJvIGFjY291bnRzIGlmIGl0IHdhcyBlbmFibGVkLlxuICAgICAgY29uc3QgZmlsdGVyZWRBY2NvdW50cyA9IGFjY291bnRzLmZpbHRlcigoYWNjb3VudCkgPT4gKFxuICAgICAgICBhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvXG4gICAgICApKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzQ29sbGVjdGVkID0gQWNjb3VudC5jb2xsZWN0Sm91cm5hbEVudHJpZXMoYWNjb3VudHMpO1xuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXMgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0dyYXBoKTtcbiAgICAgIGpvdXJuYWxFbnRyaWVzLmxvYWRFbnRyaWVzKGpvdXJuYWxFbnRyaWVzQ29sbGVjdGVkKTtcblxuICAgICAgLy8gQWNjb3VudCBiYWxhbmNlIGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgICAgY29uc3QgbnVtYmVyRm9ybWF0dGVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG4gICAgICBjb25zdCBjb21wYXJhdG9yRGF0ZVR5cGUgPSBmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCdcbiAgICAgICAgPyAnZGF5JyA6IGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfYnk7XG5cbiAgICAgIC8vIEdldHMgdGhlIGRhdGUgcmFuZ2Ugc2V0IGZyb20gc3RhcnQgdG8gZW5kIGRhdGUuXG4gICAgICBjb25zdCBkYXRlUmFuZ2VTZXQgPSBkYXRlUmFuZ2VDb2xsZWN0aW9uKFxuICAgICAgICBmaWx0ZXIuZnJvbV9kYXRlLFxuICAgICAgICBmaWx0ZXIudG9fZGF0ZSxcbiAgICAgICAgY29tcGFyYXRvckRhdGVUeXBlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNNYXBwZXIgPSAoaW5jb21lRXhwZW5zZUFjY291bnRzKSA9PiAoXG4gICAgICAgIGluY29tZUV4cGVuc2VBY2NvdW50cy5tYXAoKGFjY291bnQpID0+ICh7XG4gICAgICAgICAgLi4ucGljayhhY2NvdW50LCBbJ2lkJywgJ2luZGV4JywgJ25hbWUnLCAnY29kZScsICdwYXJlbnRBY2NvdW50SWQnXSksXG5cbiAgICAgICAgICAvLyBUb3RhbCBjbG9zaW5nIGJhbGFuY2Ugb2YgdGhlIGFjY291bnQuXG4gICAgICAgICAgLi4uKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ3RvdGFsJykgJiYge1xuICAgICAgICAgICAgdG90YWw6ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IGpvdXJuYWxFbnRyaWVzLmdldEFjY291bnRCYWxhbmNlKGFjY291bnQuaWQsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgYW1vdW50LCBkYXRlOiBmaWx0ZXIudG9fZGF0ZSwgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKGFtb3VudCkgfTtcbiAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBEYXRlIHBlcmlvZHMgd2hlbiBkaXNwbGF5IGNvbHVtbnMgdHlwZSBgcGVyaW9kc2AuXG4gICAgICAgICAgLi4uKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ2RhdGVfcGVyaW9kcycpICYmIHtcbiAgICAgICAgICAgIHBlcmlvZHM6IGRhdGVSYW5nZVNldC5tYXAoKGRhdGUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGNvbXBhcmF0b3JEYXRlVHlwZTtcbiAgICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gam91cm5hbEVudHJpZXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCwgZGF0ZSwgdHlwZSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0ZSwgYW1vdW50LCBmb3JtYXR0ZWRfYW1vdW50OiBudW1iZXJGb3JtYXR0ZXIoYW1vdW50KSB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpKTtcblxuICAgICAgY29uc3QgdG90YWxBY2NvdW50c1JlZHVjZXIgPSAoaW5jb21lRXhwZW5zZUFjY291bnRzKSA9PiAoXG4gICAgICAgIGluY29tZUV4cGVuc2VBY2NvdW50cy5yZWR1Y2UoKGFjYywgYWNjb3VudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IChhY2NvdW50KSA/IGFjY291bnQudG90YWwuYW1vdW50IDogMDtcbiAgICAgICAgICByZXR1cm4gYW1vdW50ICsgYWNjO1xuICAgICAgICB9LCAwKSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzSW5jb21lID0gQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzTWFwcGVyKGZpbHRlcmVkQWNjb3VudHNcbiAgICAgICAgLmZpbHRlcigoYWNjb3VudCkgPT4gYWNjb3VudC50eXBlLm5vcm1hbCA9PT0gJ2NyZWRpdCcpKSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRXhwZW5zZXMgPSBBY2NvdW50LnRvTmVzdGVkQXJyYXkoYWNjb3VudHNNYXBwZXIoZmlsdGVyZWRBY2NvdW50c1xuICAgICAgICAuZmlsdGVyKChhY2NvdW50KSA9PiBhY2NvdW50LnR5cGUubm9ybWFsID09PSAnZGViaXQnKSkpO1xuXG4gICAgICAvLyBAcmV0dXJuIHtBcnJheX1cbiAgICAgIGNvbnN0IHRvdGFsUGVyaW9kc01hcHBlciA9IChpbmNvbWVFeHBlbnNlQWNjb3VudHMpID0+IChcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhkYXRlUmFuZ2VTZXQucmVkdWNlKChhY2MsIGRhdGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgbGV0IGFtb3VudCA9IDA7XG5cbiAgICAgICAgICBpbmNvbWVFeHBlbnNlQWNjb3VudHMuZm9yRWFjaCgoYWNjb3VudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBhY2NvdW50LnBlcmlvZHNbaW5kZXhdO1xuICAgICAgICAgICAgYW1vdW50ICs9IGN1cnJlbnREYXRlLmFtb3VudCB8fCAwO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFjY1tkYXRlXSA9IHsgZGF0ZSwgYW1vdW50LCBmb3JtYXR0ZWRfYW1vdW50OiBudW1iZXJGb3JtYXR0ZXIoYW1vdW50KSB9O1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KSkpO1xuXG4gICAgICAvLyBUb3RhbCBpbmNvbWUoZGF0ZSkgLSBUb3RhbCBleHBlbnNlcyhkYXRlKSA9IE5ldCBpbmNvbWUoZGF0ZSlcbiAgICAgIC8vIEByZXR1cm4ge0FycmF5fVxuICAgICAgY29uc3QgbmV0SW5jb21lUGVyaW9kc01hcHBlciA9ICh0b3RhbEluY29tZUFjb2N1bnRzLCB0b3RhbEV4cGVuc2VBY2NvdW50cykgPT4gKFxuICAgICAgICBkYXRlUmFuZ2VTZXQubWFwKChkYXRlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRvdGFsSW5jb21lID0gdG90YWxJbmNvbWVBY29jdW50c1tpbmRleF07XG4gICAgICAgICAgY29uc3QgdG90YWxFeHBlbnNlcyA9IHRvdGFsRXhwZW5zZUFjY291bnRzW2luZGV4XTtcblxuICAgICAgICAgIGxldCBhbW91bnQgPSB0b3RhbEluY29tZS5hbW91bnQgfHwgMDtcbiAgICAgICAgICBhbW91bnQgLT0gdG90YWxFeHBlbnNlcy5hbW91bnQgfHwgMDtcbiAgICAgICAgICByZXR1cm4geyBkYXRlLCBhbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcihhbW91bnQpIH07XG4gICAgICAgIH0pKTtcblxuICAgICAgLy8gQHJldHVybiB7T2JqZWN0fVxuICAgICAgY29uc3QgbmV0SW5jb21lVG90YWwgPSAodG90YWxJbmNvbWUsIHRvdGFsRXhwZW5zZXMpID0+IHtcbiAgICAgICAgY29uc3QgbmV0SW5jb21lQW1vdW50ID0gdG90YWxJbmNvbWUuYW1vdW50IC0gdG90YWxFeHBlbnNlcy5hbW91bnQ7XG4gICAgICAgIHJldHVybiB7IGFtb3VudDogbmV0SW5jb21lQW1vdW50LCBmb3JtYXR0ZWRfYW1vdW50OiBuZXRJbmNvbWVBbW91bnQsIGRhdGU6IGZpbHRlci50b19kYXRlIH07XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbmNvbWVSZXNwb25zZSA9IHtcbiAgICAgICAgZW50cnlfbm9ybWFsOiAnY3JlZGl0JyxcbiAgICAgICAgYWNjb3VudHM6IGFjY291bnRzSW5jb21lLFxuICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnKSAmJiAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRvdGFsSW5jb21lQWNjb3VudHMgPSB0b3RhbEFjY291bnRzUmVkdWNlcihhY2NvdW50c0luY29tZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogdG90YWxJbmNvbWVBY2NvdW50cyxcbiAgICAgICAgICAgICAgZGF0ZTogZmlsdGVyLnRvX2RhdGUsXG4gICAgICAgICAgICAgIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcih0b3RhbEluY29tZUFjY291bnRzKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKSxcbiAgICAgICAgLi4uKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ2RhdGVfcGVyaW9kcycpICYmIHtcbiAgICAgICAgICB0b3RhbF9wZXJpb2RzOiBbXG4gICAgICAgICAgICAuLi50b3RhbFBlcmlvZHNNYXBwZXIoYWNjb3VudHNJbmNvbWUpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhwZW5zZVJlc3BvbnNlID0ge1xuICAgICAgICBlbnRyeV9ub3JtYWw6ICdkZWJpdCcsXG4gICAgICAgIGFjY291bnRzOiBhY2NvdW50c0V4cGVuc2VzLFxuICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnKSAmJiAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRvdGFsRXhwZW5zZXNBY2NvdW50cyA9IHRvdGFsQWNjb3VudHNSZWR1Y2VyKGFjY291bnRzRXhwZW5zZXMpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3RhbDoge1xuICAgICAgICAgICAgICBhbW91bnQ6IHRvdGFsRXhwZW5zZXNBY2NvdW50cyxcbiAgICAgICAgICAgICAgZGF0ZTogZmlsdGVyLnRvX2RhdGUsXG4gICAgICAgICAgICAgIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcih0b3RhbEV4cGVuc2VzQWNjb3VudHMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYge1xuICAgICAgICAgIHRvdGFsX3BlcmlvZHM6IFtcbiAgICAgICAgICAgIC4uLnRvdGFsUGVyaW9kc01hcHBlcihhY2NvdW50c0V4cGVuc2VzKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG5ldEluY29tZVJlc3BvbnNlID0ge1xuICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnKSAmJiB7XG4gICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgIC4uLm5ldEluY29tZVRvdGFsKGluY29tZVJlc3BvbnNlLnRvdGFsLCBleHBlbnNlUmVzcG9uc2UudG90YWwpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICdkYXRlX3BlcmlvZHMnKSAmJiB7XG4gICAgICAgICAgdG90YWxfcGVyaW9kczogW1xuICAgICAgICAgICAgLi4ubmV0SW5jb21lUGVyaW9kc01hcHBlcihcbiAgICAgICAgICAgICAgaW5jb21lUmVzcG9uc2UudG90YWxfcGVyaW9kcyxcbiAgICAgICAgICAgICAgZXhwZW5zZVJlc3BvbnNlLnRvdGFsX3BlcmlvZHMsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcXVlcnk6IHsgLi4uZmlsdGVyIH0sXG4gICAgICAgIGNvbHVtbnM6IFsuLi5kYXRlUmFuZ2VTZXRdLFxuICAgICAgICBwcm9maXRMb3NzOiB7XG4gICAgICAgICAgaW5jb21lOiBpbmNvbWVSZXNwb25zZSxcbiAgICAgICAgICBleHBlbnNlczogZXhwZW5zZVJlc3BvbnNlLFxuICAgICAgICAgIG5ldF9pbmNvbWU6IG5ldEluY29tZVJlc3BvbnNlLFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufSIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgRGVwZW5kZW5jeUdyYXBoIGZyb20gJ0AvbGliL0RlcGVuZGVuY3lHcmFwaCc7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXJDbG9zdXJlIH1mcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMudHJpYWxCYWxhbmNlU2hlZXQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnRyaWFsQmFsYW5jZVNoZWV0LmhhbmRsZXIpKTtcbiAgICBcbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgdHJpYWwgYmFsYW5jZSBzaGVldC5cbiAgICovXG4gIHRyaWFsQmFsYW5jZVNoZWV0OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Jhc2lzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdmcm9tX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ3RvX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuMTAwMF9kaXZpZGUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykuaXNBcnJheSgpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICAgIG5vX2NlbnRzOiBmYWxzZSxcbiAgICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2lzOiAnYWNjdXJhbCcsXG4gICAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIuYWNjb3VudF9pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50X2lkcyA9IFtmaWx0ZXIuYWNjb3VudF9pZHNdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoJ3RyaWFsX2JhbGFuY2VfYWNjb3VudHMnKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJBY2NvdW50cycsIGZpbHRlci5hY2NvdW50X2lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHJhbnNhY3Rpb25zJylcbiAgICAgICAgLm1vZGlmeUdyYXBoKCd0cmFuc2FjdGlvbnMnLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdzdW1hdGlvbkNyZWRpdERlYml0Jyk7XG4gICAgICAgICAgYnVpbGRlci5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzQ29sbGVjdCA9IEFjY291bnQuY29sbGVjdEpvdXJuYWxFbnRyaWVzKGFjY291bnRzKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNHcmFwaCk7XG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhqb3VybmFsRW50cmllc0NvbGxlY3QpO1xuXG4gICAgICAvLyBBY2NvdW50IGJhbGFuY2UgZm9ybW1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBiYWxhbmNlRm9ybWF0dGVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzUmVzcG9uc2UgPSBhY2NvdW50c1xuICAgICAgICAuZmlsdGVyKChhY2NvdW50KSA9PiAoXG4gICAgICAgICAgYWNjb3VudC50cmFuc2FjdGlvbnMubGVuZ3RoID4gMCB8fCAhZmlsdGVyLm5vbmVfemVyb1xuICAgICAgICApKVxuICAgICAgICAubWFwKChhY2NvdW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJpYWwgPSBqb3VybmFsRW50cmllcy5nZXRUcmlhbEJhbGFuY2VXaXRoRGVwYW5kcyhhY2NvdW50LmlkKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogYWNjb3VudC5pZCxcbiAgICAgICAgICAgIHBhcmVudEFjY291bnRJZDogYWNjb3VudC5wYXJlbnRBY2NvdW50SWQsXG4gICAgICAgICAgICBuYW1lOiBhY2NvdW50Lm5hbWUsXG4gICAgICAgICAgICBjb2RlOiBhY2NvdW50LmNvZGUsXG4gICAgICAgICAgICBhY2NvdW50Tm9ybWFsOiBhY2NvdW50LnR5cGUubm9ybWFsLFxuXG4gICAgICAgICAgICBjcmVkaXQ6IHRyaWFsLmNyZWRpdCxcbiAgICAgICAgICAgIGRlYml0OiB0cmlhbC5kZWJpdCxcbiAgICAgICAgICAgIGJhbGFuY2U6IHRyaWFsLmJhbGFuY2UsXG5cbiAgICAgICAgICAgIGZvcm1hdHRlZF9jcmVkaXQ6IGJhbGFuY2VGb3JtYXR0ZXIodHJpYWwuY3JlZGl0KSxcbiAgICAgICAgICAgIGZvcm1hdHRlZF9kZWJpdDogYmFsYW5jZUZvcm1hdHRlcih0cmlhbC5kZWJpdCksXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYmFsYW5jZTogYmFsYW5jZUZvcm1hdHRlcih0cmlhbC5iYWxhbmNlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcXVlcnk6IHsgLi4uZmlsdGVyIH0sXG4gICAgICAgIGFjY291bnRzOiBbLi4uQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzUmVzcG9uc2UpIF0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufSIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrLCBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJywgXG4gICAgICB0aGlzLmdlbmVyYWxMZWRnZXIudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdlbmVyYWxMZWRnZXIuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGdlbmVyYWwgbGVkZ2VyIGZpbmFuY2lhbCBzdGF0ZW1lbnQuXG4gICAqL1xuICBnZW5lcmFsTGVkZ2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuZGl2aWRlXzEwMDAnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnYWNjb3VudHNfaWRzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50c19pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnb3JkZXJCeScpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnLCAnbmFtZScsICdjb2RlJ10pLFxuICAgICAgcXVlcnkoJ29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIGJhc2lzOiAnY2FzaCcsXG4gICAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgICAgZGl2aWRlXzEwMDA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBub25lX3plcm86IGZhbHNlLFxuICAgICAgICBhY2NvdW50c19pZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hY2NvdW50c19pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50c19pZHMgPSBbZmlsdGVyLmFjY291bnRzX2lkc107XG4gICAgICB9XG4gICAgICBmaWx0ZXIuYWNjb3VudHNfaWRzID0gZmlsdGVyLmFjY291bnRzX2lkcy5tYXAoKGlkKSA9PiBwYXJzZUludChpZCwgMTApKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmIChmaWx0ZXIuYWNjb3VudHNfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuYWNjb3VudHNfaWRzKTtcbiAgICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGEpID0+IGEuaWQpO1xuXG4gICAgICAgIGlmIChkaWZmZXJlbmNlKGZpbHRlci5hY2NvdW50c19pZHMsIGFjY291bnRzSWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnRklMVEVSLkFDQ09VTlRTLklEUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcjogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKCdnZW5lcmFsX2xlZGdlcl9hY2NvdW50cycpXG4gICAgICAgIC5vcmRlckJ5KCdpbmRleCcsICdERVNDJylcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudHNfaWRzKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHlwZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0cmFuc2FjdGlvbnMnKVxuICAgICAgICAubW9kaWZ5R3JhcGgoJ3RyYW5zYWN0aW9ucycsIChidWlsZGVyKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG4gXG4gICAgICBjb25zdCBvcGVuaW5nQmFsYW5jZVRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC8vIC5yZW1lbWJlcigpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIG51bGwsIGZpbHRlci5mcm9tX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ3N1bWF0aW9uQ3JlZGl0RGViaXQnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGNsb3NpbmdCYWxhbmNlVHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKClcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyRGF0ZVJhbmdlJywgbnVsbCwgZmlsdGVyLnRvX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ3N1bWF0aW9uQ3JlZGl0RGViaXQnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IG9wZWluZ0JhbGFuY2VDb2xsZWN0aW9uID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNHcmFwaCk7XG4gICAgICBjb25zdCBjbG9zaW5nQmFsYW5jZUNvbGxlY3Rpb24gPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0dyYXBoKTtcblxuICAgICAgb3BlaW5nQmFsYW5jZUNvbGxlY3Rpb24ubG9hZEVudHJpZXMob3BlbmluZ0JhbGFuY2VUcmFuc2FjdGlvbnMpO1xuICAgICAgY2xvc2luZ0JhbGFuY2VDb2xsZWN0aW9uLmxvYWRFbnRyaWVzKGNsb3NpbmdCYWxhbmNlVHJhbnNhY3Rpb25zKTtcblxuICAgICAgLy8gVHJhbnNhY3Rpb24gYW1vdW50IGZvcm1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBmb3JtYXROdW1iZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgICAgY29uc3QgYWNjb3VudHNSZXNwb25zZSA9IGFjY291bnRzXG4gICAgICAgIC5maWx0ZXIoKGFjY291bnQpID0+IChcbiAgICAgICAgICBhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvXG4gICAgICAgICkpXG4gICAgICAgIC5tYXAoKGFjY291bnQpID0+ICh7XG4gICAgICAgICAgLi4ucGljayhhY2NvdW50LCBbJ2lkJywgJ25hbWUnLCAnY29kZScsICdpbmRleCcsICdwYXJlbnRBY2NvdW50SWQnXSksXG4gICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAuLi5hY2NvdW50LnRyYW5zYWN0aW9ucy5tYXAoKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBhbW91bnQgPSAwO1xuXG4gICAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgICAgICAgIGFtb3VudCArPSB0cmFuc2FjdGlvbi5jcmVkaXQgLSB0cmFuc2FjdGlvbi5kZWJpdDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NvdW50LnR5cGUubm9ybWFsID09PSAnZGViaXQnKSB7XG4gICAgICAgICAgICAgICAgYW1vdW50ICs9IHRyYW5zYWN0aW9uLmRlYml0IC0gdHJhbnNhY3Rpb24uY3JlZGl0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGljayh0cmFuc2FjdGlvbiwgWydpZCcsICdub3RlJywgJ3RyYW5zYWN0aW9uVHlwZScsICdyZWZlcmVuY2VUeXBlJyxcbiAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VJZCcsICdkYXRlJywgJ2NyZWF0ZWRBdCddKSxcbiAgICAgICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogZm9ybWF0TnVtYmVyKGFtb3VudCksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG9wZW5pbmc6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcGVuaW5nQW1vdW50ID0gb3BlaW5nQmFsYW5jZUNvbGxlY3Rpb24uZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGU6IGZpbHRlci5mcm9tX2RhdGUsXG4gICAgICAgICAgICAgIGFtb3VudDogb3BlbmluZ0Ftb3VudCxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogZm9ybWF0TnVtYmVyKG9wZW5pbmdBbW91bnQpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgY2xvc2luZzogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdBbW91bnQgPSBjbG9zaW5nQmFsYW5jZUNvbGxlY3Rpb24uZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGU6IGZpbHRlci50b19kYXRlLFxuICAgICAgICAgICAgICBhbW91bnQ6IGNsb3NpbmdBbW91bnQsXG4gICAgICAgICAgICAgIGZvcm1hdHRlZF9hbW91bnQ6IGZvcm1hdE51bWJlcihjbG9zaW5nQW1vdW50KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHF1ZXJ5OiB7IC4uLmZpbHRlciB9LFxuICAgICAgICBhY2NvdW50czogQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzUmVzcG9uc2UpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB1bmlxaWQgZnJvbSAndW5pcWlkJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBib2R5LFxuICBwYXJhbSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBtYWlsIGZyb20gJ0Avc2VydmljZXMvbWFpbCc7XG5pbXBvcnQgeyBoYXNoUGFzc3dvcmQgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBTeXN0ZW1Vc2VyIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Vc2VyJztcbmltcG9ydCBJbnZpdGUgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL0ludml0ZSc7XG5pbXBvcnQgVGVuYW50VXNlciBmcm9tICdAL21vZGVscy9UZW5hbnRVc2VyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBUZW5hbnQgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1RlbmFudCc7XG5pbXBvcnQgVGVuYW50c01hbmFnZXIgZnJvbSAnQC9zeXN0ZW0vVGVuYW50c01hbmFnZXInO1xuaW1wb3J0IGp3dEF1dGggZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvand0QXV0aCc7XG5pbXBvcnQgVGVuYW5jeU1pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuaW1wb3J0IE9wdGlvbiBmcm9tICdAL21vZGVscy9PcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci51c2UoJy9zZW5kJywgand0QXV0aCk7XG4gICAgcm91dGVyLnVzZSgnL3NlbmQnLCBUZW5hbmN5TWlkZGxld2FyZSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3NlbmQnLFxuICAgICAgdGhpcy5pbnZpdGUudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmludml0ZS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL2FjY2VwdC86dG9rZW4nLFxuICAgICAgdGhpcy5hY2NlcHQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmFjY2VwdC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvaW52aXRlZC86dG9rZW4nLFxuICAgICAgdGhpcy5pbnZpdGVkLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbnZpdGVkLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludml0ZSBhIHVzZXIgdG8gdGhlIGF1dGhvcml6ZWQgdXNlciBvcmdhbml6YXRpb24uXG4gICAqL1xuICBpbnZpdGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBib2R5KCdlbWFpbCcpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCB7IFRlbmFudFVzZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3VuZFVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIGZvcm0uZW1haWwpLmZpcnN0KCk7ICAgICAgXG5cbiAgICAgIGlmIChmb3VuZFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSLkVNQUlMLkFMUkVBRFkuUkVHSVNURVJFRCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0b2tlbiA9IHVuaXFpZCgpO1xuICAgICAgY29uc3QgaW52aXRlID0gYXdhaXQgSW52aXRlLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgZW1haWw6IGZvcm0uZW1haWwsXG4gICAgICAgIHRlbmFudF9pZDogdXNlci50ZW5hbnRJZCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgZmlyc3RfbmFtZTogZm9ybS5lbWFpbCxcbiAgICAgICAgZW1haWw6IGZvcm0uZW1haWwsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgT3B0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3Qgb3JnYW5pemF0aW9uT3B0aW9ucyA9IGF3YWl0IE9wdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgna2V5JywgJ29yZ2FuaXphdGlvbl9uYW1lJyk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvVXNlckludml0ZS5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgY29uc3QgcmVuZGVyZWQgPSBNdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsIHtcbiAgICAgICAgYWNjZXB0VXJsOiBgJHtyZXEucHJvdG9jb2x9Oi8vJHtyZXEuaG9zdG5hbWV9L2ludml0ZS9hY2NlcHQvJHtpbnZpdGUudG9rZW59YCxcbiAgICAgICAgZnVsbE5hbWU6IGAke3VzZXIuZmlyc3ROYW1lfSAke3VzZXIubGFzdE5hbWV9YCxcbiAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IHVzZXIubGFzdE5hbWUsXG4gICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICBvcmdhbml6YXRpb25OYW1lOiBvcmdhbml6YXRpb25PcHRpb25zLmdldE1ldGEoJ29yZ2FuaXphdGlvbl9uYW1lJyksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1haWxPcHRpb25zID0ge1xuICAgICAgICB0bzogdXNlci5lbWFpbCxcbiAgICAgICAgZnJvbTogYCR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX05BTUV9ICR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX0FERFJFU1N9YCxcbiAgICAgICAgc3ViamVjdDogYCR7dXNlci5mdWxsTmFtZX0gaGFzIGludml0ZWQgeW91IHRvIGpvaW4gYSBCaWdjYXBpdGFsYCxcbiAgICAgICAgaHRtbDogcmVuZGVyZWQsXG4gICAgICB9O1xuICAgICAgbWFpbC5zZW5kTWFpbChtYWlsT3B0aW9ucywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCBzZW5kIHVzZXIgaW52aXRlIG1haWwnLCB7IGVycm9yLCBmb3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnVXNlciBoYXMgYmVlbiBzZW50IGludml0ZSB1c2VyIGVtYWlsIHN1Y2Nlc3NmdWx5LicsIHsgZm9ybSB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBY2NlcHJ0IHRoZSBpbnZpYXRpb24uXG4gICAqL1xuICBhY2NlcHQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnZmlyc3RfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdsYXN0X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGhvbmVfbnVtYmVyJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgcGFyYW0oJ3Rva2VuJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0b2tlbiB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGludml0ZVRva2VuID0gYXdhaXQgSW52aXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCd0b2tlbicsIHRva2VuKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIWludml0ZVRva2VuKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSU5WSVRFLlRPS0VOLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3lzdGVtVXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Bob25lX251bWJlcicsIGZvcm0ucGhvbmVfbnVtYmVyKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZXJlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBwaG9uZSBudW1iZXIuXG4gICAgICBpZiAoc3lzdGVtVXNlciAmJiBzeXN0ZW1Vc2VyLnBob25lTnVtYmVyID09PSBmb3JtLnBob25lX251bWJlcikge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ1BIT05FX01VTU5FUi5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDQwMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBGaW5kIHRoZSB0ZW5hbnQgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiB0b2tlbi5cbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IFRlbmFudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpbnZpdGVUb2tlbi50ZW5hbnRJZCkuZmlyc3QoKTtcblxuICAgICAgY29uc3QgdGVuYW50RGIgPSBUZW5hbnRzTWFuYWdlci5rbmV4SW5zdGFuY2UodGVuYW50Lm9yZ2FuaXphdGlvbklkKTtcbiAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgaGFzaFBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpO1xuXG4gICAgICBjb25zdCB1c2VyRm9ybSA9IHtcbiAgICAgICAgZmlyc3RfbmFtZTogZm9ybS5maXJzdF9uYW1lLFxuICAgICAgICBsYXN0X25hbWU6IGZvcm0ubGFzdF9uYW1lLFxuICAgICAgICBlbWFpbDogaW52aXRlVG9rZW4uZW1haWwsXG4gICAgICAgIHBob25lX251bWJlcjogZm9ybS5waG9uZV9udW1iZXIsXG4gICAgICAgIGxhbmd1YWdlOiBmb3JtLmxhbmd1YWdlLFxuICAgICAgICBhY3RpdmU6IDEsXG4gICAgICB9O1xuICAgICAgVGVuYW50TW9kZWwua25leEJpbmRlZCA9IHRlbmFudERiO1xuXG4gICAgICBjb25zdCBmb3VuZFRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcikuZmlyc3QoKTtcblxuICAgICAgaWYgKGZvdW5kVGVuYW50VXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1BIT05FX05VTUJFUi5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDQwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydFVzZXJPcGVyID0gVGVuYW50VXNlci5iaW5kS25leCh0ZW5hbnREYilcbiAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIHVzZXJGb3JtLmVtYWlsKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIC4uLnVzZXJGb3JtLFxuICAgICAgICAgIGludml0ZV9hY2NlcHRlZF9hdDogbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REJyksXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnNlcnRTeXNVc2VyT3BlciA9IFN5c3RlbVVzZXIucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi51c2VyRm9ybSxcbiAgICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxuICAgICAgICB0ZW5hbnRfaWQ6IGludml0ZVRva2VuLnRlbmFudElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZUludml0ZVRva2VuT3BlciA9IEludml0ZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgndG9rZW4nLCBpbnZpdGVUb2tlbi50b2tlbikuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW5zZXJ0VXNlck9wZXIsXG4gICAgICAgIGluc2VydFN5c1VzZXJPcGVyLFxuICAgICAgICBkZWxldGVJbnZpdGVUb2tlbk9wZXIsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBcbiAgICovXG4gIGludml0ZWQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndG9rZW4nKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHRva2VuIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgaW52aXRlVG9rZW4gPSBhd2FpdCBJbnZpdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Rva2VuJywgdG9rZW4pLmZpcnN0KCk7XG5cbiAgICAgIGlmICghaW52aXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZJVEUuVE9LRU4uTk9ULkZPVU5EJywgY29kZTogMzAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgdGhlIHRlbmFudCB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHRva2VuLlxuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgVGVuYW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGludml0ZVRva2VuLnRlbmFudElkKS5maXJzdCgpO1xuXG4gICAgICBjb25zdCB0ZW5hbnREYiA9IFRlbmFudHNNYW5hZ2VyLmtuZXhJbnN0YW5jZSh0ZW5hbnQub3JnYW5pemF0aW9uSWQpO1xuICAgICAgY29uc3Qgb3JnYW5pemF0aW9uT3B0aW9ucyA9IGF3YWl0IE9wdGlvbi5iaW5kS25leCh0ZW5hbnREYikucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2tleScsICdvcmdhbml6YXRpb25fbmFtZScpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uX25hbWU6IG9yZ2FuaXphdGlvbk9wdGlvbnMuZ2V0TWV0YSgnb3JnYW5pemF0aW9uX25hbWUnLCAnJykgICAgICAgICAgLFxuICAgICAgICAgIGludml0ZWRfZW1haWw6IGludml0ZVRva2VuLmVtYWlsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBwYXJhbSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICcuLi9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBEeW5hbWljRmlsdGVyLFxuICBEeW5hbWljRmlsdGVyU29ydEJ5LFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuaW1wb3J0IHtcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgICAvLyBjb25zdCBwZXJtaXQgPSBBdXRob3JpemF0aW9uKCdpdGVtc19jYXRlZ29yaWVzJyk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZCcsXG4gICAgICB0aGlzLmVkaXRDYXRlZ29yeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdENhdGVnb3J5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3Q2F0ZWdvcnkudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0NhdGVnb3J5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9idWxrJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUNhdGVnb3JpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJ1bGtEZWxldGVDYXRlZ29yaWVzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVJdGVtLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVJdGVtLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRDYXRlZ29yeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0Q2F0ZWdvcnkuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldExpc3QudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldExpc3QuaGFuZGxlcikpO1xuXG4gICAgXG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGl0ZW0gY2F0ZWdvcnkuXG4gICAqL1xuICBuZXdDYXRlZ29yeToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCduYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3BhcmVudF9jYXRlZ29yeV9pZCcpXG4gICAgICAgIC5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlLCBjaGVja0ZhbHN5OiB0cnVlIH0pXG4gICAgICAgIC5pc051bWVyaWMoKVxuICAgICAgICAudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBpZiAoZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgY29uc3QgZm91bmRQYXJlbnRDYXRlZ29yeSA9IGF3YWl0IEl0ZW1DYXRlZ29yeS5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlKCdpZCcsIGZvcm0ucGFyZW50X2NhdGVnb3J5X2lkKVxuICAgICAgICAgIC5maXJzdCgpO1xuXG4gICAgICAgIGlmICghZm91bmRQYXJlbnRDYXRlZ29yeSkge1xuICAgICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZCgnVGhlIHBhcmVudCBjYXRlZ29yeSBJRCBpcyBub3QgZm91bmQuJywge1xuICAgICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUEFSRU5UX0NBVEVHT1JZX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi5mb3JtLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjYXRlZ29yeSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5IGl0ZW0uXG4gICAqL1xuICBlZGl0Q2F0ZWdvcnk6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS50b0ludCgpLFxuICAgICAgY2hlY2soJ25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGFyZW50X2NhdGVnb3J5X2lkJylcbiAgICAgICAgLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUsIGNoZWNrRmFsc3k6IHRydWUgfSlcbiAgICAgICAgLmlzTnVtZXJpYygpXG4gICAgICAgIC50b0ludCgpLFxuICAgICAgY2hlY2soJ2Rlc2NyaXB0aW9uJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLFxuICAgICAgICAgIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBJdGVtQ2F0ZWdvcnkgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpdGVtQ2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIWl0ZW1DYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU1fQ0FURUdPUlkuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWRcbiAgICAgICAgJiYgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQgIT09IGl0ZW1DYXRlZ29yeS5wYXJlbnRfY2F0ZWdvcnlfaWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmb3VuZFBhcmVudENhdGVnb3J5ID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KClcbiAgICAgICAgICAud2hlcmUoJ2lkJywgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQpXG4gICAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgICAgaWYgKCFmb3VuZFBhcmVudENhdGVnb3J5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCdUaGUgcGFyZW50IGNhdGVnb3J5IElEIGlzIG5vdCBmb3VuZC4nLCB7XG4gICAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdQQVJFTlRfQ0FURUdPUllfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVJdGVtQ2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC51cGRhdGUoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmUgaXRlbSBjYXRlZ29yeS5cbiAgICovXG4gIGRlbGV0ZUl0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5ID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCFpdGVtQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaXRlbUNhdGVnb3J5LmlkKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKi9cbiAgZ2V0TGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIEl0ZW1DYXRlZ29yeSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXNSZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCduYW1lJywgJ2l0ZW1zX2NhdGVnb3JpZXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghY2F0ZWdvcmllc1Jlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTVMuQ0FURUdPUklFUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGNvbHVtbl9zb3J0X29yZGVyOiAnJyxcbiAgICAgICAgc29ydF9vcmRlcjogJycsXG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcykge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyX3JvbGVzID0gSlNPTi5wYXJzZShmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gY2F0ZWdvcmllc1Jlc291cmNlLmZpZWxkcy5tYXAoKGMpID0+IGMua2V5KTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlcihJdGVtQ2F0ZWdvcnkudGFibGVOYW1lKTtcblxuICAgICAgLy8gRHluYW1pYyBmaWx0ZXIgd2l0aCBmaWx0ZXIgcm9sZXMuXG4gICAgICBpZiAoZmlsdGVyLmZpbHRlcl9yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhY2NvdW50cyByZXNvdXJjZSBmaWVsZHMuXG4gICAgICAgIGNvbnN0IGZpbHRlclJvbGVzID0gbmV3IER5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcyhcbiAgICAgICAgICBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcihmaWx0ZXIuZmlsdGVyX3JvbGVzKSxcbiAgICAgICAgICBjYXRlZ29yaWVzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBjYXRlZ29yaWVzUmVzb3VyY2Uuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJVEVNUy5SRVNPVVJDRS5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggY29sdW1uIHNvcnQgb3JkZXIuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIsXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuXG4gICAgICAgIGJ1aWxkZXIuc2VsZWN0KFtcbiAgICAgICAgICAnKicsXG4gICAgICAgICAgSXRlbUNhdGVnb3J5LnJlbGF0ZWRRdWVyeSgnaXRlbXMnKS5jb3VudCgpLmFzKCdjb3VudCcpLFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjYXRlZ29yaWVzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRldGFpbHMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5LlxuICAgKi9cbiAgZ2V0Q2F0ZWdvcnk6IHtcbiAgICB2YWxpZGF0aW9uOiBbcGFyYW0oJ2NhdGVnb3J5X2lkJykudG9JbnQoKV0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBjYXRlZ29yeV9pZDogY2F0ZWdvcnlJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IEl0ZW1DYXRlZ29yeS53aGVyZSgnaWQnLCBjYXRlZ29yeUlkKS5mZXRjaCgpO1xuXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgY2F0ZWdvcnk6IGl0ZW0udG9KU09OKCkgfSk7XG4gICAgfSxcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBCdWxrIGRlbGV0ZSB0aGUgZ2l2ZW4gaXRlbSBjYXRlZ29yaWVzLlxuICAgKi9cbiAgYnVsa0RlbGV0ZUNhdGVnb3JpZXM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuaXNBcnJheSh7IG1pbjogMiB9KSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBpZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBJdGVtQ2F0ZWdvcnkgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBcbiAgICAgIGNvbnN0IGl0ZW1DYXRlZ29yaWVzID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKTtcbiAgICAgIGNvbnN0IGl0ZW1DYXRlZ29yaWVzSWRzID0gaXRlbUNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRDYXRlZ29yaWVzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBpdGVtQ2F0ZWdvcmllc0lkcyk7XG5cbiAgICAgIGlmIChub3RGb3VuZENhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU0uQ0FURUdPUklFUy5JRFMuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWRzOiBmaWx0ZXIuaWRzIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVjaywgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuaW1wb3J0IExvZ2dlciBmcm9tICdAL3NlcnZpY2VzL0xvZ2dlcic7XG5cbmNvbnN0IGZzUHJvbWlzZXMgPSBmcy5wcm9taXNlcztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEl0ZW0udmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmVkaXRJdGVtLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3SXRlbS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubmV3SXRlbS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlSXRlbS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlSXRlbS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUl0ZW1zLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5idWxrRGVsZXRlSXRlbXMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RJdGVtcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubGlzdEl0ZW1zLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaXRlbS5cbiAgICovXG4gIG5ld0l0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ3R5cGUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKClcbiAgICAgICAgLmlzSW4oWydzZXJ2aWNlJywgJ25vbi1pbnZlbnRvcnknLCAnaW52ZW50b3J5J10pLFxuICAgICAgY2hlY2soJ3NrdScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2Nvc3RfcHJpY2UnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgICBjaGVjaygnc2VsbF9wcmljZScpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvRmxvYXQoKSxcbiAgICAgIGNoZWNrKCdjb3N0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc0ludCgpLnRvSW50KCksXG4gICAgICBjaGVjaygnc2VsbF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNJbnQoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2ludmVudG9yeV9hY2NvdW50X2lkJylcbiAgICAgICAgLmlmKGNoZWNrKCd0eXBlJykuZXF1YWxzKCdpbnZlbnRvcnknKSlcbiAgICAgICAgLmV4aXN0cygpXG4gICAgICAgIC5pc0ludCgpXG4gICAgICAgIC50b0ludCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3J5X2lkJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS5pc0ludCgpLnRvSW50KCksXG5cbiAgICAgIGNoZWNrKCdjdXN0b21fZmllbGRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi5rZXknKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuXG4gICAgICBjaGVjaygnbm90ZScpLm9wdGlvbmFsKCksXG5cbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoKSxcbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMuKicpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBjdXN0b21fZmllbGRzOiBbXSxcbiAgICAgICAgbWVkaWFfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBBY2NvdW50LFxuICAgICAgICBSZXNvdXJjZSxcbiAgICAgICAgUmVzb3VyY2VGaWVsZCxcbiAgICAgICAgSXRlbUNhdGVnb3J5LFxuICAgICAgICBJdGVtLFxuICAgICAgICBNZWRpYUxpbmssXG4gICAgICB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICBjb25zdCBjb3N0QWNjb3VudFByb21pc2UgPSBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoZm9ybS5jb3N0X2FjY291bnRfaWQpO1xuICAgICAgY29uc3Qgc2VsbEFjY291bnRQcm9taXNlID0gQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uc2VsbF9hY2NvdW50X2lkKTtcbiAgICAgIGNvbnN0IGludmVudG9yeUFjY291bnRQcm9taXNlID0gKGZvcm0udHlwZSA9PT0gJ2ludmVudG9yeScpXG4gICAgICAgID8gQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uaW52ZW50b3J5X2FjY291bnRfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5UHJvbWlzZSA9IChmb3JtLmNhdGVnb3J5X2lkKVxuICAgICAgICA/IEl0ZW1DYXRlZ29yeS5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uY2F0ZWdvcnlfaWQpIDogbnVsbDtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhlIGN1c3RvbSBmaWVsZHMga2V5IGFuZCB2YWx1ZSB0eXBlLlxuICAgICAgaWYgKGZvcm0uY3VzdG9tX2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUZpZWxkc0tleXMgPSBmb3JtLmN1c3RvbV9maWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQua2V5KTtcblxuICAgICAgICAvLyBHZXQgcmVzb3VyY2UgaWQgdGhhbiBnZXQgYWxsIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS53aGVyZSgnbmFtZScsICdpdGVtcycpLmZldGNoKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IGF3YWl0IFJlc291cmNlRmllbGQucXVlcnkoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIHJlc291cmNlLmlkKTtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2tleScsIGN1c3RvbUZpZWxkc0tleXMpO1xuICAgICAgICB9KS5mZXRjaEFsbCgpO1xuXG4gICAgICAgIGNvbnN0IHN0b3JlZEZpZWxkc0tleSA9IGZpZWxkcy5tYXAoKGYpID0+IGYuYXR0cmlidXRlcy5rZXkpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgbm90IGRlZmluZWQgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBub3RGb3VuZEZpZWxkcyA9IGRpZmZlcmVuY2UoY3VzdG9tRmllbGRzS2V5cywgc3RvcmVkRmllbGRzS2V5KTtcblxuICAgICAgICBpZiAobm90Rm91bmRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0ZJRUxEX0tFWV9OT1RfRk9VTkQnLCBjb2RlOiAxNTAsIGZpZWxkczogbm90Rm91bmRGaWVsZHMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFtcbiAgICAgICAgY29zdEFjY291bnQsXG4gICAgICAgIHNlbGxBY2NvdW50LFxuICAgICAgICBpdGVtQ2F0ZWdvcnksXG4gICAgICAgIGludmVudG9yeUFjY291bnQsXG4gICAgICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBjb3N0QWNjb3VudFByb21pc2UsXG4gICAgICAgIHNlbGxBY2NvdW50UHJvbWlzZSxcbiAgICAgICAgaXRlbUNhdGVnb3J5UHJvbWlzZSxcbiAgICAgICAgaW52ZW50b3J5QWNjb3VudFByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmICghY29zdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09TVF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsbEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnU0VMTF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNhdGVnb3J5ICYmIGZvcm0uY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTV9DQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxNDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWludmVudG9yeUFjY291bnQgJiYgZm9ybS50eXBlID09PSAnaW52ZW50b3J5Jykge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJTlZFTlRPUllfQUNDT1VOVF9OT1RfRk9VTkQnLCBjb2RlOiAxNTAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwgeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVsa1NhdmVNZWRpYUxpbmtzID0gW107XG4gICAgICBjb25zdCBpdGVtID0gYXdhaXQgSXRlbS5xdWVyeSgpLmluc2VydEFuZEZldGNoKHtcbiAgICAgICAgbmFtZTogZm9ybS5uYW1lLFxuICAgICAgICB0eXBlOiBmb3JtLnR5cGUsXG4gICAgICAgIHNrdTogZm9ybS5za3UsXG4gICAgICAgIGNvc3RfcHJpY2U6IGZvcm0uY29zdF9wcmljZSxcbiAgICAgICAgc2VsbF9wcmljZTogZm9ybS5zZWxsX3ByaWNlLFxuICAgICAgICBzZWxsX2FjY291bnRfaWQ6IGZvcm0uc2VsbF9hY2NvdW50X2lkLFxuICAgICAgICBjb3N0X2FjY291bnRfaWQ6IGZvcm0uY29zdF9hY2NvdW50X2lkLFxuICAgICAgICBjdXJyZW5jeV9jb2RlOiBmb3JtLmN1cnJlbmN5X2NvZGUsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBmb3JtLmNhdGVnb3J5X2lkLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICBub3RlOiBmb3JtLm5vdGUsXG4gICAgICB9KTtcblxuICAgICAgZm9ybS5tZWRpYV9pZHMuZm9yRWFjaCgobWVkaWFJZCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gTWVkaWFMaW5rLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgICBtb2RlbF9uYW1lOiAnSXRlbScsXG4gICAgICAgICAgbWVkaWFfaWQ6IG1lZGlhSWQsXG4gICAgICAgICAgbW9kZWxfaWQ6IGl0ZW0uaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBidWxrU2F2ZU1lZGlhTGlua3MucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYXZlIHRoZSBtZWRpYSBsaW5rcy5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uYnVsa1NhdmVNZWRpYUxpbmtzLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogaXRlbS5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBnaXZlbiBpdGVtLlxuICAgKi9cbiAgZWRpdEl0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ3R5cGUnKVxuICAgICAgICAuZXhpc3RzKClcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKClcbiAgICAgICAgLmlzSW4oWydwcm9kdWN0JywgJ3NlcnZpY2UnXSksXG4gICAgICBjaGVjaygnY29zdF9wcmljZScpLmV4aXN0cygpLmlzTnVtZXJpYygpLFxuICAgICAgY2hlY2soJ3NlbGxfcHJpY2UnKS5leGlzdHMoKS5pc051bWVyaWMoKSxcbiAgICAgIGNoZWNrKCdjb3N0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc0ludCgpLFxuICAgICAgY2hlY2soJ3NlbGxfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcnlfaWQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzSW50KCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCdhdHRhY2htZW50Jykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCcnKVxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgSXRlbSwgSXRlbUNhdGVnb3J5LCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBjdXN0b21fZmllbGRzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IEl0ZW0ucXVlcnkoKS5maW5kQnlJZChpZCkud2l0aEdyYXBoRmV0Y2hlZCgnbWVkaWEnKTtcblxuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTS5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGNvbnN0IGNvc3RBY2NvdW50UHJvbWlzZSA9IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChmb3JtLmNvc3RfYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBzZWxsQWNjb3VudFByb21pc2UgPSBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoZm9ybS5zZWxsX2FjY291bnRfaWQpO1xuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5UHJvbWlzZSA9IChmb3JtLmNhdGVnb3J5X2lkKVxuICAgICAgICA/IEl0ZW1DYXRlZ29yeS5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uY2F0ZWdvcnlfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgW2Nvc3RBY2NvdW50LCBzZWxsQWNjb3VudCwgaXRlbUNhdGVnb3J5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgY29zdEFjY291bnRQcm9taXNlLCBzZWxsQWNjb3VudFByb21pc2UsIGl0ZW1DYXRlZ29yeVByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmICghY29zdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09TVF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsbEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnU0VMTF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNhdGVnb3J5ICYmIGZvcm0uY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTV9DQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxNDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSByZXEuZmlsZXMgJiYgcmVxLmZpbGVzLmF0dGFjaG1lbnQgPyByZXEuZmlsZXMuYXR0YWNobWVudCA6IG51bGw7XG4gICAgICBjb25zdCBhdHRhY2htZW50c01pbWVzID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgYXR0YWNobWVudC5cbiAgICAgIGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnRzTWltZXMuaW5kZXhPZihhdHRhY2htZW50Lm1pbWV0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQVRUQUNITUVOVC5NSU5FVFlQRS5OT1QuU1VQUE9SVEVEJywgY29kZTogMTYwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0YWNobWVudCkge1xuICAgICAgICBjb25zdCBwdWJsaWNQYXRoID0gJ3N0b3JhZ2UvYXBwL3B1YmxpYy8nO1xuICAgICAgICBjb25zdCB0ZW5hbnRQYXRoID0gYCR7cHVibGljUGF0aH0ke3JlcS5vcmdhbml6YXRpb25JZH1gO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnNQcm9taXNlcy51bmxpbmsoYCR7dGVuYW50UGF0aH0vJHtpdGVtLmF0dGFjaG1lbnRGaWxlfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0RlbGV0ZSBpdGVtIGF0dGFjaG1lbnQgZmlsZSBkZWxldGUgZmFpbGVkLicsIHsgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhdHRhY2htZW50Lm12KGAke3RlbmFudFBhdGh9LyR7YXR0YWNobWVudC5tZDV9LnBuZ2ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBVFRBQ0hNRU5ULlVQTE9BRC5GQUlMRUQnLCBjb2RlOiA2MDAgfV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpLnBhdGNoKHtcbiAgICAgICAgbmFtZTogZm9ybS5uYW1lLFxuICAgICAgICB0eXBlOiBmb3JtLnR5cGUsXG4gICAgICAgIGNvc3RfcHJpY2U6IGZvcm0uY29zdF9wcmljZSxcbiAgICAgICAgc2VsbF9wcmljZTogZm9ybS5zZWxsX3ByaWNlLFxuICAgICAgICBjdXJyZW5jeV9jb2RlOiBmb3JtLmN1cnJlbmN5X2NvZGUsXG4gICAgICAgIHNlbGxfYWNjb3VudF9pZDogZm9ybS5zZWxsX2FjY291bnRfaWQsXG4gICAgICAgIGNvc3RfYWNjb3VudF9pZDogZm9ybS5jb3N0X2FjY291bnRfaWQsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBmb3JtLmNhdGVnb3J5X2lkLFxuICAgICAgICBub3RlOiBmb3JtLm5vdGUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZSBsaW5rcyBvZiBuZXcgaW5zZXJ0ZWQgbWVkaWEgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBpdGVtIG1vZGVsLlxuICAgICAgY29uc3QgaXRlbU1lZGlhSWRzID0gaXRlbS5tZWRpYS5tYXAoKG0pID0+IG0uaWQpO1xuICAgICAgY29uc3QgbmV3SW5zZXJ0ZWRNZWRpYSA9IGRpZmZlcmVuY2UoZm9ybS5tZWRpYV9pZHMsIGl0ZW1NZWRpYUlkcyk7XG4gICAgICBjb25zdCBidWxrU2F2ZU1lZGlhTGluayA9IFtdO1xuXG4gICAgICBuZXdJbnNlcnRlZE1lZGlhLmZvckVhY2goKG1lZGlhSWQpID0+IHtcbiAgICAgICAgY29uc3Qgb3BlciA9IE1lZGlhTGluay5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgbW9kZWxfbmFtZTogJ0pvdXJuYWwnLFxuICAgICAgICAgIG1vZGVsX2lkOiBtYW51YWxKb3VybmFsLmlkLFxuICAgICAgICAgIG1lZGlhX2lkOiBtZWRpYUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVsa1NhdmVNZWRpYUxpbmsucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWyAuLi5uZXdJbnNlcnRlZE1lZGlhIF0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdXBkYXRlZEl0ZW0uaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBkZWxldGVJdGVtOiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJVEVNX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgdGhlIGZ1Y2tpbmcgdGhlIGdpdmVuIGl0ZW0gaWQuXG4gICAgICBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaXRlbS5pZCkuZGVsZXRlKCk7XG5cbiAgICAgIGlmIChpdGVtLmF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSAnc3RvcmFnZS9hcHAvcHVibGljLyc7XG4gICAgICAgIGNvbnN0IHRlbmFudFBhdGggPSBgJHtwdWJsaWNQYXRofSR7cmVxLm9yZ2FuaXphdGlvbklkfWA7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmc1Byb21pc2VzLnVubGluayhgJHt0ZW5hbnRQYXRofS8ke2l0ZW0uYXR0YWNobWVudEZpbGV9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnRGVsZXRlIGl0ZW0gYXR0YWNobWVudCBmaWxlIGRlbGV0ZSBmYWlsZWQuJywgeyBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogQnVsayBkZWxldGUgdGhlIGdpdmVuIGl0ZW1zIGlkcy5cbiAgICovXG4gIGJ1bGtEZWxldGVJdGVtczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IGlkczogW10sIC4uLnJlcS5xdWVyeSB9O1xuICAgICAgY29uc3QgeyBJdGVtIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IEl0ZW0ucXVlcnkoKS53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuXG4gICAgICBjb25zdCBzdG9yZWRJdGVtc0lkcyA9IGl0ZW1zLm1hcCgoYSkgPT4gYS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEl0ZW1zID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBzdG9yZWRJdGVtc0lkcyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgaXRlbXMuXG4gICAgICBpZiAobm90Rm91bmRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTVMuTk9ULkZPVU5EJywgY29kZTogMjAwLCBpZHM6IG5vdEZvdW5kSXRlbXMgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGdpdmVuIGl0ZW1zIGlkcy5cbiAgICAgIGF3YWl0IEl0ZW0ucXVlcnkoKS53aGVyZUluKCdpZCcsIHN0b3JlZEl0ZW1zSWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cml2ZSB0aGUgbGlzdCBpdGVtcyB3aXRoIHBhZ2luYXRpb24gbWV0YS5cbiAgICovXG4gIGxpc3RJdGVtczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnLCAnbmFtZScsICdhbW91bnQnLCAnc2t1J10pLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLmlzSW4oWydkZXNjJywgJ2FzYyddKSxcbiAgICAgIHF1ZXJ5KCdwYWdlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3BhZ2Vfc2l6ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdjdXN0b21fdmlld19pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdzdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMnKS5vcHRpb25hbCgpLmlzSlNPTigpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3Qgdmlld0NvbmRpdGlvbnMgPSBbXTtcbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIEl0ZW0sIFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpdGVtc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnaXRlbXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghaXRlbXNSZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU1TX1JFU09VUkNFX05PVF9GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGNvbHVtbl9zb3J0X29yZGVyOiAnJyxcbiAgICAgICAgc29ydF9vcmRlcjogJycsXG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHBhZ2Vfc2l6ZTogMTAsXG4gICAgICAgIGN1c3RvbV92aWV3X2lkOiBudWxsLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlcl9yb2xlcyA9IEpTT04ucGFyc2UoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmN1c3RvbV92aWV3X2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2Zhdm91cml0ZScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoJ3Jlc291cmNlX2lkJywgaXRlbXNSZXNvdXJjZS5pZCk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgncm9sZXMuZmllbGQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJyk7XG4gICAgICAgIGJ1aWxkZXIuZmlyc3QoKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gaXRlbXNSZXNvdXJjZS5maWVsZHMubWFwKChjKSA9PiBjLmtleSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoSXRlbS50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIHZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIGl0ZW1zUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTVMuUkVTT1VSQ0UuSEFTLk5PLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBJdGVtLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2Nvc3RBY2NvdW50Jyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnc2VsbEFjY291bnQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdpbnZlbnRvcnlBY2NvdW50Jyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcnknKTtcblxuICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgIH0pLnBhZ2luYXRpb24oZmlsdGVyLnBhZ2UgLSAxLCBmaWx0ZXIucGFnZV9zaXplKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIC4uLih2aWV3KSAmJiB7XG4gICAgICAgICAgY3VzdG9tVmlld0lkOiB2aWV3LmlkLFxuICAgICAgICAgIHZpZXdDb2x1bW5zOiB2aWV3LmNvbHVtbnMsXG4gICAgICAgICAgdmlld0NvbmRpdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsIlxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBwYXJhbSxcbiAgcXVlcnksXG4gIHZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuXG5jb25zdCBmc1Byb21pc2VzID0gZnMucHJvbWlzZXM7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy91cGxvYWQnLFxuICAgICAgdGhpcy51cGxvYWQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnVwbG9hZC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuZGVsZXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGUuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFsbCBvciB0aGUgZ2l2ZW4gYXR0YWNobWVudCBpZHMuXG4gICAqL1xuICBnZXQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJyksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBNZWRpYSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IG1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG5cbiAgICAgICAgaWYgKHJlcS5xdWVyeS5pZHMpIHtcbiAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHJlcS5xdWVyeS5pZHMpID8gcmVxLnF1ZXJ5LmlkcyA6IFtyZXEucXVlcnkuaWRzXTtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2lkJywgaWRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IG1lZGlhIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIGdpdmVuIGF0dGFjaG1lbnQgZmlsZS5cbiAgICovXG4gIHVwbG9hZDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIC8vIGNoZWNrKCdhdHRhY2htZW50JykuZXhpc3RzKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBpZiAoIXJlcS5maWxlcy5hdHRhY2htZW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQVRUQUNITUVOVC5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVibGljUGF0aCA9ICdzdG9yYWdlL2FwcC9wdWJsaWMvJztcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzTWltZXMgPSBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ107XG4gICAgICBjb25zdCB7IGF0dGFjaG1lbnQgfSA9IHJlcS5maWxlcztcbiAgICAgIGNvbnN0IHsgTWVkaWEgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgYXR0YWNobWVudC5cbiAgICAgIGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnRzTWltZXMuaW5kZXhPZihhdHRhY2htZW50Lm1pbWV0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQVRUQUNITUVOVC5NSU5FVFlQRS5OT1QuU1VQUE9SVEVEJywgY29kZTogMTYwIH0pO1xuICAgICAgfVxuICAgICAgLy8gQ2F0Y2ggYWxsIGVycm9yIHJlYXNvbnMgdG8gcmVzcG9uc2UgNDAwLlxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhdHRhY2htZW50Lm12KGAke3B1YmxpY1BhdGh9JHtyZXEub3JnYW5pemF0aW9uSWR9LyR7YXR0YWNobWVudC5tZDV9LnBuZ2ApO1xuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0F0dGFjaG1lbnQgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0F0dGFjaG1lbnQgdXBsb2FkaW5nIGZhaWxlZC4nLCB7IGVycm9yIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZWRpYSA9IGF3YWl0IE1lZGlhLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgYXR0YWNobWVudF9maWxlOiBgJHthdHRhY2htZW50Lm1kNX0ucG5nYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgbWVkaWEgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZ2l2ZW4gYXR0YWNobWVudCBpZHMgZnJvbSBmaWxlIHN5c3RlbSBhbmQgZGF0YWJhc2UuXG4gICAqL1xuICBkZWxldGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuZXhpc3RzKCkuaXNBcnJheSgpLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IE1lZGlhLCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHJlcS5xdWVyeS5pZHMpID8gcmVxLnF1ZXJ5LmlkcyA6IFtyZXEucXVlcnkuaWRzXTtcbiAgICAgIGNvbnN0IG1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIGlkcyk7XG4gICAgICBjb25zdCBtZWRpYUlkcyA9IG1lZGlhLm1hcCgobSkgPT4gbS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZE1lZGlhID0gZGlmZmVyZW5jZShpZHMsIG1lZGlhSWRzKTtcblxuICAgICAgaWYgKG5vdEZvdW5kTWVkaWEubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTUVESUEuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCwgaWRzOiBub3RGb3VuZE1lZGlhIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSAnc3RvcmFnZS9hcHAvcHVibGljLyc7XG4gICAgICBjb25zdCB0ZW5hbnRQYXRoID0gYCR7cHVibGljUGF0aH0ke3JlcS5vcmdhbml6YXRpb25JZH1gO1xuICAgICAgY29uc3QgdW5saW5rT3BlcnMgPSBbXTtcblxuICAgICAgbWVkaWEuZm9yRWFjaCgobWVkaWFNb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gZnNQcm9taXNlcy51bmxpbmsoYCR7dGVuYW50UGF0aH0vJHttZWRpYU1vZGVsLmF0dGFjaG1lbnRGaWxlfWApO1xuICAgICAgICB1bmxpbmtPcGVycy5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh1bmxpbmtPcGVycykudGhlbigocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgcmVzb2x2ZWQuZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnQXR0YWNobWVudCBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQuJyk7XG4gICAgICAgIH0pOyBcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9ycykgPT4ge1xuICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBMb2dnZXIubG9nKCdlcnJvcicsICdEZWxldGUgaXRlbSBhdHRhY2htZW50IGZpbGUgZGVsZXRlIGZhaWxlZC4nLCB7IGVycm9yIH0pO1xuICAgICAgICB9KVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IE1lZGlhTGluay5xdWVyeSgpLndoZXJlSW4oJ21lZGlhX2lkJywgbWVkaWFJZHMpLmRlbGV0ZSgpO1xuICAgICAgYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIG1lZGlhSWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGJvZHksIHF1ZXJ5LCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy8nLFxuICAgICAgdGhpcy5zYXZlT3B0aW9ucy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuc2F2ZU9wdGlvbnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldE9wdGlvbnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldE9wdGlvbnMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGdpdmVuIG9wdGlvbnMgdG8gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBzYXZlT3B0aW9uczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGJvZHkoJ29wdGlvbnMnKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgYm9keSgnb3B0aW9ucy4qLmtleScpLmV4aXN0cygpLFxuICAgICAgYm9keSgnb3B0aW9ucy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBib2R5KCdvcHRpb25zLiouZ3JvdXAnKS5leGlzdHMoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICdWQUxJREFUSU9OX0VSUk9SJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IE9wdGlvbiB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCBvcHRpb25zQ29sbGVjdGlvbnMgPSBhd2FpdCBPcHRpb24ucXVlcnkoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBub3REZWZpbmVkT3B0aW9ucyA9IE9wdGlvbi52YWxpZGF0ZURlZmluZWQoZm9ybS5vcHRpb25zKTtcblxuICAgICAgaWYgKG5vdERlZmluZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ09QVElPTlMuS0VZLk5PVC5ERUZJTkVEJyxcbiAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAga2V5czogbm90RGVmaW5lZE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5waWNrKG8sIFsna2V5JywgJ2dyb3VwJ10pIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGZvcm0ub3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgb3B0aW9uc0NvbGxlY3Rpb25zLnNldE1ldGEoeyAuLi5vcHRpb24gfSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG9wdGlvbnNDb2xsZWN0aW9ucy5zYXZlTWV0YSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBvcHRpb25zOiBmb3JtIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBvcHRpb25zIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBnZXRPcHRpb25zOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2tleScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnZ3JvdXAnKS5vcHRpb25hbCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ1ZBTElEQVRJT05fRVJST1InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgT3B0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0geyAuLi5yZXEucXVlcnkgfTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBPcHRpb24ucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIua2V5KSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgna2V5JywgZmlsdGVyLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2dyb3VwJywgZmlsdGVyLmdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBvcHRpb25zOiBvcHRpb25zLm1ldGFkYXRhIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBwYXJhbSxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvOnJlc291cmNlX3NsdWcvY29sdW1ucycsXG4gICAgICB0aGlzLnJlc291cmNlQ29sdW1ucy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVzb3VyY2VDb2x1bW5zLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86cmVzb3VyY2Vfc2x1Zy9maWVsZHMnLFxuICAgICAgdGhpcy5yZXNvdXJjZUZpZWxkcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVzb3VyY2VGaWVsZHMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgcmVzb3VyY2UgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuXG4gICAqL1xuICByZXNvdXJjZUNvbHVtbnM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgncmVzb3VyY2Vfc2x1ZycpLnRyaW0oKS5lc2NhcGUoKS5leGlzdHMoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBSZXNvdXJjZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsIHJlc291cmNlU2x1ZylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUkVTT1VSQ0UuU0xVRy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHMgPSByZXNvdXJjZS5maWVsZHNcbiAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkLmNvbHVtbmFibGUpXG4gICAgICAgIC5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICAgIGlkOiBmaWVsZC5pZCxcbiAgICAgICAgICBsYWJlbDogZmllbGQubGFiZWxOYW1lLFxuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHJlc291cmNlX2NvbHVtbnM6IHJlc291cmNlRmllbGRzLFxuICAgICAgICByZXNvdXJjZV9zbHVnOiByZXNvdXJjZVNsdWcsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBmaWVsZHMgb2YgdGhlIGdpdmVuIHJlc291cmNlLlxuICAgKi9cbiAgcmVzb3VyY2VGaWVsZHM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgncmVzb3VyY2Vfc2x1ZycpLnRyaW0oKS5lc2NhcGUoKS5leGlzdHMoKSxcbiAgICAgIHF1ZXJ5KCdwcmVkZWZpbmVkJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdidWlsdGluJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBSZXNvdXJjZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsIHJlc291cmNlU2x1ZylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUkVTT1VSQ0UuU0xVRy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcmVzb3VyY2VfZmllbGRzOiByZXNvdXJjZS5maWVsZHMsXG4gICAgICAgIHJlc291cmNlX3NsdWc6IHJlc291cmNlU2x1ZyxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcXVlcnksXG4gIHBhcmFtLFxuICB2YWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucHV0KCcvOmlkL2luYWN0aXZlJyxcbiAgICAgIHRoaXMuaW5hY3RpdmVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbmFjdGl2ZVVzZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnB1dCgnLzppZC9hY3RpdmUnLFxuICAgICAgdGhpcy5hY3RpdmVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5hY3RpdmVVc2VyLmhhbmRsZXIpKTtcbiAgXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0VXNlci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdFVzZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RVc2Vycy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubGlzdFVzZXJzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRVc2VyLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVVc2VyLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gdXNlci5cbiAgICovXG4gIGVkaXRVc2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdmaXJzdF9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnbGFzdF9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnZW1haWwnKS5leGlzdHMoKS5pc0VtYWlsKCksXG4gICAgICBjaGVjaygncGhvbmVfbnVtYmVyJykub3B0aW9uYWwoKS5pc01vYmlsZVBob25lKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcblxuICAgICAgY29uc3QgZm91bmRVc2VycyA9IGF3YWl0IFRlbmFudFVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmVOb3QoJ2lkJywgaWQpXG4gICAgICAgIC5hbmRXaGVyZSgocSkgPT4ge1xuICAgICAgICAgIHEud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbCk7XG4gICAgICAgICAgcS5vcldoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3VuZFVzZXJFbWFpbCA9IGZvdW5kVXNlcnMuZmluZCgodSkgPT4gdS5lbWFpbCA9PT0gZm9ybS5lbWFpbCk7XG4gICAgICBjb25zdCBmb3VuZFVzZXJQaG9uZSA9IGZvdW5kVXNlcnMuZmluZCgodSkgPT4gdS5waG9uZU51bWJlciA9PT0gZm9ybS5waG9uZV9udW1iZXIpO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgaWYgKGZvdW5kVXNlckVtYWlsKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VNQUlMX0FMUkVBRFlfRVhJU1QnLCBjb2RlOiAxMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRVc2VyUGhvbmUpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnUEhPTkVfTlVNQkVSX0FMUkVBRFlfRVhJU1QnLCBjb2RlOiAxMjAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwgeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJGb3JtID0ge1xuICAgICAgICBmaXJzdF9uYW1lOiBmb3JtLmZpcnN0X25hbWUsXG4gICAgICAgIGxhc3RfbmFtZTogZm9ybS5sYXN0X25hbWUsXG4gICAgICAgIGVtYWlsOiBmb3JtLmVtYWlsLFxuICAgICAgICBwaG9uZV9udW1iZXI6IGZvcm0ucGhvbmVfbnVtYmVyLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHVwZGF0ZVRlbmFudFVzZXIgPSBUZW5hbnRVc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKS51cGRhdGUoeyAuLi51c2VyRm9ybSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgLi4udXNlckZvcm0gfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdXBkYXRlVGVuYW50VXNlciwgdXBkYXRlU3lzdGVtVXNlcixcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogU29mdCBkZWxldGluZyB0aGUgZ2l2ZW4gdXNlci5cbiAgICovXG4gIGRlbGV0ZVVzZXI6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1VTRVJfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlbmFudFVzZXJEZWwgPSBUZW5hbnRVc2VyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuICAgICAgY29uc3Qgc3lzdGVtVXNlckRlbCA9IFN5c3RlbVVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGVuYW50VXNlckRlbCxcbiAgICAgICAgc3lzdGVtVXNlckRlbCxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdXNlciBkZXRhaWxzIG9mIHRoZSBnaXZlbiB1c2VyIGlkLlxuICAgKi9cbiAgZ2V0VXNlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBUZW5hbnRVc2VyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFRlbmFudFVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdXNlciB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiB1c2Vycy5cbiAgICovXG4gIGxpc3RVc2Vyczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHVzZXJzID0gYXdhaXQgVGVuYW50VXNlci5xdWVyeSgpXG4gICAgICAgIC5wYWdlKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHVzZXJzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgaW5hY3RpdmVVc2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCB7IFRlbmFudFVzZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB0ZW5hbnRVc2VyID0gVGVuYW50VXNlci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIXRlbmFudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVUZW5hbnRVc2VyID0gVGVuYW50VXNlci5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZCkudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgIFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB1cGRhdGVUZW5hbnRVc2VyLCB1cGRhdGVTeXN0ZW1Vc2VyLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB0ZW5hbnRVc2VyLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgYWN0aXZlVXNlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgeyBUZW5hbnRVc2VyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdGVuYW50VXNlciA9IFRlbmFudFVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF0ZW5hbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVVNFUi5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlVGVuYW50VXNlciA9IFRlbmFudFVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpLnVwZGF0ZSh7IGFjdGl2ZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgYWN0aXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZVRlbmFudFVzZXIsIHVwZGF0ZVN5c3RlbVVzZXIsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB0ZW5hbnRVc2VyLmlkIH0pO1xuICAgIH0sXG4gIH0sXG59OyIsImltcG9ydCB7IGRpZmZlcmVuY2UsIHBpY2sgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcXVlcnksXG4gIHBhcmFtLFxuICBvbmVPZixcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVWaWV3Um9sZXMsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHJlc291cmNlOiAnaXRlbXMnLFxuXG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5saXN0Vmlld3MudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RWaWV3cy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLmNyZWF0ZVZpZXcudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmNyZWF0ZVZpZXcuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86dmlld19pZCcsXG4gICAgICB0aGlzLmVkaXRWaWV3LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0Vmlldy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOnZpZXdfaWQnLFxuICAgICAgdGhpcy5kZWxldGVWaWV3LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVWaWV3LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86dmlld19pZCcsXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRWaWV3LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86dmlld19pZC9yZXNvdXJjZScsXG4gICAgICB0aGlzLmdldFZpZXdSZXNvdXJjZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0Vmlld1Jlc291cmNlLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHZpZXdzIHRoYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZS5cbiAgICovXG4gIGxpc3RWaWV3czoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ3Jlc291cmNlX25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBdLCBbXG4gICAgICAgIHF1ZXJ5KCdyZXNvdXJjZV9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBdKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IC4uLnJlcS5xdWVyeSB9O1xuXG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLnJlc291cmNlX2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIucmVzb3VyY2VfaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIucmVzb3VyY2VfbmFtZSkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ25hbWUnLCBmaWx0ZXIucmVzb3VyY2VfbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgVmlldy5xdWVyeSgpLndoZXJlKCdyZXNvdXJjZV9pZCcsIHJlc291cmNlLmlkKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdmlld3MgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdmlldyBkZXRhaWxzIG9mIHRoZSBnaXZlbiB2aWV3IGlkLlxuICAgKi9cbiAgZ2V0Vmlldzoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCd2aWV3X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgdmlld19pZDogdmlld0lkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBWaWV3IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCB2aWV3SWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdyZXNvdXJjZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZJRVdfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHZpZXc6IHZpZXcudG9KU09OKCkgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBnaXZlbiB2aWV3IG9mIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIGRlbGV0ZVZpZXc6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkuZmluZEJ5SWQodmlld0lkKTtcblxuICAgICAgaWYgKCF2aWV3KSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVklFV19OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXcucHJlZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUFJFREVGSU5FRF9WSUVXJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdmlldy4kcmVsYXRlZFF1ZXJ5KCdyb2xlcycpLmRlbGV0ZSgpLFxuICAgICAgICB2aWV3LiRyZWxhdGVkUXVlcnkoJ2NvbHVtbnMnKS5kZWxldGUoKSxcbiAgICAgIF0pO1xuICAgICAgYXdhaXQgVmlldy5xdWVyeSgpLndoZXJlKCdpZCcsIHZpZXcuaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdmlldy5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHZpZXcuXG4gICAqL1xuICBjcmVhdGVWaWV3OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3Jlc291cmNlX25hbWUnKS5leGlzdHMoKS5lc2NhcGUoKS50cmltKCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdsb2dpY19leHByZXNzaW9uJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3JvbGVzJykuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmZpZWxkX2tleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmNvbXBhcmF0b3InKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY29sdW1ucycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICBjaGVjaygnY29sdW1ucy4qLmtleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaW5kZXgnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgUmVzb3VyY2UsXG4gICAgICAgIFZpZXcsXG4gICAgICAgIFZpZXdDb2x1bW4sXG4gICAgICAgIFZpZXdSb2xlLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyByb2xlczogW10sIC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KCkud2hlcmUoJ25hbWUnLCBmb3JtLnJlc291cmNlX25hbWUpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdSRVNPVVJDRV9OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBmaWVsZHNTbHVncyA9IGZvcm0ucm9sZXMubWFwKChyb2xlKSA9PiByb2xlLmZpZWxkX2tleSk7XG5cbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzID0gYXdhaXQgcmVzb3VyY2UuJHJlbGF0ZWRRdWVyeSgnZmllbGRzJyk7XG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSByZXNvdXJjZUZpZWxkcy5tYXAoKGYpID0+IGYua2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5c01hcCA9IG5ldyBNYXAocmVzb3VyY2VGaWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmtleSwgZmllbGRdKSk7XG4gICAgICBjb25zdCBjb2x1bW5zS2V5cyA9IGZvcm0uY29sdW1ucy5tYXAoKGMpID0+IGMua2V5KTtcblxuICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RvcmVkIHJlc291cmNlIGZpZWxkcyBhbmQgc3VibWl0IGZpZWxkcyBrZXlzLlxuICAgICAgY29uc3Qgbm90Rm91bmRGaWVsZHMgPSBkaWZmZXJlbmNlKGZpZWxkc1NsdWdzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuXG4gICAgICBpZiAobm90Rm91bmRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdSRVNPVVJDRV9GSUVMRFNfTk9UX0VYSVNUJywgY29kZTogMTAwLCBmaWVsZHM6IG5vdEZvdW5kRmllbGRzIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RvcmVkIHJlc291cmNlIGZpZWxkcyBhbmQgdGhlIHN1Ym1pdCBjb2x1bW5zIGtleXMuXG4gICAgICBjb25zdCBub3RGb3VuZENvbHVtbnMgPSBkaWZmZXJlbmNlKGNvbHVtbnNLZXlzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuXG4gICAgICBpZiAobm90Rm91bmRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09MVU1OU19OT1RfRVhJU1QnLCBjb2RlOiAyMDAsIGNvbHVtbnM6IG5vdEZvdW5kQ29sdW1ucyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlcyB0aGUgdmlldyBjb25kaXRpb25hbCBsb2dpYyBleHByZXNzaW9uLlxuICAgICAgaWYgKCF2YWxpZGF0ZVZpZXdSb2xlcyhmb3JtLnJvbGVzLCBmb3JtLmxvZ2ljX2V4cHJlc3Npb24pKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuUk9MRVMuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgdmlldyBkZXRhaWxzLlxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICBuYW1lOiBmb3JtLm5hbWUsXG4gICAgICAgIHByZWRlZmluZWQ6IGZhbHNlLFxuICAgICAgICByZXNvdXJjZV9pZDogcmVzb3VyY2UuaWQsXG4gICAgICAgIHJvbGVzX2xvZ2ljX2V4cHJlc3Npb246IGZvcm0ubG9naWNfZXhwcmVzc2lvbixcbiAgICAgIH0pO1xuICAgICAgLy8gU2F2ZSB2aWV3IHJvbGVzIGFzeW5jIG9wZXJhdGlvbnMuXG4gICAgICBjb25zdCBzYXZlVmlld1JvbGVzT3BlcnMgPSBbXTtcblxuICAgICAgZm9ybS5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KHJvbGUuZmllbGRfa2V5KTtcblxuICAgICAgICBjb25zdCBzYXZlVmlld1JvbGVPcGVyID0gVmlld1JvbGUucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIC4uLnBpY2socm9sZSwgWydjb21wYXJhdG9yJywgJ3ZhbHVlJywgJ2luZGV4J10pLFxuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBzYXZlVmlld1JvbGVzT3BlcnMucHVzaChzYXZlVmlld1JvbGVPcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3JtLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KGNvbHVtbi5rZXkpO1xuXG4gICAgICAgIGNvbnN0IHNhdmVWaWV3Q29sdW1uT3BlciA9IFZpZXdDb2x1bW4ucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgICAgaW5kZXg6IGNvbHVtbi5pbmRleCxcbiAgICAgICAgfSk7XG4gICAgICAgIHNhdmVWaWV3Um9sZXNPcGVycy5wdXNoKHNhdmVWaWV3Q29sdW1uT3Blcik7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHNhdmVWaWV3Um9sZXNPcGVycyk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB2aWV3LmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGN1c3RvbSB2aWV3IG1ldGFkYXRhLlxuICAgKi9cbiAgZWRpdFZpZXc6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdsb2dpY19leHByZXNzaW9uJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gICAgICBjaGVjaygnY29sdW1ucycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG5cbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY29sdW1ucy4qLmtleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaW5kZXgnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuXG4gICAgICBjaGVjaygncm9sZXMnKS5pc0FycmF5KCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmZpZWxkX2tleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmNvbXBhcmF0b3InKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIFZpZXcsIFZpZXdSb2xlLCBWaWV3Q29sdW1uLCBSZXNvdXJjZSxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS53aGVyZSgnaWQnLCB2aWV3SWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1JPTEVfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIHZpZXcucmVzb3VyY2VJZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd2aWV3cycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IGZpZWxkc1NsdWdzID0gZm9ybS5yb2xlcy5tYXAoKHJvbGUpID0+IHJvbGUuZmllbGRfa2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5cyA9IHJlc291cmNlLmZpZWxkcy5tYXAoKGYpID0+IGYua2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5c01hcCA9IG5ldyBNYXAocmVzb3VyY2UuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5rZXksIGZpZWxkXSkpO1xuICAgICAgY29uc3QgY29sdW1uc0tleXMgPSBmb3JtLmNvbHVtbnMubWFwKChjKSA9PiBjLmtleSk7XG5cbiAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0b3JlZCByZXNvdXJjZSBmaWVsZHMgYW5kIHN1Ym1pdCBmaWVsZHMga2V5cy5cbiAgICAgIGNvbnN0IG5vdEZvdW5kRmllbGRzID0gZGlmZmVyZW5jZShmaWVsZHNTbHVncywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbm90IGZvdW5kIHJlc291cmNlIGZpZWxkcyBrZXlzLlxuICAgICAgaWYgKG5vdEZvdW5kRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdSRVNPVVJDRV9GSUVMRFNfTk9UX0VYSVNUJywgY29kZTogMTAwLCBmaWVsZHM6IG5vdEZvdW5kRmllbGRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0b3JlZCByZXNvdXJjZSBmaWVsZHMgYW5kIHRoZSBzdWJtaXQgY29sdW1ucyBrZXlzLlxuICAgICAgY29uc3Qgbm90Rm91bmRDb2x1bW5zID0gZGlmZmVyZW5jZShjb2x1bW5zS2V5cywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbm90IGZvdW5kIHZpZXcgY29sdW1ucy5cbiAgICAgIGlmIChub3RGb3VuZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdSRVNPVVJDRV9DT0xVTU5TX05PVF9FWElTVCcsIGNvZGU6IDIwMCwgY29sdW1uczogbm90Rm91bmRDb2x1bW5zIH0pO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGVzIHRoZSB2aWV3IGNvbmRpdGlvbmFsIGxvZ2ljIGV4cHJlc3Npb24uXG4gICAgICBpZiAoIXZhbGlkYXRlVmlld1JvbGVzKGZvcm0ucm9sZXMsIGZvcm0ubG9naWNfZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5ST0xFUy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXdSb2xlc0lkcyA9IHZpZXcucm9sZXMubWFwKChyKSA9PiByLmlkKTtcbiAgICAgIGNvbnN0IHZpZXdDb2x1bW5zSWRzID0gdmlldy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCk7XG5cbiAgICAgIGNvbnN0IGZvcm1VcGRhdGVkUm9sZXMgPSBmb3JtLnJvbGVzLmZpbHRlcigocikgPT4gci5pZCk7XG4gICAgICBjb25zdCBmb3JtSW5zZXJ0Um9sZXMgPSBmb3JtLnJvbGVzLmZpbHRlcigocikgPT4gIXIuaWQpO1xuXG4gICAgICBjb25zdCBmb3JtUm9sZXNJZHMgPSBmb3JtVXBkYXRlZFJvbGVzLm1hcCgocikgPT4gci5pZCk7XG5cbiAgICAgIGNvbnN0IGZvcm1VcGRhdGVkQ29sdW1ucyA9IGZvcm0uY29sdW1ucy5maWx0ZXIoKHIpID0+IHIuaWQpO1xuICAgICAgY29uc3QgZm9ybUluc2VydGVkQ29sdW1ucyA9IGZvcm0uY29sdW1ucy5maWx0ZXIoKHIpID0+ICFyLmlkKTtcbiAgICAgIGNvbnN0IGZvcm1Db2x1bW5zSWRzID0gZm9ybVVwZGF0ZWRDb2x1bW5zLm1hcCgocikgPT4gci5pZCk7XG5cbiAgICAgIGNvbnN0IHJvbGVzSWRzU2hvdWxkRGVsZXRlZCA9IGRpZmZlcmVuY2Uodmlld1JvbGVzSWRzLCBmb3JtUm9sZXNJZHMpO1xuICAgICAgY29uc3QgY29sdW1uc0lkc1Nob3VsZERlbGV0ZSA9IGRpZmZlcmVuY2Uodmlld0NvbHVtbnNJZHMsIGZvcm1Db2x1bW5zSWRzKTtcblxuICAgICAgY29uc3Qgbm90Rm91bmRWaWV3Um9sZXNJZHMgPSBkaWZmZXJlbmNlKGZvcm1Sb2xlc0lkcywgdmlld1JvbGVzSWRzKTtcbiAgICAgIGNvbnN0IG5vdEZvdW5kVmlld0NvbHVtbnNJZHMgPSBkaWZmZXJlbmNlKHZpZXdDb2x1bW5zSWRzLCB2aWV3Q29sdW1uc0lkcyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgdmlldyByb2xlcyBpZHMuXG4gICAgICBpZiAobm90Rm91bmRWaWV3Um9sZXNJZHMubGVuZ3RoKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuUk9MRVMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDUwMCwgaWRzOiBub3RGb3VuZFZpZXdSb2xlc0lkcyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgdmlldyBjb2x1bW5zIGlkcy5cbiAgICAgIGlmIChub3RGb3VuZFZpZXdDb2x1bW5zSWRzLmxlbmd0aCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdWSUVXLkNPTFVNTlMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDYwMCwgaWRzOiBub3RGb3VuZFZpZXdDb2x1bW5zSWRzIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYXN5bmNPcGVycyA9IFtdO1xuXG4gICAgICAvLyBTYXZlIHZpZXcgZGV0YWlscy5cbiAgICAgIGF3YWl0IFZpZXcucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdmlldy5pZClcbiAgICAgICAgLnBhdGNoKHtcbiAgICAgICAgICBuYW1lOiBmb3JtLm5hbWUsXG4gICAgICAgICAgcm9sZXNfbG9naWNfZXhwcmVzc2lvbjogZm9ybS5sb2dpY19leHByZXNzaW9uLFxuICAgICAgICB9KTtcblxuICAgICAgLy8gVXBkYXRlIHZpZXcgcm9sZXMuXG4gICAgICBpZiAoZm9ybVVwZGF0ZWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvcm1VcGRhdGVkUm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KHJvbGUuZmllbGRfa2V5KTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVPcGVyID0gVmlld1JvbGUucXVlcnkoKVxuICAgICAgICAgICAgLndoZXJlKCdpZCcsIHJvbGUuaWQpXG4gICAgICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAgICAgLi4ucGljayhyb2xlLCBbJ2NvbXBhcmF0b3InLCAndmFsdWUnLCAnaW5kZXgnXSksXG4gICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYXN5bmNPcGVycy5wdXNoKHVwZGF0ZU9wZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEluc2VydCBhIG5ldyB2aWV3IHJvbGVzLlxuICAgICAgaWYgKGZvcm1JbnNlcnRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvcm1JbnNlcnRSb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmllbGRNb2RlbCA9IHJlc291cmNlRmllbGRzS2V5c01hcC5nZXQocm9sZS5maWVsZF9rZXkpO1xuICAgICAgICAgIGNvbnN0IGluc2VydE9wZXIgPSBWaWV3Um9sZS5xdWVyeSgpXG4gICAgICAgICAgICAuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgLi4ucGljayhyb2xlLCBbJ2NvbXBhcmF0b3InLCAndmFsdWUnLCAnaW5kZXgnXSksXG4gICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgICAgICB2aWV3X2lkOiB2aWV3LmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYXN5bmNPcGVycy5wdXNoKGluc2VydE9wZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSB2aWV3IHJvbGVzLlxuICAgICAgaWYgKHJvbGVzSWRzU2hvdWxkRGVsZXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wZXIgPSBWaWV3Um9sZS5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlSW4oJ2lkJywgcm9sZXNJZHNTaG91bGREZWxldGVkKVxuICAgICAgICAgIC5kZWxldGUoKTtcbiAgICAgICAgYXN5bmNPcGVycy5wdXNoKGRlbGV0ZU9wZXIpO1xuICAgICAgfVxuICAgICAgLy8gSW5zZXJ0IGEgbmV3IHZpZXcgY29sdW1ucyB0byB0aGUgc3RvcmFnZS5cbiAgICAgIGlmIChmb3JtSW5zZXJ0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybUluc2VydGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWVsZE1vZGVsID0gcmVzb3VyY2VGaWVsZHNLZXlzTWFwLmdldChjb2x1bW4ua2V5KTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRPcGVyID0gVmlld0NvbHVtbi5xdWVyeSgpXG4gICAgICAgICAgICAuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgZmllbGRfaWQ6IGZpZWxkTW9kZWwuaWQsXG4gICAgICAgICAgICAgIGluZGV4OiBjb2x1bW4uaW5kZXgsXG4gICAgICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBhc3luY09wZXJzLnB1c2goaW5zZXJ0T3Blcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3IGNvbHVtbnMgb24gdGhlIHN0b3JhZ2UuXG4gICAgICBpZiAoZm9ybVVwZGF0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybVVwZGF0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZU9wZXIgPSBWaWV3Q29sdW1uLnF1ZXJ5KClcbiAgICAgICAgICAgIC53aGVyZSgnaWQnLCBjb2x1bW4uaWQpXG4gICAgICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAgICAgaW5kZXg6IGNvbHVtbi5pbmRleCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGFzeW5jT3BlcnMucHVzaCh1cGRhdGVPcGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgdGhlIHZpZXcgY29sdW1ucyBmcm9tIHRoZSBzdG9yYWdlLlxuICAgICAgaWYgKGNvbHVtbnNJZHNTaG91bGREZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBkZWxldGVPcGVyID0gVmlld0NvbHVtbi5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlSW4oJ2lkJywgY29sdW1uc0lkc1Nob3VsZERlbGV0ZSlcbiAgICAgICAgICAuZGVsZXRlKCk7XG4gICAgICAgIGFzeW5jT3BlcnMucHVzaChkZWxldGVPcGVyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFzeW5jT3BlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBjb2x1bW5zIHRoYXQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gY3VzdG9tIHZpZXcuXG4gICAqL1xuICBnZXRWaWV3UmVzb3VyY2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgVmlldyB9ID0gcmVxLm1vZGVscztcbiAgICAgIFxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdmlld0lkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgncmVzb3VyY2UuZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZJRVcuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdmlldy5yZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVklFVy5IQVMuTk9ULkFTU09DSUFURUQuUkVTT1VSQ0UnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvdXJjZUNvbHVtbnMgPSB2aWV3LnJlc291cmNlLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQuY29sdW1uYWJsZSlcbiAgICAgICAgLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgICAgaWQ6IGZpZWxkLmlkLFxuICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbE5hbWUsXG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcmVzb3VyY2Vfc2x1Zzogdmlldy5yZXNvdXJjZS5uYW1lLFxuICAgICAgICByZXNvdXJjZV9jb2x1bW5zOiByZXNvdXJjZUNvbHVtbnMsXG4gICAgICAgIHJlc291cmNlX2ZpZWxkczogdmlldy5yZXNvdXJjZS5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuIiwiLy8gaW1wb3J0IE9BdXRoMiBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvT0F1dGgyJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IEF1dGhlbnRpY2F0aW9uIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BdXRoZW50aWNhdGlvbic7XG5pbXBvcnQgSW52aXRlVXNlcnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0ludml0ZVVzZXJzJztcbmltcG9ydCBVc2VycyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVXNlcnMnO1xuLy8gaW1wb3J0IFJvbGVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9Sb2xlcyc7XG5pbXBvcnQgSXRlbXMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0l0ZW1zJztcbmltcG9ydCBJdGVtQ2F0ZWdvcmllcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvSXRlbUNhdGVnb3JpZXMnO1xuaW1wb3J0IEFjY291bnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50cyc7XG5pbXBvcnQgQWNjb3VudFR5cGVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50VHlwZXMnO1xuLy8gaW1wb3J0IEFjY291bnRPcGVuaW5nQmFsYW5jZSBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQWNjb3VudE9wZW5pbmdCYWxhbmNlJztcbmltcG9ydCBWaWV3cyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVmlld3MnO1xuLy8gaW1wb3J0IEN1c3RvbUZpZWxkcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRmllbGRzJztcbmltcG9ydCBBY2NvdW50aW5nIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50aW5nJztcbmltcG9ydCBGaW5hbmNpYWxTdGF0ZW1lbnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzJztcbi8vIGltcG9ydCBFeHBlbnNlcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRXhwZW5zZXMnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL09wdGlvbnMnO1xuLy8gaW1wb3J0IEJ1ZGdldCBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQnVkZ2V0Jztcbi8vIGltcG9ydCBCdWRnZXRSZXBvcnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9CdWRnZXRSZXBvcnRzJztcbmltcG9ydCBDdXJyZW5jaWVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9DdXJyZW5jaWVzJztcbi8vIGltcG9ydCBDdXN0b21lcnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0N1c3RvbWVycyc7XG4vLyBpbXBvcnQgU3VwcGxpZXJzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9TdXBwbGllcnMnO1xuLy8gaW1wb3J0IEJpbGxzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9CaWxscyc7XG4vLyBpbXBvcnQgQ3VycmVuY3lBZGp1c3RtZW50IGZyb20gJy4vY29udHJvbGxlcnMvQ3VycmVuY3lBZGp1c3RtZW50JztcbmltcG9ydCBSZXNvdXJjZXMgZnJvbSAnLi9jb250cm9sbGVycy9SZXNvdXJjZXMnO1xuaW1wb3J0IEV4Y2hhbmdlUmF0ZXMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0V4Y2hhbmdlUmF0ZXMnO1xuLy8gaW1wb3J0IFNhbGVzUmVwb3J0cyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvU2FsZXNSZXBvcnRzJztcbi8vIGltcG9ydCBQdXJjaGFzZXNSZXBvcnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9QdXJjaGFzZXNSZXBvcnRzJztcbmltcG9ydCBNZWRpYSBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvTWVkaWEnO1xuaW1wb3J0IEpXVEF1dGggZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvand0QXV0aCc7XG5pbXBvcnQgVGVuYW5jeU1pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IChhcHApID0+IHtcbiAgLy8gYXBwLnVzZSgnL2FwaS9vYXV0aDInLCBPQXV0aDIucm91dGVyKCkpO1xuICBhcHAudXNlKCcvYXBpL2F1dGgnLCBBdXRoZW50aWNhdGlvbi5yb3V0ZXIoKSk7XG4gIGFwcC51c2UoJy9hcGkvaW52aXRlJywgSW52aXRlVXNlcnMucm91dGVyKCkpO1xuXG4gIGNvbnN0IGRhc2hib2FyZCA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgZGFzaGJvYXJkLnVzZShKV1RBdXRoKTtcbiAgZGFzaGJvYXJkLnVzZShUZW5hbmN5TWlkZGxld2FyZSk7XG5cbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS9jdXJyZW5jaWVzJywgQ3VycmVuY2llcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvdXNlcnMnLCBVc2Vycy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvcm9sZXMnLCBSb2xlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudHMnLCBBY2NvdW50cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudF90eXBlcycsIEFjY291bnRUeXBlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudGluZycsIEFjY291bnRpbmcucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2FjY291bnRzX29wZW5pbmdfYmFsYW5jZXMnLCBBY2NvdW50T3BlbmluZ0JhbGFuY2Uucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL3ZpZXdzJywgVmlld3Mucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2ZpZWxkcycsIEN1c3RvbUZpZWxkcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvaXRlbXMnLCBJdGVtcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvaXRlbV9jYXRlZ29yaWVzJywgSXRlbUNhdGVnb3JpZXMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2V4cGVuc2VzJywgRXhwZW5zZXMucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL2ZpbmFuY2lhbF9zdGF0ZW1lbnRzJywgRmluYW5jaWFsU3RhdGVtZW50cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvb3B0aW9ucycsIE9wdGlvbnMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2J1ZGdldF9yZXBvcnRzJywgQnVkZ2V0UmVwb3J0cy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvY3VzdG9tZXJzJywgQ3VzdG9tZXJzLnJvdXRlcigpKTtcbiAgLy8gYXBwLnVzZSgnL2FwaS9zdXBwbGllcnMnLCBTdXBwbGllcnMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2JpbGxzJywgQmlsbHMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2J1ZGdldCcsIEJ1ZGdldC5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvcmVzb3VyY2VzJywgUmVzb3VyY2VzLnJvdXRlcigpKTtcbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS9leGNoYW5nZV9yYXRlcycsIEV4Y2hhbmdlUmF0ZXMucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL21lZGlhJywgTWVkaWEucm91dGVyKCkpO1xuXG4gIGFwcC51c2UoJy8nLCBkYXNoYm9hcmQpOyAgXG4gIC8vIGFwcC51c2UoJy9hcGkvY3VycmVuY3lfYWRqdXN0bWVudCcsIEN1cnJlbmN5QWRqdXN0bWVudC5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvcmVwb3J0cy9zYWxlcycsIFNhbGVzUmVwb3J0cy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvcmVwb3J0cy9wdXJjaGFzZXMnLCBQdXJjaGFzZXNSZXBvcnRzLnJvdXRlcigpKTtcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgVGVuYW50c01hbmFnZXIgZnJvbSAnQC9zeXN0ZW0vVGVuYW50c01hbmFnZXInO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZnVuY3Rpb24gbG9hZE1vZGVsc0Zyb21EaXJlY3RvcnkoKSB7XG4gIGNvbnN0IG1vZGVscyA9IHt9O1xuICBmcy5yZWFkZGlyU3luYygnc3JjL21vZGVscy8nKS5mb3JFYWNoKChmaWxlbmFtZSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0ge1xuICAgICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgJ3NyYy9tb2RlbHMvJywgZmlsZW5hbWUpLFxuICAgICAgbmFtZTogZmlsZW5hbWUucmVwbGFjZSgvXFwuW14vLl0rJC8sICcnKSxcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgIG1vZGVsLnJlc291cmNlID0gcmVxdWlyZShgQC9tb2RlbHMvJHttb2RlbC5uYW1lfWApO1xuICAgIG1vZGVsc1ttb2RlbC5uYW1lXSA9IG1vZGVsO1xuICB9KTtcbiAgcmV0dXJuIG1vZGVscztcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIGNvbnN0IG9yZ2FuaXphdGlvbklkID0gcmVxLmhlYWRlcnNbJ29yZ2FuaXphdGlvbi1pZCddIHx8IHJlcS5xdWVyeS5vcmdhbml6YXRpb247XG4gIGNvbnN0IG5vdEZvdW5kT3JnYW5pemF0aW9uID0gKCkgPT4gcmVzLmJvb20udW5hdXRob3JpemVkKFxuICAgICdPcmdhbml6YXRpb24gaWRlbnRpY2F0aW9uIG5vdCBmb3VuZC4nLFxuICAgIHsgZXJyb3JzOiBbeyB0eXBlOiAnT1JHQU5JWkFUSU9OLklELk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSB9LFxuICApO1xuXG4gIGlmICghb3JnYW5pemF0aW9uSWQpIHtcbiAgICByZXR1cm4gbm90Rm91bmRPcmdhbml6YXRpb24oKTtcbiAgfVxuICBjb25zdCB0ZW5hbnQgPSBhd2FpdCBUZW5hbnRzTWFuYWdlci5nZXRUZW5hbnQob3JnYW5pemF0aW9uSWQpO1xuXG4gIC8vIFdoZW4gdGhlIGdpdmVuIG9yZ2FuaXphdGlvbiBpZCBub3QgZm91bmQgb24gdGhlIHN5c3RlbSBzdG9yYWdlLlxuICBpZiAoIXRlbmFudCkge1xuICAgIHJldHVybiBub3RGb3VuZE9yZ2FuaXphdGlvbigpO1xuICB9XG4gIC8vIFdoZW4gdXNlciB0ZW5hbnQgbm90IG1hdGNoIHRoZSBnaXZlbiBvcmdhbml6YXRpb24gaWQuXG4gIGlmICh0ZW5hbnQuaWQgIT09IHJlcS51c2VyLnRlbmFudElkKSB7XG4gICAgcmV0dXJuIHJlcy5ib29tLnVuYXV0aG9yaXplZCgpO1xuICB9XG4gIGNvbnN0IGtuZXggPSBUZW5hbnRzTWFuYWdlci5rbmV4SW5zdGFuY2Uob3JnYW5pemF0aW9uSWQpO1xuICBjb25zdCBtb2RlbHMgPSBsb2FkTW9kZWxzRnJvbURpcmVjdG9yeSgpO1xuXG4gIFRlbmFudE1vZGVsLmtuZXhCaW5kZWQgPSBrbmV4O1xuXG4gIHJlcS5rbmV4ID0ga25leDtcbiAgcmVxLm9yZ2FuaXphdGlvbklkID0gb3JnYW5pemF0aW9uSWQ7XG4gIHJlcS5tb2RlbHMgPSB7XG4gICAgLi4uT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJlZHVjZSgoYWNjLCBtb2RlbCkgPT4geyAgICAgIFxuICAgICAgaWYgKHR5cGVvZiBtb2RlbC5yZXNvdXJjZS5kZWZhdWx0LnJlcXVlc3RNb2RlbCA9PT0gJ2Z1bmN0aW9uJyAmJiBcbiAgICAgICAgbW9kZWwucmVzb3VyY2UuZGVmYXVsdC5yZXF1ZXN0TW9kZWwoKSAmJlxuICAgICAgICBtb2RlbC5uYW1lICE9PSAnVGVuYW50TW9kZWwnKSB7XG4gICAgICAgIGFjY1ttb2RlbC5uYW1lXSA9IG1vZGVsLnJlc291cmNlLmRlZmF1bHQuYmluZEtuZXgoa25leCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KSxcbiAgfTtcbiAgbmV4dCgpO1xufTsiLCJjb25zdCBhc3luY01pZGRsZXdhcmUgPSAoZm4pID0+IChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICBQcm9taXNlLnJlc29sdmUoZm4ocmVxLCByZXMsIG5leHQpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmNNaWRkbGV3YXJlO1xuIiwiLyogZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCBTeXN0ZW1Vc2VyIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Vc2VyJztcblxuY29uc3QgYXV0aE1pZGRsZXdhcmUgPSAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgY29uc3QgeyBKV1RfU0VDUkVUX0tFWSB9ID0gcHJvY2Vzcy5lbnY7XG4gIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcnNbJ3gtYWNjZXNzLXRva2VuJ10gfHwgcmVxLnF1ZXJ5LnRva2VuO1xuXG4gIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7IHJlcy5ib29tLnVuYXV0aG9yaXplZCgpOyB9O1xuXG4gIGlmICghdG9rZW4pIHsgcmV0dXJuIG9uRXJyb3IoKTsgfVxuXG4gIGNvbnN0IHZlcmlmeSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBqd3QudmVyaWZ5KHRva2VuLCBKV1RfU0VDUkVUX0tFWSwgYXN5bmMgKGVycm9yLCBkZWNvZGVkKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICByZXEudXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKS5maW5kQnlJZChkZWNvZGVkLl9pZCk7XG5cbiAgICAgICAgaWYgKCFyZXEudXNlcikge1xuICAgICAgICAgIHJldHVybiBvbkVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkZWNvZGVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdmVyaWZ5LnRoZW4oKCkgPT4geyBuZXh0KCk7IH0pLmNhdGNoKG9uRXJyb3IpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGF1dGhNaWRkbGV3YXJlO1xuIiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5pbXBvcnQgQ2FjaGVTZXJ2aWNlIGZyb20gJ0Avc2VydmljZXMvQ2FjaGUnO1xuXG5leHBvcnQgZGVmYXVsdCAoTW9kZWwpID0+IHtcbiAgcmV0dXJuIGNsYXNzIENhY2hhYmxlTW9kZWwgZXh0ZW5kcyBNb2RlbHtcbiAgICBzdGF0aWMgZmx1c2hDYWNoZShrZXkpIHtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRoaXMubmFtZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBDYWNoZVNlcnZpY2UuZGVsKGAke21vZGVsTmFtZX0uJHtrZXl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDYWNoZVNlcnZpY2UuZGVsU3RhcnRXaXRoKG1vZGVsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSAiLCJpbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IENhY2hlU2VydmljZSBmcm9tICdAL3NlcnZpY2VzL0NhY2hlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZXh0ZW5kcyBRdWVyeUJ1aWxkZXJ7XG5cbiAgYXN5bmMgdGhlbiguLi5hcmdzKSB7XG4gICAgLy8gRmx1c2ggbW9kZWwgY2FjaGUgYWZ0ZXIgaW5zZXJ0LCBkZWxldGUgb3IgdXBkYXRlIHRyYW5zYWN0aW9uLlxuICAgIGlmICh0aGlzLmlzSW5zZXJ0KCkgfHwgdGhpcy5pc0RlbGV0ZSgpIHx8IHRoaXMuaXNVcGRhdGUoKSkge1xuICAgICAgdGhpcy5tb2RlbENsYXNzKCkuZmx1c2hDYWNoZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYWNoZVRhZyAmJiB0aGlzLmlzRmluZCgpKSB7XG4gICAgICB0aGlzLnNldENhY2hlS2V5KCk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRPclN0b3JlQ2FjaGUoKS50aGVuKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5leGVjdXRlKCk7XG4gICAgXG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgdGhpcy5zZXRDYWNoZShyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkudGhlbiguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBnZXRPclN0b3JlQ2FjaGUoKSB7XG4gICAgY29uc3Qgc3RvcmVGdW5jdGlvbiA9ICgpID0+IHRoaXMuZXhlY3V0ZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIENhY2hlU2VydmljZS5nZXQodGhpcy5jYWNoZUtleSwgc3RvcmVGdW5jdGlvbilcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4geyByZXNvbHZlKHJlc3VsdCk7IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0Q2FjaGUocmVzdWx0cykge1xuICAgIENhY2hlU2VydmljZS5zZXQoYCR7dGhpcy5jYWNoZUtleX1gLCByZXN1bHRzLCB0aGlzLmNhY2hlU2Vjb25kcyk7XG4gIH1cblxuICBnZW5lcmF0ZUNhY2hlS2V5KCkge1xuICAgIGNvbnN0IGtuZXhTcWwgPSB0aGlzLnRvS25leFF1ZXJ5KCkudG9TUUwoKTtcbiAgICBjb25zdCBoYXNoZWRRdWVyeSA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoa25leFNxbC5zcWwpLmRpZ2VzdChcImhleFwiKTtcblxuICAgIHJldHVybiBoYXNoZWRRdWVyeTtcbiAgfVxuXG4gIHJlbWVtYmVyKGtleSwgc2Vjb25kcykge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRoaXMubW9kZWxDbGFzcygpLm5hbWU7XG5cbiAgICB0aGlzLmNhY2hlU2Vjb25kcyA9IHNlY29uZHM7XG4gICAgdGhpcy5jYWNoZVRhZyA9IChrZXkpID8gYCR7bW9kZWxOYW1lfS4ke2tleX1gIDogbW9kZWxOYW1lO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aXRoR3JhcGhGZXRjaGVkKHJlbGF0aW9uLCBzZXR0aW5ncykge1xuICAgIGlmICghdGhpcy5ncmFwaEFwcGVuZHMpIHtcbiAgICAgIHRoaXMuZ3JhcGhBcHBlbmRzID0gW3JlbGF0aW9uXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmFwaEFwcGVuZHMucHVzaChyZWxhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci53aXRoR3JhcGhGZXRjaGVkKHJlbGF0aW9uLCBzZXR0aW5ncyk7XG4gIH1cblxuICBzZXRDYWNoZUtleSgpIHtcbiAgICBjb25zdCBoYXNoZWRRdWVyeSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleSgpO1xuICAgIGNvbnN0IGFwcGVuZHMgPSAodGhpcy5ncmFwaEFwcGVuZHMgfHwgW10pLmpvaW4odGhpcy5ncmFwaEFwcGVuZHMsICcsJyk7XG5cbiAgICB0aGlzLmNhY2hlS2V5ID0gYCR7dGhpcy5jYWNoZVRhZ30uJHtoYXNoZWRRdWVyeX0uJHthcHBlbmRzfWA7XG4gIH1cbn0iLCIvKipcbiAqIEEgc2ltcGxlIGRlcGVuZGVuY3kgZ3JhcGhcbiAqL1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSBUb3BvbG9naWNhbCBTb3J0IHVzaW5nIERlcHRoLUZpcnN0LVNlYXJjaCBvbiBhIHNldCBvZiBlZGdlcy5cbiAqXG4gKiBEZXRlY3RzIGN5Y2xlcyBhbmQgdGhyb3dzIGFuIEVycm9yIGlmIG9uZSBpcyBkZXRlY3RlZCAodW5sZXNzIHRoZSBcImNpcmN1bGFyXCJcbiAqIHBhcmFtZXRlciBpcyBcInRydWVcIiBpbiB3aGljaCBjYXNlIGl0IGlnbm9yZXMgdGhlbSkuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gY2lyY3VsYXIgQSBib29sZWFuIHRvIGFsbG93IGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBjcmVhdGVERlMoZWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCwgY2lyY3VsYXIpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0KSB7XG4gICAgaWYgKHZpc2l0ZWRbc3RhcnRdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpbkN1cnJlbnRQYXRoID0ge307XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gW107XG4gICAgdmFyIHRvZG8gPSBbXTsgLy8gdXNlZCBhcyBhIHN0YWNrXG4gICAgdG9kby5wdXNoKHsgbm9kZTogc3RhcnQsIHByb2Nlc3NlZDogZmFsc2UgfSk7XG4gICAgd2hpbGUgKHRvZG8ubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSB0b2RvW3RvZG8ubGVuZ3RoIC0gMV07IC8vIHBlZWsgYXQgdGhlIHRvZG8gc3RhY2tcbiAgICAgIHZhciBwcm9jZXNzZWQgPSBjdXJyZW50LnByb2Nlc3NlZDtcbiAgICAgIHZhciBub2RlID0gY3VycmVudC5ub2RlO1xuICAgICAgaWYgKCFwcm9jZXNzZWQpIHtcbiAgICAgICAgLy8gSGF2ZW4ndCB2aXNpdGVkIGVkZ2VzIHlldCAodmlzaXRpbmcgcGhhc2UpXG4gICAgICAgIGlmICh2aXNpdGVkW25vZGVdKSB7XG4gICAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChpbkN1cnJlbnRQYXRoW25vZGVdKSB7XG4gICAgICAgICAgLy8gSXQncyBub3QgYSBEQUdcbiAgICAgICAgICBpZiAoY2lyY3VsYXIpIHtcbiAgICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSB0b2xlcmF0aW5nIGN5Y2xlcywgZG9uJ3QgcmV2aXNpdCB0aGUgbm9kZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgICAgdGhyb3cgbmV3IERlcEdyYXBoQ3ljbGVFcnJvcihjdXJyZW50UGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbkN1cnJlbnRQYXRoW25vZGVdID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudFBhdGgucHVzaChub2RlKTtcbiAgICAgICAgdmFyIG5vZGVFZGdlcyA9IGVkZ2VzW25vZGVdO1xuICAgICAgICAvLyAocHVzaCBlZGdlcyBvbnRvIHRoZSB0b2RvIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIgdG8gYmUgb3JkZXItY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgREZTIGltcGxlbWVudGF0aW9uKVxuICAgICAgICBmb3IgKHZhciBpID0gbm9kZUVkZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdG9kby5wdXNoKHsgbm9kZTogbm9kZUVkZ2VzW2ldLCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQucHJvY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhdmUgdmlzaXRlZCBlZGdlcyAoc3RhY2sgdW5yb2xsaW5nIHBoYXNlKVxuICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICBjdXJyZW50UGF0aC5wb3AoKTtcbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IGZhbHNlO1xuICAgICAgICB2aXNpdGVkW25vZGVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFsZWF2ZXNPbmx5IHx8IGVkZ2VzW25vZGVdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBEZXBlbmRlbmN5IEdyYXBoXG4gKi9cbnZhciBEZXBHcmFwaCA9IChEZXBHcmFwaCA9IGZ1bmN0aW9uIERlcEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5ub2RlcyA9IHt9OyAvLyBOb2RlIC0+IE5vZGUvRGF0YSAodHJlYXRlZCBsaWtlIGEgU2V0KVxuICB0aGlzLm91dGdvaW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kZW5jeSBOb2RlXVxuICB0aGlzLmluY29taW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kYW50IE5vZGVdXG4gIHRoaXMuY2lyY3VsYXIgPSBvcHRzICYmICEhb3B0cy5jaXJjdWxhcjsgLy8gQWxsb3dzIGNpcmN1bGFyIGRlcHNcbn0pO1xuXG5EZXBHcmFwaC5mcm9tQXJyYXkgPSAoaXRlbXMsIG9wdGlvbnMgPSB7IGl0ZW1JZDogJ2lkJywgcGFyZW50SXRlbUlkOiAncGFyZW50X2lkJyB9KSA9PiB7XG4gY29uc3QgZGVwR3JhcGggPSBuZXcgRGVwR3JhcGgoKTtcblxuIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgIGRlcEdyYXBoLmFkZE5vZGUoaXRlbVtvcHRpb25zLml0ZW1JZF0sIGl0ZW0pO1xuIH0pO1xuIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgaWYgKGl0ZW1bb3B0aW9ucy5wYXJlbnRJdGVtSWRdKSB7XG4gICAgZGVwR3JhcGguYWRkRGVwZW5kZW5jeShpdGVtW29wdGlvbnMucGFyZW50SXRlbUlkXSwgaXRlbVtvcHRpb25zLml0ZW1JZF0pO1xuICB9XG4gfSk7XG4gcmV0dXJuIGRlcEdyYXBoO1xufVxuXG5EZXBHcmFwaC5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC5cbiAgICovXG4gIHNpemU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5sZW5ndGg7XG4gIH0sXG4gIC8qKlxuICAgKiBBZGQgYSBub2RlIHRvIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIGFkZE5vZGU6IGZ1bmN0aW9uKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGFyZ3VtZW50cyBsZW5ndGggYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhIG5vZGUgd2l0aCB1bmRlZmluZWQgZGF0YVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gbm9kZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdID0gW107XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICBkZWxldGUgdGhpcy5ub2Rlc1tub2RlXTtcbiAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdO1xuICAgICAgW3RoaXMuaW5jb21pbmdFZGdlcywgdGhpcy5vdXRnb2luZ0VkZ2VzXS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2VMaXN0KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGVkZ2VMaXN0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBlZGdlTGlzdFtrZXldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgZXhpc3RzIGluIHRoZSBncmFwaFxuICAgKi9cbiAgaGFzTm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzLmhhc093blByb3BlcnR5KG5vZGUpO1xuICB9LFxuICAvKipcbiAgICogR2V0IHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIG5vZGUgbmFtZVxuICAgKi9cbiAgZ2V0Tm9kZURhdGE6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1tub2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYXNzb2NpYXRlZCBkYXRhIGZvciBhIGdpdmVuIG5vZGUgbmFtZS4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIHNldE5vZGVEYXRhOiBmdW5jdGlvbihub2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQWRkIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy4gSWYgZWl0aGVyIG9mIHRoZSBub2RlcyBkb2VzIG5vdCBleGlzdCxcbiAgICogYW4gRXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICBhZGREZXBlbmRlbmN5OiBmdW5jdGlvbihmcm9tLCB0bykge1xuICAgIGlmICghdGhpcy5oYXNOb2RlKGZyb20pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIGZyb20pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgdG8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pID09PSAtMSkge1xuICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLnB1c2godG8pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pID09PSAtMSkge1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5wdXNoKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZSBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuXG4gICAqL1xuICByZW1vdmVEZXBlbmRlbmN5OiBmdW5jdGlvbihmcm9tLCB0bykge1xuICAgIHZhciBpZHg7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgaWR4ID0gdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgaWR4ID0gdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGFueSBjdXN0b20gZGF0YSBpcyBhdHRhY2hlZFxuICAgKiB0byB0aGUgbm9kZXMsIGl0IHdpbGwgb25seSBiZSBzaGFsbG93IGNvcGllZC5cbiAgICovXG4gIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc291cmNlID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IERlcEdyYXBoKCk7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2Uubm9kZXMpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICByZXN1bHQubm9kZXNbbl0gPSBzb3VyY2Uubm9kZXNbbl07XG4gICAgICByZXN1bHQub3V0Z29pbmdFZGdlc1tuXSA9IHNvdXJjZS5vdXRnb2luZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LmluY29taW5nRWRnZXNbbl0gPSBzb3VyY2UuaW5jb21pbmdFZGdlc1tuXS5zbGljZSgwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGRlcGVuZHMgb24gKHRyYW5zaXRpdmVseSkuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUsIG9yIHRoZSBzcGVjaWZpZWQgbm9kZSBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBub2RlcyB3aWxsIGJlIHJldHVybmVkXG4gICAqIGluIHRoZSBhcnJheS5cbiAgICovXG4gIGRlcGVuZGVuY2llc09mOiBmdW5jdGlvbihub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYW55IGRlcGVuZGFudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uKG5vZGUsIGxlYXZlc09ubHkpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLmluY29taW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIERGUyhub2RlKTtcbiAgICAgIHZhciBpZHggPSByZXN1bHQuaW5kZXhPZihub2RlKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIENvbnN0cnVjdCB0aGUgb3ZlcmFsbCBwcm9jZXNzaW5nIG9yZGVyIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZS5cbiAgICpcbiAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBub2RlcyB3aWxsIGJlIHJldHVybmVkLlxuICAgKi9cbiAgb3ZlcmFsbE9yZGVyOiBmdW5jdGlvbihsZWF2ZXNPbmx5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDsgLy8gRW1wdHkgZ3JhcGhcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmNpcmN1bGFyKSB7XG4gICAgICAgIC8vIExvb2sgZm9yIGN5Y2xlcyAtIHdlIHJ1biB0aGUgREZTIHN0YXJ0aW5nIGF0IGFsbCB0aGUgbm9kZXMgaW4gY2FzZSB0aGVyZVxuICAgICAgICAvLyBhcmUgc2V2ZXJhbCBkaXNjb25uZWN0ZWQgc3ViZ3JhcGhzIGluc2lkZSB0aGlzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICAgIHZhciBDeWNsZURGUyA9IGNyZWF0ZURGUyh0aGlzLm91dGdvaW5nRWRnZXMsIGZhbHNlLCBbXSwgdGhpcy5jaXJjdWxhcik7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICAgICAgQ3ljbGVERlMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIC8vIEZpbmQgYWxsIHBvdGVudGlhbCBzdGFydGluZyBwb2ludHMgKG5vZGVzIHdpdGggbm90aGluZyBkZXBlbmRpbmcgb24gdGhlbSkgYW5cbiAgICAgIC8vIHJ1biBhIERGUyBzdGFydGluZyBhdCB0aGVzZSBwb2ludHMgdG8gZ2V0IHRoZSBvcmRlclxuICAgICAga2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5pbmNvbWluZ0VkZ2VzW25vZGVdLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgICAgIERGUyhuKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHdlJ3JlIGFsbG93aW5nIGN5Y2xlcyAtIHdlIG5lZWQgdG8gcnVuIHRoZSBERlMgYWdhaW5zdCBhbnkgcmVtYWluaW5nXG4gICAgICAvLyBub2RlcyB0aGF0IGRpZCBub3QgZW5kIHVwIGluIHRoZSBpbml0aWFsIHJlc3VsdCAoYXMgdGhleSBhcmUgcGFydCBvZiBhXG4gICAgICAvLyBzdWJncmFwaCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjbGVhciBzdGFydGluZyBwb2ludClcbiAgICAgIGlmICh0aGlzLmNpcmN1bGFyKSB7XG4gICAgICAgIGtleXNcbiAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXhPZihub2RlKSA9PT0gLTE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICAgICAgICBERlMobik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LFxuXG4gIG1hcE5vZGVzKG1hcHBlcikge1xuXG4gIH1cbn07XG5cbi8qKlxuICogQ3ljbGUgZXJyb3IsIGluY2x1ZGluZyB0aGUgcGF0aCBvZiB0aGUgY3ljbGUuXG4gKi9cbnZhciBEZXBHcmFwaEN5Y2xlRXJyb3IgPSAoZXhwb3J0cy5EZXBHcmFwaEN5Y2xlRXJyb3IgPSBmdW5jdGlvbihjeWNsZVBhdGgpIHtcbiAgdmFyIG1lc3NhZ2UgPSBcIkRlcGVuZGVuY3kgQ3ljbGUgRm91bmQ6IFwiICsgY3ljbGVQYXRoLmpvaW4oXCIgLT4gXCIpO1xuICB2YXIgaW5zdGFuY2UgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGluc3RhbmNlLmN5Y2xlUGF0aCA9IGN5Y2xlUGF0aDtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGluc3RhbmNlLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShpbnN0YW5jZSwgRGVwR3JhcGhDeWNsZUVycm9yKTtcbiAgfVxuICByZXR1cm4gaW5zdGFuY2U7XG59KTtcbkRlcEdyYXBoQ3ljbGVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3Rvcjoge1xuICAgIHZhbHVlOiBFcnJvcixcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoRGVwR3JhcGhDeWNsZUVycm9yLCBFcnJvcik7XG5cbmV4cG9ydCBkZWZhdWx0IERlcEdyYXBoOyIsImltcG9ydCB7IHVuaXFCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBidWlsZEZpbHRlclJvbGVzSm9pbnMsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeW5hbWljRmlsdGVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhYmxlTmFtZSkge1xuICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lO1xuICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7Kn0gZmlsdGVyUm9sZSAtXG4gICAqL1xuICBzZXRGaWx0ZXIoZmlsdGVyUm9sZSkge1xuICAgIGZpbHRlclJvbGUuc2V0VGFibGVOYW1lKHRoaXMudGFibGVOYW1lKTtcbiAgICB0aGlzLmZpbHRlcnMucHVzaChmaWx0ZXJSb2xlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgcXVlcmllcyBvZiBmaWx0ZXIgcm9sZXMuXG4gICAqL1xuICBidWlsZFF1ZXJ5KCkge1xuICAgIGNvbnN0IGJ1aWxkZXJzQ2FsbGJhY2tzID0gW107XG4gICAgY29uc3QgdGFibGVDb2x1bW5zID0gW107XG5cbiAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICBjb25zdCB7IGZpbHRlclJvbGVzIH0gPSBmaWx0ZXI7XG4gICAgICBidWlsZGVyc0NhbGxiYWNrcy5wdXNoKGZpbHRlci5idWlsZFF1ZXJ5KCkpO1xuICAgICAgdGFibGVDb2x1bW5zLnB1c2goLi4uKEFycmF5LmlzQXJyYXkoZmlsdGVyUm9sZXMpKSA/IGZpbHRlclJvbGVzIDogW2ZpbHRlclJvbGVzXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICBidWlsZGVyc0NhbGxiYWNrcy5mb3JFYWNoKChidWlsZGVyQ2FsbGJhY2spID0+IHtcbiAgICAgICAgYnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpO1xuICAgICAgfSk7XG4gICAgICBidWlsZEZpbHRlclJvbGVzSm9pbnModGhpcy50YWJsZU5hbWUsIHVuaXFCeSh0YWJsZUNvbHVtbnMsICdjb2x1bW5LZXknKSkoYnVpbGRlcik7XG4gICAgfTtcbiAgfVxufSIsImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IER5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3RvciBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3Rvcic7XG5pbXBvcnQge1xuICBidWlsZEZpbHRlclF1ZXJ5LFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsdGVyUm9sZXMgZXh0ZW5kcyBEeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJSb2xlcyAtXG4gICAqIEBwYXJhbSB7QXJyYXl9IHJlc291cmNlRmllbGRzIC1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbHRlclJvbGVzLCByZXNvdXJjZUZpZWxkcykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmZpbHRlclJvbGVzID0gZmlsdGVyUm9sZXMubWFwKChyb2xlLCBpbmRleCkgPT4gKHtcbiAgICAgIC4uLnJvbGUsXG4gICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgY29sdW1uS2V5OiByb2xlLmZpZWxkX2tleSxcbiAgICAgIGNvbmRpdGlvbjogcm9sZS5jb21wYXJhdG9yID09PSAnQU5EJyA/ICcmJicgOiAnfHwnLFxuICAgIH0pKTtcbiAgICB0aGlzLnJlc291cmNlRmllbGRzID0gcmVzb3VyY2VGaWVsZHM7XG4gIH1cblxuICB2YWxpZGF0ZUZpbHRlclJvbGVzKCkge1xuICAgIGNvbnN0IGZpbHRlckZpZWxkc0tleXMgPSB0aGlzLmZpbHRlclJvbGVzLm1hcCgocikgPT4gci5maWVsZF9rZXkpO1xuICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5cyA9IHRoaXMucmVzb3VyY2VGaWVsZHMubWFwKChyKSA9PiByLmtleSk7XG5cbiAgICByZXR1cm4gZGlmZmVyZW5jZShmaWx0ZXJGaWVsZHNLZXlzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuICB9XG5cbiAgLy8gQHByaXZhdGVcbiAgYnVpbGRMb2dpY0V4cHJlc3Npb24oKSB7XG4gICAgbGV0IGV4cHJlc3Npb24gPSAnJztcbiAgICB0aGlzLmZpbHRlclJvbGVzLmZvckVhY2goKHJvbGUsIGluZGV4KSA9PiB7XG4gICAgICBleHByZXNzaW9uICs9IChpbmRleCA9PT0gMClcbiAgICAgICAgPyBgJHtyb2xlLmluZGV4fSBgIDogYCR7cm9sZS5jb25kaXRpb259ICR7cm9sZS5pbmRleH0gYDtcbiAgICB9KTtcbiAgICByZXR1cm4gZXhwcmVzc2lvbi50cmltKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGRhdGFiYXNlIHF1ZXJ5IG9mIHZpZXcgcm9sZXMuXG4gICAqL1xuICBidWlsZFF1ZXJ5KCkge1xuICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbG9naWNFeHByZXNzaW9uID0gdGhpcy5idWlsZExvZ2ljRXhwcmVzc2lvbigpO1xuICAgICAgYnVpbGRGaWx0ZXJRdWVyeSh0aGlzLnRhYmxlTmFtZSwgdGhpcy5maWx0ZXJSb2xlcywgbG9naWNFeHByZXNzaW9uKShidWlsZGVyKTtcbiAgICB9O1xuICB9XG59IiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEeW5hbWljRmlsdGVyQWJzdHJ1Y3RvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZmlsdGVyUm9sZXMgPSBbXTtcbiAgICB0aGlzLnRhYmxlTmFtZSA9ICcnO1xuICB9XG5cbiAgc2V0VGFibGVOYW1lKHRhYmxlTmFtZSkge1xuICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIGJ1aWxkTG9naWNFeHByZXNzaW9uKCkge31cblxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgdmFsaWRhdGVGaWx0ZXJSb2xlcygpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIGJ1aWxkUXVlcnkoKSB7fVxufSIsImltcG9ydCBEeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3IgZnJvbSAnQC9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3InO1xuaW1wb3J0IHtcbiAgZ2V0Um9sZUZpZWxkQ29sdW1uLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZpbHRlclNvcnRCeSBleHRlbmRzIER5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3RvciB7XG5cbiAgY29uc3RydWN0b3Ioc29ydEJ5RmllbGRLZXksIHNvcnREaXJlY3Rpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5maWx0ZXJSb2xlcyA9IHtcbiAgICAgIGNvbHVtbktleTogc29ydEJ5RmllbGRLZXksXG4gICAgICB2YWx1ZTogc29ydERpcmVjdGlvbixcbiAgICAgIGNvbXBhcmF0b3I6ICdzb3J0X2J5JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBvZiBzb3J0IGJ5IGNvbHVtbiBvbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHsgXG4gICAgY29uc3QgeyBjb2x1bW5LZXkgPSBudWxsLCB2YWx1ZSA9IG51bGwgfSA9IHRoaXMuZmlsdGVyUm9sZXM7XG5cbiAgICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkUmVsYXRpb24gPSBnZXRSb2xlRmllbGRDb2x1bW4odGhpcy50YWJsZU5hbWUsIGNvbHVtbktleSk7XG4gICAgICBpZiAoY29sdW1uS2V5KSB7XG4gICAgICAgIGJ1aWxkZXIub3JkZXJCeShgJHt0aGlzLnRhYmxlTmFtZX0uJHtmaWVsZFJlbGF0aW9uLmNvbHVtbn1gLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yIGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlVmlld1JvbGVzLFxuICBidWlsZEZpbHRlclF1ZXJ5LFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZpbHRlclZpZXdzIGV4dGVuZHMgRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICogQHBhcmFtIHsqfSBmaWx0ZXJSb2xlcyAtXG4gICAqIEBwYXJhbSB7Kn0gbG9naWNFeHByZXNzaW9uIC1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbHRlclJvbGVzLCBsb2dpY0V4cHJlc3Npb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5maWx0ZXJSb2xlcyA9IGZpbHRlclJvbGVzO1xuICAgIHRoaXMubG9naWNFeHByZXNzaW9uID0gbG9naWNFeHByZXNzaW9uXG4gICAgICAucmVwbGFjZSgnQU5EJywgJyYmJylcbiAgICAgIC5yZXBsYWNlKCdPUicsICd8fCcpO1xuXG4gICAgdGhpcy50YWJsZU5hbWUgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBsb2dpYyBleHByZXNzaW9uLlxuICAgKi9cbiAgYnVpbGRMb2dpY0V4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubG9naWNFeHByZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBmaWx0ZXIgcm9sZXMuXG4gICAqL1xuICB2YWxpZGF0ZUZpbHRlclJvbGVzKCkge1xuICAgIHJldHVybiB2YWxpZGF0ZVZpZXdSb2xlcyh0aGlzLmZpbHRlclJvbGVzLCB0aGlzLmxvZ2ljRXhwcmVzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGRhdGFiYXNlIHF1ZXJ5IG9mIHZpZXcgcm9sZXMuXG4gICAqL1xuICBidWlsZFF1ZXJ5KCkge1xuICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgYnVpbGRGaWx0ZXJRdWVyeSh0aGlzLnRhYmxlTmFtZSwgdGhpcy5maWx0ZXJSb2xlcywgdGhpcy5sb2dpY0V4cHJlc3Npb24pKGJ1aWxkZXIpO1xuICAgIH07XG4gIH1cbn0iLCJcblxuaW1wb3J0IER5bmFtaWNGaWx0ZXIgZnJvbSAnLi9EeW5hbWljRmlsdGVyJztcbmltcG9ydCBEeW5hbWljRmlsdGVyU29ydEJ5IGZyb20gJy4vRHluYW1pY0ZpbHRlclNvcnRCeSc7XG5pbXBvcnQgRHluYW1pY0ZpbHRlclZpZXdzIGZyb20gJy4vRHluYW1pY0ZpbHRlclZpZXdzJztcbmltcG9ydCBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMgZnJvbSAnLi9EeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMnO1xuXG5leHBvcnQge1xuICBEeW5hbWljRmlsdGVyLFxuICBEeW5hbWljRmlsdGVyU29ydEJ5LFxuICBEeW5hbWljRmlsdGVyVmlld3MsXG4gIER5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcyxcbn07IiwiXG5jb25zdCBPcGVyYXRpb25UeXBlID0ge1xuICBMT0dJQzogJ0xPR0lDJyxcbiAgU1RSSU5HOiAnU1RSSU5HJyxcbiAgQ09NUEFSSVNPTjogJ0NPTVBBUklTT04nLFxuICBNQVRIOiAnTUFUSCcsXG59O1xuXG5leHBvcnQgY2xhc3MgTGV4ZXIge1xuICAvLyBvcGVyYXRpb24gdGFibGVcbiAgc3RhdGljIGdldCBvcHRhYmxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnPSc6IE9wZXJhdGlvblR5cGUuTE9HSUMsXG4gICAgICAnJic6IE9wZXJhdGlvblR5cGUuTE9HSUMsXG4gICAgICAnfCc6IE9wZXJhdGlvblR5cGUuTE9HSUMsXG4gICAgICAnPyc6IE9wZXJhdGlvblR5cGUuTE9HSUMsXG4gICAgICAnOic6IE9wZXJhdGlvblR5cGUuTE9HSUMsXG5cbiAgICAgICdcXCcnOiBPcGVyYXRpb25UeXBlLlNUUklORyxcbiAgICAgICdcIic6IE9wZXJhdGlvblR5cGUuU1RSSU5HLFxuXG4gICAgICAnISc6IE9wZXJhdGlvblR5cGUuQ09NUEFSSVNPTixcbiAgICAgICc+JzogT3BlcmF0aW9uVHlwZS5DT01QQVJJU09OLFxuICAgICAgJzwnOiBPcGVyYXRpb25UeXBlLkNPTVBBUklTT04sXG5cbiAgICAgICcoJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgICAgJyknOiBPcGVyYXRpb25UeXBlLk1BVEgsXG4gICAgICAnKyc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICAgICctJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgICAgJyonOiBPcGVyYXRpb25UeXBlLk1BVEgsXG4gICAgICAnLyc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICAgICclJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIHsqfSBleHByZXNzaW9uIC1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGV4cHJlc3Npb24pIHtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5pbnB1dCA9IGV4cHJlc3Npb247XG4gICAgdGhpcy50b2tlbkxpc3QgPSBbXTtcbiAgfVxuXG4gIGdldFRva2VucygpIHtcbiAgICBsZXQgdG9rO1xuICAgIGRvIHtcbiAgICAgIC8vIHJlYWQgY3VycmVudCB0b2tlbiwgc28gc3RlcCBzaG91bGQgYmUgLTFcbiAgICAgIHRvayA9IHRoaXMucGlja05leHQoLTEpO1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5jdXJyZW50SW5kZXg7XG4gICAgICBzd2l0Y2ggKExleGVyLm9wdGFibGVbdG9rXSkge1xuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuTE9HSUM6XG4gICAgICAgICAgLy8gPT0gJiYgfHwgPT09XG4gICAgICAgICAgdGhpcy5yZWFkTG9naWNPcHQodG9rKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuU1RSSU5HOlxuICAgICAgICAgIHRoaXMucmVhZFN0cmluZyh0b2spO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5DT01QQVJJU09OOlxuICAgICAgICAgIHRoaXMucmVhZENvbXBhcmUodG9rKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuTUFUSDpcbiAgICAgICAgICB0aGlzLnJlY2VpdmVUb2tlbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZWFkVmFsdWUodG9rKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHBvcyBub3QgY2hhbmdlZCwgdGhpcyBsb29wIHdpbGwgZ28gaW50byBhIGluZmluaXRlIGxvb3AsIGV2ZXJ5IHN0ZXAgb2Ygd2hpbGUgbG9vcCxcbiAgICAgIC8vIHdlIG11c3QgbW92ZSB0aGUgcG9zIGZvcndhcmRcbiAgICAgIC8vIHNvIGhlcmUgd2Ugc2hvdWxkIHRocm93IGVycm9yLCBmb3IgZXhhbXBsZSBgMSAmIDJgXG4gICAgICBpZiAocG9zID09PSB0aGlzLmN1cnJlbnRJbmRleCAmJiB0b2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYHVua29udyB0b2tlbiAke3Rva30gZnJvbSBpbnB1dCBzdHJpbmcgJHt0aGlzLmlucHV0fWApO1xuICAgICAgICBlcnIubmFtZSA9ICdVbmtub3dUb2tlbic7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0b2sgIT09IHVuZGVmaW5lZClcblxuICAgIHJldHVybiB0aGlzLnRva2VuTGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFkIG5leHQgdG9rZW4sIHRoZSBpbmRleCBwYXJhbSBjYW4gc2V0IG5leHQgc3RlcCwgZGVmYXVsdCBnbyBmb3dhcmQgMSBzdGVwXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCBuZXh0IHBvc3Rpb25cbiAgICovXG4gIHBpY2tOZXh0KGluZGV4ID0gMCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0W2luZGV4ICsgdGhpcy5jdXJyZW50SW5kZXggKyAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0b2tlbiBpbnRvIHJlc3VsdCB0b2tlbkxpc3QsIGFuZCBtb3ZlIHRoZSBwb3MgaW5kZXhcbiAgICpcbiAgICogQHBhcmFtIGluZGV4XG4gICAqL1xuICByZWNlaXZlVG9rZW4oaW5kZXggPSAxKSB7XG4gICAgY29uc3QgdG9rID0gdGhpcy5pbnB1dC5zbGljZSh0aGlzLmN1cnJlbnRJbmRleCwgdGhpcy5jdXJyZW50SW5kZXggKyBpbmRleCkudHJpbSgpO1xuICAgIC8vIHNraXAgZW1wdHkgc3RyaW5nXG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbkxpc3QucHVzaCh0b2spO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudEluZGV4ICs9IGluZGV4O1xuICB9XG5cbiAgLy8gJyBvciBcIlxuICByZWFkU3RyaW5nKHRvaykge1xuICAgIGxldCBuZXh0O1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgZG8ge1xuICAgICAgbmV4dCA9IHRoaXMucGlja05leHQoaW5kZXgpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICB9IHdoaWxlIChuZXh0ICE9PSB0b2sgJiYgbmV4dCAhPT0gdW5kZWZpbmVkKTtcbiAgICB0aGlzLnJlY2VpdmVUb2tlbihpbmRleCArIDEpO1xuICB9XG5cbiAgLy8gPiBvciA8IG9yID49IG9yIDw9IG9yICE9PVxuICAvLyB0b2sgaW4gKD4sIDwsICEpXG4gIHJlYWRDb21wYXJlKHRvaykge1xuICAgIGlmICh0aGlzLnBpY2tOZXh0KCkgIT09ICc9Jykge1xuICAgICAgdGhpcy5yZWNlaXZlVG9rZW4oMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vICE9PVxuICAgIGlmICh0b2sgPT09ICchJyAmJiB0aGlzLnBpY2tOZXh0KDEpID09PSAnPScpIHtcbiAgICAgIHRoaXMucmVjZWl2ZVRva2VuKDMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlY2VpdmVUb2tlbigyKTtcbiAgfVxuXG4gIC8vID09PSBvciA9PVxuICAvLyAmJiB8fFxuICByZWFkTG9naWNPcHQodG9rKSB7XG4gICAgaWYgKHRoaXMucGlja05leHQoKSA9PT0gdG9rKSB7XG4gICAgICAvLyA9PT1cbiAgICAgIGlmICh0b2sgPT09ICc9JyAmJiB0aGlzLnBpY2tOZXh0KDEpID09PSB0b2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjZWl2ZVRva2VuKDMpO1xuICAgICAgfVxuICAgICAgLy8gPT0gJiYgfHxcbiAgICAgIHJldHVybiB0aGlzLnJlY2VpdmVUb2tlbigyKTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIGFzICYmXG4gICAgLy8gYSA/IGIgOiBjIGlzIGVxdWFsIHRvIGEgJiYgYiB8fCBjXG4gICAgaWYgKHRvayA9PT0gJz8nIHx8IHRvayA9PT0gJzonKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWNlaXZlVG9rZW4oMSk7XG4gICAgfVxuICB9XG5cbiAgcmVhZFZhbHVlKHRvaykge1xuICAgIGlmICghdG9rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoIUxleGVyLm9wdGFibGVbdG9rXSAmJiB0b2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdG9rID0gdGhpcy5waWNrTmV4dChpbmRleCk7XG4gICAgICBpbmRleCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnJlY2VpdmVUb2tlbihpbmRleCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9rZW4oZXhwcmVzc2lvbikge1xuICBjb25zdCBsZXhlciA9IG5ldyBMZXhlcihleHByZXNzaW9uKTtcbiAgcmV0dXJuIGxleGVyLmdldFRva2VucygpO1xufVxuIiwiZXhwb3J0IGNvbnN0IE9QRVJBVElPTiA9IHtcbiAgJyEnOiA1LFxuICAnKic6IDQsXG4gICcvJzogNCxcbiAgJyUnOiA0LFxuICAnKyc6IDMsXG4gICctJzogMyxcbiAgJz4nOiAyLFxuICAnPCc6IDIsXG4gICc+PSc6IDIsXG4gICc8PSc6IDIsXG4gICc9PT0nOiAyLFxuICAnIT09JzogMixcbiAgJz09JzogMixcbiAgJyE9JzogMixcbiAgJyYmJzogMSxcbiAgJ3x8JzogMSxcbiAgJz8nOiAxLFxuICAnOic6IDEsXG59O1xuXG4vLyBleHBvcnQgaW50ZXJmYWNlIE5vZGUge1xuLy8gICBsZWZ0OiBOb2RlIHwgc3RyaW5nIHwgbnVsbDtcbi8vICAgcmlnaHQ6IE5vZGUgfCBzdHJpbmcgfCBudWxsO1xuLy8gICBvcGVyYXRpb246IHN0cmluZztcbi8vICAgZ3JvdXBlZD86IGJvb2xlYW47XG4vLyB9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXIge1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuKSB7XG4gICAgdGhpcy5pbmRleCA9IC0xO1xuICAgIHRoaXMuYmxvY2tMZXZlbCA9IDA7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcmV0dXJuIHtOb2RlIHwgc3RyaW5nfSA9LSBcbiAgICovXG4gIHBhcnNlKCkge1xuICAgIGxldCB0b2s7XG4gICAgbGV0IHJvb3QgPSB7XG4gICAgICBsZWZ0OiBudWxsLFxuICAgICAgcmlnaHQ6IG51bGwsXG4gICAgICBvcGVyYXRpb246IG51bGwsXG4gICAgfTtcblxuICAgIGRvIHtcbiAgICAgIHRvayA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblxuICAgICAgaWYgKHRvayA9PT0gbnVsbCB8fCB0b2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHJvb3QubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICByb290LmxlZnQgPSB0b2s7XG4gICAgICAgIHJvb3Qub3BlcmF0aW9uID0gdGhpcy5uZXh0VG9rZW4oKTtcblxuICAgICAgICBpZiAoIXJvb3Qub3BlcmF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRvaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJvb3QucmlnaHQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHRvayAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wZXJhdGlvbiBtdXN0IGJlIHN0cmluZywgYnV0IGdldCAnICsgSlNPTi5zdHJpbmdpZnkodG9rKSk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdCA9IHRoaXMuYWRkTm9kZSh0b2ssIHRoaXMucGFyc2VTdGF0ZW1lbnQoKSwgcm9vdCk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodG9rKTtcblxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgbmV4dFRva2VuKCkge1xuICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICByZXR1cm4gdGhpcy50b2tlblt0aGlzLmluZGV4XTtcbiAgfVxuXG4gIHByZXZUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlblt0aGlzLmluZGV4IC0gMV07XG4gIH1cblxuICAvKipcbiAgICogXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gXG4gICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd8bnVsbH0gcmlnaHQgXG4gICAqIEBwYXJhbSB7Tm9kZX0gcm9vdCBcbiAgICovXG4gIGFkZE5vZGUob3BlcmF0aW9uLCByaWdodCwgcm9vdCkge1xuICAgIGxldCBwcmUgPSByb290O1xuICAgIFxuICAgIGlmICh0aGlzLmNvbXBhcmUocHJlLm9wZXJhdGlvbiwgb3BlcmF0aW9uKSA8IDAgJiYgIXByZS5ncm91cGVkKSB7XG4gICAgICBcbiAgICAgIHdoaWxlIChwcmUucmlnaHQgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHByZS5yaWdodCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgdGhpcy5jb21wYXJlKHByZS5yaWdodC5vcGVyYXRpb24sIG9wZXJhdGlvbikgPCAwICYmICFwcmUucmlnaHQuZ3JvdXBlZCkge1xuICAgICAgICBwcmUgPSBwcmUucmlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHByZS5yaWdodCA9IHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBsZWZ0OiBwcmUucmlnaHQsXG4gICAgICAgIHJpZ2h0LFxuICAgICAgfTtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogcHJlLFxuICAgICAgcmlnaHQsXG4gICAgICBvcGVyYXRpb24sXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYSBcbiAgICogQHBhcmFtIHtTdHJpbmd9IGIgXG4gICAqL1xuICBjb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoIU9QRVJBVElPTi5oYXNPd25Qcm9wZXJ0eShhKSB8fCAhT1BFUkFUSU9OLmhhc093blByb3BlcnR5KGIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vdyBvcGVyYXRpb24gJHthfSBvciAke2J9YCk7XG4gICAgfVxuICAgIHJldHVybiBPUEVSQVRJT05bYV0gLSBPUEVSQVRJT05bYl07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBzdHJpbmcgfCBOb2RlIHwgbnVsbFxuICAgKi9cbiAgcGFyc2VTdGF0ZW1lbnQoKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuICAgIGlmICh0b2tlbiA9PT0gJygnKSB7XG4gICAgICB0aGlzLmJsb2NrTGV2ZWwgKz0gMTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhcnNlKCk7XG4gICAgICB0aGlzLmJsb2NrTGV2ZWwgLT0gMTtcblxuICAgICAgaWYgKHR5cGVvZiBub2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgICBub2RlLmdyb3VwZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuID09PSAnKScpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0b2tlbiA9PT0gJyEnKSB7XG4gICAgICByZXR1cm4geyBsZWZ0OiBudWxsLCBvcGVyYXRpb246IHRva2VuLCByaWdodDogdGhpcy5wYXJzZVN0YXRlbWVudCgpIH1cbiAgICB9XG5cbiAgICAvLyAzID4gLTEyIG9yIC0xMiArIDEwXG4gICAgaWYgKHRva2VuID09PSAnLScgJiYgKE9QRVJBVElPTlt0aGlzLnByZXZUb2tlbigpXSA+IDAgfHwgdGhpcy5wcmV2VG9rZW4oKSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIHsgbGVmdDogJzAnLCBvcGVyYXRpb246IHRva2VuLCByaWdodDogdGhpcy5wYXJzZVN0YXRlbWVudCgpLCBncm91cGVkOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG59XG4iLCJpbXBvcnQgeyBPUEVSQVRJT04gfSBmcm9tICcuL1BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1ZXJ5UGFyc2VyIHtcblxuICBjb25zdHJ1Y3Rvcih0cmVlLCBxdWVyaWVzKSB7XG4gICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICB0aGlzLnF1ZXJpZXMgPSBxdWVyaWVzO1xuICAgIHRoaXMucXVlcnkgPSBudWxsO1xuICB9XG5cbiAgc2V0UXVlcnkocXVlcnkpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnkuY2xvbmUoKTtcbiAgfVxuXG4gIHBhcnNlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlTm9kZSh0aGlzLnRyZWUpO1xuICB9XG5cbiAgcGFyc2VOb2RlKG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBub2RlUXVlcnkgPSB0aGlzLmdldFF1ZXJ5KG5vZGUpO1xuICAgICAgcmV0dXJuIChxdWVyeSkgPT4geyBub2RlUXVlcnkocXVlcnkpOyB9O1xuICAgIH1cbiAgICBpZiAoT1BFUkFUSU9OW25vZGUub3BlcmF0aW9uXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vdyBleHByZXNzaW9uICR7bm9kZS5vcGVyYXRpb259YCk7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRRdWVyeSA9IHRoaXMuZ2V0UXVlcnkobm9kZS5sZWZ0KTtcbiAgICBjb25zdCByaWdodFF1ZXJ5ID0gdGhpcy5nZXRRdWVyeShub2RlLnJpZ2h0KTtcblxuICAgIHN3aXRjaCAobm9kZS5vcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgJyYmJzpcbiAgICAgIGNhc2UgJ0FORCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKG5vZGVRdWVyeSkgPT4gbm9kZVF1ZXJ5LndoZXJlKChxdWVyeSkgPT4ge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKChxKSA9PiB7IGxlZnRRdWVyeShxKTsgfSk7XG4gICAgICAgICAgcXVlcnkuYW5kV2hlcmUoKHEpID0+IHsgcmlnaHRRdWVyeShxKTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAnfHwnOlxuICAgICAgY2FzZSAnT1InOlxuICAgICAgICByZXR1cm4gKG5vZGVRdWVyeSkgPT4gbm9kZVF1ZXJ5LndoZXJlKChxdWVyeSkgPT4ge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKChxKSA9PiB7IGxlZnRRdWVyeShxKTsgfSk7XG4gICAgICAgICAgcXVlcnkub3JXaGVyZSgocSkgPT4geyByaWdodFF1ZXJ5KHEpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UXVlcnkobm9kZSkge1xuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ3N0cmluZycgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VOb2RlKG5vZGUpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQobm9kZSk7XG5cbiAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXJpZXNbbm9kZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93IHF1ZXJ5IHVuZGVyIGluZGV4ICR7bm9kZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnF1ZXJpZXNbbm9kZV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59IiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZXRhYmxlQ29sbGVjdGlvbiB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gW107XG4gICAgdGhpcy5LRVlfQ09MVU1OID0gJ2tleSc7XG4gICAgdGhpcy5WQUxVRV9DT0xVTU4gPSAndmFsdWUnO1xuICAgIHRoaXMuVFlQRV9DT0xVTU4gPSAndHlwZSc7XG4gICAgdGhpcy5tb2RlbCA9IG51bGw7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBbXTtcblxuICAgIHRoaXMuZXh0cmFRdWVyeSA9IChxdWVyeSwgbWV0YSkgPT4ge1xuICAgICAgcXVlcnkud2hlcmUoJ2tleScsIG1ldGFbdGhpcy5LRVlfQ09MVU1OXSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbW9kZWwgb2YgdGhpcyBtZXRhZGF0YSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kZWwgLVxuICAgKi9cbiAgc2V0TW9kZWwobW9kZWwpIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGV4dHJhIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnMgLVxuICAgKi9cbiAgc2V0RXh0cmFDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICB0aGlzLmV4dHJhQ29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgZ2l2ZW4gbWV0YWRhdGEga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICogQHJldHVybiB7b2JqZWN0fSAtIE1ldGFkYXRhIG9iamVjdC5cbiAgICovXG4gIGZpbmRNZXRhKHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGtleSwgZXh0cmFDb2x1bW5zIH0gPSB0aGlzLnBhcnNlUGF5bG9hZChwYXlsb2FkKTtcblxuICAgIHJldHVybiB0aGlzLmFsbE1ldGFkYXRhKCkuZmluZCgobWV0YSkgPT4ge1xuICAgICAgY29uc3QgaXNTYW1lS2V5ID0gbWV0YS5rZXkgPT09IGtleTtcbiAgICAgIGNvbnN0IHNhbWVFeHRyYUNvbHVtbnMgPSB0aGlzLmV4dHJhQ29sdW1ucy5zb21lKChleHRyYUNvbHVtbikgPT4ge1xuICAgICAgICByZXR1cm4gIWV4dHJhQ29sdW1ucyB8fCAoZXh0cmFDb2x1bW5zW2V4dHJhQ29sdW1uXSA9PT0gbWV0YVtleHRyYUNvbHVtbl0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXNTYW1lS2V5ICYmIHNhbWVFeHRyYUNvbHVtbnM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYWxsIG1ldGFkYXRhLlxuICAgKi9cbiAgYWxsTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEuZmlsdGVyKChtZXRhKSA9PiAhbWV0YS5tYXJrQXNEZWxldGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBtZXRhZGF0YSBvZiB0aGUgZ2l2ZW4ga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICogQHBhcmFtIHtNaXhpZWR9IGRlZmF1bHRWYWx1ZSAtXG4gICAqL1xuICBnZXRNZXRhKHBheWxvYWQsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YShwYXlsb2FkKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgPyBtZXRhZGF0YS52YWx1ZSA6IGRlZmF1bHRWYWx1ZSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrZXMgdGhlIG1ldGFkYXRhIHRvIHNob3VsZCBiZSBkZWxldGVkLlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICovXG4gIHJlbW92ZU1ldGEoa2V5KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmZpbmRNZXRhKGtleSk7XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIG1ldGFkYXRhLm1hcmtBc0RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIG1ldGEgZGF0YSBvZiB0aGUgZ2l2ZW4gZ3JvdXAuXG4gICAqIEBwYXJhbSB7Kn0gZ3JvdXBcbiAgICovXG4gIHJlbW92ZUFsbE1ldGEoZ3JvdXAgPSAnZGVmYXVsdCcpIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gdGhpcy5tZXRhZGF0YS5tYXAoKG1ldGEpID0+ICh7XG4gICAgICAuLi5tZXRhLFxuICAgICAgbWFya0FzRGVsZXRlZDogdHJ1ZSxcbiAgICB9KSk7XG4gIH1cblxuICBzZXRFeHRyYVF1ZXJ5KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5leHRyYVF1ZXJ5ID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtZXRhIGRhdGEgdG8gdGhlIHN0YWNrLlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC1cbiAgICovXG4gIHNldE1ldGEocGF5bG9hZCwgLi4uYXJncykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0ga2V5O1xuXG4gICAgICBtZXRhZGF0YS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0TWV0YShtZXRhLmtleSwgbWV0YS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBrZXksIHZhbHVlLCAuLi5leHRyYUNvbHVtbnMgfSA9IHRoaXMucGFyc2VQYXlsb2FkKHBheWxvYWQsIGFyZ3NbMF0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YShwYXlsb2FkKTtcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbWV0YWRhdGEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG1ldGFkYXRhLm1hcmtBc1VwZGF0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnB1c2goe1xuICAgICAgICB2YWx1ZSwga2V5LCAuLi5leHRyYUNvbHVtbnMsIG1hcmtBc0luc2VydGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VQYXlsb2FkKHBheWxvYWQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXlsb2FkICE9PSAnb2JqZWN0JyA/IHsga2V5OiBwYXlsb2FkLCB2YWx1ZSB9IDogeyAuLi5wYXlsb2FkIH07XG4gIH1cblxuICAvKipcbiAgICogU2F2ZWQgdGhlIG1vZGlmaWVkL2RlbGV0ZWQgYW5kIGluc2VydGVkIG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgc2F2ZU1ldGEoKSB7XG4gICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLm1ldGFkYXRhLmZpbHRlcigobSkgPT4gKG0ubWFya0FzSW5zZXJ0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc1VwZGF0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc0RlbGV0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCBvcGVycyA9IFtdO1xuXG4gICAgaWYgKGRlbGV0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgZGVsZXRlZC5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wZXIgPSB0aGlzLm1vZGVsLnF1ZXJ5KCkub25CdWlsZCgocXVlcnksIHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXh0cmFRdWVyeShxdWVyeSwgbWV0YSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSkuZGVsZXRlKCk7XG4gICAgICAgIG9wZXJzLnB1c2goZGVsZXRlT3Blcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaW5zZXJ0ZWQuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgY29uc3QgaW5zZXJ0T3BlciA9IHRoaXMubW9kZWwucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICBbdGhpcy5LRVlfQ09MVU1OXTogbWV0YS5rZXksXG4gICAgICAgIFt0aGlzLlZBTFVFX0NPTFVNTl06IG1ldGEudmFsdWUsXG4gICAgICAgIC4uLnRoaXMuZXh0cmFDb2x1bW5zLnJlZHVjZSgob2JqLCBjb2x1bW4pID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIG1ldGFbY29sdW1uXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtjb2x1bW5dID0gbWV0YVtjb2x1bW5dO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSksXG4gICAgICB9KTtcbiAgICAgIG9wZXJzLnB1c2goaW5zZXJ0T3Blcik7XG4gICAgfSk7XG4gICAgdXBkYXRlZC5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVPcGVyID0gdGhpcy5tb2RlbC5xdWVyeSgpLm9uQnVpbGQoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHRoaXMuZXh0cmFRdWVyeShxdWVyeSwgbWV0YSk7XG4gICAgICB9KS5wYXRjaCh7XG4gICAgICAgIFt0aGlzLlZBTFVFX0NPTFVNTl06IG1ldGEudmFsdWUsXG4gICAgICB9KTtcbiAgICAgIG9wZXJzLnB1c2godXBkYXRlT3Blcik7XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwob3BlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0ga2V5IC1cbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZSAtXG4gICAqL1xuICBhc3luYyBsb2FkKCkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5xdWVyeSgpO1xuXG4gICAgY29uc3QgbWV0YWRhdGFBcnJheSA9IHRoaXMubWFwTWV0YWRhdGFDb2xsZWN0aW9uKG1ldGFkYXRhKTtcbiAgICBtZXRhZGF0YUFycmF5LmZvckVhY2goKG1ldGEpID0+IHtcbiAgICAgIHRoaXMubWV0YWRhdGEucHVzaChtZXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIG1ldGFkYXRhIGJlZm9yZSBzYXZpbmcgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ8Qm9vbGVhbn0gdmFsdWUgLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVUeXBlIC1cbiAgICogQHJldHVybiB7U3RyaW5nfE51bWJlcnxCb29sZWFufSAtXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0TWV0YVZhbHVlKHZhbHVlLCB2YWx1ZVR5cGUpIHtcbiAgICBsZXQgcGFyc2VkVmFsdWU7XG5cbiAgICBzd2l0Y2ggKHZhbHVlVHlwZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlID8gJzEnIDogJzAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHBhcnNlZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgYW5kIHBhcnNlIG1ldGFkYXRhIHRvIGNvbGxlY3Rpb24gZW50cmllcy5cbiAgICogQHBhcmFtIHtNZXRhfSBhdHRyIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcnNlVHlwZSAtXG4gICAqL1xuICBtYXBNZXRhZGF0YShhdHRyLCBwYXJzZVR5cGUgPSAncGFyc2UnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogYXR0clt0aGlzLktFWV9DT0xVTU5dLFxuICAgICAgdmFsdWU6IChwYXJzZVR5cGUgPT09ICdwYXJzZScpXG4gICAgICAgID8gTWV0YWJsZUNvbGxlY3Rpb24ucGFyc2VNZXRhVmFsdWUoXG4gICAgICAgICAgYXR0clt0aGlzLlZBTFVFX0NPTFVNTl0sXG4gICAgICAgICAgdGhpcy5UWVBFX0NPTFVNTiA/IGF0dHJbdGhpcy5UWVBFX0NPTFVNTl0gOiBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICA6IE1ldGFibGVDb2xsZWN0aW9uLmZvcm1hdE1ldGFWYWx1ZShcbiAgICAgICAgICBhdHRyW3RoaXMuVkFMVUVfQ09MVU1OXSxcbiAgICAgICAgICB0aGlzLlRZUEVfQ09MVU1OID8gYXR0clt0aGlzLlRZUEVfQ09MVU1OXSA6IGZhbHNlLFxuICAgICAgICApLFxuICAgICAgLi4udGhpcy5leHRyYUNvbHVtbnMubWFwKChleHRyYUNvbCkgPT4gKHtcbiAgICAgICAgW2V4dHJhQ29sXTogYXR0cltleHRyYUNvbF0gfHwgbnVsbCxcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBtZXRhZGF0YSB0byB0aGUgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtBcnJheX0gY29sbGVjdGlvbiAtXG4gICAqL1xuICBtYXBNZXRhZGF0YVRvQ29sbGVjdGlvbihtZXRhZGF0YSwgcGFyc2VUeXBlID0gJ3BhcnNlJykge1xuICAgIHJldHVybiBtZXRhZGF0YS5tYXAoKG1vZGVsKSA9PiB0aGlzLm1hcE1ldGFkYXRhVG9Db2xsZWN0aW9uKG1vZGVsLCBwYXJzZVR5cGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIG1ldGFkYXRhIHRvIHRoZSBtZXRhYmxlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG1ldGEgLVxuICAgKi9cbiAgZnJvbShtZXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWV0YSkpIHtcbiAgICAgIG1ldGEuZm9yRWFjaCgobSkgPT4geyB0aGlzLmZyb20obSk7IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1ldGFkYXRhLnB1c2gobWV0YSk7XG4gIH1cblxuICB0b0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gbG9hZCBtZXRhZGF0YSB0byB0aGUgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtBcnJheX0gbWV0YSBcbiAgICovXG4gIHN0YXRpYyBmcm9tKG1ldGEpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1ldGFibGVDb2xsZWN0aW9uKCk7XG4gICAgY29sbGVjdGlvbi5mcm9tKG1ldGEpO1xuXG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tICdAL2xpYi9Mb2dpY0V2YWx1YXRpb24vTGV4ZXInO1xuaW1wb3J0IFBhcnNlciBmcm9tICdAL2xpYi9Mb2dpY0V2YWx1YXRpb24vUGFyc2VyJztcbmltcG9ydCBRdWVyeVBhcnNlciBmcm9tICdAL2xpYi9Mb2dpY0V2YWx1YXRpb24vUXVlcnlQYXJzZXInO1xuaW1wb3J0IHJlc291cmNlRmllbGRzS2V5cyBmcm9tICdAL2RhdGEvUmVzb3VyY2VGaWVsZHNLZXlzJztcblxuLy8gIGNvbnN0IHJvbGUgPSB7XG4vLyAgIGNvbXBhdG90b3I6IFN0cmluZyxcbi8vICAgdmFsdWU6IFN0cmluZyxcbi8vICAgY29sdW1uS2V5OiBTdHJpbmcsXG4vLyAgIGNvbHVtblNsdWc6IFN0cmluZyxcbi8vICAgaW5kZXg6IE51bWJlcixcbi8vIH1cblxuLyoqXG4gKiBHZXQgZmllbGQgY29sdW1uIG1ldGFkYXRhIGFuZCBpdHMgcmVsYXRpb24gd2l0aCBvdGhlciB0YWJsZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZSBvZiB0YXJnZXQgY29sdW1uLlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbHVtbktleSAtIFRhcmdldCBjb2x1bW4ga2V5IHRoYXQgc3RvcmVkIGluIHJlc291cmNlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZUZpZWxkQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uS2V5KSB7XG4gIGNvbnN0IHRhYmxlRmllbGRzID0gcmVzb3VyY2VGaWVsZHNLZXlzW3RhYmxlTmFtZV07XG4gIHJldHVybiAodGFibGVGaWVsZHNbY29sdW1uS2V5XSkgPyB0YWJsZUZpZWxkc1tjb2x1bW5LZXldIDogbnVsbDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgcm9sZXMgcXVlcmllcy5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0YWJsZU5hbWUgLVxuICogQHBhcmFtIHtPYmplY3R9IHJvbGUgLVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSb2xlUXVlcnkodGFibGVOYW1lLCByb2xlKSB7XG4gIGNvbnN0IGZpZWxkUmVsYXRpb24gPSBnZXRSb2xlRmllbGRDb2x1bW4odGFibGVOYW1lLCByb2xlLmNvbHVtbktleSk7XG4gIGNvbnN0IGNvbXBhcmF0b3JDb2x1bW4gPSBmaWVsZFJlbGF0aW9uLnJlbGF0aW9uQ29sdW1uIHx8IGAke3RhYmxlTmFtZX0uJHtmaWVsZFJlbGF0aW9uLmNvbHVtbn1gO1xuXG4gIHN3aXRjaCAocm9sZS5jb21wYXJhdG9yKSB7XG4gICAgY2FzZSAnZXF1YWxzJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoY29tcGFyYXRvckNvbHVtbiwgcm9sZS52YWx1ZSk7XG4gICAgICB9O1xuICAgIGNhc2UgJ25vdF9lcXVhbCc6XG4gICAgY2FzZSAnbm90X2VxdWFscyc6XG4gICAgICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgYnVpbGRlci53aGVyZU5vdChjb21wYXJhdG9yQ29sdW1uLCByb2xlLnZhbHVlKTtcbiAgICAgIH07XG4gICAgY2FzZSAnY29udGFpbic6XG4gICAgY2FzZSAnY29udGFpbnMnOlxuICAgICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoY29tcGFyYXRvckNvbHVtbiwgJ0xJS0UnLCBgJSR7cm9sZS52YWx1ZX0lYCk7XG4gICAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCByZWxhdGlvbiB0YWJsZSBuYW1lIGZyb20gcmVsYXRpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sdW1uIC1cbiAqIEByZXR1cm4ge1N0cmluZ30gLSBqb2luIHJlbGF0aW9uIHRhYmxlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VGFibGVGcm9tUmVsYXRpb25Db2x1bW4gPSAoY29sdW1uKSA9PiB7XG4gIGNvbnN0IHNwbGl0ZWRDb2x1bW4gPSBjb2x1bW4uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIChzcGxpdGVkQ29sdW1uLmxlbmd0aCA+IDApID8gc3BsaXRlZENvbHVtblswXSA6ICcnO1xufTtcblxuLyoqXG4gKiBCdWlsZHMgdmlldyByb2xlcyBqb2luIHF1ZXJpZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC1cbiAqIEBwYXJhbSB7QXJyYXl9IHJvbGVzIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm9sZXNKb2lucyh0YWJsZU5hbWUsIHJvbGVzKSB7XG4gIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgIHJvbGVzLmZvckVhY2goKHJvbGUpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkQ29sdW1uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRhYmxlTmFtZSwgcm9sZS5jb2x1bW5LZXkpO1xuXG4gICAgICBpZiAoZmllbGRDb2x1bW4ucmVsYXRpb24pIHtcbiAgICAgICAgY29uc3Qgam9pblRhYmxlID0gZ2V0VGFibGVGcm9tUmVsYXRpb25Db2x1bW4oZmllbGRDb2x1bW4ucmVsYXRpb24pO1xuICAgICAgICBidWlsZGVyLmpvaW4oam9pblRhYmxlLCBgJHt0YWJsZU5hbWV9LiR7ZmllbGRDb2x1bW4uY29sdW1ufWAsICc9JywgZmllbGRDb2x1bW4ucmVsYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb3J0Q29sdW1uSm9pbih0YWJsZU5hbWUsIHNvcnRDb2x1bW5LZXkpIHtcbiAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgZmllbGRDb2x1bW4gPSBnZXRSb2xlRmllbGRDb2x1bW4odGFibGVOYW1lLCBzb3J0Q29sdW1uS2V5KTtcblxuICAgIGlmIChmaWVsZENvbHVtbi5yZWxhdGlvbikge1xuICAgICAgY29uc3Qgam9pblRhYmxlID0gZ2V0VGFibGVGcm9tUmVsYXRpb25Db2x1bW4oZmllbGRDb2x1bW4ucmVsYXRpb24pO1xuICAgICAgYnVpbGRlci5qb2luKGpvaW5UYWJsZSwgYCR7dGFibGVOYW1lfS4ke2ZpZWxkQ29sdW1uLmNvbHVtbn1gLCAnPScsIGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGRhdGFiYXNlIHF1ZXJ5IGZyb20gc3RvcmVkIHZpZXcgcm9sZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcm9sZXMgLVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpbHRlclJvbGVzUXVlcnkodGFibGVOYW1lLCByb2xlcywgbG9naWNFeHByZXNzaW9uID0gJycpIHtcbiAgY29uc3Qgcm9sZXNJbmRleFNldCA9IHt9O1xuXG4gIHJvbGVzLmZvckVhY2goKHJvbGUpID0+IHtcbiAgICByb2xlc0luZGV4U2V0W3JvbGUuaW5kZXhdID0gYnVpbGRSb2xlUXVlcnkodGFibGVOYW1lLCByb2xlKTtcbiAgfSk7XG4gIC8vIExleGVyIGZvciBsb2dpYyBleHByZXNzaW9uLlxuICBjb25zdCBsZXhlciA9IG5ldyBMZXhlcihsb2dpY0V4cHJlc3Npb24pO1xuICBjb25zdCB0b2tlbnMgPSBsZXhlci5nZXRUb2tlbnMoKTtcblxuICAvLyBQYXJzZSB0aGUgbG9naWMgZXhwcmVzc2lvbi5cbiAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih0b2tlbnMpO1xuICBjb25zdCBwYXJzZWRUcmVlID0gcGFyc2VyLnBhcnNlKCk7XG5cbiAgY29uc3QgcXVlcnlQYXJzZXIgPSBuZXcgUXVlcnlQYXJzZXIocGFyc2VkVHJlZSwgcm9sZXNJbmRleFNldCk7XG4gIHJldHVybiBxdWVyeVBhcnNlci5wYXJzZSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBmaWx0ZXIgcXVlcnkgZm9yIHF1ZXJ5IGJ1aWxkZXIuXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC1cbiAqIEBwYXJhbSB7QXJyYXl9IHJvbGVzIC1cbiAqIEBwYXJhbSB7U3RyaW5nfSBsb2dpY0V4cHJlc3Npb24gLVxuICovXG5leHBvcnQgY29uc3QgYnVpbGRGaWx0ZXJRdWVyeSA9ICh0YWJsZU5hbWUsIHJvbGVzLCBsb2dpY0V4cHJlc3Npb24pID0+IHtcbiAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgYnVpbGRGaWx0ZXJSb2xlc1F1ZXJ5KHRhYmxlTmFtZSwgcm9sZXMsIGxvZ2ljRXhwcmVzc2lvbikoYnVpbGRlcik7XG4gIH07XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmlldyBsb2dpYyBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IGxvZ2ljRXhwcmVzc2lvbiAtXG4gKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmlsdGVyTG9naWNFeHByZXNzaW9uKGxvZ2ljRXhwcmVzc2lvbiwgaW5kZXhlcykge1xuICBjb25zdCBsb2dpY0V4cEluZGV4ZXMgPSBsb2dpY0V4cHJlc3Npb24ubWF0Y2goL1xcZCsvZykgfHwgW107XG4gIHJldHVybiAhZGlmZmVyZW5jZShsb2dpY0V4cEluZGV4ZXMubWFwKE51bWJlciksIGluZGV4ZXMpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdmlldyByb2xlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IHJvbGVzIC1cbiAqIEBwYXJhbSB7U3RyaW5nfSBsb2dpY0V4cHJlc3Npb24gLVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVmlld1JvbGVzKHJvbGVzLCBsb2dpY0V4cHJlc3Npb24pIHtcbiAgcmV0dXJuIHZhbGlkYXRlRmlsdGVyTG9naWNFeHByZXNzaW9uKGxvZ2ljRXhwcmVzc2lvbiwgcm9sZXMubWFwKChyKSA9PiByLmluZGV4KSk7XG59XG5cbi8qKlxuICogTWFwZXMgdGhlIHZpZXcgcm9sZXMgdG8gdmlldyBjb25kaXRpb25hbHMuXG4gKiBAcGFyYW0ge0FycmF5fSB2aWV3Um9sZXMgLVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3Um9sZXMpIHtcbiAgcmV0dXJuIHZpZXdSb2xlcy5tYXAoKHZpZXdSb2xlKSA9PiAoe1xuICAgIGNvbXBhcmF0b3I6IHZpZXdSb2xlLmNvbXBhcmF0b3IsXG4gICAgdmFsdWU6IHZpZXdSb2xlLnZhbHVlLFxuICAgIGNvbHVtbktleTogdmlld1JvbGUuZmllbGQua2V5LFxuICAgIHNsdWc6IHZpZXdSb2xlLmZpZWxkLnNsdWcsXG4gICAgaW5kZXg6IHZpZXdSb2xlLmluZGV4LFxuICB9KSk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKHJvbGVzKSB7XG4gIHJldHVybiByb2xlcy5tYXAoKHJvbGUpID0+ICh7XG4gICAgLi4ucm9sZSxcbiAgICBjb2x1bW5LZXk6IHJvbGUuZmllbGRLZXksXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgc29ydCBjb2x1bW4gcXVlcnkuXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC1cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2x1bW5LZXkgLVxuICogQHBhcmFtIHtTdHJpbmd9IHNvcnREaXJlY3Rpb24gLVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb3J0Q29sdW1uUXVlcnkodGFibGVOYW1lLCBjb2x1bW5LZXksIHNvcnREaXJlY3Rpb24pIHtcbiAgY29uc3QgZmllbGRSZWxhdGlvbiA9IGdldFJvbGVGaWVsZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbktleSk7XG4gIGNvbnN0IHNvcnRDb2x1bW4gPSBmaWVsZFJlbGF0aW9uLnJlbGF0aW9uIHx8IGAke3RhYmxlTmFtZX0uJHtmaWVsZFJlbGF0aW9uLmNvbHVtbn1gO1xuXG4gIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgIGJ1aWxkZXIub3JkZXJCeShzb3J0Q29sdW1uLCBzb3J0RGlyZWN0aW9uKTtcbiAgICBidWlsZFNvcnRDb2x1bW5Kb2luKHRhYmxlTmFtZSwgY29sdW1uS2V5KShidWlsZGVyKTtcbiAgfTtcbn0iLCJ2YXIgbWFwID0ge1xuXHRcIi4vQWNjb3VudFwiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50LmpzXCIsXG5cdFwiLi9BY2NvdW50LmpzXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnQuanNcIixcblx0XCIuL0FjY291bnRCYWxhbmNlXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnRCYWxhbmNlLmpzXCIsXG5cdFwiLi9BY2NvdW50QmFsYW5jZS5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50QmFsYW5jZS5qc1wiLFxuXHRcIi4vQWNjb3VudFRyYW5zYWN0aW9uXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnRUcmFuc2FjdGlvbi5qc1wiLFxuXHRcIi4vQWNjb3VudFRyYW5zYWN0aW9uLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnRUcmFuc2FjdGlvbi5qc1wiLFxuXHRcIi4vQWNjb3VudFR5cGVcIjogXCIuL3NyYy9tb2RlbHMvQWNjb3VudFR5cGUuanNcIixcblx0XCIuL0FjY291bnRUeXBlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnRUeXBlLmpzXCIsXG5cdFwiLi9BdXRoXCI6IFwiLi9zcmMvbW9kZWxzL0F1dGguanNcIixcblx0XCIuL0F1dGguanNcIjogXCIuL3NyYy9tb2RlbHMvQXV0aC5qc1wiLFxuXHRcIi4vQnVkZ2V0XCI6IFwiLi9zcmMvbW9kZWxzL0J1ZGdldC5qc1wiLFxuXHRcIi4vQnVkZ2V0LmpzXCI6IFwiLi9zcmMvbW9kZWxzL0J1ZGdldC5qc1wiLFxuXHRcIi4vQnVkZ2V0RW50cnlcIjogXCIuL3NyYy9tb2RlbHMvQnVkZ2V0RW50cnkuanNcIixcblx0XCIuL0J1ZGdldEVudHJ5LmpzXCI6IFwiLi9zcmMvbW9kZWxzL0J1ZGdldEVudHJ5LmpzXCIsXG5cdFwiLi9DdXJyZW5jeVwiOiBcIi4vc3JjL21vZGVscy9DdXJyZW5jeS5qc1wiLFxuXHRcIi4vQ3VycmVuY3kuanNcIjogXCIuL3NyYy9tb2RlbHMvQ3VycmVuY3kuanNcIixcblx0XCIuL0RhdGVTZXNzaW9uXCI6IFwiLi9zcmMvbW9kZWxzL0RhdGVTZXNzaW9uLmpzXCIsXG5cdFwiLi9EYXRlU2Vzc2lvbi5qc1wiOiBcIi4vc3JjL21vZGVscy9EYXRlU2Vzc2lvbi5qc1wiLFxuXHRcIi4vRXhjaGFuZ2VSYXRlXCI6IFwiLi9zcmMvbW9kZWxzL0V4Y2hhbmdlUmF0ZS5qc1wiLFxuXHRcIi4vRXhjaGFuZ2VSYXRlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0V4Y2hhbmdlUmF0ZS5qc1wiLFxuXHRcIi4vRXhwZW5zZVwiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlLmpzXCIsXG5cdFwiLi9FeHBlbnNlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0V4cGVuc2UuanNcIixcblx0XCIuL0l0ZW1cIjogXCIuL3NyYy9tb2RlbHMvSXRlbS5qc1wiLFxuXHRcIi4vSXRlbS5qc1wiOiBcIi4vc3JjL21vZGVscy9JdGVtLmpzXCIsXG5cdFwiLi9JdGVtQ2F0ZWdvcnlcIjogXCIuL3NyYy9tb2RlbHMvSXRlbUNhdGVnb3J5LmpzXCIsXG5cdFwiLi9JdGVtQ2F0ZWdvcnkuanNcIjogXCIuL3NyYy9tb2RlbHMvSXRlbUNhdGVnb3J5LmpzXCIsXG5cdFwiLi9NYW51YWxKb3VybmFsXCI6IFwiLi9zcmMvbW9kZWxzL01hbnVhbEpvdXJuYWwuanNcIixcblx0XCIuL01hbnVhbEpvdXJuYWwuanNcIjogXCIuL3NyYy9tb2RlbHMvTWFudWFsSm91cm5hbC5qc1wiLFxuXHRcIi4vTWVkaWFcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWEuanNcIixcblx0XCIuL01lZGlhLmpzXCI6IFwiLi9zcmMvbW9kZWxzL01lZGlhLmpzXCIsXG5cdFwiLi9NZWRpYUxpbmtcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWFMaW5rLmpzXCIsXG5cdFwiLi9NZWRpYUxpbmsuanNcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWFMaW5rLmpzXCIsXG5cdFwiLi9NZXRhYmxlXCI6IFwiLi9zcmMvbW9kZWxzL01ldGFibGUuanNcIixcblx0XCIuL01ldGFibGUuanNcIjogXCIuL3NyYy9tb2RlbHMvTWV0YWJsZS5qc1wiLFxuXHRcIi4vTW9kZWxcIjogXCIuL3NyYy9tb2RlbHMvTW9kZWwuanNcIixcblx0XCIuL01vZGVsLmpzXCI6IFwiLi9zcmMvbW9kZWxzL01vZGVsLmpzXCIsXG5cdFwiLi9PcHRpb25cIjogXCIuL3NyYy9tb2RlbHMvT3B0aW9uLmpzXCIsXG5cdFwiLi9PcHRpb24uanNcIjogXCIuL3NyYy9tb2RlbHMvT3B0aW9uLmpzXCIsXG5cdFwiLi9QYWdpbmF0aW9uXCI6IFwiLi9zcmMvbW9kZWxzL1BhZ2luYXRpb24uanNcIixcblx0XCIuL1BhZ2luYXRpb24uanNcIjogXCIuL3NyYy9tb2RlbHMvUGFnaW5hdGlvbi5qc1wiLFxuXHRcIi4vUGVybWlzc2lvblwiOiBcIi4vc3JjL21vZGVscy9QZXJtaXNzaW9uLmpzXCIsXG5cdFwiLi9QZXJtaXNzaW9uLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1Blcm1pc3Npb24uanNcIixcblx0XCIuL1Jlc291cmNlXCI6IFwiLi9zcmMvbW9kZWxzL1Jlc291cmNlLmpzXCIsXG5cdFwiLi9SZXNvdXJjZS5qc1wiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZS5qc1wiLFxuXHRcIi4vUmVzb3VyY2VGaWVsZFwiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkLmpzXCIsXG5cdFwiLi9SZXNvdXJjZUZpZWxkLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1Jlc291cmNlRmllbGQuanNcIixcblx0XCIuL1Jlc291cmNlRmllbGRNZXRhZGF0YVwiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkTWV0YWRhdGEuanNcIixcblx0XCIuL1Jlc291cmNlRmllbGRNZXRhZGF0YS5qc1wiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkTWV0YWRhdGEuanNcIixcblx0XCIuL1JvbGVcIjogXCIuL3NyYy9tb2RlbHMvUm9sZS5qc1wiLFxuXHRcIi4vUm9sZS5qc1wiOiBcIi4vc3JjL21vZGVscy9Sb2xlLmpzXCIsXG5cdFwiLi9TZXR0aW5nXCI6IFwiLi9zcmMvbW9kZWxzL1NldHRpbmcuanNcIixcblx0XCIuL1NldHRpbmcuanNcIjogXCIuL3NyYy9tb2RlbHMvU2V0dGluZy5qc1wiLFxuXHRcIi4vVGVuYW50TW9kZWxcIjogXCIuL3NyYy9tb2RlbHMvVGVuYW50TW9kZWwuanNcIixcblx0XCIuL1RlbmFudE1vZGVsLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1RlbmFudE1vZGVsLmpzXCIsXG5cdFwiLi9UZW5hbnRVc2VyXCI6IFwiLi9zcmMvbW9kZWxzL1RlbmFudFVzZXIuanNcIixcblx0XCIuL1RlbmFudFVzZXIuanNcIjogXCIuL3NyYy9tb2RlbHMvVGVuYW50VXNlci5qc1wiLFxuXHRcIi4vVmlld1wiOiBcIi4vc3JjL21vZGVscy9WaWV3LmpzXCIsXG5cdFwiLi9WaWV3LmpzXCI6IFwiLi9zcmMvbW9kZWxzL1ZpZXcuanNcIixcblx0XCIuL1ZpZXdDb2x1bW5cIjogXCIuL3NyYy9tb2RlbHMvVmlld0NvbHVtbi5qc1wiLFxuXHRcIi4vVmlld0NvbHVtbi5qc1wiOiBcIi4vc3JjL21vZGVscy9WaWV3Q29sdW1uLmpzXCIsXG5cdFwiLi9WaWV3Um9sZVwiOiBcIi4vc3JjL21vZGVscy9WaWV3Um9sZS5qc1wiLFxuXHRcIi4vVmlld1JvbGUuanNcIjogXCIuL3NyYy9tb2RlbHMvVmlld1JvbGUuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi9zcmMvbW9kZWxzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7IiwiLyogZXNsaW50LWRpc2FibGUgZ2xvYmFsLXJlcXVpcmUgKi9cbmltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQge1xuICBidWlsZEZpbHRlclF1ZXJ5LFxuICBidWlsZFNvcnRDb2x1bW5RdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5pbXBvcnQgRGF0ZVNlc3Npb24gZnJvbSAnQC9tb2RlbHMvRGF0ZVNlc3Npb24nO1xuaW1wb3J0IHsgZmxhdFRvTmVzdGVkQXJyYXkgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjb3VudCBleHRlbmRzIG1peGluKFRlbmFudE1vZGVsLCBbQ2FjaGFibGVNb2RlbCwgRGF0ZVNlc3Npb25dKSB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2FjY291bnRzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgcXVlcnkgYnVpbGRlciBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXQgUXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBDYWNoYWJsZVF1ZXJ5QnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSByZXR1cm4gb3ZlcnJpZGUuXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBcbiAgICovXG4gIHN0YXRpYyBxdWVyeSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnF1ZXJ5KC4uLmFyZ3MpLnJ1bkFmdGVyKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEZXBHcmFwaCA/XG4gICAgICAgICAgQWNjb3VudC50b0RlcGVuZGVuY3lHcmFwaChyZXN1bHQpIDpcbiAgICAgICAgICB0aGlzLmNvbGxlY3Rpb24uZnJvbShyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBhcnJheSByZXN1bHQgdG8gZGVwZW5kZW5jeSBncmFwaC5cbiAgICovXG4gIHN0YXRpYyBkZXBHcmFwaCgpIHtcbiAgICB0aGlzLmlzRGVwR3JhcGggPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIG1vZGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXQgbW9kaWZpZXJzKCkge1xuICAgIGNvbnN0IFRBQkxFX05BTUUgPSBBY2NvdW50LnRhYmxlTmFtZTtcblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJBY2NvdW50cyhxdWVyeSwgYWNjb3VudElkcykge1xuICAgICAgICBpZiAoYWNjb3VudElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbihgJHtUQUJMRV9OQU1FfS5pZGAsIGFjY291bnRJZHMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyQWNjb3VudFR5cGVzKHF1ZXJ5LCB0eXBlc0lkcykge1xuICAgICAgICBpZiAodHlwZXNJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlSW4oJ2FjY291bnRfdHlwZXMuYWNjb3VuX3R5cGVfaWQnLCB0eXBlc0lkcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB2aWV3Um9sZXNCdWlsZGVyKHF1ZXJ5LCBjb25kaXRpb25hbHMsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgYnVpbGRGaWx0ZXJRdWVyeShBY2NvdW50LnRhYmxlTmFtZSwgY29uZGl0aW9uYWxzLCBleHByZXNzaW9uKShxdWVyeSk7XG4gICAgICB9LFxuICAgICAgc29ydENvbHVtbkJ1aWxkZXIocXVlcnksIGNvbHVtbktleSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIGJ1aWxkU29ydENvbHVtblF1ZXJ5KEFjY291bnQudGFibGVOYW1lLCBjb2x1bW5LZXksIGRpcmVjdGlvbikocXVlcnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IEFjY291bnRUeXBlID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudFR5cGUnKTtcbiAgICBjb25zdCBBY2NvdW50QmFsYW5jZSA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnRCYWxhbmNlJyk7XG4gICAgY29uc3QgQWNjb3VudFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudFRyYW5zYWN0aW9uJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBBY2NvdW50IG1vZGVsIG1heSBiZWxvbmdzIHRvIGFjY291bnQgdHlwZS5cbiAgICAgICAqL1xuICAgICAgdHlwZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50VHlwZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50cy5hY2NvdW50VHlwZUlkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBBY2NvdW50IG1vZGVsIG1heSBoYXMgbWFueSBiYWxhbmNlcyBhY2NvdW50cy5cbiAgICAgICAqL1xuICAgICAgYmFsYW5jZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50QmFsYW5jZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50cy5pZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50X2JhbGFuY2VzLmFjY291bnRJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgbW9kZWwgbWF5IGhhcyBtYW55IHRyYW5zYWN0aW9ucy5cbiAgICAgICAqL1xuICAgICAgdHJhbnNhY3Rpb25zOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNNYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50VHJhbnNhY3Rpb24uZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnYWNjb3VudHMuaWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudHNfdHJhbnNhY3Rpb25zLmFjY291bnRJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgY29sbGVjdEpvdXJuYWxFbnRyaWVzKGFjY291bnRzKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oYWNjb3VudHMubWFwKChhY2NvdW50KSA9PiBhY2NvdW50LnRyYW5zYWN0aW9ucy5tYXAoKHRyYW5zYWN0aW9uKSA9PiAoe1xuICAgICAgYWNjb3VudElkOiBhY2NvdW50LmlkLFxuICAgICAgLi4udHJhbnNhY3Rpb24sXG4gICAgICBhY2NvdW50Tm9ybWFsOiBhY2NvdW50LnR5cGUubm9ybWFsLFxuICAgIH0pKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZsYXR0ZW4gYWNjb3VudHMgbGlzdCB0byBuZXN0ZWQgYXJyYXkuIFxuICAgKiBAcGFyYW0ge0FycmF5fSBhY2NvdW50cyBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgXG4gICAqL1xuICBzdGF0aWMgdG9OZXN0ZWRBcnJheShhY2NvdW50cywgb3B0aW9ucyA9IHsgY2hpbGRyZW46ICdjaGlsZHJlbicgfSkge1xuICAgIHJldHVybiBmbGF0VG9OZXN0ZWRBcnJheShhY2NvdW50cywgeyBpZDogJ2lkJywgcGFyZW50SWQ6ICdwYXJlbnRBY2NvdW50SWQnIH0pXG4gIH1cblxuICBzdGF0aWMgdG9EZXBlbmRlbmN5R3JhcGgoYWNjb3VudHMpIHtcbiAgICByZXR1cm4gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgIGFjY291bnRzLCB7IGl0ZW1JZDogJ2lkJywgcGFyZW50SXRlbUlkOiAncGFyZW50QWNjb3VudElkJyB9XG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjb3VudEJhbGFuY2UgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2FjY291bnRfYmFsYW5jZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IEFjY291bnQgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50Jyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2FjY291bnRfYmFsYW5jZXMuYWNjb3VudF9pZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IENhY2hhYmxlUXVlcnlCdWlsZGVyIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuaW1wb3J0IERhdGVTZXNzaW9uIGZyb20gJ0AvbW9kZWxzL0RhdGVTZXNzaW9uJztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50VHJhbnNhY3Rpb24gZXh0ZW5kcyBtaXhpbihUZW5hbnRNb2RlbCwgW0NhY2hhYmxlTW9kZWwsIERhdGVTZXNzaW9uXSkge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdhY2NvdW50c190cmFuc2FjdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dGVuZCBxdWVyeSBidWlsZGVyIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGdldCBRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIENhY2hhYmxlUXVlcnlCdWlsZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIG1vZGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXQgbW9kaWZpZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJBY2NvdW50cyhxdWVyeSwgYWNjb3VudHNJZHMpIHtcbiAgICAgICAgaWYgKGFjY291bnRzSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVyeS53aGVyZUluKCdhY2NvdW50X2lkJywgYWNjb3VudHNJZHMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyVHJhbnNhY3Rpb25UeXBlcyhxdWVyeSwgdHlwZXMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZXMpICYmIHR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVyeS53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIHR5cGVzKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ3JlZmVyZW5jZV90eXBlJywgdHlwZXMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyRGF0ZVJhbmdlKHF1ZXJ5LCBzdGFydERhdGUsIGVuZERhdGUsIHR5cGUgPSAnZGF5Jykge1xuICAgICAgICBjb25zdCBkYXRlRm9ybWF0ID0gJ1lZWVktTU0tREQgSEg6bW06c3MnO1xuICAgICAgICBjb25zdCBmcm9tRGF0ZSA9IG1vbWVudChzdGFydERhdGUpLnN0YXJ0T2YodHlwZSkuZm9ybWF0KGRhdGVGb3JtYXQpO1xuICAgICAgICBjb25zdCB0b0RhdGUgPSBtb21lbnQoZW5kRGF0ZSkuZW5kT2YodHlwZSkuZm9ybWF0KGRhdGVGb3JtYXQpO1xuXG4gICAgICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgnZGF0ZScsICc+PScsIGZyb21EYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kRGF0ZSkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdkYXRlJywgJzw9JywgdG9EYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlckFtb3VudFJhbmdlKHF1ZXJ5LCBmcm9tQW1vdW50LCB0b0Ftb3VudCkge1xuICAgICAgICBpZiAoZnJvbUFtb3VudCkge1xuICAgICAgICAgIHF1ZXJ5LmFuZFdoZXJlKChxKSA9PiB7XG4gICAgICAgICAgICBxLndoZXJlKCdjcmVkaXQnLCAnPj0nLCBmcm9tQW1vdW50KTtcbiAgICAgICAgICAgIHEub3JXaGVyZSgnZGViaXQnLCAnPj0nLCBmcm9tQW1vdW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9BbW91bnQpIHtcbiAgICAgICAgICBxdWVyeS5hbmRXaGVyZSgocSkgPT4ge1xuICAgICAgICAgICAgcS53aGVyZSgnY3JlZGl0JywgJzw9JywgdG9BbW91bnQpO1xuICAgICAgICAgICAgcS5vcldoZXJlKCdkZWJpdCcsICc8PScsIHRvQW1vdW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN1bWF0aW9uQ3JlZGl0RGViaXQocXVlcnkpIHtcbiAgICAgICAgcXVlcnkuc3VtKCdjcmVkaXQgYXMgY3JlZGl0Jyk7XG4gICAgICAgIHF1ZXJ5LnN1bSgnZGViaXQgYXMgZGViaXQnKTtcbiAgICAgICAgcXVlcnkuZ3JvdXBCeSgnYWNjb3VudF9pZCcpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IEFjY291bnQgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50Jyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2FjY291bnRzX3RyYW5zYWN0aW9ucy5hY2NvdW50SWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCIvLyBpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjY291bnRUeXBlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdhY2NvdW50X3R5cGVzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBBY2NvdW50ID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogQWNjb3VudCB0eXBlIG1heSBoYXMgbWFueSBhc3NvY2lhdGVkIGFjY291bnRzLlxuICAgICAgICovXG4gICAgICBhY2NvdW50czoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoQWNjb3VudC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50X3R5cGVzLmlkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmFjY291bnRUeXBlSWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGgge1xuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICovXG4gIHN0YXRpYyBnZXQgdXNlcigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqIEBwYXJhbSB7VXNlcn0gdXNlclxuICAgKi9cbiAgc3RhdGljIHNldEF1dGhlbnRpY2F0ZWRVc2VyKHVzZXIpIHtcbiAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgSUQuXG4gICAqL1xuICBzdGF0aWMgdXNlcklkKCkge1xuICAgIGlmICghdGhpcy51c2VyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVzZXIuaWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdXNlciBpcyBsb2dnZWQgb3Igbm90LlxuICAgKi9cbiAgc3RhdGljIGlzTG9nZ2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMudXNlcjtcbiAgfVxuXG4gIHN0YXRpYyBsb2dnZWRPdXQoKSB7XG4gICAgdGhpcy51c2VyID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL01vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVkZ2V0IGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdidWRnZXRzJztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsncmFuZ2VCeScsICdyYW5nZUluY3JlbWVudCddO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIG1vZGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXQgbW9kaWZpZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJCeVllYXIocXVlcnksIHllYXIpIHtcbiAgICAgICAgcXVlcnkud2hlcmUoJ3llYXInLCB5ZWFyKTtcbiAgICAgIH0sXG4gICAgICBmaWx0ZXJCeUluY29tZVN0YXRlbWVudChxdWVyeSkge1xuICAgICAgICBxdWVyeS53aGVyZSgnYWNjb3VudF90eXBlcycsICdpbmNvbWVfc3RhdGVtZW50Jyk7XG4gICAgICB9LFxuICAgICAgZmlsdGVyQnlQcm9maXRMb3NzKHF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKCdhY2NvdW50c190eXBlcycsICdwcm9maXRfbG9zcycpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHJhbmdlQnkoKSB7XG4gICAgc3dpdGNoICh0aGlzLnBlcmlvZCkge1xuICAgICAgY2FzZSAnaGFsZi15ZWFyJzpcbiAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICByZXR1cm4gJ21vbnRoJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLnBlcmlvZDtcbiAgICB9XG4gIH1cblxuICBnZXQgcmFuZ2VJbmNyZW1lbnQoKSB7XG4gICAgc3dpdGNoICh0aGlzLnBlcmlvZCkge1xuICAgICAgY2FzZSAnaGFsZi15ZWFyJzpcbiAgICAgICAgcmV0dXJuIDY7XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIDM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmFuZ2VPZmZzZXQoKSB7XG4gICAgc3dpdGNoICh0aGlzLnBlcmlvZCkge1xuICAgICAgY2FzZSAnaGFsZi15ZWFyJzogcmV0dXJuIDU7XG4gICAgICBjYXNlICdxdWFydGVyJzogcmV0dXJuIDI7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gMDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1ZGdldCBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYnVkZ2V0X2VudHJpZXMnO1xuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDdXJyZW5jeSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnY3VycmVuY2llcyc7XG4gIH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsKSA9PiB7XG4gIHJldHVybiBjbGFzcyBEYXRlU2Vzc2lvbiBleHRlbmRzIE1vZGVsIHtcblxuICAgIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgICB9XG5cbiAgICAkYmVmb3JlVXBkYXRlKG9wdCwgY29udGV4dCkge1xuICAgICAgY29uc3QgbWF5YmVQcm9taXNlID0gc3VwZXIuJGJlZm9yZVVwZGF0ZShvcHQsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlU2Vzc2lvbi50aW1lc3RhbXBzWzFdKSB7XG4gICAgICAgICAgdGhpc1tEYXRlU2Vzc2lvbi50aW1lc3RhbXBzWzFdXSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkYmVmb3JlSW5zZXJ0KGNvbnRleHQpIHtcbiAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHN1cGVyLiRiZWZvcmVJbnNlcnQoY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKERhdGVTZXNzaW9uLnRpbWVzdGFtcHNbMF0pIHtcbiAgICAgICAgICB0aGlzW0RhdGVTZXNzaW9uLnRpbWVzdGFtcHNbMF1dID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBiY3J5cHQgZnJvbSAnYmNyeXB0anMnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhjaGFuZ2VSYXRlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnZXhjaGFuZ2VfcmF0ZXMnO1xuICB9XG59IiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCB7IHZpZXdSb2xlc0J1aWxkZXIgfSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhwZW5zZSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnZXhwZW5zZXMnO1xuICB9XG5cbiAgc3RhdGljIGdldCByZWZlcmVuY2VUeXBlKCkge1xuICAgIHJldHVybiAnRXhwZW5zZSc7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgbW9kaWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldCBtb2RpZmllcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlckJ5RGF0ZVJhbmdlKHF1ZXJ5LCBzdGFydERhdGUsIGVuZERhdGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdkYXRlJywgJz49Jywgc3RhcnREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kRGF0ZSkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdkYXRlJywgJzw9JywgZW5kRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJCeUFtb3VudFJhbmdlKHF1ZXJ5LCBmcm9tLCB0bykge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdhbW91bnQnLCAnPj0nLCBmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG8pIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgnYW1vdW50JywgJzw9JywgdG8pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyQnlFeHBlbnNlQWNjb3VudChxdWVyeSwgYWNjb3VudElkKSB7XG4gICAgICAgIGlmIChhY2NvdW50SWQpIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgnZXhwZW5zZV9hY2NvdW50X2lkJywgYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlckJ5UGF5bWVudEFjY291bnQocXVlcnksIGFjY291bnRJZCkge1xuICAgICAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ3BheW1lbnRfYWNjb3VudF9pZCcsIGFjY291bnRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHZpZXdSb2xlc0J1aWxkZXIocXVlcnksIGNvbmRpdGlvbmFscywgZXhwcmVzc2lvbikge1xuICAgICAgICB2aWV3Um9sZXNCdWlsZGVyKGNvbmRpdGlvbmFscywgZXhwcmVzc2lvbikocXVlcnkpO1xuICAgICAgfSxcblxuICAgICAgb3JkZXJCeShxdWVyeSkge1xuICAgICAgICBcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IEFjY291bnQgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50Jyk7XG4gICAgY29uc3QgVXNlciA9IHJlcXVpcmUoJ0AvbW9kZWxzL1RlbmFudFVzZXInKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bWVudEFjY291bnQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoQWNjb3VudC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdleHBlbnNlcy5wYXltZW50QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGV4cGVuc2VBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnZXhwZW5zZXMuZXhwZW5zZUFjY291bnRJZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFVzZXIuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnZXhwZW5zZXMudXNlcklkJyxcbiAgICAgICAgICB0bzogJ3VzZXJzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCB7XG4gIGJ1aWxkRmlsdGVyUXVlcnksXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJdGVtIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdpdGVtcyc7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgbW9kaWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldCBtb2RpZmllcnMoKSB7XG4gICAgY29uc3QgVEFCTEVfTkFNRSA9IEl0ZW0udGFibGVOYW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNvcnRCeShxdWVyeSwgY29sdW1uU29ydCwgc29ydERpcmVjdGlvbikge1xuICAgICAgICBxdWVyeS5vcmRlckJ5KGNvbHVtblNvcnQsIHNvcnREaXJlY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHZpZXdSb2xlc0J1aWxkZXIocXVlcnksIGNvbmRpdGlvbnMsIGxvZ2ljRXhwcmVzc2lvbikge1xuICAgICAgICBidWlsZEZpbHRlclF1ZXJ5KEl0ZW0udGFibGVOYW1lLCBjb25kaXRpb25zLCBsb2dpY0V4cHJlc3Npb24pKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBNZWRpYSA9IHJlcXVpcmUoJ0AvbW9kZWxzL01lZGlhJyk7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcbiAgICBjb25zdCBJdGVtQ2F0ZWdvcnkgPSByZXF1aXJlKCdAL21vZGVscy9JdGVtQ2F0ZWdvcnknKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEl0ZW0gbWF5IGJlbG9uZ3MgdG8gY2F0ZW9nb3J5IG1vZGVsLlxuICAgICAgICovXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChJdGVtQ2F0ZWdvcnkuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuY2F0ZWdvcnlJZCcsXG4gICAgICAgICAgdG86ICdpdGVtc19jYXRlZ29yaWVzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGNvc3RBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuY29zdEFjY291bnRJZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBzZWxsQWNjb3VudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2l0ZW1zLnNlbGxBY2NvdW50SWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgaW52ZW50b3J5QWNjb3VudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2l0ZW1zLmludmVudG9yeUFjY291bnRJZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBtZWRpYToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuTWFueVRvTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoTWVkaWEuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuaWQnLFxuICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgIGZyb206ICdtZWRpYV9saW5rcy5tb2RlbF9pZCcsXG4gICAgICAgICAgICB0bzogJ21lZGlhX2xpbmtzLm1lZGlhX2lkJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRvOiAnbWVkaWEuaWQnLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSXRlbUNhdGVnb3J5IGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnaXRlbXNfY2F0ZWdvcmllcyc7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgSXRlbSA9IHJlcXVpcmUoJ0AvbW9kZWxzL0l0ZW0nKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEl0ZW0gY2F0ZWdvcnkgbWF5IGhhcyBtYW55IGl0ZW1zLlxuICAgICAgICovXG4gICAgICBpdGVtczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoSXRlbS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtc19jYXRlZ29yaWVzLmlkJyxcbiAgICAgICAgICB0bzogJ2l0ZW1zLmNhdGVnb3J5SWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYW51YWxKb3VybmFsIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnbWFudWFsX2pvdXJuYWxzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBNZWRpYSA9IHJlcXVpcmUoJ0AvbW9kZWxzL01lZGlhJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWVkaWE6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KE1lZGlhLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ21hbnVhbF9qb3VybmFscy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ21lZGlhX2xpbmtzLm1vZGVsX2lkJyxcbiAgICAgICAgICAgIHRvOiAnbWVkaWFfbGlua3MubWVkaWFfaWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdtZWRpYS5pZCcsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZWRpYSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnbWVkaWEnO1xuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZWRpYUxpbmsgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ21lZGlhX2xpbmtzJztcbiAgfVxufVxuIiwiaW1wb3J0IGtuZXggZnJvbSAnQC9kYXRhYmFzZS9rbmV4Jztcbi8vIGltcG9ydCBjYWNoZSBmcm9tICdtZW1vcnktY2FjaGUnO1xuXG4vLyBNZXRhZGF0YVxuZXhwb3J0IGRlZmF1bHQge1xuICBNRVRBREFUQV9HUk9VUDogJ2RlZmF1bHQnLFxuICBLRVlfQ09MVU1OOiAna2V5JyxcbiAgVkFMVUVfQ09MVU1OOiAndmFsdWUnLFxuICBUWVBFX0NPTFVNTjogJ3R5cGUnLFxuXG4gIGV4dHJhQ29sdW1uczogW10sXG4gIG1ldGFkYXRhOiBbXSxcbiAgc2hvdWxkUmVsb2FkOiB0cnVlLFxuICBleHRyYU1ldGFkYXRhUXVlcnk6ICgpID0+IHt9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIGNvbHVtbiBrZXkgdG8gcXVlcnkgZnJvbS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLVxuICAgKi9cbiAgc2V0S2V5Q29sdW1uTmFtZShuYW1lKSB7XG4gICAgdGhpcy5LRVlfQ09MVU1OID0gbmFtZTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0IHRoZSBrZXkgY29sdW1uIG5hbWUgdG8gcXVlcnkgZnJvbS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLVxuICAgKi9cbiAgc2V0VmFsdWVDb2x1bW5OYW1lKG5hbWUpIHtcbiAgICB0aGlzLlZBTFVFX0NPTFVNTiA9IG5hbWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldCBleHRyYSBjb2x1bW5zIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zIC1cbiAgICovXG4gIHNldEV4dHJhQ29sdW1ucyhjb2x1bW5zKSB7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBjb2x1bW5zO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBkYXRhYmFzZSBxdWVyeS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5IC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGdyb3VwTmFtZSAtXG4gICAqL1xuICB3aGVyZVF1ZXJ5KHF1ZXJ5LCBrZXkpIHtcbiAgICBjb25zdCBncm91cE5hbWUgPSB0aGlzLk1FVEFEQVRBX0dST1VQO1xuXG4gICAgaWYgKGdyb3VwTmFtZSkge1xuICAgICAgcXVlcnkud2hlcmUoJ2dyb3VwJywgZ3JvdXBOYW1lKTtcbiAgICB9XG4gICAgaWYgKGtleSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICBxdWVyeS53aGVyZUluKCdrZXknLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkud2hlcmUoJ2tleScsIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGtleSAtXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2UgLVxuICAgKi9cbiAgYXN5bmMgbG9hZChmb3JjZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkUmVsb2FkIHx8IGZvcmNlKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YUNvbGxlY3Rpb24gPSBhd2FpdCB0aGlzLnF1ZXJ5KChxdWVyeSkgPT4ge1xuICAgICAgICB0aGlzLndoZXJlUXVlcnkocXVlcnkpO1xuICAgICAgICB0aGlzLmV4dHJhTWV0YWRhdGFRdWVyeShxdWVyeSk7XG4gICAgICB9KS5mZXRjaEFsbCgpO1xuXG4gICAgICB0aGlzLnNob3VsZFJlbG9hZCA9IGZhbHNlO1xuICAgICAgdGhpcy5tZXRhZGF0YSA9IFtdO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUFycmF5ID0gdGhpcy5tYXBNZXRhZGF0YUNvbGxlY3Rpb24obWV0YWRhdGFDb2xsZWN0aW9uKTtcbiAgICAgIG1ldGFkYXRhQXJyYXkuZm9yRWFjaCgobWV0YWRhdGEpID0+IHsgdGhpcy5tZXRhZGF0YS5wdXNoKG1ldGFkYXRhKTsgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFsbCB0aGUgbWV0YWRhdGEgdGhhdCBhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBncm91cC5cbiAgICovXG4gIGFzeW5jIGFsbE1ldGEoZm9yY2UgPSBmYWxzZSkge1xuICAgIGF3YWl0IHRoaXMubG9hZChmb3JjZSk7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGdpdmVuIG1ldGFkYXRhIGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBNZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBmaW5kTWV0YShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5maW5kKChtZXRhKSA9PiBtZXRhLmtleSA9PT0ga2V5KTtcbiAgfSxcblxuICAvKipcbiAgICogRmV0Y2ggdGhlIG1ldGFkYXRhIG9mIHRoZSBjdXJyZW50IGdyb3VwLlxuICAgKiBAcGFyYW0geyp9IGtleSAtXG4gICAqL1xuICBhc3luYyBnZXRNZXRhKGtleSwgZGVmYXVsdFZhbHVlLCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkKGZvcmNlKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YShrZXkpO1xuICAgIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhLnZhbHVlIDogZGVmYXVsdFZhbHVlIHx8IGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNYXJrZXMgdGhlIG1ldGFkYXRhIHRvIHNob3VsZCBiZSBkZWxldGVkLlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICovXG4gIGFzeW5jIHJlbW92ZU1ldGEoa2V5KSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmZpbmRNZXRhKGtleSk7XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIG1ldGFkYXRhLm1hcmtBc0RlbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnNob3VsZFJlbG9hZCA9IHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgbWV0YSBkYXRhIG9mIHRoZSBnaXZlbiBncm91cC5cbiAgICogQHBhcmFtIHsqfSBncm91cFxuICAgKi9cbiAgcmVtb3ZlQWxsTWV0YShncm91cCA9ICdkZWZhdWx0Jykge1xuICAgIHRoaXMubWV0ZGF0YS5tYXAoKG1ldGEpID0+ICh7XG4gICAgICAuLi4obWV0YS5ncm91cCAhPT0gZ3JvdXApID8geyBtYXJrQXNEZWxldGVkOiB0cnVlIH0gOiB7fSxcbiAgICAgIC4uLm1ldGEsXG4gICAgfSkpO1xuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0IHRoZSBtZXRhIGRhdGEgdG8gdGhlIHN0YWNrLlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC1cbiAgICovXG4gIGFzeW5jIHNldE1ldGEoa2V5LCB2YWx1ZSwgcGF5bG9hZCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0ga2V5O1xuICAgICAgbWV0YWRhdGEuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICB0aGlzLnNldE1ldGEobWV0YS5rZXksIG1ldGEudmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmZpbmRNZXRhKGtleSk7XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIG1ldGFkYXRhLnZhbHVlID0gdmFsdWU7XG4gICAgICBtZXRhZGF0YS5tYXJrQXNVcGRhdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YS5wdXNoKHtcbiAgICAgICAgdmFsdWUsIGtleSwgLi4ucGF5bG9hZCwgbWFya0FzSW5zZXJ0ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmVkIHRoZSBtb2RpZmllZCBtZXRhZGF0YS5cbiAgICovXG4gIGFzeW5jIHNhdmVNZXRhKCkge1xuICAgIGNvbnN0IGluc2VydGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc0luc2VydGVkID09PSB0cnVlKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMubWV0YWRhdGEuZmlsdGVyKChtKSA9PiAobS5tYXJrQXNVcGRhdGVkID09PSB0cnVlKSk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMubWV0YWRhdGEuZmlsdGVyKChtKSA9PiAobS5tYXJrQXNEZWxldGVkID09PSB0cnVlKSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YURlbGV0ZWRLZXlzID0gZGVsZXRlZC5tYXAoKG0pID0+IG0ua2V5KTtcbiAgICBjb25zdCBtZXRhZGF0YUluc2VydGVkID0gaW5zZXJ0ZWQubWFwKChtKSA9PiB0aGlzLm1hcE1ldGFkYXRhKG0sICdmb3JtYXQnKSk7XG4gICAgY29uc3QgbWV0YWRhdGFVcGRhdGVkID0gdXBkYXRlZC5tYXAoKG0pID0+IHRoaXMubWFwTWV0YWRhdGEobSwgJ2Zvcm1hdCcpKTtcblxuICAgIGNvbnN0IGJhdGNoVXBkYXRlID0gKGNvbGxlY3Rpb24pID0+IGtuZXgudHJhbnNhY3Rpb24oKHRyeCkgPT4ge1xuICAgICAgY29uc3QgcXVlcmllcyA9IGNvbGxlY3Rpb24ubWFwKCh0dXBsZSkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGtuZXgodGhpcy50YWJsZU5hbWUpO1xuICAgICAgICB0aGlzLndoZXJlUXVlcnkocXVlcnksIHR1cGxlLmtleSk7XG4gICAgICAgIHRoaXMuZXh0cmFNZXRhZGF0YVF1ZXJ5KHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5LnVwZGF0ZSh0dXBsZSkudHJhbnNhY3RpbmcodHJ4KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXJpZXMpLnRoZW4odHJ4LmNvbW1pdCkuY2F0Y2godHJ4LnJvbGxiYWNrKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGtuZXguaW5zZXJ0KG1ldGFkYXRhSW5zZXJ0ZWQpLmludG8odGhpcy50YWJsZU5hbWUpLFxuICAgICAgYmF0Y2hVcGRhdGUobWV0YWRhdGFVcGRhdGVkKSxcbiAgICAgIG1ldGFkYXRhRGVsZXRlZEtleXMubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMucXVlcnkoJ3doZXJlSW4nLCB0aGlzLktFWV9DT0xVTU4sIG1ldGFkYXRhRGVsZXRlZEtleXMpLmRlc3Ryb3koe1xuICAgICAgICAgIHJlcXVpcmU6IHRydWUsXG4gICAgICAgIH0pIDogbnVsbCxcbiAgICBdKTtcbiAgICB0aGlzLnNob3VsZFJlbG9hZCA9IHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFB1cmdlIGFsbCB0aGUgY2FjaGVkIG1ldGFkYXRhIGluIHRoZSBtZW1vcnkuXG4gICAqL1xuICBwdXJnZU1ldGFkYXRhKCkge1xuICAgIHRoaXMubWV0YWRhdGEgPSBbXTtcbiAgICB0aGlzLnNob3VsZFJlbG9hZCA9IHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgdmFsdWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVR5cGUgLVxuICAgKi9cbiAgcGFyc2VNZXRhVmFsdWUodmFsdWUsIHZhbHVlVHlwZSkge1xuICAgIGxldCBwYXJzZWRWYWx1ZTtcblxuICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBCb29sZWFuKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBKU09OLnBhcnNlKHBhcnNlZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIG1ldGFkYXRhIGJlZm9yZSBzYXZpbmcgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ8Qm9vbGVhbn0gdmFsdWUgLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVUeXBlIC1cbiAgICogQHJldHVybiB7U3RyaW5nfE51bWJlcnxCb29sZWFufSAtXG4gICAqL1xuICBmb3JtYXRNZXRhVmFsdWUodmFsdWUsIHZhbHVlVHlwZSkge1xuICAgIGxldCBwYXJzZWRWYWx1ZTtcblxuICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gdmFsdWUgPyAnMScgOiAnMCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gIH0sXG5cbiAgbWFwTWV0YWRhdGEoYXR0ciwgcGFyc2VUeXBlID0gJ3BhcnNlJykge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGF0dHJbdGhpcy5LRVlfQ09MVU1OXSxcbiAgICAgIHZhbHVlOiAocGFyc2VUeXBlID09PSAncGFyc2UnKVxuICAgICAgICA/IHRoaXMucGFyc2VNZXRhVmFsdWUoXG4gICAgICAgICAgYXR0clt0aGlzLlZBTFVFX0NPTFVNTl0sXG4gICAgICAgICAgdGhpcy5UWVBFX0NPTFVNTiA/IGF0dHJbdGhpcy5UWVBFX0NPTFVNTl0gOiBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICA6IHRoaXMuZm9ybWF0TWV0YVZhbHVlKFxuICAgICAgICAgIGF0dHJbdGhpcy5WQUxVRV9DT0xVTU5dLFxuICAgICAgICAgIHRoaXMuVFlQRV9DT0xVTU4gPyBhdHRyW3RoaXMuVFlQRV9DT0xVTU5dIDogZmFsc2UsXG4gICAgICAgICksXG4gICAgICAuLi50aGlzLmV4dHJhQ29sdW1ucy5tYXAoKGV4dHJhQ29sKSA9PiAoe1xuICAgICAgICBbZXh0cmFDb2xdOiBhdHRyW2V4dHJhQ29sXSB8fCBudWxsLFxuICAgICAgfSkpLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBtZXRhZGF0YSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2xsZWN0aW9uIC1cbiAgICovXG4gIG1hcE1ldGFkYXRhQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBwYXJzZVR5cGUgPSAncGFyc2UnKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24ubWFwKChtb2RlbCkgPT4gdGhpcy5tYXBNZXRhZGF0YShtb2RlbC5hdHRyaWJ1dGVzLCBwYXJzZVR5cGUpKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgeyBzbmFrZUNhc2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgbWFwS2V5c0RlZXAgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBQYWdpbmF0aW9uUXVlcnlCdWlsZGVyIGZyb20gJ0AvbW9kZWxzL1BhZ2luYXRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RlbEJhc2UgZXh0ZW5kcyBNb2RlbCB7XG5cbiAgc3RhdGljIGdldCBrbmV4QmluZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmtuZXhCaW5kSW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgc2V0IGtuZXhCaW5kZWQoa25leCkge1xuICAgIHRoaXMua25leEJpbmRJbnN0YW5jZSA9IGtuZXg7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIEFycmF5O1xuICB9XG5cbiAgc3RhdGljIHF1ZXJ5KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc3VwZXIucXVlcnkoLi4uYXJncykucnVuQWZ0ZXIoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmZyb20ocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAkZm9ybWF0SnNvbihqc29uLCBvcHQpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IG1hcEtleXNEZWVwKGpzb24sICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICByZXR1cm4gc25ha2VDYXNlKGtleSk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkSnNvbiA9IHN1cGVyLiRmb3JtYXRKc29uKHRyYW5zZm9ybWVkLCBvcHQpO1xuICAgIHJldHVybiBwYXJzZWRKc29uO1xuICB9XG5cbiAgc3RhdGljIGdldCBRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIFBhZ2luYXRpb25RdWVyeUJ1aWxkZXI7XG4gIH1cblxuICBzdGF0aWMgcmVsYXRpb25CaW5kS25leChtb2RlbCkge1xuICAgIHJldHVybiB0aGlzLmtuZXhCaW5kZWQgPyBtb2RlbC5iaW5kS25leCh0aGlzLmtuZXhCaW5kZWQpIDogbW9kZWw7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgTWV0YWJsZUNvbGxlY3Rpb24gZnJvbSAnQC9saWIvTWV0YWJsZS9NZXRhYmxlQ29sbGVjdGlvbic7XG5pbXBvcnQgZGVmaW5lZE9wdGlvbnMgZnJvbSAnQC9kYXRhL29wdGlvbnMnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9wdGlvbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ29wdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC1cbiAgICovXG4gIHN0YXRpYyBxdWVyeSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnF1ZXJ5KC4uLmFyZ3MpLnJ1bkFmdGVyKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBNZXRhYmxlQ29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQuc2V0TW9kZWwodGhpcy50ZW5hbnQoKSk7XG4gICAgICAgIHJlc3VsdC5zZXRFeHRyYUNvbHVtbnMoWydncm91cCddKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgY29sbGVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gTWV0YWJsZUNvbGxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBvcHRpb25zIGlzIGRlZmluZWQgb3IgZWl0aGVyIG5vdC5cbiAgICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucyBcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZURlZmluZWQob3B0aW9ucykge1xuICAgIGNvbnN0IG5vdERlZmluZWQgPSBbXTtcblxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoIWRlZmluZWRPcHRpb25zW29wdGlvbi5ncm91cF0pIHtcbiAgICAgICAgbm90RGVmaW5lZC5wdXNoKG9wdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKCFkZWZpbmVkT3B0aW9uc1tvcHRpb24uZ3JvdXBdLnNvbWUoKG8pID0+IG8ua2V5ID09PSBvcHRpb24ua2V5KSkge1xuICAgICAgICBub3REZWZpbmVkLnB1c2gob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbm90RGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uUXVlcnlCdWlsZGVyIGV4dGVuZHMgTW9kZWwuUXVlcnlCdWlsZGVyIHtcbiAgcGFnaW5hdGlvbihwYWdlLCBwYWdlU2l6ZSkge1xuICAgIHJldHVybiBzdXBlci5wYWdlKHBhZ2UsIHBhZ2VTaXplKS5ydW5BZnRlcihcbiAgICAgICh7IHJlc3VsdHMsIHRvdGFsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHRzLFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgcGFnZTogcGFnZSArIDEsXG4gICAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgfVxufSIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUgb2YgUm9sZSBtb2RlbC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncGVybWlzc2lvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJvbGUgPSByZXF1aXJlKCdAL21vZGVscy9Sb2xlJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBQZXJtaXNzaW9uIG1vZGVsIG1heSBiZWxvbmdzIHRvIHJvbGUgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIC8vIHJvbGU6IHtcbiAgICAgIC8vICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgLy8gICBtb2RlbEJhc2U6IHBhdGguam9pbihfX2Rpcm5hbWUsICdSb2xlJykuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgIC8vICAgam9pbjoge1xuICAgICAgLy8gICAgIGZyb206ICdwZXJtaXNzaW9ucy5yb2xlX2lkJyxcbiAgICAgIC8vICAgICB0bzogJ3JvbGVzLmlkJyxcbiAgICAgIC8vICAgfSxcbiAgICAgIC8vIH0sXG5cbiAgICAgIC8vIHJlc291cmNlOiB7XG4gICAgICAvLyAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgIC8vICAgbW9kZWxCYXNlOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnUmVzb3VyY2UnKSxcbiAgICAgIC8vICAgam9pbjoge1xuICAgICAgLy8gICAgIGZyb206ICdwZXJtaXNzaW9ucy4nLFxuICAgICAgLy8gICAgIHRvOiAnJyxcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IENhY2hhYmxlUXVlcnlCdWlsZGVyIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZSBleHRlbmRzIG1peGluKFRlbmFudE1vZGVsLCBbQ2FjaGFibGVNb2RlbF0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Jlc291cmNlcyc7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHF1ZXJ5IGJ1aWxkZXIgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0IFF1ZXJ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4gQ2FjaGFibGVRdWVyeUJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFZpZXcgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Jyk7XG4gICAgY29uc3QgUmVzb3VyY2VGaWVsZCA9IHJlcXVpcmUoJ0AvbW9kZWxzL1Jlc291cmNlRmllbGQnKTtcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvUGVybWlzc2lvbicpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUmVzb3VyY2UgbW9kZWwgbWF5IGhhcyBtYW55IHZpZXdzLlxuICAgICAgICovXG4gICAgICB2aWV3czoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVmlldy5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICAgIHRvOiAndmlld3MucmVzb3VyY2VJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc291cmNlIG1vZGVsIG1heSBoYXMgbWFueSBmaWVsZHMuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2VGaWVsZC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICAgIHRvOiAncmVzb3VyY2VfZmllbGRzLnJlc291cmNlSWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvdXJjZSBtb2RlbCBtYXkgaGFzIG1hbnkgYXNzb2NpYXRlZCBwZXJtaXNzaW9ucy5cbiAgICAgICAqL1xuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFBlcm1pc3Npb24uZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncmVzb3VyY2VzLmlkJyxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiAncm9sZV9oYXNfcGVybWlzc2lvbnMucmVzb3VyY2VJZCcsXG4gICAgICAgICAgICB0bzogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnBlcm1pc3Npb25JZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ3Blcm1pc3Npb25zLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VGaWVsZCBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Jlc291cmNlX2ZpZWxkcyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGpzb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ29wdGlvbnMnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2hlcmVOb3RQcmVkZWZpbmVkKHF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlTm90KCdwcmVkZWZpbmVkJywgdHJ1ZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsna2V5J107XG4gIH1cblxuICAvKipcbiAgICogUmVzb3VyY2UgZmllbGQga2V5LlxuICAgKi9cbiAga2V5KCkge1xuICAgIHJldHVybiBzbmFrZUNhc2UodGhpcy5sYWJlbE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlc291cmNlIGZpZWxkIG1heSBiZWxvbmdzIHRvIHJlc291cmNlIG1vZGVsLlxuICAgICAgICovXG4gICAgICByZXNvdXJjZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZV9maWVsZHMucmVzb3VyY2VJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IFJlc291cmNlRmllbGRNZXRhZGF0YUNvbGxlY3Rpb24gZnJvbSAnQC9jb2xsZWN0aW9uL1Jlc291cmNlRmllbGRNZXRhZGF0YUNvbGxlY3Rpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZUZpZWxkTWV0YWRhdGEgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdyZXNvdXJjZV9jdXN0b21fZmllbGRzX21ldGFkYXRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgcmVzb3VyY2UgZmllbGQgbWV0YWRhdGEgY29sbGVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUgb2YgUm9sZSBtb2RlbC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncm9sZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCBoYXNUaW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvUGVybWlzc2lvbicpO1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcbiAgICBjb25zdCBVc2VyID0gcmVxdWlyZSgnQC9tb2RlbHMvVGVuYW50VXNlcicpO1xuICAgIGNvbnN0IFJlc291cmNlRmllbGQgPSByZXF1aXJlKCdAL21vZGVscy9SZXNvdXJjZUZpZWxkJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgbWFueSBwZXJtaXNzaW9ucy5cbiAgICAgICAqL1xuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogUGVybWlzc2lvbi5kZWZhdWx0LmJpbmRLbmV4KHRoaXMua25leEJpbmRlZCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncm9sZXMuaWQnLFxuICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgIGZyb206ICdyb2xlX2hhc19wZXJtaXNzaW9ucy5yb2xlSWQnLFxuICAgICAgICAgICAgdG86ICdyb2xlX2hhc19wZXJtaXNzaW9ucy5wZXJtaXNzaW9uSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdwZXJtaXNzaW9ucy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJvbGUgbWF5IGhhcyBtYW55IHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5NYW55VG9NYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IFJlc291cmNlLmRlZmF1bHQuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyb2xlcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnJvbGVJZCcsXG4gICAgICAgICAgICB0bzogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnJlc291cmNlSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgcmVzb3VyY2UgZmllbGQuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogUmVzb3VyY2VGaWVsZC5kZWZhdWx0LmJpbmRLbmV4KHRoaXMua25leEJpbmRlZCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncm9sZXMuZmllbGRJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZV9maWVsZHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgbWFueSBhc3NvY2lhdGVkIHVzZXJzLlxuICAgICAgICovXG4gICAgICB1c2Vyczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuTWFueVRvTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiBVc2VyLmRlZmF1bHQuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyb2xlcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ3VzZXJfaGFzX3JvbGVzLnJvbGVJZCcsXG4gICAgICAgICAgICB0bzogJ3VzZXJfaGFzX3JvbGVzLnVzZXJJZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ3VzZXJzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBBdXRoIGZyb20gJy4vQXV0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNldHRpbmcgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3NldHRpbmdzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgaGFzVGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmEgbWV0YWRhdGEgcXVlcnkgdG8gcXVlcnkgd2l0aCB0aGUgY3VycmVudCBhdXRoZW50aWNhdGUgdXNlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5XG4gICAqL1xuICBzdGF0aWMgZXh0cmFNZXRhZGF0YVF1ZXJ5KHF1ZXJ5KSB7XG4gICAgaWYgKEF1dGguaXNMb2dnZWQoKSkge1xuICAgICAgcXVlcnkud2hlcmUoJ3VzZXJfaWQnLCBBdXRoLnVzZXJJZCgpKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnRNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyB0ZW5hbnQoKSB7XG4gICAgaWYgKCF0aGlzLmtuZXhCaW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVuYW50IGtuZXggaXMgbm90IGJpbmRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5iaW5kS25leCh0aGlzLmtuZXhCaW5kZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIGVtYmVkIG1vZGVscyB0byBleHByZXNzIHJlcXVlc3QuXG4gICAqL1xuICBzdGF0aWMgcmVxdWVzdE1vZGVsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgYmNyeXB0IGZyb20gJ2JjcnlwdGpzJztcbmltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IERhdGVTZXNzaW9uIGZyb20gJ0AvbW9kZWxzL0RhdGVTZXNzaW9uJztcbi8vIGltcG9ydCBQZXJtaXNzaW9uc1NlcnZpY2UgZnJvbSAnQC9zZXJ2aWNlcy9QZXJtaXNzaW9uc1NlcnZpY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnRVc2VyIGV4dGVuZHMgbWl4aW4oVGVuYW50TW9kZWwsIFtEYXRlU2Vzc2lvbl0pIHtcbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnZnVsbE5hbWUnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBSb2xlID0gcmVxdWlyZSgnQC9tb2RlbHMvUm9sZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvbGVzOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5NYW55VG9NYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSb2xlLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3VzZXJzLmlkJyxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiAndXNlcl9oYXNfcm9sZXMudXNlcklkJyxcbiAgICAgICAgICAgIHRvOiAndXNlcl9oYXNfcm9sZXMucm9sZUlkJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRvOiAncm9sZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGUgcGFzc3dvcmQgb2YgdGhlIHVzZXIuXG4gICAqIEBwYXJhbSAge1N0cmluZ30gcGFzc3dvcmQgLSBUaGUgZ2l2ZW4gcGFzc3dvcmQuXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICB2ZXJpZnlQYXNzd29yZChwYXNzd29yZCkge1xuICAgIHJldHVybiBiY3J5cHQuY29tcGFyZVN5bmMocGFzc3dvcmQsIHRoaXMucGFzc3dvcmQpO1xuICB9XG5cbiAgZnVsbE5hbWUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWUgfHwgJyd9YDtcbiAgfVxufSIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IENhY2hhYmxlUXVlcnlCdWlsZGVyIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3IGV4dGVuZHMgbWl4aW4oVGVuYW50TW9kZWwsIFtDYWNoYWJsZU1vZGVsXSkge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAndmlld3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dGVuZCBxdWVyeSBidWlsZGVyIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGdldCBRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIENhY2hhYmxlUXVlcnlCdWlsZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcbiAgICBjb25zdCBWaWV3Q29sdW1uID0gcmVxdWlyZSgnQC9tb2RlbHMvVmlld0NvbHVtbicpO1xuICAgIGNvbnN0IFZpZXdSb2xlID0gcmVxdWlyZSgnQC9tb2RlbHMvVmlld1JvbGUnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFZpZXcgbW9kZWwgYmVsb25ncyB0byByZXNvdXJjZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2UuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndmlld3MucmVzb3VyY2VJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBWaWV3IG1vZGVsIG1heSBoYXMgbWFueSBjb2x1bW5zLlxuICAgICAgICovXG4gICAgICBjb2x1bW5zOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNNYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChWaWV3Q29sdW1uLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3ZpZXdzLmlkJyxcbiAgICAgICAgICB0bzogJ3ZpZXdfaGFzX2NvbHVtbnMudmlld0lkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmlldyBtb2RlbCBtYXkgaGFzIG1hbnkgdmlldyByb2xlcy5cbiAgICAgICAqL1xuICAgICAgcm9sZXM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFZpZXdSb2xlLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3ZpZXdzLmlkJyxcbiAgICAgICAgICB0bzogJ3ZpZXdfcm9sZXMudmlld0lkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld0NvbHVtbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3ZpZXdfaGFzX2NvbHVtbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCBoYXNUaW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJlc291cmNlRmllbGQgPSByZXF1aXJlKCdAL21vZGVscy9SZXNvdXJjZUZpZWxkJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBWaWV3IHJvbGUgbW9kZWwgbWF5IGJlbG9uZ3MgdG8gcmVzb3VyY2UgZmllbGQgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFJlc291cmNlRmllbGQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndmlld19oYXNfY29sdW1ucy5maWVsZElkJyxcbiAgICAgICAgICB0bzogJ3Jlc291cmNlX2ZpZWxkcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdSb2xlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHZpcnR1YWxBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2NvbXBhcmF0b3JzJ107XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbXBhcmF0b3JzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnZXF1YWxzJywgJ25vdF9lcXVhbCcsICdjb250YWlucycsICdub3RfY29udGFpbicsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd2aWV3X3JvbGVzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgaGFzVGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2VGaWVsZCA9IHJlcXVpcmUoJ0AvbW9kZWxzL1Jlc291cmNlRmllbGQnKTtcbiAgICBjb25zdCBWaWV3ID0gcmVxdWlyZSgnQC9tb2RlbHMvVmlldycpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogVmlldyByb2xlIG1vZGVsIG1heSBiZWxvbmdzIHRvIHZpZXcgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIHZpZXc6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVmlldy5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd2aWV3X3JvbGVzLnZpZXdJZCcsXG4gICAgICAgICAgdG86ICd2aWV3cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZpZXcgcm9sZSBtb2RlbCBtYXkgYmVsb25ncyB0byByZXNvdXJjZSBmaWVsZCBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZmllbGQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2VGaWVsZC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd2aWV3X3JvbGVzLmZpZWxkSWQnLFxuICAgICAgICAgIHRvOiAncmVzb3VyY2VfZmllbGRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IGVycm9ySGFuZGxlciBmcm9tICdlcnJvcmhhbmRsZXInO1xuaW1wb3J0IGFwcCBmcm9tICdAL2FwcCc7XG5cbmFwcC51c2UoZXJyb3JIYW5kbGVyKTtcblxuY29uc3Qgc2VydmVyID0gYXBwLmxpc3RlbihhcHAuZ2V0KCdwb3J0JyksICgpID0+IHtcbiAgY29uc29sZS5sb2coXG4gICAgJyAgQXBwIGlzIHJ1bm5pbmcgYXQgaHR0cDovL2xvY2FsaG9zdDolZCBpbiAlcyBtb2RlJyxcbiAgICBhcHAuZ2V0KCdwb3J0JyksXG4gICAgYXBwLmdldCgnZW52JyksXG4gICk7XG4gIGNvbnNvbGUubG9nKCcgIFByZXNzIENUUkwtQyB0byBzdG9wJyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc2VydmVyO1xuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb3VybmFsRW50cnkge1xuICBjb25zdHJ1Y3RvcihlbnRyeSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgY3JlZGl0OiAwLFxuICAgICAgZGViaXQ6IDAsXG4gICAgfTtcbiAgICB0aGlzLmVudHJ5ID0geyAuLi5kZWZhdWx0cywgLi4uZW50cnkgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgSm91cm5hbEVudHJ5IGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsRW50cnknO1xuaW1wb3J0IEFjY291bnRUcmFuc2FjdGlvbiBmcm9tICdAL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24nO1xuaW1wb3J0IEFjY291bnRCYWxhbmNlIGZyb20gJ0AvbW9kZWxzL0FjY291bnRCYWxhbmNlJztcbmltcG9ydCB7cHJvbWlzZVNlcmlhbH0gZnJvbSAnQC91dGlscyc7XG5pbXBvcnQgQWNjb3VudCBmcm9tICdAL21vZGVscy9BY2NvdW50JztcbmltcG9ydCBOZXN0ZWRTZXQgZnJvbSAnLi4vLi4vY29sbGVjdGlvbi9OZXN0ZWRTZXQnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpvdXJuYWxQb3N0ZXIge1xuICAvKipcbiAgICogSm91cm5hbCBwb3N0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhY2NvdW50c0dyYXBoKSB7XG4gICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgdGhpcy5iYWxhbmNlc0NoYW5nZSA9IHt9O1xuICAgIHRoaXMuZGVsZXRlZEVudHJpZXNJZHMgPSBbXTtcblxuICAgIHRoaXMuYWNjb3VudHNCYWxhbmNlVGFibGUgPSB7fTtcbiAgICB0aGlzLmFjY291bnRzR3JhcGggPSBhY2NvdW50c0dyYXBoO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgY3JlZGl0IGVudHJ5IGZvciB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICogQHBhcmFtIHtKb3VybmFsRW50cnl9IGVudHJ5IC1cbiAgICovXG4gIGNyZWRpdChlbnRyeU1vZGVsKSB7XG4gICAgaWYgKGVudHJ5TW9kZWwgaW5zdGFuY2VvZiBKb3VybmFsRW50cnkgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBlbnRyeSBpcyBub3QgaW5zdGFuY2Ugb2YgSm91cm5hbEVudHJ5LicpO1xuICAgIH1cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeU1vZGVsLmVudHJ5KTtcbiAgICB0aGlzLnNldEFjY291bnRCYWxhbmNlQ2hhbmdlKGVudHJ5TW9kZWwuZW50cnksICdjcmVkaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGRlYml0IGVudHIgeSBmb3IgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqIEBwYXJhbSB7Sm91cm5hbEVudHJ5fSBlbnRyeSAtXG4gICAqL1xuICBkZWJpdChlbnRyeU1vZGVsKSB7XG4gICAgaWYgKGVudHJ5TW9kZWwgaW5zdGFuY2VvZiBKb3VybmFsRW50cnkgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBlbnRyeSBpcyBub3QgaW5zdGFuY2Ugb2YgSm91cm5hbEVudHJ5LicpO1xuICAgIH1cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeU1vZGVsLmVudHJ5KTtcbiAgICB0aGlzLnNldEFjY291bnRCYWxhbmNlQ2hhbmdlKGVudHJ5TW9kZWwuZW50cnksICdkZWJpdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYWNjb3VudCBiYWxhbmNlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtKb3VybmFsRW50cnl9IGVudHJ5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqL1xuICBzZXRBY2NvdW50QmFsYW5jZUNoYW5nZShlbnRyeSwgZW50cnlUeXBlKSB7XG4gICAgY29uc3QgZGVwQWNjb3VudHNJZHMgPSB0aGlzLmFjY291bnRzR3JhcGguZGVwZW5kYW50c09mKGVudHJ5LmFjY291bnQpO1xuXG4gICAgY29uc3QgYmFsYW5jZUNoYW5nZUVudHJ5ID0ge1xuICAgICAgZGViaXQ6IGVudHJ5LmRlYml0LFxuICAgICAgY3JlZGl0OiBlbnRyeS5jcmVkaXQsXG4gICAgICBlbnRyeVR5cGUsXG4gICAgICBhY2NvdW50Tm9ybWFsOiBlbnRyeS5hY2NvdW50Tm9ybWFsLFxuICAgIH07XG4gICAgdGhpcy5fc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2Uoe1xuICAgICAgLi4uYmFsYW5jZUNoYW5nZUVudHJ5LFxuICAgICAgYWNjb3VudElkOiBlbnRyeS5hY2NvdW50LFxuICAgIH0pO1xuXG4gICAgLy8gRWZmZWN0IHBhcmVudCBhY2NvdW50cyBvZiB0aGUgZ2l2ZW4gYWNjb3VudCBpZC5cbiAgICBkZXBBY2NvdW50c0lkcy5mb3JFYWNoKChhY2NvdW50SWQpID0+IHtcbiAgICAgIHRoaXMuX3NldEFjY291bnRCYWxhbmNlQ2hhbmdlKHtcbiAgICAgICAgLi4uYmFsYW5jZUNoYW5nZUVudHJ5LFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFjY291bnQgYmFsYW5jZSBjaGFuZ2UuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2Uoe1xuICAgIGFjY291bnRJZCwgYWNjb3VudE5vcm1hbCwgZGViaXQsIGNyZWRpdCwgZW50cnlUeXBlXG4gIH0pIHtcbiAgICBpZiAoIXRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXSkge1xuICAgICAgdGhpcy5iYWxhbmNlc0NoYW5nZVthY2NvdW50SWRdID0gMDtcbiAgICB9XG4gICAgbGV0IGNoYW5nZSA9IDA7XG5cbiAgICBpZiAoYWNjb3VudE5vcm1hbCA9PT0gJ2NyZWRpdCcpIHtcbiAgICAgIGNoYW5nZSA9IChlbnRyeVR5cGUgPT09ICdjcmVkaXQnKSA/IGNyZWRpdCA6IC0xICogZGViaXQ7XG4gICAgfSBlbHNlIGlmIChhY2NvdW50Tm9ybWFsID09PSAnZGViaXQnKSB7XG4gICAgICBjaGFuZ2UgPSAoZW50cnlUeXBlID09PSAnZGViaXQnKSA/IGRlYml0IDogLTEgKiBjcmVkaXQ7XG4gICAgfVxuICAgIHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXSArPSBjaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyB0aGUgYmFsYW5jZSBjaGFuZ2UgdG8gbGlzdC5cbiAgICovXG4gIG1hcEJhbGFuY2VDaGFuZ2VzVG9MaXN0KCkge1xuICAgIGNvbnN0IG1hcHBlZExpc3QgPSBbXTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYmFsYW5jZXNDaGFuZ2UpLmZvckVhY2goKGFjY291bnRJZCkgPT4ge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXTtcblxuICAgICAgbWFwcGVkTGlzdC5wdXNoKHtcbiAgICAgICAgYWNjb3VudF9pZDogYWNjb3VudElkLFxuICAgICAgICBhbW91bnQ6IGJhbGFuY2UsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwcGVkTGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgYmFsYW5jZSBjaGFuZ2Ugb2Ygam91cm5hbCBlbnRyaWVzLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUJhbGFuY2UoKSB7XG4gICAgY29uc3QgYmFsYW5jZXNMaXN0ID0gdGhpcy5tYXBCYWxhbmNlQ2hhbmdlc1RvTGlzdCgpO1xuICAgIGNvbnN0IGJhbGFuY2VVcGRhdGVPcGVycyA9IFtdO1xuICAgIGNvbnN0IGJhbGFuY2VJbnNlcnRPcGVycyA9IFtdO1xuICAgIGNvbnN0IGJhbGFuY2VGaW5kT25lT3BlcnMgPSBbXTtcbiAgICBsZXQgYmFsYW5jZUFjY291bnRzID0gW107XG5cbiAgICBiYWxhbmNlc0xpc3QuZm9yRWFjaCgoYmFsYW5jZSkgPT4ge1xuICAgICAgY29uc3Qgb3BlciA9IEFjY291bnRCYWxhbmNlLnRlbmFudCgpXG4gICAgICAgIC5xdWVyeSgpXG4gICAgICAgIC5maW5kT25lKCdhY2NvdW50X2lkJywgYmFsYW5jZS5hY2NvdW50X2lkKTtcbiAgICAgIGJhbGFuY2VGaW5kT25lT3BlcnMucHVzaChvcGVyKTtcbiAgICB9KTtcbiAgICBiYWxhbmNlQWNjb3VudHMgPSBhd2FpdCBQcm9taXNlLmFsbChiYWxhbmNlRmluZE9uZU9wZXJzKTtcblxuICAgIGJhbGFuY2VzTGlzdC5mb3JFYWNoKChiYWxhbmNlKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSBiYWxhbmNlLmFtb3VudCA8IDAgPyAnZGVjcmVtZW50JyA6ICdpbmNyZW1lbnQnO1xuXG4gICAgICAvLyBEZXRhcm1pbmUgaWYgdGhlIGFjY291bnQgYmFsYW5jZSBpcyBhbHJlYWR5IGV4aXN0cyBvciBub3QuXG4gICAgICBjb25zdCBmb3VuZEFjY0JhbGFuY2UgPSBiYWxhbmNlQWNjb3VudHMuc29tZSgoYWNjb3VudCkgPT4gKFxuICAgICAgICBhY2NvdW50ICYmIGFjY291bnQuYWNjb3VudF9pZCA9PT0gYmFsYW5jZS5hY2NvdW50X2lkXG4gICAgICApKTtcblxuICAgICAgaWYgKGZvdW5kQWNjQmFsYW5jZSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IEFjY291bnRCYWxhbmNlLnRlbmFudCgpXG4gICAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgICBbbWV0aG9kXSgnYW1vdW50JywgTWF0aC5hYnMoYmFsYW5jZS5hbW91bnQpKVxuICAgICAgICAgIC53aGVyZSgnYWNjb3VudF9pZCcsIGJhbGFuY2UuYWNjb3VudF9pZCk7XG5cbiAgICAgICAgYmFsYW5jZVVwZGF0ZU9wZXJzLnB1c2gocXVlcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBBY2NvdW50QmFsYW5jZS50ZW5hbnQoKS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgYWNjb3VudF9pZDogYmFsYW5jZS5hY2NvdW50X2lkLFxuICAgICAgICAgIGFtb3VudDogYmFsYW5jZS5hbW91bnQsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTogJ1VTRCcsXG4gICAgICAgIH0pO1xuICAgICAgICBiYWxhbmNlSW5zZXJ0T3BlcnMucHVzaChxdWVyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgLi4uYmFsYW5jZVVwZGF0ZU9wZXJzLCAuLi5iYWxhbmNlSW5zZXJ0T3BlcnMsXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIHN0YWNrZWQgam91cm5hbCBlbnRyaWVzIHRvIHRoZSBzdG9yYWdlLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUVudHJpZXMoKSB7XG4gICAgY29uc3Qgc2F2ZU9wZXJhdGlvbnMgPSBbXTtcblxuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3Qgb3BlciA9IEFjY291bnRUcmFuc2FjdGlvbi50ZW5hbnQoKS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIGFjY291bnRJZDogZW50cnkuYWNjb3VudCxcbiAgICAgICAgLi4ucGljayhlbnRyeSwgWydjcmVkaXQnLCAnZGViaXQnLCAndHJhbnNhY3Rpb25UeXBlJywgJ2RhdGUnLCAndXNlcklkJyxcbiAgICAgICAgICAncmVmZXJlbmNlVHlwZScsICdyZWZlcmVuY2VJZCcsICdub3RlJ10pLFxuICAgICAgfSk7XG4gICAgICBzYXZlT3BlcmF0aW9ucy5wdXNoKCgpID0+IG9wZXIpO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VTZXJpYWwoc2F2ZU9wZXJhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyc2VzIHRoZSBzdGFja2VkIGpvdXJuYWwgZW50cmllcy5cbiAgICovXG4gIHJldmVyc2VFbnRyaWVzKCkge1xuICAgIGNvbnN0IHJldmVyc2VFbnRyaWVzID0gW107XG5cbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJldmVyc2VFbnRyeSA9IHsgLi4uZW50cnkgfTtcblxuICAgICAgaWYgKGVudHJ5LmNyZWRpdCkge1xuICAgICAgICByZXZlcnNlRW50cnkuZGViaXQgPSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgcmV2ZXJzZUVudHJ5LmNyZWRpdCA9IGVudHJ5LmRlYml0O1xuICAgICAgfVxuICAgICAgcmV2ZXJzZUVudHJpZXMucHVzaChyZXZlcnNlRW50cnkpO1xuICAgIH0pO1xuICAgIHRoaXMuZW50cmllcyA9IHJldmVyc2VFbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0ge0FycmF5fSBpZHMgLVxuICAgKi9cbiAgcmVtb3ZlRW50cmllcyhpZHMgPSBbXSkge1xuICAgIGNvbnN0IHRhcmdldElkcyA9IChpZHMubGVuZ3RoIDw9IDApID8gdGhpcy5lbnRyaWVzLm1hcChlID0+IGUuaWQpIDogaWRzO1xuICAgIGNvbnN0IHJlbW92ZUVudHJpZXMgPSB0aGlzLmVudHJpZXMuZmlsdGVyKChlKSA9PiB0YXJnZXRJZHMuaW5kZXhPZihlLmlkKSAhPT0gLTEpO1xuXG4gICAgdGhpcy5lbnRyaWVzID0gdGhpcy5lbnRyaWVzXG4gICAgICAuZmlsdGVyKGUgPT4gdGFyZ2V0SWRzLmluZGV4T2YoZS5pZCkgPT09IC0xKVxuXG4gICAgcmVtb3ZlRW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgZW50cnkuY3JlZGl0ID0gLTEgKiBlbnRyeS5jcmVkaXQ7XG4gICAgICBlbnRyeS5kZWJpdCA9IC0xICogZW50cnkuZGViaXQ7XG5cbiAgICAgIHRoaXMuc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2UoZW50cnksIGVudHJ5LmFjY291bnROb3JtYWwpO1xuICAgIH0pO1xuICAgIHRoaXMuZGVsZXRlZEVudHJpZXNJZHMucHVzaChcbiAgICAgIC4uLnJlbW92ZUVudHJpZXMubWFwKGVudHJ5ID0+IGVudHJ5LmlkKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgdGhlIHN0YWNrZWQgZW50cmllcy5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJpZXMoKSB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZEVudHJpZXNJZHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnRlbmFudCgpLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgdGhpcy5kZWxldGVkRW50cmllc0lkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgY2xvc2luZyBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCBhbmQgY2xvc2luZyBkYXRlLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudElkIC1cbiAgICogQHBhcmFtIHtEYXRlfSBjbG9zaW5nRGF0ZSAtXG4gICAqL1xuICBnZXRDbG9zaW5nQmFsYW5jZShhY2NvdW50SWQsIGNsb3NpbmdEYXRlLCBkYXRlVHlwZSA9ICdkYXknKSB7XG4gICAgbGV0IGNsb3NpbmdCYWxhbmNlID0gMDtcbiAgICBjb25zdCBtb21lbnRDbG9zaW5nRGF0ZSA9IG1vbWVudChjbG9zaW5nRGF0ZSk7XG5cbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIC8vIENhbiBub3QgY29udGludWUgaWYgbm90IGJlZm9yZSBvciBldmVudCBzYW1lIGNsb3NpbmcgZGF0ZS5cbiAgICAgIGlmICgoIW1vbWVudENsb3NpbmdEYXRlLmlzQWZ0ZXIoZW50cnkuZGF0ZSwgZGF0ZVR5cGUpXG4gICAgICAgICYmICFtb21lbnRDbG9zaW5nRGF0ZS5pc1NhbWUoZW50cnkuZGF0ZSwgZGF0ZVR5cGUpKVxuICAgICAgICB8fCAoZW50cnkuYWNjb3VudCAhPT0gYWNjb3VudElkICYmIGFjY291bnRJZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdjcmVkaXQnKSB7XG4gICAgICAgIGNsb3NpbmdCYWxhbmNlICs9IChlbnRyeS5jcmVkaXQpID8gZW50cnkuY3JlZGl0IDogLTEgKiBlbnRyeS5kZWJpdDtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuYWNjb3VudE5vcm1hbCA9PT0gJ2RlYml0Jykge1xuICAgICAgICBjbG9zaW5nQmFsYW5jZSArPSAoZW50cnkuZGViaXQpID8gZW50cnkuZGViaXQgOiAtMSAqIGVudHJ5LmNyZWRpdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvc2luZ0JhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGdpdmVuIGFjY291bnQgYmFsYW5jZSB3aXRoIGRlcGVuZGVuY2llcyBhY2NvdW50cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjY291bnRJZCBcbiAgICogQHBhcmFtIHtEYXRlfSBjbG9zaW5nRGF0ZSBcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGVUeXBlIFxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBnZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQsIGNsb3NpbmdEYXRlLCBkYXRlVHlwZSkge1xuICAgIGNvbnN0IGFjY291bnROb2RlID0gdGhpcy5hY2NvdW50c0dyYXBoLmdldE5vZGVEYXRhKGFjY291bnRJZCk7XG4gICAgY29uc3QgZGVwQWNjb3VudHNJZHMgPSB0aGlzLmFjY291bnRzR3JhcGguZGVwZW5kZW5jaWVzT2YoYWNjb3VudElkKTtcbiAgICBjb25zdCBkZXBBY2NvdW50cyA9IGRlcEFjY291bnRzSWRzLm1hcCgoaWQpID0+IHRoaXMuYWNjb3VudHNHcmFwaC5nZXROb2RlRGF0YShpZCkpO1xuICAgIGxldCBiYWxhbmNlID0gMDtcblxuICAgIFsuLi5kZXBBY2NvdW50cywgYWNjb3VudE5vZGVdLmZvckVhY2goKGFjY291bnQpID0+IHtcbiAgICAgIC8vIGlmICghdGhpcy5hY2NvdW50c0JhbGFuY2VUYWJsZVthY2NvdW50LmlkXSkge1xuICAgICAgICBjb25zdCBjbG9zaW5nQmFsYW5jZSA9IHRoaXMuZ2V0Q2xvc2luZ0JhbGFuY2UoYWNjb3VudC5pZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKTtcbiAgICAgICAgdGhpcy5hY2NvdW50c0JhbGFuY2VUYWJsZVthY2NvdW50LmlkXSA9IGNsb3NpbmdCYWxhbmNlO1xuICAgICAgLy8gfVxuICAgICAgYmFsYW5jZSArPSB0aGlzLmFjY291bnRzQmFsYW5jZVRhYmxlW2FjY291bnQuaWRdO1xuICAgIH0pO1xuICAgIHJldHVybiBiYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjcmVkaXQvZGViaXQgc3VtYXRpb24gZm9yIHRoZSBnaXZlbiBhY2NvdW50IGFuZCBkYXRlLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudCAtXG4gICAqIEBwYXJhbSB7RGF0ZXxTdHJpbmd9IGNsb3NpbmdEYXRlIC1cbiAgICovXG4gIGdldFRyaWFsQmFsYW5jZShhY2NvdW50SWQsIGNsb3NpbmdEYXRlLCBkYXRlVHlwZSkge1xuICAgIGNvbnN0IG1vbWVudENsb3NpbmdEYXRlID0gbW9tZW50KGNsb3NpbmdEYXRlKTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBjcmVkaXQ6IDAsXG4gICAgICBkZWJpdDogMCxcbiAgICAgIGJhbGFuY2U6IDAsXG4gICAgfTtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGlmICgoIW1vbWVudENsb3NpbmdEYXRlLmlzQWZ0ZXIoZW50cnkuZGF0ZSwgZGF0ZVR5cGUpXG4gICAgICAgICYmICFtb21lbnRDbG9zaW5nRGF0ZS5pc1NhbWUoZW50cnkuZGF0ZSwgZGF0ZVR5cGUpKVxuICAgICAgICB8fCAoZW50cnkuYWNjb3VudCAhPT0gYWNjb3VudElkICYmIGFjY291bnRJZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmNyZWRpdCArPSBlbnRyeS5jcmVkaXQ7XG4gICAgICByZXN1bHQuZGViaXQgKz0gZW50cnkuZGViaXQ7XG5cbiAgICAgIGlmIChlbnRyeS5hY2NvdW50Tm9ybWFsID09PSAnY3JlZGl0Jykge1xuICAgICAgICByZXN1bHQuYmFsYW5jZSArPSBlbnRyeS5jcmVkaXQgLSBlbnRyeS5kZWJpdDtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuYWNjb3VudE5vcm1hbCA9PT0gJ2RlYml0Jykge1xuICAgICAgICByZXN1bHQuYmFsYW5jZSArPSBlbnRyeS5kZWJpdCAtIGVudHJ5LmNyZWRpdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRyaWFsIGJhbGFuY2Ugb2YgdGhlIGdpdmVuIGFjY291bnQgd2l0aCBkZXBlbmRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudElkIFxuICAgKiBAcGFyYW0ge0RhdGV9IGNsb3NpbmdEYXRlIFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0ZVR5cGUgXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovIFxuICBnZXRUcmlhbEJhbGFuY2VXaXRoRGVwYW5kcyhhY2NvdW50SWQsIGNsb3NpbmdEYXRlLCBkYXRlVHlwZSkge1xuICAgIGNvbnN0IGFjY291bnROb2RlID0gdGhpcy5hY2NvdW50c0dyYXBoLmdldE5vZGVEYXRhKGFjY291bnRJZCk7XG4gICAgY29uc3QgZGVwQWNjb3VudHNJZHMgPSB0aGlzLmFjY291bnRzR3JhcGguZGVwZW5kZW5jaWVzT2YoYWNjb3VudElkKTtcbiAgICBjb25zdCBkZXBBY2NvdW50cyA9IGRlcEFjY291bnRzSWRzLm1hcCgoaWQpID0+IHRoaXMuYWNjb3VudHNHcmFwaC5nZXROb2RlRGF0YShpZCkpO1xuXG4gICAgY29uc3QgdHJpYWxCYWxhbmNlID0geyBjcmVkaXQ6IDAsIGRlYml0OiAwLCBiYWxhbmNlOiAwIH07XG5cbiAgICBbLi4uZGVwQWNjb3VudHMsIGFjY291bnROb2RlXS5mb3JFYWNoKChhY2NvdW50KSA9PiB7XG4gICAgICBjb25zdCBfdHJpYWxCYWxhbmNlID0gdGhpcy5nZXRUcmlhbEJhbGFuY2UoYWNjb3VudC5pZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKTtcblxuICAgICAgdHJpYWxCYWxhbmNlLmNyZWRpdCArPSBfdHJpYWxCYWxhbmNlLmNyZWRpdDtcbiAgICAgIHRyaWFsQmFsYW5jZS5kZWJpdCArPSBfdHJpYWxCYWxhbmNlLmRlYml0O1xuICAgICAgdHJpYWxCYWxhbmNlLmJhbGFuY2UgKz0gX3RyaWFsQmFsYW5jZS5iYWxhbmNlO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmlhbEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBmZXRjaGVkIGFjY291bnRzIGpvdXJuYWwgZW50cmllcy5cbiAgICogQHBhcmFtIHtBcnJheX0gZW50cmllcyAtXG4gICAqL1xuICBsb2FkRW50cmllcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgYWNjb3VudDogZW50cnkuYWNjb3VudCA/IGVudHJ5LmFjY291bnQuaWQgOiBlbnRyeS5hY2NvdW50SWQsXG4gICAgICAgIGFjY291bnROb3JtYWw6IChlbnRyeS5hY2NvdW50ICYmIGVudHJ5LmFjY291bnQudHlwZSlcbiAgICAgICAgICA/IGVudHJ5LmFjY291bnQudHlwZS5ub3JtYWwgOiBlbnRyeS5hY2NvdW50Tm9ybWFsLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjYWxjdWxhdGVFbnRyaWVzQmFsYW5jZUNoYW5nZSgpIHtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5jcmVkaXQpIHtcbiAgICAgICAgdGhpcy5zZXRBY2NvdW50QmFsYW5jZUNoYW5nZShlbnRyeSwgJ2NyZWRpdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmRlYml0KSB7XG4gICAgICAgIHRoaXMuc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2UoZW50cnksICdkZWJpdCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgTm9kZUNhY2hlIGZyb20gJ25vZGUtY2FjaGUnO1xuXG5jbGFzcyBDYWNoZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWNoZSA9IG5ldyBOb2RlQ2FjaGUoe1xuICAgICAgLy8gc3RkVFRMOiA5OTk5OTk5LFxuICAgICAgLy8gY2hlY2twZXJpb2Q6IDk5OTk5OTkgKiAwLjIsXG4gICAgICB1c2VDbG9uZXM6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0KGtleSwgc3RvcmVGdW5jdGlvbikge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVGdW5jdGlvbigpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHNldChrZXksIHJlc3VsdHMpIHtcbiAgICB0aGlzLmNhY2hlLnNldChrZXksIHJlc3VsdHMpO1xuICB9XG5cbiAgZGVsKGtleXMpIHtcbiAgICB0aGlzLmNhY2hlLmRlbChrZXlzKTtcbiAgfVxuXG4gIGRlbFN0YXJ0V2l0aChzdGFydFN0ciA9ICcnKSB7XG4gICAgaWYgKCFzdGFydFN0cikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSB0aGlzLmNhY2hlLmtleXMoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2Yoc3RhcnRTdHIpID09PSAwKSB7XG4gICAgICAgIHRoaXMuZGVsKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZmx1c2goKSB7XG4gICAgdGhpcy5jYWNoZS5mbHVzaEFsbCgpO1xuICB9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgbmV3IENhY2hlKCk7IiwiaW1wb3J0IHdpbnN0b24gZnJvbSAnd2luc3Rvbic7XG5cbmNvbnN0IHRyYW5zcG9ydHMgPSB7XG4gIGNvbnNvbGU6IG5ldyB3aW5zdG9uLnRyYW5zcG9ydHMuQ29uc29sZSh7IGxldmVsOiAnd2FybicgfSksXG4gIGZpbGU6IG5ldyB3aW5zdG9uLnRyYW5zcG9ydHMuRmlsZSh7IGZpbGVuYW1lOiAnc3Rkb3V0LmxvZycgfSksXG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aW5zdG9uLmNyZWF0ZUxvZ2dlcih7XG4gIHRyYW5zcG9ydHM6IFtcbiAgICB0cmFuc3BvcnRzLmNvbnNvbGUsXG4gICAgdHJhbnNwb3J0cy5maWxlLFxuICBdLFxufSk7XG4iLCJcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsKSA9PiB7XG4gIHJldHVybiBjbGFzcyBVc2VyU3Vic2NyaXB0aW9uIGV4dGVuZHMgTW9kZWx7XG5cbiAgICBvblRyaWFsKCkge1xuICAgICAgXG4gICAgfVxuICBcbiAgICBnZXRTdWJzY3JpcHRpb24oKSB7XG4gIFxuICAgIH1cbiAgXG4gICAgbmV3U3Vic2NyaXB0aW9uKCkge1xuICAgICAgXG4gICAgfSBcbiAgXG4gICAgaXNTdWJjcmliZWRUbyhwbGFuKSB7XG4gIFxuICAgIH1cbiAgfVxufTsiLCJpbXBvcnQgbm9kZW1haWxlciBmcm9tICdub2RlbWFpbGVyJztcbmltcG9ydCBjb25maWcgZnJvbSAnQC8uLi9jb25maWcvY29uZmlnJztcblxuLy8gY3JlYXRlIHJldXNhYmxlIHRyYW5zcG9ydGVyIG9iamVjdCB1c2luZyB0aGUgZGVmYXVsdCBTTVRQIHRyYW5zcG9ydFxuY29uc3QgdHJhbnNwb3J0ZXIgPSBub2RlbWFpbGVyLmNyZWF0ZVRyYW5zcG9ydCh7XG4gIGhvc3Q6IGNvbmZpZy5tYWlsLmhvc3QsXG4gIHBvcnQ6IGNvbmZpZy5tYWlsLnBvcnQsXG4gIHNlY3VyZTogY29uZmlnLm1haWwuc2VjdXJlLCAvLyB0cnVlIGZvciA0NjUsIGZhbHNlIGZvciBvdGhlciBwb3J0c1xuICBhdXRoOiB7XG4gICAgdXNlcjogY29uZmlnLm1haWwudXNlcm5hbWUsXG4gICAgcGFzczogY29uZmlnLm1haWwucGFzc3dvcmQsXG4gIH0sXG59KTtcblxuY29uc29sZS5sb2coe1xuICBob3N0OiBjb25maWcubWFpbC5ob3N0LFxuICBwb3J0OiBjb25maWcubWFpbC5wb3J0LFxuICBzZWN1cmU6IGNvbmZpZy5tYWlsLnNlY3VyZSwgLy8gdHJ1ZSBmb3IgNDY1LCBmYWxzZSBmb3Igb3RoZXIgcG9ydHNcbiAgYXV0aDoge1xuICAgIHVzZXI6IGNvbmZpZy5tYWlsLnVzZXJuYW1lLFxuICAgIHBhc3M6IGNvbmZpZy5tYWlsLnBhc3N3b3JkLFxuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zcG9ydGVyO1xuIiwiaW1wb3J0IEtuZXggZnJvbSAna25leCc7XG5pbXBvcnQgeyBrbmV4U25ha2VDYXNlTWFwcGVycyB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50IGZyb20gJ0Avc3lzdGVtL21vZGVscy9UZW5hbnQnO1xuaW1wb3J0IGNvbmZpZyBmcm9tICdALy4uL2NvbmZpZy9jb25maWcnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCB1bmlxaWQgZnJvbSAndW5pcWlkJztcbmltcG9ydCBkYk1hbmFnZXIgZnJvbSAnQC9kYXRhYmFzZS9tYW5hZ2VyJztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5pbXBvcnQgVGVuYW50VXNlciBmcm9tICdAL21vZGVscy9UZW5hbnRVc2VyJztcbi8vIGltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbi8vIGNvbnN0IFRlbmFudFdlYnNpdGU6IHtcbi8vICAgdGVuYW50RGI6IEtuZXgsXG4vLyAgIHRlbmFudElkOiBOdW1iZXIsXG4vLyAgIHRlbmFudE9yZ2FuaXphdGlvbklkOiBTdHJpbmcsXG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudHNNYW5hZ2VyIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmtuZXhDYWNoZSA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRUZW5hbnQob3JnYW5pemF0aW9uSWQpIHtcbiAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCBUZW5hbnQucXVlcnkoKVxuICAgICAgLndoZXJlKCdvcmdhbml6YXRpb25faWQnLCBvcmdhbml6YXRpb25JZCkuZmlyc3QoKTtcblxuICAgIHJldHVybiB0ZW5hbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0ZW5hbnQgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7SW50ZWdlcn0gdW5pcUlkIFxuICAgKiBAcmV0dXJuIHtUZW5hbnRXZWJzaXRlfVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRlbmFudCh1bmlxSWQpIHtcbiAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9IHVuaXFJZCB8fCB1bmlxaWQoKTtcbiAgICBjb25zdCB0ZW5hbnRPcmdhbml6YXRpb24gPSBhd2FpdCBUZW5hbnQucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbmFudERiTmFtZSA9IGBiaWdjYXBpdGFsX3RlbmFudF8ke29yZ2FuaXphdGlvbklkfWA7XG4gICAgYXdhaXQgZGJNYW5hZ2VyLmNyZWF0ZURiKHRlbmFudERiTmFtZSk7XG5cbiAgICBjb25zdCB0ZW5hbnREYiA9IFRlbmFudHNNYW5hZ2VyLmtuZXhJbnN0YW5jZShvcmdhbml6YXRpb25JZCk7XG4gICAgYXdhaXQgdGVuYW50RGIubWlncmF0ZS5sYXRlc3QoKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50RGIsXG4gICAgICB0ZW5hbnRJZDogdGVuYW50T3JnYW5pemF0aW9uLmlkLFxuICAgICAgb3JnYW5pemF0aW9uSWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIHRlbmFudCBkYXRhYmFzZSBvZiB0aGUgZ2l2ZW4gdGVuYW50IHdlYnNpdGUuXG4gICAqIEBwYXJhbSB7VGVuYW50V2Vic2l0ZX0gdGVuYW50V2Vic2l0ZSBcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkcm9wVGVuYW50KHRlbmFudFdlYnNpdGUpIHtcbiAgICBjb25zdCB0ZW5hbnREYk5hbWUgPSBgYmlnY2FwaXRhbF90ZW5hbnRfJHt0ZW5hbnRXZWJzaXRlLm9yZ2FuaXphdGlvbklkfWA7XG4gICAgYXdhaXQgZGJNYW5hZ2VyLmRyb3BEYih0ZW5hbnREYk5hbWUpO1xuXG4gICAgYXdhaXQgU3lzdGVtVXNlci5xdWVyeSgpXG4gICAgICAud2hlcmUoJ3RlbmFudF9pZCcsIHRlbmFudFdlYnNpdGUudGVuYW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1c2VyIHRoYXQgYXNzb2NpYXRlIHRvIHRoZSBnaXZlbiB0ZW5hbnQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlVGVuYW50VXNlcih0ZW5hbnRXZWJzaXRlLCB1c2VyKSB7XG4gICAgY29uc3QgdXNlckluc2VydCA9IHsgLi4udXNlciB9O1xuXG4gICAgY29uc3Qgc3lzdGVtVXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgLi4udXNlcixcbiAgICAgIHRlbmFudF9pZDogdGVuYW50V2Vic2l0ZS50ZW5hbnRJZCxcbiAgICB9KTtcbiAgICBUZW5hbnRNb2RlbC5rbmV4QmluZGVkID0gdGVuYW50V2Vic2l0ZS50ZW5hbnREYjtcblxuICAgIGNvbnN0IHRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLmJpbmRLbmV4KHRlbmFudFdlYnNpdGUudGVuYW50RGIpXG4gICAgICAucXVlcnkoKVxuICAgICAgLmluc2VydCh7XG4gICAgICAgIC4uLm9taXQodXNlckluc2VydCwgWydwYXNzd29yZCddKSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi50ZW5hbnRVc2VyLFxuICAgICAgLi4uc3lzdGVtVXNlclxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYWxsIHRlbmFudHMgbWV0YWRhdGEgZnJvbSBzeXN0ZW0gc3RvcmFnZS5cbiAgICovXG4gIHN0YXRpYyBnZXRBbGxUZW5hbnRzKCkge1xuICAgIHJldHVybiBUZW5hbnQucXVlcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZ2l2ZW4gb3JnYW5pemF0aW9uIGlkIGtuZXggY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG9yZ2FuaXphdGlvbklkIC1cbiAgICovXG4gIHN0YXRpYyBnZXRUZW5hbnRLbmV4Q29uZmlnKG9yZ2FuaXphdGlvbklkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudDogY29uZmlnLnRlbmFudC5kYl9jbGllbnQsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy50ZW5hbnQuZGJfaG9zdCxcbiAgICAgICAgdXNlcjogY29uZmlnLnRlbmFudC5kYl91c2VyLFxuICAgICAgICBwYXNzd29yZDogY29uZmlnLnRlbmFudC5kYl9wYXNzd29yZCxcbiAgICAgICAgZGF0YWJhc2U6IGAke2NvbmZpZy50ZW5hbnQuZGJfbmFtZV9wcmVmaXh9JHtvcmdhbml6YXRpb25JZH1gLFxuICAgICAgICBjaGFyc2V0OiBjb25maWcudGVuYW50LmNoYXJzZXQsXG4gICAgICB9LFxuICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICBkaXJlY3Rvcnk6IGNvbmZpZy50ZW5hbnQubWlncmF0aW9uc19kaXIsXG4gICAgICB9LFxuICAgICAgc2VlZHM6IHtcbiAgICAgICAgZGlyZWN0b3J5OiBjb25maWcudGVuYW50LnNlZWRzX2RpcixcbiAgICAgIH0sXG4gICAgICBwb29sOiB7IG1pbjogMCwgbWF4OiA1IH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBrbmV4SW5zdGFuY2Uob3JnYW5pemF0aW9uSWQpIHtcbiAgICBjb25zdCBrbmV4Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgbGV0IGtuZXggPSBrbmV4Q2FjaGUuZ2V0KG9yZ2FuaXphdGlvbklkKTtcblxuICAgIGlmICgha25leCkge1xuICAgICAga25leCA9IEtuZXgoe1xuICAgICAgICAuLi50aGlzLmdldFRlbmFudEtuZXhDb25maWcob3JnYW5pemF0aW9uSWQpLFxuICAgICAgICAuLi5rbmV4U25ha2VDYXNlTWFwcGVycyh7IHVwcGVyQ2FzZTogdHJ1ZSB9KSxcbiAgICAgIH0pO1xuICAgICAga25leENhY2hlLnNldChvcmdhbml6YXRpb25JZCwga25leCk7XG4gICAgfVxuICAgIHJldHVybiBrbmV4O1xuICB9XG59IiwiaW1wb3J0IFN5c3RlbU1vZGVsIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbnZpdGUgZXh0ZW5kcyBTeXN0ZW1Nb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd1c2VyX2ludml0ZXMnO1xuICB9XG59XG4iLCJpbXBvcnQgU3lzdGVtTW9kZWwgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1N5c3RlbU1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFzc3dvcmRSZXNldHMgZXh0ZW5kcyBTeXN0ZW1Nb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Bhc3N3b3JkX3Jlc2V0cyc7XG4gIH1cbn1cbiIsImltcG9ydCBTeXN0ZW1Nb2RlbCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdWJzY3JpcHRpb25Vc2FnZSBleHRlbmRzIFN5c3RlbU1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnc3Vic2NyaXB0aW9uc191c2FnZSc7XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeXN0ZW1Nb2RlbCBleHRlbmRzIEJhc2VNb2RlbHtcbn0iLCJpbXBvcnQgeyBNb2RlbCwgbWl4aW4gfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IGJjcnlwdCBmcm9tICdiY3J5cHRqcyc7XG5pbXBvcnQgU3lzdGVtTW9kZWwgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1N5c3RlbU1vZGVsJztcbmltcG9ydCBEYXRlU2Vzc2lvbiBmcm9tICdAL21vZGVscy9EYXRlU2Vzc2lvbic7XG5pbXBvcnQgVXNlclN1YnNjcmlwdGlvbiBmcm9tICdAL3NlcnZpY2VzL1N1YnNjcmlwdGlvbi9Vc2VyU3Vic2NyaXB0aW9uJztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeXN0ZW1Vc2VyIGV4dGVuZHMgbWl4aW4oU3lzdGVtTW9kZWwsIFtEYXRlU2Vzc2lvbiwgVXNlclN1YnNjcmlwdGlvbl0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBUZW5hbnQgPSByZXF1aXJlKCdAL3N5c3RlbS9tb2RlbHMvVGVuYW50Jyk7XG4gICAgY29uc3QgU3Vic2NyaXB0aW9uVXNhZ2UgPSByZXF1aXJlKCdAL3N5c3RlbS9tb2RlbHMvU3Vic2NyaXB0aW9uVXNhZ2UnKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiBUZW5hbnQuZGVmYXVsdCxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd1c2Vycy50ZW5hbnRJZCcsXG4gICAgICAgICAgdG86ICd0ZW5hbnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHN1YnNjcmlwdGlvblVzYWdlOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogU3Vic2NyaXB0aW9uVXNhZ2UuZGVmYXVsdCxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd1c2Vycy5pZCcsXG4gICAgICAgICAgdG86ICdzdWJzY3JpcHRpb25zX3VzYWdlLnVzZXJfaWQnLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBwYXNzd29yZCBvZiB0aGUgdXNlci5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBwYXNzd29yZCAtIFRoZSBnaXZlbiBwYXNzd29yZC5cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIHZlcmlmeVBhc3N3b3JkKHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIGJjcnlwdC5jb21wYXJlU3luYyhwYXNzd29yZCwgdGhpcy5wYXNzd29yZCk7XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAndGVuYW50cyc7XG4gIH1cbn1cbiIsImltcG9ydCBiY3J5cHQgZnJvbSAnYmNyeXB0anMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmNvbnN0IHsgbWFwLCBpc0FycmF5LCBpc1BsYWluT2JqZWN0LCBtYXBLZXlzLCBtYXBWYWx1ZXMgfSA9IHJlcXVpcmUoJ2xvZGFzaCcpXG5cblxuY29uc3QgaGFzaFBhc3N3b3JkID0gKHBhc3N3b3JkKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBiY3J5cHQuZ2VuU2FsdCgxMCwgKGVycm9yLCBzYWx0KSA9PiB7XG4gICAgYmNyeXB0Lmhhc2gocGFzc3dvcmQsIHNhbHQsIChlcnIsIGhhc2gpID0+IHsgcmVzb2x2ZShoYXNoKTsgfSk7XG4gIH0pO1xufSk7XG5cbmNvbnN0IG9yaWdpbiA9IChyZXF1ZXN0KSA9PiBgJHtyZXF1ZXN0LnByb3RvY29sfTovLyR7cmVxdWVzdC5ob3N0bmFtZX1gO1xuXG5jb25zdCBkYXRlUmFuZ2VDb2xsZWN0aW9uID0gKGZyb21EYXRlLCB0b0RhdGUsIGFkZFR5cGUgPSAnZGF5JywgaW5jcmVtZW50ID0gMSkgPT4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gIGNvbnN0IG1vbWVudEZyb21EYXRlID0gbW9tZW50KGZyb21EYXRlKTtcbiAgbGV0IGRhdGVGb3JtYXQgPSAnJztcblxuICBzd2l0Y2ggKGFkZFR5cGUpIHtcbiAgICBjYXNlICdkYXknOlxuICAgIGRlZmF1bHQ6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVktTU0tREQnOyBicmVhaztcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVktTU0nOyBicmVhaztcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWSc7IGJyZWFrO1xuICB9XG4gIGZvciAobGV0IGkgPSBtb21lbnRGcm9tRGF0ZTtcbiAgICAoaS5pc0JlZm9yZSh0b0RhdGUsIGFkZFR5cGUpIHx8IGkuaXNTYW1lKHRvRGF0ZSwgYWRkVHlwZSkpO1xuICAgIGkuYWRkKGluY3JlbWVudCwgYCR7YWRkVHlwZX1zYCkpIHtcbiAgICBjb2xsZWN0aW9uLnB1c2goaS5lbmRPZihhZGRUeXBlKS5mb3JtYXQoZGF0ZUZvcm1hdCkpO1xuICB9XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufTtcblxuY29uc3QgZGF0ZVJhbmdlRm9ybWF0ID0gKHJhbmdlVHlwZSkgPT4ge1xuICBzd2l0Y2ggKHJhbmdlVHlwZSkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuICdZWVlZJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnWVlZWS1NTSc7XG4gIH1cbn07XG5cblxuY29uc3QgbWFwS2V5c0RlZXAgPSAob2JqLCBjYikgPT4ge1xuICBpZiAoXy5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoubWFwKGlubmVyT2JqID0+IG1hcEtleXNEZWVwKGlubmVyT2JqLCBjYikpO1xuICB9XG4gIGVsc2UgaWYgKF8uaXNPYmplY3Qob2JqKSkge1xuICAgICAgcmV0dXJuIF8ubWFwVmFsdWVzKFxuICAgICAgICAgIF8ubWFwS2V5cyhvYmosIGNiKSxcbiAgICAgICAgICB2YWwgPT4gbWFwS2V5c0RlZXAodmFsLCBjYiksXG4gICAgICApXG4gIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbmNvbnN0IG1hcFZhbHVlc0RlZXAgPSAodiwgY2FsbGJhY2spID0+IChcbiAgXy5pc09iamVjdCh2KVxuICAgID8gXy5tYXBWYWx1ZXModiwgdiA9PiBtYXBWYWx1ZXNEZWVwKHYsIGNhbGxiYWNrKSlcbiAgICA6IGNhbGxiYWNrKHYpKTtcblxuXG5jb25zdCBwcm9taXNlU2VyaWFsID0gKGZ1bmNzKSA9PiB7XG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoKHByb21pc2UsIGZ1bmMpID0+IHByb21pc2UudGhlbigocmVzdWx0KSA9PiBmdW5jKCkudGhlbihBcnJheS5wcm90b3R5cGUuY29uY2F0LmJpbmQocmVzdWx0KSkpLFxuICAgIFByb21pc2UucmVzb2x2ZShbXSkpO1xufVxuXG5jb25zdCBmbGF0VG9OZXN0ZWRBcnJheSA9IChkYXRhLCBjb25maWcgPSB7IGlkOiAnaWQnLCBwYXJlbnRJZDogJ3BhcmVudF9pZCcgfSkgPT4ge1xuICBjb25zdCBtYXAgPSB7fTtcbiAgY29uc3QgbmVzdGVkQXJyYXkgPSBbXTtcbiAgXG4gIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIG1hcFtpdGVtW2NvbmZpZy5pZF1dID0gaXRlbTtcbiAgICBtYXBbaXRlbVtjb25maWcuaWRdXS5jaGlsZHJlbiA9IFtdO1xuICB9KTtcbiAgXG4gIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHBhcmVudEl0ZW1JZCA9IGl0ZW1bY29uZmlnLnBhcmVudElkXTtcbiAgICBcbiAgICBpZiAoIWl0ZW1bY29uZmlnLnBhcmVudElkXSkge1xuICAgICAgbmVzdGVkQXJyYXkucHVzaChpdGVtKTtcbiAgICB9XG4gICAgaWYocGFyZW50SXRlbUlkKSB7XG4gICAgICBtYXBbcGFyZW50SXRlbUlkXS5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfSk7XG4gIFxuICByZXR1cm4gbmVzdGVkQXJyYXk7XG59XG5cblxuZXhwb3J0IHtcbiAgaGFzaFBhc3N3b3JkLFxuICBvcmlnaW4sXG4gIGRhdGVSYW5nZUNvbGxlY3Rpb24sXG4gIGRhdGVSYW5nZUZvcm1hdCxcbiAgbWFwVmFsdWVzRGVlcCxcbiAgbWFwS2V5c0RlZXAsXG4gIHByb21pc2VTZXJpYWwsXG4gIGZsYXRUb05lc3RlZEFycmF5LFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXJ1bnRpbWVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJhcHAtcm9vdC1wYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJjcnlwdGpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJkb3RlbnZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXJyb3JoYW5kbGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXhwcmVzcy1ib29tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3MtZmlsZXVwbG9hZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJleHByZXNzLXZhbGlkYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaTE4blwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqc29ud2VidG9rZW5cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwia25leFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJrbmV4LWRiLW1hbmFnZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtdXN0YWNoZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWNhY2hlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGVtYWlsZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwib2JqZWN0aW9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW5pcWlkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b25cIik7Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdklBO0FBeUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhGQTtBQTBGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMXhCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBQ0E7QUFDQTtBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL2tCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaFVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbklBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdNQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNUhBO0FBOEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyT0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaEtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDblVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExREE7QUE0REE7QUFDQTtBQUNBO0FBOURBO0FBZ0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpJQTtBQW1JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJCQTtBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzllQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1SkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3RkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExR0E7QUE0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3hEQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25FQTtBQUFBOzs7O0FBSUE7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNVZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBM0JBO0FBK0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQTlFQTtBQW1GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBdkZBO0FBNEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0R0E7QUF3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxIQTtBQW9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaklBO0FBbUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0tBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFEQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBbkVBO0FBdUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeFFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25GQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQWhJQTs7QUFPQTs7QUF3REE7O0FBU0E7O0FBWUE7O0FBWUE7Ozs7Ozs7Ozs7OztBQ2xIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBL0JBOzs7Ozs7Ozs7Ozs7QUNMQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBcERBOztBQVdBOzs7Ozs7Ozs7Ozs7QUNqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDVkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2UkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQXpDQTs7Ozs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwQkE7QUFzQkE7Ozs7Ozs7Ozs7OztBQ3pDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQTNDQTs7QUFHQTs7QUFXQTs7QUFXQTs7QUFPQTs7QUFxQkE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDcEVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3pGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQW5CQTs7QUFPQTs7Ozs7Ozs7Ozs7O0FDZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBNUNBOztBQU9BOztBQU9BOzs7Ozs7Ozs7Ozs7QUN4QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbldBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdElBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7O0FBdkNBOztBQU9BOzs7Ozs7Ozs7Ozs7QUNsQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakdBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7O0EiLCJzb3VyY2VSb290IjoiIn0= |