Files
bigcapital/server/dist/bundle.js
2020-06-14 14:19:18 +02:00

15035 lines
1.5 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.id' },
'description': {
column: 'description' },
'code': {
column: 'code' },
'root_type': {
column: 'account_type_id',
relation: 'account_types.id',
relationColumn: 'account_types.root_type' },
'created_at': {
column: 'created_at' } },
// 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.validateMediaIds,
this.validateContactEntries,
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.validateMediaIds,
this.validateContactEntries,
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;}() },
/**
* Validate media ids.
* @param {Request} req -
* @param {Response} res -
* @param {Function} next -
*/
validateMediaIds: function () {var _validateMediaIds = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2(req, res, next) {var _req$errorReasons;var form, Media, errorReasons, storedMedia, notFoundMedia;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:
form = _objectSpread({ media_ids: [] }, req.body);
Media = req.models.Media;
errorReasons = [];
// Validate if media ids was not already exists on the storage.
if (!(form.media_ids.length > 0)) {_context2.next = 9;break;}_context2.next = 6;return (
Media.query().whereIn('id', form.media_ids));case 6: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 9:
req.errorReasons = Array.isArray(req.errorReasons) && req.errorReasons.length ?
(_req$errorReasons = req.errorReasons).push.apply(_req$errorReasons, errorReasons) : errorReasons;
next();case 11:case "end":return _context2.stop();}}}, _callee2);}));function validateMediaIds(_x3, _x4, _x5) {return _validateMediaIds.apply(this, arguments);}return validateMediaIds;}(),
/**
* Validate form entries with contact customers and vendors.
* @param {Request} req
* @param {Response} res
* @param {Function} next
*/
validateContactEntries: function () {var _validateContactEntries = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3(req, res, next) {var _req$errorReasons2;var form, _req$models2, AccountType, Vendor, Customer, errorReasons, customersContacts, vendorsContacts, accountsTypes, payableAccountsType, receivableAccountsType, customersContactsIds, storedContacts, storedContactsIds, formEntriesCustomersIds, notFoundContactsIds, notReceivableAccounts, vendorsContactsIds, _storedContacts, _storedContactsIds, formEntriesVendorsIds, _notFoundContactsIds, notPayableAccounts;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
form = _objectSpread({ entries: [] }, req.body);_req$models2 =
req.models, AccountType = _req$models2.AccountType, Vendor = _req$models2.Vendor, Customer = _req$models2.Customer;
errorReasons = [];
// Validate the entries contact type and ids.
customersContacts = form.entries.filter(function (e) {return e.contact_type === 'customer';});
vendorsContacts = form.entries.filter(function (e) {return e.contact_type === 'vendor';});_context3.next = 7;return (
AccountType.query());case 7:accountsTypes = _context3.sent;
payableAccountsType = accountsTypes.find(function (t) {return t.key === 'accounts_payable';});;
receivableAccountsType = accountsTypes.find(function (t) {return t.key === 'accounts_receivable';});
// Validate customers contacts.
if (!(customersContacts.length > 0)) {_context3.next = 22;break;}
customersContactsIds = customersContacts.map(function (c) {return c.contact_id;});_context3.next = 15;return (
Customer.query().whereIn('id', customersContactsIds));case 15:storedContacts = _context3.sent;
storedContactsIds = storedContacts.map(function (c) {return c.id;});
formEntriesCustomersIds = form.entries.filter(function (e) {return e.contact_type === 'customer';});
notFoundContactsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(
formEntriesCustomersIds.map(function (c) {return c.contact_id;}),
storedContactsIds);
if (notFoundContactsIds.length > 0) {
errorReasons.push({ type: 'CUSTOMERS.CONTACTS.NOT.FOUND', code: 500, ids: notFoundContactsIds });
}
notReceivableAccounts = formEntriesCustomersIds.filter(
function (c) {return receivableAccountsType && c.contact_id !== receivableAccountsType.id;});
if (notReceivableAccounts.length > 0) {
errorReasons.push({
type: 'CUSTOMERS.ACCOUNTS.NOT.RECEIVABLE.TYPE',
code: 700,
indexes: notReceivableAccounts.map(function (a) {return a.index;}) });
}case 22:if (!(
vendorsContacts.length > 0)) {_context3.next = 33;break;}
vendorsContactsIds = vendorsContacts.map(function (c) {return c.contact_id;});_context3.next = 26;return (
Vendor.query().where('id', vendorsContactsIds));case 26:_storedContacts = _context3.sent;
_storedContactsIds = _storedContacts.map(function (c) {return c.id;});
formEntriesVendorsIds = form.entries.filter(function (e) {return e.contact_type === 'vendor';});
_notFoundContactsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(
formEntriesVendorsIds.map(function (v) {return v.contact_id;}),
_storedContactsIds);
if (_notFoundContactsIds.length > 0) {
errorReasons.push({
type: 'VENDORS.CONTACTS.NOT.FOUND', code: 600, ids: _notFoundContactsIds });
}
notPayableAccounts = formEntriesVendorsIds.filter(
function (v) {return payableAccountsType && v.contact_id === payableAccountsType.id;});
if (notPayableAccounts.length > 0) {
errorReasons.push({
type: 'VENDORS.ACCOUNTS.NOT.PAYABLE.TYPE',
code: 800,
indexes: notPayableAccounts.map(function (a) {return a.index;}) });
}case 33:
req.errorReasons = Array.isArray(req.errorReasons) && req.errorReasons.length ?
(_req$errorReasons2 = req.errorReasons).push.apply(_req$errorReasons2, errorReasons) : errorReasons;
next();case 35:case "end":return _context3.stop();}}}, _callee3);}));function validateContactEntries(_x6, _x7, _x8) {return _validateContactEntries.apply(this, arguments);}return validateContactEntries;}(),
/**
* 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.*.index').exists().isNumeric().toInt(),
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"])('entries.*.contact_id').optional().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.contact_type').optional().isIn(['vendor', 'customer']),
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 _callee4(req, res) {var validationErrors, form, _req$models3, ManualJournal, Account, MediaLink, totalCredit, totalDebit, user, errorReasons, entries, formattedDate, formEntriesAccountsIds, formEntriesContactsIds, accounts, storedAccountsIds, journalNumber, manualJournal, accountsDepGraph, journalPoster, 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);_req$models3 =
req.models, ManualJournal = _req$models3.ManualJournal, Account = _req$models3.Account, MediaLink = _req$models3.MediaLink;
totalCredit = 0;
totalDebit = 0;
user = req.user;
errorReasons = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(req.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 });
}
formEntriesAccountsIds = entries.map(function (entry) {return entry.account_id;});
formEntriesContactsIds = entries.map(function (entry) {return entry.contact_id;});_context4.next = 18;return (
Account.query().
whereIn('id', formEntriesAccountsIds).
withGraphFetched('type').
remember());case 18:accounts = _context4.sent;
storedAccountsIds = accounts.map(function (account) {return account.id;});
if (Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(formEntriesAccountsIds, storedAccountsIds).length > 0) {
errorReasons.push({ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200 });
}_context4.next = 23;return (
ManualJournal.query().
where('journal_number', form.journal_number));case 23:journalNumber = _context4.sent;
if (journalNumber.length > 0) {
errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 });
}if (!(
errorReasons.length > 0)) {_context4.next = 27;break;}return _context4.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 27:_context4.next = 29;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 29:manualJournal = _context4.sent;_context4.next = 32;return (
Account.depGraph().query());case 32:accountsDepGraph = _context4.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,
contactType: entry.contact_type,
contactId: entry.contact_id,
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.
_context4.next = 39;return Promise.all([].concat(
bulkSaveMediaLink, [
journalPoster.saveEntries(),
form.status && journalPoster.saveBalance()]));case 39:return _context4.abrupt("return",
res.status(200).send({ id: manualJournal.id }));case 40:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x9, _x10) {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 _callee5(req, res) {var validationErrors;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:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x11, _x12) {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.*.contact_id').optional().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('entries.*.contact_type').optional().isIn(['vendor', 'customer']).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 _callee6(req, res) {var validationErrors, form, id, _req$models4, ManualJournal, AccountTransaction, Account, Media, MediaLink, manualJournal, totalCredit, totalDebit, user, errorReasons, entries, formattedDate, journalNumber, accountsIds, accounts, storedAccountsIds, transactions, accountsDepGraph, journal, journalMediaIds, newInsertedMedia, bulkSaveMediaLink;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:
form = _objectSpread({
date: new Date(),
transaction_type: 'journal',
reference: '',
media_ids: [] },
req.body);
id = req.params.id;_req$models4 =
req.models, ManualJournal = _req$models4.ManualJournal, AccountTransaction = _req$models4.AccountTransaction, Account = _req$models4.Account, Media = _req$models4.Media, MediaLink = _req$models4.MediaLink;_context6.next = 8;return (
ManualJournal.query().
where('id', id).
withGraphFetched('media').first());case 8:manualJournal = _context6.sent;if (
manualJournal) {_context6.next = 11;break;}return _context6.abrupt("return",
res.status(4040).send({
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 11:
totalCredit = 0;
totalDebit = 0;
user = req.user;
errorReasons = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(req.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 });
}_context6.next = 22;return (
ManualJournal.query().
where('journal_number', form.journal_number).
whereNot('id', id).
first());case 22:journalNumber = _context6.sent;
if (journalNumber) {
errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 });
}
accountsIds = entries.map(function (entry) {return entry.account_id;});_context6.next = 27;return (
Account.query().whereIn('id', accountsIds).
withGraphFetched('type'));case 27:accounts = _context6.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 });
}if (!(
errorReasons.length > 0)) {_context6.next = 32;break;}return _context6.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 32:_context6.next = 34;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 34:_context6.next = 36;return (
AccountTransaction.query().
whereIn('reference_type', ['Journal']).
where('reference_id', manualJournal.id).
withGraphFetched('account.type'));case 36:transactions = _context6.sent;_context6.next = 39;return (
Account.depGraph().query().remember());case 39:accountsDepGraph = _context6.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);
});_context6.next = 50;return (
Promise.all([].concat(
bulkSaveMediaLink, [
journal.deleteEntries(),
journal.saveEntries(),
journal.saveBalance()])));case 50:return _context6.abrupt("return",
res.status(200).send({}));case 51:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x13, _x14) {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 _callee7(req, res) {var validationErrors, _req$models5, ManualJournal, AccountTransaction, Account, id, manualJournal, updateJournalTransactionOper, transactions, accountsDepGraph, journal, updateAccountsTransactionsOper;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:_req$models5 =
req.models, ManualJournal = _req$models5.ManualJournal, AccountTransaction = _req$models5.AccountTransaction, Account = _req$models5.Account;
id = req.params.id;_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:if (!
manualJournal.status) {_context7.next = 12;break;}return _context7.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 });_context7.next = 15;return (
AccountTransaction.query().
whereIn('reference_type', ['Journal', 'ManualJournal']).
where('reference_id', manualJournal.id).
withGraphFetched('account.type'));case 15:transactions = _context7.sent;_context7.next = 18;return (
Account.depGraph().query().remember());case 18:accountsDepGraph = _context7.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 });_context7.next = 25;return (
Promise.all([
updateJournalTransactionOper,
updateAccountsTransactionsOper,
journal.saveBalance()]));case 25:return _context7.abrupt("return",
res.status(200).send({ id: id }));case 26:case "end":return _context7.stop();}}}, _callee7);}));function handler(_x15, _x16) {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 _callee8(req, res) {var validationErrors, _req$models6, ManualJournal, AccountTransaction, id, manualJournal, transactions;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:_req$models6 =
req.models, ManualJournal = _req$models6.ManualJournal, AccountTransaction = _req$models6.AccountTransaction;
id = req.params.id;_context8.next = 7;return (
ManualJournal.query().
where('id', id).
withGraphFetched('media').
first());case 7:manualJournal = _context8.sent;if (
manualJournal) {_context8.next = 10;break;}return _context8.abrupt("return",
res.status(404).send({
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:_context8.next = 12;return (
AccountTransaction.query().
whereIn('reference_type', ['Journal', 'ManualJournal']).
where('reference_id', manualJournal.id));case 12:transactions = _context8.sent;return _context8.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 _context8.stop();}}}, _callee8);}));function handler(_x17, _x18) {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 _callee9(req, res) {var validationErrors, id, _req$models7, ManualJournal, AccountTransaction, MediaLink, Account, manualJournal, transactions, accountsDepGraph, journal;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:
id = req.params.id;_req$models7 =
req.models, ManualJournal = _req$models7.ManualJournal, AccountTransaction = _req$models7.AccountTransaction, MediaLink = _req$models7.MediaLink, Account = _req$models7.Account;_context9.next = 7;return (
ManualJournal.query().
where('id', id).first());case 7:manualJournal = _context9.sent;if (
manualJournal) {_context9.next = 10;break;}return _context9.abrupt("return",
res.status(404).send({
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 100 }] }));case 10:_context9.next = 12;return (
AccountTransaction.query().
whereIn('reference_type', ['Journal', 'ManualJournal']).
where('reference_id', manualJournal.id).
withGraphFetched('account.type'));case 12:transactions = _context9.sent;_context9.next = 15;return (
Account.depGraph().query().remember());case 15:accountsDepGraph = _context9.sent;
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
journal.loadEntries(transactions);
journal.removeEntries();_context9.next = 21;return (
MediaLink.query().
where('model_name', 'Journal').
where('model_id', manualJournal.id)["delete"]());case 21:_context9.next = 23;return (
ManualJournal.query().
where('id', manualJournal.id)["delete"]());case 23:_context9.next = 25;return (
Promise.all([
journal.deleteEntries(),
journal.saveBalance()]));case 25:return _context9.abrupt("return",
res.status(200).send({ id: id }));case 26:case "end":return _context9.stop();}}}, _callee9);}));function handler(_x19, _x20) {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 _callee10(req, res) {var validationErrors;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:case "end":return _context10.stop();}}}, _callee10);}));function handler(_x21, _x22) {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 _callee11(req, res) {var validationErrors, errorReasons, form, Account, foundAccounts, creditAccount, debitAccount;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee11$(_context11) {while (1) {switch (_context11.prev = _context11.next) {case 0:
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
validationErrors.isEmpty()) {_context11.next = 3;break;}return _context11.abrupt("return",
res.boom.badData(null, _objectSpread({
code: 'validation_error' }, validationErrors)));case 3:
errorReasons = [];
form = _objectSpread({}, req.body);
Account = req.models.Account;_context11.next = 8;return (
Account.query().
where('id', form.credit_account_id).
orWhere('id', form.debit_account_id));case 8:foundAccounts = _context11.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)) {_context11.next = 15;break;}return _context11.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 15:return _context11.abrupt("return",
res.status(200).send());case 16:case "end":return _context11.stop();}}}, _callee11);}));function handler(_x23, _x24) {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 _callee12(req, res) {var validationErrors, filter, _req$models8, ManualJournal, AccountTransaction, Account, MediaLink, manualJournals, notFoundManualJournals, transactions, accountsDepGraph, journal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee12$(_context12) {while (1) {switch (_context12.prev = _context12.next) {case 0:
validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["validationResult"])(req);if (
validationErrors.isEmpty()) {_context12.next = 3;break;}return _context12.abrupt("return",
res.boom.badData(null, _objectSpread({
code: 'validation_error' }, validationErrors)));case 3:
filter = _objectSpread({}, req.query);_req$models8 =
req.models, ManualJournal = _req$models8.ManualJournal, AccountTransaction = _req$models8.AccountTransaction, Account = _req$models8.Account, MediaLink = _req$models8.MediaLink;_context12.next = 7;return (
ManualJournal.query().
whereIn('id', filter.ids));case 7:manualJournals = _context12.sent;
notFoundManualJournals = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(filter.ids, manualJournals.map(function (m) {return m.id;}));if (!(
notFoundManualJournals.length > 0)) {_context12.next = 11;break;}return _context12.abrupt("return",
res.status(404).send({
errors: [{ type: 'MANUAL.JOURNAL.NOT.FOUND', code: 200 }] }));case 11:_context12.next = 13;return (
AccountTransaction.query().
whereIn('reference_type', ['Journal', 'ManualJournal']).
whereIn('reference_id', filter.ids));case 13:transactions = _context12.sent;_context12.next = 16;return (
Account.depGraph().query().remember());case 16:accountsDepGraph = _context12.sent;
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_9__["default"](accountsDepGraph);
journal.loadEntries(transactions);
journal.removeEntries();_context12.next = 22;return (
MediaLink.query().
where('model_name', 'Journal').
whereIn('model_id', filter.ids)["delete"]());case 22:_context12.next = 24;return (
ManualJournal.query().
whereIn('id', filter.ids)["delete"]());case 24:_context12.next = 26;return (
Promise.all([
journal.deleteEntries(),
journal.saveBalance()]));case 26:return _context12.abrupt("return",
res.status(200).send({ ids: filter.ids }));case 27:case "end":return _context12.stop();}}}, _callee12);}));function handler(_x25, _x26) {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/BaseController.js":
/*!************************************************!*\
!*** ./src/http/controllers/BaseController.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 BaseController; });
/* 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__);
var
BaseController = function BaseController() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseController);};
/***/ }),
/***/ "./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/Customers.js":
/*!*******************************************!*\
!*** ./src/http/controllers/Customers.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");
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
/* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__ = __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_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 validatioRoles = [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('customer_type').
exists().
isIn(['individual', 'business']).
trim().
escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('company_name').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('display_name').exists().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').optional().isEmail().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('work_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('personal_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_city').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_country').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_email').optional().isEmail().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_zipcode').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_state').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_city').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_country').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_email').optional().isEmail().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_zip_code').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_state').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('note').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('active').optional().isBoolean().toBoolean(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields').optional().isArray({ min: 1 }),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.key').exists().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.value').exists()];
/* harmony default export */ __webpack_exports__["default"] = ({
/**
* Router constructor.
*/
router: function router() {
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
router.post('/',
this.newCustomer.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newCustomer.handler));
router.post('/:id',
this.editCustomer.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editCustomer.handler));
router["delete"]('/:id',
this.deleteCustomer.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteCustomer.handler));
router.get('/',
this.listCustomers.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.listCustomers.handler));
router.get('/:id',
this.getCustomer.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getCustomer.handler));
return router;
},
/**
* Retrieve customers list with pagination and custom view metadata.
*/
listCustomers: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_order').optional().isIn(['created_at']),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().isIn(['desc', 'asc']),
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"])('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_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Resource, View, Customer, errorReasons, customersResource, filter, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, customers;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:_req$models =
req.models, Resource = _req$models.Resource, View = _req$models.View, Customer = _req$models.Customer;
errorReasons = [];_context.next = 7;return (
Resource.query().
where('name', 'customers').
withGraphFetched('fields').
first());case 7:customersResource = _context.sent;if (
customersResource) {_context.next = 10;break;}return _context.abrupt("return",
res.status(400).send({
errors: [{ type: 'CUSTOMERS.RESOURCE.NOT.FOUND', code: 200 }] }));case 10:
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);
}_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', customersResource.id);
builder.withGraphFetched('roles.field');
builder.withGraphFetched('columns');
builder.first();
}));case 14:view = _context.sent;
resourceFieldsKeys = customersResource.fields.map(function (c) {return c.key;});
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilter"](Customer.tableName);
// Dynamic filter with view roles.
if (view && view.roles.length > 0) {
viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterViews"](
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["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_8__["DynamicFilterFilterRoles"](
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["mapFilterRolesToDynamicFilter"])(filter.filter_roles),
customersResource.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_8__["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 (
Customer.query().onBuild(function (builder) {
dynamicFilter.buildQuery()(builder);
}).pagination(filter.page - 1, filter.page_size));case 24:customers = _context.sent;return _context.abrupt("return",
res.status(200).send(_objectSpread({
customers: customers },
view ? {
customViewId: view.id } :
{})));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
/**
* Submit a new customer details.
*/
newCustomer: {
validation: [].concat(
validatioRoles),
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, Customer, form, customer;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:
Customer = req.models.Customer;
form = _objectSpread({}, req.body);_context2.next = 7;return (
Customer.query().insertAndFetch(_objectSpread({},
Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [
'customer_type',
'first_name',
'last_name',
'company_name',
'display_name',
'email',
'work_phone',
'personal_phone',
'billing_address_1',
'billing_address_2',
'billing_address_city',
'billing_address_country',
'billing_address_email',
'billing_address_zipcode',
'billing_address_phone',
'billing_address_state',
'shipping_address_1',
'shipping_address_2',
'shipping_address_city',
'shipping_address_country',
'shipping_address_email',
'shipping_address_zipcode',
'shipping_address_phone',
'shipping_address_state',
'note',
'active']))));case 7:customer = _context2.sent;return _context2.abrupt("return",
res.status(200).send({ id: customer.id }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
/**
* Edit details of the given customer id.
*/
editCustomer: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()].concat(
validatioRoles),
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, Customer, customer;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);
Customer = req.models.Customer;_context3.next = 8;return (
Customer.query().where('id', id).first());case 8:customer = _context3.sent;if (
customer) {_context3.next = 11;break;}return _context3.abrupt("return",
res.status(404).send({
errors: [{ type: 'CUSTOMER.NOT.FOUND', code: 200 }] }));case 11:_context3.next = 13;return (
Customer.query().where('id', id).patch(_objectSpread({},
Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [
'customer_type',
'first_name',
'last_name',
'company_name',
'display_name',
'email',
'work_phone',
'personal_phone',
'billing_address_1',
'billing_address_2',
'billing_address_city',
'billing_address_country',
'billing_address_email',
'billing_address_zipcode',
'billing_address_phone',
'billing_address_state',
'shipping_address_1',
'shipping_address_2',
'shipping_address_city',
'shipping_address_country',
'shipping_address_email',
'shipping_address_zipcode',
'shipping_address_phone',
'shipping_address_state',
'note',
'active']))));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;}() },
/**
* Retrieve details of the given customer id.
*/
getCustomer: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').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, Customer, id, customer;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:
Customer = req.models.Customer;
id = req.params.id;_context4.next = 7;return (
Customer.query().where('id', id).first());case 7:customer = _context4.sent;if (
customer) {_context4.next = 10;break;}return _context4.abrupt("return",
res.status(404).send({
errors: [{ type: 'CUSTOMER.NOT.FOUND', code: 200 }] }));case 10:return _context4.abrupt("return",
res.status(200).send({ customer: customer }));case 11:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
/**
* Delete the given customer.
*/
deleteCustomer: {
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, Customer, id, customer;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:
Customer = req.models.Customer;
id = req.params.id;_context5.next = 7;return (
Customer.query().where('id', id).first());case 7:customer = _context5.sent;if (
customer) {_context5.next = 10;break;}return _context5.abrupt("return",
res.status(404).send({
errors: [{ type: 'CUSTOMER.NOT.FOUND', code: 200 }] }));case 10:_context5.next = 12;return (
Customer.query().where('id', id)["delete"]());case 12:return _context5.abrupt("return",
res.status(200).send());case 13:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.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/Expenses.js":
/*!******************************************!*\
!*** ./src/http/controllers/Expenses.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");
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
/* harmony import */ var _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/services/Accounting/JournalEntry */ "./src/services/Accounting/JournalEntry.js");
/* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.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_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(_http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_10__["default"]);
router.post('/',
this.newExpense.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.newExpense.handler));
router.post('/:id/publish',
this.publishExpense.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.publishExpense.handler));
router["delete"]('/:id',
this.deleteExpense.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.deleteExpense.handler));
router.post('/:id',
this.updateExpense.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.updateExpense.handler));
router.get('/',
this.listExpenses.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.listExpenses.handler));
router.get('/:id',
this.getExpense.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_7__["default"])(this.getExpense.handler));
return router;
},
/**
* Saves a new expense.
*/
newExpense: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference_no').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_date').isISO8601().optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_account_id').exists().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('currency_code').optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').optional().isNumeric().toFloat(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('publish').optional().isBoolean().toBoolean(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories').exists().isArray({ min: 1 }),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.index').exists().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.expense_account_id').exists().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.amount').optional().isNumeric().toFloat(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.description').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields').optional().isArray({ min: 0 }),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.key').exists().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.value').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, user, _req$models, Expense, ExpenseCategory, Account, form, totalAmount, expenseAccountsIds, storedExpenseAccounts, storedExpenseAccountsIds, notStoredExpensesAccountsIds, errorReasons, paymentAccount, expenseTransaction, storeExpenseCategoriesOper, accountsDepGraph, journalPoster, mixinEntry, paymentJournalEntry;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;_req$models =
req.models, Expense = _req$models.Expense, ExpenseCategory = _req$models.ExpenseCategory, Account = _req$models.Account;
form = _objectSpread({
date: new Date(),
published: false,
custom_fields: [],
categories: [] },
req.body);
totalAmount = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["sumBy"])(form.categories, 'amount');
expenseAccountsIds = form.categories.map(function (account) {return account.expense_account_id;});_context.next = 10;return (
Account.query().whereIn('id', expenseAccountsIds));case 10:storedExpenseAccounts = _context.sent;
storedExpenseAccountsIds = storedExpenseAccounts.map(function (a) {return a.id;});
notStoredExpensesAccountsIds = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(expenseAccountsIds, storedExpenseAccountsIds);
errorReasons = [];_context.next = 16;return (
Account.query().where('id', form.payment_account_id).first());case 16:paymentAccount = _context.sent;
if (!paymentAccount) {
errorReasons.push({
type: 'PAYMENT.ACCOUNT.NOT.FOUND', code: 500 });
}
if (notStoredExpensesAccountsIds.length > 0) {
errorReasons.push({
type: 'EXPENSE.ACCOUNTS.IDS.NOT.STORED', code: 400, ids: notStoredExpensesAccountsIds });
}
if (totalAmount <= 0) {
errorReasons.push({ type: 'TOTAL.AMOUNT.EQUALS.ZERO', code: 300 });
}if (!(
errorReasons.length > 0)) {_context.next = 22;break;}return _context.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 22:_context.next = 24;return (
Expense.query().insert({
total_amount: totalAmount,
payment_account_id: form.payment_account_id,
reference_no: form.reference_no,
description: form.description,
payment_date: moment__WEBPACK_IMPORTED_MODULE_5___default()(form.payment_date).format('YYYY-MM-DD'),
user_id: user.id }));case 24:expenseTransaction = _context.sent;
storeExpenseCategoriesOper = [];
form.categories.forEach(function (category) {
var oper = ExpenseCategory.query().insert(_objectSpread({
expense_id: expenseTransaction.id },
category));
storeExpenseCategoriesOper.push(oper);
});_context.next = 29;return (
Account.depGraph().query());case 29:accountsDepGraph = _context.sent;
journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph);
mixinEntry = {
referenceType: 'Expense',
referenceId: expenseTransaction.id,
userId: user.id,
draft: !form.publish };
paymentJournalEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({
credit: totalAmount,
account: paymentAccount.id },
mixinEntry));
journalPoster.credit(paymentJournalEntry);
form.categories.forEach(function (category) {
var expenseJournalEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({
account: category.expense_account_id,
debit: category.amount,
note: category.description },
mixinEntry));
journalPoster.debit(expenseJournalEntry);
});_context.next = 37;return (
Promise.all([].concat(
storeExpenseCategoriesOper, [
journalPoster.saveEntries(),
form.status && journalPoster.saveBalance()])));case 37:return _context.abrupt("return",
res.status(200).send({ id: expenseTransaction.id }));case 38:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
/**
* Publish the given expense id.
*/
publishExpense: {
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 validationErrors, id, _req$models2, Expense, AccountTransaction, expense, errorReasons, transactions, accountsDepGraph, journal, updateAccTransactionsOper, updateExpenseOper;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:
id = req.params.id;_req$models2 =
req.models, Expense = _req$models2.Expense, AccountTransaction = _req$models2.AccountTransaction;_context2.next = 7;return (
Expense.query().findById(id));case 7:expense = _context2.sent;
errorReasons = [];if (
expense) {_context2.next = 12;break;}
errorReasons.push({ type: 'EXPENSE.NOT.FOUND', code: 100 });return _context2.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 12:
if (expense.published) {
errorReasons.push({ type: 'EXPENSE.ALREADY.PUBLISHED', code: 200 });
}if (!(
errorReasons.length > 0)) {_context2.next = 15;break;}return _context2.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 15:_context2.next = 17;return (
AccountTransaction.query().
whereIn('reference_type', ['Expense']).
where('reference_id', expense.id).
withGraphFetched('account.type'));case 17:transactions = _context2.sent;_context2.next = 20;return (
Account.depGraph().query().remember());case 20:accountsDepGraph = _context2.sent;
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph);
journal.loadEntries(transactions);
journal.calculateEntriesBalanceChange();
updateAccTransactionsOper = AccountTransaction.query().
where('reference_id', expense.id).
where('reference_type', 'Expense').
patch({
draft: false });
updateExpenseOper = Expense.query().
where('id', expense.id).
update({ published: true });_context2.next = 28;return (
Promise.all([
updateAccTransactionsOper,
updateExpenseOper,
journal.saveBalance()]));case 28:return _context2.abrupt("return",
res.status(200).send());case 29:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
/**
* Retrieve paginated expenses list.
*/
listExpenses: {
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"])('custom_view_id').optional().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('stringified_filter_roles').optional().isJSON(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_by').optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().isIn(['desc', 'asc'])],
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, filter, errorReasons, _req$models3, Resource, Expense, View, expensesResource, expensesResourceFields, view, dynamicFilter, sortByFilter, viewFilter, filterRoles, expenses;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:
filter = _objectSpread({
sort_order: 'asc',
filter_roles: [],
page_size: 15,
page: 1 },
req.query);
errorReasons = [];_req$models3 =
req.models, Resource = _req$models3.Resource, Expense = _req$models3.Expense, View = _req$models3.View;_context3.next = 8;return (
Resource.query().
remember().
where('name', 'expenses').
withGraphFetched('fields').
first());case 8:expensesResource = _context3.sent;
expensesResourceFields = expensesResource.fields.map(function (f) {return f.key;});if (
expensesResource) {_context3.next = 12;break;}return _context3.abrupt("return",
res.status(400).send({
errors: [{ type: 'EXPENSES.RESOURCE.NOT.FOUND', code: 200 }] }));case 12:_context3.next = 14;return (
View.query().onBuild(function (builder) {
if (filter.csutom_view_id) {
builder.where('id', filter.csutom_view_id);
} else {
builder.where('favourite', true);
}
builder.withGraphFetched('roles.field');
builder.withGraphFetched('columns');
builder.first();
}));case 14:view = _context3.sent;
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilter"](Expense.tableName);
// Column sorting.
if (filter.column_sort_by) {
if (expensesResourceFields.indexOf(filter.column_sort_by) === -1) {
errorReasons.push({ type: 'COLUMN.SORT.ORDER.NOT.FOUND', code: 300 });
}
sortByFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterSortBy"](
filter.column_sort_by,
filter.sort_order);
dynamicFilter.setFilter(sortByFilter);
}
// Custom 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);
}
// Filter roles.
if (filter.filter_roles.length > 0) {
filterRoles = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_12__["DynamicFilterFilterRoles"](
mapFilterRolesToDynamicFilter(filter.filter_roles),
expensesResource.fields);
if (filterRoles.validateFilterRoles().length > 0) {
errorReasons.push({ type: 'ACCOUNTS.RESOURCE.HAS.NO.GIVEN.FIELDS', code: 500 });
}
dynamicFilter.setFilter(filterRoles);
}if (!(
errorReasons.length > 0)) {_context3.next = 21;break;}return _context3.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 21:_context3.next = 23;return (
Expense.query().onBuild(function (builder) {
builder.withGraphFetched('paymentAccount');
builder.withGraphFetched('categories');
builder.withGraphFetched('user');
dynamicFilter.buildQuery()(builder);
}).pagination(filter.page - 1, filter.page_size));case 23:expenses = _context3.sent;;return _context3.abrupt("return",
res.status(200).send(_objectSpread({
expenses: expenses,
page_size: filter.page_size,
page: filter.page },
view ? {
viewColumns: view.columns,
customViewId: view.id } :
{})));case 26:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.apply(this, arguments);}return handler;}() },
/**
* Delete the given expense transaction.
*/
deleteExpense: {
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, _req$models4, Expense, ExpenseCategory, AccountTransaction, Account, expense, deleteExpenseOper, expenseTransactions, accountsDepGraph, journalEntries;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;_req$models4 =
req.models, Expense = _req$models4.Expense, ExpenseCategory = _req$models4.ExpenseCategory, AccountTransaction = _req$models4.AccountTransaction, Account = _req$models4.Account;_context4.next = 7;return (
Expense.query().where('id', id).first());case 7:expense = _context4.sent;if (
expense) {_context4.next = 10;break;}return _context4.abrupt("return",
res.status(404).send({ errors: [{
type: 'EXPENSE.NOT.FOUND', code: 200 }] }));case 10:_context4.next = 12;return (
ExpenseCategory.query().where('expense_id', id)["delete"]());case 12:
deleteExpenseOper = Expense.query().where('id', id)["delete"]();_context4.next = 15;return (
AccountTransaction.query().
where('reference_type', 'Expense').
where('reference_id', expense.id));case 15:expenseTransactions = _context4.sent;_context4.next = 18;return (
Account.depGraph().query().remember());case 18:accountsDepGraph = _context4.sent;
journalEntries = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph);
journalEntries.loadEntries(expenseTransactions);
journalEntries.removeEntries();_context4.next = 24;return (
Promise.all([
deleteExpenseOper,
journalEntries.deleteEntries(),
journalEntries.saveBalance()]));case 24: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;}() },
/**
* Update details of the given account.
*/
updateExpense: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('reference_no').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_date').isISO8601().optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('payment_account_id').exists().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('description').optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('currency_code').optional(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('exchange_rate').optional().isNumeric().toFloat(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('publish').optional().isBoolean().toBoolean(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories').exists().isArray({ min: 1 }),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.id').optional().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.index').exists().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.expense_account_id').exists().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.amount').optional().isNumeric().toFloat(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('categories.*.description').optional().trim().escape()],
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, _req$models5, Account, Expense, ExpenseCategory, AccountTransaction, form, expense, errorReasons, paymentAccount, categoriesHasNoId, categoriesHasId, expenseCategoriesIds, formExpenseCategoriesIds, categoriesIdsDeleted, categoriesShouldDelete, formExpensesAccountsIds, storedExpenseAccounts, storedExpenseAccountsIds, expenseAccountsIdsNotFound, totalAmount, expenseCategoriesMap, categoriesInsertOpers, categoriesUpdateOpers, updateExpenseOper, deleteCategoriesOper, transactions, accountsDepGraph, journal, mixinEntry, paymentJournalEntry;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;_req$models5 =
req.models, Account = _req$models5.Account, Expense = _req$models5.Expense, ExpenseCategory = _req$models5.ExpenseCategory, AccountTransaction = _req$models5.AccountTransaction;
form = _objectSpread({
categories: [] },
req.body);
if (!Array.isArray(form.categories)) {
form.categories = [form.categories];
}_context5.next = 10;return (
Expense.query().
where('id', id).
withGraphFetched('categories').
first());case 10:expense = _context5.sent;if (
expense) {_context5.next = 13;break;}return _context5.abrupt("return",
res.status(404).send({
errors: [{ type: 'EXPENSE.NOT.FOUND', code: 200 }] }));case 13:
errorReasons = [];_context5.next = 16;return (
Account.query().
where('id', form.payment_account_id).first());case 16:paymentAccount = _context5.sent;
if (!paymentAccount) {
errorReasons.push({ type: 'PAYMENT.ACCOUNT.NOT.FOUND', code: 400 });
}
categoriesHasNoId = form.categories.filter(function (c) {return !c.id;});
categoriesHasId = form.categories.filter(function (c) {return c.id;});
expenseCategoriesIds = expense.categories.map(function (c) {return c.id;});
formExpenseCategoriesIds = categoriesHasId.map(function (c) {return c.id;});
categoriesIdsDeleted = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(
formExpenseCategoriesIds, expenseCategoriesIds);
categoriesShouldDelete = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(
expenseCategoriesIds, formExpenseCategoriesIds);
formExpensesAccountsIds = form.categories.map(function (c) {return c.expense_account_id;});_context5.next = 27;return (
Account.query().whereIn('id', formExpensesAccountsIds));case 27:storedExpenseAccounts = _context5.sent;
storedExpenseAccountsIds = storedExpenseAccounts.map(function (a) {return a.id;});
expenseAccountsIdsNotFound = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["difference"])(
formExpensesAccountsIds, storedExpenseAccountsIds);
totalAmount = Object(lodash__WEBPACK_IMPORTED_MODULE_6__["sumBy"])(form.categories, 'amount');
if (expenseAccountsIdsNotFound.length > 0) {
errorReasons.push({ type: 'EXPENSE.ACCOUNTS.IDS.NOT.FOUND', code: 600, ids: expenseAccountsIdsNotFound });
}
if (categoriesIdsDeleted.length > 0) {
errorReasons.push({ type: 'EXPENSE.CATEGORIES.IDS.NOT.FOUND', code: 300 });
}
if (totalAmount <= 0) {
errorReasons.push({ type: 'TOTAL.AMOUNT.EQUALS.ZERO', code: 500 });
}
// Handle all error reasons.
if (!(errorReasons.length > 0)) {_context5.next = 36;break;}return _context5.abrupt("return",
res.status(400).send({ errors: errorReasons }));case 36:
expenseCategoriesMap = new Map(expense.categories.
map(function (category) {return [category.id, category];}));
categoriesInsertOpers = [];
categoriesUpdateOpers = [];
categoriesHasNoId.forEach(function (category) {
var oper = ExpenseCategory.query().insert(_objectSpread({},
category, {
expense_id: expense.id }));
categoriesInsertOpers.push(oper);
});
categoriesHasId.forEach(function (category) {
var oper = ExpenseCategory.query().where('id', category.id).
patch(_objectSpread({},
Object(lodash__WEBPACK_IMPORTED_MODULE_6__["omit"])(category, ['id'])));
categoriesUpdateOpers.push(oper);
});
updateExpenseOper = Expense.query().where('id', id).
update({
payment_date: moment__WEBPACK_IMPORTED_MODULE_5___default()(form.payment_date).format('YYYY-MM-DD'),
total_amount: totalAmount,
description: form.description,
payment_account_id: form.payment_account_id,
reference_no: form.reference_no });
deleteCategoriesOper = categoriesShouldDelete.length > 0 ?
ExpenseCategory.query().whereIn('id', categoriesShouldDelete)["delete"]() :
Promise.resolve();
// Update the journal entries.
_context5.next = 45;return AccountTransaction.query().
whereIn('reference_type', ['Expense']).
where('reference_id', expense.id).
withGraphFetched('account.type');case 45:transactions = _context5.sent;_context5.next = 48;return (
Account.depGraph().query().remember());case 48:accountsDepGraph = _context5.sent;
journal = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_8__["default"](accountsDepGraph);
journal.loadEntries(transactions);
journal.removeEntries();
mixinEntry = {
referenceType: 'Expense',
referenceId: expense.id,
userId: user.id,
draft: !form.publish };
paymentJournalEntry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({
credit: totalAmount,
account: paymentAccount.id },
mixinEntry));
journal.credit(paymentJournalEntry);
form.categories.forEach(function (category) {
var entry = new _services_Accounting_JournalEntry__WEBPACK_IMPORTED_MODULE_9__["default"](_objectSpread({
account: category.expense_account_id,
debit: category.amount,
note: category.description },
mixinEntry));
journal.debit(entry);
});_context5.next = 58;return (
Promise.all([].concat(
categoriesInsertOpers,
categoriesUpdateOpers, [
updateExpenseOper,
deleteCategoriesOper,
journal.saveEntries(),
form.status && journal.saveBalance()])));case 58:return _context5.abrupt("return",
res.status(200).send({ id: id }));case 59:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.apply(this, arguments);}return handler;}() },
/**
* Retrieve details of the given expense id.
*/
getExpense: {
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, _req$models6, Expense, AccountTransaction, expense, journalEntries;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;_req$models6 =
req.models, Expense = _req$models6.Expense, AccountTransaction = _req$models6.AccountTransaction;_context6.next = 7;return (
Expense.query().
where('id', id).
withGraphFetched('categories').
withGraphFetched('paymentAccount').
withGraphFetched('user').
first());case 7:expense = _context6.sent;if (
expense) {_context6.next = 10;break;}return _context6.abrupt("return",
res.status(404).send({
errors: [{ type: 'EXPENSE.NOT.FOUND', code: 200 }] }));case 10:_context6.next = 12;return (
AccountTransaction.query().
where('reference_id', expense.id).
where('reference_type', 'Expense'));case 12:journalEntries = _context6.sent;return _context6.abrupt("return",
res.status(200).send({
expense: _objectSpread({},
expense, {
journalEntries: journalEntries }) }));case 14:case "end":return _context6.stop();}}}, _callee6);}));function handler(_x11, _x12) {return _handler6.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 import */ var _FinancialStatements_ReceivableAgingSummary__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FinancialStatements/ReceivableAgingSummary */ "./src/http/controllers/FinancialStatements/ReceivableAgingSummary.js");
/* harmony import */ var _FinancialStatements_PayableAgingSummary__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./FinancialStatements/PayableAgingSummary */ "./src/http/controllers/FinancialStatements/PayableAgingSummary.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());
router.use('/receivable_aging_summary', _FinancialStatements_ReceivableAgingSummary__WEBPACK_IMPORTED_MODULE_6__["default"].router());
router.use('/payable_aging_summary', _FinancialStatements_PayableAgingSummary__WEBPACK_IMPORTED_MODULE_7__["default"].router());
return router;
} });
/***/ }),
/***/ "./src/http/controllers/FinancialStatements/AgingReport.js":
/*!*****************************************************************!*\
!*** ./src/http/controllers/FinancialStatements/AgingReport.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 AgingReport; });
/* 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 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 express_validator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! express-validator */ "express-validator");
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(express_validator__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 _http_controllers_BaseController__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/http/controllers/BaseController */ "./src/http/controllers/BaseController.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
AgingReport = /*#__PURE__*/function (_BaseController) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(AgingReport, _BaseController);function AgingReport() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, AgingReport);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(AgingReport).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(AgingReport, null, [{ key: "validateResults",
/**
* Express validator middleware.
* @param {Request} req
* @param {Response} res
* @param {Function} next
*/value: function validateResults(
req, res, next) {
var validationErrors = Object(express_validator__WEBPACK_IMPORTED_MODULE_7__["validationResult"])(req);
if (!validationErrors.isEmpty()) {
return res.boom.badData(null, _objectSpread({
code: 'validation_error' }, validationErrors));
}
next();
}
/**
*
* @param {Array} agingPeriods
* @param {Numeric} customerBalance
*/ }, { key: "contactAgingBalance", value: function contactAgingBalance(
agingPeriods, receivableTotalCredit) {
var prevAging = 0;
var receivableCredit = receivableTotalCredit;
var diff = receivableCredit;
var periods = Object(lodash__WEBPACK_IMPORTED_MODULE_8__["reverse"])(agingPeriods).map(function (agingPeriod) {
var agingAmount = agingPeriod.closingBalance - prevAging;
var subtract = Math.min(diff, agingAmount);
diff -= Math.min(agingAmount, diff);
var total = Math.max(agingAmount - subtract, 0);
var output = _objectSpread({},
Object(lodash__WEBPACK_IMPORTED_MODULE_8__["omit"])(agingPeriod, ['closingBalance']), {
total: total });
prevAging = agingPeriod.closingBalance;
return output;
});
return Object(lodash__WEBPACK_IMPORTED_MODULE_8__["reverse"])(periods);
}
/**
*
* @param {*} asDay
* @param {*} agingDaysBefore
* @param {*} agingPeriodsFreq
*/ }, { key: "agingRangePeriods", value: function agingRangePeriods(
asDay, agingDaysBefore, agingPeriodsFreq) {
var totalAgingDays = agingDaysBefore * agingPeriodsFreq;
var startAging = moment__WEBPACK_IMPORTED_MODULE_6___default()(asDay).startOf('day');
var endAging = startAging.clone().subtract('days', totalAgingDays).endOf('day');
var agingPeriods = [];
var startingAging = startAging.clone();
var beforeDays = 1;
var toDays = 0;
while (startingAging > endAging) {
var currentAging = startingAging.clone();
startingAging.subtract('days', agingDaysBefore).endOf('day');
toDays += agingDaysBefore;
agingPeriods.push(_objectSpread({
from_period: moment__WEBPACK_IMPORTED_MODULE_6___default()(currentAging).toDate(),
to_period: moment__WEBPACK_IMPORTED_MODULE_6___default()(startingAging).toDate(),
before_days: beforeDays === 1 ? 0 : beforeDays,
to_days: toDays },
startingAging.valueOf() === endAging.valueOf() ? {
to_period: null,
to_days: null } :
{}));
beforeDays += agingDaysBefore;
}
return agingPeriods;
}
/**
*
* @param {*} filter
*/ }, { key: "formatNumberClosure", value: 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;
};
} }]);return AgingReport;}(_http_controllers_BaseController__WEBPACK_IMPORTED_MODULE_9__["default"]);
/***/ }),
/***/ "./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/PayableAgingSummary.js":
/*!*************************************************************************!*\
!*** ./src/http/controllers/FinancialStatements/PayableAgingSummary.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 PayableAgingSummary; });
/* 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 _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 _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! express */ "express");
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_9__);
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! express-validator */ "express-validator");
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_10__);
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash */ "lodash");
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_11__);
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
/* harmony import */ var _http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/FinancialStatements/AgingReport */ "./src/http/controllers/FinancialStatements/AgingReport.js");
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! moment */ "moment");
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_15__);
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;}
var
PayableAgingSummary = /*#__PURE__*/function (_AgingReport) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default()(PayableAgingSummary, _AgingReport);function PayableAgingSummary() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, PayableAgingSummary);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(PayableAgingSummary).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(PayableAgingSummary, null, [{ key: "router",
/**
* Router constructor.
*/value: function router()
{
var router = express__WEBPACK_IMPORTED_MODULE_9___default.a.Router();
router.get(
'/',
this.payableAgingSummaryRoles(),
this.validateResults,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.validateVendorsIds.bind(this)),
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.payableAgingSummary.bind(this)));
return router;
}
/**
* Validates the report vendors ids query.
*/ }, { key: "validateVendorsIds", value: function () {var _validateVendorsIds = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(
req, res, next) {var Vendor, filter, storedCustomers, storedCustomersIds, notStoredCustomersIds;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
Vendor = req.models.Vendor;
filter = _objectSpread({
vendors_ids: [] },
req.query);
if (!Array.isArray(filter.vendors_ids)) {
filter.vendors_ids = [filter.vendors_ids];
}if (!(
filter.vendors_ids.length > 0)) {_context.next = 11;break;}_context.next = 6;return (
Vendor.query().whereIn(
'id',
filter.vendors_ids));case 6:storedCustomers = _context.sent;
storedCustomersIds = storedCustomers.map(function (c) {return c.id;});
notStoredCustomersIds = Object(lodash__WEBPACK_IMPORTED_MODULE_11__["difference"])(
storedCustomersIds,
filter,
vendors_ids);if (!
notStoredCustomersIds.length) {_context.next = 11;break;}return _context.abrupt("return",
res.status(400).send({
errors: [{ type: 'VENDORS.IDS.NOT.FOUND', code: 300 }] }));case 11:
next();case 12:case "end":return _context.stop();}}}, _callee);}));function validateVendorsIds(_x, _x2, _x3) {return _validateVendorsIds.apply(this, arguments);}return validateVendorsIds;}()
/**
* Receivable aging summary validation roles.
*/ }, { key: "payableAgingSummaryRoles", value: function payableAgingSummaryRoles()
{
return [
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('as_date').optional().isISO8601(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_days_before').optional().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_periods').optional().isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.1000_divide').optional().isBoolean().toBoolean(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('vendors_ids.*').isNumeric().toInt(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('none_zero').optional().isBoolean().toBoolean()];
}
/**
* Retrieve payable aging summary report.
*/ }, { key: "payableAgingSummary", value: function () {var _payableAgingSummary = _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 _this = this;var _req$models, Customer, Account, AccountTransaction, AccountType, storedVendors, filter, accountsReceivableType, accountsReceivable, transactions, journalPoster, agingPeriods, totalFormatter, vendors, agingClosingBalance, totalClosingBalance, agingTotal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_req$models =
req.models, Customer = _req$models.Customer, Account = _req$models.Account, AccountTransaction = _req$models.AccountTransaction, AccountType = _req$models.AccountType;_context2.next = 3;return (
Customer.query());case 3:storedVendors = _context2.sent;
filter = _objectSpread({
as_date: moment__WEBPACK_IMPORTED_MODULE_15___default()().format('YYYY-MM-DD'),
aging_days_before: 30,
aging_periods: 3,
number_format: {
no_cents: false,
divide_1000: false } },
req.query);_context2.next = 7;return (
AccountType.query().
where('key', 'accounts_payable').
first());case 7:accountsReceivableType = _context2.sent;_context2.next = 10;return (
Account.query().
where('account_type_id', accountsReceivableType.id).
remember().
first());case 10:accountsReceivable = _context2.sent;_context2.next = 13;return (
AccountTransaction.query().
modify('filterDateRange', null, filter.as_date).
where('account_id', accountsReceivable.id).
remember());case 13:transactions = _context2.sent;
journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__["default"]();
journalPoster.loadEntries(transactions);
agingPeriods = this.agingRangePeriods(
filter.as_date,
filter.aging_days_before,
filter.aging_periods);
// Total amount formmatter based on the given query.
totalFormatter = formatNumberClosure(filter.number_format);
vendors = storedVendors.map(function (vendor) {
// Calculate the trial balance total of the given vendor.
var vendorBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
vendor.id,
'vendor');
var agingClosingBalance = agingPeriods.map(function (agingPeriod) {
// Calculate the trial balance between the given date period.
var agingTrialBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
vendor.id,
'vendor',
agingPeriod.from_period);
return _objectSpread({},
agingPeriod, {
closingBalance: agingTrialBalance.debit });
});
var aging = _this.contactAgingBalance(
agingClosingBalance,
vendorBalance.credit);
return {
vendor_name: vendor.displayName,
aging: aging.map(function (item) {return _objectSpread({},
item, {
formatted_total: totalFormatter(item.total) });}),
total: vendorBalance.balance,
formatted_total: totalFormatted(vendorBalance.balance) };
});
agingClosingBalance = agingPeriods.map(function (agingPeriod) {
var closingTrialBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
null,
'vendor',
agingPeriod.from_period);
return _objectSpread({},
agingPeriod, {
closingBalance: closingTrialBalance.balance });
});
totalClosingBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
null,
'vendor');
agingTotal = this.contactAgingBalance(
agingClosingBalance,
totalClosingBalance.credit);return _context2.abrupt("return",
res.status(200).send({
columns: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(agingPeriods),
aging: {
vendors: vendors,
total: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(
agingTotal.map(function (item) {return _objectSpread({},
item, {
formatted_total: totalFormatter(item.total) });})) } }));case 23:case "end":return _context2.stop();}}}, _callee2, this);}));function payableAgingSummary(_x4, _x5) {return _payableAgingSummary.apply(this, arguments);}return payableAgingSummary;}() }]);return PayableAgingSummary;}(_http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__["default"]);
/***/ }),
/***/ "./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/ReceivableAgingSummary.js":
/*!****************************************************************************!*\
!*** ./src/http/controllers/FinancialStatements/ReceivableAgingSummary.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 ReceivableAgingSummary; });
/* 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 _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 _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "@babel/runtime/helpers/possibleConstructorReturn");
/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "@babel/runtime/helpers/getPrototypeOf");
/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "@babel/runtime/helpers/inherits");
/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! express */ "express");
/* harmony import */ var express__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(express__WEBPACK_IMPORTED_MODULE_9__);
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! express-validator */ "express-validator");
/* harmony import */ var express_validator__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(express_validator__WEBPACK_IMPORTED_MODULE_10__);
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash */ "lodash");
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_11__);
/* harmony import */ var _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/services/Accounting/JournalPoster */ "./src/services/Accounting/JournalPoster.js");
/* harmony import */ var _http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/middleware/asyncMiddleware */ "./src/http/middleware/asyncMiddleware.js");
/* harmony import */ var _http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/FinancialStatements/AgingReport */ "./src/http/controllers/FinancialStatements/AgingReport.js");
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! moment */ "moment");
/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_15__);
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;}
var
ReceivableAgingSummary = /*#__PURE__*/function (_AgingReport) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default()(ReceivableAgingSummary, _AgingReport);function ReceivableAgingSummary() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, ReceivableAgingSummary);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(ReceivableAgingSummary).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(ReceivableAgingSummary, null, [{ key: "router",
/**
* Router constructor.
*/value: function router()
{
var router = express__WEBPACK_IMPORTED_MODULE_9___default.a.Router();
router.get(
'/',
this.receivableAgingSummaryRoles,
this.validateResults,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.validateCustomersIds.bind(this)),
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_13__["default"])(this.receivableAgingSummary.bind(this)));
return router;
}
/**
* Validates the report customers ids query.
*/ }, { key: "validateCustomersIds", value: function () {var _validateCustomersIds = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_3___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(
req, res, next) {var Customer, filter, storedCustomers, storedCustomersIds, notStoredCustomersIds;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:
Customer = req.models.Customer;
console.log(req.query);
filter = _objectSpread({
customer_ids: [] },
req.query);
if (!Array.isArray(filter.customer_ids)) {
filter.customer_ids = [filter.customer_ids];
}if (!(
filter.customer_ids.length > 0)) {_context.next = 12;break;}_context.next = 7;return (
Customer.query().whereIn(
'id',
filter.customer_ids));case 7:storedCustomers = _context.sent;
storedCustomersIds = storedCustomers.map(function (c) {return parseInt(c.id, 10);});
notStoredCustomersIds = Object(lodash__WEBPACK_IMPORTED_MODULE_11__["difference"])(
filter.customer_ids.map(function (a) {return parseInt(a, 10);}),
storedCustomersIds);if (!
notStoredCustomersIds.length) {_context.next = 12;break;}return _context.abrupt("return",
res.status(400).send({
errors: [
{
type: 'CUSTOMERS.IDS.NOT.FOUND',
code: 300,
ids: notStoredCustomersIds }] }));case 12:
next();case 13:case "end":return _context.stop();}}}, _callee);}));function validateCustomersIds(_x, _x2, _x3) {return _validateCustomersIds.apply(this, arguments);}return validateCustomersIds;}()
/**
* Receivable aging summary validation roles.
*/ }, { key: "receivableAgingSummary",
/**
* Retrieve receivable aging summary report.
*/value: function () {var _receivableAgingSummary = _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 _this = this;var _req$models, Customer, Account, AccountTransaction, AccountType, filter, storedCustomers, accountsReceivableType, accountsReceivable, transactions, journalPoster, agingPeriods, totalFormatter, customers, agingClosingBalance, totalClosingBalance, agingTotal;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) {while (1) {switch (_context2.prev = _context2.next) {case 0:_req$models =
req.models, Customer = _req$models.Customer, Account = _req$models.Account, AccountTransaction = _req$models.AccountTransaction, AccountType = _req$models.AccountType;
filter = _objectSpread({
as_date: moment__WEBPACK_IMPORTED_MODULE_15___default()().format('YYYY-MM-DD'),
aging_days_before: 30,
aging_periods: 3,
number_format: {
no_cents: false,
divide_1000: false },
customer_ids: [],
none_zero: false },
req.query);
if (!Array.isArray(filter.customer_ids)) {
filter.customer_ids = [filter.customer_ids];
}_context2.next = 5;return (
Customer.query().onBuild(function (builder) {
if (filter.customer_ids) {
builder.modify('filterCustomerIds', filter.customer_ids);
}
return builder;
}));case 5:storedCustomers = _context2.sent;_context2.next = 8;return (
AccountType.query().
where('key', 'accounts_receivable').
first());case 8:accountsReceivableType = _context2.sent;_context2.next = 11;return (
Account.query().
where('account_type_id', accountsReceivableType.id).
remember().
first());case 11:accountsReceivable = _context2.sent;_context2.next = 14;return (
AccountTransaction.query().onBuild(function (query) {
query.modify('filterDateRange', null, filter.as_date);
query.where('account_id', accountsReceivable.id);
query.modify('filterContactType', 'customer');
if (filter.customer_ids.length > 0) {
query.modify('filterContactIds', filter.customer_ids);
}
query.remember();
return query;
}));case 14:transactions = _context2.sent;
journalPoster = new _services_Accounting_JournalPoster__WEBPACK_IMPORTED_MODULE_12__["default"]();
journalPoster.loadEntries(transactions);
agingPeriods = this.agingRangePeriods(
filter.as_date,
filter.aging_days_before,
filter.aging_periods);
// Total amount formmatter based on the given query.
totalFormatter = this.formatNumberClosure(filter.number_format);
customers = storedCustomers.map(function (customer) {
// Calculate the trial balance total of the given customer.
var customerBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
customer.id,
'customer');
var agingClosingBalance = agingPeriods.map(function (agingPeriod) {
// Calculate the trial balance between the given date period.
var agingTrialBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
customer.id,
'customer',
agingPeriod.from_period);
return _objectSpread({},
agingPeriod, {
closingBalance: agingTrialBalance.debit });
});
var aging = _this.contactAgingBalance(
agingClosingBalance,
customerBalance.credit);
return {
customer_name: customer.displayName,
aging: aging.map(function (item) {return _objectSpread({},
item, {
formatted_total: totalFormatter(item.total) });}),
total: customerBalance.balance,
formatted_total: totalFormatter(customerBalance.balance) };
});
agingClosingBalance = agingPeriods.map(function (agingPeriod) {
var closingTrialBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
null,
'customer',
agingPeriod.from_period);
return _objectSpread({},
agingPeriod, {
closingBalance: closingTrialBalance.balance });
});
totalClosingBalance = journalPoster.getContactTrialBalance(
accountsReceivable.id,
null,
'customer');
agingTotal = this.contactAgingBalance(
agingClosingBalance,
totalClosingBalance.credit);return _context2.abrupt("return",
res.status(200).send({
columns: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(agingPeriods),
aging: {
customers: customers,
total: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(
agingTotal.map(function (item) {return _objectSpread({},
item, {
formatted_total: totalFormatter(item.total) });})) } }));case 24:case "end":return _context2.stop();}}}, _callee2, this);}));function receivableAgingSummary(_x4, _x5) {return _receivableAgingSummary.apply(this, arguments);}return receivableAgingSummary;}() }, { key: "receivableAgingSummaryRoles", get: function get() {return [Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('as_date').optional().isISO8601(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_days_before').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('aging_periods').optional().isNumeric().toInt(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.no_cents').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('number_format.1000_divide').optional().isBoolean().toBoolean(), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["oneOf"])([Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('customer_ids').optional().isArray({ min: 1 }), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('customer_ids.*').isNumeric().toInt()], [Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('customer_ids').optional().isNumeric().toInt()]), Object(express_validator__WEBPACK_IMPORTED_MODULE_10__["query"])('none_zero').optional().isBoolean().toBoolean()];} }]);return ReceivableAgingSummary;}(_http_controllers_FinancialStatements_AgingReport__WEBPACK_IMPORTED_MODULE_14__["default"]);
/***/ }),
/***/ "./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/data',
this.resourceData.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_4__["default"])(this.resourceData.handler));
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 data of the given resource key/slug.
*/
resourceData: {
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 AccountType, resourceSlug, data;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;
resourceSlug = req.params.resource_slug;_context.next = 4;return (
AccountType.query());case 4:data = _context.sent;return _context.abrupt("return",
res.status(200).send({
data: data,
resource_slug: resourceSlug }));case 6:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
/**
* 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 _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, resourceFields;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:
resourceFields = resource.fields.
filter(function (field) {return field.columnable;}).
map(function (field) {return {
id: field.id,
label: field.labelName,
key: field.key };});return _context2.abrupt("return",
res.status(200).send({
resource_columns: resourceFields,
resource_slug: resourceSlug }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.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 _handler3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(req, res) {var resourceSlug, Resource, resource;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {while (1) {switch (_context3.prev = _context3.next) {case 0:
resourceSlug = req.params.resource_slug;
Resource = req.models.Resource;_context3.next = 4;return (
Resource.query().
where('name', resourceSlug).
withGraphFetched('fields').
first());case 4:resource = _context3.sent;if (
resource) {_context3.next = 7;break;}return _context3.abrupt("return",
res.status(400).send({
errors: [{ type: 'RESOURCE.SLUG.NOT.FOUND', code: 200 }] }));case 7:return _context3.abrupt("return",
res.status(200).send({
resource_fields: resource.fields,
resource_slug: resourceSlug }));case 8:case "end":return _context3.stop();}}}, _callee3);}));function handler(_x5, _x6) {return _handler3.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/Vendors.js":
/*!*****************************************!*\
!*** ./src/http/controllers/Vendors.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");
/* harmony import */ var _lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/ViewRolesBuilder */ "./src/lib/ViewRolesBuilder/index.js");
/* harmony import */ var _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__ = __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_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 validatioRoles = [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('first_name').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('last_name').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('company_name').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('display_name').exists().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('email').optional().isEmail().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('work_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('personal_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_city').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_country').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_email').optional().isEmail().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_zipcode').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('billing_address_state').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_city').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_country').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_email').optional().isEmail().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_zip_code').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_phone').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('shipping_address_state').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('note').optional().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('active').optional().isBoolean().toBoolean(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields').optional().isArray({ min: 1 }),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.key').exists().trim().escape(),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["check"])('custom_fields.*.value').exists()];
/* harmony default export */ __webpack_exports__["default"] = ({
/**
* Router constructor.
*/
router: function router() {
var router = express__WEBPACK_IMPORTED_MODULE_3___default.a.Router();
router.post('/',
this.newVendor.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.newVendor.handler));
router.post('/:id',
this.editVendor.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.editVendor.handler));
router["delete"]('/:id',
this.deleteVendor.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.deleteVendor.handler));
router.get('/',
this.listVendors.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.listVendors.handler));
router.get('/:id',
this.getVendor.validation,
Object(_http_middleware_asyncMiddleware__WEBPACK_IMPORTED_MODULE_6__["default"])(this.getVendor.handler));
return router;
},
/**
* Retrieve vendors list with pagination and custom view metadata.
*/
listVendors: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('column_sort_order').optional().isIn(['created_at']),
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["query"])('sort_order').optional().isIn(['desc', 'asc']),
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"])('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_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(req, res) {var validationErrors, _req$models, Resource, View, Vendor, errorReasons, vendorsResource, filter, view, resourceFieldsKeys, dynamicFilter, viewFilter, filterRoles, sortByFilter, vendors;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:_req$models =
req.models, Resource = _req$models.Resource, View = _req$models.View, Vendor = _req$models.Vendor;
errorReasons = [];_context.next = 7;return (
Resource.query().
where('name', 'vendors').
withGraphFetched('fields').
first());case 7:vendorsResource = _context.sent;if (
vendorsResource) {_context.next = 10;break;}return _context.abrupt("return",
res.status(400).send({
errors: [{ type: 'VENDORS.RESOURCE.NOT.FOUND', code: 200 }] }));case 10:
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);
}_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', vendorsResource.id);
builder.withGraphFetched('roles.field');
builder.withGraphFetched('columns');
builder.first();
}));case 14:view = _context.sent;
resourceFieldsKeys = vendorsResource.fields.map(function (c) {return c.key;});
dynamicFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilter"](Vendor.tableName);
// Dynamic filter with view roles.
if (view && view.roles.length > 0) {
viewFilter = new _lib_DynamicFilter__WEBPACK_IMPORTED_MODULE_8__["DynamicFilterViews"](
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["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_8__["DynamicFilterFilterRoles"](
Object(_lib_ViewRolesBuilder__WEBPACK_IMPORTED_MODULE_7__["mapFilterRolesToDynamicFilter"])(filter.filter_roles),
vendorsResource.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_8__["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 (
Vendor.query().onBuild(function (builder) {
dynamicFilter.buildQuery()(builder);
}).pagination(filter.page - 1, filter.page_size));case 24:vendors = _context.sent;return _context.abrupt("return",
res.status(200).send(_objectSpread({
vendors: vendors },
view ? {
customViewId: view.id } :
{})));case 26:case "end":return _context.stop();}}}, _callee);}));function handler(_x, _x2) {return _handler.apply(this, arguments);}return handler;}() },
/**
* Submit a new vendor details.
*/
newVendor: {
validation: [].concat(
validatioRoles),
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, Vendor, form, vendor;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:
Vendor = req.models.Vendor;
form = _objectSpread({}, req.body);_context2.next = 7;return (
Vendor.query().insertAndFetch(_objectSpread({},
Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [
'first_name',
'last_name',
'company_name',
'display_name',
'email',
'work_phone',
'personal_phone',
'billing_address_1',
'billing_address_2',
'billing_address_city',
'billing_address_country',
'billing_address_email',
'billing_address_zipcode',
'billing_address_phone',
'billing_address_state',
'shipping_address_1',
'shipping_address_2',
'shipping_address_city',
'shipping_address_country',
'shipping_address_email',
'shipping_address_zipcode',
'shipping_address_phone',
'shipping_address_state',
'note',
'active']))));case 7:vendor = _context2.sent;return _context2.abrupt("return",
res.status(200).send({ id: vendor.id }));case 9:case "end":return _context2.stop();}}}, _callee2);}));function handler(_x3, _x4) {return _handler2.apply(this, arguments);}return handler;}() },
/**
* Edit details of the given vendor id.
*/
editVendor: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').exists().isNumeric().toInt()].concat(
validatioRoles),
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, Vendor, vendor;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);
Vendor = req.models.Vendor;_context3.next = 8;return (
Vendor.query().where('id', id).first());case 8:vendor = _context3.sent;if (
vendor) {_context3.next = 11;break;}return _context3.abrupt("return",
res.status(404).send({
errors: [{ type: 'VENDOR.NOT.FOUND', code: 200 }] }));case 11:_context3.next = 13;return (
Vendor.query().where('id', id).patch(_objectSpread({},
Object(lodash__WEBPACK_IMPORTED_MODULE_5__["pick"])(form, [
'first_name',
'last_name',
'company_name',
'display_name',
'email',
'work_phone',
'personal_phone',
'billing_address_1',
'billing_address_2',
'billing_address_city',
'billing_address_country',
'billing_address_email',
'billing_address_zipcode',
'billing_address_phone',
'billing_address_state',
'shipping_address_1',
'shipping_address_2',
'shipping_address_city',
'shipping_address_country',
'shipping_address_email',
'shipping_address_zipcode',
'shipping_address_phone',
'shipping_address_state',
'note',
'active']))));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;}() },
/**
* Retrieve details of the given vendor id.
*/
getVendor: {
validation: [
Object(express_validator__WEBPACK_IMPORTED_MODULE_4__["param"])('id').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, Vendor, id, vendor;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:
Vendor = req.models.Vendor;
id = req.params.id;_context4.next = 7;return (
Vendor.query().where('id', id).first());case 7:vendor = _context4.sent;if (
vendor) {_context4.next = 10;break;}return _context4.abrupt("return",
res.status(404).send({
errors: [{ type: 'VENDOR.NOT.FOUND', code: 200 }] }));case 10:return _context4.abrupt("return",
res.status(200).send({ vendor: vendor }));case 11:case "end":return _context4.stop();}}}, _callee4);}));function handler(_x7, _x8) {return _handler4.apply(this, arguments);}return handler;}() },
/**
* Delete the given vendor.
*/
deleteVendor: {
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, Vendor, id, vendor;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:
Vendor = req.models.Vendor;
id = req.params.id;_context5.next = 7;return (
Vendor.query().where('id', id).first());case 7:vendor = _context5.sent;if (
vendor) {_context5.next = 10;break;}return _context5.abrupt("return",
res.status(404).send({
errors: [{ type: 'VENDOR.NOT.FOUND', code: 200 }] }));case 10:_context5.next = 12;return (
Vendor.query().where('id', id)["delete"]());case 12:return _context5.abrupt("return",
res.status(200).send());case 13:case "end":return _context5.stop();}}}, _callee5);}));function handler(_x9, _x10) {return _handler5.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_Expenses__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/http/controllers/Expenses */ "./src/http/controllers/Expenses.js");
/* harmony import */ var _http_controllers_Options__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/http/controllers/Options */ "./src/http/controllers/Options.js");
/* harmony import */ var _http_controllers_Currencies__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/http/controllers/Currencies */ "./src/http/controllers/Currencies.js");
/* harmony import */ var _http_controllers_Customers__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/http/controllers/Customers */ "./src/http/controllers/Customers.js");
/* harmony import */ var _http_controllers_Vendors__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/http/controllers/Vendors */ "./src/http/controllers/Vendors.js");
/* harmony import */ var _controllers_Resources__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./controllers/Resources */ "./src/http/controllers/Resources.js");
/* harmony import */ var _http_controllers_ExchangeRates__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/http/controllers/ExchangeRates */ "./src/http/controllers/ExchangeRates.js");
/* harmony import */ var _http_controllers_Media__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/http/controllers/Media */ "./src/http/controllers/Media.js");
/* harmony import */ var _http_middleware_jwtAuth__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/http/middleware/jwtAuth */ "./src/http/middleware/jwtAuth.js");
/* harmony import */ var _http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_20__ = __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 Budget from '@/http/controllers/Budget';
// import BudgetReports from '@/http/controllers/BudgetReports';
// 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_19__["default"]);
dashboard.use(_http_middleware_TenancyMiddleware__WEBPACK_IMPORTED_MODULE_20__["default"]);
dashboard.use('/api/currencies', _http_controllers_Currencies__WEBPACK_IMPORTED_MODULE_13__["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());
dashboard.use('/api/expenses', _http_controllers_Expenses__WEBPACK_IMPORTED_MODULE_11__["default"].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_12__["default"].router());
// app.use('/api/budget_reports', BudgetReports.router());
dashboard.use('/api/customers', _http_controllers_Customers__WEBPACK_IMPORTED_MODULE_14__["default"].router());
dashboard.use('/api/vendors', _http_controllers_Vendors__WEBPACK_IMPORTED_MODULE_15__["default"].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_16__["default"].router());
dashboard.use('/api/exchange_rates', _http_controllers_ExchangeRates__WEBPACK_IMPORTED_MODULE_17__["default"].router());
dashboard.use('/api/media', _http_controllers_Media__WEBPACK_IMPORTED_MODULE_18__["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",
"./Customer": "./src/models/Customer.js",
"./Customer.js": "./src/models/Customer.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",
"./ExpenseCategory": "./src/models/ExpenseCategory.js",
"./ExpenseCategory.js": "./src/models/ExpenseCategory.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",
"./Vendor": "./src/models/Vendor.js",
"./Vendor.js": "./src/models/Vendor.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 _utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/utils */ "./src/utils/index.js");
/* harmony import */ var _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_14__ = __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_13__["flatToNestedArray"])(accounts, { id: 'id', parentId: 'parentAccountId' });
} }, { key: "toDependencyGraph", value: function toDependencyGraph(
accounts) {
return _lib_DependencyGraph__WEBPACK_IMPORTED_MODULE_14__["default"].fromArray(
accounts, { itemId: 'id', parentItemId: 'parentAccountId' });
} }, { key: "tableName", /**
* Table name
*/get: function get() {return 'accounts';} /**
* Timestamps columns.
*/ }, { key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} /**
* Extend query builder model.
*/ }, { key: "QueryBuilder", get: function get() {return _lib_Cachable_CachableQueryBuilder__WEBPACK_IMPORTED_MODULE_11__["default"];} }, { key: "jsonSchema", get: function get() {return { type: 'object', properties: { // id: {type: 'integer'},
// birthday: {type: ['datetime', 'null']},
created_at: { type: 'datetime' } // updated: {type: ['datetime', 'null']}
} };} }, { 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"]]));
/***/ }),
/***/ "./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");
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';
}
/**
* Timestamps columns.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt'];
}
/**
* 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');
},
filterContactType: function filterContactType(query, contactType) {
query.where('contact_type', contactType);
},
filterContactIds: function filterContactIds(query, contactIds) {
query.whereIn('contact_id', contactIds);
} };
}
/**
* 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"]]));
/***/ }),
/***/ "./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");
/* harmony import */ var _lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/Cachable/CachableModel */ "./src/lib/Cachable/CachableModel.js");
// import path from 'path';
var
AccountType = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AccountType, _mixin);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;}(Object(objection__WEBPACK_IMPORTED_MODULE_5__["mixin"])(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"], [_lib_Cachable_CachableModel__WEBPACK_IMPORTED_MODULE_7__["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';
}
/**
* Timestamps columns.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
} }]);return Currency;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_5__["default"]);
/***/ }),
/***/ "./src/models/Customer.js":
/*!********************************!*\
!*** ./src/models/Customer.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 Customer; });
/* 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
Customer = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Customer, _TenantModel);function Customer() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Customer);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Customer).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Customer, null, [{ key: "tableName",
/**
* Table name
*/get: function get()
{
return 'customers';
}
/**
* Model timestamps.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
}
/**
* Model modifiers.
*/ }, { key: "modifiers", get: function get()
{
return {
filterCustomerIds: function filterCustomerIds(query, customerIds) {
query.whereIn('id', customerIds);
} };
} }]);return Customer;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["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';
}
/**
* Timestamps columns.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
} }]);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_transactions';
}
/**
* Account transaction reference type.
*/ }, { key: "referenceType", get: function get()
{
return 'Expense';
}
/**
* Model timestamps.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
}
/**
* 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");
var ExpenseCategory = __webpack_require__(/*! @/models/ExpenseCategory */ "./src/models/ExpenseCategory.js");
return {
paymentAccount: {
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
modelClass: this.relationBindKnex(Account["default"]),
join: {
from: 'expenses_transactions.paymentAccountId',
to: 'accounts.id' } },
categories: {
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].HasManyRelation,
modelClass: this.relationBindKnex(ExpenseCategory["default"]),
join: {
from: 'expenses_transactions.id',
to: 'expense_transaction_categories.expenseId' } },
user: {
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
modelClass: this.relationBindKnex(User["default"]),
join: {
from: 'expenses_transactions.userId',
to: 'users.id' } } };
} }]);return Expense;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["default"]);
/***/ }),
/***/ "./src/models/ExpenseCategory.js":
/*!***************************************!*\
!*** ./src/models/ExpenseCategory.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 ExpenseCategory; });
/* 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
ExpenseCategory = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ExpenseCategory, _TenantModel);function ExpenseCategory() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ExpenseCategory);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ExpenseCategory).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ExpenseCategory, null, [{ key: "tableName",
/**
* Table name
*/get: function get()
{
return 'expense_transaction_categories';
}
/**
* Relationship mapping.
*/ }, { key: "relationMappings", get: function get()
{
var Account = __webpack_require__(/*! @/models/Account */ "./src/models/Account.js");
return {
expenseAccount: {
relation: objection__WEBPACK_IMPORTED_MODULE_5__["Model"].BelongsToOneRelation,
modelClass: this.relationBindKnex(Account["default"]),
join: {
from: 'expense_transaction_categories.expenseAccountId',
to: 'accounts.id' } } };
} }]);return ExpenseCategory;}(_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 timestamps.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
}
/**
* 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';
}
/**
* Model timestamps.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
}
/**
* 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");
/* harmony import */ var _models_DateSession__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/models/DateSession */ "./src/models/DateSession.js");
var
ModelBase = /*#__PURE__*/function (_mixin) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(ModelBase, _mixin);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: "timestamps", get: function get() {return [];} }, { 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;}(Object(objection__WEBPACK_IMPORTED_MODULE_6__["mixin"])(objection__WEBPACK_IMPORTED_MODULE_6__["Model"], [_models_DateSession__WEBPACK_IMPORTED_MODULE_10__["default"]]));
/***/ }),
/***/ "./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");
// import PermissionsService from '@/services/PermissionsService';
var
TenantUser = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(TenantUser, _TenantModel);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';} /**
* Timestamps columns.
*/ }, { key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} /**
* 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;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_7__["default"]);
/***/ }),
/***/ "./src/models/Vendor.js":
/*!******************************!*\
!*** ./src/models/Vendor.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 Vendor; });
/* 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
Vendor = /*#__PURE__*/function (_TenantModel) {_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(Vendor, _TenantModel);function Vendor() {_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Vendor);return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(Vendor).apply(this, arguments));}_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Vendor, null, [{ key: "tableName",
/**
* Table name
*/get: function get()
{
return 'vendors';
}
/**
* Model timestamps.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
} }]);return Vendor;}(_models_TenantModel__WEBPACK_IMPORTED_MODULE_6__["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';
}
/**
* Model timestamps.
*/ }, { key: "timestamps", get: function get()
{
return ['createdAt', 'updatedAt'];
}
/**
* 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 entry 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',
'contactId',
'contactType'])));
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;
} }, { key: "getContactTrialBalance", value: function getContactTrialBalance(
accountId,
contactId,
contactType,
closingDate,
openingDate)
{
var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate);
var momentOpeningDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(openingDate);
var trial = {
credit: 0,
debit: 0,
balance: 0 };
this.entries.forEach(function (entry) {
if (
closingDate &&
!momentClosingDate.isAfter(entry.date, 'day') &&
!momentClosingDate.isSame(entry.date, 'day') ||
openingDate &&
!momentOpeningDate.isBefore(entry.date, 'day') &&
!momentOpeningDate.isSame(entry.date) ||
accountId && entry.account !== accountId ||
contactId && entry.contactId !== contactId ||
entry.contactType !== contactType)
{
return;
}
if (entry.credit) {
trial.balance -= entry.credit;
trial.credit += entry.credit;
}
if (entry.debit) {
trial.balance += entry.debit;
trial.debit += entry.debit;
}
});
return trial;
}
/**
* Retrieve total balnace of the given customer/vendor contact.
* @param {Number} accountId
* @param {Number} contactId
* @param {String} contactType
* @param {Date} closingDate
*/ }, { key: "getContactBalance", value: function getContactBalance(
accountId,
contactId,
contactType,
closingDate,
openingDate)
{
var momentClosingDate = moment__WEBPACK_IMPORTED_MODULE_7___default()(closingDate);
var balance = 0;
this.entries.forEach(function (entry) {
if (
closingDate &&
!momentClosingDate.isAfter(entry.date, 'day') &&
!momentClosingDate.isSame(entry.date, 'day') ||
entry.account !== accountId && accountId ||
contactId && entry.contactId !== contactId ||
entry.contactType !== contactType)
{
return;
}
if (entry.credit) {
balance -= entry.credit;
}
if (entry.debit) {
balance += entry.debit;
}
});
return balance;
}
/**
* 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 _services_Subscription_UserSubscription__WEBPACK_IMPORTED_MODULE_8__ = __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';} /**
* Timestamps columns.
*/ }, { key: "timestamps", get: function get() {return ['createdAt', 'updatedAt'];} /**
* 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"], [_services_Subscription_UserSubscription__WEBPACK_IMPORTED_MODULE_8__["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';}
};
function mapKeysDeep(obj, cb, isRecursive) {
if (!obj && !isRecursive) {
return {};
}
if (!isRecursive) {
if (
typeof obj === 'string' ||
typeof obj === 'number' ||
typeof obj === 'boolean')
{
return {};
}
}
if (Array.isArray(obj)) {
return obj.map(function (item) {return mapKeysDeep(item, cb, true);});
}
if (!lodash__WEBPACK_IMPORTED_MODULE_2___default.a.isPlainObject(obj)) {
return obj;
}
var result = lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapKeys(obj, cb);
return lodash__WEBPACK_IMPORTED_MODULE_2___default.a.mapValues(result, function (value) {return mapKeysDeep(value, cb, true);});
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9jb25maWcvY29uZmlnLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL2NvbmZpZy9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9jb25maWcvc3lzdGVtS25leGZpbGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2FwcC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvY29sbGVjdGlvbi9OZXN0ZWRTZXQvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2NvbGxlY3Rpb24vUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YS9SZXNvdXJjZUZpZWxkc0tleXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2RhdGEvb3B0aW9ucy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2Uva25leC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2UvbWFuYWdlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvZGF0YWJhc2Uvb2JqZWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0FjY291bnRUeXBlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9BY2NvdW50aW5nLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0FjY291bnRzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0F1dGhlbnRpY2F0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0Jhc2VDb250cm9sbGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0N1cnJlbmNpZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvQ3VzdG9tZXJzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0V4Y2hhbmdlUmF0ZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRXhwZW5zZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL0FnaW5nUmVwb3J0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvQmFsYW5jZVNoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvRmluYW5jaWFsU3RhdGVtZW50TWl4aW4uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9Kb3VybmFsU2hlZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9QYXlhYmxlQWdpbmdTdW1tYXJ5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvUHJvZml0TG9zc1NoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvUmVjZWl2YWJsZUFnaW5nU3VtbWFyeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL1RyaWFsQmFsYW5jZVNoZWV0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL0ZpbmFuY2lhbFN0YXRlbWVudHMvZ2VuZXJhbExlZGdlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9JbnZpdGVVc2Vycy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9JdGVtQ2F0ZWdvcmllcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9JdGVtcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9NZWRpYS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9PcHRpb25zLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL1Jlc291cmNlcy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9Vc2Vycy5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvaHR0cC9jb250cm9sbGVycy9WZW5kb3JzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2NvbnRyb2xsZXJzL1ZpZXdzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2h0dHAvbWlkZGxld2FyZS9qd3RBdXRoLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRGVwZW5kZW5jeUdyYXBoL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3Rvci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclNvcnRCeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclZpZXdzLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvRHluYW1pY0ZpbHRlci9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0xvZ2ljRXZhbHVhdGlvbi9MZXhlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbGliL0xvZ2ljRXZhbHVhdGlvbi9QYXJzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9Mb2dpY0V2YWx1YXRpb24vUXVlcnlQYXJzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL2xpYi9NZXRhYmxlL01ldGFibGVDb2xsZWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9saWIvVmlld1JvbGVzQnVpbGRlci9pbmRleC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzIHN5bmMgL15cXC5cXC8uKiQvIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0FjY291bnRCYWxhbmNlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudFRyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQWNjb3VudFR5cGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9BdXRoLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQnVkZ2V0LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvQnVkZ2V0RW50cnkuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9DdXJyZW5jeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0N1c3RvbWVyLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvRGF0ZVNlc3Npb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9FeGNoYW5nZVJhdGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9FeHBlbnNlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvRXhwZW5zZUNhdGVnb3J5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvSXRlbS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL0l0ZW1DYXRlZ29yeS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01hbnVhbEpvdXJuYWwuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9NZWRpYS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01lZGlhTGluay5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL01ldGFibGUuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9Nb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL09wdGlvbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1BhZ2luYXRpb24uanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9QZXJtaXNzaW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUmVzb3VyY2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUmVzb3VyY2VGaWVsZE1ldGFkYXRhLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvUm9sZS5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1NldHRpbmcuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9UZW5hbnRNb2RlbC5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1RlbmFudFVzZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9WZW5kb3IuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL21vZGVscy9WaWV3LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9tb2RlbHMvVmlld0NvbHVtbi5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvbW9kZWxzL1ZpZXdSb2xlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbEVudHJ5LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL0NhY2hlL2luZGV4LmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9Mb2dnZXIvaW5kZXguanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3NlcnZpY2VzL1N1YnNjcmlwdGlvbi9Vc2VyU3Vic2NyaXB0aW9uLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zZXJ2aWNlcy9tYWlsLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zeXN0ZW0vVGVuYW50c01hbmFnZXIuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvSW52aXRlLmpzIiwiL1VzZXJzL2FobWVkL0RvY3VtZW50cy9SYXR0ZWIvc2VydmVyL3NyYy9zeXN0ZW0vbW9kZWxzL1Bhc3N3b3JkUmVzZXQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3Vic2NyaXB0aW9uVXNhZ2UuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlci5qcyIsIi9Vc2Vycy9haG1lZC9Eb2N1bWVudHMvUmF0dGViL3NlcnZlci9zcmMvc3lzdGVtL21vZGVscy9UZW5hbnQuanMiLCIvVXNlcnMvYWhtZWQvRG9jdW1lbnRzL1JhdHRlYi9zZXJ2ZXIvc3JjL3V0aWxzL2luZGV4LmpzIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcGx1Z2luLXRyYW5zZm9ybS1ydW50aW1lXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFwiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiIiwiZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIiLCJleHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIiIsImV4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIiIsImV4dGVybmFsIFwiYXBwLXJvb3QtcGF0aFwiIiwiZXh0ZXJuYWwgXCJiY3J5cHRqc1wiIiwiZXh0ZXJuYWwgXCJjcnlwdG9cIiIsImV4dGVybmFsIFwiZG90ZW52XCIiLCJleHRlcm5hbCBcImVycm9yaGFuZGxlclwiIiwiZXh0ZXJuYWwgXCJleHByZXNzXCIiLCJleHRlcm5hbCBcImV4cHJlc3MtYm9vbVwiIiwiZXh0ZXJuYWwgXCJleHByZXNzLWZpbGV1cGxvYWRcIiIsImV4dGVybmFsIFwiZXhwcmVzcy12YWxpZGF0b3JcIiIsImV4dGVybmFsIFwiZnNcIiIsImV4dGVybmFsIFwiaGVsbWV0XCIiLCJleHRlcm5hbCBcImkxOG5cIiIsImV4dGVybmFsIFwianNvbndlYnRva2VuXCIiLCJleHRlcm5hbCBcImtuZXhcIiIsImV4dGVybmFsIFwia25leC1kYi1tYW5hZ2VyXCIiLCJleHRlcm5hbCBcImxvZGFzaFwiIiwiZXh0ZXJuYWwgXCJtb21lbnRcIiIsImV4dGVybmFsIFwibXVzdGFjaGVcIiIsImV4dGVybmFsIFwibm9kZS1jYWNoZVwiIiwiZXh0ZXJuYWwgXCJub2RlbWFpbGVyXCIiLCJleHRlcm5hbCBcIm9iamVjdGlvblwiIiwiZXh0ZXJuYWwgXCJwYXRoXCIiLCJleHRlcm5hbCBcInVuaXFpZFwiIiwiZXh0ZXJuYWwgXCJ3aW5zdG9uXCIiXSwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJkaXN0L1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeXN0ZW06IHtcbiAgICBkYl9jbGllbnQ6ICdteXNxbCcsXG4gICAgZGJfaG9zdDogJzEyNy4wLjAuMScsXG4gICAgZGJfdXNlcjogJ3Jvb3QnLFxuICAgIGRiX3Bhc3N3b3JkOiAncm9vdCcsXG4gICAgZGJfbmFtZTogJ2JpZ2NhcGl0YWxfc3lzdGVtJyxcbiAgICBtaWdyYXRpb25zX2RpcjogJy4vc3JjL3N5c3RlbS9taWdyYXRpb25zJyxcbiAgfSxcbiAgdGVuYW50OiB7XG4gICAgZGJfY2xpZW50OiAnbXlzcWwnLFxuICAgIGRiX25hbWVfcHJlZml4OiAnYmlnY2FwaXRhbF90ZW5hbnRfJyxcbiAgICBkYl9ob3N0OiAnMTI3LjAuMC4xJyxcbiAgICBkYl91c2VyOiAncm9vdCcsXG4gICAgZGJfcGFzc3dvcmQ6ICdyb290JyxcbiAgICBjaGFyc2V0OiAndXRmOCcsXG4gICAgbWlncmF0aW9uc19kaXI6ICdzcmMvZGF0YWJhc2UvbWlncmF0aW9ucycsXG4gICAgc2VlZHNfZGlyOiAnc3JjL2RhdGFiYXNlL3NlZWRzJyxcbiAgfSxcbiAgbWFuYWdlcjoge1xuICAgIHN1cGVyVXNlcjogJ3Jvb3QnLFxuICAgIHN1cGVyUGFzc3dvcmQ6ICdyb290JyxcbiAgfSxcbiAgbWFpbDoge1xuICAgIGhvc3Q6ICdzbXRwLm1haWx0cmFwLmlvJyxcbiAgICBwb3J0OiA1ODcsXG4gICAgc2VjdXJlOiBmYWxzZSxcbiAgICB1c2VybmFtZTogJzg0MmYzMzFkM2RjMDA1JyxcbiAgICBwYXNzd29yZDogJzE3MmY5N2IzNGYxYTE3JyxcbiAgfVxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuXG5kb3RlbnYuY29uZmlnKHtcbiAgcGF0aDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LnRlc3QnKSxcbn0pO1xuIiwiY29uc3QgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxuY29uc3QgY29uZmlnRW52ID0ge1xuICBjbGllbnQ6IGNvbmZpZy5zeXN0ZW0uZGJfY2xpZW50LFxuICBjb25uZWN0aW9uOiB7XG4gICAgaG9zdDogY29uZmlnLnN5c3RlbS5kYl9ob3N0LFxuICAgIHVzZXI6IGNvbmZpZy5zeXN0ZW0uZGJfdXNlcixcbiAgICBwYXNzd29yZDogY29uZmlnLnN5c3RlbS5kYl9wYXNzd29yZCxcbiAgICBkYXRhYmFzZTogY29uZmlnLnN5c3RlbS5kYl9uYW1lLFxuICAgIGNoYXJzZXQ6ICd1dGY4JyxcbiAgfSxcbiAgbWlncmF0aW9uczoge1xuICAgIGRpcmVjdG9yeTogY29uZmlnLnN5c3RlbS5taWdyYXRpb25zX2RpcixcbiAgfSxcbiAgcG9vbDogeyBtaW46IDAsIG1heDogNyB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRldmVsb3BtZW50OiBjb25maWdFbnYsXG4gIHByb2R1Y3Rpb246IGNvbmZpZ0Vudixcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBib29tIGZyb20gJ2V4cHJlc3MtYm9vbSc7XG5pbXBvcnQgaTE4biBmcm9tICdpMThuJztcbmltcG9ydCByb290UGF0aCBmcm9tICdhcHAtcm9vdC1wYXRoJztcbmltcG9ydCBmaWxlVXBsb2FkIGZyb20gJ2V4cHJlc3MtZmlsZXVwbG9hZCc7XG5pbXBvcnQgJy4uL2NvbmZpZyc7XG5pbXBvcnQgJ0AvZGF0YWJhc2Uvb2JqZWN0aW9uJztcbmltcG9ydCByb3V0ZXMgZnJvbSAnQC9odHRwJztcblxuZ2xvYmFsLnJvb3RQYXRoID0gcm9vdFBhdGgucGF0aDtcblxuY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4vLyBpMThuLmNvbmZpZ3VyZSh7XG4vLyAgIGxvY2FsZXM6IFsnZW4nXSxcbi8vICAgZGlyZWN0b3J5OiBgJHtfX2Rpcm5hbWV9L3Jlc291cmNlcy9sb2NhbGVgLFxuLy8gfSk7XG5cbi8vIC8vIGkxOG4gaW5pdCBwYXJzZXMgcmVxIGZvciBsYW5ndWFnZSBoZWFkZXJzLCBjb29raWVzLCBldGMuXG4vLyBhcHAudXNlKGkxOG4uaW5pdCk7XG5cbi8vIEV4cHJlc3MgY29uZmlndXJhdGlvblxuYXBwLnNldCgncG9ydCcsIHByb2Nlc3MuZW52LlBPUlQgfHwgMzAwMCk7XG5cbmFwcC51c2UoaGVsbWV0KCkpO1xuYXBwLnVzZShib29tKCkpO1xuYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5hcHAudXNlKGZpbGVVcGxvYWQoe1xuICBjcmVhdGVQYXJlbnRQYXRoOiB0cnVlLFxufSkpO1xuXG5yb3V0ZXMoYXBwKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwO1xuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXN0ZWRTZXQge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpdGVtcywgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHBhcmVudElkOiAncGFyZW50X2lkJyxcbiAgICAgIGlkOiAnaWQnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuaXRlbXMgPSBpdGVtcyB8fCBbXTtcbiAgICB0aGlzLnRyZWUgPSB0aGlzLmxpbmtDaGlsZHJlbigpO1xuICB9XG5cbiAgc2V0SXRlbXMoaXRlbXMpIHtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy50cmVlID0gdGhpcy5saW5rQ2hpbGRyZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIG5vZGVzIGNoaWxkcmVuLlxuICAgKi9cbiAgbGlua0NoaWxkcmVuKCkge1xuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBtYXAgPSB7fTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIG1hcFtpdGVtLmlkXSA9IGl0ZW07XG4gICAgICBtYXBbaXRlbS5pZF0uY2hpbGRyZW4gPSB7fTtcbiAgICB9KTtcblxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZUlkID0gaXRlbVt0aGlzLm9wdGlvbnMucGFyZW50SWRdO1xuICAgICAgaWYgKHBhcmVudE5vZGVJZCkge1xuICAgICAgICBtYXBbcGFyZW50Tm9kZUlkXS5jaGlsZHJlbltpdGVtLmlkXSA9IGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLml0ZW1zLm1hcCgoaSkgPT4gKHsgLi4uaSB9KSk7XG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGVzKSA9PiB7XG4gICAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghbm9kZVt0aGlzLm9wdGlvbnMucGFyZW50SWRdKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuTm9kZXMgPSBPYmplY3QudmFsdWVzKG5vZGUuY2hpbGRyZW4pXG4gICAgICAgICAgICAubWFwKChpKSA9PiAoeyAuLi5pIH0pKTtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbk5vZGVzO1xuICAgICAgICAgIHdhbGsoY2hpbGRyZW5Ob2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2Fsayh0cmVlTm9kZXMpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxuXG4gIGdldFRyZWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZTtcbiAgfVxuXG4gIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlZVtpZF0gfHwgbnVsbFxuICB9XG5cbiAgZ2V0UGFyZW50cyhpZCkge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIGNvbnN0IHdhbGsgPSAoX2l0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuXG4gICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgcGFyZW50cy5wdXNoKF9pdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXRlbVt0aGlzLm9wdGlvbnMucGFyZW50SWRdKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmdldEVsZW1lbnRCeUlkKF9pdGVtW3RoaXMub3B0aW9ucy5wYXJlbnRJZF0pOyAgXG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgd2FsayhwYXJlbnRJdGVtKTtcbiAgICAgIH0gICAgICBcbiAgICB9O1xuICAgIHdhbGsoaXRlbSk7XG4gICAgcmV0dXJuIHBhcmVudHM7XG4gIH1cblxuICB0b0ZsYXR0ZW5BcnJheShub2RlTWFwcGVyKSB7XG4gICAgY29uc3QgZmxhdHRlblRyZWUgPSBbXTtcblxuICAgIGNvbnN0IHRyYXZlcnNhbCA9IChub2RlcywgcGFyZW50Tm9kZSkgPT4ge1xuICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBsZXQgbm9kZU1hcHBlZCA9IG5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBub2RlTWFwcGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbm9kZU1hcHBlZCA9IG5vZGVNYXBwZXIobm9kZU1hcHBlZCwgcGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdHRlblRyZWUucHVzaChub2RlTWFwcGVkKTtcblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0cmF2ZXJzYWwobm9kZS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgdHJhdmVyc2FsKHRoaXMuY29sbGVjdGlvbik7XG5cbiAgICByZXR1cm4gZmxhdHRlblRyZWU7XG4gIH1cbn1cbiIsImltcG9ydCBNZXRhYmxlQ29sbGVjdGlvbiBmcm9tICdAL2xpYi9NZXRhYmxlL01ldGFibGVDb2xsZWN0aW9uJztcbmltcG9ydCBSZXNvdXJjZUZpZWxkTWV0YWRhdGEgZnJvbSAnQC9tb2RlbHMvUmVzb3VyY2VGaWVsZE1ldGFkYXRhJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbiBleHRlbmRzIE1ldGFibGVDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNldE1vZGVsKFJlc291cmNlRmllbGRNZXRhZGF0YSk7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBbJ3Jlc291cmNlX2lkJywgJ3Jlc291cmNlX2l0ZW1faWQnXTtcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cblxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBFeHBlbnNlcy5cbiAgJ2V4cGVuc2VzJzoge1xuICAgICdleHBlbnNlX2FjY291bnQnOiB7XG4gICAgICBjb2x1bW46ICcgJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudHMubmFtZScsXG4gICAgfSxcbiAgICAncGF5bWVudF9hY2NvdW50Jzoge1xuICAgICAgY29sdW1uOiAncGF5bWVudF9hY2NvdW50X2lkJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudHMuaWQnLFxuICAgIH0sXG4gICAgJ2FjY291bnRfdHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ2FjY291bnRfdHlwZV9pZCcsXG4gICAgICByZWxhdGlvbjogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gQWNjb3VudHNcbiAgJ2FjY291bnRzJzoge1xuICAgICduYW1lJzoge1xuICAgICAgY29sdW1uOiAnbmFtZScsXG4gICAgfSxcbiAgICAndHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ2FjY291bnRfdHlwZV9pZCcsXG4gICAgICByZWxhdGlvbjogJ2FjY291bnRfdHlwZXMuaWQnLFxuICAgICAgcmVsYXRpb25Db2x1bW46ICdhY2NvdW50X3R5cGVzLmlkJyxcbiAgICB9LFxuICAgICdkZXNjcmlwdGlvbic6IHtcbiAgICAgIGNvbHVtbjogJ2Rlc2NyaXB0aW9uJyxcbiAgICB9LFxuICAgICdjb2RlJzoge1xuICAgICAgY29sdW1uOiAnY29kZScsXG4gICAgfSxcbiAgICAncm9vdF90eXBlJzoge1xuICAgICAgY29sdW1uOiAnYWNjb3VudF90eXBlX2lkJyxcbiAgICAgIHJlbGF0aW9uOiAnYWNjb3VudF90eXBlcy5pZCcsXG4gICAgICByZWxhdGlvbkNvbHVtbjogJ2FjY291bnRfdHlwZXMucm9vdF90eXBlJyxcbiAgICB9LFxuICAgICdjcmVhdGVkX2F0Jzoge1xuICAgICAgY29sdW1uOiAnY3JlYXRlZF9hdCcsXG4gICAgfSxcbiAgfSxcblxuICAvLyBJdGVtc1xuICAnaXRlbXMnOiB7XG4gICAgJ3R5cGUnOiB7XG4gICAgICBjb2x1bW46ICd0eXBlJyxcbiAgICB9LFxuICAgICduYW1lJzoge1xuICAgICAgY29sdW1uOiAnbmFtZScsXG4gICAgfSxcbiAgfSxcblxuICAvLyBNYW51YWwgSm91cm5hbHNcbiAgJ21hbnVhbF9qb3VybmFscyc6IHtcbiAgICAndHlwZSc6IHtcbiAgICAgIGNvbHVtbjogJ3RyYW5zYWN0aW9uX3R5cGUnLFxuICAgIH0sXG4gICAgJ3N0YXR1cyc6IHtcbiAgICAgIGNvbHVtbjogJ3N0YXR1cycsXG4gICAgfSxcbiAgICAnZGF0ZSc6IHtcbiAgICAgIGNvbHVtbjogJ2RhdGUnLFxuICAgIH0sXG4gICAgJ2pvdXJuYWxfbnVtYmVyJzoge1xuICAgICAgY29sdW1uOiAnam91cm5hbF9udW1iZXInLFxuICAgIH0sXG4gICAgJ2Ftb3VudCc6IHtcbiAgICAgIGNvbHVtbjogJ2Ftb3VudCcsXG4gICAgfSxcbiAgICAnY3JlYXRlZF9hdCc6IHtcbiAgICAgIGNvbHVtbjogJ2NyZWF0ZWRfYXQnLFxuICAgIH0sXG4gIH1cbn07XG4iLCJcblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcmdhbml6YXRpb246IFtcbiAgICB7XG4gICAgICBrZXk6ICduYW1lJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnYmFzZV9jdXJyZW5jeScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2luZHVzdHJ5JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnbG9jYXRpb24nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdmaXNjYWxfeWVhcicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2xhbmd1YWdlJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gICAgeyBcbiAgICAgIGtleTogJ3RpbWVfem9uZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2RhdGVfZm9ybWF0JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0sXG4gIF0sXG59OyIsImltcG9ydCBLbmV4IGZyb20gJ2tuZXgnO1xuaW1wb3J0IHsga25leFNuYWtlQ2FzZU1hcHBlcnMgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IGtuZXhmaWxlIGZyb20gJ0AvLi4vY29uZmlnL3N5c3RlbUtuZXhmaWxlJztcblxuY29uc3QgY29uZmlnID0ga25leGZpbGVbcHJvY2Vzcy5lbnYuTk9ERV9FTlZdO1xuXG5jb25zdCBrbmV4ID0gS25leCh7XG4gIC4uLmNvbmZpZyxcbiAgLi4ua25leFNuYWtlQ2FzZU1hcHBlcnMoeyB1cHBlckNhc2U6IHRydWUgfSksXG59KTtcblxuZXhwb3J0IGRlZmF1bHQga25leDtcbiIsImltcG9ydCBrbmV4TWFuYWdlciBmcm9tICdrbmV4LWRiLW1hbmFnZXInO1xuaW1wb3J0IGtuZXhmaWxlIGZyb20gJ0AvLi4vY29uZmlnL3N5c3RlbUtuZXhmaWxlJztcbmltcG9ydCBjb25maWcgZnJvbSAnQC8uLi9jb25maWcvY29uZmlnJztcblxuY29uc3Qga25leENvbmZpZyA9IGtuZXhmaWxlW3Byb2Nlc3MuZW52Lk5PREVfRU5WXTtcblxuY29uc3QgZGJNYW5hZ2VyID0ga25leE1hbmFnZXIuZGF0YWJhc2VNYW5hZ2VyRmFjdG9yeSh7XG4gIGtuZXg6IGtuZXhDb25maWcsXG4gIGRiTWFuYWdlcjoge1xuICAgIGNvbGxhdGU6IFtdLFxuICAgIHN1cGVyVXNlcjogY29uZmlnLm1hbmFnZXIuc3VwZXJVc2VyLFxuICAgIHN1cGVyUGFzc3dvcmQ6IGNvbmZpZy5tYW5hZ2VyLnN1cGVyUGFzc3dvcmQsXG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGJNYW5hZ2VyOyIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBrbmV4IGZyb20gJ0AvZGF0YWJhc2Uva25leCc7XG5cbi8vIEJpbmQgYWxsIE1vZGVscyB0byBhIGtuZXggaW5zdGFuY2UuIElmIHlvdSBvbmx5IGhhdmUgb25lIGRhdGFiYXNlIGluXG4vLyB5b3VyIHNlcnZlciB0aGlzIGlzIGFsbCB5b3UgaGF2ZSB0byBkby4gRm9yIG11bHRpIGRhdGFiYXNlIHN5c3RlbXMsIHNlZVxuLy8gdGhlIE1vZGVsLmJpbmRLbmV4KCkgbWV0aG9kLlxuTW9kZWwua25leChrbmV4KTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5nZXRBY2NvdW50VHlwZXNMaXN0LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRBY2NvdW50VHlwZXNMaXN0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFjY291bnRzIHR5cGVzIGxpc3QuXG4gICAqL1xuICBnZXRBY2NvdW50VHlwZXNMaXN0OiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnRUeXBlcyA9IGF3YWl0IEFjY291bnRUeXBlLnF1ZXJ5KCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIGFjY291bnRfdHlwZXM6IGFjY291bnRUeXBlcyxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgY2hlY2ssIHF1ZXJ5LCB2YWxpZGF0aW9uUmVzdWx0LCBwYXJhbSB9IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgSm91cm5hbEVudHJ5IGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsRW50cnknO1xuaW1wb3J0IHtcbiAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHMsXG4gIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcbmltcG9ydCB7XG4gIER5bmFtaWNGaWx0ZXIsXG4gIER5bmFtaWNGaWx0ZXJTb3J0QnksXG4gIER5bmFtaWNGaWx0ZXJWaWV3cyxcbiAgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzLFxufSBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy9tYW51YWwtam91cm5hbHMvOmlkJyxcbiAgICAgIHRoaXMuZ2V0TWFudWFsSm91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0TWFudWFsSm91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvbWFudWFsLWpvdXJuYWxzJyxcbiAgICAgIHRoaXMubWFudWFsSm91cm5hbHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm1hbnVhbEpvdXJuYWxzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvbWFrZS1qb3VybmFsLWVudHJpZXMnLFxuICAgICAgdGhpcy52YWxpZGF0ZU1lZGlhSWRzLFxuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhY3RFbnRyaWVzLFxuICAgICAgdGhpcy5tYWtlSm91cm5hbEVudHJpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm1ha2VKb3VybmFsRW50cmllcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL21hbnVhbC1qb3VybmFscy86aWQvcHVibGlzaCcsXG4gICAgICB0aGlzLnB1Ymxpc2hNYW51YWxKb3VybmFsLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5wdWJsaXNoTWFudWFsSm91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL21hbnVhbC1qb3VybmFscy86aWQnLFxuICAgICAgdGhpcy52YWxpZGF0ZU1lZGlhSWRzLFxuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhY3RFbnRyaWVzLFxuICAgICAgdGhpcy5lZGl0TWFudWFsSm91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdE1hbnVhbEpvdXJuYWwuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnL21hbnVhbC1qb3VybmFscy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVNYW51YWxKb3VybmFsLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVNYW51YWxKb3VybmFsLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9tYW51YWwtam91cm5hbHMnLFxuICAgICAgdGhpcy5kZWxldGVCdWxrTWFudWFsSm91cm5hbHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUJ1bGtNYW51YWxKb3VybmFscy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3JlY3VycmluZy1qb3VybmFsLWVudHJpZXMnLFxuICAgICAgdGhpcy5yZWN1cnJpbmdKb3VybmFsRW50cmllcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVjdXJyaW5nSm91cm5hbEVudHJpZXMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJ3F1aWNrLWpvdXJuYWwtZW50cmllcycsXG4gICAgICB0aGlzLnF1aWNrSm91cm5hbEVudHJpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnF1aWNrSm91cm5hbEVudHJpZXMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgbWFudWFsIGpvdXJuYWxzLFxuICAgKi9cbiAgbWFudWFsSm91cm5hbHM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHBhZ2Vfc2l6ZTogOTk5LFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlcl9yb2xlcyA9IEpTT04ucGFyc2UoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcyk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IFJlc291cmNlLCBWaWV3LCBNYW51YWxKb3VybmFsIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IG1hbnVhbEpvdXJuYWxzUmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsICdtYW51YWxfam91cm5hbHMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghbWFudWFsSm91cm5hbHNSZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTF9KT1VSTkFMUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5jdXN0b21fdmlld19pZCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2lkJywgZmlsdGVyLmN1c3RvbV92aWV3X2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdmYXZvdXJpdGUnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIG1hbnVhbEpvdXJuYWxzUmVzb3VyY2UuaWQpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY29sdW1ucycpO1xuICAgICAgICBidWlsZGVyLmZpcnN0KCk7XG4gICAgICAgIGJ1aWxkZXIucmVtZW1iZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSBtYW51YWxKb3VybmFsc1Jlc291cmNlLmZpZWxkcy5tYXAoKGMpID0+IGMua2V5KTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlcihNYW51YWxKb3VybmFsLnRhYmxlTmFtZSk7XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggdmlldyByb2xlcy5cbiAgICAgIGlmICh2aWV3ICYmIHZpZXcucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2aWV3RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJWaWV3cyhcbiAgICAgICAgICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3LnJvbGVzKSxcbiAgICAgICAgICB2aWV3LnJvbGVzTG9naWNFeHByZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdGaWx0ZXIudmFsaWRhdGVGaWx0ZXJSb2xlcygpKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZHluYW1pY0ZpbHRlci5zZXRGaWx0ZXIodmlld0ZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggZmlsdGVyIHJvbGVzLlxuICAgICAgaWYgKGZpbHRlci5maWx0ZXJfcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYWNjb3VudHMgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBmaWx0ZXJSb2xlcyA9IG5ldyBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMoXG4gICAgICAgICAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIoZmlsdGVyLmZpbHRlcl9yb2xlcyksXG4gICAgICAgICAgbWFudWFsSm91cm5hbHNSZXNvdXJjZS5maWVsZHMsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgLy8gTWFudWFsIGpvdXJuYWxzLlxuICAgICAgY29uc3QgbWFudWFsSm91cm5hbHMgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgIH0pLnBhZ2luYXRpb24oZmlsdGVyLnBhZ2UgLSAxLCBmaWx0ZXIucGFnZV9zaXplKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgbWFudWFsSm91cm5hbHMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBtZWRpYSBpZHMuXG4gICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxIC1cbiAgICogQHBhcmFtIHtSZXNwb25zZX0gcmVzIC1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCAtXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZU1lZGlhSWRzKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgZm9ybSA9IHsgbWVkaWFfaWRzOiBbXSwgLi4ucmVxLmJvZHkgfTtcbiAgICBjb25zdCB7IE1lZGlhIH0gPSByZXEubW9kZWxzO1xuICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgaWYgbWVkaWEgaWRzIHdhcyBub3QgYWxyZWFkeSBleGlzdHMgb24gdGhlIHN0b3JhZ2UuXG4gICAgaWYgKGZvcm0ubWVkaWFfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZE1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIGZvcm0ubWVkaWFfaWRzKTtcbiAgICAgIGNvbnN0IG5vdEZvdW5kTWVkaWEgPSBkaWZmZXJlbmNlKGZvcm0ubWVkaWFfaWRzLCBzdG9yZWRNZWRpYS5tYXAoKG0pID0+IG0uaWQpKTtcbiAgICAgIFxuICAgICAgaWYgKG5vdEZvdW5kTWVkaWEubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdNRURJQS5JRFMuTk9ULkZPVU5EJywgY29kZTogNDAwLCBpZHM6IG5vdEZvdW5kTWVkaWEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcS5lcnJvclJlYXNvbnMgPSBBcnJheS5pc0FycmF5KHJlcS5lcnJvclJlYXNvbnMpICYmIHJlcS5lcnJvclJlYXNvbnMubGVuZ3RoXG4gICAgICA/IHJlcS5lcnJvclJlYXNvbnMucHVzaCguLi5lcnJvclJlYXNvbnMpIDogZXJyb3JSZWFzb25zO1xuICAgIG5leHQoKTsgXG4gIH0sXG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZvcm0gZW50cmllcyB3aXRoIGNvbnRhY3QgY3VzdG9tZXJzIGFuZCB2ZW5kb3JzLiBcbiAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXEgXG4gICAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlcyBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlQ29udGFjdEVudHJpZXMocmVxLCByZXMsIG5leHQpIHtcbiAgICBjb25zdCBmb3JtID0geyBlbnRyaWVzOiBbXSwgLi4ucmVxLmJvZHkgfTtcbiAgICBjb25zdCB7IEFjY291bnRUeXBlLCBWZW5kb3IsIEN1c3RvbWVyIH0gPSByZXEubW9kZWxzO1xuICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGVudHJpZXMgY29udGFjdCB0eXBlIGFuZCBpZHMuXG4gICAgY29uc3QgY3VzdG9tZXJzQ29udGFjdHMgPSBmb3JtLmVudHJpZXMuZmlsdGVyKGUgPT4gZS5jb250YWN0X3R5cGUgPT09ICdjdXN0b21lcicpO1xuICAgIGNvbnN0IHZlbmRvcnNDb250YWN0cyA9IGZvcm0uZW50cmllcy5maWx0ZXIoZSA9PiBlLmNvbnRhY3RfdHlwZSA9PT0gJ3ZlbmRvcicpO1xuXG4gICAgY29uc3QgYWNjb3VudHNUeXBlcyA9IGF3YWl0IEFjY291bnRUeXBlLnF1ZXJ5KCk7XG4gIFxuICAgIGNvbnN0IHBheWFibGVBY2NvdW50c1R5cGUgPSBhY2NvdW50c1R5cGVzLmZpbmQodCA9PiB0LmtleSA9PT0gJ2FjY291bnRzX3BheWFibGUnKTs7XG4gICAgY29uc3QgcmVjZWl2YWJsZUFjY291bnRzVHlwZSA9IGFjY291bnRzVHlwZXMuZmluZCh0ID0+IHQua2V5ID09PSAnYWNjb3VudHNfcmVjZWl2YWJsZScpO1xuXG4gICAgLy8gVmFsaWRhdGUgY3VzdG9tZXJzIGNvbnRhY3RzLlxuICAgIGlmIChjdXN0b21lcnNDb250YWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXN0b21lcnNDb250YWN0c0lkcyA9IGN1c3RvbWVyc0NvbnRhY3RzLm1hcChjID0+IGMuY29udGFjdF9pZCk7XG4gICAgICBjb25zdCBzdG9yZWRDb250YWN0cyA9IGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkud2hlcmVJbignaWQnLCBjdXN0b21lcnNDb250YWN0c0lkcyk7XG5cbiAgICAgIGNvbnN0IHN0b3JlZENvbnRhY3RzSWRzID0gc3RvcmVkQ29udGFjdHMubWFwKGMgPT4gYy5pZCk7XG4gICAgICBjb25zdCBmb3JtRW50cmllc0N1c3RvbWVyc0lkcyA9IGZvcm0uZW50cmllcy5maWx0ZXIoZSA9PiBlLmNvbnRhY3RfdHlwZSA9PT0gJ2N1c3RvbWVyJyk7XG5cbiAgICAgIGNvbnN0IG5vdEZvdW5kQ29udGFjdHNJZHMgPSBkaWZmZXJlbmNlKFxuICAgICAgICBmb3JtRW50cmllc0N1c3RvbWVyc0lkcy5tYXAoYyA9PiBjLmNvbnRhY3RfaWQpLFxuICAgICAgICBzdG9yZWRDb250YWN0c0lkcyxcbiAgICAgICk7XG4gICAgICBpZiAobm90Rm91bmRDb250YWN0c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NVU1RPTUVSUy5DT05UQUNUUy5OT1QuRk9VTkQnLCBjb2RlOiA1MDAsIGlkczogbm90Rm91bmRDb250YWN0c0lkcyB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm90UmVjZWl2YWJsZUFjY291bnRzID0gZm9ybUVudHJpZXNDdXN0b21lcnNJZHMuZmlsdGVyKFxuICAgICAgICBjID0+IHJlY2VpdmFibGVBY2NvdW50c1R5cGUgJiYgYy5jb250YWN0X2lkICE9PSByZWNlaXZhYmxlQWNjb3VudHNUeXBlLmlkKTtcbiAgICAgIFxuICAgICAgaWYgKG5vdFJlY2VpdmFibGVBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQ1VTVE9NRVJTLkFDQ09VTlRTLk5PVC5SRUNFSVZBQkxFLlRZUEUnLFxuICAgICAgICAgIGNvZGU6IDcwMCxcbiAgICAgICAgICBpbmRleGVzOiBub3RSZWNlaXZhYmxlQWNjb3VudHMubWFwKGEgPT4gYS5pbmRleCksXG4gICAgICAgIH0pO1xuICAgICAgfSBcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB2ZW5kb3JzIGNvbnRhY3RzLlxuICAgIGlmICh2ZW5kb3JzQ29udGFjdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdmVuZG9yc0NvbnRhY3RzSWRzID0gdmVuZG9yc0NvbnRhY3RzLm1hcChjID0+IGMuY29udGFjdF9pZCk7XG4gICAgICBjb25zdCBzdG9yZWRDb250YWN0cyA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIHZlbmRvcnNDb250YWN0c0lkcyk7XG5cbiAgICAgIGNvbnN0IHN0b3JlZENvbnRhY3RzSWRzID0gc3RvcmVkQ29udGFjdHMubWFwKGMgPT4gYy5pZCk7XG4gICAgICBjb25zdCBmb3JtRW50cmllc1ZlbmRvcnNJZHMgPSBmb3JtLmVudHJpZXMuZmlsdGVyKGUgPT4gZS5jb250YWN0X3R5cGUgPT09ICd2ZW5kb3InKTtcblxuICAgICAgY29uc3Qgbm90Rm91bmRDb250YWN0c0lkcyA9IGRpZmZlcmVuY2UoXG4gICAgICAgIGZvcm1FbnRyaWVzVmVuZG9yc0lkcy5tYXAodiA9PiB2LmNvbnRhY3RfaWQpLFxuICAgICAgICBzdG9yZWRDb250YWN0c0lkcyxcbiAgICAgICk7XG4gICAgICBpZiAobm90Rm91bmRDb250YWN0c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnVkVORE9SUy5DT05UQUNUUy5OT1QuRk9VTkQnLCBjb2RlOiA2MDAsIGlkczogbm90Rm91bmRDb250YWN0c0lkcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3RQYXlhYmxlQWNjb3VudHMgPSBmb3JtRW50cmllc1ZlbmRvcnNJZHMuZmlsdGVyKFxuICAgICAgICB2ID0+IHBheWFibGVBY2NvdW50c1R5cGUgJiYgdi5jb250YWN0X2lkID09PSBwYXlhYmxlQWNjb3VudHNUeXBlLmlkXG4gICAgICApO1xuICAgICAgaWYgKG5vdFBheWFibGVBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnVkVORE9SUy5BQ0NPVU5UUy5OT1QuUEFZQUJMRS5UWVBFJyxcbiAgICAgICAgICBjb2RlOiA4MDAsXG4gICAgICAgICAgaW5kZXhlczogbm90UGF5YWJsZUFjY291bnRzLm1hcChhID0+IGEuaW5kZXgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmVxLmVycm9yUmVhc29ucyA9IEFycmF5LmlzQXJyYXkocmVxLmVycm9yUmVhc29ucykgJiYgcmVxLmVycm9yUmVhc29ucy5sZW5ndGhcbiAgICAgID8gcmVxLmVycm9yUmVhc29ucy5wdXNoKC4uLmVycm9yUmVhc29ucykgOiBlcnJvclJlYXNvbnM7XG5cbiAgICBuZXh0KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1ha2Ugam91cm5hbCBlbnRyaXJlcy5cbiAgICovXG4gIG1ha2VKb3VybmFsRW50cmllczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdkYXRlJykuZXhpc3RzKCkuaXNJU084NjAxKCksXG4gICAgICBjaGVjaygnam91cm5hbF9udW1iZXInKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygndHJhbnNhY3Rpb25fdHlwZScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3JlZmVyZW5jZScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSksXG4gICAgICBjaGVjaygnZGVzY3JpcHRpb24nKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdzdGF0dXMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgY2hlY2soJ2VudHJpZXMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmNyZWRpdCcpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouZGViaXQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmFjY291bnRfaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5ub3RlJykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF9pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF90eXBlJykub3B0aW9uYWwoKS5pc0luKFsndmVuZG9yJywgJ2N1c3RvbWVyJ10pLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcy4qJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnam91cm5hbCcsXG4gICAgICAgIHJlZmVyZW5jZTogJycsXG4gICAgICAgIG1lZGlhX2lkczogW10sXG4gICAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTWFudWFsSm91cm5hbCxcbiAgICAgICAgQWNjb3VudCxcbiAgICAgICAgTWVkaWFMaW5rLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGxldCB0b3RhbENyZWRpdCA9IDA7XG4gICAgICBsZXQgdG90YWxEZWJpdCA9IDA7XG5cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gWy4uLihyZXEuZXJyb3JSZWFzb25zIHx8IFtdKV07XG4gICAgICBjb25zdCBlbnRyaWVzID0gZm9ybS5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IChlbnRyeS5jcmVkaXQgfHwgZW50cnkuZGViaXQpKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBtb21lbnQoZm9ybS5kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBpZiAoZW50cnkuY3JlZGl0ID4gMCkge1xuICAgICAgICAgIHRvdGFsQ3JlZGl0ICs9IGVudHJ5LmNyZWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGViaXQgPiAwKSB7XG4gICAgICAgICAgdG90YWxEZWJpdCArPSBlbnRyeS5kZWJpdDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAodG90YWxDcmVkaXQgPD0gMCB8fCB0b3RhbERlYml0IDw9IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdDUkVESVQuREVCSVQuU1VNQVRJT04uU0hPVUxELk5PVC5FUVVBTC5aRVJPJyxcbiAgICAgICAgICBjb2RlOiA0MDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsQ3JlZGl0ICE9PSB0b3RhbERlYml0KSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NSRURJVC5ERUJJVC5OT1QuRVFVQUxTJywgY29kZTogMTAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybUVudHJpZXNBY2NvdW50c0lkcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBmb3JtRW50cmllc0NvbnRhY3RzSWRzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jb250YWN0X2lkKTtcblxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgZm9ybUVudHJpZXNBY2NvdW50c0lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAucmVtZW1iZXIoKTtcblxuICAgICAgY29uc3Qgc3RvcmVkQWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuaWQpO1xuXG5cbiAgICAgIGlmIChkaWZmZXJlbmNlKGZvcm1FbnRyaWVzQWNjb3VudHNJZHMsIHN0b3JlZEFjY291bnRzSWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0FDQ09VTlRTLklEUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpvdXJuYWxOdW1iZXIgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdqb3VybmFsX251bWJlcicsIGZvcm0uam91cm5hbF9udW1iZXIpO1xuXG4gICAgICBpZiAoam91cm5hbE51bWJlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0pPVVJOQUwuTlVNQkVSLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBTYXZlIG1hbnVhbCBqb3VybmFsIHRhbnNhY3Rpb24uXG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIHJlZmVyZW5jZTogZm9ybS5yZWZlcmVuY2UsXG4gICAgICAgIHRyYW5zYWN0aW9uX3R5cGU6ICdKb3VybmFsJyxcbiAgICAgICAgam91cm5hbF9udW1iZXI6IGZvcm0uam91cm5hbF9udW1iZXIsXG4gICAgICAgIGFtb3VudDogdG90YWxDcmVkaXQsXG4gICAgICAgIGRhdGU6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtLmRlc2NyaXB0aW9uLFxuICAgICAgICBzdGF0dXM6IGZvcm0uc3RhdHVzLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50ID0gYWNjb3VudHMuZmluZCgoYSkgPT4gYS5pZCA9PT0gZW50cnkuYWNjb3VudF9pZCk7XG4gICAgICAgIGNvbnN0IGpvdXJhbmxFbnRyeSA9IG5ldyBKb3VybmFsRW50cnkoe1xuICAgICAgICAgIGRlYml0OiBlbnRyeS5kZWJpdCxcbiAgICAgICAgICBjcmVkaXQ6IGVudHJ5LmNyZWRpdCxcbiAgICAgICAgICBhY2NvdW50OiBhY2NvdW50LmlkLFxuICAgICAgICAgIHJlZmVyZW5jZVR5cGU6ICdKb3VybmFsJyxcbiAgICAgICAgICByZWZlcmVuY2VJZDogbWFudWFsSm91cm5hbC5pZCxcbiAgICAgICAgICBhY2NvdW50Tm9ybWFsOiBhY2NvdW50LnR5cGUubm9ybWFsLFxuICAgICAgICAgIGNvbnRhY3RUeXBlOiBlbnRyeS5jb250YWN0X3R5cGUsXG4gICAgICAgICAgY29udGFjdElkOiBlbnRyeS5jb250YWN0X2lkLFxuICAgICAgICAgIG5vdGU6IGVudHJ5Lm5vdGUsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgICAgICAgZHJhZnQ6ICFmb3JtLnN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlbnRyeS5kZWJpdCkge1xuICAgICAgICAgIGpvdXJuYWxQb3N0ZXIuZGViaXQoam91cmFubEVudHJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb3VybmFsUG9zdGVyLmNyZWRpdChqb3VyYW5sRW50cnkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZSBsaW5rZWQgbWVkaWEgdG8gdGhlIGpvdXJuYWwgbW9kZWwuXG4gICAgICBjb25zdCBidWxrU2F2ZU1lZGlhTGluayA9IFtdO1xuXG4gICAgICBmb3JtLm1lZGlhX2lkcy5mb3JFYWNoKChtZWRpYUlkKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXIgPSBNZWRpYUxpbmsucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIG1vZGVsX25hbWU6ICdKb3VybmFsJyxcbiAgICAgICAgICBtb2RlbF9pZDogbWFudWFsSm91cm5hbC5pZCxcbiAgICAgICAgICBtZWRpYV9pZDogbWVkaWFJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGJ1bGtTYXZlTWVkaWFMaW5rLnB1c2gob3Blcik7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZXMgdGhlIGpvdXJuYWwgZW50cmllcyBhbmQgYWNjb3VudHMgYmFsYW5jZSBjaGFuZ2VzLlxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5idWxrU2F2ZU1lZGlhTGluayxcbiAgICAgICAgam91cm5hbFBvc3Rlci5zYXZlRW50cmllcygpLFxuICAgICAgICAoZm9ybS5zdGF0dXMpICYmIGpvdXJuYWxQb3N0ZXIuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWQ6IG1hbnVhbEpvdXJuYWwuaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZXMgcmVjdXJyaW5nIGpvdXJuYWwgZW50cmllcyB0ZW1wbGF0ZS5cbiAgICovXG4gIHJlY3VycmluZ0pvdXJuYWxFbnRyaWVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3RlbXBsYXRlX25hbWUnKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyZWN1cnJlbmNlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnYWN0aXZlJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzJykuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY3JlZGl0JykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouZGViaXQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5hY2NvdW50X2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLioubm90ZScpLm9wdGlvbmFsKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIG1hbnVhbCBqb3VybmFsLlxuICAgKi9cbiAgZWRpdE1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2RhdGUnKS5leGlzdHMoKS5pc0lTTzg2MDEoKSxcbiAgICAgIGNoZWNrKCdqb3VybmFsX251bWJlcicpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCd0cmFuc2FjdGlvbl90eXBlJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncmVmZXJlbmNlJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5jcmVkaXQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLmRlYml0Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2VudHJpZXMuKi5hY2NvdW50X2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF9pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdlbnRyaWVzLiouY29udGFjdF90eXBlJykub3B0aW9uYWwoKS5pc0luKFsndmVuZG9yJywgJ2N1c3RvbWVyJ10pLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZW50cmllcy4qLm5vdGUnKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgY2hlY2soJ21lZGlhX2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB0cmFuc2FjdGlvbl90eXBlOiAnam91cm5hbCcsXG4gICAgICAgIHJlZmVyZW5jZTogJycsXG4gICAgICAgIG1lZGlhX2lkczogW10sXG4gICAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsIEFjY291bnRUcmFuc2FjdGlvbiwgQWNjb3VudCwgTWVkaWEsIE1lZGlhTGluayxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ21lZGlhJykuZmlyc3QoKTtcblxuICAgICAgaWYgKCFtYW51YWxKb3VybmFsKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgdG90YWxDcmVkaXQgPSAwO1xuICAgICAgbGV0IHRvdGFsRGViaXQgPSAwO1xuXG4gICAgICBjb25zdCB7IHVzZXIgfSA9IHJlcTtcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFsuLi4ocmVxLmVycm9yUmVhc29ucyB8fCBbXSldO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZvcm0uZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAoZW50cnkuY3JlZGl0IHx8IGVudHJ5LmRlYml0KSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbW9tZW50KGZvcm0uZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG5cbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5LmNyZWRpdCA+IDApIHtcbiAgICAgICAgICB0b3RhbENyZWRpdCArPSBlbnRyeS5jcmVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRlYml0ID4gMCkge1xuICAgICAgICAgIHRvdGFsRGViaXQgKz0gZW50cnkuZGViaXQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHRvdGFsQ3JlZGl0IDw9IDAgfHwgdG90YWxEZWJpdCA8PSAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQ1JFRElULkRFQklULlNVTUFUSU9OLlNIT1VMRC5OT1QuRVFVQUwuWkVSTycsXG4gICAgICAgICAgY29kZTogNDAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbENyZWRpdCAhPT0gdG90YWxEZWJpdCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDUkVESVQuREVCSVQuTk9ULkVRVUFMUycsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpvdXJuYWxOdW1iZXIgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdqb3VybmFsX251bWJlcicsIGZvcm0uam91cm5hbF9udW1iZXIpXG4gICAgICAgIC53aGVyZU5vdCgnaWQnLCBpZClcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmIChqb3VybmFsTnVtYmVyKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0pPVVJOQUwuTlVNQkVSLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmFjY291bnRfaWQpO1xuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBhY2NvdW50c0lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKTtcblxuICAgICAgY29uc3Qgc3RvcmVkQWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuaWQpO1xuXG4gICAgICBpZiAoZGlmZmVyZW5jZShhY2NvdW50c0lkcywgc3RvcmVkQWNjb3VudHNJZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQUNDT1VOVFMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICByZWZlcmVuY2U6IGZvcm0ucmVmZXJlbmNlLFxuICAgICAgICAgIHRyYW5zYWN0aW9uX3R5cGU6ICdKb3VybmFsJyxcbiAgICAgICAgICBqb3VybmFsTnVtYmVyOiBmb3JtLmpvdXJuYWxfbnVtYmVyLFxuICAgICAgICAgIGFtb3VudDogdG90YWxDcmVkaXQsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybS5kZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCddKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV9pZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdhY2NvdW50LnR5cGUnKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNEZXBHcmFwaCA9IGF3YWl0IEFjY291bnQuZGVwR3JhcGgoKS5xdWVyeSgpLnJlbWVtYmVyKCk7XG4gICAgICBjb25zdCBqb3VybmFsID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNEZXBHcmFwaCk7XG5cbiAgICAgIGpvdXJuYWwubG9hZEVudHJpZXModHJhbnNhY3Rpb25zKTtcbiAgICAgIGpvdXJuYWwucmVtb3ZlRW50cmllcygpO1xuXG4gICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjY291bnQgPSBhY2NvdW50cy5maW5kKChhKSA9PiBhLmlkID09PSBlbnRyeS5hY2NvdW50X2lkKTtcblxuICAgICAgICBjb25zdCBqb3VyYW5sRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBkZWJpdDogZW50cnkuZGViaXQsXG4gICAgICAgICAgY3JlZGl0OiBlbnRyeS5jcmVkaXQsXG4gICAgICAgICAgYWNjb3VudDogYWNjb3VudC5pZCxcbiAgICAgICAgICByZWZlcmVuY2VUeXBlOiAnSm91cm5hbCcsXG4gICAgICAgICAgcmVmZXJlbmNlSWQ6IG1hbnVhbEpvdXJuYWwuaWQsXG4gICAgICAgICAgYWNjb3VudE5vcm1hbDogYWNjb3VudC50eXBlLm5vcm1hbCxcbiAgICAgICAgICBub3RlOiBlbnRyeS5ub3RlLFxuICAgICAgICAgIGRhdGU6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVudHJ5LmRlYml0KSB7XG4gICAgICAgICAgam91cm5hbC5kZWJpdChqb3VyYW5sRW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpvdXJuYWwuY3JlZGl0KGpvdXJhbmxFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYXZlIGxpbmtzIG9mIG5ldyBpbnNlcnRlZCBtZWRpYSB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGpvdXJuYWwgbW9kZWwuXG4gICAgICBjb25zdCBqb3VybmFsTWVkaWFJZHMgPSBtYW51YWxKb3VybmFsLm1lZGlhLm1hcCgobSkgPT4gbS5pZCk7XG4gICAgICBjb25zdCBuZXdJbnNlcnRlZE1lZGlhID0gZGlmZmVyZW5jZShmb3JtLm1lZGlhX2lkcywgam91cm5hbE1lZGlhSWRzKTtcbiAgICAgIGNvbnN0IGJ1bGtTYXZlTWVkaWFMaW5rID0gW107XG5cbiAgICAgIG5ld0luc2VydGVkTWVkaWEuZm9yRWFjaCgobWVkaWFJZCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gTWVkaWFMaW5rLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgICBtb2RlbF9uYW1lOiAnSm91cm5hbCcsXG4gICAgICAgICAgbW9kZWxfaWQ6IG1hbnVhbEpvdXJuYWwuaWQsXG4gICAgICAgICAgbWVkaWFfaWQ6IG1lZGlhSWQsXG4gICAgICAgIH0pO1xuICAgICAgICBidWxrU2F2ZU1lZGlhTGluay5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uYnVsa1NhdmVNZWRpYUxpbmssXG4gICAgICAgIGpvdXJuYWwuZGVsZXRlRW50cmllcygpLFxuICAgICAgICBqb3VybmFsLnNhdmVFbnRyaWVzKCksXG4gICAgICAgIGpvdXJuYWwuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe30pO1xuICAgIH0sXG4gIH0sXG5cbiAgcHVibGlzaE1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTWFudWFsSm91cm5hbCxcbiAgICAgICAgQWNjb3VudFRyYW5zYWN0aW9uLFxuICAgICAgICBBY2NvdW50LFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFtYW51YWxKb3VybmFsKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTUFOVUFMLkpPVVJOQUwuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChtYW51YWxKb3VybmFsLnN0YXR1cykge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLlBVQkxJU0hFRC5BTFJFQURZJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZUpvdXJuYWxUcmFuc2FjdGlvbk9wZXIgPSBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC51cGRhdGUoeyBzdGF0dXM6IDEgfSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCcsICdNYW51YWxKb3VybmFsJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgbWFudWFsSm91cm5hbC5pZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCkucmVtZW1iZXIoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgam91cm5hbC5sb2FkRW50cmllcyh0cmFuc2FjdGlvbnMpO1xuICAgICAgam91cm5hbC5jYWxjdWxhdGVFbnRyaWVzQmFsYW5jZUNoYW5nZSgpO1xuXG4gICAgICBjb25zdCB1cGRhdGVBY2NvdW50c1RyYW5zYWN0aW9uc09wZXIgPSBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignaWQnLCB0cmFuc2FjdGlvbnMubWFwKCh0KSA9PiB0LmlkKSlcbiAgICAgICAgLnVwZGF0ZSh7IGRyYWZ0OiAwIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZUpvdXJuYWxUcmFuc2FjdGlvbk9wZXIsXG4gICAgICAgIHVwZGF0ZUFjY291bnRzVHJhbnNhY3Rpb25zT3BlcixcbiAgICAgICAgam91cm5hbC5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGdldE1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTWFudWFsSm91cm5hbCwgQWNjb3VudFRyYW5zYWN0aW9uLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBtYW51YWxKb3VybmFsID0gYXdhaXQgTWFudWFsSm91cm5hbC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ21lZGlhJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghbWFudWFsSm91cm5hbCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9ICAgICBcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdyZWZlcmVuY2VfdHlwZScsIFsnSm91cm5hbCcsICdNYW51YWxKb3VybmFsJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgbWFudWFsSm91cm5hbC5pZCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIG1hbnVhbF9qb3VybmFsOiB7XG4gICAgICAgICAgLi4ubWFudWFsSm91cm5hbC50b0pTT04oKSxcbiAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAuLi50cmFuc2FjdGlvbnMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgbWFudWFsIGpvdXJuYWwgdHJhbnNhY3Rpb25zIGFuZCBhc3NvY2lhdGVkXG4gICAqIGFjY291bnRzIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIGRlbGV0ZU1hbnVhbEpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIE1hbnVhbEpvdXJuYWwsXG4gICAgICAgIEFjY291bnRUcmFuc2FjdGlvbixcbiAgICAgICAgTWVkaWFMaW5rLFxuICAgICAgICBBY2NvdW50LFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IG1hbnVhbEpvdXJuYWwgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIW1hbnVhbEpvdXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdNQU5VQUwuSk9VUk5BTC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ3JlZmVyZW5jZV90eXBlJywgWydKb3VybmFsJywgJ01hbnVhbEpvdXJuYWwnXSlcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBtYW51YWxKb3VybmFsLmlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgYXdhaXQgTWVkaWFMaW5rLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdtb2RlbF9uYW1lJywgJ0pvdXJuYWwnKVxuICAgICAgICAud2hlcmUoJ21vZGVsX2lkJywgbWFudWFsSm91cm5hbC5pZClcbiAgICAgICAgLmRlbGV0ZSgpO1xuXG4gICAgICBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIG1hbnVhbEpvdXJuYWwuaWQpXG4gICAgICAgIC5kZWxldGUoKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBqb3VybmFsLmRlbGV0ZUVudHJpZXMoKSxcbiAgICAgICAgam91cm5hbC5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIHJlY3VycmluZ0pvdXJuYWxzTGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdwYWdlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3BhZ2Vfc2l6ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCd0ZW1wbGF0ZV9uYW1lJykub3B0aW9uYWwoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcblxuICBxdWlja0pvdXJuYWxFbnRyaWVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2RhdGUnKS5leGlzdHMoKS5pc0lTTzg2MDEoKSxcbiAgICAgIGNoZWNrKCdhbW91bnQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgICBjaGVjaygnY3JlZGl0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2RlYml0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ3RyYW5zYWN0aW9uX3R5cGUnKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvdW5kQWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGZvcm0uY3JlZGl0X2FjY291bnRfaWQpXG4gICAgICAgIC5vcldoZXJlKCdpZCcsIGZvcm0uZGViaXRfYWNjb3VudF9pZCk7XG5cbiAgICAgIGNvbnN0IGNyZWRpdEFjY291bnQgPSBmb3VuZEFjY291bnRzLmZpbmQoKGEpID0+IGEuaWQgPT09IGZvcm0uY3JlZGl0X2FjY291bnRfaWQpO1xuICAgICAgY29uc3QgZGViaXRBY2NvdW50ID0gZm91bmRBY2NvdW50cy5maW5kKChhKSA9PiBhLmlkID09PSBmb3JtLmRlYml0X2FjY291bnRfaWQpO1xuXG4gICAgICBpZiAoIWNyZWRpdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ1JFRElUX0FDQ09VTlQuTk9ULkVYSVNUJywgY29kZTogMTAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFkZWJpdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnREVCSVRfQUNDT1VOVC5OT1QuRVhJU1QnLCBjb2RlOiAyMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcigpO1xuICAgICAgLy8gY29uc3Qgam91cm5hbENyZWRpdCA9IG5ldyBKb3VybmFsRW50cnkoe1xuICAgICAgLy8gICBkZWJpdDogXG4gICAgICAvLyAgIGFjY291bnQ6IGRlYml0QWNjb3VudC5pZCxcbiAgICAgIC8vICAgcmVmZXJlbmNlSWQ6IFxuICAgICAgLy8gfSlcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyBidWxrIG1hbnVhbCBqb3VybmFscy5cbiAgICovXG4gIGRlbGV0ZUJ1bGtNYW51YWxKb3VybmFsczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IC4uLnJlcS5xdWVyeSB9O1xuICAgICAgY29uc3QgeyBNYW51YWxKb3VybmFsLCBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnQsIE1lZGlhTGluayB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgbWFudWFsSm91cm5hbHMgPSBhd2FpdCBNYW51YWxKb3VybmFsLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcyk7XG5cbiAgICAgIGNvbnN0IG5vdEZvdW5kTWFudWFsSm91cm5hbHMgPSBkaWZmZXJlbmNlKGZpbHRlci5pZHMsIG1hbnVhbEpvdXJuYWxzLm1hcChtID0+IG0uaWQpKTtcblxuICAgICAgaWYgKG5vdEZvdW5kTWFudWFsSm91cm5hbHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ01BTlVBTC5KT1VSTkFMLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0pvdXJuYWwnLCAnTWFudWFsSm91cm5hbCddKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX2lkJywgZmlsdGVyLmlkcyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgYXdhaXQgTWVkaWFMaW5rLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdtb2RlbF9uYW1lJywgJ0pvdXJuYWwnKVxuICAgICAgICAud2hlcmVJbignbW9kZWxfaWQnLCBmaWx0ZXIuaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IE1hbnVhbEpvdXJuYWwucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKS5kZWxldGUoKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBqb3VybmFsLmRlbGV0ZUVudHJpZXMoKSxcbiAgICAgICAgam91cm5hbC5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZHM6IGZpbHRlci5pZHMgfSk7XG4gICAgfSxcbiAgfVxufTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIHZhbGlkYXRpb25SZXN1bHQsXG4gIHBhcmFtLFxuICBxdWVyeSxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgTmVzdGVkU2V0IGZyb20gJ0AvY29sbGVjdGlvbi9OZXN0ZWRTZXQnO1xuaW1wb3J0IHtcbiAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHMsXG4gIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcbmltcG9ydCB7XG4gIER5bmFtaWNGaWx0ZXIsXG4gIER5bmFtaWNGaWx0ZXJTb3J0QnksXG4gIER5bmFtaWNGaWx0ZXJWaWV3cyxcbiAgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzLFxufSBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLm5ld0FjY291bnQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0FjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0QWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLzppZCcsXG4gICAgICB0aGlzLmdldEFjY291bnQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldEFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldEFjY291bnRzTGlzdC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0QWNjb3VudHNMaXN0LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy8nLFxuICAgICAgdGhpcy5kZWxldGVCdWxrQWNjb3VudHMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUJ1bGtBY2NvdW50cy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlQWNjb3VudC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlQWNjb3VudC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZC9hY3RpdmUnLFxuICAgICAgdGhpcy5hY3RpdmVBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5hY3RpdmVBY2NvdW50LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkL2luYWN0aXZlJyxcbiAgICAgIHRoaXMuaW5hY3RpdmVBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbmFjdGl2ZUFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQvcmVjYWxjdWxhdGUtYmFsYW5jZScsXG4gICAgICB0aGlzLnJlY2FsY3VhbHRlQmFsYW5hY2UudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnJlY2FsY3VhbHRlQmFsYW5hY2UuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQvdHJhbnNmZXJfYWNjb3VudC86dG9BY2NvdW50JyxcbiAgICAgIHRoaXMudHJhbnNmZXJUb0Fub3RoZXJBY2NvdW50LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy50cmFuc2ZlclRvQW5vdGhlckFjY291bnQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9idWxrLzp0eXBlKGFjdGl2YXRlfGluYWN0aXZhdGUpJyxcbiAgICAgIHRoaXMuYnVsa0luYWN0aXZhdGVBY2NvdW50cy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYnVsa0luYWN0aXZhdGVBY2NvdW50cy5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGFjY291bnQuXG4gICAqL1xuICBuZXdBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ25hbWUnKS5leGlzdHMoKS5pc0xlbmd0aCh7IG1pbjogMyB9KVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjb2RlJykub3B0aW9uYWwoKS5pc0xlbmd0aCh7IG1heDogMTAgfSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKCksXG4gICAgICBjaGVjaygnYWNjb3VudF90eXBlX2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEFjY291bnRUeXBlLCBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSA9IGZvcm0uY29kZVxuICAgICAgICA/IEFjY291bnQucXVlcnkoKS53aGVyZSgnY29kZScsIGZvcm0uY29kZSkgOiBudWxsO1xuXG4gICAgICBjb25zdCBmb3VuZEFjY291bnRUeXBlUHJvbWlzZSA9IEFjY291bnRUeXBlLnF1ZXJ5KClcbiAgICAgICAgLmZpbmRCeUlkKGZvcm0uYWNjb3VudF90eXBlX2lkKTtcblxuICAgICAgY29uc3QgW2ZvdW5kQWNjb3VudENvZGUsIGZvdW5kQWNjb3VudFR5cGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSwgZm91bmRBY2NvdW50VHlwZVByb21pc2UsXG4gICAgICBdKTtcblxuICAgICAgaWYgKGZvdW5kQWNjb3VudENvZGVQcm9taXNlICYmIGZvdW5kQWNjb3VudENvZGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTk9UX1VOSVFVRV9DT0RFJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghZm91bmRBY2NvdW50VHlwZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTk9UX0VYSVNUX0FDQ09VTlRfVFlQRScsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuaW5zZXJ0KHsgLi4uZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaXRlbTogeyB9IH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGFjY291bnQgZGV0YWlscy5cbiAgICovXG4gIGVkaXRBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCduYW1lJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDMgfSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKCksXG4gICAgICBjaGVjaygnY29kZScpLmV4aXN0cygpLmlzTGVuZ3RoKHsgbWF4OiAxMCB9KVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdhY2NvdW50X3R5cGVfaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2Rlc2NyaXB0aW9uJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFR5cGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvdW5kQWNjb3VudENvZGVQcm9taXNlID0gKGZvcm0uY29kZSAmJiBmb3JtLmNvZGUgIT09IGFjY291bnQuY29kZSlcbiAgICAgICAgPyBBY2NvdW50LnF1ZXJ5KCkud2hlcmUoJ2NvZGUnLCBmb3JtLmNvZGUpLndoZXJlTm90KCdpZCcsIGFjY291bnQuaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgZm91bmRBY2NvdW50VHlwZVByb21pc2UgPSAoZm9ybS5hY2NvdW50X3R5cGVfaWQgIT09IGFjY291bnQuYWNjb3VudF90eXBlX2lkKVxuICAgICAgICA/IEFjY291bnRUeXBlLnF1ZXJ5KCkud2hlcmUoJ2lkJywgZm9ybS5hY2NvdW50X3R5cGVfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgW2ZvdW5kQWNjb3VudENvZGUsIGZvdW5kQWNjb3VudFR5cGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmb3VuZEFjY291bnRDb2RlUHJvbWlzZSwgZm91bmRBY2NvdW50VHlwZVByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmIChmb3VuZEFjY291bnRDb2RlLmxlbmd0aCA+IDAgJiYgZm91bmRBY2NvdW50Q29kZVByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ05PVF9VTklRVUVfQ09ERScsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRBY2NvdW50VHlwZS5sZW5ndGggPD0gMCAmJiBmb3VuZEFjY291bnRUeXBlUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTk9UX0VYSVNUX0FDQ09VTlRfVFlQRScsIGNvZGU6IDExMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBhY2NvdW50LnBhdGNoKHsgLi4uZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICBnZXRBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLnJlbWVtYmVyKCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGFjY291bnQ6IHsgLi4uYWNjb3VudCB9IH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGRlbGV0ZUFjY291bnQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFRyYW5zYWN0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCk7XG5cbiAgICAgIGlmICghYWNjb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChhY2NvdW50LnByZWRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0FDQ09VTlQuUFJFREVGSU5FRCcgLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudFRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnYWNjb3VudF9pZCcsIGFjY291bnQuaWQpO1xuXG4gICAgICBpZiAoYWNjb3VudFRyYW5zYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5ULkhBUy5BU1NPQ0lBVEVELlRSQU5TQUNUSU9OUycsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuZGVsZXRlQnlJZChhY2NvdW50LmlkKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgYWNjb3VudHMgbGlzdC5cbiAgICovXG4gIGdldEFjY291bnRzTGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdkaXNwbGF5X3R5cGUnKS5vcHRpb25hbCgpLmlzSW4oWyd0cmVlJywgJ2ZsYXQnXSksXG4gICAgICBxdWVyeSgnYWNjb3VudF90eXBlcycpLm9wdGlvbmFsKCkuaXNBcnJheSgpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfdHlwZXMuKicpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdjdXN0b21fdmlld19pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcblxuICAgICAgcXVlcnkoJ3N0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcycpLm9wdGlvbmFsKCkuaXNKU09OKCksXG5cbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9ieScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2Rlc2MnLCAnYXNjJ10pLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgYWNjb3VudF90eXBlczogW10sXG4gICAgICAgIGRpc3BsYXlfdHlwZTogJ3RyZWUnLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICBzb3J0X29yZGVyOiAnYXNjJyxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXJfcm9sZXMgPSBKU09OLnBhcnNlKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IFJlc291cmNlLCBBY2NvdW50LCBWaWV3IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGNvbnN0IGFjY291bnRzUmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC5yZW1lbWJlcigpXG4gICAgICAgIC53aGVyZSgnbmFtZScsICdhY2NvdW50cycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdmaWVsZHMnKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCFhY2NvdW50c1Jlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVFNfUkVTT1VSQ0VfTk9UX0ZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5cyA9IGFjY291bnRzUmVzb3VyY2UuZmllbGRzLm1hcCgoYykgPT4gYy5rZXkpO1xuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5jdXN0b21fdmlld19pZCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2lkJywgZmlsdGVyLmN1c3RvbV92aWV3X2lkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdmYXZvdXJpdGUnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIGFjY291bnRzUmVzb3VyY2UuaWQpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY29sdW1ucycpO1xuICAgICAgICBidWlsZGVyLmZpcnN0KCk7XG5cbiAgICAgICAgYnVpbGRlci5yZW1lbWJlcigpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoQWNjb3VudC50YWJsZU5hbWUpO1xuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X2J5KSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfYnkpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfYnksXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgLy8gRmlsdGVyIHJvbGVzLlxuICAgICAgaWYgKGZpbHRlci5maWx0ZXJfcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYWNjb3VudHMgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBmaWx0ZXJSb2xlcyA9IG5ldyBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMoXG4gICAgICAgICAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIoZmlsdGVyLmZpbHRlcl9yb2xlcyksXG4gICAgICAgICAgYWNjb3VudHNSZXNvdXJjZS5maWVsZHMsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdBQ0NPVU5UUy5SRVNPVVJDRS5IQVMuTk8uR0lWRU4uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAucmVtZW1iZXIoKVxuICAgICAgICAub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdmaWx0ZXJBY2NvdW50VHlwZXMnLCBmaWx0ZXIuYWNjb3VudF90eXBlcyk7XG4gICAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCd0eXBlJyk7XG4gICAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdiYWxhbmNlJyk7XG5cbiAgICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5lc3RlZEFjY291bnRzID0gQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgYWNjb3VudHM6IG5lc3RlZEFjY291bnRzLFxuICAgICAgICAuLi4odmlldykgPyB7XG4gICAgICAgICAgY3VzdG9tVmlld0lkOiB2aWV3LmlkLFxuICAgICAgICB9IDoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZS1jYWxjdWxhdGVzIGJhbGFuY2Ugb2YgdGhlIGdpdmVuIGFjY291bnQuXG4gICAqL1xuICByZWNhbGN1YWx0ZUJhbGFuYWNlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIEFjY291bnQsXG4gICAgICAgIEFjY291bnRUcmFuc2FjdGlvbixcbiAgICAgICAgQWNjb3VudEJhbGFuY2UsXG4gICAgICB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBBY2NvdW50LmZpbmRCeUlkKGlkKTtcblxuICAgICAgaWYgKCFhY2NvdW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudFRyYW5zYWN0aW9ucyA9IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnYWNjb3VudF9pZCcsIGFjY291bnQuaWQpO1xuXG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKCk7XG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRnJvbUNvbGxlY3Rpb24oYWNjb3VudFRyYW5zYWN0aW9ucyk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgYmFsYW5jZSBvZiB0aGUgZ2l2ZW4gYWNjb3VudCBpZC5cbiAgICAgIGF3YWl0IEFjY291bnRCYWxhbmNlLnF1ZXJ5KCkud2hlcmUoJ2FjY291bnRfaWQnLCBhY2NvdW50LmlkKS5kZWxldGUoKTtcblxuICAgICAgLy8gU2F2ZSBjYWxjdWFsdGVkIGFjY291bnQgYmFsYW5jZS5cbiAgICAgIGF3YWl0IGpvdXJuYWxFbnRyaWVzLnNhdmVCYWxhbmNlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFjdGl2ZSB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGFjdGl2ZUFjY291bnQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgQWNjb3VudCB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWFjY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5ULk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAucGF0Y2goeyBhY3RpdmU6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiBhY2NvdW50LmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEluYWN0aXZlIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKi9cbiAgaW5hY3RpdmVBY2NvdW50OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGlkKTtcblxuICAgICAgaWYgKCFhY2NvdW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQUNDT1VOVC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLnBhdGNoKHsgYWN0aXZlOiBmYWxzZSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWQ6IGFjY291bnQuaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogVHJhbnNmZXIgYWxsIGpvdXJuYWwgZW50cmllcyBvZiB0aGUgZ2l2ZW4gYWNjb3VudCB0byBhbm90aGVyIGFjY291bnQuXG4gICAqL1xuICB0cmFuc2ZlclRvQW5vdGhlckFjY291bnQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcGFyYW0oJ3RvQWNjb3VudCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zdCB7IGlkLCB0b0FjY291bnQ6IHRvQWNjb3VudElkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICAvLyBjb25zdCBbZnJvbUFjY291bnQsIHRvQWNjb3VudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAvLyAgIEFjY291bnQucXVlcnkoKS5maW5kQnlJZChpZCksXG4gICAgICAvLyAgIEFjY291bnQucXVlcnkoKS5maW5kQnlJZCh0b0FjY291bnRJZCksXG4gICAgICAvLyBdKTtcblxuICAgICAgLy8gY29uc3QgZnJvbUFjY291bnRUcmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgLy8gICAud2hlcmUoJ2FjY291bnRfaWQnLCBmcm9tQWNjb3VudCk7XG5cbiAgICAgIC8vIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgZGVsZXRlQnVsa0FjY291bnRzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2lkcycpLmlzQXJyYXkoKSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0geyBpZHM6IFtdLCAuLi5yZXEucXVlcnkgfTtcbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgQWNjb3VudFRyYW5zYWN0aW9uIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuaWRzLmxlbmd0aCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBhY2NvdW50c0lkcyA9IGFjY291bnRzLm1hcCgoYSkgPT4gYS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEFjY291bnRzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBhY2NvdW50c0lkcyk7XG4gICAgICBjb25zdCBwcmVkZWZpbmVkQWNjb3VudHMgPSBhY2NvdW50cy5maWx0ZXIoYWNjb3VudCA9PiBhY2NvdW50LnByZWRlZmluZWQpO1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmIChub3RGb3VuZEFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7XG4gICAgICAgICAgICB0eXBlOiAnQUNDT1VOVFMuSURTLk5PVC5GT1VORCcsXG4gICAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgICBpZHM6IG5vdEZvdW5kQWNjb3VudHMsXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHByZWRlZmluZWRBY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQUNDT1VOVC5QUkVERUZJTkVEJyxcbiAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgaWRzOiBwcmVkZWZpbmVkQWNjb3VudHMubWFwKGEgPT4gYS5pZCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHNUcmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbignYWNjb3VudF9pZCcsIGFjY291bnRzSWRzKVxuICAgICAgICAuY291bnQoJ2lkIGFzIHRyYW5zYWN0aW9uc19jb3VudCcpXG4gICAgICAgIC5ncm91cEJ5KCdhY2NvdW50X2lkJylcbiAgICAgICAgLnNlbGVjdCgnYWNjb3VudF9pZCcpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0hhc1RyYW5zYWN0aW9ucyA9IFtdO1xuXG4gICAgICBhY2NvdW50c1RyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgICBpZiAodHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zQ291bnQgPiAwKSB7XG4gICAgICAgICAgYWNjb3VudHNIYXNUcmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbi5hY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChhY2NvdW50c0hhc1RyYW5zYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnQUNDT1VOVC5IQVMuQVNTT0NJQVRFRC5UUkFOU0FDVElPTlMnLFxuICAgICAgICAgIGNvZGU6IDMwMCxcbiAgICAgICAgICBpZHM6IGFjY291bnRzSGFzVHJhbnNhY3Rpb25zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIGFjY291bnRzLm1hcCgoYSkgPT4gYS5pZCkpXG4gICAgICAgIC5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogQnVsayBhY3Z0aXZhdGUvaW5hY3RpdmF0ZSB0aGUgZ2l2ZW4gYWNjb3VudHMuXG4gICAqL1xuICBidWxrSW5hY3RpdmF0ZUFjY291bnRzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2lkcycpLmlzQXJyYXkoeyBtaW46IDIgfSksXG4gICAgICBxdWVyeSgnaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcGFyYW0oJ3R5cGUnKS5leGlzdHMoKS5pc0luKFsnYWN0aXZhdGUnLCAnaW5hY3RpdmF0ZSddKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGlkczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHJlcS5wYXJhbXM7XG5cbiAgICAgIGNvbnN0IHN0b3JlZEFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpLndoZXJlSW4oJ2lkJywgZmlsdGVyLmlkcyk7XG4gICAgICBjb25zdCBzdG9yZWRBY2NvdW50c0lkcyA9IHN0b3JlZEFjY291bnRzLm1hcCgoYWNjb3VudCkgPT4gYWNjb3VudC5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEFjY291bnRzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBzdG9yZWRBY2NvdW50c0lkcyk7XG5cbiAgICAgIGlmIChub3RGb3VuZEFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBQ0NPVU5UUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZEFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIHN0b3JlZEFjY291bnRzSWRzKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIGFjdGl2ZTogdHlwZSA9PT0gJ2FjdGl2YXRlJyA/IDEgOiAwLFxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWRzOiBzdG9yZWRBY2NvdW50c0lkcyB9KTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGNoZWNrLCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHVuaXFpZCBmcm9tICd1bmlxaWQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IExvZ2dlciBmcm9tICdAL3NlcnZpY2VzL0xvZ2dlcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5pbXBvcnQgbWFpbCBmcm9tICdAL3NlcnZpY2VzL21haWwnO1xuaW1wb3J0IHsgaGFzaFBhc3N3b3JkIH0gZnJvbSAnQC91dGlscyc7XG5pbXBvcnQgZGJNYW5hZ2VyIGZyb20gJ0AvZGF0YWJhc2UvbWFuYWdlcic7XG5pbXBvcnQgVGVuYW50IGZyb20gJ0Avc3lzdGVtL21vZGVscy9UZW5hbnQnO1xuaW1wb3J0IFRlbmFudFVzZXIgZnJvbSAnQC9tb2RlbHMvVGVuYW50VXNlcic7XG5pbXBvcnQgVGVuYW50c01hbmFnZXIgZnJvbSAnQC9zeXN0ZW0vVGVuYW50c01hbmFnZXInO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBQYXNzd29yZFJlc2V0IGZyb20gJ0Avc3lzdGVtL21vZGVscy9QYXNzd29yZFJlc2V0JztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvbG9naW4nLFxuICAgICAgdGhpcy5sb2dpbi52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubG9naW4uaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9yZWdpc3RlcicsXG4gICAgICB0aGlzLnJlZ2lzdGVyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZWdpc3Rlci5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3NlbmRfcmVzZXRfcGFzc3dvcmQnLFxuICAgICAgdGhpcy5zZW5kUmVzZXRQYXNzd29yZC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuc2VuZFJlc2V0UGFzc3dvcmQuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy9yZXNldC86dG9rZW4nLFxuICAgICAgdGhpcy5yZXNldFBhc3N3b3JkLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZXNldFBhc3N3b3JkLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVzZXIgbG9naW4gYXV0aGVudGljYXRpb24gcmVxdWVzdC5cbiAgICovXG4gIGxvZ2luOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ2NyZWRpZW50aWFsJykuZXhpc3RzKCkuaXNFbWFpbCgpLFxuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDUgfSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgSldUX1NFQ1JFVF9LRVkgfSA9IHByb2Nlc3MuZW52O1xuXG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1NvbWVvbmUgdHJ5aW5nIHRvIGxvZ2luLicsIHsgZm9ybSB9KTtcblxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndGVuYW50JylcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIGZvcm0uY3JlZGllbnRpYWwpXG4gICAgICAgIC5vcldoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLmNyZWRpZW50aWFsKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZBTElEX0RFVEFJTFMnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF1c2VyLnZlcmlmeVBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZBTElEX0RFVEFJTFMnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF1c2VyLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVVNFUl9JTkFDVElWRScsIGNvZGU6IDExMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXN0TG9naW5BdCA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuXG4gICAgICBjb25zdCB1cGRhdGVUZW5hbnRVc2VyID0gVGVuYW50VXNlci50ZW5hbnQoKS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCB1c2VyLmlkKVxuICAgICAgICAudXBkYXRlKHsgbGFzdF9sb2dpbl9hdDogbGFzdExvZ2luQXQgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVN5c3RlbVVzZXIgPSBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIHVzZXIuaWQpXG4gICAgICAgIC51cGRhdGUoeyBsYXN0X2xvZ2luX2F0OiBsYXN0TG9naW5BdCB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3VwZGF0ZVRlbmFudFVzZXIsIHVwZGF0ZVN5c3RlbVVzZXJdKTtcblxuICAgICAgY29uc3QgdG9rZW4gPSBqd3Quc2lnbihcbiAgICAgICAgeyBlbWFpbDogdXNlci5lbWFpbCwgX2lkOiB1c2VyLmlkIH0sXG4gICAgICAgIEpXVF9TRUNSRVRfS0VZLFxuICAgICAgICB7IGV4cGlyZXNJbjogJzFkJyB9LFxuICAgICAgKTtcbiAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnTG9nZ2luZyBzdWNjZXNzLicsIHsgZm9ybSB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdG9rZW4sIHVzZXIgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IG9yZ2FuaXphdGlvbi5cbiAgICovXG4gIHJlZ2lzdGVyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ29yZ2FuaXphdGlvbl9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2ZpcnN0X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnbGFzdF9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2VtYWlsJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3Bob25lX251bWJlcicpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdwYXNzd29yZCcpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjb3VudHJ5JykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1NvbWVvbmUgdHJ5aW5nIHRvIHJlZ2lzdGVyLicsIHsgZm9ybSB9KTtcblxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbClcbiAgICAgICAgLm9yV2hlcmUoJ3Bob25lX251bWJlcicsIGZvcm0ucGhvbmVfbnVtYmVyKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmICh1c2VyICYmIHVzZXIucGhvbmVOdW1iZXIgPT09IGZvcm0ucGhvbmVfbnVtYmVyKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1BIT05FX05VTUJFUl9FWElTVFMnLCBjb2RlOiAxMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodXNlciAmJiB1c2VyLmVtYWlsID09PSBmb3JtLmVtYWlsKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VNQUlMX0VYSVNUUycsIGNvZGU6IDIwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZ2FuaXphdGlvbklkID0gdW5pcWlkKCk7XG4gICAgICBjb25zdCB0ZW5hbnRPcmdhbml6YXRpb24gPSBhd2FpdCBUZW5hbnQucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICBvcmdhbml6YXRpb25faWQ6IG9yZ2FuaXphdGlvbklkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgaGFzaFBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpO1xuICAgICAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICAgICAgLi4ucGljayhmb3JtLCBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgJ3Bob25lX251bWJlciddKSxcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRVc2VyID0gYXdhaXQgU3lzdGVtVXNlci5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIC4uLnVzZXJJbnNlcnQsXG4gICAgICAgIHBhc3N3b3JkOiBoYXNoZWRQYXNzd29yZCxcbiAgICAgICAgdGVuYW50X2lkOiB0ZW5hbnRPcmdhbml6YXRpb24uaWQsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRiTWFuYWdlci5jcmVhdGVEYihgYmlnY2FwaXRhbF90ZW5hbnRfJHtvcmdhbml6YXRpb25JZH1gKTtcblxuICAgICAgY29uc3QgdGVuYW50RGIgPSBUZW5hbnRzTWFuYWdlci5rbmV4SW5zdGFuY2Uob3JnYW5pemF0aW9uSWQpO1xuICAgICAgYXdhaXQgdGVuYW50RGIubWlncmF0ZS5sYXRlc3QoKTtcblxuICAgICAgVGVuYW50TW9kZWwua25leEJpbmRlZCA9IHRlbmFudERiO1xuXG4gICAgICBhd2FpdCBUZW5hbnRVc2VyLmJpbmRLbmV4KHRlbmFudERiKS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgIC4uLnVzZXJJbnNlcnQsXG4gICAgICAgIGludml0ZV9hY2NlcHRlZF9hdDogbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICB9KTtcbiAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnTmV3IHRlbmFudCBoYXMgYmVlbiBjcmVhdGVkLicsIHsgb3JnYW5pemF0aW9uSWQgfSk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvV2VsY29tZS5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gTXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLCB7IC4uLmZvcm0gfSk7XG4gICAgICBjb25zdCBtYWlsT3B0aW9ucyA9IHtcbiAgICAgICAgdG86IHVzZXJJbnNlcnQuZW1haWwsXG4gICAgICAgIGZyb206IGAke3Byb2Nlc3MuZW52Lk1BSUxfRlJPTV9OQU1FfSAke3Byb2Nlc3MuZW52Lk1BSUxfRlJPTV9BRERSRVNTfWAsXG4gICAgICAgIHN1YmplY3Q6ICdXZWxjb21lIHRvIEJpZ2NhcGl0YWwnLFxuICAgICAgICBodG1sOiByZW5kZXJlZCxcbiAgICAgIH07XG4gICAgICBtYWlsLnNlbmRNYWlsKG1haWxPcHRpb25zLCAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnRmFpbGVkIHNlbmQgd2VsY29tZSBtYWlsJywgeyBlcnJvciwgZm9ybSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgTG9nZ2VyLmxvZygnaW5mbycsICdVc2VyIGhhcyBiZWVuIHNlbnQgd2VsY29tZSBlbWFpbCBzdWNjZXNzZnVseS4nLCB7IGZvcm0gfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFNlbmQgcmVzZXQgcGFzc3dvcmQgbGluayB2aWEgZW1haWwgb3IgU01TLlxuICAgKi9cbiAgc2VuZFJlc2V0UGFzc3dvcmQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnZW1haWwnKS5leGlzdHMoKS5pc0VtYWlsKCksXG4gICAgXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnVXNlciB0cnlpbmcgdG8gc2VuZCByZXNldCBwYXNzd29yZC4nLCB7IGZvcm0gfSk7XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KCkud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRU1BSUwuTk9ULlJFR0lTVEVSRUQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIGFsbCBzdG9yZWQgdG9rZW5zIG9mIHJlc2V0IHBhc3N3b3JkIHRoYXQgYXNzb2NpYXRlIHRvIHRoZSBnaXZlIGVtYWlsLlxuICAgICAgYXdhaXQgUGFzc3dvcmRSZXNldC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnZW1haWwnLCBmb3JtLmVtYWlsKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gdW5pcWlkKCk7XG4gICAgICBjb25zdCBwYXNzd29yZFJlc2V0ID0gYXdhaXQgUGFzc3dvcmRSZXNldC5xdWVyeSgpXG4gICAgICAgIC5pbnNlcnQoeyBlbWFpbDogZm9ybS5lbWFpbCwgdG9rZW4gfSk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvUmVzZXRQYXNzd29yZC5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gTXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLCB7XG4gICAgICAgIHVybDogYCR7cmVxLnByb3RvY29sfTovLyR7cmVxLmhvc3RuYW1lfS9yZXNldC8ke3Bhc3N3b3JkUmVzZXQudG9rZW59YCxcbiAgICAgICAgZmlyc3RfbmFtZTogdXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3RfbmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgLy8gY29udGFjdF91c19lbWFpbDogY29uZmlnLmNvbnRhY3RVc01haWwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFpbE9wdGlvbnMgPSB7XG4gICAgICAgIHRvOiB1c2VyLmVtYWlsLFxuICAgICAgICBmcm9tOiBgJHtwcm9jZXNzLmVudi5NQUlMX0ZST01fTkFNRX0gJHtwcm9jZXNzLmVudi5NQUlMX0ZST01fQUREUkVTU31gLFxuICAgICAgICBzdWJqZWN0OiAnQmlnY2FwaXRhbCAtIFBhc3N3b3JkIFJlc2V0JyxcbiAgICAgICAgaHRtbDogcmVuZGVyZWQsXG4gICAgICB9O1xuICAgICAgbWFpbC5zZW5kTWFpbChtYWlsT3B0aW9ucywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCBzZW5kIHJlc2V0IHBhc3N3b3JkIG1haWwnLCB7IGVycm9yLCBmb3JtIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgaGFzIGJlZW4gc2VudCByZXNldCBwYXNzd29yZCBlbWFpbCBzdWNjZXNzZnVseS4nLCB7IGZvcm0gfSk7XG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgZW1haWw6IHBhc3N3b3JkUmVzZXQuZW1haWwgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmVzZXQgcGFzc3dvcmQuXG4gICAqL1xuICByZXNldFBhc3N3b3JkOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkuaXNMZW5ndGgoeyBtaW46IDUgfSkuY3VzdG9tKCh2YWx1ZSwgeyByZXEgfSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IHJlcS5ib2R5LmNvbmZpcm1fcGFzc3dvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzd29yZHMgZG9uJ3QgbWF0Y2hcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgdHJ5aW5nIHRvIHJlc2V0IHBhc3N3b3JkLicpO1xuICAgICAgY29uc3QgeyB0b2tlbiB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgcGFzc3dvcmQgfSA9IHJlcS5ib2R5O1xuXG4gICAgICBjb25zdCB0b2tlbk1vZGVsID0gYXdhaXQgUGFzc3dvcmRSZXNldC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgndG9rZW4nLCB0b2tlbilcbiAgICAgICAgLy8gLndoZXJlKCdjcmVhdGVkX2F0JywgJz49JywgRGF0ZS5ub3coKSAtIDM2MDAwMDApXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXRva2VuTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1RPS0VOX0lOVkFMSUQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgdG9rZW5Nb2RlbC5lbWFpbCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IGhhc2hQYXNzd29yZChwYXNzd29yZCk7XG5cbiAgICAgIGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2VtYWlsJywgdG9rZW5Nb2RlbC5lbWFpbClcbiAgICAgICAgLnVwZGF0ZSh7XG4gICAgICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxuICAgICAgICB9KTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSByZXNldCBwYXNzd29yZCB0b2tlbi5cbiAgICAgIGF3YWl0IFBhc3N3b3JkUmVzZXQucXVlcnkoKS53aGVyZSgndG9rZW4nLCB0b2tlbikuZGVsZXRlKCk7XG4gICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ1VzZXIgcGFzc3dvcmQgaGFzIGJlZW4gcmVzZXQgc3VjY2Vzc2Z1bGx5LicpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe30pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUNvbnRyb2xsZXIge1xuXG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVjaywgcGFyYW0sIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmFsbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYWxsLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3Q3VycmVuY3kudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0N1cnJlbmN5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEN1cnJlbmN5LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0Q3VycmVuY3kuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnLzpjdXJyZW5jeV9jb2RlJyxcbiAgICAgIHRoaXMuZGVsZXRlQ3VycmVjeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlQ3VycmVjeS5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCBjdXJyZW5jeSBkZXRhaWxzLlxuICAgKi9cbiAgYWxsOiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBDdXJyZW5jeSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGN1cnJlbmNpZXMgPSBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBjdXJyZW5jaWVzOiBbXG4gICAgICAgICAgLi4uY3VycmVuY2llcyxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgbmV3Q3VycmVuY3k6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnY3VycmVuY3lfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjdXJyZW5jeV9jb2RlJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IEN1cnJlbmN5IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBmb3VuZEN1cnJlbmN5ID0gYXdhaXQgQ3VycmVuY3kucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2N1cnJlbmN5X2NvZGUnLCBmb3JtLmN1cnJlbmN5X2NvZGUpO1xuXG4gICAgICBpZiAoZm91bmRDdXJyZW5jeS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQ1VSUkVOQ1kuQ09ERS5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBDdXJyZW5jeS5xdWVyeSgpXG4gICAgICAgIC5pbnNlcnQoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBjdXJyZW5jeTogeyAuLi5mb3JtIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGRlbGV0ZUN1cnJlY3k6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnY3VycmVuY3lfY29kZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEN1cnJlbmN5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUgfSA9IHJlcS5wYXJhbXM7XG5cbiAgICAgIGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgY3VycmVuY3lDb2RlKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGVkaXRDdXJyZW5jeToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdjdXJyZW5jeV9jb2RlJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBDdXJyZW5jeSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZm91bmRDdXJyZW5jeSA9IGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgZm9ybS5jdXJyZW5jeV9jb2RlKS53aGVyZU5vdCgnaWQnLCBpZCk7XG5cbiAgICAgIGlmIChmb3VuZEN1cnJlbmN5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDVVJSRU5DWS5DT0RFLkFMUkVBRFkuRVhJU1RTJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEN1cnJlbmN5LnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLnVwZGF0ZSh7IC4uLmZvcm0gfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGN1cnJlbmN5OiB7IC4uLmZvcm0gfSB9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIHBhcmFtLFxuICBxdWVyeSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuXG5cbmNvbnN0IHZhbGlkYXRpb1JvbGVzID0gW1xuICBjaGVjaygnY3VzdG9tZXJfdHlwZScpXG4gICAgLmV4aXN0cygpXG4gICAgLmlzSW4oWydpbmRpdmlkdWFsJywgJ2J1c2luZXNzJ10pXG4gICAgLnRyaW0oKVxuICAgIC5lc2NhcGUoKSxcbiAgY2hlY2soJ2ZpcnN0X25hbWUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2xhc3RfbmFtZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdjb21wYW55X25hbWUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcblxuICBjaGVjaygnZGlzcGxheV9uYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdlbWFpbCcpLm9wdGlvbmFsKCkuaXNFbWFpbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ3dvcmtfcGhvbmUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ3BlcnNvbmFsX3Bob25lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ2JpbGxpbmdfYWRkcmVzc19jaXR5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3NfY291bnRyeScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX2VtYWlsJykub3B0aW9uYWwoKS5pc0VtYWlsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2JpbGxpbmdfYWRkcmVzc19waG9uZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX3N0YXRlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19jb3VudHJ5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX2VtYWlsJykub3B0aW9uYWwoKS5pc0VtYWlsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc196aXBfY29kZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19waG9uZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdhY3RpdmUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuXG4gIGNoZWNrKCdjdXN0b21fZmllbGRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICBjaGVjaygnY3VzdG9tX2ZpZWxkcy4qLmtleScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLm5ld0N1c3RvbWVyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdDdXN0b21lci5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZCcsXG4gICAgICB0aGlzLmVkaXRDdXN0b21lci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEN1c3RvbWVyLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVDdXN0b21lci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlQ3VzdG9tZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RDdXN0b21lcnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RDdXN0b21lcnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLzppZCcsXG4gICAgICB0aGlzLmdldEN1c3RvbWVyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRDdXN0b21lci5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBjdXN0b21lcnMgbGlzdCB3aXRoIHBhZ2luYXRpb24gYW5kIGN1c3RvbSB2aWV3IG1ldGFkYXRhLlxuICAgKi9cbiAgbGlzdEN1c3RvbWVyczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnXSksXG4gICAgICBxdWVyeSgnc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2Rlc2MnLCAnYXNjJ10pLFxuICAgICAgcXVlcnkoJ3BhZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZV9zaXplJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ2N1c3RvbV92aWV3X2lkJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3N0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcycpLm9wdGlvbmFsKCkuaXNKU09OKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBSZXNvdXJjZSwgVmlldywgQ3VzdG9tZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgY29uc3QgY3VzdG9tZXJzUmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsICdjdXN0b21lcnMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghY3VzdG9tZXJzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDVVNUT01FUlMuUkVTT1VSQ0UuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBjb2x1bW5fc29ydF9vcmRlcjogJycsXG4gICAgICAgIHNvcnRfb3JkZXI6ICcnLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBwYWdlX3NpemU6IDEwLFxuICAgICAgICBjdXN0b21fdmlld19pZDogbnVsbCxcbiAgICAgICAgZmlsdGVyX3JvbGVzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXJfcm9sZXMgPSBKU09OLnBhcnNlKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdpZCcsIGZpbHRlci5jdXN0b21fdmlld19pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnZmF2b3VyaXRlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci53aGVyZSgncmVzb3VyY2VfaWQnLCBjdXN0b21lcnNSZXNvdXJjZS5pZCk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgncm9sZXMuZmllbGQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJyk7XG4gICAgICAgIGJ1aWxkZXIuZmlyc3QoKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gY3VzdG9tZXJzUmVzb3VyY2UuZmllbGRzLm1hcCgoYykgPT4gYy5rZXkpO1xuICAgICAgY29uc3QgZHluYW1pY0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyKEN1c3RvbWVyLnRhYmxlTmFtZSk7XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggdmlldyByb2xlcy5cbiAgICAgIGlmICh2aWV3ICYmIHZpZXcucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2aWV3RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJWaWV3cyhcbiAgICAgICAgICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3LnJvbGVzKSxcbiAgICAgICAgICB2aWV3LnJvbGVzTG9naWNFeHByZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdGaWx0ZXIudmFsaWRhdGVGaWx0ZXJSb2xlcygpKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZHluYW1pY0ZpbHRlci5zZXRGaWx0ZXIodmlld0ZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggZmlsdGVyIHJvbGVzLlxuICAgICAgaWYgKGZpbHRlci5maWx0ZXJfcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYWNjb3VudHMgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBmaWx0ZXJSb2xlcyA9IG5ldyBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMoXG4gICAgICAgICAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIoZmlsdGVyLmZpbHRlcl9yb2xlcyksXG4gICAgICAgICAgY3VzdG9tZXJzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTVMuUkVTT1VSQ0UuSEFTLk5PLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgLy8gQ3VzdG9tZXJzIHF1ZXJ5LlxuICAgICAgY29uc3QgY3VzdG9tZXJzID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuICAgICAgfSkucGFnaW5hdGlvbihmaWx0ZXIucGFnZSAtIDEsIGZpbHRlci5wYWdlX3NpemUpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBjdXN0b21lcnMsXG4gICAgICAgIC4uLih2aWV3KSA/IHtcbiAgICAgICAgICBjdXN0b21WaWV3SWQ6IHZpZXcuaWQsXG4gICAgICAgIH0gOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3VibWl0IGEgbmV3IGN1c3RvbWVyIGRldGFpbHMuXG4gICAqL1xuICBuZXdDdXN0b21lcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIC4uLnZhbGlkYXRpb1JvbGVzLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQ3VzdG9tZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuXG4gICAgICBjb25zdCBjdXN0b21lciA9IGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkuaW5zZXJ0QW5kRmV0Y2goe1xuICAgICAgICAuLi5waWNrKGZvcm0sIFtcbiAgICAgICAgICAnY3VzdG9tZXJfdHlwZScsXG4gICAgICAgICAgJ2ZpcnN0X25hbWUnLFxuICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICdjb21wYW55X25hbWUnLFxuICAgICAgICAgICdkaXNwbGF5X25hbWUnLFxuICAgICAgICAgIFxuICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgJ3dvcmtfcGhvbmUnLFxuICAgICAgICAgICdwZXJzb25hbF9waG9uZScsXG5cbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzEnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jaXR5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2NvdW50cnknLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfemlwY29kZScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19waG9uZScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc18yJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19jaXR5JyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19lbWFpbCcsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfemlwY29kZScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3N0YXRlJyxcblxuICAgICAgICAgICdub3RlJyxcbiAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgICAgXSksIFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiBjdXN0b21lci5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGN1c3RvbWVyIGlkLlxuICAgKi9cbiAgZWRpdEN1c3RvbWVyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIC4uLnZhbGlkYXRpb1JvbGVzLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBDdXN0b21lciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGN1c3RvbWVyID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFjdXN0b21lcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0NVU1RPTUVSLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLnBhdGNoKHtcbiAgICAgICAgLi4ucGljayhmb3JtLCBbXG4gICAgICAgICAgJ2N1c3RvbWVyX3R5cGUnLFxuICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAnY29tcGFueV9uYW1lJyxcbiAgICAgICAgICAnZGlzcGxheV9uYW1lJyxcbiAgICAgICAgICBcbiAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICd3b3JrX3Bob25lJyxcbiAgICAgICAgICAncGVyc29uYWxfcGhvbmUnLFxuXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzInLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2VtYWlsJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnLFxuXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY291bnRyeScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3Bob25lJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnbm90ZScsXG4gICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZXRhaWxzIG9mIHRoZSBnaXZlbiBjdXN0b21lciBpZC5cbiAgICovXG4gIGdldEN1c3RvbWVyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEN1c3RvbWVyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGN1c3RvbWVyID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFjdXN0b21lcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0NVU1RPTUVSLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjdXN0b21lciB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmVuIGN1c3RvbWVyLlxuICAgKi9cbiAgZGVsZXRlQ3VzdG9tZXI6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQ3VzdG9tZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgY3VzdG9tZXIgPSBhd2FpdCBDdXN0b21lci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIWN1c3RvbWVyKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQ1VTVE9NRVIuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEN1c3RvbWVyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9XG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcGFyYW0sXG4gIHF1ZXJ5LFxuICB2YWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMuZXhjaGFuZ2VSYXRlcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZXhjaGFuZ2VSYXRlcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLmFkZEV4Y2hhbmdlUmF0ZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuYWRkRXhjaGFuZ2VSYXRlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEV4Y2hhbmdlUmF0ZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdEV4Y2hhbmdlUmF0ZS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvYnVsaycsXG4gICAgICB0aGlzLmJ1bGtEZWxldGVFeGNoYW5nZVJhdGVzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5idWxrRGVsZXRlRXhjaGFuZ2VSYXRlcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlRXhjaGFuZ2VSYXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVFeGNoYW5nZVJhdGUuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgZXhjaGFuZ2UgcmF0ZXMuXG4gICAqL1xuICBleGNoYW5nZVJhdGVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ3BhZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZV9zaXplJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgRXhjaGFuZ2VSYXRlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZXhjaGFuZ2VSYXRlcyA9IGF3YWl0IEV4Y2hhbmdlUmF0ZS5xdWVyeSgpXG4gICAgICAgIC5wYWdpbmF0aW9uKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGV4Y2hhbmdlX3JhdGVzOiBleGNoYW5nZVJhdGVzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgZXhjaGFuZ2UgcmF0ZSBvbiB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICovXG4gIGFkZEV4Y2hhbmdlUmF0ZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdleGNoYW5nZV9yYXRlJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2N1cnJlbmN5X2NvZGUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygnZGF0ZScpLmV4aXN0cygpLmlzSVNPODYwMSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgRXhjaGFuZ2VSYXRlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IGZvdW5kRXhjaGFuZ2VSYXRlID0gYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdjdXJyZW5jeV9jb2RlJywgZm9ybS5jdXJyZW5jeV9jb2RlKVxuICAgICAgICAud2hlcmUoJ2RhdGUnLCBmb3JtLmRhdGUpO1xuXG4gICAgICBpZiAoZm91bmRFeGNoYW5nZVJhdGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0VYQ0hBTkdFLlJBVEUuREFURS5QRVJJT0QuREVGSU5FRCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi5mb3JtLFxuICAgICAgICBkYXRlOiBtb21lbnQoZm9ybS5kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGV4Y2hhbmdlIHJhdGUuXG4gICAqL1xuICBlZGl0RXhjaGFuZ2VSYXRlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdleGNoYW5nZV9yYXRlJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvdW5kRXhjaGFuZ2VSYXRlID0gYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKTtcblxuICAgICAgaWYgKCFmb3VuZEV4Y2hhbmdlUmF0ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWENIQU5HRS5SQVRFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC51cGRhdGUoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmVuIGV4Y2hhbmdlIHJhdGUgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICovXG4gIGRlbGV0ZUV4Y2hhbmdlUmF0ZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgRXhjaGFuZ2VSYXRlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZm91bmRFeGNoYW5nZVJhdGUgPSBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZSgnaWQnLCBpZCk7XG5cbiAgICAgIGlmICghZm91bmRFeGNoYW5nZVJhdGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRVhDSEFOR0UuUkFURS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgRXhjaGFuZ2VSYXRlLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIGJ1bGtEZWxldGVFeGNoYW5nZVJhdGVzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2lkcycpLmlzQXJyYXkoeyBtaW46IDIgfSksXG4gICAgICBxdWVyeSgnaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBpZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBFeGNoYW5nZVJhdGUgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBcbiAgICAgIGNvbnN0IGV4Y2hhbmdlUmF0ZXMgPSBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuICAgICAgY29uc3QgZXhjaGFuZ2VSYXRlc0lkcyA9IGV4Y2hhbmdlUmF0ZXMubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRFeFJhdGVzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBleGNoYW5nZVJhdGVzSWRzKTtcbiAgICAgIFxuICAgICAgaWYgKG5vdEZvdW5kRXhSYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnRVhDSEFOR0UuUkFURVMuSVMuTk9ULkZPVU5EJywgY29kZTogMjAwLCBpZHM6IG5vdEZvdW5kRXhSYXRlcyB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBFeGNoYW5nZVJhdGUucXVlcnkoKS53aGVyZUluKCdpZCcsIGV4Y2hhbmdlUmF0ZXNJZHMpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZHM6IGV4Y2hhbmdlUmF0ZXNJZHMgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBwYXJhbSxcbiAgcXVlcnksXG4gIHZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGRpZmZlcmVuY2UsIHN1bUJ5LCBvbWl0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCBKb3VybmFsRW50cnkgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxFbnRyeSc7XG5pbXBvcnQgSldUQXV0aCBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9qd3RBdXRoJztcbmltcG9ydCB7XG4gIG1hcFZpZXdSb2xlc1RvQ29uZGl0aW9uYWxzLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcbmltcG9ydCB7XG4gIER5bmFtaWNGaWx0ZXIsXG4gIER5bmFtaWNGaWx0ZXJTb3J0QnksXG4gIER5bmFtaWNGaWx0ZXJWaWV3cyxcbiAgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzLFxufSBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgICByb3V0ZXIudXNlKEpXVEF1dGgpO1xuXG4gICAgcm91dGVyLnBvc3QoJy8nLFxuICAgICAgdGhpcy5uZXdFeHBlbnNlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdFeHBlbnNlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkL3B1Ymxpc2gnLFxuICAgICAgdGhpcy5wdWJsaXNoRXhwZW5zZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucHVibGlzaEV4cGVuc2UuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmRlbGV0ZSgnLzppZCcsXG4gICAgICB0aGlzLmRlbGV0ZUV4cGVuc2UudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZUV4cGVuc2UuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy51cGRhdGVFeHBlbnNlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy51cGRhdGVFeHBlbnNlLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5saXN0RXhwZW5zZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RFeHBlbnNlcy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvOmlkJyxcbiAgICAgIHRoaXMuZ2V0RXhwZW5zZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0RXhwZW5zZS5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG5ldyBleHBlbnNlLlxuICAgKi9cbiAgbmV3RXhwZW5zZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCdyZWZlcmVuY2Vfbm8nKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdwYXltZW50X2RhdGUnKS5pc0lTTzg2MDEoKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ3BheW1lbnRfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnZGVzY3JpcHRpb24nKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ2N1cnJlbmN5X2NvZGUnKS5vcHRpb25hbCgpLFxuICAgICAgY2hlY2soJ2V4Y2hhbmdlX3JhdGUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvRmxvYXQoKSxcbiAgICAgIGNoZWNrKCdwdWJsaXNoJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcblxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMnKS5leGlzdHMoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmV4cGVuc2VfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmFtb3VudCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5kZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gICAgICBjaGVjaygnY3VzdG9tX2ZpZWxkcycpLm9wdGlvbmFsKCkuaXNBcnJheSh7IG1pbjogMCB9KSxcbiAgICAgIGNoZWNrKCdjdXN0b21fZmllbGRzLioua2V5JykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgeyBFeHBlbnNlLCBFeHBlbnNlQ2F0ZWdvcnksIEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHB1Ymxpc2hlZDogZmFsc2UsXG4gICAgICAgIGN1c3RvbV9maWVsZHM6IFtdLFxuICAgICAgICBjYXRlZ29yaWVzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3QgdG90YWxBbW91bnQgPSBzdW1CeShmb3JtLmNhdGVnb3JpZXMsICdhbW91bnQnKTtcbiAgICAgIGNvbnN0IGV4cGVuc2VBY2NvdW50c0lkcyA9IGZvcm0uY2F0ZWdvcmllcy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuZXhwZW5zZV9hY2NvdW50X2lkKVxuXG4gICAgICBjb25zdCBzdG9yZWRFeHBlbnNlQWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBleHBlbnNlQWNjb3VudHNJZHMpO1xuICAgICAgY29uc3Qgc3RvcmVkRXhwZW5zZUFjY291bnRzSWRzID0gc3RvcmVkRXhwZW5zZUFjY291bnRzLm1hcChhID0+IGEuaWQpO1xuICAgICAgXG4gICAgICBjb25zdCBub3RTdG9yZWRFeHBlbnNlc0FjY291bnRzSWRzID0gZGlmZmVyZW5jZShleHBlbnNlQWNjb3VudHNJZHMsIHN0b3JlZEV4cGVuc2VBY2NvdW50c0lkcyk7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgY29uc3QgcGF5bWVudEFjY291bnQgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmUoJ2lkJywgZm9ybS5wYXltZW50X2FjY291bnRfaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghcGF5bWVudEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdQQVlNRU5ULkFDQ09VTlQuTk9ULkZPVU5EJywgY29kZTogNTAwLCBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAobm90U3RvcmVkRXhwZW5zZXNBY2NvdW50c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnRVhQRU5TRS5BQ0NPVU5UUy5JRFMuTk9ULlNUT1JFRCcsIGNvZGU6IDQwMCwgaWRzOiBub3RTdG9yZWRFeHBlbnNlc0FjY291bnRzSWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbEFtb3VudCA8PSAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1RPVEFMLkFNT1VOVC5FUVVBTFMuWkVSTycsIGNvZGU6IDMwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgXG4gICAgICBjb25zdCBleHBlbnNlVHJhbnNhY3Rpb24gPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgdG90YWxfYW1vdW50OiB0b3RhbEFtb3VudCxcbiAgICAgICAgcGF5bWVudF9hY2NvdW50X2lkOiBmb3JtLnBheW1lbnRfYWNjb3VudF9pZCxcbiAgICAgICAgcmVmZXJlbmNlX25vOiBmb3JtLnJlZmVyZW5jZV9ubyxcbiAgICAgICAgZGVzY3JpcHRpb246IGZvcm0uZGVzY3JpcHRpb24sXG4gICAgICAgIHBheW1lbnRfZGF0ZTogbW9tZW50KGZvcm0ucGF5bWVudF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdXNlcl9pZDogdXNlci5pZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RvcmVFeHBlbnNlQ2F0ZWdvcmllc09wZXIgPSBbXTtcblxuICAgICAgZm9ybS5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgIGNvbnN0IG9wZXIgPSBFeHBlbnNlQ2F0ZWdvcnkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGV4cGVuc2VfaWQ6IGV4cGVuc2VUcmFuc2FjdGlvbi5pZCxcbiAgICAgICAgICAuLi5jYXRlZ29yeSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0b3JlRXhwZW5zZUNhdGVnb3JpZXNPcGVyLnB1c2gob3Blcik7XG4gICAgICB9KTsgXG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxQb3N0ZXIgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgY29uc3QgbWl4aW5FbnRyeSA9IHtcbiAgICAgICAgcmVmZXJlbmNlVHlwZTogJ0V4cGVuc2UnLFxuICAgICAgICByZWZlcmVuY2VJZDogZXhwZW5zZVRyYW5zYWN0aW9uLmlkLFxuICAgICAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgICAgIGRyYWZ0OiAhZm9ybS5wdWJsaXNoLCAgXG4gICAgICB9O1xuICAgICAgY29uc3QgcGF5bWVudEpvdXJuYWxFbnRyeSA9IG5ldyBKb3VybmFsRW50cnkoe1xuICAgICAgICBjcmVkaXQ6IHRvdGFsQW1vdW50LFxuICAgICAgICBhY2NvdW50OiBwYXltZW50QWNjb3VudC5pZCxcbiAgICAgICAgLi4ubWl4aW5FbnRyeSxcbiAgICAgIH0pO1xuICAgICAgam91cm5hbFBvc3Rlci5jcmVkaXQocGF5bWVudEpvdXJuYWxFbnRyeSlcblxuICAgICAgZm9ybS5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGVuc2VKb3VybmFsRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBhY2NvdW50OiBjYXRlZ29yeS5leHBlbnNlX2FjY291bnRfaWQsXG4gICAgICAgICAgZGViaXQ6IGNhdGVnb3J5LmFtb3VudCxcbiAgICAgICAgICBub3RlOiBjYXRlZ29yeS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAuLi5taXhpbkVudHJ5LFxuICAgICAgICB9KTtcbiAgICAgICAgam91cm5hbFBvc3Rlci5kZWJpdChleHBlbnNlSm91cm5hbEVudHJ5KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5zdG9yZUV4cGVuc2VDYXRlZ29yaWVzT3BlcixcbiAgICAgICAgam91cm5hbFBvc3Rlci5zYXZlRW50cmllcygpLFxuICAgICAgICAoZm9ybS5zdGF0dXMpICYmIGpvdXJuYWxQb3N0ZXIuc2F2ZUJhbGFuY2UoKSxcbiAgICAgIF0pO1xuICAgICAgXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogZXhwZW5zZVRyYW5zYWN0aW9uLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggdGhlIGdpdmVuIGV4cGVuc2UgaWQuXG4gICAqL1xuICBwdWJsaXNoRXhwZW5zZToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgRXhwZW5zZSwgQWNjb3VudFRyYW5zYWN0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZXhwZW5zZSA9IGF3YWl0IEV4cGVuc2UucXVlcnkoKS5maW5kQnlJZChpZCk7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgaWYgKCFleHBlbnNlKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VYUEVOU0UuTk9ULkZPVU5EJywgY29kZTogMTAwIH0pO1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBlbnNlLnB1Ymxpc2hlZCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdFWFBFTlNFLkFMUkVBRFkuUFVCTElTSEVEJywgY29kZTogMjAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlSW4oJ3JlZmVyZW5jZV90eXBlJywgWydFeHBlbnNlJ10pXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX2lkJywgZXhwZW5zZS5pZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBhY2NvdW50c0RlcEdyYXBoID0gYXdhaXQgQWNjb3VudC5kZXBHcmFwaCgpLnF1ZXJ5KCkucmVtZW1iZXIoKTtcbiAgICAgIGNvbnN0IGpvdXJuYWwgPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0RlcEdyYXBoKTtcblxuICAgICAgam91cm5hbC5sb2FkRW50cmllcyh0cmFuc2FjdGlvbnMpO1xuICAgICAgam91cm5hbC5jYWxjdWxhdGVFbnRyaWVzQmFsYW5jZUNoYW5nZSgpO1xuXG4gICAgICBjb25zdCB1cGRhdGVBY2NUcmFuc2FjdGlvbnNPcGVyID0gQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBleHBlbnNlLmlkKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV90eXBlJywgJ0V4cGVuc2UnKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIGRyYWZ0OiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZUV4cGVuc2VPcGVyID0gRXhwZW5zZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBleHBlbnNlLmlkKVxuICAgICAgICAudXBkYXRlKHsgcHVibGlzaGVkOiB0cnVlIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZUFjY1RyYW5zYWN0aW9uc09wZXIsXG4gICAgICAgIHVwZGF0ZUV4cGVuc2VPcGVyLFxuICAgICAgICBqb3VybmFsLnNhdmVCYWxhbmNlKCksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHBhZ2luYXRlZCBleHBlbnNlcyBsaXN0LlxuICAgKi9cbiAgbGlzdEV4cGVuc2VzOiB7XG4gICAgdmFsaWRhdGlvbjogWyAgICAgIFxuICAgICAgcXVlcnkoJ3BhZ2UnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZV9zaXplJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcblxuICAgICAgcXVlcnkoJ2NvbHVtbl9zb3J0X2J5Jykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdzb3J0X29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIHNvcnRfb3JkZXI6ICdhc2MnLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICBwYWdlX3NpemU6IDE1LFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCB7IFJlc291cmNlLCBFeHBlbnNlLCBWaWV3IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBleHBlbnNlc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAucmVtZW1iZXIoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnZXhwZW5zZXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgXG4gICAgICBjb25zdCBleHBlbnNlc1Jlc291cmNlRmllbGRzID0gZXhwZW5zZXNSZXNvdXJjZS5maWVsZHMubWFwKGYgPT4gZi5rZXkpO1xuXG4gICAgICBpZiAoIWV4cGVuc2VzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWFBFTlNFUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuY3N1dG9tX3ZpZXdfaWQpIHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdpZCcsIGZpbHRlci5jc3V0b21fdmlld19pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnZmF2b3VyaXRlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NvbHVtbnMnKTtcbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoRXhwZW5zZS50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBDb2x1bW4gc29ydGluZy5cbiAgICAgIGlmIChmaWx0ZXIuY29sdW1uX3NvcnRfYnkpIHtcbiAgICAgICAgaWYgKGV4cGVuc2VzUmVzb3VyY2VGaWVsZHMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfYnkpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfYnksXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7ICAgICAgXG4gICAgICB9XG4gICAgICAvLyBDdXN0b20gdmlldyByb2xlcy5cbiAgICAgIGlmICh2aWV3ICYmIHZpZXcucm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2aWV3RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJWaWV3cyhcbiAgICAgICAgICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyh2aWV3LnJvbGVzKSxcbiAgICAgICAgICB2aWV3LnJvbGVzTG9naWNFeHByZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlld0ZpbHRlci52YWxpZGF0ZUZpbHRlclJvbGVzKCkpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdWSUVXLkxPR0lDLkVYUFJFU1NJT04uSU5WQUxJRCcsIGNvZGU6IDQwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcih2aWV3RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIGV4cGVuc2VzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdBQ0NPVU5UUy5SRVNPVVJDRS5IQVMuTk8uR0lWRU4uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cGVuc2VzID0gYXdhaXQgRXhwZW5zZS5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdwYXltZW50QWNjb3VudCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NhdGVnb3JpZXMnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCd1c2VyJyk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuICAgICAgfSkucGFnaW5hdGlvbihmaWx0ZXIucGFnZSAtIDEsIGZpbHRlci5wYWdlX3NpemUpOztcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgZXhwZW5zZXMsXG4gICAgICAgIHBhZ2Vfc2l6ZTogZmlsdGVyLnBhZ2Vfc2l6ZSxcbiAgICAgICAgcGFnZTogZmlsdGVyLnBhZ2UsXG4gICAgICAgIC4uLih2aWV3KSA/IHtcbiAgICAgICAgICB2aWV3Q29sdW1uczogdmlldy5jb2x1bW5zLFxuICAgICAgICAgIGN1c3RvbVZpZXdJZDogdmlldy5pZCxcbiAgICAgICAgIH0gOiB7fSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gZXhwZW5zZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGRlbGV0ZUV4cGVuc2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIEV4cGVuc2UsXG4gICAgICAgIEV4cGVuc2VDYXRlZ29yeSxcbiAgICAgICAgQWNjb3VudFRyYW5zYWN0aW9uLFxuICAgICAgICBBY2NvdW50LFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGV4cGVuc2UgPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghZXhwZW5zZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoeyBlcnJvcnM6IFt7XG4gICAgICAgICAgdHlwZTogJ0VYUEVOU0UuTk9ULkZPVU5EJywgY29kZTogMjAwLFxuICAgICAgICB9XSB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IEV4cGVuc2VDYXRlZ29yeS5xdWVyeSgpLndoZXJlKCdleHBlbnNlX2lkJywgaWQpLmRlbGV0ZSgpO1xuICAgICAgXG4gICAgICBjb25zdCBkZWxldGVFeHBlbnNlT3BlciA9IEV4cGVuc2UucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZGVsZXRlKCk7XG4gICAgICBjb25zdCBleHBlbnNlVHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfdHlwZScsICdFeHBlbnNlJylcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBleHBlbnNlLmlkKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNEZXBHcmFwaCA9IGF3YWl0IEFjY291bnQuZGVwR3JhcGgoKS5xdWVyeSgpLnJlbWVtYmVyKCk7XG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhleHBlbnNlVHJhbnNhY3Rpb25zKTtcbiAgICAgIGpvdXJuYWxFbnRyaWVzLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBkZWxldGVFeHBlbnNlT3BlcixcbiAgICAgICAgam91cm5hbEVudHJpZXMuZGVsZXRlRW50cmllcygpLFxuICAgICAgICBqb3VybmFsRW50cmllcy5zYXZlQmFsYW5jZSgpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIHVwZGF0ZUV4cGVuc2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ3JlZmVyZW5jZV9ubycpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3BheW1lbnRfZGF0ZScpLmlzSVNPODYwMSgpLm9wdGlvbmFsKCksXG4gICAgICBjaGVjaygncGF5bWVudF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpLm9wdGlvbmFsKCksXG4gICAgICBjaGVjaygnY3VycmVuY3lfY29kZScpLm9wdGlvbmFsKCksXG4gICAgICBjaGVjaygnZXhjaGFuZ2VfcmF0ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ3B1Ymxpc2gnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmlkJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmV4cGVuc2VfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcmllcy4qLmFtb3VudCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9GbG9hdCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3JpZXMuKi5kZXNjcmlwdGlvbicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB7IHVzZXIgfSA9IHJlcTtcbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgRXhwZW5zZSwgRXhwZW5zZUNhdGVnb3J5LCBBY2NvdW50VHJhbnNhY3Rpb24gfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZvcm0gPSB7XG4gICAgICAgIGNhdGVnb3JpZXM6IFtdLFxuICAgICAgICAuLi5yZXEuYm9keSxcbiAgICAgIH07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZm9ybS5jYXRlZ29yaWVzKSkge1xuICAgICAgICBmb3JtLmNhdGVnb3JpZXMgPSBbZm9ybS5jYXRlZ29yaWVzXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cGVuc2UgPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcmllcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIWV4cGVuc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdFWFBFTlNFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IHBheW1lbnRBY2NvdW50ID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBmb3JtLnBheW1lbnRfYWNjb3VudF9pZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCFwYXltZW50QWNjb3VudCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdQQVlNRU5ULkFDQ09VTlQuTk9ULkZPVU5EJywgY29kZTogNDAwIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgY2F0ZWdvcmllc0hhc05vSWQgPSBmb3JtLmNhdGVnb3JpZXMuZmlsdGVyKGMgPT4gIWMuaWQpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllc0hhc0lkID0gZm9ybS5jYXRlZ29yaWVzLmZpbHRlcihjID0+IGMuaWQpO1xuXG4gICAgICBjb25zdCBleHBlbnNlQ2F0ZWdvcmllc0lkcyA9IGV4cGVuc2UuY2F0ZWdvcmllcy5tYXAoKGMpID0+IGMuaWQpO1xuICAgICAgY29uc3QgZm9ybUV4cGVuc2VDYXRlZ29yaWVzSWRzID0gY2F0ZWdvcmllc0hhc0lkLm1hcChjID0+IGMuaWQpO1xuXG4gICAgICBjb25zdCBjYXRlZ29yaWVzSWRzRGVsZXRlZCA9IGRpZmZlcmVuY2UoXG4gICAgICAgIGZvcm1FeHBlbnNlQ2F0ZWdvcmllc0lkcywgZXhwZW5zZUNhdGVnb3JpZXNJZHMsXG4gICAgICApO1xuICAgICAgY29uc3QgY2F0ZWdvcmllc1Nob3VsZERlbGV0ZSA9IGRpZmZlcmVuY2UoXG4gICAgICAgIGV4cGVuc2VDYXRlZ29yaWVzSWRzLCBmb3JtRXhwZW5zZUNhdGVnb3JpZXNJZHMsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBmb3JtRXhwZW5zZXNBY2NvdW50c0lkcyA9IGZvcm0uY2F0ZWdvcmllcy5tYXAoYyA9PiBjLmV4cGVuc2VfYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBzdG9yZWRFeHBlbnNlQWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmb3JtRXhwZW5zZXNBY2NvdW50c0lkcyk7XG4gICAgICBjb25zdCBzdG9yZWRFeHBlbnNlQWNjb3VudHNJZHMgPSBzdG9yZWRFeHBlbnNlQWNjb3VudHMubWFwKGEgPT4gYS5pZCk7XG5cbiAgICAgIGNvbnN0IGV4cGVuc2VBY2NvdW50c0lkc05vdEZvdW5kID0gZGlmZmVyZW5jZShcbiAgICAgICAgZm9ybUV4cGVuc2VzQWNjb3VudHNJZHMsIHN0b3JlZEV4cGVuc2VBY2NvdW50c0lkcyxcbiAgICAgICk7IFxuICAgICAgY29uc3QgdG90YWxBbW91bnQgPSBzdW1CeShmb3JtLmNhdGVnb3JpZXMsICdhbW91bnQnKTtcblxuICAgICAgaWYgKGV4cGVuc2VBY2NvdW50c0lkc05vdEZvdW5kLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnRVhQRU5TRS5BQ0NPVU5UUy5JRFMuTk9ULkZPVU5EJywgY29kZTogNjAwLCBpZHM6IGV4cGVuc2VBY2NvdW50c0lkc05vdEZvdW5kIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjYXRlZ29yaWVzSWRzRGVsZXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VYUEVOU0UuQ0FURUdPUklFUy5JRFMuTk9ULkZPVU5EJywgY29kZTogMzAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsQW1vdW50IDw9IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVE9UQUwuQU1PVU5ULkVRVUFMUy5aRVJPJywgY29kZTogNTAwIH0pO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFsbCBlcnJvciByZWFzb25zLlxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwZW5zZUNhdGVnb3JpZXNNYXAgPSBuZXcgTWFwKGV4cGVuc2UuY2F0ZWdvcmllc1xuICAgICAgICAgIC5tYXAoY2F0ZWdvcnkgPT4gW2NhdGVnb3J5LmlkLCBjYXRlZ29yeV0pKTtcblxuICAgICAgY29uc3QgY2F0ZWdvcmllc0luc2VydE9wZXJzID0gW107XG4gICAgICBjb25zdCBjYXRlZ29yaWVzVXBkYXRlT3BlcnMgPSBbXTtcbiAgICAgIFxuICAgICAgY2F0ZWdvcmllc0hhc05vSWQuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgY29uc3Qgb3BlciA9IEV4cGVuc2VDYXRlZ29yeS5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgLi4uY2F0ZWdvcnksXG4gICAgICAgICAgZXhwZW5zZV9pZDogZXhwZW5zZS5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3JpZXNJbnNlcnRPcGVycy5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNhdGVnb3JpZXNIYXNJZC5mb3JFYWNoKChjYXRlZ29yeSkgPT4geyBcbiAgICAgICAgY29uc3Qgb3BlciA9IEV4cGVuc2VDYXRlZ29yeS5xdWVyeSgpLndoZXJlKCdpZCcsIGNhdGVnb3J5LmlkKVxuICAgICAgICAgIC5wYXRjaCh7XG4gICAgICAgICAgICAuLi5vbWl0KGNhdGVnb3J5LCBbJ2lkJ10pLFxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yaWVzVXBkYXRlT3BlcnMucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1cGRhdGVFeHBlbnNlT3BlciA9IEV4cGVuc2UucXVlcnkoKS53aGVyZSgnaWQnLCBpZClcbiAgICAgICAgLnVwZGF0ZSh7XG4gICAgICAgICAgcGF5bWVudF9kYXRlOiBtb21lbnQoZm9ybS5wYXltZW50X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgICAgIHRvdGFsX2Ftb3VudDogdG90YWxBbW91bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGZvcm0uZGVzY3JpcHRpb24sXG4gICAgICAgICAgcGF5bWVudF9hY2NvdW50X2lkOiBmb3JtLnBheW1lbnRfYWNjb3VudF9pZCxcbiAgICAgICAgICByZWZlcmVuY2Vfbm86IGZvcm0ucmVmZXJlbmNlX25vLFxuICAgICAgICB9KVxuXG4gICAgICBjb25zdCBkZWxldGVDYXRlZ29yaWVzT3BlciA9IChjYXRlZ29yaWVzU2hvdWxkRGVsZXRlLmxlbmd0aCA+IDApID9cbiAgICAgICAgRXhwZW5zZUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBjYXRlZ29yaWVzU2hvdWxkRGVsZXRlKS5kZWxldGUoKSA6IFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBqb3VybmFsIGVudHJpZXMuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCBbJ0V4cGVuc2UnXSlcbiAgICAgICAgLndoZXJlKCdyZWZlcmVuY2VfaWQnLCBleHBlbnNlLmlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzRGVwR3JhcGggPSBhd2FpdCBBY2NvdW50LmRlcEdyYXBoKCkucXVlcnkoKS5yZW1lbWJlcigpO1xuICAgICAgY29uc3Qgam91cm5hbCA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzRGVwR3JhcGgpO1xuXG4gICAgICBqb3VybmFsLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG4gICAgICBqb3VybmFsLnJlbW92ZUVudHJpZXMoKTtcblxuICAgICAgY29uc3QgbWl4aW5FbnRyeSA9IHtcbiAgICAgICAgcmVmZXJlbmNlVHlwZTogJ0V4cGVuc2UnLFxuICAgICAgICByZWZlcmVuY2VJZDogZXhwZW5zZS5pZCxcbiAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICBkcmFmdDogIWZvcm0ucHVibGlzaCwgIFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBheW1lbnRKb3VybmFsRW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgY3JlZGl0OiB0b3RhbEFtb3VudCxcbiAgICAgICAgYWNjb3VudDogcGF5bWVudEFjY291bnQuaWQsXG4gICAgICAgIC4uLm1peGluRW50cnksXG4gICAgICB9KTtcbiAgICAgIGpvdXJuYWwuY3JlZGl0KHBheW1lbnRKb3VybmFsRW50cnkpO1xuXG4gICAgICBmb3JtLmNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgSm91cm5hbEVudHJ5KHtcbiAgICAgICAgICBhY2NvdW50OiBjYXRlZ29yeS5leHBlbnNlX2FjY291bnRfaWQsXG4gICAgICAgICAgZGViaXQ6IGNhdGVnb3J5LmFtb3VudCxcbiAgICAgICAgICBub3RlOiBjYXRlZ29yeS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAuLi5taXhpbkVudHJ5LFxuICAgICAgICB9KTtcbiAgICAgICAgam91cm5hbC5kZWJpdChlbnRyeSk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAuLi5jYXRlZ29yaWVzSW5zZXJ0T3BlcnMsXG4gICAgICAgIC4uLmNhdGVnb3JpZXNVcGRhdGVPcGVycyxcbiAgICAgICAgdXBkYXRlRXhwZW5zZU9wZXIsXG4gICAgICAgIGRlbGV0ZUNhdGVnb3JpZXNPcGVyLFxuXG4gICAgICAgIGpvdXJuYWwuc2F2ZUVudHJpZXMoKSxcbiAgICAgICAgKGZvcm0uc3RhdHVzKSAmJiBqb3VybmFsLnNhdmVCYWxhbmNlKCksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRldGFpbHMgb2YgdGhlIGdpdmVuIGV4cGVuc2UgaWQuXG4gICAqL1xuICBnZXRFeHBlbnNlOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBFeHBlbnNlLCBBY2NvdW50VHJhbnNhY3Rpb24gfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGV4cGVuc2UgPSBhd2FpdCBFeHBlbnNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcmllcycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdwYXltZW50QWNjb3VudCcpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd1c2VyJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghZXhwZW5zZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0VYUEVOU0UuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3JlZmVyZW5jZV9pZCcsIGV4cGVuc2UuaWQpXG4gICAgICAgIC53aGVyZSgncmVmZXJlbmNlX3R5cGUnLCAnRXhwZW5zZScpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBleHBlbnNlOiB7XG4gICAgICAgICAgLi4uZXhwZW5zZSxcbiAgICAgICAgICBqb3VybmFsRW50cmllcyxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcblxuaW1wb3J0IEJhbGFuY2VTaGVldENvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL0JhbGFuY2VTaGVldCc7XG5pbXBvcnQgVHJpYWxCYWxhbmNlU2hlZXRDb250cm9sbGVyIGZyb20gJy4vRmluYW5jaWFsU3RhdGVtZW50cy9UcmlhbEJhbGFuY2VTaGVldCc7XG5pbXBvcnQgR2VuZXJhbExlZGdlckNvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL2dlbmVyYWxMZWRnZXInO1xuaW1wb3J0IEpvdXJuYWxTaGVldENvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL0pvdXJuYWxTaGVldCc7XG5pbXBvcnQgUHJvZml0TG9zc0NvbnRyb2xsZXIgZnJvbSAnLi9GaW5hbmNpYWxTdGF0ZW1lbnRzL1Byb2ZpdExvc3NTaGVldCc7XG5pbXBvcnQgUmVjZWl2YWJsZUFnaW5nU3VtbWFyeSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvUmVjZWl2YWJsZUFnaW5nU3VtbWFyeSc7XG5pbXBvcnQgUGF5YWJsZUFnaW5nU3VtbWFyeSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudHMvUGF5YWJsZUFnaW5nU3VtbWFyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnVzZSgnL2JhbGFuY2Vfc2hlZXQnLCBCYWxhbmNlU2hlZXRDb250cm9sbGVyLnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvcHJvZml0X2xvc3Nfc2hlZXQnLCBQcm9maXRMb3NzQ29udHJvbGxlci5yb3V0ZXIoKSk7XG4gICAgcm91dGVyLnVzZSgnL2dlbmVyYWxfbGVkZ2VyJywgR2VuZXJhbExlZGdlckNvbnRyb2xsZXIucm91dGVyKCkpO1xuICAgIHJvdXRlci51c2UoJy90cmlhbF9iYWxhbmNlX3NoZWV0JywgVHJpYWxCYWxhbmNlU2hlZXRDb250cm9sbGVyLnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvam91cm5hbCcsIEpvdXJuYWxTaGVldENvbnRyb2xsZXIucm91dGVyKCkpO1xuICAgIHJvdXRlci51c2UoJy9yZWNlaXZhYmxlX2FnaW5nX3N1bW1hcnknLCBSZWNlaXZhYmxlQWdpbmdTdW1tYXJ5LnJvdXRlcigpKTtcbiAgICByb3V0ZXIudXNlKCcvcGF5YWJsZV9hZ2luZ19zdW1tYXJ5JywgUGF5YWJsZUFnaW5nU3VtbWFyeS5yb3V0ZXIoKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxufTtcbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBvbWl0LCByZXZlcnNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCYXNlQ29udHJvbGxlciBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQmFzZUNvbnRyb2xsZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZ2luZ1JlcG9ydCBleHRlbmRzIEJhc2VDb250cm9sbGVye1xuXG4gIC8qKlxuICAgKiBFeHByZXNzIHZhbGlkYXRvciBtaWRkbGV3YXJlLiBcbiAgICogQHBhcmFtIHtSZXF1ZXN0fSByZXEgXG4gICAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlcyBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCBcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZVJlc3VsdHMocmVxLCByZXMsIG5leHQpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgbmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0ge0FycmF5fSBhZ2luZ1BlcmlvZHMgXG4gICAqIEBwYXJhbSB7TnVtZXJpY30gY3VzdG9tZXJCYWxhbmNlIFxuICAgKi9cbiAgc3RhdGljIGNvbnRhY3RBZ2luZ0JhbGFuY2UoYWdpbmdQZXJpb2RzLCByZWNlaXZhYmxlVG90YWxDcmVkaXQpIHtcbiAgICBsZXQgcHJldkFnaW5nID0gMDtcbiAgICBsZXQgcmVjZWl2YWJsZUNyZWRpdCA9IHJlY2VpdmFibGVUb3RhbENyZWRpdDtcbiAgICBsZXQgZGlmZiA9IHJlY2VpdmFibGVDcmVkaXQ7XG5cbiAgICBjb25zdCBwZXJpb2RzID0gcmV2ZXJzZShhZ2luZ1BlcmlvZHMpLm1hcCgoYWdpbmdQZXJpb2QpID0+IHsgXG4gICAgICBjb25zdCBhZ2luZ0Ftb3VudCA9IChhZ2luZ1BlcmlvZC5jbG9zaW5nQmFsYW5jZSAtIHByZXZBZ2luZyk7XG4gICAgICBjb25zdCBzdWJ0cmFjdCA9IE1hdGgubWluKGRpZmYsIGFnaW5nQW1vdW50KTtcbiAgICAgIGRpZmYgLT0gTWF0aC5taW4oYWdpbmdBbW91bnQsIGRpZmYpO1xuXG4gICAgICBjb25zdCB0b3RhbCA9IE1hdGgubWF4KGFnaW5nQW1vdW50IC0gc3VidHJhY3QsIDApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIC4uLm9taXQoYWdpbmdQZXJpb2QsIFsnY2xvc2luZ0JhbGFuY2UnXSksXG4gICAgICAgIHRvdGFsLFxuICAgICAgfTtcbiAgICAgIHByZXZBZ2luZyA9IGFnaW5nUGVyaW9kLmNsb3NpbmdCYWxhbmNlO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV2ZXJzZShwZXJpb2RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHsqfSBhc0RheSBcbiAgICogQHBhcmFtIHsqfSBhZ2luZ0RheXNCZWZvcmUgXG4gICAqIEBwYXJhbSB7Kn0gYWdpbmdQZXJpb2RzRnJlcSBcbiAgICovXG4gIHN0YXRpYyBhZ2luZ1JhbmdlUGVyaW9kcyhhc0RheSwgYWdpbmdEYXlzQmVmb3JlLCBhZ2luZ1BlcmlvZHNGcmVxKSB7XG4gICAgY29uc3QgdG90YWxBZ2luZ0RheXMgPSBhZ2luZ0RheXNCZWZvcmUgKiBhZ2luZ1BlcmlvZHNGcmVxO1xuICAgIGNvbnN0IHN0YXJ0QWdpbmcgPSBtb21lbnQoYXNEYXkpLnN0YXJ0T2YoJ2RheScpO1xuICAgIGNvbnN0IGVuZEFnaW5nID0gc3RhcnRBZ2luZy5jbG9uZSgpLnN1YnRyYWN0KCdkYXlzJywgdG90YWxBZ2luZ0RheXMpLmVuZE9mKCdkYXknKTtcblxuICAgIGNvbnN0IGFnaW5nUGVyaW9kcyA9IFtdO1xuICAgIGNvbnN0IHN0YXJ0aW5nQWdpbmcgPSBzdGFydEFnaW5nLmNsb25lKCk7XG5cbiAgICBsZXQgYmVmb3JlRGF5cyA9IDE7XG4gICAgbGV0IHRvRGF5cyA9IDA7XG5cbiAgICB3aGlsZSAoc3RhcnRpbmdBZ2luZyA+IGVuZEFnaW5nKSB7XG4gICAgICBjb25zdCBjdXJyZW50QWdpbmcgPSBzdGFydGluZ0FnaW5nLmNsb25lKCk7XG4gICAgICBzdGFydGluZ0FnaW5nLnN1YnRyYWN0KCdkYXlzJywgYWdpbmdEYXlzQmVmb3JlKS5lbmRPZignZGF5Jyk7XG4gICAgICB0b0RheXMgKz0gYWdpbmdEYXlzQmVmb3JlO1xuXG4gICAgICBhZ2luZ1BlcmlvZHMucHVzaCh7XG4gICAgICAgIGZyb21fcGVyaW9kOiBtb21lbnQoY3VycmVudEFnaW5nKS50b0RhdGUoKSxcbiAgICAgICAgdG9fcGVyaW9kOiBtb21lbnQoc3RhcnRpbmdBZ2luZykudG9EYXRlKCksXG4gICAgICAgIGJlZm9yZV9kYXlzOiBiZWZvcmVEYXlzID09PSAxID8gMCA6IGJlZm9yZURheXMsXG4gICAgICAgIHRvX2RheXM6IHRvRGF5cyxcbiAgICAgICAgLi4uKHN0YXJ0aW5nQWdpbmcudmFsdWVPZigpID09PSBlbmRBZ2luZy52YWx1ZU9mKCkpID8ge1xuICAgICAgICAgIHRvX3BlcmlvZDogbnVsbCxcbiAgICAgICAgICB0b19kYXlzOiBudWxsLFxuICAgICAgICB9IDoge30sXG4gICAgICB9KTtcbiAgICAgIGJlZm9yZURheXMgKz0gYWdpbmdEYXlzQmVmb3JlO1xuICAgIH1cbiAgICByZXR1cm4gYWdpbmdQZXJpb2RzO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0geyp9IGZpbHRlciBcbiAgICovXG4gIHN0YXRpYyBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlcikge1xuICAgIHJldHVybiAoYmFsYW5jZSkgPT4ge1xuICAgICAgbGV0IGZvcm1hdHRlZEJhbGFuY2UgPSBwYXJzZUZsb2F0KGJhbGFuY2UpO1xuICAgIFxuICAgICAgaWYgKGZpbHRlci5ub19jZW50cykge1xuICAgICAgICBmb3JtYXR0ZWRCYWxhbmNlID0gcGFyc2VJbnQoZm9ybWF0dGVkQmFsYW5jZSwgMTApO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlci5kaXZpZGVfMTAwMCkge1xuICAgICAgICBmb3JtYXR0ZWRCYWxhbmNlIC89IDEwMDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm9ybWF0dGVkQmFsYW5jZTtcbiAgICB9O1xuICB9XG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YsIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrLCBkaWZmZXJlbmNlLCBncm91cEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGRhdGVSYW5nZUNvbGxlY3Rpb24gfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJ1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyQ2xvc3VyZSB9IGZyb20gJy4vRmluYW5jaWFsU3RhdGVtZW50TWl4aW4nO1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLmdldCgnLycsIFxuICAgICAgdGhpcy5iYWxhbmNlU2hlZXQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJhbGFuY2VTaGVldC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuICBcbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBiYWxhbmNlIHNoZWV0LlxuICAgKi9cbiAgYmFsYW5jZVNoZWV0OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2FjY291bnRpbmdfbWV0aG9kJykub3B0aW9uYWwoKS5pc0luKFsnY2FzaCcsICdhY2N1cmFsJ10pLFxuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX3R5cGUnKS5vcHRpb25hbCgpLmlzSW4oWydkYXRlX3BlcmlvZHMnLCAndG90YWwnXSksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX2J5Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSwgY2hlY2tGYWxzeTogdHJ1ZSB9KVxuICAgICAgICAuaXNJbihbJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAncXVhcnRlciddKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0Lm5vX2NlbnRzJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0LmRpdmlkZV8xMDAwJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcycpLmlzQXJyYXkoKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50LCBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBkaXNwbGF5X2NvbHVtbnNfdHlwZTogJ3RvdGFsJyxcbiAgICAgICAgZGlzcGxheV9jb2x1bW5zX2J5OiAnJyxcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgICAgZGl2aWRlXzEwMDA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBub25lX3plcm86IGZhbHNlLFxuICAgICAgICBiYXNpczogJ2Nhc2gnLFxuICAgICAgICBhY2NvdW50X2lkczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLmFjY291bnRfaWRzKSkge1xuICAgICAgICBmaWx0ZXIuYWNjb3VudF9pZHMgPSBbZmlsdGVyLmFjY291bnRfaWRzXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWNjb3VudCBiYWxhbmNlIGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgICAgY29uc3QgYmFsYW5jZUZvcm1hdHRlciA9IGZvcm1hdE51bWJlckNsb3N1cmUoZmlsdGVyLm51bWJlcl9mb3JtYXQpO1xuICAgICAgY29uc3QgY29tcGFyYXRvckRhdGVUeXBlID0gZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnID8gJ2RheScgOiBmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX2J5O1xuXG4gICAgICBjb25zdCBiYWxhbmNlU2hlZXRUeXBlcyA9IGF3YWl0IEFjY291bnRUeXBlLnF1ZXJ5KCkud2hlcmUoJ2JhbGFuY2Vfc2hlZXQnLCB0cnVlKTtcblxuICAgICAgLy8gRmV0Y2ggYWxsIGJhbGFuY2Ugc2hlZXQgYWNjb3VudHMgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAgIC8vIC5yZW1lbWJlcignYmFsYW5jZV9zaGVldF9hY2NvdW50cycpXG4gICAgICAgIC53aGVyZUluKCdhY2NvdW50X3R5cGVfaWQnLCBiYWxhbmNlU2hlZXRUeXBlcy5tYXAoKGEpID0+IGEuaWQpKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJBY2NvdW50cycsIGZpbHRlci5hY2NvdW50X2lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHJhbnNhY3Rpb25zJylcbiAgICAgICAgLm1vZGlmeUdyYXBoKCd0cmFuc2FjdGlvbnMnLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdmaWx0ZXJEYXRlUmFuZ2UnLCBudWxsLCBmaWx0ZXIudG9fZGF0ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBBY2NvdW50cyBkZXBlbmRlbmN5IGdyYXBoLlxuICAgICAgY29uc3QgYWNjb3VudHNHcmFwaCA9IERlcGVuZGVuY3lHcmFwaC5mcm9tQXJyYXkoXG4gICAgICAgIGFjY291bnRzLCB7IGl0ZW1JZDogJ2lkJywgcGFyZW50SXRlbUlkOiAncGFyZW50QWNjb3VudElkJyB9XG4gICAgICApO1xuICAgICAgLy8gTG9hZCBhbGwgZW50cmllcyB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGFjY291bnRzLlxuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXNDb2xsZWN0ZWQgPSBBY2NvdW50LmNvbGxlY3RKb3VybmFsRW50cmllcyhhY2NvdW50cyk7XG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzR3JhcGgpO1xuXG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhqb3VybmFsRW50cmllc0NvbGxlY3RlZCk7XG5cbiAgICAgIC8vIERhdGUgcmFuZ2UgY29sbGVjdGlvbi4gXG4gICAgICBjb25zdCBkYXRlUmFuZ2VTZXQgPSAoZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJylcbiAgICAgICAgPyBkYXRlUmFuZ2VDb2xsZWN0aW9uKFxuICAgICAgICAgIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlLCBjb21wYXJhdG9yRGF0ZVR5cGUsXG4gICAgICAgICkgOiBbXTtcblxuICAgICAgLy8gR2V0cyB0aGUgZGF0ZSByYW5nZSBzZXQgZnJvbSBzdGFydCB0byBlbmQgZGF0ZS5cbiAgICAgIGNvbnN0IHRvdGFsUGVyaW9kcyA9IChhY2NvdW50KSA9PiAoe1xuICAgICAgICB0b3RhbF9wZXJpb2RzOiBkYXRlUmFuZ2VTZXQubWFwKChkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gam91cm5hbEVudHJpZXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCwgZGF0ZSwgY29tcGFyYXRvckRhdGVUeXBlKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYW1vdW50OiBiYWxhbmNlRm9ybWF0dGVyKGFtb3VudCksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzTWFwcGVyVG9SZXNwb25zZSA9IChhY2NvdW50KSA9PiB7XG4gICAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIGNsb3NpbmcgYmFsYW5jZSB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAgICAgY29uc3QgY2xvc2luZ0JhbGFuY2UgPSBqb3VybmFsRW50cmllcy5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50LmlkLCBmaWx0ZXIudG9fZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5waWNrKGFjY291bnQsIFsnaWQnLCAnaW5kZXgnLCAnbmFtZScsICdjb2RlJywgJ3BhcmVudEFjY291bnRJZCddKSxcblxuICAgICAgICAgIC8vIERhdGUgcGVyaW9kcyB3aGVuIGRpc3BsYXkgY29sdW1ucy5cbiAgICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYgdG90YWxQZXJpb2RzKGFjY291bnQpLFxuXG4gICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgIGFtb3VudDogY2xvc2luZ0JhbGFuY2UsXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYW1vdW50OiBiYWxhbmNlRm9ybWF0dGVyKGNsb3NpbmdCYWxhbmNlKSxcbiAgICAgICAgICAgIGRhdGU6IGZpbHRlci50b19kYXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXRyaWV2ZSBhbGwgYXNzZXRzIGFjY291bnRzLlxuICAgICAgY29uc3QgYXNzZXRzQWNjb3VudHMgPSBhY2NvdW50cy5maWx0ZXIoKGFjY291bnQpID0+IChcbiAgICAgICAgYWNjb3VudC50eXBlLm5vcm1hbCA9PT0gJ2RlYml0J1xuICAgICAgICAgICYmIChhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvKSkpXG4gICAgICAgICAgLm1hcChhY2NvdW50c01hcHBlclRvUmVzcG9uc2UpO1xuXG4gICAgICAvLyBSZXRyaWV2ZSBhbGwgbGlhYmlsaXR5IGFjY291bnRzLlxuICAgICAgY29uc3QgbGlhYmlsaXRpZXNBY2NvdW50cyA9IGFjY291bnRzLmZpbHRlcigoYWNjb3VudCkgPT4gKFxuICAgICAgICBhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0J1xuICAgICAgICAgICYmIChhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvKSkpXG4gICAgICAgICAgLm1hcChhY2NvdW50c01hcHBlclRvUmVzcG9uc2UpO1xuXG4gICAgICAvLyBSZXRyaWV2ZSB0aGUgYXNzZXQgYmFsYW5jZSBzaGVldC5cbiAgICAgIGNvbnN0IGFzc2V0c0FjY291bnRzUmVzcG9uc2UgPSBBY2NvdW50LnRvTmVzdGVkQXJyYXkoYXNzZXRzQWNjb3VudHMpO1xuXG4gICAgICAvLyBSZXRyaWV2ZSBsaWFiaWxpdGllcyBhbmQgZXF1aXR5IGJhbGFuY2Ugc2hlZXQuXG4gICAgICBjb25zdCBsaWFiaWxpdGllc0VxdWl0eVJlc3BvbnNlID0gQWNjb3VudC50b05lc3RlZEFycmF5KGxpYWJpbGl0aWVzQWNjb3VudHMpO1xuXG4gICAgICAvLyBSZXNwb25zZS5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHF1ZXJ5OiB7IC4uLmZpbHRlciB9LFxuICAgICAgICBjb2x1bW5zOiB7IC4uLmRhdGVSYW5nZVNldCB9LFxuICAgICAgICBhY2NvdW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdBc3NldHMnLFxuICAgICAgICAgICAgdHlwZTogJ2Fzc2V0cycsXG4gICAgICAgICAgICBjaGlsZHJlbjogWy4uLmFzc2V0c0FjY291bnRzUmVzcG9uc2VdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0xpYWJpbGl0aWVzICYgRXF1aXR5JyxcbiAgICAgICAgICAgIHR5cGU6ICdsaWFiaWxpdGllc19lcXVpdHknLFxuICAgICAgICAgICAgY2hpbGRyZW46IFsuLi5saWFiaWxpdGllc0VxdWl0eVJlc3BvbnNlXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJcblxuZXhwb3J0IGNvbnN0IGZvcm1hdE51bWJlckNsb3N1cmUgPSAoZmlsdGVyKSA9PiAoYmFsYW5jZSkgPT4ge1xuICBsZXQgZm9ybWF0dGVkQmFsYW5jZSA9IHBhcnNlRmxvYXQoYmFsYW5jZSk7XG5cbiAgaWYgKGZpbHRlci5ub19jZW50cykge1xuICAgIGZvcm1hdHRlZEJhbGFuY2UgPSBwYXJzZUludChmb3JtYXR0ZWRCYWxhbmNlLCAxMCk7XG4gIH1cbiAgaWYgKGZpbHRlci5kaXZpZGVfMTAwMCkge1xuICAgIGZvcm1hdHRlZEJhbGFuY2UgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gZm9ybWF0dGVkQmFsYW5jZTtcbn07IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YsIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBncm91cEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLCBcbiAgICAgIHRoaXMuam91cm5hbC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuam91cm5hbC5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbGVkZ2VyIHJlcG9ydCBvZiB0aGUgZ2l2ZW4gYWNjb3VudC5cbiAgICovXG4gIGpvdXJuYWw6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnZnJvbV9kYXRlJykub3B0aW9uYWwoKS5pc0lTTzg2MDEoKSxcbiAgICAgIHF1ZXJ5KCd0b19kYXRlJykub3B0aW9uYWwoKS5pc0lTTzg2MDEoKSxcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ3RyYW5zYWN0aW9uX3R5cGVzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgICBxdWVyeSgndHJhbnNhY3Rpb25fdHlwZXMuKicpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIF0sIFtcbiAgICAgICAgcXVlcnkoJ3RyYW5zYWN0aW9uX3R5cGVzJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBdKSxcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgICBxdWVyeSgnYWNjb3VudF9pZHMuKicpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIF0sIFtcbiAgICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgXSksXG4gICAgICBxdWVyeSgnZnJvbV9yYW5nZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCd0b19yYW5nZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0Lm5vX2NlbnRzJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdudW1iZXJfZm9ybWF0LmRpdmlkZV8xMDAwJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEFjY291bnRUcmFuc2FjdGlvbiB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgZnJvbV9yYW5nZTogbnVsbCxcbiAgICAgICAgdG9fcmFuZ2U6IG51bGwsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgdHJhbnNhY3Rpb25fdHlwZXM6IFtdLFxuICAgICAgICBudW1iZXJfZm9ybWF0OiB7XG4gICAgICAgICAgbm9fY2VudHM6IGZhbHNlLFxuICAgICAgICAgIGRpdmlkZV8xMDAwOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXMpKSB7XG4gICAgICAgIGZpbHRlci50cmFuc2FjdGlvbl90eXBlcyA9IFtmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXNdO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hY2NvdW50X2lkcykpIHtcbiAgICAgICAgZmlsdGVyLmFjY291bnRfaWRzID0gW2ZpbHRlci5hY2NvdW50X2lkc107XG4gICAgICB9XG4gICAgICBmaWx0ZXIuYWNjb3VudF9pZHMgPSBmaWx0ZXIuYWNjb3VudF9pZHMubWFwKChpZCkgPT4gcGFyc2VJbnQoaWQsIDEwKSk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzSm91cm5hbEVudHJpZXMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJEYXRlUmFuZ2UnLCBmaWx0ZXIuZnJvbV9kYXRlLCBmaWx0ZXIudG9fZGF0ZSlcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudF9pZHMpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlclRyYW5zYWN0aW9uVHlwZXMnLCBmaWx0ZXIudHJhbnNhY3Rpb25fdHlwZXMpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckFtb3VudFJhbmdlJywgZmlsdGVyLmZyb21fcmFuZ2UsIGZpbHRlci50b19yYW5nZSlcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2FjY291bnQudHlwZScpO1xuXG4gICAgICBjb25zdCBmb3JtYXROdW1iZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgICAgY29uc3Qgam91cm5hbEdyb3VwZWQgPSBncm91cEJ5KGFjY291bnRzSm91cm5hbEVudHJpZXMsXG4gICAgICAgIChlbnRyeSkgPT4gYCR7ZW50cnkucmVmZXJlbmNlSWR9LSR7ZW50cnkucmVmZXJlbmNlVHlwZX1gKTtcblxuICAgICAgY29uc3Qgam91cm5hbCA9IE9iamVjdC5rZXlzKGpvdXJuYWxHcm91cGVkKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbnNHcm91cCA9IGpvdXJuYWxHcm91cGVkW2tleV07XG5cbiAgICAgICAgY29uc3Qgam91cm5hbFBvc3RlciA9IG5ldyBKb3VybmFsUG9zdGVyKCk7XG4gICAgICAgIGpvdXJuYWxQb3N0ZXIubG9hZEVudHJpZXModHJhbnNhY3Rpb25zR3JvdXApO1xuXG4gICAgICAgIGNvbnN0IHRyaWFsQmFsYW5jZSA9IGpvdXJuYWxQb3N0ZXIuZ2V0VHJpYWxCYWxhbmNlKCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDoga2V5LFxuICAgICAgICAgIGVudHJpZXM6IHRyYW5zYWN0aW9uc0dyb3VwLFxuXG4gICAgICAgICAgY3JlZGl0OiB0cmlhbEJhbGFuY2UuY3JlZGl0LFxuICAgICAgICAgIGRlYml0OiB0cmlhbEJhbGFuY2UuZGViaXQsXG5cbiAgICAgICAgICBmb3JtYXR0ZWRfY3JlZGl0OiBmb3JtYXROdW1iZXIodHJpYWxCYWxhbmNlLmNyZWRpdCksXG4gICAgICAgICAgZm9ybWF0dGVkX2RlYml0OiBmb3JtYXROdW1iZXIodHJpYWxCYWxhbmNlLmRlYml0KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBxdWVyeTogeyAuLi5maWx0ZXIgfSxcbiAgICAgICAgam91cm5hbCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgXG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSB9IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEpvdXJuYWxQb3N0ZXIgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxQb3N0ZXInO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IEFnaW5nUmVwb3J0IGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzL0FnaW5nUmVwb3J0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGF5YWJsZUFnaW5nU3VtbWFyeSBleHRlbmRzIEFnaW5nUmVwb3J0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHN0YXRpYyByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoXG4gICAgICAnLycsXG4gICAgICB0aGlzLnBheWFibGVBZ2luZ1N1bW1hcnlSb2xlcygpLFxuICAgICAgdGhpcy52YWxpZGF0ZVJlc3VsdHMsXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy52YWxpZGF0ZVZlbmRvcnNJZHMuYmluZCh0aGlzKSksXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5wYXlhYmxlQWdpbmdTdW1tYXJ5LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICByZXR1cm4gcm91dGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcmVwb3J0IHZlbmRvcnMgaWRzIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlVmVuZG9yc0lkcyhyZXEsIHJlcywgbmV4dCkge1xuICAgIGNvbnN0IHsgVmVuZG9yIH0gPSByZXEubW9kZWxzO1xuXG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgdmVuZG9yc19pZHM6IFtdLFxuICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgIH07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci52ZW5kb3JzX2lkcykpIHtcbiAgICAgIGZpbHRlci52ZW5kb3JzX2lkcyA9IFtmaWx0ZXIudmVuZG9yc19pZHNdO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnZlbmRvcnNfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZEN1c3RvbWVycyA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlSW4oXG4gICAgICAgICdpZCcsXG4gICAgICAgIGZpbHRlci52ZW5kb3JzX2lkc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0b3JlZEN1c3RvbWVyc0lkcyA9IHN0b3JlZEN1c3RvbWVycy5tYXAoKGMpID0+IGMuaWQpO1xuICAgICAgY29uc3Qgbm90U3RvcmVkQ3VzdG9tZXJzSWRzID0gZGlmZmVyZW5jZShcbiAgICAgICAgc3RvcmVkQ3VzdG9tZXJzSWRzLFxuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIHZlbmRvcnNfaWRzXG4gICAgICApO1xuXG4gICAgICBpZiAobm90U3RvcmVkQ3VzdG9tZXJzSWRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZFTkRPUlMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIG5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNlaXZhYmxlIGFnaW5nIHN1bW1hcnkgdmFsaWRhdGlvbiByb2xlcy5cbiAgICovXG4gIHN0YXRpYyBwYXlhYmxlQWdpbmdTdW1tYXJ5Um9sZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHF1ZXJ5KCdhc19kYXRlJykub3B0aW9uYWwoKS5pc0lTTzg2MDEoKSxcbiAgICAgIHF1ZXJ5KCdhZ2luZ19kYXlzX2JlZm9yZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdhZ2luZ19wZXJpb2RzJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuMTAwMF9kaXZpZGUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ3ZlbmRvcnNfaWRzLionKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBwYXlhYmxlIGFnaW5nIHN1bW1hcnkgcmVwb3J0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBheWFibGVBZ2luZ1N1bW1hcnkocmVxLCByZXMpIHtcbiAgICBjb25zdCB7IEN1c3RvbWVyLCBBY2NvdW50LCBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgIGNvbnN0IHN0b3JlZFZlbmRvcnMgPSBhd2FpdCBDdXN0b21lci5xdWVyeSgpO1xuXG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgYXNfZGF0ZTogbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICBhZ2luZ19kYXlzX2JlZm9yZTogMzAsXG4gICAgICBhZ2luZ19wZXJpb2RzOiAzLFxuICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgIGRpdmlkZV8xMDAwOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICAuLi5yZXEucXVlcnksXG4gICAgfTtcbiAgICBjb25zdCBhY2NvdW50c1JlY2VpdmFibGVUeXBlID0gYXdhaXQgQWNjb3VudFR5cGUucXVlcnkoKVxuICAgICAgLndoZXJlKCdrZXknLCAnYWNjb3VudHNfcGF5YWJsZScpXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IGFjY291bnRzUmVjZWl2YWJsZSA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgLndoZXJlKCdhY2NvdW50X3R5cGVfaWQnLCBhY2NvdW50c1JlY2VpdmFibGVUeXBlLmlkKVxuICAgICAgLnJlbWVtYmVyKClcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgIC5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIG51bGwsIGZpbHRlci5hc19kYXRlKVxuICAgICAgLndoZXJlKCdhY2NvdW50X2lkJywgYWNjb3VudHNSZWNlaXZhYmxlLmlkKVxuICAgICAgLnJlbWVtYmVyKCk7XG5cbiAgICBjb25zdCBqb3VybmFsUG9zdGVyID0gbmV3IEpvdXJuYWxQb3N0ZXIoKTtcbiAgICBqb3VybmFsUG9zdGVyLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG5cbiAgICBjb25zdCBhZ2luZ1BlcmlvZHMgPSB0aGlzLmFnaW5nUmFuZ2VQZXJpb2RzKFxuICAgICAgZmlsdGVyLmFzX2RhdGUsXG4gICAgICBmaWx0ZXIuYWdpbmdfZGF5c19iZWZvcmUsXG4gICAgICBmaWx0ZXIuYWdpbmdfcGVyaW9kc1xuICAgICk7XG4gICAgLy8gVG90YWwgYW1vdW50IGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgIGNvbnN0IHRvdGFsRm9ybWF0dGVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG5cbiAgICBjb25zdCB2ZW5kb3JzID0gc3RvcmVkVmVuZG9ycy5tYXAoKHZlbmRvcikgPT4ge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0cmlhbCBiYWxhbmNlIHRvdGFsIG9mIHRoZSBnaXZlbiB2ZW5kb3IuXG4gICAgICBjb25zdCB2ZW5kb3JCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIHZlbmRvci5pZCxcbiAgICAgICAgJ3ZlbmRvcidcbiAgICAgICk7XG4gICAgICBjb25zdCBhZ2luZ0Nsb3NpbmdCYWxhbmNlID0gYWdpbmdQZXJpb2RzLm1hcCgoYWdpbmdQZXJpb2QpID0+IHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0cmlhbCBiYWxhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUgcGVyaW9kLlxuICAgICAgICBjb25zdCBhZ2luZ1RyaWFsQmFsYW5jZSA9IGpvdXJuYWxQb3N0ZXIuZ2V0Q29udGFjdFRyaWFsQmFsYW5jZShcbiAgICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgICAgdmVuZG9yLmlkLFxuICAgICAgICAgICd2ZW5kb3InLFxuICAgICAgICAgIGFnaW5nUGVyaW9kLmZyb21fcGVyaW9kXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWdpbmdQZXJpb2QsXG4gICAgICAgICAgY2xvc2luZ0JhbGFuY2U6IGFnaW5nVHJpYWxCYWxhbmNlLmRlYml0LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBhZ2luZyA9IHRoaXMuY29udGFjdEFnaW5nQmFsYW5jZShcbiAgICAgICAgYWdpbmdDbG9zaW5nQmFsYW5jZSxcbiAgICAgICAgdmVuZG9yQmFsYW5jZS5jcmVkaXRcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZW5kb3JfbmFtZTogdmVuZG9yLmRpc3BsYXlOYW1lLFxuICAgICAgICBhZ2luZzogYWdpbmcubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgZm9ybWF0dGVkX3RvdGFsOiB0b3RhbEZvcm1hdHRlcihpdGVtLnRvdGFsKSxcbiAgICAgICAgfSkpLFxuICAgICAgICB0b3RhbDogdmVuZG9yQmFsYW5jZS5iYWxhbmNlLFxuICAgICAgICBmb3JtYXR0ZWRfdG90YWw6IHRvdGFsRm9ybWF0dGVkKHZlbmRvckJhbGFuY2UuYmFsYW5jZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWdpbmdDbG9zaW5nQmFsYW5jZSA9IGFnaW5nUGVyaW9kcy5tYXAoKGFnaW5nUGVyaW9kKSA9PiB7XG4gICAgICBjb25zdCBjbG9zaW5nVHJpYWxCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIG51bGwsXG4gICAgICAgICd2ZW5kb3InLFxuICAgICAgICBhZ2luZ1BlcmlvZC5mcm9tX3BlcmlvZFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFnaW5nUGVyaW9kLFxuICAgICAgICBjbG9zaW5nQmFsYW5jZTogY2xvc2luZ1RyaWFsQmFsYW5jZS5iYWxhbmNlLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRvdGFsQ2xvc2luZ0JhbGFuY2UgPSBqb3VybmFsUG9zdGVyLmdldENvbnRhY3RUcmlhbEJhbGFuY2UoXG4gICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICBudWxsLFxuICAgICAgJ3ZlbmRvcidcbiAgICApO1xuICAgIGNvbnN0IGFnaW5nVG90YWwgPSB0aGlzLmNvbnRhY3RBZ2luZ0JhbGFuY2UoXG4gICAgICBhZ2luZ0Nsb3NpbmdCYWxhbmNlLFxuICAgICAgdG90YWxDbG9zaW5nQmFsYW5jZS5jcmVkaXRcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgIGNvbHVtbnM6IFsgLi4uYWdpbmdQZXJpb2RzIF0sXG4gICAgICBhZ2luZzoge1xuICAgICAgICB2ZW5kb3JzLFxuICAgICAgICB0b3RhbDogW1xuICAgICAgICAgIC4uLmFnaW5nVG90YWwubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIGZvcm1hdHRlZF90b3RhbDogdG90YWxGb3JtYXR0ZXIoaXRlbS50b3RhbCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YsIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGRhdGVSYW5nZUNvbGxlY3Rpb24gfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJywgXG4gICAgICB0aGlzLnByb2ZpdExvc3NTaGVldC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucHJvZml0TG9zc1NoZWV0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHByb2ZpdC9sb3NzIGZpbmFuY2lhbCBzdGF0ZW1lbnQuXG4gICAqL1xuICBwcm9maXRMb3NzU2hlZXQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5ub19jZW50cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5kaXZpZGVfMTAwMCcpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMnKS5pc0FycmF5KCkub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50X2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdkaXNwbGF5X2NvbHVtbnNfdHlwZScpLm9wdGlvbmFsKCkuaXNJbihbXG4gICAgICAgICd0b3RhbCcsICdkYXRlX3BlcmlvZHMnLFxuICAgICAgXSksXG4gICAgICBxdWVyeSgnZGlzcGxheV9jb2x1bW5zX2J5Jykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSwgY2hlY2tGYWxzeTogdHJ1ZSB9KVxuICAgICAgICAuaXNJbihbJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAncXVhcnRlciddKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IEFjY291bnQsIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICAgIG5vX2NlbnRzOiBmYWxzZSxcbiAgICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2lzOiAnYWNjdXJhbCcsXG4gICAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAgIGRpc3BsYXlfY29sdW1uc190eXBlOiAndG90YWwnLFxuICAgICAgICBkaXNwbGF5X2NvbHVtbnNfYnk6ICdtb250aCcsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIuYWNjb3VudF9pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50X2lkcyA9IFtmaWx0ZXIuYWNjb3VudF9pZHNdO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5jb21lU3RhdGVtZW50VHlwZXMgPSBhd2FpdCBBY2NvdW50VHlwZS5xdWVyeSgpLndoZXJlKCdpbmNvbWVfc2hlZXQnLCB0cnVlKTtcblxuICAgICAgLy8gRmV0Y2ggYWxsIGluY29tZSBhY2NvdW50cyBmcm9tIHN0b3JhZ2UuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoJ3Byb2ZpdF9sb3NzX2FjY291bnRzJylcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudF9pZHMpXG4gICAgICAgIC53aGVyZUluKCdhY2NvdW50X3R5cGVfaWQnLCBpbmNvbWVTdGF0ZW1lbnRUeXBlcy5tYXAoKHQpID0+IHQuaWQpKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHlwZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0cmFuc2FjdGlvbnMnKTtcblxuICAgICAgLy8gQWNjb3VudHMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgIGNvbnN0IGFjY291bnRzR3JhcGggPSBEZXBlbmRlbmN5R3JhcGguZnJvbUFycmF5KFxuICAgICAgICBhY2NvdW50cywgeyBpdGVtSWQ6ICdpZCcsIHBhcmVudEl0ZW1JZDogJ3BhcmVudEFjY291bnRJZCcgfVxuICAgICAgKTtcblxuICAgICAgLy8gRmlsdGVyIGFsbCBub25lIHplcm8gYWNjb3VudHMgaWYgaXQgd2FzIGVuYWJsZWQuXG4gICAgICBjb25zdCBmaWx0ZXJlZEFjY291bnRzID0gYWNjb3VudHMuZmlsdGVyKChhY2NvdW50KSA9PiAoXG4gICAgICAgIGFjY291bnQudHJhbnNhY3Rpb25zLmxlbmd0aCA+IDAgfHwgIWZpbHRlci5ub25lX3plcm9cbiAgICAgICkpO1xuICAgICAgY29uc3Qgam91cm5hbEVudHJpZXNDb2xsZWN0ZWQgPSBBY2NvdW50LmNvbGxlY3RKb3VybmFsRW50cmllcyhhY2NvdW50cyk7XG4gICAgICBjb25zdCBqb3VybmFsRW50cmllcyA9IG5ldyBKb3VybmFsUG9zdGVyKGFjY291bnRzR3JhcGgpO1xuICAgICAgam91cm5hbEVudHJpZXMubG9hZEVudHJpZXMoam91cm5hbEVudHJpZXNDb2xsZWN0ZWQpO1xuXG4gICAgICAvLyBBY2NvdW50IGJhbGFuY2UgZm9ybW1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBudW1iZXJGb3JtYXR0ZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcbiAgICAgIGNvbnN0IGNvbXBhcmF0b3JEYXRlVHlwZSA9IGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ3RvdGFsJ1xuICAgICAgICA/ICdkYXknIDogZmlsdGVyLmRpc3BsYXlfY29sdW1uc19ieTtcblxuICAgICAgLy8gR2V0cyB0aGUgZGF0ZSByYW5nZSBzZXQgZnJvbSBzdGFydCB0byBlbmQgZGF0ZS5cbiAgICAgIGNvbnN0IGRhdGVSYW5nZVNldCA9IGRhdGVSYW5nZUNvbGxlY3Rpb24oXG4gICAgICAgIGZpbHRlci5mcm9tX2RhdGUsXG4gICAgICAgIGZpbHRlci50b19kYXRlLFxuICAgICAgICBjb21wYXJhdG9yRGF0ZVR5cGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBhY2NvdW50c01hcHBlciA9IChpbmNvbWVFeHBlbnNlQWNjb3VudHMpID0+IChcbiAgICAgICAgaW5jb21lRXhwZW5zZUFjY291bnRzLm1hcCgoYWNjb3VudCkgPT4gKHtcbiAgICAgICAgICAuLi5waWNrKGFjY291bnQsIFsnaWQnLCAnaW5kZXgnLCAnbmFtZScsICdjb2RlJywgJ3BhcmVudEFjY291bnRJZCddKSxcblxuICAgICAgICAgIC8vIFRvdGFsIGNsb3NpbmcgYmFsYW5jZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAndG90YWwnKSAmJiB7XG4gICAgICAgICAgICB0b3RhbDogKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gam91cm5hbEVudHJpZXMuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCwgZmlsdGVyLnRvX2RhdGUpO1xuICAgICAgICAgICAgICByZXR1cm4geyBhbW91bnQsIGRhdGU6IGZpbHRlci50b19kYXRlLCBmb3JtYXR0ZWRfYW1vdW50OiBudW1iZXJGb3JtYXR0ZXIoYW1vdW50KSB9O1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIERhdGUgcGVyaW9kcyB3aGVuIGRpc3BsYXkgY29sdW1ucyB0eXBlIGBwZXJpb2RzYC5cbiAgICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYge1xuICAgICAgICAgICAgcGVyaW9kczogZGF0ZVJhbmdlU2V0Lm1hcCgoZGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0eXBlID0gY29tcGFyYXRvckRhdGVUeXBlO1xuICAgICAgICAgICAgICBjb25zdCBhbW91bnQgPSBqb3VybmFsRW50cmllcy5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50LmlkLCBkYXRlLCB0eXBlKTtcblxuICAgICAgICAgICAgICByZXR1cm4geyBkYXRlLCBhbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcihhbW91bnQpIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSkpO1xuXG4gICAgICBjb25zdCB0b3RhbEFjY291bnRzUmVkdWNlciA9IChpbmNvbWVFeHBlbnNlQWNjb3VudHMpID0+IChcbiAgICAgICAgaW5jb21lRXhwZW5zZUFjY291bnRzLnJlZHVjZSgoYWNjLCBhY2NvdW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gKGFjY291bnQpID8gYWNjb3VudC50b3RhbC5hbW91bnQgOiAwO1xuICAgICAgICAgIHJldHVybiBhbW91bnQgKyBhY2M7XG4gICAgICAgIH0sIDApKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNJbmNvbWUgPSBBY2NvdW50LnRvTmVzdGVkQXJyYXkoYWNjb3VudHNNYXBwZXIoZmlsdGVyZWRBY2NvdW50c1xuICAgICAgICAuZmlsdGVyKChhY2NvdW50KSA9PiBhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0JykpKTtcblxuICAgICAgY29uc3QgYWNjb3VudHNFeHBlbnNlcyA9IEFjY291bnQudG9OZXN0ZWRBcnJheShhY2NvdW50c01hcHBlcihmaWx0ZXJlZEFjY291bnRzXG4gICAgICAgIC5maWx0ZXIoKGFjY291bnQpID0+IGFjY291bnQudHlwZS5ub3JtYWwgPT09ICdkZWJpdCcpKSk7XG5cbiAgICAgIC8vIEByZXR1cm4ge0FycmF5fVxuICAgICAgY29uc3QgdG90YWxQZXJpb2RzTWFwcGVyID0gKGluY29tZUV4cGVuc2VBY2NvdW50cykgPT4gKFxuICAgICAgICBPYmplY3QudmFsdWVzKGRhdGVSYW5nZVNldC5yZWR1Y2UoKGFjYywgZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgYW1vdW50ID0gMDtcblxuICAgICAgICAgIGluY29tZUV4cGVuc2VBY2NvdW50cy5mb3JFYWNoKChhY2NvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGFjY291bnQucGVyaW9kc1tpbmRleF07XG4gICAgICAgICAgICBhbW91bnQgKz0gY3VycmVudERhdGUuYW1vdW50IHx8IDA7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWNjW2RhdGVdID0geyBkYXRlLCBhbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG51bWJlckZvcm1hdHRlcihhbW91bnQpIH07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pKSk7XG5cbiAgICAgIC8vIFRvdGFsIGluY29tZShkYXRlKSAtIFRvdGFsIGV4cGVuc2VzKGRhdGUpID0gTmV0IGluY29tZShkYXRlKVxuICAgICAgLy8gQHJldHVybiB7QXJyYXl9XG4gICAgICBjb25zdCBuZXRJbmNvbWVQZXJpb2RzTWFwcGVyID0gKHRvdGFsSW5jb21lQWNvY3VudHMsIHRvdGFsRXhwZW5zZUFjY291bnRzKSA9PiAoXG4gICAgICAgIGRhdGVSYW5nZVNldC5tYXAoKGRhdGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxJbmNvbWUgPSB0b3RhbEluY29tZUFjb2N1bnRzW2luZGV4XTtcbiAgICAgICAgICBjb25zdCB0b3RhbEV4cGVuc2VzID0gdG90YWxFeHBlbnNlQWNjb3VudHNbaW5kZXhdO1xuXG4gICAgICAgICAgbGV0IGFtb3VudCA9IHRvdGFsSW5jb21lLmFtb3VudCB8fCAwO1xuICAgICAgICAgIGFtb3VudCAtPSB0b3RhbEV4cGVuc2VzLmFtb3VudCB8fCAwO1xuICAgICAgICAgIHJldHVybiB7IGRhdGUsIGFtb3VudCwgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKGFtb3VudCkgfTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAvLyBAcmV0dXJuIHtPYmplY3R9XG4gICAgICBjb25zdCBuZXRJbmNvbWVUb3RhbCA9ICh0b3RhbEluY29tZSwgdG90YWxFeHBlbnNlcykgPT4ge1xuICAgICAgICBjb25zdCBuZXRJbmNvbWVBbW91bnQgPSB0b3RhbEluY29tZS5hbW91bnQgLSB0b3RhbEV4cGVuc2VzLmFtb3VudDtcbiAgICAgICAgcmV0dXJuIHsgYW1vdW50OiBuZXRJbmNvbWVBbW91bnQsIGZvcm1hdHRlZF9hbW91bnQ6IG5ldEluY29tZUFtb3VudCwgZGF0ZTogZmlsdGVyLnRvX2RhdGUgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGluY29tZVJlc3BvbnNlID0ge1xuICAgICAgICBlbnRyeV9ub3JtYWw6ICdjcmVkaXQnLFxuICAgICAgICBhY2NvdW50czogYWNjb3VudHNJbmNvbWUsXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCcpICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxJbmNvbWVBY2NvdW50cyA9IHRvdGFsQWNjb3VudHNSZWR1Y2VyKGFjY291bnRzSW5jb21lKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgYW1vdW50OiB0b3RhbEluY29tZUFjY291bnRzLFxuICAgICAgICAgICAgICBkYXRlOiBmaWx0ZXIudG9fZGF0ZSxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKHRvdGFsSW5jb21lQWNjb3VudHMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAuLi4oZmlsdGVyLmRpc3BsYXlfY29sdW1uc190eXBlID09PSAnZGF0ZV9wZXJpb2RzJykgJiYge1xuICAgICAgICAgIHRvdGFsX3BlcmlvZHM6IFtcbiAgICAgICAgICAgIC4uLnRvdGFsUGVyaW9kc01hcHBlcihhY2NvdW50c0luY29tZSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBleHBlbnNlUmVzcG9uc2UgPSB7XG4gICAgICAgIGVudHJ5X25vcm1hbDogJ2RlYml0JyxcbiAgICAgICAgYWNjb3VudHM6IGFjY291bnRzRXhwZW5zZXMsXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCcpICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxFeHBlbnNlc0FjY291bnRzID0gdG90YWxBY2NvdW50c1JlZHVjZXIoYWNjb3VudHNFeHBlbnNlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogdG90YWxFeHBlbnNlc0FjY291bnRzLFxuICAgICAgICAgICAgICBkYXRlOiBmaWx0ZXIudG9fZGF0ZSxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogbnVtYmVyRm9ybWF0dGVyKHRvdGFsRXhwZW5zZXNBY2NvdW50cyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pKCksXG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICdkYXRlX3BlcmlvZHMnKSAmJiB7XG4gICAgICAgICAgdG90YWxfcGVyaW9kczogW1xuICAgICAgICAgICAgLi4udG90YWxQZXJpb2RzTWFwcGVyKGFjY291bnRzRXhwZW5zZXMpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgbmV0SW5jb21lUmVzcG9uc2UgPSB7XG4gICAgICAgIC4uLihmaWx0ZXIuZGlzcGxheV9jb2x1bW5zX3R5cGUgPT09ICd0b3RhbCcpICYmIHtcbiAgICAgICAgICB0b3RhbDoge1xuICAgICAgICAgICAgLi4ubmV0SW5jb21lVG90YWwoaW5jb21lUmVzcG9uc2UudG90YWwsIGV4cGVuc2VSZXNwb25zZS50b3RhbCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGZpbHRlci5kaXNwbGF5X2NvbHVtbnNfdHlwZSA9PT0gJ2RhdGVfcGVyaW9kcycpICYmIHtcbiAgICAgICAgICB0b3RhbF9wZXJpb2RzOiBbXG4gICAgICAgICAgICAuLi5uZXRJbmNvbWVQZXJpb2RzTWFwcGVyKFxuICAgICAgICAgICAgICBpbmNvbWVSZXNwb25zZS50b3RhbF9wZXJpb2RzLFxuICAgICAgICAgICAgICBleHBlbnNlUmVzcG9uc2UudG90YWxfcGVyaW9kcyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBxdWVyeTogeyAuLi5maWx0ZXIgfSxcbiAgICAgICAgY29sdW1uczogWy4uLmRhdGVSYW5nZVNldF0sXG4gICAgICAgIHByb2ZpdExvc3M6IHtcbiAgICAgICAgICBpbmNvbWU6IGluY29tZVJlc3BvbnNlLFxuICAgICAgICAgIGV4cGVuc2VzOiBleHBlbnNlUmVzcG9uc2UsXG4gICAgICAgICAgbmV0X2luY29tZTogbmV0SW5jb21lUmVzcG9uc2UsXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59IiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBxdWVyeSwgb25lT2YgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBBZ2luZ1JlcG9ydCBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRmluYW5jaWFsU3RhdGVtZW50cy9BZ2luZ1JlcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY2VpdmFibGVBZ2luZ1N1bW1hcnkgZXh0ZW5kcyBBZ2luZ1JlcG9ydCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICBzdGF0aWMgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KFxuICAgICAgJy8nLFxuICAgICAgdGhpcy5yZWNlaXZhYmxlQWdpbmdTdW1tYXJ5Um9sZXMsXG4gICAgICB0aGlzLnZhbGlkYXRlUmVzdWx0cyxcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnZhbGlkYXRlQ3VzdG9tZXJzSWRzLmJpbmQodGhpcykpLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVjZWl2YWJsZUFnaW5nU3VtbWFyeS5iaW5kKHRoaXMpKVxuICAgICk7XG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHJlcG9ydCBjdXN0b21lcnMgaWRzIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlQ3VzdG9tZXJzSWRzKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgeyBDdXN0b21lciB9ID0gcmVxLm1vZGVscztcblxuICAgIGNvbnNvbGUubG9nKHJlcS5xdWVyeSk7XG5cbiAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICBjdXN0b21lcl9pZHM6IFtdLFxuICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgIH07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5jdXN0b21lcl9pZHMpKSB7XG4gICAgICBmaWx0ZXIuY3VzdG9tZXJfaWRzID0gW2ZpbHRlci5jdXN0b21lcl9pZHNdO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLmN1c3RvbWVyX2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzdG9yZWRDdXN0b21lcnMgPSBhd2FpdCBDdXN0b21lci5xdWVyeSgpLndoZXJlSW4oXG4gICAgICAgICdpZCcsXG4gICAgICAgIGZpbHRlci5jdXN0b21lcl9pZHNcbiAgICAgICk7XG4gICAgICBjb25zdCBzdG9yZWRDdXN0b21lcnNJZHMgPSBzdG9yZWRDdXN0b21lcnMubWFwKChjKSA9PiBwYXJzZUludChjLmlkLCAxMCkpO1xuICAgICAgY29uc3Qgbm90U3RvcmVkQ3VzdG9tZXJzSWRzID0gZGlmZmVyZW5jZShcbiAgICAgICAgZmlsdGVyLmN1c3RvbWVyX2lkcy5tYXAoYSA9PiBwYXJzZUludChhLCAxMCkpLFxuICAgICAgICBzdG9yZWRDdXN0b21lcnNJZHNcbiAgICAgICk7XG5cbiAgICAgIGlmIChub3RTdG9yZWRDdXN0b21lcnNJZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdDVVNUT01FUlMuSURTLk5PVC5GT1VORCcsXG4gICAgICAgICAgICAgIGNvZGU6IDMwMCxcbiAgICAgICAgICAgICAgaWRzOiBub3RTdG9yZWRDdXN0b21lcnNJZHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjZWl2YWJsZSBhZ2luZyBzdW1tYXJ5IHZhbGlkYXRpb24gcm9sZXMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlY2VpdmFibGVBZ2luZ1N1bW1hcnlSb2xlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcXVlcnkoJ2FzX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ2FnaW5nX2RheXNfYmVmb3JlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ2FnaW5nX3BlcmlvZHMnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC5ub19jZW50cycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnbnVtYmVyX2Zvcm1hdC4xMDAwX2RpdmlkZScpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBvbmVPZihcbiAgICAgICAgW1xuICAgICAgICAgIHF1ZXJ5KCdjdXN0b21lcl9pZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICAgICAgcXVlcnkoJ2N1c3RvbWVyX2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgW3F1ZXJ5KCdjdXN0b21lcl9pZHMnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCldXG4gICAgICApLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZWNlaXZhYmxlIGFnaW5nIHN1bW1hcnkgcmVwb3J0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlY2VpdmFibGVBZ2luZ1N1bW1hcnkocmVxLCByZXMpIHtcbiAgICBjb25zdCB7IEN1c3RvbWVyLCBBY2NvdW50LCBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnRUeXBlIH0gPSByZXEubW9kZWxzO1xuICAgIFxuICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgIGFzX2RhdGU6IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLFxuICAgICAgYWdpbmdfZGF5c19iZWZvcmU6IDMwLFxuICAgICAgYWdpbmdfcGVyaW9kczogMyxcbiAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgbm9fY2VudHM6IGZhbHNlLFxuICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY3VzdG9tZXJfaWRzOiBbXSxcbiAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAuLi5yZXEucXVlcnksXG4gICAgfTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLmN1c3RvbWVyX2lkcykpIHtcbiAgICAgIGZpbHRlci5jdXN0b21lcl9pZHMgPSBbZmlsdGVyLmN1c3RvbWVyX2lkc107XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkQ3VzdG9tZXJzID0gYXdhaXQgQ3VzdG9tZXIucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmN1c3RvbWVyX2lkcykge1xuICAgICAgICBidWlsZGVyLm1vZGlmeSgnZmlsdGVyQ3VzdG9tZXJJZHMnLCBmaWx0ZXIuY3VzdG9tZXJfaWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0pO1xuICAgIGNvbnN0IGFjY291bnRzUmVjZWl2YWJsZVR5cGUgPSBhd2FpdCBBY2NvdW50VHlwZS5xdWVyeSgpXG4gICAgICAud2hlcmUoJ2tleScsICdhY2NvdW50c19yZWNlaXZhYmxlJylcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgYWNjb3VudHNSZWNlaXZhYmxlID0gYXdhaXQgQWNjb3VudC5xdWVyeSgpXG4gICAgICAud2hlcmUoJ2FjY291bnRfdHlwZV9pZCcsIGFjY291bnRzUmVjZWl2YWJsZVR5cGUuaWQpXG4gICAgICAucmVtZW1iZXIoKVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCBBY2NvdW50VHJhbnNhY3Rpb24ucXVlcnkoKS5vbkJ1aWxkKChxdWVyeSkgPT4ge1xuICAgICAgcXVlcnkubW9kaWZ5KCdmaWx0ZXJEYXRlUmFuZ2UnLCBudWxsLCBmaWx0ZXIuYXNfZGF0ZSlcbiAgICAgIHF1ZXJ5LndoZXJlKCdhY2NvdW50X2lkJywgYWNjb3VudHNSZWNlaXZhYmxlLmlkKVxuICAgICAgcXVlcnkubW9kaWZ5KCdmaWx0ZXJDb250YWN0VHlwZScsICdjdXN0b21lcicpO1xuXG4gICAgICBpZiAoZmlsdGVyLmN1c3RvbWVyX2lkcy5sZW5ndGg+IDApIHtcbiAgICAgICAgcXVlcnkubW9kaWZ5KCdmaWx0ZXJDb250YWN0SWRzJywgZmlsdGVyLmN1c3RvbWVyX2lkcylcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJlbWVtYmVyKCk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBqb3VybmFsUG9zdGVyID0gbmV3IEpvdXJuYWxQb3N0ZXIoKTtcbiAgICBqb3VybmFsUG9zdGVyLmxvYWRFbnRyaWVzKHRyYW5zYWN0aW9ucyk7XG5cbiAgICBjb25zdCBhZ2luZ1BlcmlvZHMgPSB0aGlzLmFnaW5nUmFuZ2VQZXJpb2RzKFxuICAgICAgZmlsdGVyLmFzX2RhdGUsXG4gICAgICBmaWx0ZXIuYWdpbmdfZGF5c19iZWZvcmUsXG4gICAgICBmaWx0ZXIuYWdpbmdfcGVyaW9kc1xuICAgICk7XG4gICAgLy8gVG90YWwgYW1vdW50IGZvcm1tYXR0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5LlxuICAgIGNvbnN0IHRvdGFsRm9ybWF0dGVyID0gdGhpcy5mb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgIGNvbnN0IGN1c3RvbWVycyA9IHN0b3JlZEN1c3RvbWVycy5tYXAoKGN1c3RvbWVyKSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRyaWFsIGJhbGFuY2UgdG90YWwgb2YgdGhlIGdpdmVuIGN1c3RvbWVyLlxuICAgICAgY29uc3QgY3VzdG9tZXJCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIGN1c3RvbWVyLmlkLFxuICAgICAgICAnY3VzdG9tZXInXG4gICAgICApO1xuICAgICAgY29uc3QgYWdpbmdDbG9zaW5nQmFsYW5jZSA9IGFnaW5nUGVyaW9kcy5tYXAoKGFnaW5nUGVyaW9kKSA9PiB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdHJpYWwgYmFsYW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlIHBlcmlvZC5cbiAgICAgICAgY29uc3QgYWdpbmdUcmlhbEJhbGFuY2UgPSBqb3VybmFsUG9zdGVyLmdldENvbnRhY3RUcmlhbEJhbGFuY2UoXG4gICAgICAgICAgYWNjb3VudHNSZWNlaXZhYmxlLmlkLFxuICAgICAgICAgIGN1c3RvbWVyLmlkLFxuICAgICAgICAgICdjdXN0b21lcicsXG4gICAgICAgICAgYWdpbmdQZXJpb2QuZnJvbV9wZXJpb2RcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hZ2luZ1BlcmlvZCxcbiAgICAgICAgICBjbG9zaW5nQmFsYW5jZTogYWdpbmdUcmlhbEJhbGFuY2UuZGViaXQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFnaW5nID0gdGhpcy5jb250YWN0QWdpbmdCYWxhbmNlKFxuICAgICAgICBhZ2luZ0Nsb3NpbmdCYWxhbmNlLFxuICAgICAgICBjdXN0b21lckJhbGFuY2UuY3JlZGl0XG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VzdG9tZXJfbmFtZTogY3VzdG9tZXIuZGlzcGxheU5hbWUsXG4gICAgICAgIGFnaW5nOiBhZ2luZy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBmb3JtYXR0ZWRfdG90YWw6IHRvdGFsRm9ybWF0dGVyKGl0ZW0udG90YWwpLFxuICAgICAgICB9KSksXG4gICAgICAgIHRvdGFsOiBjdXN0b21lckJhbGFuY2UuYmFsYW5jZSxcbiAgICAgICAgZm9ybWF0dGVkX3RvdGFsOiB0b3RhbEZvcm1hdHRlcihjdXN0b21lckJhbGFuY2UuYmFsYW5jZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWdpbmdDbG9zaW5nQmFsYW5jZSA9IGFnaW5nUGVyaW9kcy5tYXAoKGFnaW5nUGVyaW9kKSA9PiB7XG4gICAgICBjb25zdCBjbG9zaW5nVHJpYWxCYWxhbmNlID0gam91cm5hbFBvc3Rlci5nZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgICAgICBhY2NvdW50c1JlY2VpdmFibGUuaWQsXG4gICAgICAgIG51bGwsXG4gICAgICAgICdjdXN0b21lcicsXG4gICAgICAgIGFnaW5nUGVyaW9kLmZyb21fcGVyaW9kXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWdpbmdQZXJpb2QsXG4gICAgICAgIGNsb3NpbmdCYWxhbmNlOiBjbG9zaW5nVHJpYWxCYWxhbmNlLmJhbGFuY2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgdG90YWxDbG9zaW5nQmFsYW5jZSA9IGpvdXJuYWxQb3N0ZXIuZ2V0Q29udGFjdFRyaWFsQmFsYW5jZShcbiAgICAgIGFjY291bnRzUmVjZWl2YWJsZS5pZCxcbiAgICAgIG51bGwsXG4gICAgICAnY3VzdG9tZXInXG4gICAgKTtcbiAgICBjb25zdCBhZ2luZ1RvdGFsID0gdGhpcy5jb250YWN0QWdpbmdCYWxhbmNlKFxuICAgICAgYWdpbmdDbG9zaW5nQmFsYW5jZSxcbiAgICAgIHRvdGFsQ2xvc2luZ0JhbGFuY2UuY3JlZGl0XG4gICAgKTtcblxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICBjb2x1bW5zOiBbLi4uYWdpbmdQZXJpb2RzXSxcbiAgICAgIGFnaW5nOiB7XG4gICAgICAgIGN1c3RvbWVycyxcbiAgICAgICAgdG90YWw6IFtcbiAgICAgICAgICAuLi5hZ2luZ1RvdGFsLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBmb3JtYXR0ZWRfdG90YWw6IHRvdGFsRm9ybWF0dGVyKGl0ZW0udG90YWwpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgSm91cm5hbFBvc3RlciBmcm9tICdAL3NlcnZpY2VzL0FjY291bnRpbmcvSm91cm5hbFBvc3Rlcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgRGVwZW5kZW5jeUdyYXBoIGZyb20gJ0AvbGliL0RlcGVuZGVuY3lHcmFwaCc7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXJDbG9zdXJlIH1mcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMudHJpYWxCYWxhbmNlU2hlZXQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnRyaWFsQmFsYW5jZVNoZWV0LmhhbmRsZXIpKTtcbiAgICBcbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgdHJpYWwgYmFsYW5jZSBzaGVldC5cbiAgICovXG4gIHRyaWFsQmFsYW5jZVNoZWV0OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Jhc2lzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdmcm9tX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ3RvX2RhdGUnKS5vcHRpb25hbCgpLmlzSVNPODYwMSgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuMTAwMF9kaXZpZGUnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ2FjY291bnRfaWRzJykuaXNBcnJheSgpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnYWNjb3VudF9pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBmcm9tX2RhdGU6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG9fZGF0ZTogbW9tZW50KCkuZW5kT2YoJ3llYXInKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgbnVtYmVyX2Zvcm1hdDoge1xuICAgICAgICAgIG5vX2NlbnRzOiBmYWxzZSxcbiAgICAgICAgICBkaXZpZGVfMTAwMDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2lzOiAnYWNjdXJhbCcsXG4gICAgICAgIG5vbmVfemVybzogZmFsc2UsXG4gICAgICAgIGFjY291bnRfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIuYWNjb3VudF9pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50X2lkcyA9IFtmaWx0ZXIuYWNjb3VudF9pZHNdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IEFjY291bnQucXVlcnkoKVxuICAgICAgICAvLyAucmVtZW1iZXIoJ3RyaWFsX2JhbGFuY2VfYWNjb3VudHMnKVxuICAgICAgICAubW9kaWZ5KCdmaWx0ZXJBY2NvdW50cycsIGZpbHRlci5hY2NvdW50X2lkcylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3R5cGUnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHJhbnNhY3Rpb25zJylcbiAgICAgICAgLm1vZGlmeUdyYXBoKCd0cmFuc2FjdGlvbnMnLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubW9kaWZ5KCdzdW1hdGlvbkNyZWRpdERlYml0Jyk7XG4gICAgICAgICAgYnVpbGRlci5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzQ29sbGVjdCA9IEFjY291bnQuY29sbGVjdEpvdXJuYWxFbnRyaWVzKGFjY291bnRzKTtcbiAgICAgIGNvbnN0IGpvdXJuYWxFbnRyaWVzID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNHcmFwaCk7XG4gICAgICBqb3VybmFsRW50cmllcy5sb2FkRW50cmllcyhqb3VybmFsRW50cmllc0NvbGxlY3QpO1xuXG4gICAgICAvLyBBY2NvdW50IGJhbGFuY2UgZm9ybW1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBiYWxhbmNlRm9ybWF0dGVyID0gZm9ybWF0TnVtYmVyQ2xvc3VyZShmaWx0ZXIubnVtYmVyX2Zvcm1hdCk7XG5cbiAgICAgIGNvbnN0IGFjY291bnRzUmVzcG9uc2UgPSBhY2NvdW50c1xuICAgICAgICAuZmlsdGVyKChhY2NvdW50KSA9PiAoXG4gICAgICAgICAgYWNjb3VudC50cmFuc2FjdGlvbnMubGVuZ3RoID4gMCB8fCAhZmlsdGVyLm5vbmVfemVyb1xuICAgICAgICApKVxuICAgICAgICAubWFwKChhY2NvdW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJpYWwgPSBqb3VybmFsRW50cmllcy5nZXRUcmlhbEJhbGFuY2VXaXRoRGVwYW5kcyhhY2NvdW50LmlkKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogYWNjb3VudC5pZCxcbiAgICAgICAgICAgIHBhcmVudEFjY291bnRJZDogYWNjb3VudC5wYXJlbnRBY2NvdW50SWQsXG4gICAgICAgICAgICBuYW1lOiBhY2NvdW50Lm5hbWUsXG4gICAgICAgICAgICBjb2RlOiBhY2NvdW50LmNvZGUsXG4gICAgICAgICAgICBhY2NvdW50Tm9ybWFsOiBhY2NvdW50LnR5cGUubm9ybWFsLFxuXG4gICAgICAgICAgICBjcmVkaXQ6IHRyaWFsLmNyZWRpdCxcbiAgICAgICAgICAgIGRlYml0OiB0cmlhbC5kZWJpdCxcbiAgICAgICAgICAgIGJhbGFuY2U6IHRyaWFsLmJhbGFuY2UsXG5cbiAgICAgICAgICAgIGZvcm1hdHRlZF9jcmVkaXQ6IGJhbGFuY2VGb3JtYXR0ZXIodHJpYWwuY3JlZGl0KSxcbiAgICAgICAgICAgIGZvcm1hdHRlZF9kZWJpdDogYmFsYW5jZUZvcm1hdHRlcih0cmlhbC5kZWJpdCksXG4gICAgICAgICAgICBmb3JtYXR0ZWRfYmFsYW5jZTogYmFsYW5jZUZvcm1hdHRlcih0cmlhbC5iYWxhbmNlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcXVlcnk6IHsgLi4uZmlsdGVyIH0sXG4gICAgICAgIGFjY291bnRzOiBbLi4uQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzUmVzcG9uc2UpIF0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufSIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBwaWNrLCBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBKb3VybmFsUG9zdGVyIGZyb20gJ0Avc2VydmljZXMvQWNjb3VudGluZy9Kb3VybmFsUG9zdGVyJztcbmltcG9ydCB7IGZvcm1hdE51bWJlckNsb3N1cmUgfSBmcm9tICcuL0ZpbmFuY2lhbFN0YXRlbWVudE1peGluJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBEZXBlbmRlbmN5R3JhcGggZnJvbSAnQC9saWIvRGVwZW5kZW5jeUdyYXBoJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJywgXG4gICAgICB0aGlzLmdlbmVyYWxMZWRnZXIudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdlbmVyYWxMZWRnZXIuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGdlbmVyYWwgbGVkZ2VyIGZpbmFuY2lhbCBzdGF0ZW1lbnQuXG4gICAqL1xuICBnZW5lcmFsTGVkZ2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2Zyb21fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgndG9fZGF0ZScpLm9wdGlvbmFsKCkuaXNJU084NjAxKCksXG4gICAgICBxdWVyeSgnYmFzaXMnKS5vcHRpb25hbCgpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQubm9fY2VudHMnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ251bWJlcl9mb3JtYXQuZGl2aWRlXzEwMDAnKS5vcHRpb25hbCgpLmlzQm9vbGVhbigpLnRvQm9vbGVhbigpLFxuICAgICAgcXVlcnkoJ25vbmVfemVybycpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG4gICAgICBxdWVyeSgnYWNjb3VudHNfaWRzJykub3B0aW9uYWwoKSxcbiAgICAgIHF1ZXJ5KCdhY2NvdW50c19pZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnb3JkZXJCeScpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnLCAnbmFtZScsICdjb2RlJ10pLFxuICAgICAgcXVlcnkoJ29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBBY2NvdW50VHJhbnNhY3Rpb24sIEFjY291bnQgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgZnJvbV9kYXRlOiBtb21lbnQoKS5zdGFydE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIHRvX2RhdGU6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXG4gICAgICAgIGJhc2lzOiAnY2FzaCcsXG4gICAgICAgIG51bWJlcl9mb3JtYXQ6IHtcbiAgICAgICAgICBub19jZW50czogZmFsc2UsXG4gICAgICAgICAgZGl2aWRlXzEwMDA6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBub25lX3plcm86IGZhbHNlLFxuICAgICAgICBhY2NvdW50c19pZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hY2NvdW50c19pZHMpKSB7XG4gICAgICAgIGZpbHRlci5hY2NvdW50c19pZHMgPSBbZmlsdGVyLmFjY291bnRzX2lkc107XG4gICAgICB9XG4gICAgICBmaWx0ZXIuYWNjb3VudHNfaWRzID0gZmlsdGVyLmFjY291bnRzX2lkcy5tYXAoKGlkKSA9PiBwYXJzZUludChpZCwgMTApKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGlmIChmaWx0ZXIuYWNjb3VudHNfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuYWNjb3VudHNfaWRzKTtcbiAgICAgICAgY29uc3QgYWNjb3VudHNJZHMgPSBhY2NvdW50cy5tYXAoKGEpID0+IGEuaWQpO1xuXG4gICAgICAgIGlmIChkaWZmZXJlbmNlKGZpbHRlci5hY2NvdW50c19pZHMsIGFjY291bnRzSWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnRklMVEVSLkFDQ09VTlRTLklEUy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnJvclJlYXNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcjogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBBY2NvdW50LnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKCdnZW5lcmFsX2xlZGdlcl9hY2NvdW50cycpXG4gICAgICAgIC5vcmRlckJ5KCdpbmRleCcsICdERVNDJylcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyQWNjb3VudHMnLCBmaWx0ZXIuYWNjb3VudHNfaWRzKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgndHlwZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd0cmFuc2FjdGlvbnMnKVxuICAgICAgICAubW9kaWZ5R3JhcGgoJ3RyYW5zYWN0aW9ucycsIChidWlsZGVyKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIGZpbHRlci5mcm9tX2RhdGUsIGZpbHRlci50b19kYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY291bnRzIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAgICBjb25zdCBhY2NvdW50c0dyYXBoID0gRGVwZW5kZW5jeUdyYXBoLmZyb21BcnJheShcbiAgICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICAgICk7XG4gXG4gICAgICBjb25zdCBvcGVuaW5nQmFsYW5jZVRyYW5zYWN0aW9ucyA9IGF3YWl0IEFjY291bnRUcmFuc2FjdGlvbi5xdWVyeSgpXG4gICAgICAgIC8vIC5yZW1lbWJlcigpXG4gICAgICAgIC5tb2RpZnkoJ2ZpbHRlckRhdGVSYW5nZScsIG51bGwsIGZpbHRlci5mcm9tX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ3N1bWF0aW9uQ3JlZGl0RGViaXQnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IGNsb3NpbmdCYWxhbmNlVHJhbnNhY3Rpb25zID0gYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnF1ZXJ5KClcbiAgICAgICAgLy8gLnJlbWVtYmVyKClcbiAgICAgICAgLm1vZGlmeSgnZmlsdGVyRGF0ZVJhbmdlJywgbnVsbCwgZmlsdGVyLnRvX2RhdGUpXG4gICAgICAgIC5tb2RpZnkoJ3N1bWF0aW9uQ3JlZGl0RGViaXQnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnYWNjb3VudC50eXBlJyk7XG5cbiAgICAgIGNvbnN0IG9wZWluZ0JhbGFuY2VDb2xsZWN0aW9uID0gbmV3IEpvdXJuYWxQb3N0ZXIoYWNjb3VudHNHcmFwaCk7XG4gICAgICBjb25zdCBjbG9zaW5nQmFsYW5jZUNvbGxlY3Rpb24gPSBuZXcgSm91cm5hbFBvc3RlcihhY2NvdW50c0dyYXBoKTtcblxuICAgICAgb3BlaW5nQmFsYW5jZUNvbGxlY3Rpb24ubG9hZEVudHJpZXMob3BlbmluZ0JhbGFuY2VUcmFuc2FjdGlvbnMpO1xuICAgICAgY2xvc2luZ0JhbGFuY2VDb2xsZWN0aW9uLmxvYWRFbnRyaWVzKGNsb3NpbmdCYWxhbmNlVHJhbnNhY3Rpb25zKTtcblxuICAgICAgLy8gVHJhbnNhY3Rpb24gYW1vdW50IGZvcm1hdHRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVlcnkuXG4gICAgICBjb25zdCBmb3JtYXROdW1iZXIgPSBmb3JtYXROdW1iZXJDbG9zdXJlKGZpbHRlci5udW1iZXJfZm9ybWF0KTtcblxuICAgICAgY29uc3QgYWNjb3VudHNSZXNwb25zZSA9IGFjY291bnRzXG4gICAgICAgIC5maWx0ZXIoKGFjY291bnQpID0+IChcbiAgICAgICAgICBhY2NvdW50LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwIHx8ICFmaWx0ZXIubm9uZV96ZXJvXG4gICAgICAgICkpXG4gICAgICAgIC5tYXAoKGFjY291bnQpID0+ICh7XG4gICAgICAgICAgLi4ucGljayhhY2NvdW50LCBbJ2lkJywgJ25hbWUnLCAnY29kZScsICdpbmRleCcsICdwYXJlbnRBY2NvdW50SWQnXSksXG4gICAgICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgICAgICAuLi5hY2NvdW50LnRyYW5zYWN0aW9ucy5tYXAoKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBhbW91bnQgPSAwO1xuXG4gICAgICAgICAgICAgIGlmIChhY2NvdW50LnR5cGUubm9ybWFsID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgICAgICAgIGFtb3VudCArPSB0cmFuc2FjdGlvbi5jcmVkaXQgLSB0cmFuc2FjdGlvbi5kZWJpdDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NvdW50LnR5cGUubm9ybWFsID09PSAnZGViaXQnKSB7XG4gICAgICAgICAgICAgICAgYW1vdW50ICs9IHRyYW5zYWN0aW9uLmRlYml0IC0gdHJhbnNhY3Rpb24uY3JlZGl0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGljayh0cmFuc2FjdGlvbiwgWydpZCcsICdub3RlJywgJ3RyYW5zYWN0aW9uVHlwZScsICdyZWZlcmVuY2VUeXBlJyxcbiAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VJZCcsICdkYXRlJywgJ2NyZWF0ZWRBdCddKSxcbiAgICAgICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogZm9ybWF0TnVtYmVyKGFtb3VudCksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG9wZW5pbmc6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcGVuaW5nQW1vdW50ID0gb3BlaW5nQmFsYW5jZUNvbGxlY3Rpb24uZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGU6IGZpbHRlci5mcm9tX2RhdGUsXG4gICAgICAgICAgICAgIGFtb3VudDogb3BlbmluZ0Ftb3VudCxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkX2Ftb3VudDogZm9ybWF0TnVtYmVyKG9wZW5pbmdBbW91bnQpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgY2xvc2luZzogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdBbW91bnQgPSBjbG9zaW5nQmFsYW5jZUNvbGxlY3Rpb24uZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudC5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGU6IGZpbHRlci50b19kYXRlLFxuICAgICAgICAgICAgICBhbW91bnQ6IGNsb3NpbmdBbW91bnQsXG4gICAgICAgICAgICAgIGZvcm1hdHRlZF9hbW91bnQ6IGZvcm1hdE51bWJlcihjbG9zaW5nQW1vdW50KSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHF1ZXJ5OiB7IC4uLmZpbHRlciB9LFxuICAgICAgICBhY2NvdW50czogQWNjb3VudC50b05lc3RlZEFycmF5KGFjY291bnRzUmVzcG9uc2UpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB1bmlxaWQgZnJvbSAndW5pcWlkJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBib2R5LFxuICBwYXJhbSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBtYWlsIGZyb20gJ0Avc2VydmljZXMvbWFpbCc7XG5pbXBvcnQgeyBoYXNoUGFzc3dvcmQgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBTeXN0ZW1Vc2VyIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Vc2VyJztcbmltcG9ydCBJbnZpdGUgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL0ludml0ZSc7XG5pbXBvcnQgVGVuYW50VXNlciBmcm9tICdAL21vZGVscy9UZW5hbnRVc2VyJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBUZW5hbnQgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1RlbmFudCc7XG5pbXBvcnQgVGVuYW50c01hbmFnZXIgZnJvbSAnQC9zeXN0ZW0vVGVuYW50c01hbmFnZXInO1xuaW1wb3J0IGp3dEF1dGggZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvand0QXV0aCc7XG5pbXBvcnQgVGVuYW5jeU1pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuaW1wb3J0IE9wdGlvbiBmcm9tICdAL21vZGVscy9PcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci51c2UoJy9zZW5kJywgand0QXV0aCk7XG4gICAgcm91dGVyLnVzZSgnL3NlbmQnLCBUZW5hbmN5TWlkZGxld2FyZSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL3NlbmQnLFxuICAgICAgdGhpcy5pbnZpdGUudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmludml0ZS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnL2FjY2VwdC86dG9rZW4nLFxuICAgICAgdGhpcy5hY2NlcHQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmFjY2VwdC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvaW52aXRlZC86dG9rZW4nLFxuICAgICAgdGhpcy5pbnZpdGVkLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbnZpdGVkLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludml0ZSBhIHVzZXIgdG8gdGhlIGF1dGhvcml6ZWQgdXNlciBvcmdhbml6YXRpb24uXG4gICAqL1xuICBpbnZpdGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBib2R5KCdlbWFpbCcpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCB7IFRlbmFudFVzZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3VuZFVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIGZvcm0uZW1haWwpLmZpcnN0KCk7ICAgICAgXG5cbiAgICAgIGlmIChmb3VuZFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSLkVNQUlMLkFMUkVBRFkuUkVHSVNURVJFRCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0b2tlbiA9IHVuaXFpZCgpO1xuICAgICAgY29uc3QgaW52aXRlID0gYXdhaXQgSW52aXRlLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgZW1haWw6IGZvcm0uZW1haWwsXG4gICAgICAgIHRlbmFudF9pZDogdXNlci50ZW5hbnRJZCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgZmlyc3RfbmFtZTogZm9ybS5lbWFpbCxcbiAgICAgICAgZW1haWw6IGZvcm0uZW1haWwsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgT3B0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3Qgb3JnYW5pemF0aW9uT3B0aW9ucyA9IGF3YWl0IE9wdGlvbi5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgna2V5JywgJ29yZ2FuaXphdGlvbl9uYW1lJyk7XG5cbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGdsb2JhbC5yb290UGF0aCwgJ3ZpZXdzL21haWwvVXNlckludml0ZS5odG1sJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgY29uc3QgcmVuZGVyZWQgPSBNdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsIHtcbiAgICAgICAgYWNjZXB0VXJsOiBgJHtyZXEucHJvdG9jb2x9Oi8vJHtyZXEuaG9zdG5hbWV9L2ludml0ZS9hY2NlcHQvJHtpbnZpdGUudG9rZW59YCxcbiAgICAgICAgZnVsbE5hbWU6IGAke3VzZXIuZmlyc3ROYW1lfSAke3VzZXIubGFzdE5hbWV9YCxcbiAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IHVzZXIubGFzdE5hbWUsXG4gICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICBvcmdhbml6YXRpb25OYW1lOiBvcmdhbml6YXRpb25PcHRpb25zLmdldE1ldGEoJ29yZ2FuaXphdGlvbl9uYW1lJyksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1haWxPcHRpb25zID0ge1xuICAgICAgICB0bzogdXNlci5lbWFpbCxcbiAgICAgICAgZnJvbTogYCR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX05BTUV9ICR7cHJvY2Vzcy5lbnYuTUFJTF9GUk9NX0FERFJFU1N9YCxcbiAgICAgICAgc3ViamVjdDogYCR7dXNlci5mdWxsTmFtZX0gaGFzIGludml0ZWQgeW91IHRvIGpvaW4gYSBCaWdjYXBpdGFsYCxcbiAgICAgICAgaHRtbDogcmVuZGVyZWQsXG4gICAgICB9O1xuICAgICAgbWFpbC5zZW5kTWFpbChtYWlsT3B0aW9ucywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWxlZCBzZW5kIHVzZXIgaW52aXRlIG1haWwnLCB7IGVycm9yLCBmb3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIExvZ2dlci5sb2coJ2luZm8nLCAnVXNlciBoYXMgYmVlbiBzZW50IGludml0ZSB1c2VyIGVtYWlsIHN1Y2Nlc3NmdWx5LicsIHsgZm9ybSB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBY2NlcHJ0IHRoZSBpbnZpYXRpb24uXG4gICAqL1xuICBhY2NlcHQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnZmlyc3RfbmFtZScpLmV4aXN0cygpLnRyaW0oKS5lc2NhcGUoKSxcbiAgICAgIGNoZWNrKCdsYXN0X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGhvbmVfbnVtYmVyJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3Bhc3N3b3JkJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgcGFyYW0oJ3Rva2VuJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0b2tlbiB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGludml0ZVRva2VuID0gYXdhaXQgSW52aXRlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCd0b2tlbicsIHRva2VuKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIWludml0ZVRva2VuKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSU5WSVRFLlRPS0VOLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3lzdGVtVXNlciA9IGF3YWl0IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Bob25lX251bWJlcicsIGZvcm0ucGhvbmVfbnVtYmVyKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZXJlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBwaG9uZSBudW1iZXIuXG4gICAgICBpZiAoc3lzdGVtVXNlciAmJiBzeXN0ZW1Vc2VyLnBob25lTnVtYmVyID09PSBmb3JtLnBob25lX251bWJlcikge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ1BIT05FX01VTU5FUi5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDQwMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBGaW5kIHRoZSB0ZW5hbnQgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiB0b2tlbi5cbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IFRlbmFudC5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpbnZpdGVUb2tlbi50ZW5hbnRJZCkuZmlyc3QoKTtcblxuICAgICAgY29uc3QgdGVuYW50RGIgPSBUZW5hbnRzTWFuYWdlci5rbmV4SW5zdGFuY2UodGVuYW50Lm9yZ2FuaXphdGlvbklkKTtcbiAgICAgIGNvbnN0IGhhc2hlZFBhc3N3b3JkID0gYXdhaXQgaGFzaFBhc3N3b3JkKGZvcm0ucGFzc3dvcmQpO1xuXG4gICAgICBjb25zdCB1c2VyRm9ybSA9IHtcbiAgICAgICAgZmlyc3RfbmFtZTogZm9ybS5maXJzdF9uYW1lLFxuICAgICAgICBsYXN0X25hbWU6IGZvcm0ubGFzdF9uYW1lLFxuICAgICAgICBlbWFpbDogaW52aXRlVG9rZW4uZW1haWwsXG4gICAgICAgIHBob25lX251bWJlcjogZm9ybS5waG9uZV9udW1iZXIsXG4gICAgICAgIGxhbmd1YWdlOiBmb3JtLmxhbmd1YWdlLFxuICAgICAgICBhY3RpdmU6IDEsXG4gICAgICB9O1xuICAgICAgVGVuYW50TW9kZWwua25leEJpbmRlZCA9IHRlbmFudERiO1xuXG4gICAgICBjb25zdCBmb3VuZFRlbmFudFVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcikuZmlyc3QoKTtcblxuICAgICAgaWYgKGZvdW5kVGVuYW50VXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1BIT05FX05VTUJFUi5BTFJFQURZLkVYSVNUUycsIGNvZGU6IDQwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydFVzZXJPcGVyID0gVGVuYW50VXNlci5iaW5kS25leCh0ZW5hbnREYilcbiAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdlbWFpbCcsIHVzZXJGb3JtLmVtYWlsKVxuICAgICAgICAucGF0Y2goe1xuICAgICAgICAgIC4uLnVzZXJGb3JtLFxuICAgICAgICAgIGludml0ZV9hY2NlcHRlZF9hdDogbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REJyksXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnNlcnRTeXNVc2VyT3BlciA9IFN5c3RlbVVzZXIucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi51c2VyRm9ybSxcbiAgICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxuICAgICAgICB0ZW5hbnRfaWQ6IGludml0ZVRva2VuLnRlbmFudElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlbGV0ZUludml0ZVRva2VuT3BlciA9IEludml0ZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgndG9rZW4nLCBpbnZpdGVUb2tlbi50b2tlbikuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW5zZXJ0VXNlck9wZXIsXG4gICAgICAgIGluc2VydFN5c1VzZXJPcGVyLFxuICAgICAgICBkZWxldGVJbnZpdGVUb2tlbk9wZXIsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBcbiAgICovXG4gIGludml0ZWQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndG9rZW4nKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHRva2VuIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgaW52aXRlVG9rZW4gPSBhd2FpdCBJbnZpdGUucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ3Rva2VuJywgdG9rZW4pLmZpcnN0KCk7XG5cbiAgICAgIGlmICghaW52aXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJTlZJVEUuVE9LRU4uTk9ULkZPVU5EJywgY29kZTogMzAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgdGhlIHRlbmFudCB0aGF0IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHRva2VuLlxuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgVGVuYW50LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGludml0ZVRva2VuLnRlbmFudElkKS5maXJzdCgpO1xuXG4gICAgICBjb25zdCB0ZW5hbnREYiA9IFRlbmFudHNNYW5hZ2VyLmtuZXhJbnN0YW5jZSh0ZW5hbnQub3JnYW5pemF0aW9uSWQpO1xuICAgICAgY29uc3Qgb3JnYW5pemF0aW9uT3B0aW9ucyA9IGF3YWl0IE9wdGlvbi5iaW5kS25leCh0ZW5hbnREYikucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2tleScsICdvcmdhbml6YXRpb25fbmFtZScpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uX25hbWU6IG9yZ2FuaXphdGlvbk9wdGlvbnMuZ2V0TWV0YSgnb3JnYW5pemF0aW9uX25hbWUnLCAnJykgICAgICAgICAgLFxuICAgICAgICAgIGludml0ZWRfZW1haWw6IGludml0ZVRva2VuLmVtYWlsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn0iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBwYXJhbSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICcuLi9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBEeW5hbWljRmlsdGVyLFxuICBEeW5hbWljRmlsdGVyU29ydEJ5LFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuaW1wb3J0IHtcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgICAvLyBjb25zdCBwZXJtaXQgPSBBdXRob3JpemF0aW9uKCdpdGVtc19jYXRlZ29yaWVzJyk7XG5cbiAgICByb3V0ZXIucG9zdCgnLzppZCcsXG4gICAgICB0aGlzLmVkaXRDYXRlZ29yeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdENhdGVnb3J5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3Q2F0ZWdvcnkudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLm5ld0NhdGVnb3J5LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy9idWxrJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUNhdGVnb3JpZXMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmJ1bGtEZWxldGVDYXRlZ29yaWVzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVJdGVtLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVJdGVtLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRDYXRlZ29yeS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0Q2F0ZWdvcnkuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldExpc3QudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldExpc3QuaGFuZGxlcikpO1xuXG4gICAgXG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGl0ZW0gY2F0ZWdvcnkuXG4gICAqL1xuICBuZXdDYXRlZ29yeToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGNoZWNrKCduYW1lJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3BhcmVudF9jYXRlZ29yeV9pZCcpXG4gICAgICAgIC5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlLCBjaGVja0ZhbHN5OiB0cnVlIH0pXG4gICAgICAgIC5pc051bWVyaWMoKVxuICAgICAgICAudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdkZXNjcmlwdGlvbicpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLmVzY2FwZSgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBpZiAoZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgY29uc3QgZm91bmRQYXJlbnRDYXRlZ29yeSA9IGF3YWl0IEl0ZW1DYXRlZ29yeS5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlKCdpZCcsIGZvcm0ucGFyZW50X2NhdGVnb3J5X2lkKVxuICAgICAgICAgIC5maXJzdCgpO1xuXG4gICAgICAgIGlmICghZm91bmRQYXJlbnRDYXRlZ29yeSkge1xuICAgICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZCgnVGhlIHBhcmVudCBjYXRlZ29yeSBJRCBpcyBub3QgZm91bmQuJywge1xuICAgICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUEFSRU5UX0NBVEVHT1JZX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAuLi5mb3JtLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjYXRlZ29yeSB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IGRldGFpbHMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5IGl0ZW0uXG4gICAqL1xuICBlZGl0Q2F0ZWdvcnk6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS50b0ludCgpLFxuICAgICAgY2hlY2soJ25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBjaGVjaygncGFyZW50X2NhdGVnb3J5X2lkJylcbiAgICAgICAgLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUsIGNoZWNrRmFsc3k6IHRydWUgfSlcbiAgICAgICAgLmlzTnVtZXJpYygpXG4gICAgICAgIC50b0ludCgpLFxuICAgICAgY2hlY2soJ2Rlc2NyaXB0aW9uJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLFxuICAgICAgICAgIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuICAgICAgY29uc3QgeyBJdGVtQ2F0ZWdvcnkgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpdGVtQ2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIWl0ZW1DYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU1fQ0FURUdPUlkuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWRcbiAgICAgICAgJiYgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQgIT09IGl0ZW1DYXRlZ29yeS5wYXJlbnRfY2F0ZWdvcnlfaWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmb3VuZFBhcmVudENhdGVnb3J5ID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KClcbiAgICAgICAgICAud2hlcmUoJ2lkJywgZm9ybS5wYXJlbnRfY2F0ZWdvcnlfaWQpXG4gICAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgICAgaWYgKCFmb3VuZFBhcmVudENhdGVnb3J5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCdUaGUgcGFyZW50IGNhdGVnb3J5IElEIGlzIG5vdCBmb3VuZC4nLCB7XG4gICAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdQQVJFTlRfQ0FURUdPUllfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVJdGVtQ2F0ZWdvcnkgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpXG4gICAgICAgIC51cGRhdGUoeyAuLi5mb3JtIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGdpdmUgaXRlbSBjYXRlZ29yeS5cbiAgICovXG4gIGRlbGV0ZUl0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5ID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCFpdGVtQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaXRlbUNhdGVnb3J5LmlkKVxuICAgICAgICAuZGVsZXRlKCk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKi9cbiAgZ2V0TGlzdDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIEl0ZW1DYXRlZ29yeSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXNSZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCduYW1lJywgJ2l0ZW1zX2NhdGVnb3JpZXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghY2F0ZWdvcmllc1Jlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTVMuQ0FURUdPUklFUy5SRVNPVVJDRS5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGNvbHVtbl9zb3J0X29yZGVyOiAnJyxcbiAgICAgICAgc29ydF9vcmRlcjogJycsXG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcykge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyX3JvbGVzID0gSlNPTi5wYXJzZShmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gY2F0ZWdvcmllc1Jlc291cmNlLmZpZWxkcy5tYXAoKGMpID0+IGMua2V5KTtcbiAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlcihJdGVtQ2F0ZWdvcnkudGFibGVOYW1lKTtcblxuICAgICAgLy8gRHluYW1pYyBmaWx0ZXIgd2l0aCBmaWx0ZXIgcm9sZXMuXG4gICAgICBpZiAoZmlsdGVyLmZpbHRlcl9yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhY2NvdW50cyByZXNvdXJjZSBmaWVsZHMuXG4gICAgICAgIGNvbnN0IGZpbHRlclJvbGVzID0gbmV3IER5bmFtaWNGaWx0ZXJGaWx0ZXJSb2xlcyhcbiAgICAgICAgICBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcihmaWx0ZXIuZmlsdGVyX3JvbGVzKSxcbiAgICAgICAgICBjYXRlZ29yaWVzUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBjYXRlZ29yaWVzUmVzb3VyY2Uuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJVEVNUy5SRVNPVVJDRS5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggY29sdW1uIHNvcnQgb3JkZXIuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIsXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBhd2FpdCBJdGVtQ2F0ZWdvcnkucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuYnVpbGRRdWVyeSgpKGJ1aWxkZXIpO1xuXG4gICAgICAgIGJ1aWxkZXIuc2VsZWN0KFtcbiAgICAgICAgICAnKicsXG4gICAgICAgICAgSXRlbUNhdGVnb3J5LnJlbGF0ZWRRdWVyeSgnaXRlbXMnKS5jb3VudCgpLmFzKCdjb3VudCcpLFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBjYXRlZ29yaWVzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRldGFpbHMgb2YgdGhlIGdpdmVuIGNhdGVnb3J5LlxuICAgKi9cbiAgZ2V0Q2F0ZWdvcnk6IHtcbiAgICB2YWxpZGF0aW9uOiBbcGFyYW0oJ2NhdGVnb3J5X2lkJykudG9JbnQoKV0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBjYXRlZ29yeV9pZDogY2F0ZWdvcnlJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbUNhdGVnb3J5IH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IEl0ZW1DYXRlZ29yeS53aGVyZSgnaWQnLCBjYXRlZ29yeUlkKS5mZXRjaCgpO1xuXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdDQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgY2F0ZWdvcnk6IGl0ZW0udG9KU09OKCkgfSk7XG4gICAgfSxcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBCdWxrIGRlbGV0ZSB0aGUgZ2l2ZW4gaXRlbSBjYXRlZ29yaWVzLlxuICAgKi9cbiAgYnVsa0RlbGV0ZUNhdGVnb3JpZXM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuaXNBcnJheSh7IG1pbjogMiB9KSxcbiAgICAgIHF1ZXJ5KCdpZHMuKicpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICBpZHM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBJdGVtQ2F0ZWdvcnkgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBcbiAgICAgIGNvbnN0IGl0ZW1DYXRlZ29yaWVzID0gYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKTtcbiAgICAgIGNvbnN0IGl0ZW1DYXRlZ29yaWVzSWRzID0gaXRlbUNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuaWQpO1xuICAgICAgY29uc3Qgbm90Rm91bmRDYXRlZ29yaWVzID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBpdGVtQ2F0ZWdvcmllc0lkcyk7XG5cbiAgICAgIGlmIChub3RGb3VuZENhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU0uQ0FURUdPUklFUy5JRFMuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgSXRlbUNhdGVnb3J5LnF1ZXJ5KCkud2hlcmVJbignaWQnLCBmaWx0ZXIuaWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgaWRzOiBmaWx0ZXIuaWRzIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVjaywgcXVlcnksIHZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuaW1wb3J0IExvZ2dlciBmcm9tICdAL3NlcnZpY2VzL0xvZ2dlcic7XG5cbmNvbnN0IGZzUHJvbWlzZXMgPSBmcy5wcm9taXNlcztcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvOmlkJyxcbiAgICAgIHRoaXMuZWRpdEl0ZW0udmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmVkaXRJdGVtLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3SXRlbS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubmV3SXRlbS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOmlkJyxcbiAgICAgIHRoaXMuZGVsZXRlSXRlbS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZGVsZXRlSXRlbS5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuYnVsa0RlbGV0ZUl0ZW1zLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5idWxrRGVsZXRlSXRlbXMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RJdGVtcy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubGlzdEl0ZW1zLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaXRlbS5cbiAgICovXG4gIG5ld0l0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ3R5cGUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKClcbiAgICAgICAgLmlzSW4oWydzZXJ2aWNlJywgJ25vbi1pbnZlbnRvcnknLCAnaW52ZW50b3J5J10pLFxuICAgICAgY2hlY2soJ3NrdScpLm9wdGlvbmFsKHsgbnVsbGFibGU6IHRydWUgfSkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ2Nvc3RfcHJpY2UnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0Zsb2F0KCksXG4gICAgICBjaGVjaygnc2VsbF9wcmljZScpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvRmxvYXQoKSxcbiAgICAgIGNoZWNrKCdjb3N0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc0ludCgpLnRvSW50KCksXG4gICAgICBjaGVjaygnc2VsbF9hY2NvdW50X2lkJykuZXhpc3RzKCkuaXNJbnQoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2ludmVudG9yeV9hY2NvdW50X2lkJylcbiAgICAgICAgLmlmKGNoZWNrKCd0eXBlJykuZXF1YWxzKCdpbnZlbnRvcnknKSlcbiAgICAgICAgLmV4aXN0cygpXG4gICAgICAgIC5pc0ludCgpXG4gICAgICAgIC50b0ludCgpLFxuICAgICAgY2hlY2soJ2NhdGVnb3J5X2lkJykub3B0aW9uYWwoeyBudWxsYWJsZTogdHJ1ZSB9KS5pc0ludCgpLnRvSW50KCksXG5cbiAgICAgIGNoZWNrKCdjdXN0b21fZmllbGRzJykub3B0aW9uYWwoKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi5rZXknKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgY2hlY2soJ2N1c3RvbV9maWVsZHMuKi52YWx1ZScpLmV4aXN0cygpLFxuXG4gICAgICBjaGVjaygnbm90ZScpLm9wdGlvbmFsKCksXG5cbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoKSxcbiAgICAgIGNoZWNrKCdtZWRpYV9pZHMuKicpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBjdXN0b21fZmllbGRzOiBbXSxcbiAgICAgICAgbWVkaWFfaWRzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBBY2NvdW50LFxuICAgICAgICBSZXNvdXJjZSxcbiAgICAgICAgUmVzb3VyY2VGaWVsZCxcbiAgICAgICAgSXRlbUNhdGVnb3J5LFxuICAgICAgICBJdGVtLFxuICAgICAgICBNZWRpYUxpbmssXG4gICAgICB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICBjb25zdCBjb3N0QWNjb3VudFByb21pc2UgPSBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoZm9ybS5jb3N0X2FjY291bnRfaWQpO1xuICAgICAgY29uc3Qgc2VsbEFjY291bnRQcm9taXNlID0gQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uc2VsbF9hY2NvdW50X2lkKTtcbiAgICAgIGNvbnN0IGludmVudG9yeUFjY291bnRQcm9taXNlID0gKGZvcm0udHlwZSA9PT0gJ2ludmVudG9yeScpXG4gICAgICAgID8gQWNjb3VudC5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uaW52ZW50b3J5X2FjY291bnRfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5UHJvbWlzZSA9IChmb3JtLmNhdGVnb3J5X2lkKVxuICAgICAgICA/IEl0ZW1DYXRlZ29yeS5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uY2F0ZWdvcnlfaWQpIDogbnVsbDtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhlIGN1c3RvbSBmaWVsZHMga2V5IGFuZCB2YWx1ZSB0eXBlLlxuICAgICAgaWYgKGZvcm0uY3VzdG9tX2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUZpZWxkc0tleXMgPSBmb3JtLmN1c3RvbV9maWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQua2V5KTtcblxuICAgICAgICAvLyBHZXQgcmVzb3VyY2UgaWQgdGhhbiBnZXQgYWxsIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS53aGVyZSgnbmFtZScsICdpdGVtcycpLmZldGNoKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IGF3YWl0IFJlc291cmNlRmllbGQucXVlcnkoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgICBidWlsZGVyLndoZXJlKCdyZXNvdXJjZV9pZCcsIHJlc291cmNlLmlkKTtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2tleScsIGN1c3RvbUZpZWxkc0tleXMpO1xuICAgICAgICB9KS5mZXRjaEFsbCgpO1xuXG4gICAgICAgIGNvbnN0IHN0b3JlZEZpZWxkc0tleSA9IGZpZWxkcy5tYXAoKGYpID0+IGYuYXR0cmlidXRlcy5rZXkpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgbm90IGRlZmluZWQgcmVzb3VyY2UgZmllbGRzLlxuICAgICAgICBjb25zdCBub3RGb3VuZEZpZWxkcyA9IGRpZmZlcmVuY2UoY3VzdG9tRmllbGRzS2V5cywgc3RvcmVkRmllbGRzS2V5KTtcblxuICAgICAgICBpZiAobm90Rm91bmRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0ZJRUxEX0tFWV9OT1RfRk9VTkQnLCBjb2RlOiAxNTAsIGZpZWxkczogbm90Rm91bmRGaWVsZHMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFtcbiAgICAgICAgY29zdEFjY291bnQsXG4gICAgICAgIHNlbGxBY2NvdW50LFxuICAgICAgICBpdGVtQ2F0ZWdvcnksXG4gICAgICAgIGludmVudG9yeUFjY291bnQsXG4gICAgICBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBjb3N0QWNjb3VudFByb21pc2UsXG4gICAgICAgIHNlbGxBY2NvdW50UHJvbWlzZSxcbiAgICAgICAgaXRlbUNhdGVnb3J5UHJvbWlzZSxcbiAgICAgICAgaW52ZW50b3J5QWNjb3VudFByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmICghY29zdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09TVF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsbEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnU0VMTF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNhdGVnb3J5ICYmIGZvcm0uY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTV9DQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxNDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWludmVudG9yeUFjY291bnQgJiYgZm9ybS50eXBlID09PSAnaW52ZW50b3J5Jykge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJTlZFTlRPUllfQUNDT1VOVF9OT1RfRk9VTkQnLCBjb2RlOiAxNTAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwgeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVsa1NhdmVNZWRpYUxpbmtzID0gW107XG4gICAgICBjb25zdCBpdGVtID0gYXdhaXQgSXRlbS5xdWVyeSgpLmluc2VydEFuZEZldGNoKHtcbiAgICAgICAgbmFtZTogZm9ybS5uYW1lLFxuICAgICAgICB0eXBlOiBmb3JtLnR5cGUsXG4gICAgICAgIHNrdTogZm9ybS5za3UsXG4gICAgICAgIGNvc3RfcHJpY2U6IGZvcm0uY29zdF9wcmljZSxcbiAgICAgICAgc2VsbF9wcmljZTogZm9ybS5zZWxsX3ByaWNlLFxuICAgICAgICBzZWxsX2FjY291bnRfaWQ6IGZvcm0uc2VsbF9hY2NvdW50X2lkLFxuICAgICAgICBjb3N0X2FjY291bnRfaWQ6IGZvcm0uY29zdF9hY2NvdW50X2lkLFxuICAgICAgICBjdXJyZW5jeV9jb2RlOiBmb3JtLmN1cnJlbmN5X2NvZGUsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBmb3JtLmNhdGVnb3J5X2lkLFxuICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICBub3RlOiBmb3JtLm5vdGUsXG4gICAgICB9KTtcblxuICAgICAgZm9ybS5tZWRpYV9pZHMuZm9yRWFjaCgobWVkaWFJZCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gTWVkaWFMaW5rLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgICBtb2RlbF9uYW1lOiAnSXRlbScsXG4gICAgICAgICAgbWVkaWFfaWQ6IG1lZGlhSWQsXG4gICAgICAgICAgbW9kZWxfaWQ6IGl0ZW0uaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBidWxrU2F2ZU1lZGlhTGlua3MucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYXZlIHRoZSBtZWRpYSBsaW5rcy5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4uYnVsa1NhdmVNZWRpYUxpbmtzLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogaXRlbS5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBnaXZlbiBpdGVtLlxuICAgKi9cbiAgZWRpdEl0ZW06IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLFxuICAgICAgY2hlY2soJ3R5cGUnKVxuICAgICAgICAuZXhpc3RzKClcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuZXNjYXBlKClcbiAgICAgICAgLmlzSW4oWydwcm9kdWN0JywgJ3NlcnZpY2UnXSksXG4gICAgICBjaGVjaygnY29zdF9wcmljZScpLmV4aXN0cygpLmlzTnVtZXJpYygpLFxuICAgICAgY2hlY2soJ3NlbGxfcHJpY2UnKS5leGlzdHMoKS5pc051bWVyaWMoKSxcbiAgICAgIGNoZWNrKCdjb3N0X2FjY291bnRfaWQnKS5leGlzdHMoKS5pc0ludCgpLFxuICAgICAgY2hlY2soJ3NlbGxfYWNjb3VudF9pZCcpLmV4aXN0cygpLmlzSW50KCksXG4gICAgICBjaGVjaygnY2F0ZWdvcnlfaWQnKS5vcHRpb25hbCh7IG51bGxhYmxlOiB0cnVlIH0pLmlzSW50KCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdub3RlJykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCdhdHRhY2htZW50Jykub3B0aW9uYWwoKSxcbiAgICAgIGNoZWNrKCcnKVxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgQWNjb3VudCwgSXRlbSwgSXRlbUNhdGVnb3J5LCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBjb25zdCBmb3JtID0ge1xuICAgICAgICBjdXN0b21fZmllbGRzOiBbXSxcbiAgICAgICAgLi4ucmVxLmJvZHksXG4gICAgICB9O1xuICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IEl0ZW0ucXVlcnkoKS5maW5kQnlJZChpZCkud2l0aEdyYXBoRmV0Y2hlZCgnbWVkaWEnKTtcblxuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTS5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG5cbiAgICAgIGNvbnN0IGNvc3RBY2NvdW50UHJvbWlzZSA9IEFjY291bnQucXVlcnkoKS5maW5kQnlJZChmb3JtLmNvc3RfYWNjb3VudF9pZCk7XG4gICAgICBjb25zdCBzZWxsQWNjb3VudFByb21pc2UgPSBBY2NvdW50LnF1ZXJ5KCkuZmluZEJ5SWQoZm9ybS5zZWxsX2FjY291bnRfaWQpO1xuICAgICAgY29uc3QgaXRlbUNhdGVnb3J5UHJvbWlzZSA9IChmb3JtLmNhdGVnb3J5X2lkKVxuICAgICAgICA/IEl0ZW1DYXRlZ29yeS5xdWVyeSgpLmZpbmRCeUlkKGZvcm0uY2F0ZWdvcnlfaWQpIDogbnVsbDtcblxuICAgICAgY29uc3QgW2Nvc3RBY2NvdW50LCBzZWxsQWNjb3VudCwgaXRlbUNhdGVnb3J5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgY29zdEFjY291bnRQcm9taXNlLCBzZWxsQWNjb3VudFByb21pc2UsIGl0ZW1DYXRlZ29yeVByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIGlmICghY29zdEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09TVF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsbEFjY291bnQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnU0VMTF9BQ0NPVU5UX05PVF9GT1VORCcsIGNvZGU6IDEyMCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbUNhdGVnb3J5ICYmIGZvcm0uY2F0ZWdvcnlfaWQpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTV9DQVRFR09SWV9OT1RfRk9VTkQnLCBjb2RlOiAxNDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSByZXEuZmlsZXMgJiYgcmVxLmZpbGVzLmF0dGFjaG1lbnQgPyByZXEuZmlsZXMuYXR0YWNobWVudCA6IG51bGw7XG4gICAgICBjb25zdCBhdHRhY2htZW50c01pbWVzID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgYXR0YWNobWVudC5cbiAgICAgIGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnRzTWltZXMuaW5kZXhPZihhdHRhY2htZW50Lm1pbWV0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQVRUQUNITUVOVC5NSU5FVFlQRS5OT1QuU1VQUE9SVEVEJywgY29kZTogMTYwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0YWNobWVudCkge1xuICAgICAgICBjb25zdCBwdWJsaWNQYXRoID0gJ3N0b3JhZ2UvYXBwL3B1YmxpYy8nO1xuICAgICAgICBjb25zdCB0ZW5hbnRQYXRoID0gYCR7cHVibGljUGF0aH0ke3JlcS5vcmdhbml6YXRpb25JZH1gO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnNQcm9taXNlcy51bmxpbmsoYCR7dGVuYW50UGF0aH0vJHtpdGVtLmF0dGFjaG1lbnRGaWxlfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0RlbGV0ZSBpdGVtIGF0dGFjaG1lbnQgZmlsZSBkZWxldGUgZmFpbGVkLicsIHsgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhdHRhY2htZW50Lm12KGAke3RlbmFudFBhdGh9LyR7YXR0YWNobWVudC5tZDV9LnBuZ2ApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdBVFRBQ0hNRU5ULlVQTE9BRC5GQUlMRUQnLCBjb2RlOiA2MDAgfV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpLnBhdGNoKHtcbiAgICAgICAgbmFtZTogZm9ybS5uYW1lLFxuICAgICAgICB0eXBlOiBmb3JtLnR5cGUsXG4gICAgICAgIGNvc3RfcHJpY2U6IGZvcm0uY29zdF9wcmljZSxcbiAgICAgICAgc2VsbF9wcmljZTogZm9ybS5zZWxsX3ByaWNlLFxuICAgICAgICBjdXJyZW5jeV9jb2RlOiBmb3JtLmN1cnJlbmN5X2NvZGUsXG4gICAgICAgIHNlbGxfYWNjb3VudF9pZDogZm9ybS5zZWxsX2FjY291bnRfaWQsXG4gICAgICAgIGNvc3RfYWNjb3VudF9pZDogZm9ybS5jb3N0X2FjY291bnRfaWQsXG4gICAgICAgIGNhdGVnb3J5X2lkOiBmb3JtLmNhdGVnb3J5X2lkLFxuICAgICAgICBub3RlOiBmb3JtLm5vdGUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2F2ZSBsaW5rcyBvZiBuZXcgaW5zZXJ0ZWQgbWVkaWEgdGhhdCBhc3NvY2lhdGVkIHRvIHRoZSBpdGVtIG1vZGVsLlxuICAgICAgY29uc3QgaXRlbU1lZGlhSWRzID0gaXRlbS5tZWRpYS5tYXAoKG0pID0+IG0uaWQpO1xuICAgICAgY29uc3QgbmV3SW5zZXJ0ZWRNZWRpYSA9IGRpZmZlcmVuY2UoZm9ybS5tZWRpYV9pZHMsIGl0ZW1NZWRpYUlkcyk7XG4gICAgICBjb25zdCBidWxrU2F2ZU1lZGlhTGluayA9IFtdO1xuXG4gICAgICBuZXdJbnNlcnRlZE1lZGlhLmZvckVhY2goKG1lZGlhSWQpID0+IHtcbiAgICAgICAgY29uc3Qgb3BlciA9IE1lZGlhTGluay5xdWVyeSgpLmluc2VydCh7XG4gICAgICAgICAgbW9kZWxfbmFtZTogJ0pvdXJuYWwnLFxuICAgICAgICAgIG1vZGVsX2lkOiBtYW51YWxKb3VybmFsLmlkLFxuICAgICAgICAgIG1lZGlhX2lkOiBtZWRpYUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVsa1NhdmVNZWRpYUxpbmsucHVzaChvcGVyKTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWyAuLi5uZXdJbnNlcnRlZE1lZGlhIF0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdXBkYXRlZEl0ZW0uaWQgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBkZWxldGVJdGVtOiB7XG4gICAgdmFsaWRhdGlvbjogW10sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgSXRlbSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdJVEVNX05PVF9GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgdGhlIGZ1Y2tpbmcgdGhlIGdpdmVuIGl0ZW0gaWQuXG4gICAgICBhd2FpdCBJdGVtLnF1ZXJ5KCkuZmluZEJ5SWQoaXRlbS5pZCkuZGVsZXRlKCk7XG5cbiAgICAgIGlmIChpdGVtLmF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSAnc3RvcmFnZS9hcHAvcHVibGljLyc7XG4gICAgICAgIGNvbnN0IHRlbmFudFBhdGggPSBgJHtwdWJsaWNQYXRofSR7cmVxLm9yZ2FuaXphdGlvbklkfWA7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmc1Byb21pc2VzLnVubGluayhgJHt0ZW5hbnRQYXRofS8ke2l0ZW0uYXR0YWNobWVudEZpbGV9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnRGVsZXRlIGl0ZW0gYXR0YWNobWVudCBmaWxlIGRlbGV0ZSBmYWlsZWQuJywgeyBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogQnVsayBkZWxldGUgdGhlIGdpdmVuIGl0ZW1zIGlkcy5cbiAgICovXG4gIGJ1bGtEZWxldGVJdGVtczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdpZHMnKS5pc0FycmF5KHsgbWluOiAyIH0pLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IGlkczogW10sIC4uLnJlcS5xdWVyeSB9O1xuICAgICAgY29uc3QgeyBJdGVtIH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IEl0ZW0ucXVlcnkoKS53aGVyZUluKCdpZCcsIGZpbHRlci5pZHMpO1xuXG4gICAgICBjb25zdCBzdG9yZWRJdGVtc0lkcyA9IGl0ZW1zLm1hcCgoYSkgPT4gYS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZEl0ZW1zID0gZGlmZmVyZW5jZShmaWx0ZXIuaWRzLCBzdG9yZWRJdGVtc0lkcyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgaXRlbXMuXG4gICAgICBpZiAobm90Rm91bmRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnSVRFTVMuTk9ULkZPVU5EJywgY29kZTogMjAwLCBpZHM6IG5vdEZvdW5kSXRlbXMgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGdpdmVuIGl0ZW1zIGlkcy5cbiAgICAgIGF3YWl0IEl0ZW0ucXVlcnkoKS53aGVyZUluKCdpZCcsIHN0b3JlZEl0ZW1zSWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cml2ZSB0aGUgbGlzdCBpdGVtcyB3aXRoIHBhZ2luYXRpb24gbWV0YS5cbiAgICovXG4gIGxpc3RJdGVtczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdjb2x1bW5fc29ydF9vcmRlcicpLm9wdGlvbmFsKCkuaXNJbihbJ2NyZWF0ZWRfYXQnLCAnbmFtZScsICdhbW91bnQnLCAnc2t1J10pLFxuICAgICAgcXVlcnkoJ3NvcnRfb3JkZXInKS5vcHRpb25hbCgpLmlzSW4oWydkZXNjJywgJ2FzYyddKSxcbiAgICAgIHF1ZXJ5KCdwYWdlJykub3B0aW9uYWwoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgICAgcXVlcnkoJ3BhZ2Vfc2l6ZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdjdXN0b21fdmlld19pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdzdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMnKS5vcHRpb25hbCgpLmlzSlNPTigpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuICAgICAgY29uc3Qgdmlld0NvbmRpdGlvbnMgPSBbXTtcbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIEl0ZW0sIFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpdGVtc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAnaXRlbXMnKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgnZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghaXRlbXNSZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ0lURU1TX1JFU09VUkNFX05PVF9GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgIGNvbHVtbl9zb3J0X29yZGVyOiAnJyxcbiAgICAgICAgc29ydF9vcmRlcjogJycsXG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHBhZ2Vfc2l6ZTogMTAsXG4gICAgICAgIGN1c3RvbV92aWV3X2lkOiBudWxsLFxuICAgICAgICBmaWx0ZXJfcm9sZXM6IFtdLFxuICAgICAgICAuLi5yZXEucXVlcnksXG4gICAgICB9O1xuICAgICAgaWYgKGZpbHRlci5zdHJpbmdpZmllZF9maWx0ZXJfcm9sZXMpIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlcl9yb2xlcyA9IEpTT04ucGFyc2UoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmN1c3RvbV92aWV3X2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2Zhdm91cml0ZScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoJ3Jlc291cmNlX2lkJywgaXRlbXNSZXNvdXJjZS5pZCk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgncm9sZXMuZmllbGQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJyk7XG4gICAgICAgIGJ1aWxkZXIuZmlyc3QoKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHNLZXlzID0gaXRlbXNSZXNvdXJjZS5maWVsZHMubWFwKChjKSA9PiBjLmtleSk7XG4gICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXIoSXRlbS50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIHZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIGl0ZW1zUmVzb3VyY2UuZmllbGRzLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihmaWx0ZXJSb2xlcyk7XG5cbiAgICAgICAgaWYgKGZpbHRlclJvbGVzLnZhbGlkYXRlRmlsdGVyUm9sZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnSVRFTVMuUkVTT1VSQ0UuSEFTLk5PLkZJRUxEUycsIGNvZGU6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGNvbHVtbiBzb3J0IG9yZGVyLlxuICAgICAgaWYgKGZpbHRlci5jb2x1bW5fc29ydF9vcmRlcikge1xuICAgICAgICBpZiAocmVzb3VyY2VGaWVsZHNLZXlzLmluZGV4T2YoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdDT0xVTU4uU09SVC5PUkRFUi5OT1QuRk9VTkQnLCBjb2RlOiAzMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydEJ5RmlsdGVyID0gbmV3IER5bmFtaWNGaWx0ZXJTb3J0QnkoXG4gICAgICAgICAgZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyLFxuICAgICAgICAgIGZpbHRlci5zb3J0X29yZGVyLFxuICAgICAgICApO1xuICAgICAgICBkeW5hbWljRmlsdGVyLnNldEZpbHRlcihzb3J0QnlGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBJdGVtLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2Nvc3RBY2NvdW50Jyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnc2VsbEFjY291bnQnKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdpbnZlbnRvcnlBY2NvdW50Jyk7XG4gICAgICAgIGJ1aWxkZXIud2l0aEdyYXBoRmV0Y2hlZCgnY2F0ZWdvcnknKTtcblxuICAgICAgICBkeW5hbWljRmlsdGVyLmJ1aWxkUXVlcnkoKShidWlsZGVyKTtcbiAgICAgIH0pLnBhZ2luYXRpb24oZmlsdGVyLnBhZ2UgLSAxLCBmaWx0ZXIucGFnZV9zaXplKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIC4uLih2aWV3KSAmJiB7XG4gICAgICAgICAgY3VzdG9tVmlld0lkOiB2aWV3LmlkLFxuICAgICAgICAgIHZpZXdDb2x1bW5zOiB2aWV3LmNvbHVtbnMsXG4gICAgICAgICAgdmlld0NvbmRpdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcbiIsIlxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBwYXJhbSxcbiAgcXVlcnksXG4gIHZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnQC9zZXJ2aWNlcy9Mb2dnZXInO1xuXG5jb25zdCBmc1Byb21pc2VzID0gZnMucHJvbWlzZXM7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy91cGxvYWQnLFxuICAgICAgdGhpcy51cGxvYWQudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLnVwbG9hZC5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvJyxcbiAgICAgIHRoaXMuZGVsZXRlLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGUuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldC52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0LmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFsbCBvciB0aGUgZ2l2ZW4gYXR0YWNobWVudCBpZHMuXG4gICAqL1xuICBnZXQ6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJyksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBNZWRpYSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IG1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG5cbiAgICAgICAgaWYgKHJlcS5xdWVyeS5pZHMpIHtcbiAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHJlcS5xdWVyeS5pZHMpID8gcmVxLnF1ZXJ5LmlkcyA6IFtyZXEucXVlcnkuaWRzXTtcbiAgICAgICAgICBidWlsZGVyLndoZXJlSW4oJ2lkJywgaWRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IG1lZGlhIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIGdpdmVuIGF0dGFjaG1lbnQgZmlsZS5cbiAgICovXG4gIHVwbG9hZDoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIC8vIGNoZWNrKCdhdHRhY2htZW50JykuZXhpc3RzKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBpZiAoIXJlcS5maWxlcy5hdHRhY2htZW50KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnQVRUQUNITUVOVC5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVibGljUGF0aCA9ICdzdG9yYWdlL2FwcC9wdWJsaWMvJztcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzTWltZXMgPSBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ107XG4gICAgICBjb25zdCB7IGF0dGFjaG1lbnQgfSA9IHJlcS5maWxlcztcbiAgICAgIGNvbnN0IHsgTWVkaWEgfSA9IHJlcS5tb2RlbHM7XG5cbiAgICAgIGNvbnN0IGVycm9yUmVhc29ucyA9IFtdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgYXR0YWNobWVudC5cbiAgICAgIGlmIChhdHRhY2htZW50ICYmIGF0dGFjaG1lbnRzTWltZXMuaW5kZXhPZihhdHRhY2htZW50Lm1pbWV0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQVRUQUNITUVOVC5NSU5FVFlQRS5OT1QuU1VQUE9SVEVEJywgY29kZTogMTYwIH0pO1xuICAgICAgfVxuICAgICAgLy8gQ2F0Y2ggYWxsIGVycm9yIHJlYXNvbnMgdG8gcmVzcG9uc2UgNDAwLlxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhdHRhY2htZW50Lm12KGAke3B1YmxpY1BhdGh9JHtyZXEub3JnYW5pemF0aW9uSWR9LyR7YXR0YWNobWVudC5tZDV9LnBuZ2ApO1xuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0F0dGFjaG1lbnQgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBMb2dnZXIubG9nKCdpbmZvJywgJ0F0dGFjaG1lbnQgdXBsb2FkaW5nIGZhaWxlZC4nLCB7IGVycm9yIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZWRpYSA9IGF3YWl0IE1lZGlhLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgYXR0YWNobWVudF9maWxlOiBgJHthdHRhY2htZW50Lm1kNX0ucG5nYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgbWVkaWEgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZ2l2ZW4gYXR0YWNobWVudCBpZHMgZnJvbSBmaWxlIHN5c3RlbSBhbmQgZGF0YWJhc2UuXG4gICAqL1xuICBkZWxldGU6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBxdWVyeSgnaWRzJykuZXhpc3RzKCkuaXNBcnJheSgpLFxuICAgICAgcXVlcnkoJ2lkcy4qJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IE1lZGlhLCBNZWRpYUxpbmsgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHJlcS5xdWVyeS5pZHMpID8gcmVxLnF1ZXJ5LmlkcyA6IFtyZXEucXVlcnkuaWRzXTtcbiAgICAgIGNvbnN0IG1lZGlhID0gYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIGlkcyk7XG4gICAgICBjb25zdCBtZWRpYUlkcyA9IG1lZGlhLm1hcCgobSkgPT4gbS5pZCk7XG4gICAgICBjb25zdCBub3RGb3VuZE1lZGlhID0gZGlmZmVyZW5jZShpZHMsIG1lZGlhSWRzKTtcblxuICAgICAgaWYgKG5vdEZvdW5kTWVkaWEubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnTUVESUEuSURTLk5PVC5GT1VORCcsIGNvZGU6IDIwMCwgaWRzOiBub3RGb3VuZE1lZGlhIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSAnc3RvcmFnZS9hcHAvcHVibGljLyc7XG4gICAgICBjb25zdCB0ZW5hbnRQYXRoID0gYCR7cHVibGljUGF0aH0ke3JlcS5vcmdhbml6YXRpb25JZH1gO1xuICAgICAgY29uc3QgdW5saW5rT3BlcnMgPSBbXTtcblxuICAgICAgbWVkaWEuZm9yRWFjaCgobWVkaWFNb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyID0gZnNQcm9taXNlcy51bmxpbmsoYCR7dGVuYW50UGF0aH0vJHttZWRpYU1vZGVsLmF0dGFjaG1lbnRGaWxlfWApO1xuICAgICAgICB1bmxpbmtPcGVycy5wdXNoKG9wZXIpO1xuICAgICAgfSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh1bmxpbmtPcGVycykudGhlbigocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgcmVzb2x2ZWQuZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgTG9nZ2VyLmxvZygnZXJyb3InLCAnQXR0YWNobWVudCBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQuJyk7XG4gICAgICAgIH0pOyBcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9ycykgPT4ge1xuICAgICAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBMb2dnZXIubG9nKCdlcnJvcicsICdEZWxldGUgaXRlbSBhdHRhY2htZW50IGZpbGUgZGVsZXRlIGZhaWxlZC4nLCB7IGVycm9yIH0pO1xuICAgICAgICB9KVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IE1lZGlhTGluay5xdWVyeSgpLndoZXJlSW4oJ21lZGlhX2lkJywgbWVkaWFJZHMpLmRlbGV0ZSgpO1xuICAgICAgYXdhaXQgTWVkaWEucXVlcnkoKS53aGVyZUluKCdpZCcsIG1lZGlhSWRzKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGJvZHksIHF1ZXJ5LCB2YWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFJvdXRlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHJvdXRlcigpIHtcbiAgICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuXG4gICAgcm91dGVyLnBvc3QoJy8nLFxuICAgICAgdGhpcy5zYXZlT3B0aW9ucy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuc2F2ZU9wdGlvbnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmdldE9wdGlvbnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldE9wdGlvbnMuaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHJvdXRlcjtcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGdpdmVuIG9wdGlvbnMgdG8gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBzYXZlT3B0aW9uczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIGJvZHkoJ29wdGlvbnMnKS5pc0FycmF5KHsgbWluOiAxIH0pLFxuICAgICAgYm9keSgnb3B0aW9ucy4qLmtleScpLmV4aXN0cygpLFxuICAgICAgYm9keSgnb3B0aW9ucy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBib2R5KCdvcHRpb25zLiouZ3JvdXAnKS5leGlzdHMoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICdWQUxJREFUSU9OX0VSUk9SJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IE9wdGlvbiB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCBvcHRpb25zQ29sbGVjdGlvbnMgPSBhd2FpdCBPcHRpb24ucXVlcnkoKTtcblxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBub3REZWZpbmVkT3B0aW9ucyA9IE9wdGlvbi52YWxpZGF0ZURlZmluZWQoZm9ybS5vcHRpb25zKTtcblxuICAgICAgaWYgKG5vdERlZmluZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ09QVElPTlMuS0VZLk5PVC5ERUZJTkVEJyxcbiAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAga2V5czogbm90RGVmaW5lZE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5waWNrKG8sIFsna2V5JywgJ2dyb3VwJ10pIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDApLnNlbmQoeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGZvcm0ub3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgb3B0aW9uc0NvbGxlY3Rpb25zLnNldE1ldGEoeyAuLi5vcHRpb24gfSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG9wdGlvbnNDb2xsZWN0aW9ucy5zYXZlTWV0YSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBvcHRpb25zOiBmb3JtIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBvcHRpb25zIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBnZXRPcHRpb25zOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2tleScpLm9wdGlvbmFsKCksXG4gICAgICBxdWVyeSgnZ3JvdXAnKS5vcHRpb25hbCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ1ZBTElEQVRJT05fRVJST1InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgT3B0aW9uIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgZmlsdGVyID0geyAuLi5yZXEucXVlcnkgfTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBPcHRpb24ucXVlcnkoKS5vbkJ1aWxkKChidWlsZGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIua2V5KSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgna2V5JywgZmlsdGVyLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2dyb3VwJywgZmlsdGVyLmdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBvcHRpb25zOiBvcHRpb25zLm1ldGFkYXRhIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBwYXJhbSxcbiAgcXVlcnksXG59IGZyb20gJ2V4cHJlc3MtdmFsaWRhdG9yJztcbmltcG9ydCBhc3luY01pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvYXN5bmNNaWRkbGV3YXJlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvOnJlc291cmNlX3NsdWcvZGF0YScsXG4gICAgICB0aGlzLnJlc291cmNlRGF0YS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMucmVzb3VyY2VEYXRhLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86cmVzb3VyY2Vfc2x1Zy9jb2x1bW5zJyxcbiAgICAgIHRoaXMucmVzb3VyY2VDb2x1bW5zLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZXNvdXJjZUNvbHVtbnMuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLzpyZXNvdXJjZV9zbHVnL2ZpZWxkcycsXG4gICAgICB0aGlzLnJlc291cmNlRmllbGRzLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5yZXNvdXJjZUZpZWxkcy5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBkYXRhIG9mIHRoZSBnaXZlbiByZXNvdXJjZSBrZXkvc2x1Zy5cbiAgICovXG4gIHJlc291cmNlRGF0YToge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdyZXNvdXJjZV9zbHVnJykudHJpbSgpLmVzY2FwZSgpLmV4aXN0cygpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBBY2NvdW50VHlwZSB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgQWNjb3VudFR5cGUucXVlcnkoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgcmVzb3VyY2UgY29sdW1ucyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuXG4gICAqL1xuICByZXNvdXJjZUNvbHVtbnM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgncmVzb3VyY2Vfc2x1ZycpLnRyaW0oKS5lc2NhcGUoKS5leGlzdHMoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBSZXNvdXJjZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsIHJlc291cmNlU2x1ZylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUkVTT1VSQ0UuU0xVRy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZHMgPSByZXNvdXJjZS5maWVsZHNcbiAgICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkLmNvbHVtbmFibGUpXG4gICAgICAgIC5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICAgIGlkOiBmaWVsZC5pZCxcbiAgICAgICAgICBsYWJlbDogZmllbGQubGFiZWxOYW1lLFxuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHJlc291cmNlX2NvbHVtbnM6IHJlc291cmNlRmllbGRzLFxuICAgICAgICByZXNvdXJjZV9zbHVnOiByZXNvdXJjZVNsdWcsXG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBmaWVsZHMgb2YgdGhlIGdpdmVuIHJlc291cmNlLlxuICAgKi9cbiAgcmVzb3VyY2VGaWVsZHM6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgncmVzb3VyY2Vfc2x1ZycpLnRyaW0oKS5lc2NhcGUoKS5leGlzdHMoKSxcbiAgICAgIHF1ZXJ5KCdwcmVkZWZpbmVkJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICAgIHF1ZXJ5KCdidWlsdGluJykub3B0aW9uYWwoKS5pc0Jvb2xlYW4oKS50b0Jvb2xlYW4oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgcmVzb3VyY2Vfc2x1ZzogcmVzb3VyY2VTbHVnIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBSZXNvdXJjZSB9ID0gcmVxLm1vZGVscztcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBSZXNvdXJjZS5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnbmFtZScsIHJlc291cmNlU2x1ZylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUkVTT1VSQ0UuU0xVRy5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcmVzb3VyY2VfZmllbGRzOiByZXNvdXJjZS5maWVsZHMsXG4gICAgICAgIHJlc291cmNlX3NsdWc6IHJlc291cmNlU2x1ZyxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuIiwiaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcXVlcnksXG4gIHBhcmFtLFxuICB2YWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICdleHByZXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICAvKipcbiAgICogUm91dGVyIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcm91dGVyKCkge1xuICAgIGNvbnN0IHJvdXRlciA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgICByb3V0ZXIucHV0KCcvOmlkL2luYWN0aXZlJyxcbiAgICAgIHRoaXMuaW5hY3RpdmVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5pbmFjdGl2ZVVzZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnB1dCgnLzppZC9hY3RpdmUnLFxuICAgICAgdGhpcy5hY3RpdmVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5hY3RpdmVVc2VyLmhhbmRsZXIpKTtcbiAgXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0VXNlci52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZWRpdFVzZXIuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLmdldCgnLycsXG4gICAgICB0aGlzLmxpc3RVc2Vycy52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMubGlzdFVzZXJzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRVc2VyLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVVc2VyLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVVc2VyLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gdXNlci5cbiAgICovXG4gIGVkaXRVc2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdmaXJzdF9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnbGFzdF9uYW1lJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygnZW1haWwnKS5leGlzdHMoKS5pc0VtYWlsKCksXG4gICAgICBjaGVjaygncGhvbmVfbnVtYmVyJykub3B0aW9uYWwoKS5pc01vYmlsZVBob25lKCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcblxuICAgICAgY29uc3QgZm91bmRVc2VycyA9IGF3YWl0IFRlbmFudFVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmVOb3QoJ2lkJywgaWQpXG4gICAgICAgIC5hbmRXaGVyZSgocSkgPT4ge1xuICAgICAgICAgIHEud2hlcmUoJ2VtYWlsJywgZm9ybS5lbWFpbCk7XG4gICAgICAgICAgcS5vcldoZXJlKCdwaG9uZV9udW1iZXInLCBmb3JtLnBob25lX251bWJlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3VuZFVzZXJFbWFpbCA9IGZvdW5kVXNlcnMuZmluZCgodSkgPT4gdS5lbWFpbCA9PT0gZm9ybS5lbWFpbCk7XG4gICAgICBjb25zdCBmb3VuZFVzZXJQaG9uZSA9IGZvdW5kVXNlcnMuZmluZCgodSkgPT4gdS5waG9uZU51bWJlciA9PT0gZm9ybS5waG9uZV9udW1iZXIpO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgaWYgKGZvdW5kVXNlckVtYWlsKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0VNQUlMX0FMUkVBRFlfRVhJU1QnLCBjb2RlOiAxMDAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRVc2VyUGhvbmUpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnUEhPTkVfTlVNQkVSX0FMUkVBRFlfRVhJU1QnLCBjb2RlOiAxMjAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZFJlcXVlc3QobnVsbCwgeyBlcnJvcnM6IGVycm9yUmVhc29ucyB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJGb3JtID0ge1xuICAgICAgICBmaXJzdF9uYW1lOiBmb3JtLmZpcnN0X25hbWUsXG4gICAgICAgIGxhc3RfbmFtZTogZm9ybS5sYXN0X25hbWUsXG4gICAgICAgIGVtYWlsOiBmb3JtLmVtYWlsLFxuICAgICAgICBwaG9uZV9udW1iZXI6IGZvcm0ucGhvbmVfbnVtYmVyLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHVwZGF0ZVRlbmFudFVzZXIgPSBUZW5hbnRVc2VyLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIGlkKS51cGRhdGUoeyAuLi51c2VyRm9ybSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgLi4udXNlckZvcm0gfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdXBkYXRlVGVuYW50VXNlciwgdXBkYXRlU3lzdGVtVXNlcixcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogU29mdCBkZWxldGluZyB0aGUgZ2l2ZW4gdXNlci5cbiAgICovXG4gIGRlbGV0ZVVzZXI6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBUZW5hbnRVc2VyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1VTRVJfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlbmFudFVzZXJEZWwgPSBUZW5hbnRVc2VyLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmRlbGV0ZSgpO1xuICAgICAgY29uc3Qgc3lzdGVtVXNlckRlbCA9IFN5c3RlbVVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZGVsZXRlKCk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGVuYW50VXNlckRlbCxcbiAgICAgICAgc3lzdGVtVXNlckRlbCxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdXNlciBkZXRhaWxzIG9mIHRoZSBnaXZlbiB1c2VyIGlkLlxuICAgKi9cbiAgZ2V0VXNlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBUZW5hbnRVc2VyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFRlbmFudFVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdXNlciB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiB1c2Vycy5cbiAgICovXG4gIGxpc3RVc2Vyczoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgLi4ucmVxLnF1ZXJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgVGVuYW50VXNlciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHVzZXJzID0gYXdhaXQgVGVuYW50VXNlci5xdWVyeSgpXG4gICAgICAgIC5wYWdlKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHVzZXJzIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgaW5hY3RpdmVVc2VyOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyB1c2VyIH0gPSByZXE7XG4gICAgICBjb25zdCB7IFRlbmFudFVzZXIgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB0ZW5hbnRVc2VyID0gVGVuYW50VXNlci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIXRlbmFudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdVU0VSLk5PVC5GT1VORCcsIGNvZGU6IDEwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVUZW5hbnRVc2VyID0gVGVuYW50VXNlci5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCBpZCkudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgIFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB1cGRhdGVUZW5hbnRVc2VyLCB1cGRhdGVTeXN0ZW1Vc2VyLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB0ZW5hbnRVc2VyLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgYWN0aXZlVXNlcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgdXNlciB9ID0gcmVxO1xuICAgICAgY29uc3QgeyBUZW5hbnRVc2VyIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdGVuYW50VXNlciA9IFRlbmFudFVzZXIucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF0ZW5hbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVVNFUi5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlVGVuYW50VXNlciA9IFRlbmFudFVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgaWQpLnVwZGF0ZSh7IGFjdGl2ZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgdXBkYXRlU3lzdGVtVXNlciA9IFN5c3RlbVVzZXIucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdXNlci5pZCkudXBkYXRlKHsgYWN0aXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVwZGF0ZVRlbmFudFVzZXIsIHVwZGF0ZVN5c3RlbVVzZXIsXG4gICAgICBdKTtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB0ZW5hbnRVc2VyLmlkIH0pO1xuICAgIH0sXG4gIH0sXG59OyIsImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIHBhcmFtLFxuICBxdWVyeSxcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmNNaWRkbGV3YXJlIGZyb20gJ0AvaHR0cC9taWRkbGV3YXJlL2FzeW5jTWlkZGxld2FyZSc7XG5pbXBvcnQge1xuICBtYXBWaWV3Um9sZXNUb0NvbmRpdGlvbmFscyxcbiAgbWFwRmlsdGVyUm9sZXNUb0R5bmFtaWNGaWx0ZXIsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59IGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXInO1xuXG5cbmNvbnN0IHZhbGlkYXRpb1JvbGVzID0gW1xuICBjaGVjaygnZmlyc3RfbmFtZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnbGFzdF9uYW1lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ2NvbXBhbnlfbmFtZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gIGNoZWNrKCdkaXNwbGF5X25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ2VtYWlsJykub3B0aW9uYWwoKS5pc0VtYWlsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnd29ya19waG9uZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygncGVyc29uYWxfcGhvbmUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcblxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX2NpdHknKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3NfZW1haWwnKS5vcHRpb25hbCgpLmlzRW1haWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3NfemlwY29kZScpLm9wdGlvbmFsKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnYmlsbGluZ19hZGRyZXNzX3Bob25lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcblxuICBjaGVjaygnc2hpcHBpbmdfYWRkcmVzc19jaXR5Jykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX2NvdW50cnknKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnKS5vcHRpb25hbCgpLmlzRW1haWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX3ppcF9jb2RlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX3Bob25lJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG4gIGNoZWNrKCdzaGlwcGluZ19hZGRyZXNzX3N0YXRlJykub3B0aW9uYWwoKS50cmltKCkuZXNjYXBlKCksXG5cbiAgY2hlY2soJ25vdGUnKS5vcHRpb25hbCgpLnRyaW0oKS5lc2NhcGUoKSxcbiAgY2hlY2soJ2FjdGl2ZScpLm9wdGlvbmFsKCkuaXNCb29sZWFuKCkudG9Cb29sZWFuKCksXG5cbiAgY2hlY2soJ2N1c3RvbV9maWVsZHMnKS5vcHRpb25hbCgpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gIGNoZWNrKCdjdXN0b21fZmllbGRzLioua2V5JykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICBjaGVjaygnY3VzdG9tX2ZpZWxkcy4qLnZhbHVlJykuZXhpc3RzKCksXG5dO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5wb3N0KCcvJyxcbiAgICAgIHRoaXMubmV3VmVuZG9yLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5uZXdWZW5kb3IuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86aWQnLFxuICAgICAgdGhpcy5lZGl0VmVuZG9yLnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0VmVuZG9yLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5kZWxldGUoJy86aWQnLFxuICAgICAgdGhpcy5kZWxldGVWZW5kb3IudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmRlbGV0ZVZlbmRvci5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZ2V0KCcvJyxcbiAgICAgIHRoaXMubGlzdFZlbmRvcnMudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RWZW5kb3JzLmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86aWQnLFxuICAgICAgdGhpcy5nZXRWZW5kb3IudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmdldFZlbmRvci5oYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gcm91dGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB2ZW5kb3JzIGxpc3Qgd2l0aCBwYWdpbmF0aW9uIGFuZCBjdXN0b20gdmlldyBtZXRhZGF0YS5cbiAgICovXG4gIGxpc3RWZW5kb3JzOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcXVlcnkoJ2NvbHVtbl9zb3J0X29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnY3JlYXRlZF9hdCddKSxcbiAgICAgIHF1ZXJ5KCdzb3J0X29yZGVyJykub3B0aW9uYWwoKS5pc0luKFsnZGVzYycsICdhc2MnXSksXG4gICAgICBxdWVyeSgncGFnZScpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIHF1ZXJ5KCdwYWdlX3NpemUnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnY3VzdG9tX3ZpZXdfaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBxdWVyeSgnc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzJykub3B0aW9uYWwoKS5pc0pTT04oKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IFJlc291cmNlLCBWaWV3LCBWZW5kb3IgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcblxuICAgICAgY29uc3QgdmVuZG9yc1Jlc291cmNlID0gYXdhaXQgUmVzb3VyY2UucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ25hbWUnLCAndmVuZG9ycycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdmaWVsZHMnKVxuICAgICAgICAuZmlyc3QoKTtcblxuICAgICAgaWYgKCF2ZW5kb3JzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdWRU5ET1JTLlJFU09VUkNFLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgICAgY29sdW1uX3NvcnRfb3JkZXI6ICcnLFxuICAgICAgICBzb3J0X29yZGVyOiAnJyxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgcGFnZV9zaXplOiAxMCxcbiAgICAgICAgY3VzdG9tX3ZpZXdfaWQ6IG51bGwsXG4gICAgICAgIGZpbHRlcl9yb2xlczogW10sXG4gICAgICAgIC4uLnJlcS5xdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLnN0cmluZ2lmaWVkX2ZpbHRlcl9yb2xlcykge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyX3JvbGVzID0gSlNPTi5wYXJzZShmaWx0ZXIuc3RyaW5naWZpZWRfZmlsdGVyX3JvbGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmN1c3RvbV92aWV3X2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIuY3VzdG9tX3ZpZXdfaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ2Zhdm91cml0ZScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWxkZXIud2hlcmUoJ3Jlc291cmNlX2lkJywgdmVuZG9yc1Jlc291cmNlLmlkKTtcbiAgICAgICAgYnVpbGRlci53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpO1xuICAgICAgICBidWlsZGVyLndpdGhHcmFwaEZldGNoZWQoJ2NvbHVtbnMnKTtcbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSB2ZW5kb3JzUmVzb3VyY2UuZmllbGRzLm1hcCgoYykgPT4gYy5rZXkpO1xuICAgICAgY29uc3QgZHluYW1pY0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyKFZlbmRvci50YWJsZU5hbWUpO1xuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIHZpZXcgcm9sZXMuXG4gICAgICBpZiAodmlldyAmJiB2aWV3LnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgdmlld0ZpbHRlciA9IG5ldyBEeW5hbWljRmlsdGVyVmlld3MoXG4gICAgICAgICAgbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlldy5yb2xlcyksXG4gICAgICAgICAgdmlldy5yb2xlc0xvZ2ljRXhwcmVzc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF2aWV3RmlsdGVyLnZhbGlkYXRlRmlsdGVyUm9sZXMoKSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHZpZXdGaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBEeW5hbWljIGZpbHRlciB3aXRoIGZpbHRlciByb2xlcy5cbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyX3JvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGFjY291bnRzIHJlc291cmNlIGZpZWxkcy5cbiAgICAgICAgY29uc3QgZmlsdGVyUm9sZXMgPSBuZXcgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzKFxuICAgICAgICAgIG1hcEZpbHRlclJvbGVzVG9EeW5hbWljRmlsdGVyKGZpbHRlci5maWx0ZXJfcm9sZXMpLFxuICAgICAgICAgIHZlbmRvcnNSZXNvdXJjZS5maWVsZHMsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKGZpbHRlclJvbGVzKTtcblxuICAgICAgICBpZiAoZmlsdGVyUm9sZXMudmFsaWRhdGVGaWx0ZXJSb2xlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdJVEVNUy5SRVNPVVJDRS5IQVMuTk8uRklFTERTJywgY29kZTogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIER5bmFtaWMgZmlsdGVyIHdpdGggY29sdW1uIHNvcnQgb3JkZXIuXG4gICAgICBpZiAoZmlsdGVyLmNvbHVtbl9zb3J0X29yZGVyKSB7XG4gICAgICAgIGlmIChyZXNvdXJjZUZpZWxkc0tleXMuaW5kZXhPZihmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIpID09PSAtMSkge1xuICAgICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ0NPTFVNTi5TT1JULk9SREVSLk5PVC5GT1VORCcsIGNvZGU6IDMwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0QnlGaWx0ZXIgPSBuZXcgRHluYW1pY0ZpbHRlclNvcnRCeShcbiAgICAgICAgICBmaWx0ZXIuY29sdW1uX3NvcnRfb3JkZXIsXG4gICAgICAgICAgZmlsdGVyLnNvcnRfb3JkZXIsXG4gICAgICAgICk7XG4gICAgICAgIGR5bmFtaWNGaWx0ZXIuc2V0RmlsdGVyKHNvcnRCeUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5zZW5kKHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG4gICAgICAvLyBWZW5kb3JzIHF1ZXJ5LlxuICAgICAgY29uc3QgdmVuZG9ycyA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLm9uQnVpbGQoKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZHluYW1pY0ZpbHRlci5idWlsZFF1ZXJ5KCkoYnVpbGRlcik7XG4gICAgICB9KS5wYWdpbmF0aW9uKGZpbHRlci5wYWdlIC0gMSwgZmlsdGVyLnBhZ2Vfc2l6ZSk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgIHZlbmRvcnMsXG4gICAgICAgIC4uLih2aWV3KSA/IHtcbiAgICAgICAgICBjdXN0b21WaWV3SWQ6IHZpZXcuaWQsXG4gICAgICAgIH0gOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3VibWl0IGEgbmV3IHZlbmRvciBkZXRhaWxzLlxuICAgKi9cbiAgbmV3VmVuZG9yOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgLi4udmFsaWRhdGlvUm9sZXMsXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGlvblJlc3VsdChyZXEpO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvcnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWREYXRhKG51bGwsIHtcbiAgICAgICAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicsIC4uLnZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBWZW5kb3IgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyAuLi5yZXEuYm9keSB9O1xuXG4gICAgICBjb25zdCB2ZW5kb3IgPSBhd2FpdCBWZW5kb3IucXVlcnkoKS5pbnNlcnRBbmRGZXRjaCh7XG4gICAgICAgIC4uLnBpY2soZm9ybSwgW1xuICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAnY29tcGFueV9uYW1lJyxcbiAgICAgICAgICAnZGlzcGxheV9uYW1lJyxcbiAgICAgICAgICBcbiAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICd3b3JrX3Bob25lJyxcbiAgICAgICAgICAncGVyc29uYWxfcGhvbmUnLFxuXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzInLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2VtYWlsJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnLFxuXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY291bnRyeScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3Bob25lJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnbm90ZScsXG4gICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICAgIF0pLCBcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdmVuZG9yLmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgZGV0YWlscyBvZiB0aGUgZ2l2ZW4gdmVuZG9yIGlkLlxuICAgKi9cbiAgZWRpdFZlbmRvcjoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCdpZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICAuLi52YWxpZGF0aW9Sb2xlcyxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGlkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgZm9ybSA9IHsgLi4ucmVxLmJvZHkgfTtcbiAgICAgIGNvbnN0IHsgVmVuZG9yIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdmVuZG9yID0gYXdhaXQgVmVuZG9yLnF1ZXJ5KCkud2hlcmUoJ2lkJywgaWQpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmVuZG9yKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuc2VuZCh7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVkVORE9SLk5PVC5GT1VORCcsIGNvZGU6IDIwMCB9XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5wYXRjaCh7XG4gICAgICAgIC4uLnBpY2soZm9ybSwgW1xuICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAnY29tcGFueV9uYW1lJyxcbiAgICAgICAgICAnZGlzcGxheV9uYW1lJyxcbiAgICAgICAgICBcbiAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICd3b3JrX3Bob25lJyxcbiAgICAgICAgICAncGVyc29uYWxfcGhvbmUnLFxuXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc18xJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzXzInLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ2JpbGxpbmdfYWRkcmVzc19jb3VudHJ5JyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX2VtYWlsJyxcbiAgICAgICAgICAnYmlsbGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3NfcGhvbmUnLFxuICAgICAgICAgICdiaWxsaW5nX2FkZHJlc3Nfc3RhdGUnLFxuXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfMicsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY2l0eScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfY291bnRyeScsXG4gICAgICAgICAgJ3NoaXBwaW5nX2FkZHJlc3NfZW1haWwnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3ppcGNvZGUnLFxuICAgICAgICAgICdzaGlwcGluZ19hZGRyZXNzX3Bob25lJyxcbiAgICAgICAgICAnc2hpcHBpbmdfYWRkcmVzc19zdGF0ZScsXG5cbiAgICAgICAgICAnbm90ZScsXG4gICAgICAgICAgJ2FjdGl2ZScsXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZXRhaWxzIG9mIHRoZSBnaXZlbiB2ZW5kb3IgaWQuXG4gICAqL1xuICBnZXRWZW5kb3I6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgnaWQnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgVmVuZG9yIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgeyBpZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZlbmRvciA9IGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5maXJzdCgpO1xuXG4gICAgICBpZiAoIXZlbmRvcikge1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZFTkRPUi5OT1QuRk9VTkQnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdmVuZG9yIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZ2l2ZW4gdmVuZG9yLlxuICAgKi9cbiAgZGVsZXRlVmVuZG9yOiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgcGFyYW0oJ2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IFZlbmRvciB9ID0gcmVxLm1vZGVscztcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHJlcS5wYXJhbXM7XG4gICAgICBjb25zdCB2ZW5kb3IgPSBhd2FpdCBWZW5kb3IucXVlcnkoKS53aGVyZSgnaWQnLCBpZCkuZmlyc3QoKTtcblxuICAgICAgaWYgKCF2ZW5kb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5zZW5kKHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdWRU5ET1IuTk9ULkZPVU5EJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFZlbmRvci5xdWVyeSgpLndoZXJlKCdpZCcsIGlkKS5kZWxldGUoKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCk7XG4gICAgfSxcbiAgfVxufTtcbiIsImltcG9ydCB7IGRpZmZlcmVuY2UsIHBpY2sgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgcXVlcnksXG4gIHBhcmFtLFxuICBvbmVPZixcbiAgdmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnZXhwcmVzcy12YWxpZGF0b3InO1xuaW1wb3J0IGFzeW5jTWlkZGxld2FyZSBmcm9tICdAL2h0dHAvbWlkZGxld2FyZS9hc3luY01pZGRsZXdhcmUnO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVWaWV3Um9sZXMsXG59IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHJlc291cmNlOiAnaXRlbXMnLFxuXG4gIC8qKlxuICAgKiBSb3V0ZXIgY29uc3RydWN0b3IuXG4gICAqL1xuICByb3V0ZXIoKSB7XG4gICAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxuICAgIHJvdXRlci5nZXQoJy8nLFxuICAgICAgdGhpcy5saXN0Vmlld3MudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmxpc3RWaWV3cy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIucG9zdCgnLycsXG4gICAgICB0aGlzLmNyZWF0ZVZpZXcudmFsaWRhdGlvbixcbiAgICAgIGFzeW5jTWlkZGxld2FyZSh0aGlzLmNyZWF0ZVZpZXcuaGFuZGxlcikpO1xuXG4gICAgcm91dGVyLnBvc3QoJy86dmlld19pZCcsXG4gICAgICB0aGlzLmVkaXRWaWV3LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5lZGl0Vmlldy5oYW5kbGVyKSk7XG5cbiAgICByb3V0ZXIuZGVsZXRlKCcvOnZpZXdfaWQnLFxuICAgICAgdGhpcy5kZWxldGVWaWV3LnZhbGlkYXRpb24sXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5kZWxldGVWaWV3LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86dmlld19pZCcsXG4gICAgICBhc3luY01pZGRsZXdhcmUodGhpcy5nZXRWaWV3LmhhbmRsZXIpKTtcblxuICAgIHJvdXRlci5nZXQoJy86dmlld19pZC9yZXNvdXJjZScsXG4gICAgICB0aGlzLmdldFZpZXdSZXNvdXJjZS52YWxpZGF0aW9uLFxuICAgICAgYXN5bmNNaWRkbGV3YXJlKHRoaXMuZ2V0Vmlld1Jlc291cmNlLmhhbmRsZXIpKTtcblxuICAgIHJldHVybiByb3V0ZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHZpZXdzIHRoYXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZS5cbiAgICovXG4gIGxpc3RWaWV3czoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIG9uZU9mKFtcbiAgICAgICAgcXVlcnkoJ3Jlc291cmNlX25hbWUnKS5leGlzdHMoKS50cmltKCkuZXNjYXBlKCksXG4gICAgICBdLCBbXG4gICAgICAgIHF1ZXJ5KCdyZXNvdXJjZV9pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBdKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgUmVzb3VyY2UsIFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB7IC4uLnJlcS5xdWVyeSB9O1xuXG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KCkub25CdWlsZCgoYnVpbGRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLnJlc291cmNlX2lkKSB7XG4gICAgICAgICAgYnVpbGRlci53aGVyZSgnaWQnLCBmaWx0ZXIucmVzb3VyY2VfaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIucmVzb3VyY2VfbmFtZSkge1xuICAgICAgICAgIGJ1aWxkZXIud2hlcmUoJ25hbWUnLCBmaWx0ZXIucmVzb3VyY2VfbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRlci5maXJzdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgVmlldy5xdWVyeSgpLndoZXJlKCdyZXNvdXJjZV9pZCcsIHJlc291cmNlLmlkKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHsgdmlld3MgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogUmV0cmlldmUgdmlldyBkZXRhaWxzIG9mIHRoZSBnaXZlbiB2aWV3IGlkLlxuICAgKi9cbiAgZ2V0Vmlldzoge1xuICAgIHZhbGlkYXRpb246IFtcbiAgICAgIHBhcmFtKCd2aWV3X2lkJykuZXhpc3RzKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICBdLFxuICAgIGFzeW5jIGhhbmRsZXIocmVxLCByZXMpIHtcbiAgICAgIGNvbnN0IHsgdmlld19pZDogdmlld0lkIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgeyBWaWV3IH0gPSByZXEubW9kZWxzO1xuXG4gICAgICBjb25zdCB2aWV3ID0gYXdhaXQgVmlldy5xdWVyeSgpXG4gICAgICAgIC53aGVyZSgnaWQnLCB2aWV3SWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdyZXNvdXJjZScpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJylcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ3JvbGVzLmZpZWxkJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZJRVdfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IHZpZXc6IHZpZXcudG9KU09OKCkgfSk7XG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBnaXZlbiB2aWV3IG9mIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIGRlbGV0ZVZpZXc6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IFZpZXcgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBWaWV3LnF1ZXJ5KCkuZmluZEJ5SWQodmlld0lkKTtcblxuICAgICAgaWYgKCF2aWV3KSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5ub3RGb3VuZChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVklFV19OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXcucHJlZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkUmVxdWVzdChudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnUFJFREVGSU5FRF9WSUVXJywgY29kZTogMjAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdmlldy4kcmVsYXRlZFF1ZXJ5KCdyb2xlcycpLmRlbGV0ZSgpLFxuICAgICAgICB2aWV3LiRyZWxhdGVkUXVlcnkoJ2NvbHVtbnMnKS5kZWxldGUoKSxcbiAgICAgIF0pO1xuICAgICAgYXdhaXQgVmlldy5xdWVyeSgpLndoZXJlKCdpZCcsIHZpZXcuaWQpLmRlbGV0ZSgpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoeyBpZDogdmlldy5pZCB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHZpZXcuXG4gICAqL1xuICBjcmVhdGVWaWV3OiB7XG4gICAgdmFsaWRhdGlvbjogW1xuICAgICAgY2hlY2soJ3Jlc291cmNlX25hbWUnKS5leGlzdHMoKS5lc2NhcGUoKS50cmltKCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdsb2dpY19leHByZXNzaW9uJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuICAgICAgY2hlY2soJ3JvbGVzJykuaXNBcnJheSh7IG1pbjogMSB9KSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmZpZWxkX2tleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmNvbXBhcmF0b3InKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY29sdW1ucycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG4gICAgICBjaGVjaygnY29sdW1ucy4qLmtleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaW5kZXgnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuICAgIF0sXG4gICAgYXN5bmMgaGFuZGxlcihyZXEsIHJlcykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQocmVxKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InLCAuLi52YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgUmVzb3VyY2UsXG4gICAgICAgIFZpZXcsXG4gICAgICAgIFZpZXdDb2x1bW4sXG4gICAgICAgIFZpZXdSb2xlLFxuICAgICAgfSA9IHJlcS5tb2RlbHM7XG4gICAgICBjb25zdCBmb3JtID0geyByb2xlczogW10sIC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KCkud2hlcmUoJ25hbWUnLCBmb3JtLnJlc291cmNlX25hbWUpLmZpcnN0KCk7XG5cbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLm5vdEZvdW5kKG51bGwsIHtcbiAgICAgICAgICBlcnJvcnM6IFt7IHR5cGU6ICdSRVNPVVJDRV9OT1RfRk9VTkQnLCBjb2RlOiAxMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JSZWFzb25zID0gW107XG4gICAgICBjb25zdCBmaWVsZHNTbHVncyA9IGZvcm0ucm9sZXMubWFwKChyb2xlKSA9PiByb2xlLmZpZWxkX2tleSk7XG5cbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzID0gYXdhaXQgcmVzb3VyY2UuJHJlbGF0ZWRRdWVyeSgnZmllbGRzJyk7XG4gICAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSByZXNvdXJjZUZpZWxkcy5tYXAoKGYpID0+IGYua2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5c01hcCA9IG5ldyBNYXAocmVzb3VyY2VGaWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmtleSwgZmllbGRdKSk7XG4gICAgICBjb25zdCBjb2x1bW5zS2V5cyA9IGZvcm0uY29sdW1ucy5tYXAoKGMpID0+IGMua2V5KTtcblxuICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RvcmVkIHJlc291cmNlIGZpZWxkcyBhbmQgc3VibWl0IGZpZWxkcyBrZXlzLlxuICAgICAgY29uc3Qgbm90Rm91bmRGaWVsZHMgPSBkaWZmZXJlbmNlKGZpZWxkc1NsdWdzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuXG4gICAgICBpZiAobm90Rm91bmRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdSRVNPVVJDRV9GSUVMRFNfTk9UX0VYSVNUJywgY29kZTogMTAwLCBmaWVsZHM6IG5vdEZvdW5kRmllbGRzIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3RvcmVkIHJlc291cmNlIGZpZWxkcyBhbmQgdGhlIHN1Ym1pdCBjb2x1bW5zIGtleXMuXG4gICAgICBjb25zdCBub3RGb3VuZENvbHVtbnMgPSBkaWZmZXJlbmNlKGNvbHVtbnNLZXlzLCByZXNvdXJjZUZpZWxkc0tleXMpO1xuXG4gICAgICBpZiAobm90Rm91bmRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnQ09MVU1OU19OT1RfRVhJU1QnLCBjb2RlOiAyMDAsIGNvbHVtbnM6IG5vdEZvdW5kQ29sdW1ucyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlcyB0aGUgdmlldyBjb25kaXRpb25hbCBsb2dpYyBleHByZXNzaW9uLlxuICAgICAgaWYgKCF2YWxpZGF0ZVZpZXdSb2xlcyhmb3JtLnJvbGVzLCBmb3JtLmxvZ2ljX2V4cHJlc3Npb24pKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuUk9MRVMuTE9HSUMuRVhQUkVTU0lPTi5JTlZBTElEJywgY29kZTogNDAwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuYm9vbS5iYWRSZXF1ZXN0KG51bGwsIHsgZXJyb3JzOiBlcnJvclJlYXNvbnMgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgdmlldyBkZXRhaWxzLlxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICBuYW1lOiBmb3JtLm5hbWUsXG4gICAgICAgIHByZWRlZmluZWQ6IGZhbHNlLFxuICAgICAgICByZXNvdXJjZV9pZDogcmVzb3VyY2UuaWQsXG4gICAgICAgIHJvbGVzX2xvZ2ljX2V4cHJlc3Npb246IGZvcm0ubG9naWNfZXhwcmVzc2lvbixcbiAgICAgIH0pO1xuICAgICAgLy8gU2F2ZSB2aWV3IHJvbGVzIGFzeW5jIG9wZXJhdGlvbnMuXG4gICAgICBjb25zdCBzYXZlVmlld1JvbGVzT3BlcnMgPSBbXTtcblxuICAgICAgZm9ybS5yb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KHJvbGUuZmllbGRfa2V5KTtcblxuICAgICAgICBjb25zdCBzYXZlVmlld1JvbGVPcGVyID0gVmlld1JvbGUucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIC4uLnBpY2socm9sZSwgWydjb21wYXJhdG9yJywgJ3ZhbHVlJywgJ2luZGV4J10pLFxuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBzYXZlVmlld1JvbGVzT3BlcnMucHVzaChzYXZlVmlld1JvbGVPcGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3JtLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KGNvbHVtbi5rZXkpO1xuXG4gICAgICAgIGNvbnN0IHNhdmVWaWV3Q29sdW1uT3BlciA9IFZpZXdDb2x1bW4ucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgICAgaW5kZXg6IGNvbHVtbi5pbmRleCxcbiAgICAgICAgfSk7XG4gICAgICAgIHNhdmVWaWV3Um9sZXNPcGVycy5wdXNoKHNhdmVWaWV3Q29sdW1uT3Blcik7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHNhdmVWaWV3Um9sZXNPcGVycyk7XG5cbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuc2VuZCh7IGlkOiB2aWV3LmlkIH0pO1xuICAgIH0sXG4gIH0sXG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIGdpdmVuIGN1c3RvbSB2aWV3IG1ldGFkYXRhLlxuICAgKi9cbiAgZWRpdFZpZXc6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnbmFtZScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdsb2dpY19leHByZXNzaW9uJykuZXhpc3RzKCkudHJpbSgpLmVzY2FwZSgpLFxuXG4gICAgICBjaGVjaygnY29sdW1ucycpLmV4aXN0cygpLmlzQXJyYXkoeyBtaW46IDEgfSksXG5cbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaWQnKS5vcHRpb25hbCgpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgICBjaGVjaygnY29sdW1ucy4qLmtleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdjb2x1bW5zLiouaW5kZXgnKS5leGlzdHMoKS5pc051bWVyaWMoKS50b0ludCgpLFxuXG4gICAgICBjaGVjaygncm9sZXMnKS5pc0FycmF5KCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pZCcpLm9wdGlvbmFsKCkuaXNOdW1lcmljKCkudG9JbnQoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmZpZWxkX2tleScpLmV4aXN0cygpLmVzY2FwZSgpLnRyaW0oKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLmNvbXBhcmF0b3InKS5leGlzdHMoKSxcbiAgICAgIGNoZWNrKCdyb2xlcy4qLnZhbHVlJykuZXhpc3RzKCksXG4gICAgICBjaGVjaygncm9sZXMuKi5pbmRleCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0KHJlcSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5ib29tLmJhZERhdGEobnVsbCwge1xuICAgICAgICAgIGNvZGU6ICd2YWxpZGF0aW9uX2Vycm9yJywgLi4udmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIFZpZXcsIFZpZXdSb2xlLCBWaWV3Q29sdW1uLCBSZXNvdXJjZSxcbiAgICAgIH0gPSByZXEubW9kZWxzO1xuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKS53aGVyZSgnaWQnLCB2aWV3SWQpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdyb2xlcy5maWVsZCcpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCdjb2x1bW5zJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1JPTEVfTk9UX0ZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm0gPSB7IC4uLnJlcS5ib2R5IH07XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IFJlc291cmNlLnF1ZXJ5KClcbiAgICAgICAgLndoZXJlKCdpZCcsIHZpZXcucmVzb3VyY2VJZClcbiAgICAgICAgLndpdGhHcmFwaEZldGNoZWQoJ2ZpZWxkcycpXG4gICAgICAgIC53aXRoR3JhcGhGZXRjaGVkKCd2aWV3cycpXG4gICAgICAgIC5maXJzdCgpO1xuXG4gICAgICBjb25zdCBlcnJvclJlYXNvbnMgPSBbXTtcbiAgICAgIGNvbnN0IGZpZWxkc1NsdWdzID0gZm9ybS5yb2xlcy5tYXAoKHJvbGUpID0+IHJvbGUuZmllbGRfa2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5cyA9IHJlc291cmNlLmZpZWxkcy5tYXAoKGYpID0+IGYua2V5KTtcbiAgICAgIGNvbnN0IHJlc291cmNlRmllbGRzS2V5c01hcCA9IG5ldyBNYXAocmVzb3VyY2UuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5rZXksIGZpZWxkXSkpO1xuICAgICAgY29uc3QgY29sdW1uc0tleXMgPSBmb3JtLmNvbHVtbnMubWFwKChjKSA9PiBjLmtleSk7XG5cbiAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0b3JlZCByZXNvdXJjZSBmaWVsZHMgYW5kIHN1Ym1pdCBmaWVsZHMga2V5cy5cbiAgICAgIGNvbnN0IG5vdEZvdW5kRmllbGRzID0gZGlmZmVyZW5jZShmaWVsZHNTbHVncywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbm90IGZvdW5kIHJlc291cmNlIGZpZWxkcyBrZXlzLlxuICAgICAgaWYgKG5vdEZvdW5kRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdSRVNPVVJDRV9GSUVMRFNfTk9UX0VYSVNUJywgY29kZTogMTAwLCBmaWVsZHM6IG5vdEZvdW5kRmllbGRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0b3JlZCByZXNvdXJjZSBmaWVsZHMgYW5kIHRoZSBzdWJtaXQgY29sdW1ucyBrZXlzLlxuICAgICAgY29uc3Qgbm90Rm91bmRDb2x1bW5zID0gZGlmZmVyZW5jZShjb2x1bW5zS2V5cywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcblxuICAgICAgLy8gVmFsaWRhdGUgbm90IGZvdW5kIHZpZXcgY29sdW1ucy5cbiAgICAgIGlmIChub3RGb3VuZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdSRVNPVVJDRV9DT0xVTU5TX05PVF9FWElTVCcsIGNvZGU6IDIwMCwgY29sdW1uczogbm90Rm91bmRDb2x1bW5zIH0pO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGVzIHRoZSB2aWV3IGNvbmRpdGlvbmFsIGxvZ2ljIGV4cHJlc3Npb24uXG4gICAgICBpZiAoIXZhbGlkYXRlVmlld1JvbGVzKGZvcm0ucm9sZXMsIGZvcm0ubG9naWNfZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXJyb3JSZWFzb25zLnB1c2goeyB0eXBlOiAnVklFVy5ST0xFUy5MT0dJQy5FWFBSRVNTSU9OLklOVkFMSUQnLCBjb2RlOiA0MDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXdSb2xlc0lkcyA9IHZpZXcucm9sZXMubWFwKChyKSA9PiByLmlkKTtcbiAgICAgIGNvbnN0IHZpZXdDb2x1bW5zSWRzID0gdmlldy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCk7XG5cbiAgICAgIGNvbnN0IGZvcm1VcGRhdGVkUm9sZXMgPSBmb3JtLnJvbGVzLmZpbHRlcigocikgPT4gci5pZCk7XG4gICAgICBjb25zdCBmb3JtSW5zZXJ0Um9sZXMgPSBmb3JtLnJvbGVzLmZpbHRlcigocikgPT4gIXIuaWQpO1xuXG4gICAgICBjb25zdCBmb3JtUm9sZXNJZHMgPSBmb3JtVXBkYXRlZFJvbGVzLm1hcCgocikgPT4gci5pZCk7XG5cbiAgICAgIGNvbnN0IGZvcm1VcGRhdGVkQ29sdW1ucyA9IGZvcm0uY29sdW1ucy5maWx0ZXIoKHIpID0+IHIuaWQpO1xuICAgICAgY29uc3QgZm9ybUluc2VydGVkQ29sdW1ucyA9IGZvcm0uY29sdW1ucy5maWx0ZXIoKHIpID0+ICFyLmlkKTtcbiAgICAgIGNvbnN0IGZvcm1Db2x1bW5zSWRzID0gZm9ybVVwZGF0ZWRDb2x1bW5zLm1hcCgocikgPT4gci5pZCk7XG5cbiAgICAgIGNvbnN0IHJvbGVzSWRzU2hvdWxkRGVsZXRlZCA9IGRpZmZlcmVuY2Uodmlld1JvbGVzSWRzLCBmb3JtUm9sZXNJZHMpO1xuICAgICAgY29uc3QgY29sdW1uc0lkc1Nob3VsZERlbGV0ZSA9IGRpZmZlcmVuY2Uodmlld0NvbHVtbnNJZHMsIGZvcm1Db2x1bW5zSWRzKTtcblxuICAgICAgY29uc3Qgbm90Rm91bmRWaWV3Um9sZXNJZHMgPSBkaWZmZXJlbmNlKGZvcm1Sb2xlc0lkcywgdmlld1JvbGVzSWRzKTtcbiAgICAgIGNvbnN0IG5vdEZvdW5kVmlld0NvbHVtbnNJZHMgPSBkaWZmZXJlbmNlKHZpZXdDb2x1bW5zSWRzLCB2aWV3Q29sdW1uc0lkcyk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgdmlldyByb2xlcyBpZHMuXG4gICAgICBpZiAobm90Rm91bmRWaWV3Um9sZXNJZHMubGVuZ3RoKSB7XG4gICAgICAgIGVycm9yUmVhc29ucy5wdXNoKHsgdHlwZTogJ1ZJRVcuUk9MRVMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDUwMCwgaWRzOiBub3RGb3VuZFZpZXdSb2xlc0lkcyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBub3QgZm91bmQgdmlldyBjb2x1bW5zIGlkcy5cbiAgICAgIGlmIChub3RGb3VuZFZpZXdDb2x1bW5zSWRzLmxlbmd0aCkge1xuICAgICAgICBlcnJvclJlYXNvbnMucHVzaCh7IHR5cGU6ICdWSUVXLkNPTFVNTlMuSURTLk5PVC5GT1VORCcsIGNvZGU6IDYwMCwgaWRzOiBub3RGb3VuZFZpZXdDb2x1bW5zSWRzIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yUmVhc29ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yczogZXJyb3JSZWFzb25zIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYXN5bmNPcGVycyA9IFtdO1xuXG4gICAgICAvLyBTYXZlIHZpZXcgZGV0YWlscy5cbiAgICAgIGF3YWl0IFZpZXcucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdmlldy5pZClcbiAgICAgICAgLnBhdGNoKHtcbiAgICAgICAgICBuYW1lOiBmb3JtLm5hbWUsXG4gICAgICAgICAgcm9sZXNfbG9naWNfZXhwcmVzc2lvbjogZm9ybS5sb2dpY19leHByZXNzaW9uLFxuICAgICAgICB9KTtcblxuICAgICAgLy8gVXBkYXRlIHZpZXcgcm9sZXMuXG4gICAgICBpZiAoZm9ybVVwZGF0ZWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvcm1VcGRhdGVkUm9sZXMuZm9yRWFjaCgocm9sZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkTW9kZWwgPSByZXNvdXJjZUZpZWxkc0tleXNNYXAuZ2V0KHJvbGUuZmllbGRfa2V5KTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVPcGVyID0gVmlld1JvbGUucXVlcnkoKVxuICAgICAgICAgICAgLndoZXJlKCdpZCcsIHJvbGUuaWQpXG4gICAgICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAgICAgLi4ucGljayhyb2xlLCBbJ2NvbXBhcmF0b3InLCAndmFsdWUnLCAnaW5kZXgnXSksXG4gICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYXN5bmNPcGVycy5wdXNoKHVwZGF0ZU9wZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIEluc2VydCBhIG5ldyB2aWV3IHJvbGVzLlxuICAgICAgaWYgKGZvcm1JbnNlcnRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvcm1JbnNlcnRSb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmllbGRNb2RlbCA9IHJlc291cmNlRmllbGRzS2V5c01hcC5nZXQocm9sZS5maWVsZF9rZXkpO1xuICAgICAgICAgIGNvbnN0IGluc2VydE9wZXIgPSBWaWV3Um9sZS5xdWVyeSgpXG4gICAgICAgICAgICAuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgLi4ucGljayhyb2xlLCBbJ2NvbXBhcmF0b3InLCAndmFsdWUnLCAnaW5kZXgnXSksXG4gICAgICAgICAgICAgIGZpZWxkX2lkOiBmaWVsZE1vZGVsLmlkLFxuICAgICAgICAgICAgICB2aWV3X2lkOiB2aWV3LmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYXN5bmNPcGVycy5wdXNoKGluc2VydE9wZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSB2aWV3IHJvbGVzLlxuICAgICAgaWYgKHJvbGVzSWRzU2hvdWxkRGVsZXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wZXIgPSBWaWV3Um9sZS5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlSW4oJ2lkJywgcm9sZXNJZHNTaG91bGREZWxldGVkKVxuICAgICAgICAgIC5kZWxldGUoKTtcbiAgICAgICAgYXN5bmNPcGVycy5wdXNoKGRlbGV0ZU9wZXIpO1xuICAgICAgfVxuICAgICAgLy8gSW5zZXJ0IGEgbmV3IHZpZXcgY29sdW1ucyB0byB0aGUgc3RvcmFnZS5cbiAgICAgIGlmIChmb3JtSW5zZXJ0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybUluc2VydGVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWVsZE1vZGVsID0gcmVzb3VyY2VGaWVsZHNLZXlzTWFwLmdldChjb2x1bW4ua2V5KTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRPcGVyID0gVmlld0NvbHVtbi5xdWVyeSgpXG4gICAgICAgICAgICAuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgZmllbGRfaWQ6IGZpZWxkTW9kZWwuaWQsXG4gICAgICAgICAgICAgIGluZGV4OiBjb2x1bW4uaW5kZXgsXG4gICAgICAgICAgICAgIHZpZXdfaWQ6IHZpZXcuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBhc3luY09wZXJzLnB1c2goaW5zZXJ0T3Blcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3IGNvbHVtbnMgb24gdGhlIHN0b3JhZ2UuXG4gICAgICBpZiAoZm9ybVVwZGF0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybVVwZGF0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZU9wZXIgPSBWaWV3Q29sdW1uLnF1ZXJ5KClcbiAgICAgICAgICAgIC53aGVyZSgnaWQnLCBjb2x1bW4uaWQpXG4gICAgICAgICAgICAudXBkYXRlKHtcbiAgICAgICAgICAgICAgaW5kZXg6IGNvbHVtbi5pbmRleCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGFzeW5jT3BlcnMucHVzaCh1cGRhdGVPcGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgdGhlIHZpZXcgY29sdW1ucyBmcm9tIHRoZSBzdG9yYWdlLlxuICAgICAgaWYgKGNvbHVtbnNJZHNTaG91bGREZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBkZWxldGVPcGVyID0gVmlld0NvbHVtbi5xdWVyeSgpXG4gICAgICAgICAgLndoZXJlSW4oJ2lkJywgY29sdW1uc0lkc1Nob3VsZERlbGV0ZSlcbiAgICAgICAgICAuZGVsZXRlKCk7XG4gICAgICAgIGFzeW5jT3BlcnMucHVzaChkZWxldGVPcGVyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFzeW5jT3BlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLnNlbmQoKTtcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSByZXNvdXJjZSBjb2x1bW5zIHRoYXQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gY3VzdG9tIHZpZXcuXG4gICAqL1xuICBnZXRWaWV3UmVzb3VyY2U6IHtcbiAgICB2YWxpZGF0aW9uOiBbXG4gICAgICBwYXJhbSgndmlld19pZCcpLmV4aXN0cygpLmlzTnVtZXJpYygpLnRvSW50KCksXG4gICAgXSxcbiAgICBhc3luYyBoYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgICBjb25zdCB7IHZpZXdfaWQ6IHZpZXdJZCB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IHsgVmlldyB9ID0gcmVxLm1vZGVscztcbiAgICAgIFxuICAgICAgY29uc3QgdmlldyA9IGF3YWl0IFZpZXcucXVlcnkoKVxuICAgICAgICAud2hlcmUoJ2lkJywgdmlld0lkKVxuICAgICAgICAud2l0aEdyYXBoRmV0Y2hlZCgncmVzb3VyY2UuZmllbGRzJylcbiAgICAgICAgLmZpcnN0KCk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20ubm90Rm91bmQobnVsbCwge1xuICAgICAgICAgIGVycm9yczogW3sgdHlwZTogJ1ZJRVcuTk9ULkZPVU5EJywgY29kZTogMTAwIH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdmlldy5yZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcmVzLmJvb20uYmFkRGF0YShudWxsLCB7XG4gICAgICAgICAgZXJyb3JzOiBbeyB0eXBlOiAnVklFVy5IQVMuTk9ULkFTU09DSUFURUQuUkVTT1VSQ0UnLCBjb2RlOiAyMDAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvdXJjZUNvbHVtbnMgPSB2aWV3LnJlc291cmNlLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQuY29sdW1uYWJsZSlcbiAgICAgICAgLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgICAgaWQ6IGZpZWxkLmlkLFxuICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbE5hbWUsXG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHtcbiAgICAgICAgcmVzb3VyY2Vfc2x1Zzogdmlldy5yZXNvdXJjZS5uYW1lLFxuICAgICAgICByZXNvdXJjZV9jb2x1bW5zOiByZXNvdXJjZUNvbHVtbnMsXG4gICAgICAgIHJlc291cmNlX2ZpZWxkczogdmlldy5yZXNvdXJjZS5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuIiwiLy8gaW1wb3J0IE9BdXRoMiBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvT0F1dGgyJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IEF1dGhlbnRpY2F0aW9uIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BdXRoZW50aWNhdGlvbic7XG5pbXBvcnQgSW52aXRlVXNlcnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0ludml0ZVVzZXJzJztcbmltcG9ydCBVc2VycyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVXNlcnMnO1xuLy8gaW1wb3J0IFJvbGVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9Sb2xlcyc7XG5pbXBvcnQgSXRlbXMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0l0ZW1zJztcbmltcG9ydCBJdGVtQ2F0ZWdvcmllcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvSXRlbUNhdGVnb3JpZXMnO1xuaW1wb3J0IEFjY291bnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50cyc7XG5pbXBvcnQgQWNjb3VudFR5cGVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50VHlwZXMnO1xuLy8gaW1wb3J0IEFjY291bnRPcGVuaW5nQmFsYW5jZSBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQWNjb3VudE9wZW5pbmdCYWxhbmNlJztcbmltcG9ydCBWaWV3cyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVmlld3MnO1xuLy8gaW1wb3J0IEN1c3RvbUZpZWxkcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRmllbGRzJztcbmltcG9ydCBBY2NvdW50aW5nIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9BY2NvdW50aW5nJztcbmltcG9ydCBGaW5hbmNpYWxTdGF0ZW1lbnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9GaW5hbmNpYWxTdGF0ZW1lbnRzJztcbmltcG9ydCBFeHBlbnNlcyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvRXhwZW5zZXMnO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL09wdGlvbnMnO1xuLy8gaW1wb3J0IEJ1ZGdldCBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvQnVkZ2V0Jztcbi8vIGltcG9ydCBCdWRnZXRSZXBvcnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9CdWRnZXRSZXBvcnRzJztcbmltcG9ydCBDdXJyZW5jaWVzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9DdXJyZW5jaWVzJztcbmltcG9ydCBDdXN0b21lcnMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0N1c3RvbWVycyc7XG5pbXBvcnQgVmVuZG9ycyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvVmVuZG9ycyc7XG4vLyBpbXBvcnQgU3VwcGxpZXJzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9TdXBwbGllcnMnO1xuLy8gaW1wb3J0IEJpbGxzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9CaWxscyc7XG4vLyBpbXBvcnQgQ3VycmVuY3lBZGp1c3RtZW50IGZyb20gJy4vY29udHJvbGxlcnMvQ3VycmVuY3lBZGp1c3RtZW50JztcbmltcG9ydCBSZXNvdXJjZXMgZnJvbSAnLi9jb250cm9sbGVycy9SZXNvdXJjZXMnO1xuaW1wb3J0IEV4Y2hhbmdlUmF0ZXMgZnJvbSAnQC9odHRwL2NvbnRyb2xsZXJzL0V4Y2hhbmdlUmF0ZXMnO1xuLy8gaW1wb3J0IFNhbGVzUmVwb3J0cyBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvU2FsZXNSZXBvcnRzJztcbi8vIGltcG9ydCBQdXJjaGFzZXNSZXBvcnRzIGZyb20gJ0AvaHR0cC9jb250cm9sbGVycy9QdXJjaGFzZXNSZXBvcnRzJztcbmltcG9ydCBNZWRpYSBmcm9tICdAL2h0dHAvY29udHJvbGxlcnMvTWVkaWEnO1xuaW1wb3J0IEpXVEF1dGggZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvand0QXV0aCc7XG5pbXBvcnQgVGVuYW5jeU1pZGRsZXdhcmUgZnJvbSAnQC9odHRwL21pZGRsZXdhcmUvVGVuYW5jeU1pZGRsZXdhcmUnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IChhcHApID0+IHtcbiAgLy8gYXBwLnVzZSgnL2FwaS9vYXV0aDInLCBPQXV0aDIucm91dGVyKCkpO1xuICBhcHAudXNlKCcvYXBpL2F1dGgnLCBBdXRoZW50aWNhdGlvbi5yb3V0ZXIoKSk7XG4gIGFwcC51c2UoJy9hcGkvaW52aXRlJywgSW52aXRlVXNlcnMucm91dGVyKCkpO1xuXG4gIGNvbnN0IGRhc2hib2FyZCA9IGV4cHJlc3MuUm91dGVyKCk7XG5cbiAgZGFzaGJvYXJkLnVzZShKV1RBdXRoKTtcbiAgZGFzaGJvYXJkLnVzZShUZW5hbmN5TWlkZGxld2FyZSk7XG5cbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS9jdXJyZW5jaWVzJywgQ3VycmVuY2llcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvdXNlcnMnLCBVc2Vycy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvcm9sZXMnLCBSb2xlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudHMnLCBBY2NvdW50cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudF90eXBlcycsIEFjY291bnRUeXBlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvYWNjb3VudGluZycsIEFjY291bnRpbmcucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2FjY291bnRzX29wZW5pbmdfYmFsYW5jZXMnLCBBY2NvdW50T3BlbmluZ0JhbGFuY2Uucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL3ZpZXdzJywgVmlld3Mucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2ZpZWxkcycsIEN1c3RvbUZpZWxkcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvaXRlbXMnLCBJdGVtcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvaXRlbV9jYXRlZ29yaWVzJywgSXRlbUNhdGVnb3JpZXMucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL2V4cGVuc2VzJywgRXhwZW5zZXMucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL2ZpbmFuY2lhbF9zdGF0ZW1lbnRzJywgRmluYW5jaWFsU3RhdGVtZW50cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvb3B0aW9ucycsIE9wdGlvbnMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL2J1ZGdldF9yZXBvcnRzJywgQnVkZ2V0UmVwb3J0cy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvY3VzdG9tZXJzJywgQ3VzdG9tZXJzLnJvdXRlcigpKTtcbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS92ZW5kb3JzJywgVmVuZG9ycy5yb3V0ZXIoKSk7XG4gIC8vIGFwcC51c2UoJy9hcGkvc3VwcGxpZXJzJywgU3VwcGxpZXJzLnJvdXRlcigpKTtcbiAgLy8gYXBwLnVzZSgnL2FwaS9iaWxscycsIEJpbGxzLnJvdXRlcigpKTtcbiAgLy8gYXBwLnVzZSgnL2FwaS9idWRnZXQnLCBCdWRnZXQucm91dGVyKCkpO1xuICBkYXNoYm9hcmQudXNlKCcvYXBpL3Jlc291cmNlcycsIFJlc291cmNlcy5yb3V0ZXIoKSk7XG4gIGRhc2hib2FyZC51c2UoJy9hcGkvZXhjaGFuZ2VfcmF0ZXMnLCBFeGNoYW5nZVJhdGVzLnJvdXRlcigpKTtcbiAgZGFzaGJvYXJkLnVzZSgnL2FwaS9tZWRpYScsIE1lZGlhLnJvdXRlcigpKTtcblxuICBhcHAudXNlKCcvJywgZGFzaGJvYXJkKTsgIFxuICAvLyBhcHAudXNlKCcvYXBpL2N1cnJlbmN5X2FkanVzdG1lbnQnLCBDdXJyZW5jeUFkanVzdG1lbnQucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL3JlcG9ydHMvc2FsZXMnLCBTYWxlc1JlcG9ydHMucm91dGVyKCkpO1xuICAvLyBhcHAudXNlKCcvYXBpL3JlcG9ydHMvcHVyY2hhc2VzJywgUHVyY2hhc2VzUmVwb3J0cy5yb3V0ZXIoKSk7XG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudHNNYW5hZ2VyIGZyb20gJ0Avc3lzdGVtL1RlbmFudHNNYW5hZ2VyJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmZ1bmN0aW9uIGxvYWRNb2RlbHNGcm9tRGlyZWN0b3J5KCkge1xuICBjb25zdCBtb2RlbHMgPSB7fTtcbiAgZnMucmVhZGRpclN5bmMoJ3NyYy9tb2RlbHMvJykuZm9yRWFjaCgoZmlsZW5hbWUpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHtcbiAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsICdzcmMvbW9kZWxzLycsIGZpbGVuYW1lKSxcbiAgICAgIG5hbWU6IGZpbGVuYW1lLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyksXG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBtb2RlbC5yZXNvdXJjZSA9IHJlcXVpcmUoYEAvbW9kZWxzLyR7bW9kZWwubmFtZX1gKTtcbiAgICBtb2RlbHNbbW9kZWwubmFtZV0gPSBtb2RlbDtcbiAgfSk7XG4gIHJldHVybiBtb2RlbHM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICBjb25zdCBvcmdhbml6YXRpb25JZCA9IHJlcS5oZWFkZXJzWydvcmdhbml6YXRpb24taWQnXSB8fCByZXEucXVlcnkub3JnYW5pemF0aW9uO1xuICBjb25zdCBub3RGb3VuZE9yZ2FuaXphdGlvbiA9ICgpID0+IHJlcy5ib29tLnVuYXV0aG9yaXplZChcbiAgICAnT3JnYW5pemF0aW9uIGlkZW50aWNhdGlvbiBub3QgZm91bmQuJyxcbiAgICB7IGVycm9yczogW3sgdHlwZTogJ09SR0FOSVpBVElPTi5JRC5OT1QuRk9VTkQnLCBjb2RlOiAxMDAgfV0gfSxcbiAgKTtcblxuICBpZiAoIW9yZ2FuaXphdGlvbklkKSB7XG4gICAgcmV0dXJuIG5vdEZvdW5kT3JnYW5pemF0aW9uKCk7XG4gIH1cbiAgY29uc3QgdGVuYW50ID0gYXdhaXQgVGVuYW50c01hbmFnZXIuZ2V0VGVuYW50KG9yZ2FuaXphdGlvbklkKTtcblxuICAvLyBXaGVuIHRoZSBnaXZlbiBvcmdhbml6YXRpb24gaWQgbm90IGZvdW5kIG9uIHRoZSBzeXN0ZW0gc3RvcmFnZS5cbiAgaWYgKCF0ZW5hbnQpIHtcbiAgICByZXR1cm4gbm90Rm91bmRPcmdhbml6YXRpb24oKTtcbiAgfVxuICAvLyBXaGVuIHVzZXIgdGVuYW50IG5vdCBtYXRjaCB0aGUgZ2l2ZW4gb3JnYW5pemF0aW9uIGlkLlxuICBpZiAodGVuYW50LmlkICE9PSByZXEudXNlci50ZW5hbnRJZCkge1xuICAgIHJldHVybiByZXMuYm9vbS51bmF1dGhvcml6ZWQoKTtcbiAgfVxuICBjb25zdCBrbmV4ID0gVGVuYW50c01hbmFnZXIua25leEluc3RhbmNlKG9yZ2FuaXphdGlvbklkKTtcbiAgY29uc3QgbW9kZWxzID0gbG9hZE1vZGVsc0Zyb21EaXJlY3RvcnkoKTtcblxuICBUZW5hbnRNb2RlbC5rbmV4QmluZGVkID0ga25leDtcblxuICByZXEua25leCA9IGtuZXg7XG4gIHJlcS5vcmdhbml6YXRpb25JZCA9IG9yZ2FuaXphdGlvbklkO1xuICByZXEubW9kZWxzID0ge1xuICAgIC4uLk9iamVjdC52YWx1ZXMobW9kZWxzKS5yZWR1Y2UoKGFjYywgbW9kZWwpID0+IHsgICAgICBcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwucmVzb3VyY2UuZGVmYXVsdC5yZXF1ZXN0TW9kZWwgPT09ICdmdW5jdGlvbicgJiYgXG4gICAgICAgIG1vZGVsLnJlc291cmNlLmRlZmF1bHQucmVxdWVzdE1vZGVsKCkgJiZcbiAgICAgICAgbW9kZWwubmFtZSAhPT0gJ1RlbmFudE1vZGVsJykge1xuICAgICAgICBhY2NbbW9kZWwubmFtZV0gPSBtb2RlbC5yZXNvdXJjZS5kZWZhdWx0LmJpbmRLbmV4KGtuZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSksXG4gIH07XG4gIG5leHQoKTtcbn07IiwiY29uc3QgYXN5bmNNaWRkbGV3YXJlID0gKGZuKSA9PiAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgUHJvbWlzZS5yZXNvbHZlKGZuKHJlcSwgcmVzLCBuZXh0KSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jTWlkZGxld2FyZTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgU3lzdGVtVXNlciBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtVXNlcic7XG5cbmNvbnN0IGF1dGhNaWRkbGV3YXJlID0gKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIGNvbnN0IHsgSldUX1NFQ1JFVF9LRVkgfSA9IHByb2Nlc3MuZW52O1xuICBjb25zdCB0b2tlbiA9IHJlcS5oZWFkZXJzWyd4LWFjY2Vzcy10b2tlbiddIHx8IHJlcS5xdWVyeS50b2tlbjtcblxuICBjb25zdCBvbkVycm9yID0gKCkgPT4geyByZXMuYm9vbS51bmF1dGhvcml6ZWQoKTsgfTtcblxuICBpZiAoIXRva2VuKSB7IHJldHVybiBvbkVycm9yKCk7IH1cblxuICBjb25zdCB2ZXJpZnkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgand0LnZlcmlmeSh0b2tlbiwgSldUX1NFQ1JFVF9LRVksIGFzeW5jIChlcnJvciwgZGVjb2RlZCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgcmVxLnVzZXIgPSBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KCkuZmluZEJ5SWQoZGVjb2RlZC5faWQpO1xuXG4gICAgICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgICAgICByZXR1cm4gb25FcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGVjb2RlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZlcmlmeS50aGVuKCgpID0+IHsgbmV4dCgpOyB9KS5jYXRjaChvbkVycm9yKTtcbn07XG5leHBvcnQgZGVmYXVsdCBhdXRoTWlkZGxld2FyZTtcbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuaW1wb3J0IENhY2hlU2VydmljZSBmcm9tICdAL3NlcnZpY2VzL0NhY2hlJztcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsKSA9PiB7XG4gIHJldHVybiBjbGFzcyBDYWNoYWJsZU1vZGVsIGV4dGVuZHMgTW9kZWx7XG4gICAgc3RhdGljIGZsdXNoQ2FjaGUoa2V5KSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm5hbWU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgQ2FjaGVTZXJ2aWNlLmRlbChgJHttb2RlbE5hbWV9LiR7a2V5fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ2FjaGVTZXJ2aWNlLmRlbFN0YXJ0V2l0aChtb2RlbE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0gIiwiaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBDYWNoZVNlcnZpY2UgZnJvbSAnQC9zZXJ2aWNlcy9DYWNoZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hhYmxlUXVlcnlCdWlsZGVyIGV4dGVuZHMgUXVlcnlCdWlsZGVye1xuXG4gIGFzeW5jIHRoZW4oLi4uYXJncykge1xuICAgIC8vIEZsdXNoIG1vZGVsIGNhY2hlIGFmdGVyIGluc2VydCwgZGVsZXRlIG9yIHVwZGF0ZSB0cmFuc2FjdGlvbi5cbiAgICBpZiAodGhpcy5pc0luc2VydCgpIHx8IHRoaXMuaXNEZWxldGUoKSB8fCB0aGlzLmlzVXBkYXRlKCkpIHtcbiAgICAgIHRoaXMubW9kZWxDbGFzcygpLmZsdXNoQ2FjaGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FjaGVUYWcgJiYgdGhpcy5pc0ZpbmQoKSkge1xuICAgICAgdGhpcy5zZXRDYWNoZUtleSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JTdG9yZUNhY2hlKCkudGhlbiguLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZXhlY3V0ZSgpO1xuICAgIFxuICAgICAgcmV0dXJuIHByb21pc2UudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q2FjaGUocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLnRoZW4oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3JTdG9yZUNhY2hlKCkge1xuICAgIGNvbnN0IHN0b3JlRnVuY3Rpb24gPSAoKSA9PiB0aGlzLmV4ZWN1dGUoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBDYWNoZVNlcnZpY2UuZ2V0KHRoaXMuY2FjaGVLZXksIHN0b3JlRnVuY3Rpb24pXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHsgcmVzb2x2ZShyZXN1bHQpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldENhY2hlKHJlc3VsdHMpIHtcbiAgICBDYWNoZVNlcnZpY2Uuc2V0KGAke3RoaXMuY2FjaGVLZXl9YCwgcmVzdWx0cywgdGhpcy5jYWNoZVNlY29uZHMpO1xuICB9XG5cbiAgZ2VuZXJhdGVDYWNoZUtleSgpIHtcbiAgICBjb25zdCBrbmV4U3FsID0gdGhpcy50b0tuZXhRdWVyeSgpLnRvU1FMKCk7XG4gICAgY29uc3QgaGFzaGVkUXVlcnkgPSBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGtuZXhTcWwuc3FsKS5kaWdlc3QoXCJoZXhcIik7XG5cbiAgICByZXR1cm4gaGFzaGVkUXVlcnk7XG4gIH1cblxuICByZW1lbWJlcihrZXksIHNlY29uZHMpIHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm1vZGVsQ2xhc3MoKS5uYW1lO1xuXG4gICAgdGhpcy5jYWNoZVNlY29uZHMgPSBzZWNvbmRzO1xuICAgIHRoaXMuY2FjaGVUYWcgPSAoa2V5KSA/IGAke21vZGVsTmFtZX0uJHtrZXl9YCA6IG1vZGVsTmFtZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2l0aEdyYXBoRmV0Y2hlZChyZWxhdGlvbiwgc2V0dGluZ3MpIHtcbiAgICBpZiAoIXRoaXMuZ3JhcGhBcHBlbmRzKSB7XG4gICAgICB0aGlzLmdyYXBoQXBwZW5kcyA9IFtyZWxhdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JhcGhBcHBlbmRzLnB1c2gocmVsYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIud2l0aEdyYXBoRmV0Y2hlZChyZWxhdGlvbiwgc2V0dGluZ3MpO1xuICB9XG5cbiAgc2V0Q2FjaGVLZXkoKSB7XG4gICAgY29uc3QgaGFzaGVkUXVlcnkgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoKTtcbiAgICBjb25zdCBhcHBlbmRzID0gKHRoaXMuZ3JhcGhBcHBlbmRzIHx8IFtdKS5qb2luKHRoaXMuZ3JhcGhBcHBlbmRzLCAnLCcpO1xuXG4gICAgdGhpcy5jYWNoZUtleSA9IGAke3RoaXMuY2FjaGVUYWd9LiR7aGFzaGVkUXVlcnl9LiR7YXBwZW5kc31gO1xuICB9XG59IiwiLyoqXG4gKiBBIHNpbXBsZSBkZXBlbmRlbmN5IGdyYXBoXG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNyZWF0aW5nIGEgVG9wb2xvZ2ljYWwgU29ydCB1c2luZyBEZXB0aC1GaXJzdC1TZWFyY2ggb24gYSBzZXQgb2YgZWRnZXMuXG4gKlxuICogRGV0ZWN0cyBjeWNsZXMgYW5kIHRocm93cyBhbiBFcnJvciBpZiBvbmUgaXMgZGV0ZWN0ZWQgKHVubGVzcyB0aGUgXCJjaXJjdWxhclwiXG4gKiBwYXJhbWV0ZXIgaXMgXCJ0cnVlXCIgaW4gd2hpY2ggY2FzZSBpdCBpZ25vcmVzIHRoZW0pLlxuICpcbiAqIEBwYXJhbSBlZGdlcyBUaGUgc2V0IG9mIGVkZ2VzIHRvIERGUyB0aHJvdWdoXG4gKiBAcGFyYW0gbGVhdmVzT25seSBXaGV0aGVyIHRvIG9ubHkgcmV0dXJuIFwibGVhZlwiIG5vZGVzIChvbmVzIHdobyBoYXZlIG5vIGVkZ2VzKVxuICogQHBhcmFtIHJlc3VsdCBBbiBhcnJheSBpbiB3aGljaCB0aGUgcmVzdWx0cyB3aWxsIGJlIHBvcHVsYXRlZFxuICogQHBhcmFtIGNpcmN1bGFyIEEgYm9vbGVhbiB0byBhbGxvdyBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlREZTKGVkZ2VzLCBsZWF2ZXNPbmx5LCByZXN1bHQsIGNpcmN1bGFyKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoRGVwR3JhcGggPSBmdW5jdGlvbiBEZXBHcmFwaChvcHRzKSB7XG4gIHRoaXMubm9kZXMgPSB7fTsgLy8gTm9kZSAtPiBOb2RlL0RhdGEgKHRyZWF0ZWQgbGlrZSBhIFNldClcbiAgdGhpcy5vdXRnb2luZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGVuY3kgTm9kZV1cbiAgdGhpcy5pbmNvbWluZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGFudCBOb2RlXVxuICB0aGlzLmNpcmN1bGFyID0gb3B0cyAmJiAhIW9wdHMuY2lyY3VsYXI7IC8vIEFsbG93cyBjaXJjdWxhciBkZXBzXG59KTtcblxuRGVwR3JhcGguZnJvbUFycmF5ID0gKGl0ZW1zLCBvcHRpb25zID0geyBpdGVtSWQ6ICdpZCcsIHBhcmVudEl0ZW1JZDogJ3BhcmVudF9pZCcgfSkgPT4ge1xuIGNvbnN0IGRlcEdyYXBoID0gbmV3IERlcEdyYXBoKCk7XG5cbiBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICBkZXBHcmFwaC5hZGROb2RlKGl0ZW1bb3B0aW9ucy5pdGVtSWRdLCBpdGVtKTtcbiB9KTtcbiBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gIGlmIChpdGVtW29wdGlvbnMucGFyZW50SXRlbUlkXSkge1xuICAgIGRlcEdyYXBoLmFkZERlcGVuZGVuY3koaXRlbVtvcHRpb25zLnBhcmVudEl0ZW1JZF0sIGl0ZW1bb3B0aW9ucy5pdGVtSWRdKTtcbiAgfVxuIH0pO1xuIHJldHVybiBkZXBHcmFwaDtcbn1cblxuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5ub2RlcykubGVuZ3RoO1xuICB9LFxuICAvKipcbiAgICogQWRkIGEgbm9kZSB0byB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYSBub2RlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqL1xuICBhZGROb2RlOiBmdW5jdGlvbihub2RlLCBkYXRhKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBhcmd1bWVudHMgbGVuZ3RoIGFsbG93cyB0aGUgdXNlciB0byBhZGQgYSBub2RlIHdpdGggdW5kZWZpbmVkIGRhdGFcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV0gPSBbXTtcbiAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgZGVwZW5kZW5jeSBncmFwaC4gSWYgYSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuXG4gICAqL1xuICByZW1vdmVOb2RlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbihlZGdlTGlzdCkge1xuICAgICAgICBPYmplY3Qua2V5cyhlZGdlTGlzdCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICB2YXIgaWR4ID0gZWRnZUxpc3Rba2V5XS5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgZWRnZUxpc3Rba2V5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBub2RlIGV4aXN0cyBpbiB0aGUgZ3JhcGhcbiAgICovXG4gIGhhc05vZGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbm9kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgZGF0YSBmb3IgYSBnaXZlbiBub2RlIG5hbWUuIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAqL1xuICBzZXROb2RlRGF0YTogZnVuY3Rpb24obm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBmcm9tKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc05vZGUodG8pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIHRvKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5wdXNoKHRvKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10ucHVzaChmcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIG5vZGVzLlxuICAgKi9cbiAgcmVtb3ZlRGVwZW5kZW5jeTogZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgICB2YXIgaWR4O1xuICAgIGlmICh0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIGlkeCA9IHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgIGlkeCA9IHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhbnkgY3VzdG9tIGRhdGEgaXMgYXR0YWNoZWRcbiAgICogdG8gdGhlIG5vZGVzLCBpdCB3aWxsIG9ubHkgYmUgc2hhbGxvdyBjb3BpZWQuXG4gICAqL1xuICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgcmVzdWx0Lm5vZGVzW25dID0gc291cmNlLm5vZGVzW25dO1xuICAgICAgcmVzdWx0Lm91dGdvaW5nRWRnZXNbbl0gPSBzb3VyY2Uub3V0Z29pbmdFZGdlc1tuXS5zbGljZSgwKTtcbiAgICAgIHJlc3VsdC5pbmNvbWluZ0VkZ2VzW25dID0gc291cmNlLmluY29taW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBkZXBlbmRzIG9uICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZFxuICAgKiBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24obm9kZSwgbGVhdmVzT25seSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHZhciBERlMgPSBjcmVhdGVERlMoXG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlcyxcbiAgICAgICAgbGVhdmVzT25seSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB0aGlzLmNpcmN1bGFyXG4gICAgICApO1xuICAgICAgREZTKG5vZGUpO1xuICAgICAgdmFyIGlkeCA9IHJlc3VsdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJlc3VsdC5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogZ2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHRoYXQgZGVwZW5kIG9uIHRoZSBzcGVjaWZpZWQgbm9kZSAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBkZXBlbmRhbnRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kYW50c09mOiBmdW5jdGlvbihub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24obGVhdmVzT25seSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7IC8vIEVtcHR5IGdyYXBoXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5jaXJjdWxhcikge1xuICAgICAgICAvLyBMb29rIGZvciBjeWNsZXMgLSB3ZSBydW4gdGhlIERGUyBzdGFydGluZyBhdCBhbGwgdGhlIG5vZGVzIGluIGNhc2UgdGhlcmVcbiAgICAgICAgLy8gYXJlIHNldmVyYWwgZGlzY29ubmVjdGVkIHN1YmdyYXBocyBpbnNpZGUgdGhpcyBkZXBlbmRlbmN5IGdyYXBoLlxuICAgICAgICB2YXIgQ3ljbGVERlMgPSBjcmVhdGVERlModGhpcy5vdXRnb2luZ0VkZ2VzLCBmYWxzZSwgW10sIHRoaXMuY2lyY3VsYXIpO1xuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgICAgIEN5Y2xlREZTKG4pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICAvLyBGaW5kIGFsbCBwb3RlbnRpYWwgc3RhcnRpbmcgcG9pbnRzIChub2RlcyB3aXRoIG5vdGhpbmcgZGVwZW5kaW5nIG9uIHRoZW0pIGFuXG4gICAgICAvLyBydW4gYSBERlMgc3RhcnRpbmcgYXQgdGhlc2UgcG9pbnRzIHRvIGdldCB0aGUgb3JkZXJcbiAgICAgIGtleXNcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICBERlMobik7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB3ZSdyZSBhbGxvd2luZyBjeWNsZXMgLSB3ZSBuZWVkIHRvIHJ1biB0aGUgREZTIGFnYWluc3QgYW55IHJlbWFpbmluZ1xuICAgICAgLy8gbm9kZXMgdGhhdCBkaWQgbm90IGVuZCB1cCBpbiB0aGUgaW5pdGlhbCByZXN1bHQgKGFzIHRoZXkgYXJlIHBhcnQgb2YgYVxuICAgICAgLy8gc3ViZ3JhcGggdGhhdCBkb2VzIG5vdCBoYXZlIGEgY2xlYXIgc3RhcnRpbmcgcG9pbnQpXG4gICAgICBpZiAodGhpcy5jaXJjdWxhcikge1xuICAgICAgICBrZXlzXG4gICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmluZGV4T2Yobm9kZSkgPT09IC0xO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcblxuICBtYXBOb2RlcyhtYXBwZXIpIHtcblxuICB9XG59O1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24oY3ljbGVQYXRoKSB7XG4gIHZhciBtZXNzYWdlID0gXCJEZXBlbmRlbmN5IEN5Y2xlIEZvdW5kOiBcIiArIGN5Y2xlUGF0aC5qb2luKFwiIC0+IFwiKTtcbiAgdmFyIGluc3RhbmNlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBpbnN0YW5jZS5jeWNsZVBhdGggPSBjeWNsZVBhdGg7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKTtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoaW5zdGFuY2UsIERlcEdyYXBoQ3ljbGVFcnJvcik7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufSk7XG5EZXBHcmFwaEN5Y2xlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IHtcbiAgICB2YWx1ZTogRXJyb3IsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKERlcEdyYXBoQ3ljbGVFcnJvciwgRXJyb3IpO1xuXG5leHBvcnQgZGVmYXVsdCBEZXBHcmFwaDsiLCJpbXBvcnQgeyB1bmlxQnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgYnVpbGRGaWx0ZXJSb2xlc0pvaW5zLFxufSBmcm9tICdAL2xpYi9WaWV3Um9sZXNCdWlsZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZpbHRlciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWJsZU5hbWUpIHtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgICB0aGlzLmZpbHRlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmlsdGVyLlxuICAgKiBAcGFyYW0geyp9IGZpbHRlclJvbGUgLVxuICAgKi9cbiAgc2V0RmlsdGVyKGZpbHRlclJvbGUpIHtcbiAgICBmaWx0ZXJSb2xlLnNldFRhYmxlTmFtZSh0aGlzLnRhYmxlTmFtZSk7XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goZmlsdGVyUm9sZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHF1ZXJpZXMgb2YgZmlsdGVyIHJvbGVzLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHtcbiAgICBjb25zdCBidWlsZGVyc0NhbGxiYWNrcyA9IFtdO1xuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IFtdO1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgY29uc3QgeyBmaWx0ZXJSb2xlcyB9ID0gZmlsdGVyO1xuICAgICAgYnVpbGRlcnNDYWxsYmFja3MucHVzaChmaWx0ZXIuYnVpbGRRdWVyeSgpKTtcbiAgICAgIHRhYmxlQ29sdW1ucy5wdXNoKC4uLihBcnJheS5pc0FycmF5KGZpbHRlclJvbGVzKSkgPyBmaWx0ZXJSb2xlcyA6IFtmaWx0ZXJSb2xlc10pO1xuICAgIH0pO1xuICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgYnVpbGRlcnNDYWxsYmFja3MuZm9yRWFjaCgoYnVpbGRlckNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKTtcbiAgICAgIH0pO1xuICAgICAgYnVpbGRGaWx0ZXJSb2xlc0pvaW5zKHRoaXMudGFibGVOYW1lLCB1bmlxQnkodGFibGVDb2x1bW5zLCAnY29sdW1uS2V5JykpKGJ1aWxkZXIpO1xuICAgIH07XG4gIH1cbn0iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBEeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3IgZnJvbSAnQC9saWIvRHluYW1pY0ZpbHRlci9EeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3InO1xuaW1wb3J0IHtcbiAgYnVpbGRGaWx0ZXJRdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbHRlclJvbGVzIGV4dGVuZHMgRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG1ldGhvZC5cbiAgICogQHBhcmFtIHtBcnJheX0gZmlsdGVyUm9sZXMgLVxuICAgKiBAcGFyYW0ge0FycmF5fSByZXNvdXJjZUZpZWxkcyAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWx0ZXJSb2xlcywgcmVzb3VyY2VGaWVsZHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5maWx0ZXJSb2xlcyA9IGZpbHRlclJvbGVzLm1hcCgocm9sZSwgaW5kZXgpID0+ICh7XG4gICAgICAuLi5yb2xlLFxuICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgIGNvbHVtbktleTogcm9sZS5maWVsZF9rZXksXG4gICAgICBjb25kaXRpb246IHJvbGUuY29tcGFyYXRvciA9PT0gJ0FORCcgPyAnJiYnIDogJ3x8JyxcbiAgICB9KSk7XG4gICAgdGhpcy5yZXNvdXJjZUZpZWxkcyA9IHJlc291cmNlRmllbGRzO1xuICB9XG5cbiAgdmFsaWRhdGVGaWx0ZXJSb2xlcygpIHtcbiAgICBjb25zdCBmaWx0ZXJGaWVsZHNLZXlzID0gdGhpcy5maWx0ZXJSb2xlcy5tYXAoKHIpID0+IHIuZmllbGRfa2V5KTtcbiAgICBjb25zdCByZXNvdXJjZUZpZWxkc0tleXMgPSB0aGlzLnJlc291cmNlRmllbGRzLm1hcCgocikgPT4gci5rZXkpO1xuXG4gICAgcmV0dXJuIGRpZmZlcmVuY2UoZmlsdGVyRmllbGRzS2V5cywgcmVzb3VyY2VGaWVsZHNLZXlzKTtcbiAgfVxuXG4gIC8vIEBwcml2YXRlXG4gIGJ1aWxkTG9naWNFeHByZXNzaW9uKCkge1xuICAgIGxldCBleHByZXNzaW9uID0gJyc7XG4gICAgdGhpcy5maWx0ZXJSb2xlcy5mb3JFYWNoKChyb2xlLCBpbmRleCkgPT4ge1xuICAgICAgZXhwcmVzc2lvbiArPSAoaW5kZXggPT09IDApXG4gICAgICAgID8gYCR7cm9sZS5pbmRleH0gYCA6IGAke3JvbGUuY29uZGl0aW9ufSAke3JvbGUuaW5kZXh9IGA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24udHJpbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBvZiB2aWV3IHJvbGVzLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHtcbiAgICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGxvZ2ljRXhwcmVzc2lvbiA9IHRoaXMuYnVpbGRMb2dpY0V4cHJlc3Npb24oKTtcbiAgICAgIGJ1aWxkRmlsdGVyUXVlcnkodGhpcy50YWJsZU5hbWUsIHRoaXMuZmlsdGVyUm9sZXMsIGxvZ2ljRXhwcmVzc2lvbikoYnVpbGRlcik7XG4gICAgfTtcbiAgfVxufSIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZpbHRlckFic3RydWN0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZpbHRlclJvbGVzID0gW107XG4gICAgdGhpcy50YWJsZU5hbWUgPSAnJztcbiAgfVxuXG4gIHNldFRhYmxlTmFtZSh0YWJsZU5hbWUpIHtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBidWlsZExvZ2ljRXhwcmVzc2lvbigpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIHZhbGlkYXRlRmlsdGVyUm9sZXMoKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBidWlsZFF1ZXJ5KCkge31cbn0iLCJpbXBvcnQgRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yIGZyb20gJ0AvbGliL0R5bmFtaWNGaWx0ZXIvRHluYW1pY0ZpbHRlclJvbGVBYnN0cnVjdG9yJztcbmltcG9ydCB7XG4gIGdldFJvbGVGaWVsZENvbHVtbixcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNGaWx0ZXJTb3J0QnkgZXh0ZW5kcyBEeW5hbWljRmlsdGVyUm9sZUFic3RydWN0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHNvcnRCeUZpZWxkS2V5LCBzb3J0RGlyZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZmlsdGVyUm9sZXMgPSB7XG4gICAgICBjb2x1bW5LZXk6IHNvcnRCeUZpZWxkS2V5LFxuICAgICAgdmFsdWU6IHNvcnREaXJlY3Rpb24sXG4gICAgICBjb21wYXJhdG9yOiAnc29ydF9ieScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgZGF0YWJhc2UgcXVlcnkgb2Ygc29ydCBieSBjb2x1bW4gb24gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAgICovXG4gIGJ1aWxkUXVlcnkoKSB7IFxuICAgIGNvbnN0IHsgY29sdW1uS2V5ID0gbnVsbCwgdmFsdWUgPSBudWxsIH0gPSB0aGlzLmZpbHRlclJvbGVzO1xuXG4gICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFJlbGF0aW9uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRoaXMudGFibGVOYW1lLCBjb2x1bW5LZXkpO1xuICAgICAgaWYgKGNvbHVtbktleSkge1xuICAgICAgICBidWlsZGVyLm9yZGVyQnkoYCR7dGhpcy50YWJsZU5hbWV9LiR7ZmllbGRSZWxhdGlvbi5jb2x1bW59YCwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IER5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3RvciBmcm9tICdAL2xpYi9EeW5hbWljRmlsdGVyL0R5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3Rvcic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZVZpZXdSb2xlcyxcbiAgYnVpbGRGaWx0ZXJRdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNGaWx0ZXJWaWV3cyBleHRlbmRzIER5bmFtaWNGaWx0ZXJSb2xlQWJzdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBtZXRob2QuXG4gICAqIEBwYXJhbSB7Kn0gZmlsdGVyUm9sZXMgLVxuICAgKiBAcGFyYW0geyp9IGxvZ2ljRXhwcmVzc2lvbiAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWx0ZXJSb2xlcywgbG9naWNFeHByZXNzaW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZmlsdGVyUm9sZXMgPSBmaWx0ZXJSb2xlcztcbiAgICB0aGlzLmxvZ2ljRXhwcmVzc2lvbiA9IGxvZ2ljRXhwcmVzc2lvblxuICAgICAgLnJlcGxhY2UoJ0FORCcsICcmJicpXG4gICAgICAucmVwbGFjZSgnT1InLCAnfHwnKTtcblxuICAgIHRoaXMudGFibGVOYW1lID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgbG9naWMgZXhwcmVzc2lvbi5cbiAgICovXG4gIGJ1aWxkTG9naWNFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmxvZ2ljRXhwcmVzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZmlsdGVyIHJvbGVzLlxuICAgKi9cbiAgdmFsaWRhdGVGaWx0ZXJSb2xlcygpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVWaWV3Um9sZXModGhpcy5maWx0ZXJSb2xlcywgdGhpcy5sb2dpY0V4cHJlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBvZiB2aWV3IHJvbGVzLlxuICAgKi9cbiAgYnVpbGRRdWVyeSgpIHtcbiAgICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICAgIGJ1aWxkRmlsdGVyUXVlcnkodGhpcy50YWJsZU5hbWUsIHRoaXMuZmlsdGVyUm9sZXMsIHRoaXMubG9naWNFeHByZXNzaW9uKShidWlsZGVyKTtcbiAgICB9O1xuICB9XG59IiwiXG5cbmltcG9ydCBEeW5hbWljRmlsdGVyIGZyb20gJy4vRHluYW1pY0ZpbHRlcic7XG5pbXBvcnQgRHluYW1pY0ZpbHRlclNvcnRCeSBmcm9tICcuL0R5bmFtaWNGaWx0ZXJTb3J0QnknO1xuaW1wb3J0IER5bmFtaWNGaWx0ZXJWaWV3cyBmcm9tICcuL0R5bmFtaWNGaWx0ZXJWaWV3cyc7XG5pbXBvcnQgRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzIGZyb20gJy4vRHluYW1pY0ZpbHRlckZpbHRlclJvbGVzJztcblxuZXhwb3J0IHtcbiAgRHluYW1pY0ZpbHRlcixcbiAgRHluYW1pY0ZpbHRlclNvcnRCeSxcbiAgRHluYW1pY0ZpbHRlclZpZXdzLFxuICBEeW5hbWljRmlsdGVyRmlsdGVyUm9sZXMsXG59OyIsIlxuY29uc3QgT3BlcmF0aW9uVHlwZSA9IHtcbiAgTE9HSUM6ICdMT0dJQycsXG4gIFNUUklORzogJ1NUUklORycsXG4gIENPTVBBUklTT046ICdDT01QQVJJU09OJyxcbiAgTUFUSDogJ01BVEgnLFxufTtcblxuZXhwb3J0IGNsYXNzIExleGVyIHtcbiAgLy8gb3BlcmF0aW9uIHRhYmxlXG4gIHN0YXRpYyBnZXQgb3B0YWJsZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJz0nOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJyYnOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJ3wnOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJz8nOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuICAgICAgJzonOiBPcGVyYXRpb25UeXBlLkxPR0lDLFxuXG4gICAgICAnXFwnJzogT3BlcmF0aW9uVHlwZS5TVFJJTkcsXG4gICAgICAnXCInOiBPcGVyYXRpb25UeXBlLlNUUklORyxcblxuICAgICAgJyEnOiBPcGVyYXRpb25UeXBlLkNPTVBBUklTT04sXG4gICAgICAnPic6IE9wZXJhdGlvblR5cGUuQ09NUEFSSVNPTixcbiAgICAgICc8JzogT3BlcmF0aW9uVHlwZS5DT01QQVJJU09OLFxuXG4gICAgICAnKCc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICAgICcpJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgICAgJysnOiBPcGVyYXRpb25UeXBlLk1BVEgsXG4gICAgICAnLSc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICAgICcqJzogT3BlcmF0aW9uVHlwZS5NQVRILFxuICAgICAgJy8nOiBPcGVyYXRpb25UeXBlLk1BVEgsXG4gICAgICAnJSc6IE9wZXJhdGlvblR5cGUuTUFUSCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7Kn0gZXhwcmVzc2lvbiAtXG4gICAqL1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uKSB7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgIHRoaXMuaW5wdXQgPSBleHByZXNzaW9uO1xuICAgIHRoaXMudG9rZW5MaXN0ID0gW107XG4gIH1cblxuICBnZXRUb2tlbnMoKSB7XG4gICAgbGV0IHRvaztcbiAgICBkbyB7XG4gICAgICAvLyByZWFkIGN1cnJlbnQgdG9rZW4sIHNvIHN0ZXAgc2hvdWxkIGJlIC0xXG4gICAgICB0b2sgPSB0aGlzLnBpY2tOZXh0KC0xKTtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuY3VycmVudEluZGV4O1xuICAgICAgc3dpdGNoIChMZXhlci5vcHRhYmxlW3Rva10pIHtcbiAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLkxPR0lDOlxuICAgICAgICAgIC8vID09ICYmIHx8ID09PVxuICAgICAgICAgIHRoaXMucmVhZExvZ2ljT3B0KHRvayk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLlNUUklORzpcbiAgICAgICAgICB0aGlzLnJlYWRTdHJpbmcodG9rKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuQ09NUEFSSVNPTjpcbiAgICAgICAgICB0aGlzLnJlYWRDb21wYXJlKHRvayk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLk1BVEg6XG4gICAgICAgICAgdGhpcy5yZWNlaXZlVG9rZW4oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMucmVhZFZhbHVlKHRvayk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBwb3Mgbm90IGNoYW5nZWQsIHRoaXMgbG9vcCB3aWxsIGdvIGludG8gYSBpbmZpbml0ZSBsb29wLCBldmVyeSBzdGVwIG9mIHdoaWxlIGxvb3AsXG4gICAgICAvLyB3ZSBtdXN0IG1vdmUgdGhlIHBvcyBmb3J3YXJkXG4gICAgICAvLyBzbyBoZXJlIHdlIHNob3VsZCB0aHJvdyBlcnJvciwgZm9yIGV4YW1wbGUgYDEgJiAyYFxuICAgICAgaWYgKHBvcyA9PT0gdGhpcy5jdXJyZW50SW5kZXggJiYgdG9rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGB1bmtvbncgdG9rZW4gJHt0b2t9IGZyb20gaW5wdXQgc3RyaW5nICR7dGhpcy5pbnB1dH1gKTtcbiAgICAgICAgZXJyLm5hbWUgPSAnVW5rbm93VG9rZW4nO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodG9rICE9PSB1bmRlZmluZWQpXG5cbiAgICByZXR1cm4gdGhpcy50b2tlbkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogcmVhZCBuZXh0IHRva2VuLCB0aGUgaW5kZXggcGFyYW0gY2FuIHNldCBuZXh0IHN0ZXAsIGRlZmF1bHQgZ28gZm93YXJkIDEgc3RlcFxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXggbmV4dCBwb3N0aW9uXG4gICAqL1xuICBwaWNrTmV4dChpbmRleCA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dFtpbmRleCArIHRoaXMuY3VycmVudEluZGV4ICsgMV07XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdG9rZW4gaW50byByZXN1bHQgdG9rZW5MaXN0LCBhbmQgbW92ZSB0aGUgcG9zIGluZGV4XG4gICAqXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgcmVjZWl2ZVRva2VuKGluZGV4ID0gMSkge1xuICAgIGNvbnN0IHRvayA9IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5jdXJyZW50SW5kZXgsIHRoaXMuY3VycmVudEluZGV4ICsgaW5kZXgpLnRyaW0oKTtcbiAgICAvLyBza2lwIGVtcHR5IHN0cmluZ1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5MaXN0LnB1c2godG9rKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRJbmRleCArPSBpbmRleDtcbiAgfVxuXG4gIC8vICcgb3IgXCJcbiAgcmVhZFN0cmluZyh0b2spIHtcbiAgICBsZXQgbmV4dDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGRvIHtcbiAgICAgIG5leHQgPSB0aGlzLnBpY2tOZXh0KGluZGV4KTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfSB3aGlsZSAobmV4dCAhPT0gdG9rICYmIG5leHQgIT09IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5yZWNlaXZlVG9rZW4oaW5kZXggKyAxKTtcbiAgfVxuXG4gIC8vID4gb3IgPCBvciA+PSBvciA8PSBvciAhPT1cbiAgLy8gdG9rIGluICg+LCA8LCAhKVxuICByZWFkQ29tcGFyZSh0b2spIHtcbiAgICBpZiAodGhpcy5waWNrTmV4dCgpICE9PSAnPScpIHtcbiAgICAgIHRoaXMucmVjZWl2ZVRva2VuKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAhPT1cbiAgICBpZiAodG9rID09PSAnIScgJiYgdGhpcy5waWNrTmV4dCgxKSA9PT0gJz0nKSB7XG4gICAgICB0aGlzLnJlY2VpdmVUb2tlbigzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWNlaXZlVG9rZW4oMik7XG4gIH1cblxuICAvLyA9PT0gb3IgPT1cbiAgLy8gJiYgfHxcbiAgcmVhZExvZ2ljT3B0KHRvaykge1xuICAgIGlmICh0aGlzLnBpY2tOZXh0KCkgPT09IHRvaykge1xuICAgICAgLy8gPT09XG4gICAgICBpZiAodG9rID09PSAnPScgJiYgdGhpcy5waWNrTmV4dCgxKSA9PT0gdG9rKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY2VpdmVUb2tlbigzKTtcbiAgICAgIH1cbiAgICAgIC8vID09ICYmIHx8XG4gICAgICByZXR1cm4gdGhpcy5yZWNlaXZlVG9rZW4oMik7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBhcyAmJlxuICAgIC8vIGEgPyBiIDogYyBpcyBlcXVhbCB0byBhICYmIGIgfHwgY1xuICAgIGlmICh0b2sgPT09ICc/JyB8fCB0b2sgPT09ICc6Jykge1xuICAgICAgcmV0dXJuIHRoaXMucmVjZWl2ZVRva2VuKDEpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRWYWx1ZSh0b2spIHtcbiAgICBpZiAoIXRvaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKCFMZXhlci5vcHRhYmxlW3Rva10gJiYgdG9rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRvayA9IHRoaXMucGlja05leHQoaW5kZXgpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgdGhpcy5yZWNlaXZlVG9rZW4oaW5kZXgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRva2VuKGV4cHJlc3Npb24pIHtcbiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIoZXhwcmVzc2lvbik7XG4gIHJldHVybiBsZXhlci5nZXRUb2tlbnMoKTtcbn1cbiIsImV4cG9ydCBjb25zdCBPUEVSQVRJT04gPSB7XG4gICchJzogNSxcbiAgJyonOiA0LFxuICAnLyc6IDQsXG4gICclJzogNCxcbiAgJysnOiAzLFxuICAnLSc6IDMsXG4gICc+JzogMixcbiAgJzwnOiAyLFxuICAnPj0nOiAyLFxuICAnPD0nOiAyLFxuICAnPT09JzogMixcbiAgJyE9PSc6IDIsXG4gICc9PSc6IDIsXG4gICchPSc6IDIsXG4gICcmJic6IDEsXG4gICd8fCc6IDEsXG4gICc/JzogMSxcbiAgJzonOiAxLFxufTtcblxuLy8gZXhwb3J0IGludGVyZmFjZSBOb2RlIHtcbi8vICAgbGVmdDogTm9kZSB8IHN0cmluZyB8IG51bGw7XG4vLyAgIHJpZ2h0OiBOb2RlIHwgc3RyaW5nIHwgbnVsbDtcbi8vICAgb3BlcmF0aW9uOiBzdHJpbmc7XG4vLyAgIGdyb3VwZWQ/OiBib29sZWFuO1xuLy8gfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VyIHtcblxuICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgIHRoaXMuaW5kZXggPSAtMTtcbiAgICB0aGlzLmJsb2NrTGV2ZWwgPSAwO1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHJldHVybiB7Tm9kZSB8IHN0cmluZ30gPS0gXG4gICAqL1xuICBwYXJzZSgpIHtcbiAgICBsZXQgdG9rO1xuICAgIGxldCByb290ID0ge1xuICAgICAgbGVmdDogbnVsbCxcbiAgICAgIHJpZ2h0OiBudWxsLFxuICAgICAgb3BlcmF0aW9uOiBudWxsLFxuICAgIH07XG5cbiAgICBkbyB7XG4gICAgICB0b2sgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICAgIGlmICh0b2sgPT09IG51bGwgfHwgdG9rID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChyb290LmxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgcm9vdC5sZWZ0ID0gdG9rO1xuICAgICAgICByb290Lm9wZXJhdGlvbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cbiAgICAgICAgaWYgKCFyb290Lm9wZXJhdGlvbikge1xuICAgICAgICAgIHJldHVybiB0b2s7XG4gICAgICAgIH1cblxuICAgICAgICByb290LnJpZ2h0ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2sgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVyYXRpb24gbXVzdCBiZSBzdHJpbmcsIGJ1dCBnZXQgJyArIEpTT04uc3RyaW5naWZ5KHRvaykpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSB0aGlzLmFkZE5vZGUodG9rLCB0aGlzLnBhcnNlU3RhdGVtZW50KCksIHJvb3QpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRvayk7XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIG5leHRUb2tlbigpIHtcbiAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5bdGhpcy5pbmRleF07XG4gIH1cblxuICBwcmV2VG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5bdGhpcy5pbmRleCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIFxuICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfG51bGx9IHJpZ2h0IFxuICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgXG4gICAqL1xuICBhZGROb2RlKG9wZXJhdGlvbiwgcmlnaHQsIHJvb3QpIHtcbiAgICBsZXQgcHJlID0gcm9vdDtcbiAgICBcbiAgICBpZiAodGhpcy5jb21wYXJlKHByZS5vcGVyYXRpb24sIG9wZXJhdGlvbikgPCAwICYmICFwcmUuZ3JvdXBlZCkge1xuICAgICAgXG4gICAgICB3aGlsZSAocHJlLnJpZ2h0ICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBwcmUucmlnaHQgIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHRoaXMuY29tcGFyZShwcmUucmlnaHQub3BlcmF0aW9uLCBvcGVyYXRpb24pIDwgMCAmJiAhcHJlLnJpZ2h0Lmdyb3VwZWQpIHtcbiAgICAgICAgcHJlID0gcHJlLnJpZ2h0O1xuICAgICAgfVxuXG4gICAgICBwcmUucmlnaHQgPSB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgbGVmdDogcHJlLnJpZ2h0LFxuICAgICAgICByaWdodCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IHByZSxcbiAgICAgIHJpZ2h0LFxuICAgICAgb3BlcmF0aW9uLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHtTdHJpbmd9IGEgXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiIFxuICAgKi9cbiAgY29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFPUEVSQVRJT04uaGFzT3duUHJvcGVydHkoYSkgfHwgIU9QRVJBVElPTi5oYXNPd25Qcm9wZXJ0eShiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3cgb3BlcmF0aW9uICR7YX0gb3IgJHtifWApO1xuICAgIH1cbiAgICByZXR1cm4gT1BFUkFUSU9OW2FdIC0gT1BFUkFUSU9OW2JdO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gc3RyaW5nIHwgTm9kZSB8IG51bGxcbiAgICovXG4gIHBhcnNlU3RhdGVtZW50KCkge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBpZiAodG9rZW4gPT09ICcoJykge1xuICAgICAgdGhpcy5ibG9ja0xldmVsICs9IDE7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZSgpO1xuICAgICAgdGhpcy5ibG9ja0xldmVsIC09IDE7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgbm9kZS5ncm91cGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmICh0b2tlbiA9PT0gJyknKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gPT09ICchJykge1xuICAgICAgcmV0dXJuIHsgbGVmdDogbnVsbCwgb3BlcmF0aW9uOiB0b2tlbiwgcmlnaHQ6IHRoaXMucGFyc2VTdGF0ZW1lbnQoKSB9XG4gICAgfVxuXG4gICAgLy8gMyA+IC0xMiBvciAtMTIgKyAxMFxuICAgIGlmICh0b2tlbiA9PT0gJy0nICYmIChPUEVSQVRJT05bdGhpcy5wcmV2VG9rZW4oKV0gPiAwIHx8IHRoaXMucHJldlRva2VuKCkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiB7IGxlZnQ6ICcwJywgb3BlcmF0aW9uOiB0b2tlbiwgcmlnaHQ6IHRoaXMucGFyc2VTdGF0ZW1lbnQoKSwgZ3JvdXBlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgT1BFUkFUSU9OIH0gZnJvbSAnLi9QYXJzZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdWVyeVBhcnNlciB7XG5cbiAgY29uc3RydWN0b3IodHJlZSwgcXVlcmllcykge1xuICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgdGhpcy5xdWVyaWVzID0gcXVlcmllcztcbiAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgfVxuXG4gIHNldFF1ZXJ5KHF1ZXJ5KSB7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5LmNsb25lKCk7XG4gIH1cblxuICBwYXJzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZU5vZGUodGhpcy50cmVlKTtcbiAgfVxuXG4gIHBhcnNlTm9kZShub2RlKSB7XG4gICAgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgbm9kZVF1ZXJ5ID0gdGhpcy5nZXRRdWVyeShub2RlKTtcbiAgICAgIHJldHVybiAocXVlcnkpID0+IHsgbm9kZVF1ZXJ5KHF1ZXJ5KTsgfTtcbiAgICB9XG4gICAgaWYgKE9QRVJBVElPTltub2RlLm9wZXJhdGlvbl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3cgZXhwcmVzc2lvbiAke25vZGUub3BlcmF0aW9ufWApO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0UXVlcnkgPSB0aGlzLmdldFF1ZXJ5KG5vZGUubGVmdCk7XG4gICAgY29uc3QgcmlnaHRRdWVyeSA9IHRoaXMuZ2V0UXVlcnkobm9kZS5yaWdodCk7XG5cbiAgICBzd2l0Y2ggKG5vZGUub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICcmJic6XG4gICAgICBjYXNlICdBTkQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChub2RlUXVlcnkpID0+IG5vZGVRdWVyeS53aGVyZSgocXVlcnkpID0+IHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgocSkgPT4geyBsZWZ0UXVlcnkocSk7IH0pO1xuICAgICAgICAgIHF1ZXJ5LmFuZFdoZXJlKChxKSA9PiB7IHJpZ2h0UXVlcnkocSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ3x8JzpcbiAgICAgIGNhc2UgJ09SJzpcbiAgICAgICAgcmV0dXJuIChub2RlUXVlcnkpID0+IG5vZGVRdWVyeS53aGVyZSgocXVlcnkpID0+IHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgocSkgPT4geyBsZWZ0UXVlcnkocSk7IH0pO1xuICAgICAgICAgIHF1ZXJ5Lm9yV2hlcmUoKHEpID0+IHsgcmlnaHRRdWVyeShxKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFF1ZXJ5KG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdzdHJpbmcnICYmIG5vZGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlTm9kZShub2RlKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KG5vZGUpO1xuXG4gICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5xdWVyaWVzW25vZGVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vdyBxdWVyeSB1bmRlciBpbmRleCAke25vZGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5xdWVyaWVzW25vZGVdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWJsZUNvbGxlY3Rpb24ge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgbWV0aG9kLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IFtdO1xuICAgIHRoaXMuS0VZX0NPTFVNTiA9ICdrZXknO1xuICAgIHRoaXMuVkFMVUVfQ09MVU1OID0gJ3ZhbHVlJztcbiAgICB0aGlzLlRZUEVfQ09MVU1OID0gJ3R5cGUnO1xuICAgIHRoaXMubW9kZWwgPSBudWxsO1xuICAgIHRoaXMuZXh0cmFDb2x1bW5zID0gW107XG5cbiAgICB0aGlzLmV4dHJhUXVlcnkgPSAocXVlcnksIG1ldGEpID0+IHtcbiAgICAgIHF1ZXJ5LndoZXJlKCdrZXknLCBtZXRhW3RoaXMuS0VZX0NPTFVNTl0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1vZGVsIG9mIHRoaXMgbWV0YWRhdGEgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIC1cbiAgICovXG4gIHNldE1vZGVsKG1vZGVsKSB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBleHRyYSBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zIC1cbiAgICovXG4gIHNldEV4dHJhQ29sdW1ucyhjb2x1bW5zKSB7XG4gICAgdGhpcy5leHRyYUNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGdpdmVuIG1ldGFkYXRhIGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBNZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBmaW5kTWV0YShwYXlsb2FkKSB7XG4gICAgY29uc3QgeyBrZXksIGV4dHJhQ29sdW1ucyB9ID0gdGhpcy5wYXJzZVBheWxvYWQocGF5bG9hZCk7XG5cbiAgICByZXR1cm4gdGhpcy5hbGxNZXRhZGF0YSgpLmZpbmQoKG1ldGEpID0+IHtcbiAgICAgIGNvbnN0IGlzU2FtZUtleSA9IG1ldGEua2V5ID09PSBrZXk7XG4gICAgICBjb25zdCBzYW1lRXh0cmFDb2x1bW5zID0gdGhpcy5leHRyYUNvbHVtbnMuc29tZSgoZXh0cmFDb2x1bW4pID0+IHtcbiAgICAgICAgcmV0dXJuICFleHRyYUNvbHVtbnMgfHwgKGV4dHJhQ29sdW1uc1tleHRyYUNvbHVtbl0gPT09IG1ldGFbZXh0cmFDb2x1bW5dKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGlzU2FtZUtleSAmJiBzYW1lRXh0cmFDb2x1bW5zO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFsbCBtZXRhZGF0YS5cbiAgICovXG4gIGFsbE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmZpbHRlcigobWV0YSkgPT4gIW1ldGEubWFya0FzRGVsZXRlZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgbWV0YWRhdGEgb2YgdGhlIGdpdmVuIGtleS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEBwYXJhbSB7TWl4aWVkfSBkZWZhdWx0VmFsdWUgLVxuICAgKi9cbiAgZ2V0TWV0YShwYXlsb2FkLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEocGF5bG9hZCk7XG4gICAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEudmFsdWUgOiBkZWZhdWx0VmFsdWUgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWFya2VzIHRoZSBtZXRhZGF0YSB0byBzaG91bGQgYmUgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqL1xuICByZW1vdmVNZXRhKGtleSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YShrZXkpO1xuXG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICBtZXRhZGF0YS5tYXJrQXNEZWxldGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtZXRhIGRhdGEgb2YgdGhlIGdpdmVuIGdyb3VwLlxuICAgKiBAcGFyYW0geyp9IGdyb3VwXG4gICAqL1xuICByZW1vdmVBbGxNZXRhKGdyb3VwID0gJ2RlZmF1bHQnKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IHRoaXMubWV0YWRhdGEubWFwKChtZXRhKSA9PiAoe1xuICAgICAgLi4ubWV0YSxcbiAgICAgIG1hcmtBc0RlbGV0ZWQ6IHRydWUsXG4gICAgfSkpO1xuICB9XG5cbiAgc2V0RXh0cmFRdWVyeShjYWxsYmFjaykge1xuICAgIHRoaXMuZXh0cmFRdWVyeSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWV0YSBkYXRhIHRvIHRoZSBzdGFjay5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtXG4gICAqL1xuICBzZXRNZXRhKHBheWxvYWQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGtleTtcblxuICAgICAgbWV0YWRhdGEuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICB0aGlzLnNldE1ldGEobWV0YS5rZXksIG1ldGEudmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCB2YWx1ZSwgLi4uZXh0cmFDb2x1bW5zIH0gPSB0aGlzLnBhcnNlUGF5bG9hZChwYXlsb2FkLCBhcmdzWzBdKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEocGF5bG9hZCk7XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIG1ldGFkYXRhLnZhbHVlID0gdmFsdWU7XG4gICAgICBtZXRhZGF0YS5tYXJrQXNVcGRhdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YS5wdXNoKHtcbiAgICAgICAgdmFsdWUsIGtleSwgLi4uZXh0cmFDb2x1bW5zLCBtYXJrQXNJbnNlcnRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlUGF5bG9hZChwYXlsb2FkLCB2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgcGF5bG9hZCAhPT0gJ29iamVjdCcgPyB7IGtleTogcGF5bG9hZCwgdmFsdWUgfSA6IHsgLi4ucGF5bG9hZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVkIHRoZSBtb2RpZmllZC9kZWxldGVkIGFuZCBpbnNlcnRlZCBtZXRhZGF0YS5cbiAgICovXG4gIGFzeW5jIHNhdmVNZXRhKCkge1xuICAgIGNvbnN0IGluc2VydGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc0luc2VydGVkID09PSB0cnVlKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMubWV0YWRhdGEuZmlsdGVyKChtKSA9PiAobS5tYXJrQXNVcGRhdGVkID09PSB0cnVlKSk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMubWV0YWRhdGEuZmlsdGVyKChtKSA9PiAobS5tYXJrQXNEZWxldGVkID09PSB0cnVlKSk7XG4gICAgY29uc3Qgb3BlcnMgPSBbXTtcblxuICAgIGlmIChkZWxldGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGRlbGV0ZWQuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGVPcGVyID0gdGhpcy5tb2RlbC5xdWVyeSgpLm9uQnVpbGQoKHF1ZXJ5LCByZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLmV4dHJhUXVlcnkocXVlcnksIG1ldGEpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pLmRlbGV0ZSgpO1xuICAgICAgICBvcGVycy5wdXNoKGRlbGV0ZU9wZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGluc2VydGVkLmZvckVhY2goKG1ldGEpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydE9wZXIgPSB0aGlzLm1vZGVsLnF1ZXJ5KCkuaW5zZXJ0KHtcbiAgICAgICAgW3RoaXMuS0VZX0NPTFVNTl06IG1ldGEua2V5LFxuICAgICAgICBbdGhpcy5WQUxVRV9DT0xVTU5dOiBtZXRhLnZhbHVlLFxuICAgICAgICAuLi50aGlzLmV4dHJhQ29sdW1ucy5yZWR1Y2UoKG9iaiwgY29sdW1uKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXRhW2NvbHVtbl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvYmpbY29sdW1uXSA9IG1ldGFbY29sdW1uXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pLFxuICAgICAgfSk7XG4gICAgICBvcGVycy5wdXNoKGluc2VydE9wZXIpO1xuICAgIH0pO1xuICAgIHVwZGF0ZWQuZm9yRWFjaCgobWV0YSkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlT3BlciA9IHRoaXMubW9kZWwucXVlcnkoKS5vbkJ1aWxkKChxdWVyeSkgPT4ge1xuICAgICAgICB0aGlzLmV4dHJhUXVlcnkocXVlcnksIG1ldGEpO1xuICAgICAgfSkucGF0Y2goe1xuICAgICAgICBbdGhpcy5WQUxVRV9DT0xVTU5dOiBtZXRhLnZhbHVlLFxuICAgICAgfSk7XG4gICAgICBvcGVycy5wdXNoKHVwZGF0ZU9wZXIpO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG9wZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgc3RvcmFnZS5cbiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGtleSAtXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2UgLVxuICAgKi9cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucXVlcnkoKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhQXJyYXkgPSB0aGlzLm1hcE1ldGFkYXRhQ29sbGVjdGlvbihtZXRhZGF0YSk7XG4gICAgbWV0YWRhdGFBcnJheS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnB1c2gobWV0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBtZXRhZGF0YSBiZWZvcmUgc2F2aW5nIHRvIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfEJvb2xlYW59IHZhbHVlIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlVHlwZSAtXG4gICAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ8Qm9vbGVhbn0gLVxuICAgKi9cbiAgc3RhdGljIGZvcm1hdE1ldGFWYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlO1xuXG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZSA/ICcxJyA6ICcwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJzZWRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGFuZCBwYXJzZSBtZXRhZGF0YSB0byBjb2xsZWN0aW9uIGVudHJpZXMuXG4gICAqIEBwYXJhbSB7TWV0YX0gYXR0ciAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJzZVR5cGUgLVxuICAgKi9cbiAgbWFwTWV0YWRhdGEoYXR0ciwgcGFyc2VUeXBlID0gJ3BhcnNlJykge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGF0dHJbdGhpcy5LRVlfQ09MVU1OXSxcbiAgICAgIHZhbHVlOiAocGFyc2VUeXBlID09PSAncGFyc2UnKVxuICAgICAgICA/IE1ldGFibGVDb2xsZWN0aW9uLnBhcnNlTWV0YVZhbHVlKFxuICAgICAgICAgIGF0dHJbdGhpcy5WQUxVRV9DT0xVTU5dLFxuICAgICAgICAgIHRoaXMuVFlQRV9DT0xVTU4gPyBhdHRyW3RoaXMuVFlQRV9DT0xVTU5dIDogZmFsc2UsXG4gICAgICAgIClcbiAgICAgICAgOiBNZXRhYmxlQ29sbGVjdGlvbi5mb3JtYXRNZXRhVmFsdWUoXG4gICAgICAgICAgYXR0clt0aGlzLlZBTFVFX0NPTFVNTl0sXG4gICAgICAgICAgdGhpcy5UWVBFX0NPTFVNTiA/IGF0dHJbdGhpcy5UWVBFX0NPTFVNTl0gOiBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgIC4uLnRoaXMuZXh0cmFDb2x1bW5zLm1hcCgoZXh0cmFDb2wpID0+ICh7XG4gICAgICAgIFtleHRyYUNvbF06IGF0dHJbZXh0cmFDb2xdIHx8IG51bGwsXG4gICAgICB9KSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgbWV0YWRhdGEgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbGxlY3Rpb24gLVxuICAgKi9cbiAgbWFwTWV0YWRhdGFUb0NvbGxlY3Rpb24obWV0YWRhdGEsIHBhcnNlVHlwZSA9ICdwYXJzZScpIHtcbiAgICByZXR1cm4gbWV0YWRhdGEubWFwKChtb2RlbCkgPT4gdGhpcy5tYXBNZXRhZGF0YVRvQ29sbGVjdGlvbihtb2RlbCwgcGFyc2VUeXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBtZXRhZGF0YSB0byB0aGUgbWV0YWJsZSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge0FycmF5fSBtZXRhIC1cbiAgICovXG4gIGZyb20obWV0YSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGEpKSB7XG4gICAgICBtZXRhLmZvckVhY2goKG0pID0+IHsgdGhpcy5mcm9tKG0pOyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tZXRhZGF0YS5wdXNoKG1ldGEpO1xuICB9XG5cbiAgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIGxvYWQgbWV0YWRhdGEgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG1ldGEgXG4gICAqL1xuICBzdGF0aWMgZnJvbShtZXRhKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNZXRhYmxlQ29sbGVjdGlvbigpO1xuICAgIGNvbGxlY3Rpb24uZnJvbShtZXRhKTtcblxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IExleGVyIH0gZnJvbSAnQC9saWIvTG9naWNFdmFsdWF0aW9uL0xleGVyJztcbmltcG9ydCBQYXJzZXIgZnJvbSAnQC9saWIvTG9naWNFdmFsdWF0aW9uL1BhcnNlcic7XG5pbXBvcnQgUXVlcnlQYXJzZXIgZnJvbSAnQC9saWIvTG9naWNFdmFsdWF0aW9uL1F1ZXJ5UGFyc2VyJztcbmltcG9ydCByZXNvdXJjZUZpZWxkc0tleXMgZnJvbSAnQC9kYXRhL1Jlc291cmNlRmllbGRzS2V5cyc7XG5cbi8vICBjb25zdCByb2xlID0ge1xuLy8gICBjb21wYXRvdG9yOiBTdHJpbmcsXG4vLyAgIHZhbHVlOiBTdHJpbmcsXG4vLyAgIGNvbHVtbktleTogU3RyaW5nLFxuLy8gICBjb2x1bW5TbHVnOiBTdHJpbmcsXG4vLyAgIGluZGV4OiBOdW1iZXIsXG4vLyB9XG5cbi8qKlxuICogR2V0IGZpZWxkIGNvbHVtbiBtZXRhZGF0YSBhbmQgaXRzIHJlbGF0aW9uIHdpdGggb3RoZXIgdGFibGVzLlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUgb2YgdGFyZ2V0IGNvbHVtbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2x1bW5LZXkgLSBUYXJnZXQgY29sdW1uIGtleSB0aGF0IHN0b3JlZCBpbiByZXNvdXJjZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVGaWVsZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbktleSkge1xuICBjb25zdCB0YWJsZUZpZWxkcyA9IHJlc291cmNlRmllbGRzS2V5c1t0YWJsZU5hbWVdO1xuICByZXR1cm4gKHRhYmxlRmllbGRzW2NvbHVtbktleV0pID8gdGFibGVGaWVsZHNbY29sdW1uS2V5XSA6IG51bGw7XG59XG5cbi8qKlxuICogQnVpbGRzIHJvbGVzIHF1ZXJpZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFibGVOYW1lIC1cbiAqIEBwYXJhbSB7T2JqZWN0fSByb2xlIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUm9sZVF1ZXJ5KHRhYmxlTmFtZSwgcm9sZSkge1xuICBjb25zdCBmaWVsZFJlbGF0aW9uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRhYmxlTmFtZSwgcm9sZS5jb2x1bW5LZXkpO1xuICBjb25zdCBjb21wYXJhdG9yQ29sdW1uID0gZmllbGRSZWxhdGlvbi5yZWxhdGlvbkNvbHVtbiB8fCBgJHt0YWJsZU5hbWV9LiR7ZmllbGRSZWxhdGlvbi5jb2x1bW59YDtcblxuICBzd2l0Y2ggKHJvbGUuY29tcGFyYXRvcikge1xuICAgIGNhc2UgJ2VxdWFscyc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndoZXJlKGNvbXBhcmF0b3JDb2x1bW4sIHJvbGUudmFsdWUpO1xuICAgICAgfTtcbiAgICBjYXNlICdub3RfZXF1YWwnOlxuICAgIGNhc2UgJ25vdF9lcXVhbHMnOlxuICAgICAgcmV0dXJuIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIud2hlcmVOb3QoY29tcGFyYXRvckNvbHVtbiwgcm9sZS52YWx1ZSk7XG4gICAgICB9O1xuICAgIGNhc2UgJ2NvbnRhaW4nOlxuICAgIGNhc2UgJ2NvbnRhaW5zJzpcbiAgICAgIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgICAgICBidWlsZGVyLndoZXJlKGNvbXBhcmF0b3JDb2x1bW4sICdMSUtFJywgYCUke3JvbGUudmFsdWV9JWApO1xuICAgICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgcmVsYXRpb24gdGFibGUgbmFtZSBmcm9tIHJlbGF0aW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbHVtbiAtXG4gKiBAcmV0dXJuIHtTdHJpbmd9IC0gam9pbiByZWxhdGlvbiB0YWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFRhYmxlRnJvbVJlbGF0aW9uQ29sdW1uID0gKGNvbHVtbikgPT4ge1xuICBjb25zdCBzcGxpdGVkQ29sdW1uID0gY29sdW1uLnNwbGl0KCcuJyk7XG4gIHJldHVybiAoc3BsaXRlZENvbHVtbi5sZW5ndGggPiAwKSA/IHNwbGl0ZWRDb2x1bW5bMF0gOiAnJztcbn07XG5cbi8qKlxuICogQnVpbGRzIHZpZXcgcm9sZXMgam9pbiBxdWVyaWVzLlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gKiBAcGFyYW0ge0FycmF5fSByb2xlcyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpbHRlclJvbGVzSm9pbnModGFibGVOYW1lLCByb2xlcykge1xuICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICByb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZENvbHVtbiA9IGdldFJvbGVGaWVsZENvbHVtbih0YWJsZU5hbWUsIHJvbGUuY29sdW1uS2V5KTtcblxuICAgICAgaWYgKGZpZWxkQ29sdW1uLnJlbGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IGdldFRhYmxlRnJvbVJlbGF0aW9uQ29sdW1uKGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICAgICAgYnVpbGRlci5qb2luKGpvaW5UYWJsZSwgYCR7dGFibGVOYW1lfS4ke2ZpZWxkQ29sdW1uLmNvbHVtbn1gLCAnPScsIGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29ydENvbHVtbkpvaW4odGFibGVOYW1lLCBzb3J0Q29sdW1uS2V5KSB7XG4gIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGZpZWxkQ29sdW1uID0gZ2V0Um9sZUZpZWxkQ29sdW1uKHRhYmxlTmFtZSwgc29ydENvbHVtbktleSk7XG5cbiAgICBpZiAoZmllbGRDb2x1bW4ucmVsYXRpb24pIHtcbiAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IGdldFRhYmxlRnJvbVJlbGF0aW9uQ29sdW1uKGZpZWxkQ29sdW1uLnJlbGF0aW9uKTtcbiAgICAgIGJ1aWxkZXIuam9pbihqb2luVGFibGUsIGAke3RhYmxlTmFtZX0uJHtmaWVsZENvbHVtbi5jb2x1bW59YCwgJz0nLCBmaWVsZENvbHVtbi5yZWxhdGlvbik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBkYXRhYmFzZSBxdWVyeSBmcm9tIHN0b3JlZCB2aWV3IHJvbGVzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHJvbGVzIC1cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb2xlc1F1ZXJ5KHRhYmxlTmFtZSwgcm9sZXMsIGxvZ2ljRXhwcmVzc2lvbiA9ICcnKSB7XG4gIGNvbnN0IHJvbGVzSW5kZXhTZXQgPSB7fTtcblxuICByb2xlcy5mb3JFYWNoKChyb2xlKSA9PiB7XG4gICAgcm9sZXNJbmRleFNldFtyb2xlLmluZGV4XSA9IGJ1aWxkUm9sZVF1ZXJ5KHRhYmxlTmFtZSwgcm9sZSk7XG4gIH0pO1xuICAvLyBMZXhlciBmb3IgbG9naWMgZXhwcmVzc2lvbi5cbiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIobG9naWNFeHByZXNzaW9uKTtcbiAgY29uc3QgdG9rZW5zID0gbGV4ZXIuZ2V0VG9rZW5zKCk7XG5cbiAgLy8gUGFyc2UgdGhlIGxvZ2ljIGV4cHJlc3Npb24uXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodG9rZW5zKTtcbiAgY29uc3QgcGFyc2VkVHJlZSA9IHBhcnNlci5wYXJzZSgpO1xuXG4gIGNvbnN0IHF1ZXJ5UGFyc2VyID0gbmV3IFF1ZXJ5UGFyc2VyKHBhcnNlZFRyZWUsIHJvbGVzSW5kZXhTZXQpO1xuICByZXR1cm4gcXVlcnlQYXJzZXIucGFyc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgZmlsdGVyIHF1ZXJ5IGZvciBxdWVyeSBidWlsZGVyLlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gKiBAcGFyYW0ge0FycmF5fSByb2xlcyAtXG4gKiBAcGFyYW0ge1N0cmluZ30gbG9naWNFeHByZXNzaW9uIC1cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkRmlsdGVyUXVlcnkgPSAodGFibGVOYW1lLCByb2xlcywgbG9naWNFeHByZXNzaW9uKSA9PiB7XG4gIHJldHVybiAoYnVpbGRlcikgPT4ge1xuICAgIGJ1aWxkRmlsdGVyUm9sZXNRdWVyeSh0YWJsZU5hbWUsIHJvbGVzLCBsb2dpY0V4cHJlc3Npb24pKGJ1aWxkZXIpO1xuICB9O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHZpZXcgbG9naWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBsb2dpY0V4cHJlc3Npb24gLVxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyAtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbHRlckxvZ2ljRXhwcmVzc2lvbihsb2dpY0V4cHJlc3Npb24sIGluZGV4ZXMpIHtcbiAgY29uc3QgbG9naWNFeHBJbmRleGVzID0gbG9naWNFeHByZXNzaW9uLm1hdGNoKC9cXGQrL2cpIHx8IFtdO1xuICByZXR1cm4gIWRpZmZlcmVuY2UobG9naWNFeHBJbmRleGVzLm1hcChOdW1iZXIpLCBpbmRleGVzKS5sZW5ndGg7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHZpZXcgcm9sZXMuXG4gKiBAcGFyYW0ge0FycmF5fSByb2xlcyAtXG4gKiBAcGFyYW0ge1N0cmluZ30gbG9naWNFeHByZXNzaW9uIC1cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZpZXdSb2xlcyhyb2xlcywgbG9naWNFeHByZXNzaW9uKSB7XG4gIHJldHVybiB2YWxpZGF0ZUZpbHRlckxvZ2ljRXhwcmVzc2lvbihsb2dpY0V4cHJlc3Npb24sIHJvbGVzLm1hcCgocikgPT4gci5pbmRleCkpO1xufVxuXG4vKipcbiAqIE1hcGVzIHRoZSB2aWV3IHJvbGVzIHRvIHZpZXcgY29uZGl0aW9uYWxzLlxuICogQHBhcmFtIHtBcnJheX0gdmlld1JvbGVzIC1cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVmlld1JvbGVzVG9Db25kaXRpb25hbHModmlld1JvbGVzKSB7XG4gIHJldHVybiB2aWV3Um9sZXMubWFwKCh2aWV3Um9sZSkgPT4gKHtcbiAgICBjb21wYXJhdG9yOiB2aWV3Um9sZS5jb21wYXJhdG9yLFxuICAgIHZhbHVlOiB2aWV3Um9sZS52YWx1ZSxcbiAgICBjb2x1bW5LZXk6IHZpZXdSb2xlLmZpZWxkLmtleSxcbiAgICBzbHVnOiB2aWV3Um9sZS5maWVsZC5zbHVnLFxuICAgIGluZGV4OiB2aWV3Um9sZS5pbmRleCxcbiAgfSkpO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBGaWx0ZXJSb2xlc1RvRHluYW1pY0ZpbHRlcihyb2xlcykge1xuICByZXR1cm4gcm9sZXMubWFwKChyb2xlKSA9PiAoe1xuICAgIC4uLnJvbGUsXG4gICAgY29sdW1uS2V5OiByb2xlLmZpZWxkS2V5LFxuICB9KSk7XG59XG5cbi8qKlxuICogQnVpbGRzIHNvcnQgY29sdW1uIHF1ZXJ5LlxuICogQHBhcmFtIHtTdHJpbmd9IHRhYmxlTmFtZSAtXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sdW1uS2V5IC1cbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3J0RGlyZWN0aW9uIC1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29ydENvbHVtblF1ZXJ5KHRhYmxlTmFtZSwgY29sdW1uS2V5LCBzb3J0RGlyZWN0aW9uKSB7XG4gIGNvbnN0IGZpZWxkUmVsYXRpb24gPSBnZXRSb2xlRmllbGRDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5LZXkpO1xuICBjb25zdCBzb3J0Q29sdW1uID0gZmllbGRSZWxhdGlvbi5yZWxhdGlvbiB8fCBgJHt0YWJsZU5hbWV9LiR7ZmllbGRSZWxhdGlvbi5jb2x1bW59YDtcblxuICByZXR1cm4gKGJ1aWxkZXIpID0+IHtcbiAgICBidWlsZGVyLm9yZGVyQnkoc29ydENvbHVtbiwgc29ydERpcmVjdGlvbik7XG4gICAgYnVpbGRTb3J0Q29sdW1uSm9pbih0YWJsZU5hbWUsIGNvbHVtbktleSkoYnVpbGRlcik7XG4gIH07XG59IiwidmFyIG1hcCA9IHtcblx0XCIuL0FjY291bnRcIjogXCIuL3NyYy9tb2RlbHMvQWNjb3VudC5qc1wiLFxuXHRcIi4vQWNjb3VudC5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50LmpzXCIsXG5cdFwiLi9BY2NvdW50QmFsYW5jZVwiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50QmFsYW5jZS5qc1wiLFxuXHRcIi4vQWNjb3VudEJhbGFuY2UuanNcIjogXCIuL3NyYy9tb2RlbHMvQWNjb3VudEJhbGFuY2UuanNcIixcblx0XCIuL0FjY291bnRUcmFuc2FjdGlvblwiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24uanNcIixcblx0XCIuL0FjY291bnRUcmFuc2FjdGlvbi5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24uanNcIixcblx0XCIuL0FjY291bnRUeXBlXCI6IFwiLi9zcmMvbW9kZWxzL0FjY291bnRUeXBlLmpzXCIsXG5cdFwiLi9BY2NvdW50VHlwZS5qc1wiOiBcIi4vc3JjL21vZGVscy9BY2NvdW50VHlwZS5qc1wiLFxuXHRcIi4vQXV0aFwiOiBcIi4vc3JjL21vZGVscy9BdXRoLmpzXCIsXG5cdFwiLi9BdXRoLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0F1dGguanNcIixcblx0XCIuL0J1ZGdldFwiOiBcIi4vc3JjL21vZGVscy9CdWRnZXQuanNcIixcblx0XCIuL0J1ZGdldC5qc1wiOiBcIi4vc3JjL21vZGVscy9CdWRnZXQuanNcIixcblx0XCIuL0J1ZGdldEVudHJ5XCI6IFwiLi9zcmMvbW9kZWxzL0J1ZGdldEVudHJ5LmpzXCIsXG5cdFwiLi9CdWRnZXRFbnRyeS5qc1wiOiBcIi4vc3JjL21vZGVscy9CdWRnZXRFbnRyeS5qc1wiLFxuXHRcIi4vQ3VycmVuY3lcIjogXCIuL3NyYy9tb2RlbHMvQ3VycmVuY3kuanNcIixcblx0XCIuL0N1cnJlbmN5LmpzXCI6IFwiLi9zcmMvbW9kZWxzL0N1cnJlbmN5LmpzXCIsXG5cdFwiLi9DdXN0b21lclwiOiBcIi4vc3JjL21vZGVscy9DdXN0b21lci5qc1wiLFxuXHRcIi4vQ3VzdG9tZXIuanNcIjogXCIuL3NyYy9tb2RlbHMvQ3VzdG9tZXIuanNcIixcblx0XCIuL0RhdGVTZXNzaW9uXCI6IFwiLi9zcmMvbW9kZWxzL0RhdGVTZXNzaW9uLmpzXCIsXG5cdFwiLi9EYXRlU2Vzc2lvbi5qc1wiOiBcIi4vc3JjL21vZGVscy9EYXRlU2Vzc2lvbi5qc1wiLFxuXHRcIi4vRXhjaGFuZ2VSYXRlXCI6IFwiLi9zcmMvbW9kZWxzL0V4Y2hhbmdlUmF0ZS5qc1wiLFxuXHRcIi4vRXhjaGFuZ2VSYXRlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0V4Y2hhbmdlUmF0ZS5qc1wiLFxuXHRcIi4vRXhwZW5zZVwiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlLmpzXCIsXG5cdFwiLi9FeHBlbnNlLmpzXCI6IFwiLi9zcmMvbW9kZWxzL0V4cGVuc2UuanNcIixcblx0XCIuL0V4cGVuc2VDYXRlZ29yeVwiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlQ2F0ZWdvcnkuanNcIixcblx0XCIuL0V4cGVuc2VDYXRlZ29yeS5qc1wiOiBcIi4vc3JjL21vZGVscy9FeHBlbnNlQ2F0ZWdvcnkuanNcIixcblx0XCIuL0l0ZW1cIjogXCIuL3NyYy9tb2RlbHMvSXRlbS5qc1wiLFxuXHRcIi4vSXRlbS5qc1wiOiBcIi4vc3JjL21vZGVscy9JdGVtLmpzXCIsXG5cdFwiLi9JdGVtQ2F0ZWdvcnlcIjogXCIuL3NyYy9tb2RlbHMvSXRlbUNhdGVnb3J5LmpzXCIsXG5cdFwiLi9JdGVtQ2F0ZWdvcnkuanNcIjogXCIuL3NyYy9tb2RlbHMvSXRlbUNhdGVnb3J5LmpzXCIsXG5cdFwiLi9NYW51YWxKb3VybmFsXCI6IFwiLi9zcmMvbW9kZWxzL01hbnVhbEpvdXJuYWwuanNcIixcblx0XCIuL01hbnVhbEpvdXJuYWwuanNcIjogXCIuL3NyYy9tb2RlbHMvTWFudWFsSm91cm5hbC5qc1wiLFxuXHRcIi4vTWVkaWFcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWEuanNcIixcblx0XCIuL01lZGlhLmpzXCI6IFwiLi9zcmMvbW9kZWxzL01lZGlhLmpzXCIsXG5cdFwiLi9NZWRpYUxpbmtcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWFMaW5rLmpzXCIsXG5cdFwiLi9NZWRpYUxpbmsuanNcIjogXCIuL3NyYy9tb2RlbHMvTWVkaWFMaW5rLmpzXCIsXG5cdFwiLi9NZXRhYmxlXCI6IFwiLi9zcmMvbW9kZWxzL01ldGFibGUuanNcIixcblx0XCIuL01ldGFibGUuanNcIjogXCIuL3NyYy9tb2RlbHMvTWV0YWJsZS5qc1wiLFxuXHRcIi4vTW9kZWxcIjogXCIuL3NyYy9tb2RlbHMvTW9kZWwuanNcIixcblx0XCIuL01vZGVsLmpzXCI6IFwiLi9zcmMvbW9kZWxzL01vZGVsLmpzXCIsXG5cdFwiLi9PcHRpb25cIjogXCIuL3NyYy9tb2RlbHMvT3B0aW9uLmpzXCIsXG5cdFwiLi9PcHRpb24uanNcIjogXCIuL3NyYy9tb2RlbHMvT3B0aW9uLmpzXCIsXG5cdFwiLi9QYWdpbmF0aW9uXCI6IFwiLi9zcmMvbW9kZWxzL1BhZ2luYXRpb24uanNcIixcblx0XCIuL1BhZ2luYXRpb24uanNcIjogXCIuL3NyYy9tb2RlbHMvUGFnaW5hdGlvbi5qc1wiLFxuXHRcIi4vUGVybWlzc2lvblwiOiBcIi4vc3JjL21vZGVscy9QZXJtaXNzaW9uLmpzXCIsXG5cdFwiLi9QZXJtaXNzaW9uLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1Blcm1pc3Npb24uanNcIixcblx0XCIuL1Jlc291cmNlXCI6IFwiLi9zcmMvbW9kZWxzL1Jlc291cmNlLmpzXCIsXG5cdFwiLi9SZXNvdXJjZS5qc1wiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZS5qc1wiLFxuXHRcIi4vUmVzb3VyY2VGaWVsZFwiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkLmpzXCIsXG5cdFwiLi9SZXNvdXJjZUZpZWxkLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1Jlc291cmNlRmllbGQuanNcIixcblx0XCIuL1Jlc291cmNlRmllbGRNZXRhZGF0YVwiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkTWV0YWRhdGEuanNcIixcblx0XCIuL1Jlc291cmNlRmllbGRNZXRhZGF0YS5qc1wiOiBcIi4vc3JjL21vZGVscy9SZXNvdXJjZUZpZWxkTWV0YWRhdGEuanNcIixcblx0XCIuL1JvbGVcIjogXCIuL3NyYy9tb2RlbHMvUm9sZS5qc1wiLFxuXHRcIi4vUm9sZS5qc1wiOiBcIi4vc3JjL21vZGVscy9Sb2xlLmpzXCIsXG5cdFwiLi9TZXR0aW5nXCI6IFwiLi9zcmMvbW9kZWxzL1NldHRpbmcuanNcIixcblx0XCIuL1NldHRpbmcuanNcIjogXCIuL3NyYy9tb2RlbHMvU2V0dGluZy5qc1wiLFxuXHRcIi4vVGVuYW50TW9kZWxcIjogXCIuL3NyYy9tb2RlbHMvVGVuYW50TW9kZWwuanNcIixcblx0XCIuL1RlbmFudE1vZGVsLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1RlbmFudE1vZGVsLmpzXCIsXG5cdFwiLi9UZW5hbnRVc2VyXCI6IFwiLi9zcmMvbW9kZWxzL1RlbmFudFVzZXIuanNcIixcblx0XCIuL1RlbmFudFVzZXIuanNcIjogXCIuL3NyYy9tb2RlbHMvVGVuYW50VXNlci5qc1wiLFxuXHRcIi4vVmVuZG9yXCI6IFwiLi9zcmMvbW9kZWxzL1ZlbmRvci5qc1wiLFxuXHRcIi4vVmVuZG9yLmpzXCI6IFwiLi9zcmMvbW9kZWxzL1ZlbmRvci5qc1wiLFxuXHRcIi4vVmlld1wiOiBcIi4vc3JjL21vZGVscy9WaWV3LmpzXCIsXG5cdFwiLi9WaWV3LmpzXCI6IFwiLi9zcmMvbW9kZWxzL1ZpZXcuanNcIixcblx0XCIuL1ZpZXdDb2x1bW5cIjogXCIuL3NyYy9tb2RlbHMvVmlld0NvbHVtbi5qc1wiLFxuXHRcIi4vVmlld0NvbHVtbi5qc1wiOiBcIi4vc3JjL21vZGVscy9WaWV3Q29sdW1uLmpzXCIsXG5cdFwiLi9WaWV3Um9sZVwiOiBcIi4vc3JjL21vZGVscy9WaWV3Um9sZS5qc1wiLFxuXHRcIi4vVmlld1JvbGUuanNcIjogXCIuL3NyYy9tb2RlbHMvVmlld1JvbGUuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi9zcmMvbW9kZWxzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7IiwiLyogZXNsaW50LWRpc2FibGUgZ2xvYmFsLXJlcXVpcmUgKi9cbmltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQge1xuICBidWlsZEZpbHRlclF1ZXJ5LFxuICBidWlsZFNvcnRDb2x1bW5RdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5pbXBvcnQgeyBmbGF0VG9OZXN0ZWRBcnJheSB9IGZyb20gJ0AvdXRpbHMnO1xuaW1wb3J0IERlcGVuZGVuY3lHcmFwaCBmcm9tICdAL2xpYi9EZXBlbmRlbmN5R3JhcGgnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50IGV4dGVuZHMgbWl4aW4oVGVuYW50TW9kZWwsIFtDYWNoYWJsZU1vZGVsXSkge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdhY2NvdW50cyc7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wcyBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgcXVlcnkgYnVpbGRlciBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXQgUXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBDYWNoYWJsZVF1ZXJ5QnVpbGRlcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQganNvblNjaGVtYSAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAvLyBpZDoge3R5cGU6ICdpbnRlZ2VyJ30sXG4gICAgICAgIC8vIGJpcnRoZGF5OiB7dHlwZTogWydkYXRldGltZScsICdudWxsJ119LFxuICAgICAgICBjcmVhdGVkX2F0OiB7dHlwZTogJ2RhdGV0aW1lJ30sXG4gICAgICAgIC8vIHVwZGF0ZWQ6IHt0eXBlOiBbJ2RhdGV0aW1lJywgJ251bGwnXX1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJldHVybiBvdmVycmlkZS5cbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIFxuICAgKi9cbiAgc3RhdGljIHF1ZXJ5KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc3VwZXIucXVlcnkoLi4uYXJncykucnVuQWZ0ZXIoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0RlcEdyYXBoID9cbiAgICAgICAgICBBY2NvdW50LnRvRGVwZW5kZW5jeUdyYXBoKHJlc3VsdCkgOlxuICAgICAgICAgIHRoaXMuY29sbGVjdGlvbi5mcm9tKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGFycmF5IHJlc3VsdCB0byBkZXBlbmRlbmN5IGdyYXBoLlxuICAgKi9cbiAgc3RhdGljIGRlcEdyYXBoKCkge1xuICAgIHRoaXMuaXNEZXBHcmFwaCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgbW9kaWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldCBtb2RpZmllcnMoKSB7XG4gICAgY29uc3QgVEFCTEVfTkFNRSA9IEFjY291bnQudGFibGVOYW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlckFjY291bnRzKHF1ZXJ5LCBhY2NvdW50SWRzKSB7XG4gICAgICAgIGlmIChhY2NvdW50SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVyeS53aGVyZUluKGAke1RBQkxFX05BTUV9LmlkYCwgYWNjb3VudElkcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJBY2NvdW50VHlwZXMocXVlcnksIHR5cGVzSWRzKSB7XG4gICAgICAgIGlmICh0eXBlc0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbignYWNjb3VudF90eXBlcy5hY2NvdW5fdHlwZV9pZCcsIHR5cGVzSWRzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZpZXdSb2xlc0J1aWxkZXIocXVlcnksIGNvbmRpdGlvbmFscywgZXhwcmVzc2lvbikge1xuICAgICAgICBidWlsZEZpbHRlclF1ZXJ5KEFjY291bnQudGFibGVOYW1lLCBjb25kaXRpb25hbHMsIGV4cHJlc3Npb24pKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBzb3J0Q29sdW1uQnVpbGRlcihxdWVyeSwgY29sdW1uS2V5LCBkaXJlY3Rpb24pIHtcbiAgICAgICAgYnVpbGRTb3J0Q29sdW1uUXVlcnkoQWNjb3VudC50YWJsZU5hbWUsIGNvbHVtbktleSwgZGlyZWN0aW9uKShxdWVyeSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudFR5cGUgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50VHlwZScpO1xuICAgIGNvbnN0IEFjY291bnRCYWxhbmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudEJhbGFuY2UnKTtcbiAgICBjb25zdCBBY2NvdW50VHJhbnNhY3Rpb24gPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50VHJhbnNhY3Rpb24nKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgbW9kZWwgbWF5IGJlbG9uZ3MgdG8gYWNjb3VudCB0eXBlLlxuICAgICAgICovXG4gICAgICB0eXBlOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnRUeXBlLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2FjY291bnRzLmFjY291bnRUeXBlSWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudF90eXBlcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgbW9kZWwgbWF5IGhhcyBtYW55IGJhbGFuY2VzIGFjY291bnRzLlxuICAgICAgICovXG4gICAgICBiYWxhbmNlOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNPbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnRCYWxhbmNlLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRfYmFsYW5jZXMuYWNjb3VudElkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWNjb3VudCBtb2RlbCBtYXkgaGFzIG1hbnkgdHJhbnNhY3Rpb25zLlxuICAgICAgICovXG4gICAgICB0cmFuc2FjdGlvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnRUcmFuc2FjdGlvbi5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50cy5pZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50c190cmFuc2FjdGlvbnMuYWNjb3VudElkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0Sm91cm5hbEVudHJpZXMoYWNjb3VudHMpIHtcbiAgICByZXR1cm4gZmxhdHRlbihhY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQudHJhbnNhY3Rpb25zLm1hcCgodHJhbnNhY3Rpb24pID0+ICh7XG4gICAgICBhY2NvdW50SWQ6IGFjY291bnQuaWQsXG4gICAgICAuLi50cmFuc2FjdGlvbixcbiAgICAgIGFjY291bnROb3JtYWw6IGFjY291bnQudHlwZS5ub3JtYWwsXG4gICAgfSkpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgZmxhdHRlbiBhY2NvdW50cyBsaXN0IHRvIG5lc3RlZCBhcnJheS4gXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFjY291bnRzIFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBcbiAgICovXG4gIHN0YXRpYyB0b05lc3RlZEFycmF5KGFjY291bnRzLCBvcHRpb25zID0geyBjaGlsZHJlbjogJ2NoaWxkcmVuJyB9KSB7XG4gICAgcmV0dXJuIGZsYXRUb05lc3RlZEFycmF5KGFjY291bnRzLCB7IGlkOiAnaWQnLCBwYXJlbnRJZDogJ3BhcmVudEFjY291bnRJZCcgfSlcbiAgfVxuXG4gIHN0YXRpYyB0b0RlcGVuZGVuY3lHcmFwaChhY2NvdW50cykge1xuICAgIHJldHVybiBEZXBlbmRlbmN5R3JhcGguZnJvbUFycmF5KFxuICAgICAgYWNjb3VudHMsIHsgaXRlbUlkOiAnaWQnLCBwYXJlbnRJdGVtSWQ6ICdwYXJlbnRBY2NvdW50SWQnIH1cbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50QmFsYW5jZSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYWNjb3VudF9iYWxhbmNlcyc7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnYWNjb3VudF9iYWxhbmNlcy5hY2NvdW50X2lkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIG1peGluIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjb3VudFRyYW5zYWN0aW9uIGV4dGVuZHMgbWl4aW4oVGVuYW50TW9kZWwsIFtDYWNoYWJsZU1vZGVsXSkge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdhY2NvdW50c190cmFuc2FjdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcHMgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgcXVlcnkgYnVpbGRlciBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXQgUXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBDYWNoYWJsZVF1ZXJ5QnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyQWNjb3VudHMocXVlcnksIGFjY291bnRzSWRzKSB7XG4gICAgICAgIGlmIChhY2NvdW50c0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbignYWNjb3VudF9pZCcsIGFjY291bnRzSWRzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlclRyYW5zYWN0aW9uVHlwZXMocXVlcnksIHR5cGVzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGVzKSAmJiB0eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbigncmVmZXJlbmNlX3R5cGUnLCB0eXBlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdyZWZlcmVuY2VfdHlwZScsIHR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlckRhdGVSYW5nZShxdWVyeSwgc3RhcnREYXRlLCBlbmREYXRlLCB0eXBlID0gJ2RheScpIHtcbiAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREIEhIOm1tOnNzJztcbiAgICAgICAgY29uc3QgZnJvbURhdGUgPSBtb21lbnQoc3RhcnREYXRlKS5zdGFydE9mKHR5cGUpLmZvcm1hdChkYXRlRm9ybWF0KTtcbiAgICAgICAgY29uc3QgdG9EYXRlID0gbW9tZW50KGVuZERhdGUpLmVuZE9mKHR5cGUpLmZvcm1hdChkYXRlRm9ybWF0KTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2RhdGUnLCAnPj0nLCBmcm9tRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZERhdGUpIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgnZGF0ZScsICc8PScsIHRvRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJBbW91bnRSYW5nZShxdWVyeSwgZnJvbUFtb3VudCwgdG9BbW91bnQpIHtcbiAgICAgICAgaWYgKGZyb21BbW91bnQpIHtcbiAgICAgICAgICBxdWVyeS5hbmRXaGVyZSgocSkgPT4ge1xuICAgICAgICAgICAgcS53aGVyZSgnY3JlZGl0JywgJz49JywgZnJvbUFtb3VudCk7XG4gICAgICAgICAgICBxLm9yV2hlcmUoJ2RlYml0JywgJz49JywgZnJvbUFtb3VudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvQW1vdW50KSB7XG4gICAgICAgICAgcXVlcnkuYW5kV2hlcmUoKHEpID0+IHtcbiAgICAgICAgICAgIHEud2hlcmUoJ2NyZWRpdCcsICc8PScsIHRvQW1vdW50KTtcbiAgICAgICAgICAgIHEub3JXaGVyZSgnZGViaXQnLCAnPD0nLCB0b0Ftb3VudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdW1hdGlvbkNyZWRpdERlYml0KHF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5LnN1bSgnY3JlZGl0IGFzIGNyZWRpdCcpO1xuICAgICAgICBxdWVyeS5zdW0oJ2RlYml0IGFzIGRlYml0Jyk7XG4gICAgICAgIHF1ZXJ5Lmdyb3VwQnkoJ2FjY291bnRfaWQnKTtcbiAgICAgIH0sXG4gICAgICBmaWx0ZXJDb250YWN0VHlwZShxdWVyeSwgY29udGFjdFR5cGUpIHtcbiAgICAgICAgcXVlcnkud2hlcmUoJ2NvbnRhY3RfdHlwZScsIGNvbnRhY3RUeXBlKTtcbiAgICAgIH0sXG4gICAgICBmaWx0ZXJDb250YWN0SWRzKHF1ZXJ5LCBjb250YWN0SWRzKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlSW4oJ2NvbnRhY3RfaWQnLCBjb250YWN0SWRzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBBY2NvdW50ID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoQWNjb3VudC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdhY2NvdW50c190cmFuc2FjdGlvbnMuYWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiLy8gaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNb2RlbCwgbWl4aW4gfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2NvdW50VHlwZSBleHRlbmRzIG1peGluKFRlbmFudE1vZGVsLCBbQ2FjaGFibGVNb2RlbF0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYWNjb3VudF90eXBlcyc7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEFjY291bnQgdHlwZSBtYXkgaGFzIG1hbnkgYXNzb2NpYXRlZCBhY2NvdW50cy5cbiAgICAgICAqL1xuICAgICAgYWNjb3VudHM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnYWNjb3VudF90eXBlcy5pZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5hY2NvdW50VHlwZUlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdXRoIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHVzZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYXV0aGVudGljYXRlZCB1c2VyLlxuICAgKiBAcGFyYW0ge1VzZXJ9IHVzZXJcbiAgICovXG4gIHN0YXRpYyBzZXRBdXRoZW50aWNhdGVkVXNlcih1c2VyKSB7XG4gICAgdGhpcy51c2VyID0gdXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgYXV0aGVudGljYXRlZCB1c2VyIElELlxuICAgKi9cbiAgc3RhdGljIHVzZXJJZCgpIHtcbiAgICBpZiAoIXRoaXMudXNlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51c2VyLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgaXMgbG9nZ2VkIG9yIG5vdC5cbiAgICovXG4gIHN0YXRpYyBpc0xvZ2dlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLnVzZXI7XG4gIH1cblxuICBzdGF0aWMgbG9nZ2VkT3V0KCkge1xuICAgIHRoaXMudXNlciA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1ZGdldCBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnYnVkZ2V0cyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHZpcnR1YWxBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ3JhbmdlQnknLCAncmFuZ2VJbmNyZW1lbnQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyQnlZZWFyKHF1ZXJ5LCB5ZWFyKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKCd5ZWFyJywgeWVhcik7XG4gICAgICB9LFxuICAgICAgZmlsdGVyQnlJbmNvbWVTdGF0ZW1lbnQocXVlcnkpIHtcbiAgICAgICAgcXVlcnkud2hlcmUoJ2FjY291bnRfdHlwZXMnLCAnaW5jb21lX3N0YXRlbWVudCcpO1xuICAgICAgfSxcbiAgICAgIGZpbHRlckJ5UHJvZml0TG9zcyhxdWVyeSkge1xuICAgICAgICBxdWVyeS53aGVyZSgnYWNjb3VudHNfdHlwZXMnLCAncHJvZml0X2xvc3MnKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldCByYW5nZUJ5KCkge1xuICAgIHN3aXRjaCAodGhpcy5wZXJpb2QpIHtcbiAgICAgIGNhc2UgJ2hhbGYteWVhcic6XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5wZXJpb2Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJhbmdlSW5jcmVtZW50KCkge1xuICAgIHN3aXRjaCAodGhpcy5wZXJpb2QpIHtcbiAgICAgIGNhc2UgJ2hhbGYteWVhcic6XG4gICAgICAgIHJldHVybiA2O1xuICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJhbmdlT2Zmc2V0KCkge1xuICAgIHN3aXRjaCAodGhpcy5wZXJpb2QpIHtcbiAgICAgIGNhc2UgJ2hhbGYteWVhcic6IHJldHVybiA1O1xuICAgICAgY2FzZSAncXVhcnRlcic6IHJldHVybiAyO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIDA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWRnZXQgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2J1ZGdldF9lbnRyaWVzJztcbiAgfVxufVxuIiwiaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VycmVuY3kgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2N1cnJlbmNpZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcHMgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbWVyIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdjdXN0b21lcnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIHRpbWVzdGFtcHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIG1vZGlmaWVycy5cbiAgICovXG4gIHN0YXRpYyBnZXQgbW9kaWZpZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJDdXN0b21lcklkcyhxdWVyeSwgY3VzdG9tZXJJZHMpIHtcbiAgICAgICAgcXVlcnkud2hlcmVJbignaWQnLCBjdXN0b21lcklkcyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsKSA9PiB7XG4gIHJldHVybiBjbGFzcyBEYXRlU2Vzc2lvbiBleHRlbmRzIE1vZGVsIHtcblxuICAgIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgICB9XG5cbiAgICAkYmVmb3JlVXBkYXRlKG9wdCwgY29udGV4dCkge1xuICAgICAgY29uc3QgbWF5YmVQcm9taXNlID0gc3VwZXIuJGJlZm9yZVVwZGF0ZShvcHQsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlU2Vzc2lvbi50aW1lc3RhbXBzWzFdKSB7XG4gICAgICAgICAgdGhpc1tEYXRlU2Vzc2lvbi50aW1lc3RhbXBzWzFdXSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkYmVmb3JlSW5zZXJ0KGNvbnRleHQpIHtcbiAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHN1cGVyLiRiZWZvcmVJbnNlcnQoY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKERhdGVTZXNzaW9uLnRpbWVzdGFtcHNbMF0pIHtcbiAgICAgICAgICB0aGlzW0RhdGVTZXNzaW9uLnRpbWVzdGFtcHNbMF1dID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBiY3J5cHQgZnJvbSAnYmNyeXB0anMnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhjaGFuZ2VSYXRlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnZXhjaGFuZ2VfcmF0ZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcHMgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gIH1cbn0iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IHsgdmlld1JvbGVzQnVpbGRlciB9IGZyb20gJ0AvbGliL1ZpZXdSb2xlc0J1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBlbnNlIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdleHBlbnNlc190cmFuc2FjdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY291bnQgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlZmVyZW5jZVR5cGUoKSB7XG4gICAgcmV0dXJuICdFeHBlbnNlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCB0aW1lc3RhbXBzLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyQnlEYXRlUmFuZ2UocXVlcnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSkge1xuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2RhdGUnLCAnPj0nLCBzdGFydERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2RhdGUnLCAnPD0nLCBlbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlckJ5QW1vdW50UmFuZ2UocXVlcnksIGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUoJ2Ftb3VudCcsICc+PScsIGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdhbW91bnQnLCAnPD0nLCB0byk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXJCeUV4cGVuc2VBY2NvdW50KHF1ZXJ5LCBhY2NvdW50SWQpIHtcbiAgICAgICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKCdleHBlbnNlX2FjY291bnRfaWQnLCBhY2NvdW50SWQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyQnlQYXltZW50QWNjb3VudChxdWVyeSwgYWNjb3VudElkKSB7XG4gICAgICAgIGlmIChhY2NvdW50SWQpIHtcbiAgICAgICAgICBxdWVyeS53aGVyZSgncGF5bWVudF9hY2NvdW50X2lkJywgYWNjb3VudElkKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgdmlld1JvbGVzQnVpbGRlcihxdWVyeSwgY29uZGl0aW9uYWxzLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHZpZXdSb2xlc0J1aWxkZXIoY29uZGl0aW9uYWxzLCBleHByZXNzaW9uKShxdWVyeSk7XG4gICAgICB9LFxuXG4gICAgICBvcmRlckJ5KHF1ZXJ5KSB7XG4gICAgICAgIFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgQWNjb3VudCA9IHJlcXVpcmUoJ0AvbW9kZWxzL0FjY291bnQnKTtcbiAgICBjb25zdCBVc2VyID0gcmVxdWlyZSgnQC9tb2RlbHMvVGVuYW50VXNlcicpO1xuICAgIGNvbnN0IEV4cGVuc2VDYXRlZ29yeSA9IHJlcXVpcmUoJ0AvbW9kZWxzL0V4cGVuc2VDYXRlZ29yeScpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBwYXltZW50QWNjb3VudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChBY2NvdW50LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2V4cGVuc2VzX3RyYW5zYWN0aW9ucy5wYXltZW50QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjYXRlZ29yaWVzOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNNYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChFeHBlbnNlQ2F0ZWdvcnkuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnZXhwZW5zZXNfdHJhbnNhY3Rpb25zLmlkJyxcbiAgICAgICAgICB0bzogJ2V4cGVuc2VfdHJhbnNhY3Rpb25fY2F0ZWdvcmllcy5leHBlbnNlSWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVXNlci5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdleHBlbnNlc190cmFuc2FjdGlvbnMudXNlcklkJyxcbiAgICAgICAgICB0bzogJ3VzZXJzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXhwZW5zZUNhdGVnb3J5IGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdleHBlbnNlX3RyYW5zYWN0aW9uX2NhdGVnb3JpZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IEFjY291bnQgPSByZXF1aXJlKCdAL21vZGVscy9BY2NvdW50Jyk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGVuc2VBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnZXhwZW5zZV90cmFuc2FjdGlvbl9jYXRlZ29yaWVzLmV4cGVuc2VBY2NvdW50SWQnLFxuICAgICAgICAgIHRvOiAnYWNjb3VudHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRGaWx0ZXJRdWVyeSxcbn0gZnJvbSAnQC9saWIvVmlld1JvbGVzQnVpbGRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEl0ZW0gZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ2l0ZW1zJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCB0aW1lc3RhbXBzLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICBjb25zdCBUQUJMRV9OQU1FID0gSXRlbS50YWJsZU5hbWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc29ydEJ5KHF1ZXJ5LCBjb2x1bW5Tb3J0LCBzb3J0RGlyZWN0aW9uKSB7XG4gICAgICAgIHF1ZXJ5Lm9yZGVyQnkoY29sdW1uU29ydCwgc29ydERpcmVjdGlvbik7XG4gICAgICB9LFxuICAgICAgdmlld1JvbGVzQnVpbGRlcihxdWVyeSwgY29uZGl0aW9ucywgbG9naWNFeHByZXNzaW9uKSB7XG4gICAgICAgIGJ1aWxkRmlsdGVyUXVlcnkoSXRlbS50YWJsZU5hbWUsIGNvbmRpdGlvbnMsIGxvZ2ljRXhwcmVzc2lvbikocXVlcnkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IE1lZGlhID0gcmVxdWlyZSgnQC9tb2RlbHMvTWVkaWEnKTtcbiAgICBjb25zdCBBY2NvdW50ID0gcmVxdWlyZSgnQC9tb2RlbHMvQWNjb3VudCcpO1xuICAgIGNvbnN0IEl0ZW1DYXRlZ29yeSA9IHJlcXVpcmUoJ0AvbW9kZWxzL0l0ZW1DYXRlZ29yeScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSXRlbSBtYXkgYmVsb25ncyB0byBjYXRlb2dvcnkgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEl0ZW1DYXRlZ29yeS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtcy5jYXRlZ29yeUlkJyxcbiAgICAgICAgICB0bzogJ2l0ZW1zX2NhdGVnb3JpZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgY29zdEFjY291bnQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoQWNjb3VudC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtcy5jb3N0QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHNlbGxBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuc2VsbEFjY291bnRJZCcsXG4gICAgICAgICAgdG86ICdhY2NvdW50cy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBpbnZlbnRvcnlBY2NvdW50OiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KEFjY291bnQuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnaXRlbXMuaW52ZW50b3J5QWNjb3VudElkJyxcbiAgICAgICAgICB0bzogJ2FjY291bnRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIG1lZGlhOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5NYW55VG9NYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChNZWRpYS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdpdGVtcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ21lZGlhX2xpbmtzLm1vZGVsX2lkJyxcbiAgICAgICAgICAgIHRvOiAnbWVkaWFfbGlua3MubWVkaWFfaWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdtZWRpYS5pZCcsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJdGVtQ2F0ZWdvcnkgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdpdGVtc19jYXRlZ29yaWVzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBJdGVtID0gcmVxdWlyZSgnQC9tb2RlbHMvSXRlbScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSXRlbSBjYXRlZ29yeSBtYXkgaGFzIG1hbnkgaXRlbXMuXG4gICAgICAgKi9cbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5IYXNNYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChJdGVtLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ2l0ZW1zX2NhdGVnb3JpZXMuaWQnLFxuICAgICAgICAgIHRvOiAnaXRlbXMuY2F0ZWdvcnlJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hbnVhbEpvdXJuYWwgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdtYW51YWxfam91cm5hbHMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGVsIHRpbWVzdGFtcHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IE1lZGlhID0gcmVxdWlyZSgnQC9tb2RlbHMvTWVkaWEnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtZWRpYToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuTWFueVRvTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoTWVkaWEuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAnbWFudWFsX2pvdXJuYWxzLmlkJyxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiAnbWVkaWFfbGlua3MubW9kZWxfaWQnLFxuICAgICAgICAgICAgdG86ICdtZWRpYV9saW5rcy5tZWRpYV9pZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ21lZGlhLmlkJyxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lZGlhIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdtZWRpYSc7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lZGlhTGluayBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAnbWVkaWFfbGlua3MnO1xuICB9XG59XG4iLCJpbXBvcnQga25leCBmcm9tICdAL2RhdGFiYXNlL2tuZXgnO1xuLy8gaW1wb3J0IGNhY2hlIGZyb20gJ21lbW9yeS1jYWNoZSc7XG5cbi8vIE1ldGFkYXRhXG5leHBvcnQgZGVmYXVsdCB7XG4gIE1FVEFEQVRBX0dST1VQOiAnZGVmYXVsdCcsXG4gIEtFWV9DT0xVTU46ICdrZXknLFxuICBWQUxVRV9DT0xVTU46ICd2YWx1ZScsXG4gIFRZUEVfQ09MVU1OOiAndHlwZScsXG5cbiAgZXh0cmFDb2x1bW5zOiBbXSxcbiAgbWV0YWRhdGE6IFtdLFxuICBzaG91bGRSZWxvYWQ6IHRydWUsXG4gIGV4dHJhTWV0YWRhdGFRdWVyeTogKCkgPT4ge30sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgY29sdW1uIGtleSB0byBxdWVyeSBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtXG4gICAqL1xuICBzZXRLZXlDb2x1bW5OYW1lKG5hbWUpIHtcbiAgICB0aGlzLktFWV9DT0xVTU4gPSBuYW1lO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGtleSBjb2x1bW4gbmFtZSB0byBxdWVyeSBmcm9tLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtXG4gICAqL1xuICBzZXRWYWx1ZUNvbHVtbk5hbWUobmFtZSkge1xuICAgIHRoaXMuVkFMVUVfQ09MVU1OID0gbmFtZTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0IGV4dHJhIGNvbHVtbnMgdG8gYmUgYWRkZWQgdG8gdGhlIHJvd3MuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnMgLVxuICAgKi9cbiAgc2V0RXh0cmFDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICB0aGlzLmV4dHJhQ29sdW1ucyA9IGNvbHVtbnM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGRhdGFiYXNlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZ3JvdXBOYW1lIC1cbiAgICovXG4gIHdoZXJlUXVlcnkocXVlcnksIGtleSkge1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9IHRoaXMuTUVUQURBVEFfR1JPVVA7XG5cbiAgICBpZiAoZ3JvdXBOYW1lKSB7XG4gICAgICBxdWVyeS53aGVyZSgnZ3JvdXAnLCBncm91cE5hbWUpO1xuICAgIH1cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlSW4oJ2tleScsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZSgna2V5Jywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0ga2V5IC1cbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZSAtXG4gICAqL1xuICBhc3luYyBsb2FkKGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5zaG91bGRSZWxvYWQgfHwgZm9yY2UpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhQ29sbGVjdGlvbiA9IGF3YWl0IHRoaXMucXVlcnkoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIHRoaXMud2hlcmVRdWVyeShxdWVyeSk7XG4gICAgICAgIHRoaXMuZXh0cmFNZXRhZGF0YVF1ZXJ5KHF1ZXJ5KTtcbiAgICAgIH0pLmZldGNoQWxsKCk7XG5cbiAgICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gZmFsc2U7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gW107XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhQXJyYXkgPSB0aGlzLm1hcE1ldGFkYXRhQ29sbGVjdGlvbihtZXRhZGF0YUNvbGxlY3Rpb24pO1xuICAgICAgbWV0YWRhdGFBcnJheS5mb3JFYWNoKChtZXRhZGF0YSkgPT4geyB0aGlzLm1ldGFkYXRhLnB1c2gobWV0YWRhdGEpOyB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIHRoZSBtZXRhZGF0YSB0aGF0IGFzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGdyb3VwLlxuICAgKi9cbiAgYXN5bmMgYWxsTWV0YShmb3JjZSA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkKGZvcmNlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogRmluZCB0aGUgZ2l2ZW4gbWV0YWRhdGEga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IC1cbiAgICogQHJldHVybiB7b2JqZWN0fSAtIE1ldGFkYXRhIG9iamVjdC5cbiAgICovXG4gIGZpbmRNZXRhKGtleSkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmZpbmQoKG1ldGEpID0+IG1ldGEua2V5ID09PSBrZXkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbWV0YWRhdGEgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuXG4gICAqIEBwYXJhbSB7Kn0ga2V5IC1cbiAgICovXG4gIGFzeW5jIGdldE1ldGEoa2V5LCBkZWZhdWx0VmFsdWUsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWQoZm9yY2UpO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmZpbmRNZXRhKGtleSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEudmFsdWUgOiBkZWZhdWx0VmFsdWUgfHwgZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1hcmtlcyB0aGUgbWV0YWRhdGEgdG8gc2hvdWxkIGJlIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlTWV0YShrZXkpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEoa2V5KTtcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbWV0YWRhdGEubWFya0FzRGVsZXRlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtZXRhIGRhdGEgb2YgdGhlIGdpdmVuIGdyb3VwLlxuICAgKiBAcGFyYW0geyp9IGdyb3VwXG4gICAqL1xuICByZW1vdmVBbGxNZXRhKGdyb3VwID0gJ2RlZmF1bHQnKSB7XG4gICAgdGhpcy5tZXRkYXRhLm1hcCgobWV0YSkgPT4gKHtcbiAgICAgIC4uLihtZXRhLmdyb3VwICE9PSBncm91cCkgPyB7IG1hcmtBc0RlbGV0ZWQ6IHRydWUgfSA6IHt9LFxuICAgICAgLi4ubWV0YSxcbiAgICB9KSk7XG4gICAgdGhpcy5zaG91bGRSZWxvYWQgPSB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1ldGEgZGF0YSB0byB0aGUgc3RhY2suXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgLVxuICAgKi9cbiAgYXN5bmMgc2V0TWV0YShrZXksIHZhbHVlLCBwYXlsb2FkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBrZXk7XG4gICAgICBtZXRhZGF0YS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0TWV0YShtZXRhLmtleSwgbWV0YS52YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZmluZE1ldGEoa2V5KTtcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbWV0YWRhdGEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG1ldGFkYXRhLm1hcmtBc1VwZGF0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnB1c2goe1xuICAgICAgICB2YWx1ZSwga2V5LCAuLi5wYXlsb2FkLCBtYXJrQXNJbnNlcnRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2F2ZWQgdGhlIG1vZGlmaWVkIG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgc2F2ZU1ldGEoKSB7XG4gICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLm1ldGFkYXRhLmZpbHRlcigobSkgPT4gKG0ubWFya0FzSW5zZXJ0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc1VwZGF0ZWQgPT09IHRydWUpKTtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IChtLm1hcmtBc0RlbGV0ZWQgPT09IHRydWUpKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhRGVsZXRlZEtleXMgPSBkZWxldGVkLm1hcCgobSkgPT4gbS5rZXkpO1xuICAgIGNvbnN0IG1ldGFkYXRhSW5zZXJ0ZWQgPSBpbnNlcnRlZC5tYXAoKG0pID0+IHRoaXMubWFwTWV0YWRhdGEobSwgJ2Zvcm1hdCcpKTtcbiAgICBjb25zdCBtZXRhZGF0YVVwZGF0ZWQgPSB1cGRhdGVkLm1hcCgobSkgPT4gdGhpcy5tYXBNZXRhZGF0YShtLCAnZm9ybWF0JykpO1xuXG4gICAgY29uc3QgYmF0Y2hVcGRhdGUgPSAoY29sbGVjdGlvbikgPT4ga25leC50cmFuc2FjdGlvbigodHJ4KSA9PiB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gY29sbGVjdGlvbi5tYXAoKHR1cGxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0ga25leCh0aGlzLnRhYmxlTmFtZSk7XG4gICAgICAgIHRoaXMud2hlcmVRdWVyeShxdWVyeSwgdHVwbGUua2V5KTtcbiAgICAgICAgdGhpcy5leHRyYU1ldGFkYXRhUXVlcnkocXVlcnkpO1xuICAgICAgICByZXR1cm4gcXVlcnkudXBkYXRlKHR1cGxlKS50cmFuc2FjdGluZyh0cngpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVlcmllcykudGhlbih0cnguY29tbWl0KS5jYXRjaCh0cngucm9sbGJhY2spO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAga25leC5pbnNlcnQobWV0YWRhdGFJbnNlcnRlZCkuaW50byh0aGlzLnRhYmxlTmFtZSksXG4gICAgICBiYXRjaFVwZGF0ZShtZXRhZGF0YVVwZGF0ZWQpLFxuICAgICAgbWV0YWRhdGFEZWxldGVkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5xdWVyeSgnd2hlcmVJbicsIHRoaXMuS0VZX0NPTFVNTiwgbWV0YWRhdGFEZWxldGVkS2V5cykuZGVzdHJveSh7XG4gICAgICAgICAgcmVxdWlyZTogdHJ1ZSxcbiAgICAgICAgfSkgOiBudWxsLFxuICAgIF0pO1xuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUHVyZ2UgYWxsIHRoZSBjYWNoZWQgbWV0YWRhdGEgaW4gdGhlIG1lbW9yeS5cbiAgICovXG4gIHB1cmdlTWV0YWRhdGEoKSB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IFtdO1xuICAgIHRoaXMuc2hvdWxkUmVsb2FkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBtZXRhZGF0YSB2YWx1ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlVHlwZSAtXG4gICAqL1xuICBwYXJzZU1ldGFWYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlO1xuXG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmxvYXQnOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IEpTT04ucGFyc2UocGFyc2VkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgbWV0YWRhdGEgYmVmb3JlIHNhdmluZyB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxCb29sZWFufSB2YWx1ZSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVR5cGUgLVxuICAgKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfEJvb2xlYW59IC1cbiAgICovXG4gIGZvcm1hdE1ldGFWYWx1ZSh2YWx1ZSwgdmFsdWVUeXBlKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlO1xuXG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHBhcnNlZFZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZSA/ICcxJyA6ICcwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJzZWRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgfSxcblxuICBtYXBNZXRhZGF0YShhdHRyLCBwYXJzZVR5cGUgPSAncGFyc2UnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogYXR0clt0aGlzLktFWV9DT0xVTU5dLFxuICAgICAgdmFsdWU6IChwYXJzZVR5cGUgPT09ICdwYXJzZScpXG4gICAgICAgID8gdGhpcy5wYXJzZU1ldGFWYWx1ZShcbiAgICAgICAgICBhdHRyW3RoaXMuVkFMVUVfQ09MVU1OXSxcbiAgICAgICAgICB0aGlzLlRZUEVfQ09MVU1OID8gYXR0clt0aGlzLlRZUEVfQ09MVU1OXSA6IGZhbHNlLFxuICAgICAgICApXG4gICAgICAgIDogdGhpcy5mb3JtYXRNZXRhVmFsdWUoXG4gICAgICAgICAgYXR0clt0aGlzLlZBTFVFX0NPTFVNTl0sXG4gICAgICAgICAgdGhpcy5UWVBFX0NPTFVNTiA/IGF0dHJbdGhpcy5UWVBFX0NPTFVNTl0gOiBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgIC4uLnRoaXMuZXh0cmFDb2x1bW5zLm1hcCgoZXh0cmFDb2wpID0+ICh7XG4gICAgICAgIFtleHRyYUNvbF06IGF0dHJbZXh0cmFDb2xdIHx8IG51bGwsXG4gICAgICB9KSksXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2UgdGhlIG1ldGFkYXRhIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbGxlY3Rpb24gLVxuICAgKi9cbiAgbWFwTWV0YWRhdGFDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIHBhcnNlVHlwZSA9ICdwYXJzZScpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5tYXAoKG1vZGVsKSA9PiB0aGlzLm1hcE1ldGFkYXRhKG1vZGVsLmF0dHJpYnV0ZXMsIHBhcnNlVHlwZSkpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgeyBzbmFrZUNhc2UsIGVhY2ggfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgbWFwS2V5c0RlZXAgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCBQYWdpbmF0aW9uUXVlcnlCdWlsZGVyIGZyb20gJ0AvbW9kZWxzL1BhZ2luYXRpb24nO1xuaW1wb3J0IERhdGVTZXNzaW9uIGZyb20gJ0AvbW9kZWxzL0RhdGVTZXNzaW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kZWxCYXNlIGV4dGVuZHMgbWl4aW4oTW9kZWwsIFtEYXRlU2Vzc2lvbl0pIHtcblxuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgc3RhdGljIGdldCBrbmV4QmluZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmtuZXhCaW5kSW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgc2V0IGtuZXhCaW5kZWQoa25leCkge1xuICAgIHRoaXMua25leEJpbmRJbnN0YW5jZSA9IGtuZXg7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIEFycmF5O1xuICB9XG5cbiAgc3RhdGljIHF1ZXJ5KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc3VwZXIucXVlcnkoLi4uYXJncykucnVuQWZ0ZXIoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmZyb20ocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAkZm9ybWF0SnNvbihqc29uLCBvcHQpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IG1hcEtleXNEZWVwKGpzb24sICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICByZXR1cm4gc25ha2VDYXNlKGtleSk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkSnNvbiA9IHN1cGVyLiRmb3JtYXRKc29uKHRyYW5zZm9ybWVkLCBvcHQpO1xuICAgIHJldHVybiBwYXJzZWRKc29uO1xuICB9XG5cbiAgc3RhdGljIGdldCBRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIFBhZ2luYXRpb25RdWVyeUJ1aWxkZXI7XG4gIH1cblxuICBzdGF0aWMgcmVsYXRpb25CaW5kS25leChtb2RlbCkge1xuICAgIHJldHVybiB0aGlzLmtuZXhCaW5kZWQgPyBtb2RlbC5iaW5kS25leCh0aGlzLmtuZXhCaW5kZWQpIDogbW9kZWw7XG4gIH1cbn1cbiIsImltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgTWV0YWJsZUNvbGxlY3Rpb24gZnJvbSAnQC9saWIvTWV0YWJsZS9NZXRhYmxlQ29sbGVjdGlvbic7XG5pbXBvcnQgZGVmaW5lZE9wdGlvbnMgZnJvbSAnQC9kYXRhL29wdGlvbnMnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9wdGlvbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ29wdGlvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtb2RlbCBxdWVyeS5cbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC1cbiAgICovXG4gIHN0YXRpYyBxdWVyeSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnF1ZXJ5KC4uLmFyZ3MpLnJ1bkFmdGVyKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBNZXRhYmxlQ29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQuc2V0TW9kZWwodGhpcy50ZW5hbnQoKSk7XG4gICAgICAgIHJlc3VsdC5zZXRFeHRyYUNvbHVtbnMoWydncm91cCddKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgY29sbGVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gTWV0YWJsZUNvbGxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBvcHRpb25zIGlzIGRlZmluZWQgb3IgZWl0aGVyIG5vdC5cbiAgICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucyBcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZURlZmluZWQob3B0aW9ucykge1xuICAgIGNvbnN0IG5vdERlZmluZWQgPSBbXTtcblxuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoIWRlZmluZWRPcHRpb25zW29wdGlvbi5ncm91cF0pIHtcbiAgICAgICAgbm90RGVmaW5lZC5wdXNoKG9wdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKCFkZWZpbmVkT3B0aW9uc1tvcHRpb24uZ3JvdXBdLnNvbWUoKG8pID0+IG8ua2V5ID09PSBvcHRpb24ua2V5KSkge1xuICAgICAgICBub3REZWZpbmVkLnB1c2gob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbm90RGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uUXVlcnlCdWlsZGVyIGV4dGVuZHMgTW9kZWwuUXVlcnlCdWlsZGVyIHtcbiAgcGFnaW5hdGlvbihwYWdlLCBwYWdlU2l6ZSkge1xuICAgIHJldHVybiBzdXBlci5wYWdlKHBhZ2UsIHBhZ2VTaXplKS5ydW5BZnRlcihcbiAgICAgICh7IHJlc3VsdHMsIHRvdGFsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHRzLFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgcGFnZTogcGFnZSArIDEsXG4gICAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgfVxufSIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbiBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUgb2YgUm9sZSBtb2RlbC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncGVybWlzc2lvbnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJvbGUgPSByZXF1aXJlKCdAL21vZGVscy9Sb2xlJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBQZXJtaXNzaW9uIG1vZGVsIG1heSBiZWxvbmdzIHRvIHJvbGUgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIC8vIHJvbGU6IHtcbiAgICAgIC8vICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgLy8gICBtb2RlbEJhc2U6IHBhdGguam9pbihfX2Rpcm5hbWUsICdSb2xlJykuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgIC8vICAgam9pbjoge1xuICAgICAgLy8gICAgIGZyb206ICdwZXJtaXNzaW9ucy5yb2xlX2lkJyxcbiAgICAgIC8vICAgICB0bzogJ3JvbGVzLmlkJyxcbiAgICAgIC8vICAgfSxcbiAgICAgIC8vIH0sXG5cbiAgICAgIC8vIHJlc291cmNlOiB7XG4gICAgICAvLyAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgIC8vICAgbW9kZWxCYXNlOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnUmVzb3VyY2UnKSxcbiAgICAgIC8vICAgam9pbjoge1xuICAgICAgLy8gICAgIGZyb206ICdwZXJtaXNzaW9ucy4nLFxuICAgICAgLy8gICAgIHRvOiAnJyxcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IENhY2hhYmxlUXVlcnlCdWlsZGVyIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlUXVlcnlCdWlsZGVyJztcbmltcG9ydCBDYWNoYWJsZU1vZGVsIGZyb20gJ0AvbGliL0NhY2hhYmxlL0NhY2hhYmxlTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZSBleHRlbmRzIG1peGluKFRlbmFudE1vZGVsLCBbQ2FjaGFibGVNb2RlbF0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Jlc291cmNlcyc7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHF1ZXJ5IGJ1aWxkZXIgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0IFF1ZXJ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4gQ2FjaGFibGVRdWVyeUJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFZpZXcgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Jyk7XG4gICAgY29uc3QgUmVzb3VyY2VGaWVsZCA9IHJlcXVpcmUoJ0AvbW9kZWxzL1Jlc291cmNlRmllbGQnKTtcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvUGVybWlzc2lvbicpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUmVzb3VyY2UgbW9kZWwgbWF5IGhhcyBtYW55IHZpZXdzLlxuICAgICAgICovXG4gICAgICB2aWV3czoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVmlldy5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICAgIHRvOiAndmlld3MucmVzb3VyY2VJZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc291cmNlIG1vZGVsIG1heSBoYXMgbWFueSBmaWVsZHMuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2VGaWVsZC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICAgIHRvOiAncmVzb3VyY2VfZmllbGRzLnJlc291cmNlSWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvdXJjZSBtb2RlbCBtYXkgaGFzIG1hbnkgYXNzb2NpYXRlZCBwZXJtaXNzaW9ucy5cbiAgICAgICAqL1xuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFBlcm1pc3Npb24uZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncmVzb3VyY2VzLmlkJyxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiAncm9sZV9oYXNfcGVybWlzc2lvbnMucmVzb3VyY2VJZCcsXG4gICAgICAgICAgICB0bzogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnBlcm1pc3Npb25JZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ3Blcm1pc3Npb25zLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VGaWVsZCBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3Jlc291cmNlX2ZpZWxkcyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGpzb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ29wdGlvbnMnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBtb2RpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IG1vZGlmaWVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2hlcmVOb3RQcmVkZWZpbmVkKHF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlTm90KCdwcmVkZWZpbmVkJywgdHJ1ZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsna2V5J107XG4gIH1cblxuICAvKipcbiAgICogUmVzb3VyY2UgZmllbGQga2V5LlxuICAgKi9cbiAga2V5KCkge1xuICAgIHJldHVybiBzbmFrZUNhc2UodGhpcy5sYWJlbE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlc291cmNlIGZpZWxkIG1heSBiZWxvbmdzIHRvIHJlc291cmNlIG1vZGVsLlxuICAgICAgICovXG4gICAgICByZXNvdXJjZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyZXNvdXJjZV9maWVsZHMucmVzb3VyY2VJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IFJlc291cmNlRmllbGRNZXRhZGF0YUNvbGxlY3Rpb24gZnJvbSAnQC9jb2xsZWN0aW9uL1Jlc291cmNlRmllbGRNZXRhZGF0YUNvbGxlY3Rpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZUZpZWxkTWV0YWRhdGEgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdyZXNvdXJjZV9jdXN0b21fZmllbGRzX21ldGFkYXRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgcmVzb3VyY2UgZmllbGQgbWV0YWRhdGEgY29sbGVjdGlvbi5cbiAgICovXG4gIHN0YXRpYyBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gUmVzb3VyY2VGaWVsZE1ldGFkYXRhQ29sbGVjdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUgb2YgUm9sZSBtb2RlbC5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncm9sZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCBoYXNUaW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBQZXJtaXNzaW9uID0gcmVxdWlyZSgnQC9tb2RlbHMvUGVybWlzc2lvbicpO1xuICAgIGNvbnN0IFJlc291cmNlID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2UnKTtcbiAgICBjb25zdCBVc2VyID0gcmVxdWlyZSgnQC9tb2RlbHMvVGVuYW50VXNlcicpO1xuICAgIGNvbnN0IFJlc291cmNlRmllbGQgPSByZXF1aXJlKCdAL21vZGVscy9SZXNvdXJjZUZpZWxkJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgbWFueSBwZXJtaXNzaW9ucy5cbiAgICAgICAqL1xuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogUGVybWlzc2lvbi5kZWZhdWx0LmJpbmRLbmV4KHRoaXMua25leEJpbmRlZCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncm9sZXMuaWQnLFxuICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgIGZyb206ICdyb2xlX2hhc19wZXJtaXNzaW9ucy5yb2xlSWQnLFxuICAgICAgICAgICAgdG86ICdyb2xlX2hhc19wZXJtaXNzaW9ucy5wZXJtaXNzaW9uSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdwZXJtaXNzaW9ucy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJvbGUgbWF5IGhhcyBtYW55IHJlc291cmNlcy5cbiAgICAgICAqL1xuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5NYW55VG9NYW55UmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IFJlc291cmNlLmRlZmF1bHQuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyb2xlcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnJvbGVJZCcsXG4gICAgICAgICAgICB0bzogJ3JvbGVfaGFzX3Blcm1pc3Npb25zLnJlc291cmNlSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdyZXNvdXJjZXMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgcmVzb3VyY2UgZmllbGQuXG4gICAgICAgKi9cbiAgICAgIGZpZWxkOiB7XG4gICAgICAgIHJlbGF0aW9uOiBNb2RlbC5CZWxvbmdzVG9PbmVSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogUmVzb3VyY2VGaWVsZC5kZWZhdWx0LmJpbmRLbmV4KHRoaXMua25leEJpbmRlZCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAncm9sZXMuZmllbGRJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZV9maWVsZHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSb2xlIG1heSBoYXMgbWFueSBhc3NvY2lhdGVkIHVzZXJzLlxuICAgICAgICovXG4gICAgICB1c2Vyczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuTWFueVRvTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiBVc2VyLmRlZmF1bHQuYmluZEtuZXgodGhpcy5rbmV4QmluZGVkKSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICdyb2xlcy5pZCcsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogJ3VzZXJfaGFzX3JvbGVzLnJvbGVJZCcsXG4gICAgICAgICAgICB0bzogJ3VzZXJfaGFzX3JvbGVzLnVzZXJJZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogJ3VzZXJzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcbmltcG9ydCBBdXRoIGZyb20gJy4vQXV0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNldHRpbmcgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3NldHRpbmdzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgY29sdW1ucy5cbiAgICovXG4gIHN0YXRpYyBnZXQgaGFzVGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmEgbWV0YWRhdGEgcXVlcnkgdG8gcXVlcnkgd2l0aCB0aGUgY3VycmVudCBhdXRoZW50aWNhdGUgdXNlci5cbiAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5XG4gICAqL1xuICBzdGF0aWMgZXh0cmFNZXRhZGF0YVF1ZXJ5KHF1ZXJ5KSB7XG4gICAgaWYgKEF1dGguaXNMb2dnZWQoKSkge1xuICAgICAgcXVlcnkud2hlcmUoJ3VzZXJfaWQnLCBBdXRoLnVzZXJJZCgpKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnQC9tb2RlbHMvTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnRNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyB0ZW5hbnQoKSB7XG4gICAgaWYgKCF0aGlzLmtuZXhCaW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGVuYW50IGtuZXggaXMgbm90IGJpbmRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5iaW5kS25leCh0aGlzLmtuZXhCaW5kZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIGVtYmVkIG1vZGVscyB0byBleHByZXNzIHJlcXVlc3QuXG4gICAqL1xuICBzdGF0aWMgcmVxdWVzdE1vZGVsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgYmNyeXB0IGZyb20gJ2JjcnlwdGpzJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG4vLyBpbXBvcnQgUGVybWlzc2lvbnNTZXJ2aWNlIGZyb20gJ0Avc2VydmljZXMvUGVybWlzc2lvbnNTZXJ2aWNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuYW50VXNlciBleHRlbmRzIFRlbmFudE1vZGVsIHtcbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnZnVsbE5hbWUnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXBzIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFJvbGUgPSByZXF1aXJlKCdAL21vZGVscy9Sb2xlJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm9sZXM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLk1hbnlUb01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFJvbGUuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndXNlcnMuaWQnLFxuICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgIGZyb206ICd1c2VyX2hhc19yb2xlcy51c2VySWQnLFxuICAgICAgICAgICAgdG86ICd1c2VyX2hhc19yb2xlcy5yb2xlSWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86ICdyb2xlcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBwYXNzd29yZCBvZiB0aGUgdXNlci5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBwYXNzd29yZCAtIFRoZSBnaXZlbiBwYXNzd29yZC5cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIHZlcmlmeVBhc3N3b3JkKHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIGJjcnlwdC5jb21wYXJlU3luYyhwYXNzd29yZCwgdGhpcy5wYXNzd29yZCk7XG4gIH1cblxuICBmdWxsTmFtZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5maXJzdE5hbWV9ICR7dGhpcy5sYXN0TmFtZSB8fCAnJ31gO1xuICB9XG59IiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVuZG9yIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd2ZW5kb3JzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCB0aW1lc3RhbXBzLlxuICAgKi9cbiAgc3RhdGljIGdldCB0aW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwsIG1peGluIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnRNb2RlbCBmcm9tICdAL21vZGVscy9UZW5hbnRNb2RlbCc7XG5pbXBvcnQgQ2FjaGFibGVRdWVyeUJ1aWxkZXIgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVRdWVyeUJ1aWxkZXInO1xuaW1wb3J0IENhY2hhYmxlTW9kZWwgZnJvbSAnQC9saWIvQ2FjaGFibGUvQ2FjaGFibGVNb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcgZXh0ZW5kcyBtaXhpbihUZW5hbnRNb2RlbCwgW0NhY2hhYmxlTW9kZWxdKSB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd2aWV3cyc7XG4gIH1cblxuICAvKipcbiAgICogTW9kZWwgdGltZXN0YW1wcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGltZXN0YW1wcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHF1ZXJ5IGJ1aWxkZXIgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0IFF1ZXJ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4gQ2FjaGFibGVRdWVyeUJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2UgPSByZXF1aXJlKCdAL21vZGVscy9SZXNvdXJjZScpO1xuICAgIGNvbnN0IFZpZXdDb2x1bW4gPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Q29sdW1uJyk7XG4gICAgY29uc3QgVmlld1JvbGUgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Um9sZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogVmlldyBtb2RlbCBiZWxvbmdzIHRvIHJlc291cmNlIG1vZGVsLlxuICAgICAgICovXG4gICAgICByZXNvdXJjZToge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZS5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd2aWV3cy5yZXNvdXJjZUlkJyxcbiAgICAgICAgICB0bzogJ3Jlc291cmNlcy5pZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZpZXcgbW9kZWwgbWF5IGhhcyBtYW55IGNvbHVtbnMuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkhhc01hbnlSZWxhdGlvbixcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5yZWxhdGlvbkJpbmRLbmV4KFZpZXdDb2x1bW4uZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndmlld3MuaWQnLFxuICAgICAgICAgIHRvOiAndmlld19oYXNfY29sdW1ucy52aWV3SWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBWaWV3IG1vZGVsIG1heSBoYXMgbWFueSB2aWV3IHJvbGVzLlxuICAgICAgICovXG4gICAgICByb2xlczoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuSGFzTWFueVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoVmlld1JvbGUuZGVmYXVsdCksXG4gICAgICAgIGpvaW46IHtcbiAgICAgICAgICBmcm9tOiAndmlld3MuaWQnLFxuICAgICAgICAgIHRvOiAndmlld19yb2xlcy52aWV3SWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3Q29sdW1uIGV4dGVuZHMgVGVuYW50TW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAndmlld19oYXNfY29sdW1ucyc7XG4gIH1cblxuICAvKipcbiAgICogVGltZXN0YW1wIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGhhc1RpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cblxuICAvKipcbiAgICogUmVsYXRpb25zaGlwIG1hcHBpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHJlbGF0aW9uTWFwcGluZ3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2VGaWVsZCA9IHJlcXVpcmUoJ0AvbW9kZWxzL1Jlc291cmNlRmllbGQnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFZpZXcgcm9sZSBtb2RlbCBtYXkgYmVsb25ncyB0byByZXNvdXJjZSBmaWVsZCBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZmllbGQ6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLnJlbGF0aW9uQmluZEtuZXgoUmVzb3VyY2VGaWVsZC5kZWZhdWx0KSxcbiAgICAgICAgam9pbjoge1xuICAgICAgICAgIGZyb206ICd2aWV3X2hhc19jb2x1bW5zLmZpZWxkSWQnLFxuICAgICAgICAgIHRvOiAncmVzb3VyY2VfZmllbGRzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdvYmplY3Rpb24nO1xuaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld1JvbGUgZXh0ZW5kcyBUZW5hbnRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgYXR0cmlidXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQgdmlydHVhbEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnY29tcGFyYXRvcnMnXTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY29tcGFyYXRvcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdlcXVhbHMnLCAnbm90X2VxdWFsJywgJ2NvbnRhaW5zJywgJ25vdF9jb250YWluJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3ZpZXdfcm9sZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBjb2x1bW5zLlxuICAgKi9cbiAgc3RhdGljIGdldCBoYXNUaW1lc3RhbXBzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbnNoaXAgbWFwcGluZy5cbiAgICovXG4gIHN0YXRpYyBnZXQgcmVsYXRpb25NYXBwaW5ncygpIHtcbiAgICBjb25zdCBSZXNvdXJjZUZpZWxkID0gcmVxdWlyZSgnQC9tb2RlbHMvUmVzb3VyY2VGaWVsZCcpO1xuICAgIGNvbnN0IFZpZXcgPSByZXF1aXJlKCdAL21vZGVscy9WaWV3Jyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBWaWV3IHJvbGUgbW9kZWwgbWF5IGJlbG9uZ3MgdG8gdmlldyBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgdmlldzoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChWaWV3LmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3ZpZXdfcm9sZXMudmlld0lkJyxcbiAgICAgICAgICB0bzogJ3ZpZXdzLmlkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmlldyByb2xlIG1vZGVsIG1heSBiZWxvbmdzIHRvIHJlc291cmNlIGZpZWxkIG1vZGVsLlxuICAgICAgICovXG4gICAgICBmaWVsZDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMucmVsYXRpb25CaW5kS25leChSZXNvdXJjZUZpZWxkLmRlZmF1bHQpLFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3ZpZXdfcm9sZXMuZmllbGRJZCcsXG4gICAgICAgICAgdG86ICdyZXNvdXJjZV9maWVsZHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgZXJyb3JIYW5kbGVyIGZyb20gJ2Vycm9yaGFuZGxlcic7XG5pbXBvcnQgYXBwIGZyb20gJ0AvYXBwJztcblxuYXBwLnVzZShlcnJvckhhbmRsZXIpO1xuXG5jb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKGFwcC5nZXQoJ3BvcnQnKSwgKCkgPT4ge1xuICBjb25zb2xlLmxvZyhcbiAgICAnICBBcHAgaXMgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiVkIGluICVzIG1vZGUnLFxuICAgIGFwcC5nZXQoJ3BvcnQnKSxcbiAgICBhcHAuZ2V0KCdlbnYnKSxcbiAgKTtcbiAgY29uc29sZS5sb2coJyAgUHJlc3MgQ1RSTC1DIHRvIHN0b3AnKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzZXJ2ZXI7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpvdXJuYWxFbnRyeSB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5KSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjcmVkaXQ6IDAsXG4gICAgICBkZWJpdDogMCxcbiAgICB9O1xuICAgIHRoaXMuZW50cnkgPSB7IC4uLmRlZmF1bHRzLCAuLi5lbnRyeSB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBwaWNrIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBKb3VybmFsRW50cnkgZnJvbSAnQC9zZXJ2aWNlcy9BY2NvdW50aW5nL0pvdXJuYWxFbnRyeSc7XG5pbXBvcnQgQWNjb3VudFRyYW5zYWN0aW9uIGZyb20gJ0AvbW9kZWxzL0FjY291bnRUcmFuc2FjdGlvbic7XG5pbXBvcnQgQWNjb3VudEJhbGFuY2UgZnJvbSAnQC9tb2RlbHMvQWNjb3VudEJhbGFuY2UnO1xuaW1wb3J0IHsgcHJvbWlzZVNlcmlhbCB9IGZyb20gJ0AvdXRpbHMnO1xuaW1wb3J0IEFjY291bnQgZnJvbSAnQC9tb2RlbHMvQWNjb3VudCc7XG5pbXBvcnQgTmVzdGVkU2V0IGZyb20gJy4uLy4uL2NvbGxlY3Rpb24vTmVzdGVkU2V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSm91cm5hbFBvc3RlciB7XG4gIC8qKlxuICAgKiBKb3VybmFsIHBvc3RlciBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFjY291bnRzR3JhcGgpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICB0aGlzLmJhbGFuY2VzQ2hhbmdlID0ge307XG4gICAgdGhpcy5kZWxldGVkRW50cmllc0lkcyA9IFtdO1xuXG4gICAgdGhpcy5hY2NvdW50c0JhbGFuY2VUYWJsZSA9IHt9O1xuICAgIHRoaXMuYWNjb3VudHNHcmFwaCA9IGFjY291bnRzR3JhcGg7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBjcmVkaXQgZW50cnkgZm9yIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKiBAcGFyYW0ge0pvdXJuYWxFbnRyeX0gZW50cnkgLVxuICAgKi9cbiAgY3JlZGl0KGVudHJ5TW9kZWwpIHtcbiAgICBpZiAoZW50cnlNb2RlbCBpbnN0YW5jZW9mIEpvdXJuYWxFbnRyeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVudHJ5IGlzIG5vdCBpbnN0YW5jZSBvZiBKb3VybmFsRW50cnkuJyk7XG4gICAgfVxuICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5TW9kZWwuZW50cnkpO1xuICAgIHRoaXMuc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2UoZW50cnlNb2RlbC5lbnRyeSwgJ2NyZWRpdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgZGViaXQgZW50cnkgZm9yIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKiBAcGFyYW0ge0pvdXJuYWxFbnRyeX0gZW50cnkgLVxuICAgKi9cbiAgZGViaXQoZW50cnlNb2RlbCkge1xuICAgIGlmIChlbnRyeU1vZGVsIGluc3RhbmNlb2YgSm91cm5hbEVudHJ5ID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZW50cnkgaXMgbm90IGluc3RhbmNlIG9mIEpvdXJuYWxFbnRyeS4nKTtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnlNb2RlbC5lbnRyeSk7XG4gICAgdGhpcy5zZXRBY2NvdW50QmFsYW5jZUNoYW5nZShlbnRyeU1vZGVsLmVudHJ5LCAnZGViaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFjY291bnQgYmFsYW5jZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7Sm91cm5hbEVudHJ5fSBlbnRyeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKi9cbiAgc2V0QWNjb3VudEJhbGFuY2VDaGFuZ2UoZW50cnksIGVudHJ5VHlwZSkge1xuICAgIGNvbnN0IGRlcEFjY291bnRzSWRzID0gdGhpcy5hY2NvdW50c0dyYXBoLmRlcGVuZGFudHNPZihlbnRyeS5hY2NvdW50KTtcblxuICAgIGNvbnN0IGJhbGFuY2VDaGFuZ2VFbnRyeSA9IHtcbiAgICAgIGRlYml0OiBlbnRyeS5kZWJpdCxcbiAgICAgIGNyZWRpdDogZW50cnkuY3JlZGl0LFxuICAgICAgZW50cnlUeXBlLFxuICAgICAgYWNjb3VudE5vcm1hbDogZW50cnkuYWNjb3VudE5vcm1hbCxcbiAgICB9O1xuICAgIHRoaXMuX3NldEFjY291bnRCYWxhbmNlQ2hhbmdlKHtcbiAgICAgIC4uLmJhbGFuY2VDaGFuZ2VFbnRyeSxcbiAgICAgIGFjY291bnRJZDogZW50cnkuYWNjb3VudCxcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCBwYXJlbnQgYWNjb3VudHMgb2YgdGhlIGdpdmVuIGFjY291bnQgaWQuXG4gICAgZGVwQWNjb3VudHNJZHMuZm9yRWFjaCgoYWNjb3VudElkKSA9PiB7XG4gICAgICB0aGlzLl9zZXRBY2NvdW50QmFsYW5jZUNoYW5nZSh7XG4gICAgICAgIC4uLmJhbGFuY2VDaGFuZ2VFbnRyeSxcbiAgICAgICAgYWNjb3VudElkLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhY2NvdW50IGJhbGFuY2UgY2hhbmdlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NldEFjY291bnRCYWxhbmNlQ2hhbmdlKHtcbiAgICBhY2NvdW50SWQsXG4gICAgYWNjb3VudE5vcm1hbCxcbiAgICBkZWJpdCxcbiAgICBjcmVkaXQsXG4gICAgZW50cnlUeXBlLFxuICB9KSB7XG4gICAgaWYgKCF0aGlzLmJhbGFuY2VzQ2hhbmdlW2FjY291bnRJZF0pIHtcbiAgICAgIHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXSA9IDA7XG4gICAgfVxuICAgIGxldCBjaGFuZ2UgPSAwO1xuXG4gICAgaWYgKGFjY291bnROb3JtYWwgPT09ICdjcmVkaXQnKSB7XG4gICAgICBjaGFuZ2UgPSBlbnRyeVR5cGUgPT09ICdjcmVkaXQnID8gY3JlZGl0IDogLTEgKiBkZWJpdDtcbiAgICB9IGVsc2UgaWYgKGFjY291bnROb3JtYWwgPT09ICdkZWJpdCcpIHtcbiAgICAgIGNoYW5nZSA9IGVudHJ5VHlwZSA9PT0gJ2RlYml0JyA/IGRlYml0IDogLTEgKiBjcmVkaXQ7XG4gICAgfVxuICAgIHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXSArPSBjaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyB0aGUgYmFsYW5jZSBjaGFuZ2UgdG8gbGlzdC5cbiAgICovXG4gIG1hcEJhbGFuY2VDaGFuZ2VzVG9MaXN0KCkge1xuICAgIGNvbnN0IG1hcHBlZExpc3QgPSBbXTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYmFsYW5jZXNDaGFuZ2UpLmZvckVhY2goKGFjY291bnRJZCkgPT4ge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZXNDaGFuZ2VbYWNjb3VudElkXTtcblxuICAgICAgbWFwcGVkTGlzdC5wdXNoKHtcbiAgICAgICAgYWNjb3VudF9pZDogYWNjb3VudElkLFxuICAgICAgICBhbW91bnQ6IGJhbGFuY2UsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwcGVkTGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgYmFsYW5jZSBjaGFuZ2Ugb2Ygam91cm5hbCBlbnRyaWVzLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUJhbGFuY2UoKSB7XG4gICAgY29uc3QgYmFsYW5jZXNMaXN0ID0gdGhpcy5tYXBCYWxhbmNlQ2hhbmdlc1RvTGlzdCgpO1xuICAgIGNvbnN0IGJhbGFuY2VVcGRhdGVPcGVycyA9IFtdO1xuICAgIGNvbnN0IGJhbGFuY2VJbnNlcnRPcGVycyA9IFtdO1xuICAgIGNvbnN0IGJhbGFuY2VGaW5kT25lT3BlcnMgPSBbXTtcbiAgICBsZXQgYmFsYW5jZUFjY291bnRzID0gW107XG5cbiAgICBiYWxhbmNlc0xpc3QuZm9yRWFjaCgoYmFsYW5jZSkgPT4ge1xuICAgICAgY29uc3Qgb3BlciA9IEFjY291bnRCYWxhbmNlLnRlbmFudCgpXG4gICAgICAgIC5xdWVyeSgpXG4gICAgICAgIC5maW5kT25lKCdhY2NvdW50X2lkJywgYmFsYW5jZS5hY2NvdW50X2lkKTtcbiAgICAgIGJhbGFuY2VGaW5kT25lT3BlcnMucHVzaChvcGVyKTtcbiAgICB9KTtcbiAgICBiYWxhbmNlQWNjb3VudHMgPSBhd2FpdCBQcm9taXNlLmFsbChiYWxhbmNlRmluZE9uZU9wZXJzKTtcblxuICAgIGJhbGFuY2VzTGlzdC5mb3JFYWNoKChiYWxhbmNlKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2QgPSBiYWxhbmNlLmFtb3VudCA8IDAgPyAnZGVjcmVtZW50JyA6ICdpbmNyZW1lbnQnO1xuXG4gICAgICAvLyBEZXRhcm1pbmUgaWYgdGhlIGFjY291bnQgYmFsYW5jZSBpcyBhbHJlYWR5IGV4aXN0cyBvciBub3QuXG4gICAgICBjb25zdCBmb3VuZEFjY0JhbGFuY2UgPSBiYWxhbmNlQWNjb3VudHMuc29tZShcbiAgICAgICAgKGFjY291bnQpID0+IGFjY291bnQgJiYgYWNjb3VudC5hY2NvdW50X2lkID09PSBiYWxhbmNlLmFjY291bnRfaWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3VuZEFjY0JhbGFuY2UpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBBY2NvdW50QmFsYW5jZS50ZW5hbnQoKVxuICAgICAgICAgIC5xdWVyeSgpXG4gICAgICAgICAgW21ldGhvZF0oJ2Ftb3VudCcsIE1hdGguYWJzKGJhbGFuY2UuYW1vdW50KSlcbiAgICAgICAgICAud2hlcmUoJ2FjY291bnRfaWQnLCBiYWxhbmNlLmFjY291bnRfaWQpO1xuXG4gICAgICAgIGJhbGFuY2VVcGRhdGVPcGVycy5wdXNoKHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gQWNjb3VudEJhbGFuY2UudGVuYW50KCkucXVlcnkoKS5pbnNlcnQoe1xuICAgICAgICAgIGFjY291bnRfaWQ6IGJhbGFuY2UuYWNjb3VudF9pZCxcbiAgICAgICAgICBhbW91bnQ6IGJhbGFuY2UuYW1vdW50LFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6ICdVU0QnLFxuICAgICAgICB9KTtcbiAgICAgICAgYmFsYW5jZUluc2VydE9wZXJzLnB1c2gocXVlcnkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFsuLi5iYWxhbmNlVXBkYXRlT3BlcnMsIC4uLmJhbGFuY2VJbnNlcnRPcGVyc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBzdGFja2VkIGpvdXJuYWwgZW50cmllcyB0byB0aGUgc3RvcmFnZS5cbiAgICovXG4gIGFzeW5jIHNhdmVFbnRyaWVzKCkge1xuICAgIGNvbnN0IHNhdmVPcGVyYXRpb25zID0gW107XG5cbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IG9wZXIgPSBBY2NvdW50VHJhbnNhY3Rpb24udGVuYW50KClcbiAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgLmluc2VydCh7XG4gICAgICAgICAgYWNjb3VudElkOiBlbnRyeS5hY2NvdW50LFxuICAgICAgICAgIC4uLnBpY2soZW50cnksIFtcbiAgICAgICAgICAgICdjcmVkaXQnLFxuICAgICAgICAgICAgJ2RlYml0JyxcbiAgICAgICAgICAgICd0cmFuc2FjdGlvblR5cGUnLFxuICAgICAgICAgICAgJ2RhdGUnLFxuICAgICAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICAgICAncmVmZXJlbmNlVHlwZScsXG4gICAgICAgICAgICAncmVmZXJlbmNlSWQnLFxuICAgICAgICAgICAgJ25vdGUnLFxuICAgICAgICAgICAgJ2NvbnRhY3RJZCcsXG4gICAgICAgICAgICAnY29udGFjdFR5cGUnLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9KTtcbiAgICAgIHNhdmVPcGVyYXRpb25zLnB1c2goKCkgPT4gb3Blcik7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVNlcmlhbChzYXZlT3BlcmF0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZXMgdGhlIHN0YWNrZWQgam91cm5hbCBlbnRyaWVzLlxuICAgKi9cbiAgcmV2ZXJzZUVudHJpZXMoKSB7XG4gICAgY29uc3QgcmV2ZXJzZUVudHJpZXMgPSBbXTtcblxuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgcmV2ZXJzZUVudHJ5ID0geyAuLi5lbnRyeSB9O1xuXG4gICAgICBpZiAoZW50cnkuY3JlZGl0KSB7XG4gICAgICAgIHJldmVyc2VFbnRyeS5kZWJpdCA9IGVudHJ5LmNyZWRpdDtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS5kZWJpdCkge1xuICAgICAgICByZXZlcnNlRW50cnkuY3JlZGl0ID0gZW50cnkuZGViaXQ7XG4gICAgICB9XG4gICAgICByZXZlcnNlRW50cmllcy5wdXNoKHJldmVyc2VFbnRyeSk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzID0gcmV2ZXJzZUVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gaWRzIC1cbiAgICovXG4gIHJlbW92ZUVudHJpZXMoaWRzID0gW10pIHtcbiAgICBjb25zdCB0YXJnZXRJZHMgPSBpZHMubGVuZ3RoIDw9IDAgPyB0aGlzLmVudHJpZXMubWFwKChlKSA9PiBlLmlkKSA6IGlkcztcbiAgICBjb25zdCByZW1vdmVFbnRyaWVzID0gdGhpcy5lbnRyaWVzLmZpbHRlcihcbiAgICAgIChlKSA9PiB0YXJnZXRJZHMuaW5kZXhPZihlLmlkKSAhPT0gLTFcbiAgICApO1xuXG4gICAgdGhpcy5lbnRyaWVzID0gdGhpcy5lbnRyaWVzLmZpbHRlcigoZSkgPT4gdGFyZ2V0SWRzLmluZGV4T2YoZS5pZCkgPT09IC0xKTtcblxuICAgIHJlbW92ZUVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGVudHJ5LmNyZWRpdCA9IC0xICogZW50cnkuY3JlZGl0O1xuICAgICAgZW50cnkuZGViaXQgPSAtMSAqIGVudHJ5LmRlYml0O1xuXG4gICAgICB0aGlzLnNldEFjY291bnRCYWxhbmNlQ2hhbmdlKGVudHJ5LCBlbnRyeS5hY2NvdW50Tm9ybWFsKTtcbiAgICB9KTtcbiAgICB0aGlzLmRlbGV0ZWRFbnRyaWVzSWRzLnB1c2goLi4ucmVtb3ZlRW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgdGhlIHN0YWNrZWQgZW50cmllcy5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJpZXMoKSB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZEVudHJpZXNJZHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgQWNjb3VudFRyYW5zYWN0aW9uLnRlbmFudCgpXG4gICAgICAgIC5xdWVyeSgpXG4gICAgICAgIC53aGVyZUluKCdpZCcsIHRoaXMuZGVsZXRlZEVudHJpZXNJZHMpXG4gICAgICAgIC5kZWxldGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGNsb3NpbmcgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgYW5kIGNsb3NpbmcgZGF0ZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjY291bnRJZCAtXG4gICAqIEBwYXJhbSB7RGF0ZX0gY2xvc2luZ0RhdGUgLVxuICAgKi9cbiAgZ2V0Q2xvc2luZ0JhbGFuY2UoYWNjb3VudElkLCBjbG9zaW5nRGF0ZSwgZGF0ZVR5cGUgPSAnZGF5Jykge1xuICAgIGxldCBjbG9zaW5nQmFsYW5jZSA9IDA7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuXG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAvLyBDYW4gbm90IGNvbnRpbnVlIGlmIG5vdCBiZWZvcmUgb3IgZXZlbnQgc2FtZSBjbG9zaW5nIGRhdGUuXG4gICAgICBpZiAoXG4gICAgICAgICghbW9tZW50Q2xvc2luZ0RhdGUuaXNBZnRlcihlbnRyeS5kYXRlLCBkYXRlVHlwZSkgJiZcbiAgICAgICAgICAhbW9tZW50Q2xvc2luZ0RhdGUuaXNTYW1lKGVudHJ5LmRhdGUsIGRhdGVUeXBlKSkgfHxcbiAgICAgICAgKGVudHJ5LmFjY291bnQgIT09IGFjY291bnRJZCAmJiBhY2NvdW50SWQpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdjcmVkaXQnKSB7XG4gICAgICAgIGNsb3NpbmdCYWxhbmNlICs9IGVudHJ5LmNyZWRpdCA/IGVudHJ5LmNyZWRpdCA6IC0xICogZW50cnkuZGViaXQ7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdkZWJpdCcpIHtcbiAgICAgICAgY2xvc2luZ0JhbGFuY2UgKz0gZW50cnkuZGViaXQgPyBlbnRyeS5kZWJpdCA6IC0xICogZW50cnkuY3JlZGl0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9zaW5nQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZ2l2ZW4gYWNjb3VudCBiYWxhbmNlIHdpdGggZGVwZW5kZW5jaWVzIGFjY291bnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudElkXG4gICAqIEBwYXJhbSB7RGF0ZX0gY2xvc2luZ0RhdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGVUeXBlXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIGdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKSB7XG4gICAgY29uc3QgYWNjb3VudE5vZGUgPSB0aGlzLmFjY291bnRzR3JhcGguZ2V0Tm9kZURhdGEoYWNjb3VudElkKTtcbiAgICBjb25zdCBkZXBBY2NvdW50c0lkcyA9IHRoaXMuYWNjb3VudHNHcmFwaC5kZXBlbmRlbmNpZXNPZihhY2NvdW50SWQpO1xuICAgIGNvbnN0IGRlcEFjY291bnRzID0gZGVwQWNjb3VudHNJZHMubWFwKChpZCkgPT5cbiAgICAgIHRoaXMuYWNjb3VudHNHcmFwaC5nZXROb2RlRGF0YShpZClcbiAgICApO1xuICAgIGxldCBiYWxhbmNlID0gMDtcblxuICAgIFsuLi5kZXBBY2NvdW50cywgYWNjb3VudE5vZGVdLmZvckVhY2goKGFjY291bnQpID0+IHtcbiAgICAgIC8vIGlmICghdGhpcy5hY2NvdW50c0JhbGFuY2VUYWJsZVthY2NvdW50LmlkXSkge1xuICAgICAgY29uc3QgY2xvc2luZ0JhbGFuY2UgPSB0aGlzLmdldENsb3NpbmdCYWxhbmNlKFxuICAgICAgICBhY2NvdW50LmlkLFxuICAgICAgICBjbG9zaW5nRGF0ZSxcbiAgICAgICAgZGF0ZVR5cGVcbiAgICAgICk7XG4gICAgICB0aGlzLmFjY291bnRzQmFsYW5jZVRhYmxlW2FjY291bnQuaWRdID0gY2xvc2luZ0JhbGFuY2U7XG4gICAgICAvLyB9XG4gICAgICBiYWxhbmNlICs9IHRoaXMuYWNjb3VudHNCYWxhbmNlVGFibGVbYWNjb3VudC5pZF07XG4gICAgfSk7XG4gICAgcmV0dXJuIGJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGNyZWRpdC9kZWJpdCBzdW1hdGlvbiBmb3IgdGhlIGdpdmVuIGFjY291bnQgYW5kIGRhdGUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhY2NvdW50IC1cbiAgICogQHBhcmFtIHtEYXRlfFN0cmluZ30gY2xvc2luZ0RhdGUgLVxuICAgKi9cbiAgZ2V0VHJpYWxCYWxhbmNlKGFjY291bnRJZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGNyZWRpdDogMCxcbiAgICAgIGRlYml0OiAwLFxuICAgICAgYmFsYW5jZTogMCxcbiAgICB9O1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAoIW1vbWVudENsb3NpbmdEYXRlLmlzQWZ0ZXIoZW50cnkuZGF0ZSwgZGF0ZVR5cGUpICYmXG4gICAgICAgICAgIW1vbWVudENsb3NpbmdEYXRlLmlzU2FtZShlbnRyeS5kYXRlLCBkYXRlVHlwZSkpIHx8XG4gICAgICAgIChlbnRyeS5hY2NvdW50ICE9PSBhY2NvdW50SWQgJiYgYWNjb3VudElkKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5jcmVkaXQgKz0gZW50cnkuY3JlZGl0O1xuICAgICAgcmVzdWx0LmRlYml0ICs9IGVudHJ5LmRlYml0O1xuXG4gICAgICBpZiAoZW50cnkuYWNjb3VudE5vcm1hbCA9PT0gJ2NyZWRpdCcpIHtcbiAgICAgICAgcmVzdWx0LmJhbGFuY2UgKz0gZW50cnkuY3JlZGl0IC0gZW50cnkuZGViaXQ7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmFjY291bnROb3JtYWwgPT09ICdkZWJpdCcpIHtcbiAgICAgICAgcmVzdWx0LmJhbGFuY2UgKz0gZW50cnkuZGViaXQgLSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0cmlhbCBiYWxhbmNlIG9mIHRoZSBnaXZlbiBhY2NvdW50IHdpdGggZGVwZW5kcy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjY291bnRJZFxuICAgKiBAcGFyYW0ge0RhdGV9IGNsb3NpbmdEYXRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRlVHlwZVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuXG4gIGdldFRyaWFsQmFsYW5jZVdpdGhEZXBhbmRzKGFjY291bnRJZCwgY2xvc2luZ0RhdGUsIGRhdGVUeXBlKSB7XG4gICAgY29uc3QgYWNjb3VudE5vZGUgPSB0aGlzLmFjY291bnRzR3JhcGguZ2V0Tm9kZURhdGEoYWNjb3VudElkKTtcbiAgICBjb25zdCBkZXBBY2NvdW50c0lkcyA9IHRoaXMuYWNjb3VudHNHcmFwaC5kZXBlbmRlbmNpZXNPZihhY2NvdW50SWQpO1xuICAgIGNvbnN0IGRlcEFjY291bnRzID0gZGVwQWNjb3VudHNJZHMubWFwKChpZCkgPT5cbiAgICAgIHRoaXMuYWNjb3VudHNHcmFwaC5nZXROb2RlRGF0YShpZClcbiAgICApO1xuXG4gICAgY29uc3QgdHJpYWxCYWxhbmNlID0geyBjcmVkaXQ6IDAsIGRlYml0OiAwLCBiYWxhbmNlOiAwIH07XG5cbiAgICBbLi4uZGVwQWNjb3VudHMsIGFjY291bnROb2RlXS5mb3JFYWNoKChhY2NvdW50KSA9PiB7XG4gICAgICBjb25zdCBfdHJpYWxCYWxhbmNlID0gdGhpcy5nZXRUcmlhbEJhbGFuY2UoXG4gICAgICAgIGFjY291bnQuaWQsXG4gICAgICAgIGNsb3NpbmdEYXRlLFxuICAgICAgICBkYXRlVHlwZVxuICAgICAgKTtcblxuICAgICAgdHJpYWxCYWxhbmNlLmNyZWRpdCArPSBfdHJpYWxCYWxhbmNlLmNyZWRpdDtcbiAgICAgIHRyaWFsQmFsYW5jZS5kZWJpdCArPSBfdHJpYWxCYWxhbmNlLmRlYml0O1xuICAgICAgdHJpYWxCYWxhbmNlLmJhbGFuY2UgKz0gX3RyaWFsQmFsYW5jZS5iYWxhbmNlO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmlhbEJhbGFuY2U7XG4gIH1cblxuICBnZXRDb250YWN0VHJpYWxCYWxhbmNlKFxuICAgIGFjY291bnRJZCxcbiAgICBjb250YWN0SWQsXG4gICAgY29udGFjdFR5cGUsXG4gICAgY2xvc2luZ0RhdGUsXG4gICAgb3BlbmluZ0RhdGVcbiAgKSB7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuICAgIGNvbnN0IG1vbWVudE9wZW5pbmdEYXRlID0gbW9tZW50KG9wZW5pbmdEYXRlKTtcbiAgICBjb25zdCB0cmlhbCA9IHtcbiAgICAgIGNyZWRpdDogMCxcbiAgICAgIGRlYml0OiAwLFxuICAgICAgYmFsYW5jZTogMCxcbiAgICB9O1xuXG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIChjbG9zaW5nRGF0ZSAmJlxuICAgICAgICAgICFtb21lbnRDbG9zaW5nRGF0ZS5pc0FmdGVyKGVudHJ5LmRhdGUsICdkYXknKSAmJlxuICAgICAgICAgICFtb21lbnRDbG9zaW5nRGF0ZS5pc1NhbWUoZW50cnkuZGF0ZSwgJ2RheScpKSB8fFxuICAgICAgICAob3BlbmluZ0RhdGUgJiZcbiAgICAgICAgICAhbW9tZW50T3BlbmluZ0RhdGUuaXNCZWZvcmUoZW50cnkuZGF0ZSwgJ2RheScpICYmXG4gICAgICAgICAgIW1vbWVudE9wZW5pbmdEYXRlLmlzU2FtZShlbnRyeS5kYXRlKSkgfHxcbiAgICAgICAgKGFjY291bnRJZCAmJiBlbnRyeS5hY2NvdW50ICE9PSBhY2NvdW50SWQpIHx8XG4gICAgICAgIChjb250YWN0SWQgJiYgZW50cnkuY29udGFjdElkICE9PSBjb250YWN0SWQpIHx8XG4gICAgICAgIGVudHJ5LmNvbnRhY3RUeXBlICE9PSBjb250YWN0VHlwZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS5jcmVkaXQpIHtcbiAgICAgICAgdHJpYWwuYmFsYW5jZSAtPSBlbnRyeS5jcmVkaXQ7XG4gICAgICAgIHRyaWFsLmNyZWRpdCArPSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgdHJpYWwuYmFsYW5jZSArPSBlbnRyeS5kZWJpdDtcbiAgICAgICAgdHJpYWwuZGViaXQgKz0gZW50cnkuZGViaXQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyaWFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRvdGFsIGJhbG5hY2Ugb2YgdGhlIGdpdmVuIGN1c3RvbWVyL3ZlbmRvciBjb250YWN0LlxuICAgKiBAcGFyYW0ge051bWJlcn0gYWNjb3VudElkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjb250YWN0SWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRhY3RUeXBlXG4gICAqIEBwYXJhbSB7RGF0ZX0gY2xvc2luZ0RhdGVcbiAgICovXG4gIGdldENvbnRhY3RCYWxhbmNlKFxuICAgIGFjY291bnRJZCxcbiAgICBjb250YWN0SWQsXG4gICAgY29udGFjdFR5cGUsXG4gICAgY2xvc2luZ0RhdGUsXG4gICAgb3BlbmluZ0RhdGVcbiAgKSB7XG4gICAgY29uc3QgbW9tZW50Q2xvc2luZ0RhdGUgPSBtb21lbnQoY2xvc2luZ0RhdGUpO1xuICAgIGxldCBiYWxhbmNlID0gMDtcblxuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAoY2xvc2luZ0RhdGUgJiZcbiAgICAgICAgICAhbW9tZW50Q2xvc2luZ0RhdGUuaXNBZnRlcihlbnRyeS5kYXRlLCAnZGF5JykgJiZcbiAgICAgICAgICAhbW9tZW50Q2xvc2luZ0RhdGUuaXNTYW1lKGVudHJ5LmRhdGUsICdkYXknKSkgfHxcbiAgICAgICAgKGVudHJ5LmFjY291bnQgIT09IGFjY291bnRJZCAmJiBhY2NvdW50SWQpIHx8XG4gICAgICAgIChjb250YWN0SWQgJiYgZW50cnkuY29udGFjdElkICE9PSBjb250YWN0SWQpIHx8XG4gICAgICAgIGVudHJ5LmNvbnRhY3RUeXBlICE9PSBjb250YWN0VHlwZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeS5jcmVkaXQpIHtcbiAgICAgICAgYmFsYW5jZSAtPSBlbnRyeS5jcmVkaXQ7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgYmFsYW5jZSArPSBlbnRyeS5kZWJpdDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGZldGNoZWQgYWNjb3VudHMgam91cm5hbCBlbnRyaWVzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBlbnRyaWVzIC1cbiAgICovXG4gIGxvYWRFbnRyaWVzKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICAgIC4uLmVudHJ5LFxuICAgICAgICBhY2NvdW50OiBlbnRyeS5hY2NvdW50ID8gZW50cnkuYWNjb3VudC5pZCA6IGVudHJ5LmFjY291bnRJZCxcbiAgICAgICAgYWNjb3VudE5vcm1hbDpcbiAgICAgICAgICBlbnRyeS5hY2NvdW50ICYmIGVudHJ5LmFjY291bnQudHlwZVxuICAgICAgICAgICAgPyBlbnRyeS5hY2NvdW50LnR5cGUubm9ybWFsXG4gICAgICAgICAgICA6IGVudHJ5LmFjY291bnROb3JtYWwsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGN1bGF0ZUVudHJpZXNCYWxhbmNlQ2hhbmdlKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKGVudHJ5LmNyZWRpdCkge1xuICAgICAgICB0aGlzLnNldEFjY291bnRCYWxhbmNlQ2hhbmdlKGVudHJ5LCAnY3JlZGl0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZGViaXQpIHtcbiAgICAgICAgdGhpcy5zZXRBY2NvdW50QmFsYW5jZUNoYW5nZShlbnRyeSwgJ2RlYml0Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBOb2RlQ2FjaGUgZnJvbSAnbm9kZS1jYWNoZSc7XG5cbmNsYXNzIENhY2hlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhY2hlID0gbmV3IE5vZGVDYWNoZSh7XG4gICAgICAvLyBzdGRUVEw6IDk5OTk5OTksXG4gICAgICAvLyBjaGVja3BlcmlvZDogOTk5OTk5OSAqIDAuMixcbiAgICAgIHVzZUNsb25lczogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBnZXQoa2V5LCBzdG9yZUZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yZUZ1bmN0aW9uKCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0KGtleSwgcmVzdWx0cykge1xuICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgcmVzdWx0cyk7XG4gIH1cblxuICBkZWwoa2V5cykge1xuICAgIHRoaXMuY2FjaGUuZGVsKGtleXMpO1xuICB9XG5cbiAgZGVsU3RhcnRXaXRoKHN0YXJ0U3RyID0gJycpIHtcbiAgICBpZiAoIXN0YXJ0U3RyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IHRoaXMuY2FjaGUua2V5cygpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihzdGFydFN0cikgPT09IDApIHtcbiAgICAgICAgdGhpcy5kZWwoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmbHVzaCgpIHtcbiAgICB0aGlzLmNhY2hlLmZsdXNoQWxsKCk7XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQ2FjaGUoKTsiLCJpbXBvcnQgd2luc3RvbiBmcm9tICd3aW5zdG9uJztcblxuY29uc3QgdHJhbnNwb3J0cyA9IHtcbiAgY29uc29sZTogbmV3IHdpbnN0b24udHJhbnNwb3J0cy5Db25zb2xlKHsgbGV2ZWw6ICd3YXJuJyB9KSxcbiAgZmlsZTogbmV3IHdpbnN0b24udHJhbnNwb3J0cy5GaWxlKHsgZmlsZW5hbWU6ICdzdGRvdXQubG9nJyB9KSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpbnN0b24uY3JlYXRlTG9nZ2VyKHtcbiAgdHJhbnNwb3J0czogW1xuICAgIHRyYW5zcG9ydHMuY29uc29sZSxcbiAgICB0cmFuc3BvcnRzLmZpbGUsXG4gIF0sXG59KTtcbiIsIlxuXG5leHBvcnQgZGVmYXVsdCAoTW9kZWwpID0+IHtcbiAgcmV0dXJuIGNsYXNzIFVzZXJTdWJzY3JpcHRpb24gZXh0ZW5kcyBNb2RlbHtcblxuICAgIG9uVHJpYWwoKSB7XG4gICAgICBcbiAgICB9XG4gIFxuICAgIGdldFN1YnNjcmlwdGlvbigpIHtcbiAgXG4gICAgfVxuICBcbiAgICBuZXdTdWJzY3JpcHRpb24oKSB7XG4gICAgICBcbiAgICB9IFxuICBcbiAgICBpc1N1YmNyaWJlZFRvKHBsYW4pIHtcbiAgXG4gICAgfVxuICB9XG59OyIsImltcG9ydCBub2RlbWFpbGVyIGZyb20gJ25vZGVtYWlsZXInO1xuaW1wb3J0IGNvbmZpZyBmcm9tICdALy4uL2NvbmZpZy9jb25maWcnO1xuXG4vLyBjcmVhdGUgcmV1c2FibGUgdHJhbnNwb3J0ZXIgb2JqZWN0IHVzaW5nIHRoZSBkZWZhdWx0IFNNVFAgdHJhbnNwb3J0XG5jb25zdCB0cmFuc3BvcnRlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgaG9zdDogY29uZmlnLm1haWwuaG9zdCxcbiAgcG9ydDogY29uZmlnLm1haWwucG9ydCxcbiAgc2VjdXJlOiBjb25maWcubWFpbC5zZWN1cmUsIC8vIHRydWUgZm9yIDQ2NSwgZmFsc2UgZm9yIG90aGVyIHBvcnRzXG4gIGF1dGg6IHtcbiAgICB1c2VyOiBjb25maWcubWFpbC51c2VybmFtZSxcbiAgICBwYXNzOiBjb25maWcubWFpbC5wYXNzd29yZCxcbiAgfSxcbn0pO1xuXG5jb25zb2xlLmxvZyh7XG4gIGhvc3Q6IGNvbmZpZy5tYWlsLmhvc3QsXG4gIHBvcnQ6IGNvbmZpZy5tYWlsLnBvcnQsXG4gIHNlY3VyZTogY29uZmlnLm1haWwuc2VjdXJlLCAvLyB0cnVlIGZvciA0NjUsIGZhbHNlIGZvciBvdGhlciBwb3J0c1xuICBhdXRoOiB7XG4gICAgdXNlcjogY29uZmlnLm1haWwudXNlcm5hbWUsXG4gICAgcGFzczogY29uZmlnLm1haWwucGFzc3dvcmQsXG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNwb3J0ZXI7XG4iLCJpbXBvcnQgS25leCBmcm9tICdrbmV4JztcbmltcG9ydCB7IGtuZXhTbmFrZUNhc2VNYXBwZXJzIH0gZnJvbSAnb2JqZWN0aW9uJztcbmltcG9ydCBUZW5hbnQgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1RlbmFudCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ0AvLi4vY29uZmlnL2NvbmZpZyc7XG5pbXBvcnQgVGVuYW50TW9kZWwgZnJvbSAnQC9tb2RlbHMvVGVuYW50TW9kZWwnO1xuaW1wb3J0IHVuaXFpZCBmcm9tICd1bmlxaWQnO1xuaW1wb3J0IGRiTWFuYWdlciBmcm9tICdAL2RhdGFiYXNlL21hbmFnZXInO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBTeXN0ZW1Vc2VyIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Vc2VyJztcbmltcG9ydCBUZW5hbnRVc2VyIGZyb20gJ0AvbW9kZWxzL1RlbmFudFVzZXInO1xuLy8gaW1wb3J0IFRlbmFudE1vZGVsIGZyb20gJ0AvbW9kZWxzL1RlbmFudE1vZGVsJztcblxuLy8gY29uc3QgVGVuYW50V2Vic2l0ZToge1xuLy8gICB0ZW5hbnREYjogS25leCxcbi8vICAgdGVuYW50SWQ6IE51bWJlcixcbi8vICAgdGVuYW50T3JnYW5pemF0aW9uSWQ6IFN0cmluZyxcbi8vIH1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuYW50c01hbmFnZXIge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMua25leENhY2hlID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFRlbmFudChvcmdhbml6YXRpb25JZCkge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IFRlbmFudC5xdWVyeSgpXG4gICAgICAud2hlcmUoJ29yZ2FuaXphdGlvbl9pZCcsIG9yZ2FuaXphdGlvbklkKS5maXJzdCgpO1xuXG4gICAgcmV0dXJuIHRlbmFudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRlbmFudCBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtJbnRlZ2VyfSB1bmlxSWQgXG4gICAqIEByZXR1cm4ge1RlbmFudFdlYnNpdGV9XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlVGVuYW50KHVuaXFJZCkge1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbklkID0gdW5pcUlkIHx8IHVuaXFpZCgpO1xuICAgIGNvbnN0IHRlbmFudE9yZ2FuaXphdGlvbiA9IGF3YWl0IFRlbmFudC5xdWVyeSgpLmluc2VydCh7XG4gICAgICBvcmdhbml6YXRpb25faWQ6IG9yZ2FuaXphdGlvbklkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVuYW50RGJOYW1lID0gYGJpZ2NhcGl0YWxfdGVuYW50XyR7b3JnYW5pemF0aW9uSWR9YDtcbiAgICBhd2FpdCBkYk1hbmFnZXIuY3JlYXRlRGIodGVuYW50RGJOYW1lKTtcblxuICAgIGNvbnN0IHRlbmFudERiID0gVGVuYW50c01hbmFnZXIua25leEluc3RhbmNlKG9yZ2FuaXphdGlvbklkKTtcbiAgICBhd2FpdCB0ZW5hbnREYi5taWdyYXRlLmxhdGVzdCgpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnREYixcbiAgICAgIHRlbmFudElkOiB0ZW5hbnRPcmdhbml6YXRpb24uaWQsXG4gICAgICBvcmdhbml6YXRpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGVuYW50IGRhdGFiYXNlIG9mIHRoZSBnaXZlbiB0ZW5hbnQgd2Vic2l0ZS5cbiAgICogQHBhcmFtIHtUZW5hbnRXZWJzaXRlfSB0ZW5hbnRXZWJzaXRlIFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRyb3BUZW5hbnQodGVuYW50V2Vic2l0ZSkge1xuICAgIGNvbnN0IHRlbmFudERiTmFtZSA9IGBiaWdjYXBpdGFsX3RlbmFudF8ke3RlbmFudFdlYnNpdGUub3JnYW5pemF0aW9uSWR9YDtcbiAgICBhd2FpdCBkYk1hbmFnZXIuZHJvcERiKHRlbmFudERiTmFtZSk7XG5cbiAgICBhd2FpdCBTeXN0ZW1Vc2VyLnF1ZXJ5KClcbiAgICAgIC53aGVyZSgndGVuYW50X2lkJywgdGVuYW50V2Vic2l0ZS50ZW5hbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVzZXIgdGhhdCBhc3NvY2lhdGUgdG8gdGhlIGdpdmVuIHRlbmFudC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVUZW5hbnRVc2VyKHRlbmFudFdlYnNpdGUsIHVzZXIpIHtcbiAgICBjb25zdCB1c2VySW5zZXJ0ID0geyAuLi51c2VyIH07XG5cbiAgICBjb25zdCBzeXN0ZW1Vc2VyID0gYXdhaXQgU3lzdGVtVXNlci5xdWVyeSgpLmluc2VydCh7XG4gICAgICAuLi51c2VyLFxuICAgICAgdGVuYW50X2lkOiB0ZW5hbnRXZWJzaXRlLnRlbmFudElkLFxuICAgIH0pO1xuICAgIFRlbmFudE1vZGVsLmtuZXhCaW5kZWQgPSB0ZW5hbnRXZWJzaXRlLnRlbmFudERiO1xuXG4gICAgY29uc3QgdGVuYW50VXNlciA9IGF3YWl0IFRlbmFudFVzZXIuYmluZEtuZXgodGVuYW50V2Vic2l0ZS50ZW5hbnREYilcbiAgICAgIC5xdWVyeSgpXG4gICAgICAuaW5zZXJ0KHtcbiAgICAgICAgLi4ub21pdCh1c2VySW5zZXJ0LCBbJ3Bhc3N3b3JkJ10pLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRlbmFudFVzZXIsXG4gICAgICAuLi5zeXN0ZW1Vc2VyXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhbGwgdGVuYW50cyBtZXRhZGF0YSBmcm9tIHN5c3RlbSBzdG9yYWdlLlxuICAgKi9cbiAgc3RhdGljIGdldEFsbFRlbmFudHMoKSB7XG4gICAgcmV0dXJuIFRlbmFudC5xdWVyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBnaXZlbiBvcmdhbml6YXRpb24gaWQga25leCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3JnYW5pemF0aW9uSWQgLVxuICAgKi9cbiAgc3RhdGljIGdldFRlbmFudEtuZXhDb25maWcob3JnYW5pemF0aW9uSWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50OiBjb25maWcudGVuYW50LmRiX2NsaWVudCxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgaG9zdDogY29uZmlnLnRlbmFudC5kYl9ob3N0LFxuICAgICAgICB1c2VyOiBjb25maWcudGVuYW50LmRiX3VzZXIsXG4gICAgICAgIHBhc3N3b3JkOiBjb25maWcudGVuYW50LmRiX3Bhc3N3b3JkLFxuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLnRlbmFudC5kYl9uYW1lX3ByZWZpeH0ke29yZ2FuaXphdGlvbklkfWAsXG4gICAgICAgIGNoYXJzZXQ6IGNvbmZpZy50ZW5hbnQuY2hhcnNldCxcbiAgICAgIH0sXG4gICAgICBtaWdyYXRpb25zOiB7XG4gICAgICAgIGRpcmVjdG9yeTogY29uZmlnLnRlbmFudC5taWdyYXRpb25zX2RpcixcbiAgICAgIH0sXG4gICAgICBzZWVkczoge1xuICAgICAgICBkaXJlY3Rvcnk6IGNvbmZpZy50ZW5hbnQuc2VlZHNfZGlyLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHsgbWluOiAwLCBtYXg6IDUgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGtuZXhJbnN0YW5jZShvcmdhbml6YXRpb25JZCkge1xuICAgIGNvbnN0IGtuZXhDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25leCA9IGtuZXhDYWNoZS5nZXQob3JnYW5pemF0aW9uSWQpO1xuXG4gICAgaWYgKCFrbmV4KSB7XG4gICAgICBrbmV4ID0gS25leCh7XG4gICAgICAgIC4uLnRoaXMuZ2V0VGVuYW50S25leENvbmZpZyhvcmdhbml6YXRpb25JZCksXG4gICAgICAgIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHsgdXBwZXJDYXNlOiB0cnVlIH0pLFxuICAgICAgfSk7XG4gICAgICBrbmV4Q2FjaGUuc2V0KG9yZ2FuaXphdGlvbklkLCBrbmV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGtuZXg7XG4gIH1cbn0iLCJpbXBvcnQgU3lzdGVtTW9kZWwgZnJvbSAnQC9zeXN0ZW0vbW9kZWxzL1N5c3RlbU1vZGVsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckludml0ZSBleHRlbmRzIFN5c3RlbU1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJfaW52aXRlcyc7XG4gIH1cbn1cbiIsImltcG9ydCBTeXN0ZW1Nb2RlbCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXNzd29yZFJlc2V0cyBleHRlbmRzIFN5c3RlbU1vZGVsIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWVcbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVOYW1lKCkge1xuICAgIHJldHVybiAncGFzc3dvcmRfcmVzZXRzJztcbiAgfVxufVxuIiwiaW1wb3J0IFN5c3RlbU1vZGVsIGZyb20gJ0Avc3lzdGVtL21vZGVscy9TeXN0ZW1Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1YnNjcmlwdGlvblVzYWdlIGV4dGVuZHMgU3lzdGVtTW9kZWwge1xuICAvKipcbiAgICogVGFibGUgbmFtZVxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICdzdWJzY3JpcHRpb25zX3VzYWdlJztcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVse1xufSIsImltcG9ydCB7IE1vZGVsLCBtaXhpbiB9IGZyb20gJ29iamVjdGlvbic7XG5pbXBvcnQgYmNyeXB0IGZyb20gJ2JjcnlwdGpzJztcbmltcG9ydCBTeXN0ZW1Nb2RlbCBmcm9tICdAL3N5c3RlbS9tb2RlbHMvU3lzdGVtTW9kZWwnO1xuaW1wb3J0IFVzZXJTdWJzY3JpcHRpb24gZnJvbSAnQC9zZXJ2aWNlcy9TdWJzY3JpcHRpb24vVXNlclN1YnNjcmlwdGlvbic7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVXNlciBleHRlbmRzIG1peGluKFN5c3RlbU1vZGVsLCBbVXNlclN1YnNjcmlwdGlvbl0pIHtcbiAgLyoqXG4gICAqIFRhYmxlIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlTmFtZSgpIHtcbiAgICByZXR1cm4gJ3VzZXJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXBzIGNvbHVtbnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRpbWVzdGFtcHMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uc2hpcCBtYXBwaW5nLlxuICAgKi9cbiAgc3RhdGljIGdldCByZWxhdGlvbk1hcHBpbmdzKCkge1xuICAgIGNvbnN0IFRlbmFudCA9IHJlcXVpcmUoJ0Avc3lzdGVtL21vZGVscy9UZW5hbnQnKTtcbiAgICBjb25zdCBTdWJzY3JpcHRpb25Vc2FnZSA9IHJlcXVpcmUoJ0Avc3lzdGVtL21vZGVscy9TdWJzY3JpcHRpb25Vc2FnZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudDoge1xuICAgICAgICByZWxhdGlvbjogTW9kZWwuQmVsb25nc1RvT25lUmVsYXRpb24sXG4gICAgICAgIG1vZGVsQ2xhc3M6IFRlbmFudC5kZWZhdWx0LFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3VzZXJzLnRlbmFudElkJyxcbiAgICAgICAgICB0bzogJ3RlbmFudHMuaWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgc3Vic2NyaXB0aW9uVXNhZ2U6IHtcbiAgICAgICAgcmVsYXRpb246IE1vZGVsLkJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICAgICAgICBtb2RlbENsYXNzOiBTdWJzY3JpcHRpb25Vc2FnZS5kZWZhdWx0LFxuICAgICAgICBqb2luOiB7XG4gICAgICAgICAgZnJvbTogJ3VzZXJzLmlkJyxcbiAgICAgICAgICB0bzogJ3N1YnNjcmlwdGlvbnNfdXNhZ2UudXNlcl9pZCcsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHBhc3N3b3JkIC0gVGhlIGdpdmVuIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgdmVyaWZ5UGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICByZXR1cm4gYmNyeXB0LmNvbXBhcmVTeW5jKHBhc3N3b3JkLCB0aGlzLnBhc3N3b3JkKTtcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tICdAL21vZGVscy9Nb2RlbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIC8qKlxuICAgKiBUYWJsZSBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgcmV0dXJuICd0ZW5hbnRzJztcbiAgfVxufVxuIiwiaW1wb3J0IGJjcnlwdCBmcm9tICdiY3J5cHRqcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuY29uc3QgeyBtYXAsIGlzQXJyYXksIGlzUGxhaW5PYmplY3QsIG1hcEtleXMsIG1hcFZhbHVlcyB9ID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbmNvbnN0IGhhc2hQYXNzd29yZCA9IChwYXNzd29yZCkgPT5cbiAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBiY3J5cHQuZ2VuU2FsdCgxMCwgKGVycm9yLCBzYWx0KSA9PiB7XG4gICAgICBiY3J5cHQuaGFzaChwYXNzd29yZCwgc2FsdCwgKGVyciwgaGFzaCkgPT4ge1xuICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG5jb25zdCBvcmlnaW4gPSAocmVxdWVzdCkgPT4gYCR7cmVxdWVzdC5wcm90b2NvbH06Ly8ke3JlcXVlc3QuaG9zdG5hbWV9YDtcblxuY29uc3QgZGF0ZVJhbmdlQ29sbGVjdGlvbiA9IChcbiAgZnJvbURhdGUsXG4gIHRvRGF0ZSxcbiAgYWRkVHlwZSA9ICdkYXknLFxuICBpbmNyZW1lbnQgPSAxXG4pID0+IHtcbiAgY29uc3QgY29sbGVjdGlvbiA9IFtdO1xuICBjb25zdCBtb21lbnRGcm9tRGF0ZSA9IG1vbWVudChmcm9tRGF0ZSk7XG4gIGxldCBkYXRlRm9ybWF0ID0gJyc7XG5cbiAgc3dpdGNoIChhZGRUeXBlKSB7XG4gICAgY2FzZSAnZGF5JzpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWS1NTSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWSc7XG4gICAgICBicmVhaztcbiAgfVxuICBmb3IgKFxuICAgIGxldCBpID0gbW9tZW50RnJvbURhdGU7XG4gICAgaS5pc0JlZm9yZSh0b0RhdGUsIGFkZFR5cGUpIHx8IGkuaXNTYW1lKHRvRGF0ZSwgYWRkVHlwZSk7XG4gICAgaS5hZGQoaW5jcmVtZW50LCBgJHthZGRUeXBlfXNgKVxuICApIHtcbiAgICBjb2xsZWN0aW9uLnB1c2goaS5lbmRPZihhZGRUeXBlKS5mb3JtYXQoZGF0ZUZvcm1hdCkpO1xuICB9XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufTtcblxuY29uc3QgZGF0ZVJhbmdlRm9ybWF0ID0gKHJhbmdlVHlwZSkgPT4ge1xuICBzd2l0Y2ggKHJhbmdlVHlwZSkge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuICdZWVlZJztcbiAgICBjYXNlICdtb250aCc6XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnWVlZWS1NTSc7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1hcEtleXNEZWVwKG9iaiwgY2IsIGlzUmVjdXJzaXZlKSB7XG4gIGlmICghb2JqICYmICFpc1JlY3Vyc2l2ZSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoIWlzUmVjdXJzaXZlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHxcbiAgICAgIHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8XG4gICAgICB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiBtYXBLZXlzRGVlcChpdGVtLCBjYiwgdHJ1ZSkpO1xuICB9XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IF8ubWFwS2V5cyhvYmosIGNiKTtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHJlc3VsdCwgKHZhbHVlKSA9PiBtYXBLZXlzRGVlcCh2YWx1ZSwgY2IsIHRydWUpKTtcbn1cblxuY29uc3QgbWFwVmFsdWVzRGVlcCA9ICh2LCBjYWxsYmFjaykgPT5cbiAgXy5pc09iamVjdCh2KVxuICAgID8gXy5tYXBWYWx1ZXModiwgKHYpID0+IG1hcFZhbHVlc0RlZXAodiwgY2FsbGJhY2spKVxuICAgIDogY2FsbGJhY2sodik7XG5cbmNvbnN0IHByb21pc2VTZXJpYWwgPSAoZnVuY3MpID0+IHtcbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZShcbiAgICAocHJvbWlzZSwgZnVuYykgPT5cbiAgICAgIHByb21pc2UudGhlbigocmVzdWx0KSA9PlxuICAgICAgICBmdW5jKCkudGhlbihBcnJheS5wcm90b3R5cGUuY29uY2F0LmJpbmQocmVzdWx0KSlcbiAgICAgICksXG4gICAgUHJvbWlzZS5yZXNvbHZlKFtdKVxuICApO1xufTtcblxuY29uc3QgZmxhdFRvTmVzdGVkQXJyYXkgPSAoXG4gIGRhdGEsXG4gIGNvbmZpZyA9IHsgaWQ6ICdpZCcsIHBhcmVudElkOiAncGFyZW50X2lkJyB9XG4pID0+IHtcbiAgY29uc3QgbWFwID0ge307XG4gIGNvbnN0IG5lc3RlZEFycmF5ID0gW107XG5cbiAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgbWFwW2l0ZW1bY29uZmlnLmlkXV0gPSBpdGVtO1xuICAgIG1hcFtpdGVtW2NvbmZpZy5pZF1dLmNoaWxkcmVuID0gW107XG4gIH0pO1xuXG4gIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHBhcmVudEl0ZW1JZCA9IGl0ZW1bY29uZmlnLnBhcmVudElkXTtcblxuICAgIGlmICghaXRlbVtjb25maWcucGFyZW50SWRdKSB7XG4gICAgICBuZXN0ZWRBcnJheS5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICBpZiAocGFyZW50SXRlbUlkKSB7XG4gICAgICBtYXBbcGFyZW50SXRlbUlkXS5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5lc3RlZEFycmF5O1xufTtcblxuZXhwb3J0IHtcbiAgaGFzaFBhc3N3b3JkLFxuICBvcmlnaW4sXG4gIGRhdGVSYW5nZUNvbGxlY3Rpb24sXG4gIGRhdGVSYW5nZUZvcm1hdCxcbiAgbWFwVmFsdWVzRGVlcCxcbiAgbWFwS2V5c0RlZXAsXG4gIHByb21pc2VTZXJpYWwsXG4gIGZsYXRUb05lc3RlZEFycmF5LFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXJ1bnRpbWVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJhcHAtcm9vdC1wYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJjcnlwdGpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJkb3RlbnZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXJyb3JoYW5kbGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXhwcmVzcy1ib29tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV4cHJlc3MtZmlsZXVwbG9hZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJleHByZXNzLXZhbGlkYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaTE4blwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqc29ud2VidG9rZW5cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwia25leFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJrbmV4LWRiLW1hbmFnZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtdXN0YWNoZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWNhY2hlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGVtYWlsZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwib2JqZWN0aW9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW5pcWlkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIndpbnN0b25cIik7Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEtBO0FBd0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF4TUE7QUEwTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNUlBO0FBOElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdjRCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBeEJBO0FBQ0E7QUFDQTtBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL2tCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdUQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUlBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1WEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN01BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0RkE7QUF3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdIQTtBQStIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdtQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1SEE7QUE4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckxBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyT0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDcE5BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0UEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUtBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25VQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMURBO0FBNERBO0FBQ0E7QUFDQTtBQTlEQTtBQWdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqSUE7QUFtSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyQkE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5ZUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBckJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDclBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFJQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JYQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExR0E7QUE0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4RUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN4REE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDOUJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuRUE7QUFBQTs7OztBQUlBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVWQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTNCQTtBQStCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUE5RUE7QUFtRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXZGQTtBQTRGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEdBO0FBd0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFsSEE7QUFvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpJQTtBQW1JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxREE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQW5FQTtBQXVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hRQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6RkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBbkpBOztBQU9BOztBQU9BO0FBU0E7QUFDQTtBQUhBOztBQTZEQTs7QUFTQTs7QUFZQTs7QUFZQTs7Ozs7Ozs7Ozs7O0FDcElBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUEvQkE7Ozs7Ozs7Ozs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFwREE7O0FBV0E7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9DQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBekNBOzs7Ozs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXBCQTtBQXNCQTs7Ozs7Ozs7Ozs7O0FDekNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBM0NBOztBQUdBOztBQVdBOztBQVdBOztBQU9BOztBQXFCQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDekZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBbkJBOztBQU9BOzs7Ozs7Ozs7Ozs7QUNkQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBbkRBOztBQU9BOztBQU9BOztBQU9BOzs7Ozs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbGRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdElBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQTlDQTs7QUFPQTs7QUFPQTs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzSEE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==