@resolveio/server-lib 1.0.0-rc28 → 1.0.0-rc4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/collections/active-subscription.collection.js +2 -68
- package/collections/app-status.collection.js +2 -43
- package/collections/app-version.collection.js +2 -56
- package/collections/counter.collection.js +2 -73
- package/collections/cron-job-history.collection.js +2 -86
- package/collections/cron-job.collection.js +2 -89
- package/collections/file.collection.js +2 -73
- package/collections/flag.collection.js +2 -47
- package/collections/log.collection.js +2 -64
- package/collections/logged-in-users.collection.js +2 -70
- package/collections/method-call.collection.js +2 -44
- package/collections/method-response.collection.js +2 -48
- package/collections/queue-flag.collection.js +2 -41
- package/collections/queue-method.collection.js +2 -116
- package/collections/queue-response.collection.js +2 -78
- package/collections/support-ticket.collection.js +2 -146
- package/collections/user.collection.js +2 -108
- package/cron/cron.js +2 -160
- package/fixtures/cron-jobs.js +2 -72
- package/fixtures/init.js +2 -73
- package/http/auth.js +2 -472
- package/http/health.js +2 -8
- package/index.js +2 -125
- package/managers/cron.manager.js +2 -193
- package/managers/method.manager.js +2 -544
- package/managers/queue-method.manager.js +2 -239
- package/managers/subscription.manager.js +2 -700
- package/managers/support.manager.js +2 -208
- package/methods/accounts.js +2 -253
- package/methods/aws.js +2 -345
- package/methods/cloudconvert.js +2 -37
- package/methods/collections.js +2 -738
- package/methods/counters.js +2 -404
- package/methods/cron-jobs.js +2 -63
- package/methods/flags.js +2 -6
- package/methods/logs.js +2 -29
- package/methods/pdf.js +2 -303
- package/models/active-subscription.model.js +2 -2
- package/models/app-status.model.js +2 -2
- package/models/app-version.model.js +2 -2
- package/models/collection-document.model.js +2 -2
- package/models/counter.model.js +2 -2
- package/models/cron-job-history.model.js +2 -2
- package/models/cron-job.model.js +2 -2
- package/models/dialog.model.js +2 -2
- package/models/file.model.js +2 -2
- package/models/flag.model.js +2 -2
- package/models/log.model.js +2 -2
- package/models/logged-in-users.model.js +2 -2
- package/models/method-call.model.js +2 -2
- package/models/method-response.model.js +2 -2
- package/models/method.model.js +2 -2
- package/models/pagination.model.js +2 -20
- package/models/permission.model.js +2 -2
- package/models/queue-method.model.js +2 -2
- package/models/queue-response.model.js +2 -2
- package/models/select-data-label.model.js +2 -2
- package/models/server-response.model.js +2 -2
- package/models/subscription.model.js +2 -2
- package/models/support-method.model.js +2 -2
- package/models/support-ticket.model.js +2 -2
- package/models/user.model.js +2 -2
- package/package.json +2 -4
- package/publications/app-status.js +2 -14
- package/publications/app-version.js +2 -14
- package/publications/cron-jobs.js +2 -14
- package/publications/files.js +2 -71
- package/publications/flags.js +2 -23
- package/publications/logs.js +2 -26
- package/publications/method-calls.js +2 -14
- package/publications/method-responses.js +2 -14
- package/publications/super-admin.js +2 -21
- package/publications/support-tickets.js +2 -118
- package/server-app.js +2 -641
- package/support-methods/aws.js +2 -276
- package/support-methods/collections.js +2 -471
- package/support-methods/counters.js +2 -189
- package/support-methods/support.js +2 -19
- package/util/common.js +2 -334
- package/collections/active-subscription.collection.d.ts +0 -8
- package/collections/app-status.collection.d.ts +0 -8
- package/collections/app-version.collection.d.ts +0 -8
- package/collections/counter.collection.d.ts +0 -10
- package/collections/cron-job-history.collection.d.ts +0 -8
- package/collections/cron-job.collection.d.ts +0 -8
- package/collections/file.collection.d.ts +0 -10
- package/collections/flag.collection.d.ts +0 -8
- package/collections/log.collection.d.ts +0 -8
- package/collections/logged-in-users.collection.d.ts +0 -8
- package/collections/method-call.collection.d.ts +0 -7
- package/collections/method-response.collection.d.ts +0 -7
- package/collections/queue-flag.collection.d.ts +0 -8
- package/collections/queue-method.collection.d.ts +0 -8
- package/collections/queue-response.collection.d.ts +0 -8
- package/collections/support-ticket.collection.d.ts +0 -8
- package/collections/user.collection.d.ts +0 -9
- package/cron/cron.d.ts +0 -6
- package/fixtures/cron-jobs.d.ts +0 -2
- package/fixtures/init.d.ts +0 -2
- package/http/auth.d.ts +0 -3
- package/http/health.d.ts +0 -2
- package/index.d.ts +0 -17
- package/managers/cron.manager.d.ts +0 -17
- package/managers/method.manager.d.ts +0 -28
- package/managers/queue-method.manager.d.ts +0 -14
- package/managers/subscription.manager.d.ts +0 -27
- package/managers/support.manager.d.ts +0 -18
- package/methods/accounts.d.ts +0 -3
- package/methods/aws.d.ts +0 -3
- package/methods/cloudconvert.d.ts +0 -3
- package/methods/collections.d.ts +0 -3
- package/methods/counters.d.ts +0 -3
- package/methods/cron-jobs.d.ts +0 -3
- package/methods/flags.d.ts +0 -3
- package/methods/logs.d.ts +0 -3
- package/methods/pdf.d.ts +0 -3
- package/models/active-subscription.model.d.ts +0 -14
- package/models/app-status.model.d.ts +0 -5
- package/models/app-version.model.d.ts +0 -5
- package/models/collection-document.model.d.ts +0 -7
- package/models/counter.model.d.ts +0 -6
- package/models/cron-job-history.model.d.ts +0 -13
- package/models/cron-job.model.d.ts +0 -14
- package/models/dialog.model.d.ts +0 -24
- package/models/file.model.d.ts +0 -10
- package/models/flag.model.d.ts +0 -6
- package/models/log.model.d.ts +0 -12
- package/models/logged-in-users.model.d.ts +0 -10
- package/models/method-call.model.d.ts +0 -8
- package/models/method-response.model.d.ts +0 -9
- package/models/method.model.d.ts +0 -11
- package/models/notification.model.d.ts +0 -5
- package/models/notification.model.js +0 -2
- package/models/pagination.model.d.ts +0 -12
- package/models/permission.model.d.ts +0 -13
- package/models/queue-method.model.d.ts +0 -10
- package/models/queue-response.model.d.ts +0 -11
- package/models/select-data-label.model.d.ts +0 -10
- package/models/server-response.model.d.ts +0 -6
- package/models/subscription.model.d.ts +0 -31
- package/models/support-method.model.d.ts +0 -10
- package/models/support-ticket.model.d.ts +0 -40
- package/models/user.model.d.ts +0 -15
- package/publications/app-status.d.ts +0 -3
- package/publications/app-version.d.ts +0 -3
- package/publications/cron-jobs.d.ts +0 -3
- package/publications/files.d.ts +0 -3
- package/publications/flags.d.ts +0 -3
- package/publications/logs.d.ts +0 -3
- package/publications/method-calls.d.ts +0 -3
- package/publications/method-responses.d.ts +0 -3
- package/publications/super-admin.d.ts +0 -3
- package/publications/support-tickets.d.ts +0 -2
- package/server-app.d.ts +0 -34
- package/support-methods/aws.d.ts +0 -3
- package/support-methods/collections.d.ts +0 -3
- package/support-methods/counters.d.ts +0 -3
- package/support-methods/support.d.ts +0 -3
- package/util/common.d.ts +0 -15
|
@@ -1,544 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var collections_1 = require("../methods/collections");
|
|
4
|
-
var logs_1 = require("../methods/logs");
|
|
5
|
-
var counters_1 = require("../methods/counters");
|
|
6
|
-
var pdf_1 = require("../methods/pdf");
|
|
7
|
-
var aws_1 = require("../methods/aws");
|
|
8
|
-
var cloudconvert_1 = require("../methods/cloudconvert");
|
|
9
|
-
var path = require("path");
|
|
10
|
-
var fs = require("fs");
|
|
11
|
-
var nodemailer = require("nodemailer");
|
|
12
|
-
var aws = require("aws-sdk");
|
|
13
|
-
var accounts_1 = require("../methods/accounts");
|
|
14
|
-
var init_1 = require("../fixtures/init");
|
|
15
|
-
var cron_jobs_1 = require("../fixtures/cron-jobs");
|
|
16
|
-
var cron_jobs_2 = require("../methods/cron-jobs");
|
|
17
|
-
var flags_1 = require("../methods/flags");
|
|
18
|
-
var method_response_collection_1 = require("../collections/method-response.collection");
|
|
19
|
-
var mongoose_1 = require("mongoose");
|
|
20
|
-
var common_1 = require("../util/common");
|
|
21
|
-
var log_collection_1 = require("../collections/log.collection");
|
|
22
|
-
var MethodManager = /** @class */ (function () {
|
|
23
|
-
function MethodManager(mainServer, serverConfig, clientDir) {
|
|
24
|
-
var _this = this;
|
|
25
|
-
this._methods = {};
|
|
26
|
-
this._sendQueue = [];
|
|
27
|
-
this._runningQueue = false;
|
|
28
|
-
this._mainServer = mainServer;
|
|
29
|
-
this.serverConfig = serverConfig;
|
|
30
|
-
this.clientDir = clientDir;
|
|
31
|
-
// Fixtures
|
|
32
|
-
init_1.loadServerInit();
|
|
33
|
-
cron_jobs_1.loadServerCronJobs();
|
|
34
|
-
// Methods
|
|
35
|
-
accounts_1.loadAccountMethods(this);
|
|
36
|
-
aws_1.loadAWSMethods(this);
|
|
37
|
-
cloudconvert_1.loadCloudConvertMethods(this);
|
|
38
|
-
collections_1.loadCollectionMethods(this);
|
|
39
|
-
counters_1.loadCounterMethods(this);
|
|
40
|
-
logs_1.loadLogMethods(this);
|
|
41
|
-
pdf_1.loadPDFMethods(this);
|
|
42
|
-
cron_jobs_2.loadCronJobMethods(this);
|
|
43
|
-
flags_1.loadFlagMethods(this);
|
|
44
|
-
this._mailer = nodemailer.createTransport({
|
|
45
|
-
SES: new aws.SES({
|
|
46
|
-
apiVersion: '2010-12-01',
|
|
47
|
-
accessKeyId: serverConfig.AWSACCESSKEYID,
|
|
48
|
-
secretAccessKey: serverConfig.AWSSECRETACCESSKEY,
|
|
49
|
-
region: serverConfig.AWSSES_REGION
|
|
50
|
-
})
|
|
51
|
-
});
|
|
52
|
-
// this._imap = new imap({
|
|
53
|
-
// user: this.serverConfig['ORDERS_EMAIL'],
|
|
54
|
-
// password: this.serverConfig['ORDERS_PASSWORD'],
|
|
55
|
-
// host: this.serverConfig['ORDERS_HOST'],
|
|
56
|
-
// port: this.serverConfig['ORDERS_PORT'],
|
|
57
|
-
// tls: this.serverConfig['ORDERS_TLS']
|
|
58
|
-
// });
|
|
59
|
-
// let that = this;
|
|
60
|
-
// let chemicalNames = await Chemicals.find({}).select('description').exec();
|
|
61
|
-
// let jobNames = await Jobs.find({status: 'Active'}).select('well').exec();
|
|
62
|
-
// console.log(jobNames.map(a => a.well));
|
|
63
|
-
// this._imap.once('ready', () => {
|
|
64
|
-
// this._imap.openBox('INBOX', true, function(err, box) {
|
|
65
|
-
// if (err) {
|
|
66
|
-
// throw err;
|
|
67
|
-
// }
|
|
68
|
-
// that._imap.search([ 'NEW' ], function(err, results) {
|
|
69
|
-
// console.log(err, results);
|
|
70
|
-
// if (err || !results.length) {
|
|
71
|
-
// return that._imap.end();
|
|
72
|
-
// }
|
|
73
|
-
// let f = that._imap.fetch(results[0], { bodies: ['HEADER.FIELDS (FROM)', 'TEXT'] });
|
|
74
|
-
// f.on('message', function(msg, seqno) {
|
|
75
|
-
// // console.log('Message #%d', seqno);
|
|
76
|
-
// let prefix = '(#' + seqno + ') ';
|
|
77
|
-
// msg.on('body', function(stream, info) {
|
|
78
|
-
// let buffer = '', count = 0;
|
|
79
|
-
// stream.on('data', function(chunk) {
|
|
80
|
-
// count += chunk.length;
|
|
81
|
-
// buffer += chunk.toString('utf8');
|
|
82
|
-
// });
|
|
83
|
-
// stream.once('end', function() {
|
|
84
|
-
// if (info.which === 'TEXT') {
|
|
85
|
-
// // console.log(buffer);
|
|
86
|
-
// // console.log(typeof(buffer));
|
|
87
|
-
// let lines = buffer.split('\r\n');
|
|
88
|
-
// // console.log(lines);
|
|
89
|
-
// // let i = 0;
|
|
90
|
-
// // lines.forEach(line => {
|
|
91
|
-
// // let date: Date;
|
|
92
|
-
// // let dateString;
|
|
93
|
-
// // if (line.includes('From')) {
|
|
94
|
-
// // console.log(line);
|
|
95
|
-
// // }
|
|
96
|
-
// // if (!line.includes('class=3D') && !line.includes('style=3D')) {
|
|
97
|
-
// // if (line.includes('Well') || line.includes('Well Name') || line.includes('Job') || line.includes('Pad')) {
|
|
98
|
-
// // let best = stringSimilarity.findBestMatch(line, jobNames.map(a => a.well)).bestMatch;
|
|
99
|
-
// // if (best && best.rating > 0.5) {
|
|
100
|
-
// // console.log('Well', line);
|
|
101
|
-
// // }
|
|
102
|
-
// // }
|
|
103
|
-
// // if (line.includes('Product') || line.includes('Chemical')) {
|
|
104
|
-
// // let best = stringSimilarity.findBestMatch(line, chemicalNames.map(a => a.description)).bestMatch;
|
|
105
|
-
// // if (best && best.rating > 0.5) {
|
|
106
|
-
// // console.log('Chemical', line);
|
|
107
|
-
// // }
|
|
108
|
-
// // }
|
|
109
|
-
// // if (line.includes('Quantity') || line.includes('Qty') || line.includes('Amount')) {
|
|
110
|
-
// // console.log('Qty', line);
|
|
111
|
-
// // }
|
|
112
|
-
// // if (line.includes('Date')) {
|
|
113
|
-
// // console.log('Date', line);
|
|
114
|
-
// // console.log(moment(Date.parse(line)));
|
|
115
|
-
// // date = moment(Date.parse(line)).toDate();
|
|
116
|
-
// // dateString = line;
|
|
117
|
-
// // }
|
|
118
|
-
// // if (line.includes('Time')) {
|
|
119
|
-
// // console.log('Time', line);
|
|
120
|
-
// // console.log(moment(Date.parse(line)));
|
|
121
|
-
// // console.log(moment(date.setTime(Date.parse(line))));
|
|
122
|
-
// // }
|
|
123
|
-
// // }
|
|
124
|
-
// // });
|
|
125
|
-
// }
|
|
126
|
-
// });
|
|
127
|
-
// });
|
|
128
|
-
// msg.once('attributes', function(attrs) {
|
|
129
|
-
// console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
|
|
130
|
-
// });
|
|
131
|
-
// msg.once('end', function() {
|
|
132
|
-
// console.log(prefix + 'Finished');
|
|
133
|
-
// });
|
|
134
|
-
// });
|
|
135
|
-
// f.once('error', function(error) {
|
|
136
|
-
// console.log('Fetch error: ' + error);
|
|
137
|
-
// });
|
|
138
|
-
// f.once('end', function() {
|
|
139
|
-
// console.log('Done fetching all messages!');
|
|
140
|
-
// that._imap.end();
|
|
141
|
-
// });
|
|
142
|
-
// });
|
|
143
|
-
// });
|
|
144
|
-
// });
|
|
145
|
-
// this._imap.connect();
|
|
146
|
-
this._aws = new aws.S3({
|
|
147
|
-
accessKeyId: serverConfig.AWSACCESSKEYID,
|
|
148
|
-
secretAccessKey: serverConfig.AWSSECRETACCESSKEY,
|
|
149
|
-
region: serverConfig.AWSREGION
|
|
150
|
-
});
|
|
151
|
-
setInterval(function () {
|
|
152
|
-
if (!_this._runningQueue) {
|
|
153
|
-
if (_this._sendQueue.length) {
|
|
154
|
-
_this._runningQueue = true;
|
|
155
|
-
var _loop_1 = function (i) {
|
|
156
|
-
var ws = _this._mainServer.getWS(_this._sendQueue[i].id_ws);
|
|
157
|
-
if (ws && ws.readyState === ws.OPEN) {
|
|
158
|
-
if (ws.bufferedAmount < 20480) {
|
|
159
|
-
var sendItem = _this._sendQueue.pop();
|
|
160
|
-
ws.send(JSON.stringify(sendItem.data), function (error) {
|
|
161
|
-
if (error) {
|
|
162
|
-
console.log('Error on WS: ', error);
|
|
163
|
-
_this._mainServer.unsubscribeWS(ws);
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
if (sendItem.method !== 'countQuery' && sendItem.method !== 'countCollectionWithQuery' && sendItem.method !== 'find' && sendItem.method !== 'findOne' && sendItem.method !== 'findWithOptions' && sendItem.method !== 'setWSAppVersion' && sendItem.method !== 'uploadFileAndSave') {
|
|
167
|
-
if (common_1.getBinarySize(JSON.stringify(sendItem.methodData)) < 200000 && common_1.getBinarySize(JSON.stringify(sendItem.data)) < 200000) {
|
|
168
|
-
log_collection_1.Logs.create({
|
|
169
|
-
_id: mongoose_1.Types.ObjectId().toHexString(),
|
|
170
|
-
date: new Date(),
|
|
171
|
-
type: 'client-response',
|
|
172
|
-
title: 'Client Response',
|
|
173
|
-
message: 'User: ' + ws['user'] + ', MessageId: ' + sendItem.data.messageId + ', Method: ' + sendItem.method,
|
|
174
|
-
payload: [JSON.stringify(sendItem.methodData), sendItem.data],
|
|
175
|
-
method: sendItem.method,
|
|
176
|
-
user: ws['user'],
|
|
177
|
-
messageId: sendItem.data.messageId
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
log_collection_1.Logs.create({
|
|
182
|
-
_id: mongoose_1.Types.ObjectId().toHexString(),
|
|
183
|
-
date: new Date(),
|
|
184
|
-
type: 'client-response',
|
|
185
|
-
title: 'Client Response',
|
|
186
|
-
message: 'User: ' + ws['user'] + ', MessageId: ' + sendItem.data.messageId + ', Method: ' + sendItem.method,
|
|
187
|
-
payload: 'Too Big',
|
|
188
|
-
method: sendItem.method,
|
|
189
|
-
user: ws['user'],
|
|
190
|
-
messageId: sendItem.data.messageId
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
method_response_collection_1.MethodResponses.create({
|
|
195
|
-
_id: mongoose_1.Types.ObjectId().toHexString(),
|
|
196
|
-
__v: 0,
|
|
197
|
-
id_user: ws['id_user'],
|
|
198
|
-
message_id: sendItem.data.messageId,
|
|
199
|
-
data: JSON.stringify(sendItem.methodData),
|
|
200
|
-
response: sendItem.data,
|
|
201
|
-
method: sendItem.method
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
_this._sendQueue.splice(i, 1);
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
for (var i = _this._sendQueue.length - 1; i >= 0; i--) {
|
|
210
|
-
_loop_1(i);
|
|
211
|
-
}
|
|
212
|
-
_this._runningQueue = false;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}, 50);
|
|
216
|
-
}
|
|
217
|
-
MethodManager.prototype.getMainServer = function () {
|
|
218
|
-
return this._mainServer;
|
|
219
|
-
};
|
|
220
|
-
// Add methods to private methods object
|
|
221
|
-
MethodManager.prototype.methods = function (method) {
|
|
222
|
-
this._methods = Object.assign(this._methods, method);
|
|
223
|
-
};
|
|
224
|
-
MethodManager.prototype.callMethodCron = function (method) {
|
|
225
|
-
var methodData = [];
|
|
226
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
227
|
-
methodData[_i - 1] = arguments[_i];
|
|
228
|
-
}
|
|
229
|
-
var _a;
|
|
230
|
-
var that = this;
|
|
231
|
-
if (!that._methods[method]) {
|
|
232
|
-
console.log('No Method: ' + method);
|
|
233
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Method: ' + method);
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
if ((methodData.length > 1 || methodData[0]) && !that._methods[method].skipValidation) {
|
|
237
|
-
if (!that._methods[method].check) {
|
|
238
|
-
console.error('No Check Function For Method ' + method);
|
|
239
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
else if (!that._methods[method].check._schema) {
|
|
243
|
-
console.error('No Check Schema For Method ' + method);
|
|
244
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
var valObj = {};
|
|
249
|
-
var valKeys = Object.keys(that._methods[method].check._schema);
|
|
250
|
-
var rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
|
|
251
|
-
for (var i = 0; i < methodData.length; i++) {
|
|
252
|
-
valObj[rootKeys[i]] = methodData[i];
|
|
253
|
-
}
|
|
254
|
-
try {
|
|
255
|
-
that._methods[method].check.validate(valObj);
|
|
256
|
-
}
|
|
257
|
-
catch (errors) {
|
|
258
|
-
if (errors) {
|
|
259
|
-
console.error('Error in Method Check (' + method + ')', errors);
|
|
260
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'Match Error On Method ' + method + '\n\nData Being Checked\n' + JSON.stringify(valObj, null, 2) + '\n\nErrors\n' + JSON.stringify(errors, null, 2));
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
(_a = that._methods[method].function).call.apply(_a, [Object.assign({}, that, MethodManager.prototype, { id_user: '', user: '', id_ws: '' })].concat(methodData));
|
|
267
|
-
};
|
|
268
|
-
MethodManager.prototype.callMethodQueue = function (update) {
|
|
269
|
-
// console.log('Call Method Queue', update);
|
|
270
|
-
var _this = this;
|
|
271
|
-
var _a;
|
|
272
|
-
var updateCopy = common_1.deepCopy(update);
|
|
273
|
-
var that = this;
|
|
274
|
-
if (!that._methods[update.method]) {
|
|
275
|
-
console.log('No Method: ' + update.method);
|
|
276
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Method: ' + update.method);
|
|
277
|
-
var serverRes = {
|
|
278
|
-
messageId: update.messageId,
|
|
279
|
-
hasError: true,
|
|
280
|
-
data: 'Internal Error'
|
|
281
|
-
};
|
|
282
|
-
this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
if ((update.method_data.length > 1 || update.method_data[0]) && !that._methods[update.method].skipValidation) {
|
|
286
|
-
if (!that._methods[update.method].check) {
|
|
287
|
-
console.error('No Check Function For Method ' + update.method);
|
|
288
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + update.method);
|
|
289
|
-
var serverRes = {
|
|
290
|
-
messageId: update.messageId,
|
|
291
|
-
hasError: true,
|
|
292
|
-
data: 'Internal Error'
|
|
293
|
-
};
|
|
294
|
-
this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
else if (!that._methods[update.method].check._schema) {
|
|
298
|
-
console.error('No Check Schema For Method ' + update.method);
|
|
299
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + update.method);
|
|
300
|
-
var serverRes = {
|
|
301
|
-
messageId: update.messageId,
|
|
302
|
-
hasError: true,
|
|
303
|
-
data: 'Internal Error'
|
|
304
|
-
};
|
|
305
|
-
this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
var valObj = {};
|
|
310
|
-
var valKeys = Object.keys(that._methods[update.method].check._schema);
|
|
311
|
-
var rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
|
|
312
|
-
for (var i = 0; i < update.method_data.length; i++) {
|
|
313
|
-
valObj[rootKeys[i]] = update.method_data[i];
|
|
314
|
-
}
|
|
315
|
-
try {
|
|
316
|
-
that._methods[update.method].check.validate(valObj);
|
|
317
|
-
}
|
|
318
|
-
catch (errors) {
|
|
319
|
-
if (errors) {
|
|
320
|
-
console.error('Error in Method Check (' + update.method + ')', errors);
|
|
321
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'Match Error On Method ' + update.method + '\n\nData Being Checked\n' + JSON.stringify(valObj, null, 2) + '\n\nErrors\n' + JSON.stringify(errors, null, 2));
|
|
322
|
-
var serverRes = {
|
|
323
|
-
messageId: update.messageId,
|
|
324
|
-
hasError: true,
|
|
325
|
-
data: 'Internal Error'
|
|
326
|
-
};
|
|
327
|
-
this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
// console.log('Run Method', update.method);
|
|
334
|
-
(_a = that._methods[update.method].function).call.apply(_a, [Object.assign({}, that, MethodManager.prototype, { id_user: update.id_user, user: update.user, id_ws: update.id_ws })].concat(update.method_data)).then(function (res) {
|
|
335
|
-
var serverRes = {
|
|
336
|
-
messageId: update.messageId,
|
|
337
|
-
hasError: false,
|
|
338
|
-
data: res
|
|
339
|
-
};
|
|
340
|
-
_this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
|
|
341
|
-
}, function (err) {
|
|
342
|
-
var serverRes = {
|
|
343
|
-
messageId: update.messageId,
|
|
344
|
-
hasError: true,
|
|
345
|
-
data: err
|
|
346
|
-
};
|
|
347
|
-
_this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
|
|
348
|
-
});
|
|
349
|
-
};
|
|
350
|
-
// Call/run method (Emit on Socket)
|
|
351
|
-
MethodManager.prototype.callMethod = function (ws, messageId, method) {
|
|
352
|
-
var _this = this;
|
|
353
|
-
var methodData = [];
|
|
354
|
-
for (var _i = 3; _i < arguments.length; _i++) {
|
|
355
|
-
methodData[_i - 3] = arguments[_i];
|
|
356
|
-
}
|
|
357
|
-
var _a;
|
|
358
|
-
var that = this;
|
|
359
|
-
if (!that._methods[method]) {
|
|
360
|
-
console.log('No Method: ' + method);
|
|
361
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Method: ' + method);
|
|
362
|
-
var serverRes = {
|
|
363
|
-
messageId: messageId,
|
|
364
|
-
hasError: true,
|
|
365
|
-
data: 'Internal Error'
|
|
366
|
-
};
|
|
367
|
-
this.sendWS(ws, method, methodData, serverRes);
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
if ((methodData.length > 1 || methodData[0]) && !that._methods[method].skipValidation) {
|
|
371
|
-
if (!that._methods[method].check) {
|
|
372
|
-
console.error('No Check Function For Method ' + method);
|
|
373
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
|
|
374
|
-
var serverRes = {
|
|
375
|
-
messageId: messageId,
|
|
376
|
-
hasError: true,
|
|
377
|
-
data: 'Internal Error'
|
|
378
|
-
};
|
|
379
|
-
this.sendWS(ws, method, methodData, serverRes);
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
else if (!that._methods[method].check._schema) {
|
|
383
|
-
console.error('No Check Schema For Method ' + method);
|
|
384
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
|
|
385
|
-
var serverRes = {
|
|
386
|
-
messageId: messageId,
|
|
387
|
-
hasError: true,
|
|
388
|
-
data: 'Internal Error'
|
|
389
|
-
};
|
|
390
|
-
this.sendWS(ws, method, methodData, serverRes);
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
var valObj = {};
|
|
395
|
-
var valKeys = Object.keys(that._methods[method].check._schema);
|
|
396
|
-
var rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
|
|
397
|
-
for (var i = 0; i < methodData.length; i++) {
|
|
398
|
-
valObj[rootKeys[i]] = methodData[i];
|
|
399
|
-
}
|
|
400
|
-
try {
|
|
401
|
-
that._methods[method].check.validate(valObj);
|
|
402
|
-
}
|
|
403
|
-
catch (errors) {
|
|
404
|
-
if (errors) {
|
|
405
|
-
console.error('Error in Method Check (' + method + ')', errors);
|
|
406
|
-
that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'Match Error On Method ' + method + '\n\nData Being Checked\n' + JSON.stringify(valObj, null, 2) + '\n\nErrors\n' + JSON.stringify(errors, null, 2));
|
|
407
|
-
var serverRes = {
|
|
408
|
-
messageId: messageId,
|
|
409
|
-
hasError: true,
|
|
410
|
-
data: 'Internal Error'
|
|
411
|
-
};
|
|
412
|
-
this.sendWS(ws, method, methodData, serverRes);
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
(_a = that._methods[method].function).call.apply(_a, [Object.assign({}, that, MethodManager.prototype, { id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket'] })].concat(methodData)).then(function (res) {
|
|
419
|
-
var serverRes = {
|
|
420
|
-
messageId: messageId,
|
|
421
|
-
hasError: false,
|
|
422
|
-
data: res
|
|
423
|
-
};
|
|
424
|
-
_this.sendWS(ws, method, methodData, serverRes);
|
|
425
|
-
}, function (err) {
|
|
426
|
-
var serverRes = {
|
|
427
|
-
messageId: messageId,
|
|
428
|
-
hasError: true,
|
|
429
|
-
data: err
|
|
430
|
-
};
|
|
431
|
-
_this.sendWS(ws, method, methodData, serverRes);
|
|
432
|
-
});
|
|
433
|
-
};
|
|
434
|
-
// Call/run method internal (No Emit on Socket)
|
|
435
|
-
MethodManager.prototype.callMethodInternal = function (method) {
|
|
436
|
-
var methodData = [];
|
|
437
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
438
|
-
methodData[_i - 1] = arguments[_i];
|
|
439
|
-
}
|
|
440
|
-
var _a;
|
|
441
|
-
var that = this;
|
|
442
|
-
if (!that._methods[method]) {
|
|
443
|
-
console.log('No Method: ' + method);
|
|
444
|
-
return;
|
|
445
|
-
}
|
|
446
|
-
if ((methodData.length > 1 || (methodData[0] && typeof (methodData[0]) !== 'function')) && !that._methods[method].skipValidation) {
|
|
447
|
-
if (!that._methods[method].check) {
|
|
448
|
-
console.error('No Check Function For Method ' + method);
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
else if (!that._methods[method].check._schema) {
|
|
452
|
-
console.error('No Check Schema For Method ' + method);
|
|
453
|
-
return;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
var promise = (_a = that._methods[method].function).call.apply(_a, [Object.assign({}, that, MethodManager.prototype)].concat(methodData));
|
|
457
|
-
if (methodData[methodData.length - 1] && typeof (methodData[methodData.length - 1]) === 'function') {
|
|
458
|
-
promise.then(function (res) { return methodData[methodData.length - 1](null, res); }, function (err) { return methodData[methodData.length - 1](err, null); });
|
|
459
|
-
}
|
|
460
|
-
return promise;
|
|
461
|
-
};
|
|
462
|
-
MethodManager.prototype.sendWS = function (ws, method, methodData, data) {
|
|
463
|
-
this._sendQueue.splice(0, 0, {
|
|
464
|
-
id_ws: ws['id_socket'],
|
|
465
|
-
method: method,
|
|
466
|
-
methodData: methodData,
|
|
467
|
-
data: data
|
|
468
|
-
});
|
|
469
|
-
};
|
|
470
|
-
MethodManager.prototype.sendEmail = function (sendTo, subject, text, html, attachments) {
|
|
471
|
-
this._mailer.sendMail({
|
|
472
|
-
replyTo: undefined,
|
|
473
|
-
from: this.serverConfig.MAIL_FROM,
|
|
474
|
-
to: sendTo,
|
|
475
|
-
subject: subject,
|
|
476
|
-
text: text,
|
|
477
|
-
html: html,
|
|
478
|
-
attachments: attachments
|
|
479
|
-
}, function (err, info) {
|
|
480
|
-
if (err) {
|
|
481
|
-
console.log(err);
|
|
482
|
-
}
|
|
483
|
-
});
|
|
484
|
-
};
|
|
485
|
-
MethodManager.prototype.getAWS = function () {
|
|
486
|
-
return this._aws;
|
|
487
|
-
};
|
|
488
|
-
MethodManager.prototype.readFile = function (fileName) {
|
|
489
|
-
var _this = this;
|
|
490
|
-
return new Promise(function (resolve, reject) {
|
|
491
|
-
if (fs.existsSync(path.join(__dirname, ('../private/' + fileName)))) {
|
|
492
|
-
fs.readFile(path.join(__dirname, ('../private/' + fileName)), 'utf-8', function (err, res) {
|
|
493
|
-
if (err) {
|
|
494
|
-
reject(err);
|
|
495
|
-
}
|
|
496
|
-
else {
|
|
497
|
-
resolve(res);
|
|
498
|
-
}
|
|
499
|
-
});
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
if (fs.existsSync(path.join(_this.clientDir, ('./private/' + fileName)))) {
|
|
503
|
-
fs.readFile(path.join(_this.clientDir, ('./private/' + fileName)), 'utf-8', function (err, res) {
|
|
504
|
-
if (err) {
|
|
505
|
-
reject(err);
|
|
506
|
-
}
|
|
507
|
-
else {
|
|
508
|
-
resolve(res);
|
|
509
|
-
}
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
});
|
|
514
|
-
};
|
|
515
|
-
MethodManager.prototype.readImage = function (fileName) {
|
|
516
|
-
var _this = this;
|
|
517
|
-
return new Promise(function (resolve, reject) {
|
|
518
|
-
if (fs.existsSync(path.join(__dirname, ('../private/' + fileName)))) {
|
|
519
|
-
fs.readFile(path.join(__dirname, ('../private/' + fileName)), 'base64', function (err, res) {
|
|
520
|
-
if (err) {
|
|
521
|
-
reject(err);
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
resolve(res);
|
|
525
|
-
}
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
else {
|
|
529
|
-
if (fs.existsSync(path.join(_this.clientDir, ('./private/' + fileName)))) {
|
|
530
|
-
fs.readFile(path.join(_this.clientDir, ('./private/' + fileName)), 'base64', function (err, res) {
|
|
531
|
-
if (err) {
|
|
532
|
-
reject(err);
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
resolve(res);
|
|
536
|
-
}
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
});
|
|
541
|
-
};
|
|
542
|
-
return MethodManager;
|
|
543
|
-
}());
|
|
544
|
-
exports.MethodManager = MethodManager;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var collections_1=require("../methods/collections"),logs_1=require("../methods/logs"),counters_1=require("../methods/counters"),pdf_1=require("../methods/pdf"),aws_1=require("../methods/aws"),cloudconvert_1=require("../methods/cloudconvert"),path=require("path"),fs=require("fs"),nodemailer=require("nodemailer"),aws=require("aws-sdk"),accounts_1=require("../methods/accounts"),init_1=require("../fixtures/init"),cron_jobs_1=require("../fixtures/cron-jobs"),cron_jobs_2=require("../methods/cron-jobs"),flags_1=require("../methods/flags"),method_response_collection_1=require("../collections/method-response.collection"),mongoose_1=require("mongoose"),common_1=require("../util/common"),log_collection_1=require("../collections/log.collection"),MethodManager=function(){function e(e,o){var r=this;this._methods={},this._sendQueue=[],this._runningQueue=!1,this._mainServer=e,this.serverConfig=o,init_1.loadServerInit(),cron_jobs_1.loadServerCronJobs(),accounts_1.loadAccountMethods(this),aws_1.loadAWSMethods(this),cloudconvert_1.loadCloudConvertMethods(this),collections_1.loadCollectionMethods(this),counters_1.loadCounterMethods(this),logs_1.loadLogMethods(this),pdf_1.loadPDFMethods(this),cron_jobs_2.loadCronJobMethods(this),flags_1.loadFlagMethods(this),this._mailer=nodemailer.createTransport({SES:new aws.SES({apiVersion:"2010-12-01",accessKeyId:o.AWSACCESSKEYID,secretAccessKey:o.AWSSECRETACCESSKEY,region:o.AWSSES_REGION})}),this._aws=new aws.S3({accessKeyId:o.AWSACCESSKEYID,secretAccessKey:o.AWSSECRETACCESSKEY,region:o.AWSREGION}),setInterval(function(){if(!r._runningQueue&&r._sendQueue.length){r._runningQueue=!0;for(var e=function(e){var o=r._mainServer.getWS(r._sendQueue[e].id_ws);if(o&&o.readyState===o.OPEN){if(o.bufferedAmount<20480){var t=r._sendQueue.pop();o.send(JSON.stringify(t.data),function(e){e&&(console.log("Error on WS: ",e),r._mainServer.unsubscribeWS(o))}),"countQuery"!==t.method&&"countCollectionWithQuery"!==t.method&&"find"!==t.method&&"findOne"!==t.method&&"findWithOptions"!==t.method&&"setWSAppVersion"!==t.method&&"uploadFileAndSave"!==t.method&&(common_1.getBinarySize(JSON.stringify(t.methodData))<2e5&&common_1.getBinarySize(JSON.stringify(t.data))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"client-response",title:"Client Response",message:"User: "+o.user+", MessageId: "+t.data.messageId+", Method: "+t.method,payload:[JSON.stringify(t.methodData),t.data],method:t.method,user:o.user,messageId:t.data.messageId}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"client-response",title:"Client Response",message:"User: "+o.user+", MessageId: "+t.data.messageId+", Method: "+t.method,payload:"Too Big",method:t.method,user:o.user,messageId:t.data.messageId})),method_response_collection_1.MethodResponses.create({_id:mongoose_1.Types.ObjectId().toHexString(),__v:0,id_user:o.id_user,message_id:t.data.messageId,data:JSON.stringify(t.methodData),response:t.data,method:t.method})}}else r._sendQueue.splice(e,1)},o=r._sendQueue.length-1;0<=o;o--)e(o);r._runningQueue=!1}},50)}return e.prototype.getMainServer=function(){return this._mainServer},e.prototype.methods=function(e){this._methods=Object.assign(this._methods,e)},e.prototype.callMethodCron=function(o){for(var e,t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var s=this;if(!s._methods[o])return console.log("No Method: "+o),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"No Method: "+o);if((1<t.length||t[0])&&!s._methods[o].skipValidation){if(!s._methods[o].check)return console.error("No Check Function For Method "+o),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"No Check Function For Method "+o);if(!s._methods[o].check._schema)return console.error("No Check Schema For Method "+o),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"No Check Function For Method "+o);for(var n={},d=Object.keys(s._methods[o].check._schema).filter(function(e){return!e.includes(".")}),i=0;i<t.length;i++)n[d[i]]=t[i];try{s._methods[o].check.validate(n)}catch(e){if(e)return console.error("Error in Method Check ("+o+")",e),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"Match Error On Method "+o+"\n\nData Being Checked\n"+JSON.stringify(n,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))}}(e=s._methods[o].function).call.apply(e,[Object.assign({},s,{id_user:"",user:"",id_ws:""})].concat(t))},e.prototype.callMethodQueue=function(t){var e,r=this,s=common_1.deepCopy(t),o=this;if(o._methods[t.method]){if((1<t.method_data.length||t.method_data[0])&&!o._methods[t.method].skipValidation){if(!o._methods[t.method].check){console.error("No Check Function For Method "+t.method),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"No Check Function For Method "+t.method);a={messageId:t.messageId,hasError:!0,data:"Internal Error"};return void this._mainServer.getQueueManager().addMethodResponse(s,a)}if(!o._methods[t.method].check._schema){console.error("No Check Schema For Method "+t.method),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"No Check Function For Method "+t.method);a={messageId:t.messageId,hasError:!0,data:"Internal Error"};return void this._mainServer.getQueueManager().addMethodResponse(s,a)}for(var n={},d=Object.keys(o._methods[t.method].check._schema).filter(function(e){return!e.includes(".")}),i=0;i<t.method_data.length;i++)n[d[i]]=t.method_data[i];try{o._methods[t.method].check.validate(n)}catch(e){if(e){console.error("Error in Method Check ("+t.method+")",e),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"Match Error On Method "+t.method+"\n\nData Being Checked\n"+JSON.stringify(n,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2));a={messageId:t.messageId,hasError:!0,data:"Internal Error"};return void this._mainServer.getQueueManager().addMethodResponse(s,a)}}}(e=o._methods[t.method].function).call.apply(e,[Object.assign({},o,{id_user:t.id_user,user:t.user,id_ws:t.id_ws})].concat(t.method_data)).then(function(e){var o={messageId:t.messageId,hasError:!1,data:e};r._mainServer.getQueueManager().addMethodResponse(s,o)},function(e){var o={messageId:t.messageId,hasError:!0,data:e};r._mainServer.getQueueManager().addMethodResponse(s,o)})}else{console.log("No Method: "+t.method),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"No Method: "+t.method);var a={messageId:t.messageId,hasError:!0,data:"Internal Error"};this._mainServer.getQueueManager().addMethodResponse(s,a)}},e.prototype.callMethod=function(t,r,s){for(var e,n=this,d=[],o=3;o<arguments.length;o++)d[o-3]=arguments[o];var i=this;if(i._methods[s]){if((1<d.length||d[0])&&!i._methods[s].skipValidation){if(!i._methods[s].check){console.error("No Check Function For Method "+s),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"No Check Function For Method "+s);l={messageId:r,hasError:!0,data:"Internal Error"};return void this.sendWS(t,s,d,l)}if(!i._methods[s].check._schema){console.error("No Check Schema For Method "+s),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"No Check Function For Method "+s);l={messageId:r,hasError:!0,data:"Internal Error"};return void this.sendWS(t,s,d,l)}for(var a={},c=Object.keys(i._methods[s].check._schema).filter(function(e){return!e.includes(".")}),h=0;h<d.length;h++)a[c[h]]=d[h];try{i._methods[s].check.validate(a)}catch(e){if(e){console.error("Error in Method Check ("+s+")",e),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"Match Error On Method "+s+"\n\nData Being Checked\n"+JSON.stringify(a,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2));l={messageId:r,hasError:!0,data:"Internal Error"};return void this.sendWS(t,s,d,l)}}}(e=i._methods[s].function).call.apply(e,[Object.assign({},i,{id_user:t.id_user,user:t.user,id_ws:t.id_socket})].concat(d)).then(function(e){var o={messageId:r,hasError:!1,data:e};n.sendWS(t,s,d,o)},function(e){var o={messageId:r,hasError:!0,data:e};n.sendWS(t,s,d,o)})}else{console.log("No Method: "+s),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"No Method: "+s);var l={messageId:r,hasError:!0,data:"Internal Error"};this.sendWS(t,s,d,l)}},e.prototype.callMethodInternal=function(e){for(var o,t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var s=this;if(s._methods[e]){if((1<t.length||t[0]&&"function"!=typeof t[0])&&!s._methods[e].skipValidation){if(!s._methods[e].check)return void console.error("No Check Function For Method "+e);if(!s._methods[e].check._schema)return void console.error("No Check Schema For Method "+e)}var n=(o=s._methods[e].function).call.apply(o,[s].concat(t));return t[t.length-1]&&"function"==typeof t[t.length-1]&&n.then(function(e){return t[t.length-1](null,e)},function(e){return t[t.length-1](e,null)}),n}console.log("No Method: "+e)},e.prototype.sendWS=function(e,o,t,r){this._sendQueue.splice(0,0,{id_ws:e.id_socket,method:o,methodData:t,data:r})},e.prototype.sendEmail=function(e,o,t,r,s){this._mailer.sendMail({replyTo:void 0,from:this.serverConfig.MAIL_FROM,to:e,subject:o,text:t,html:r,attachments:s},function(e,o){e&&console.log(e)})},e.prototype.getAWS=function(){return this._aws},e.prototype.readFile=function(e){return new Promise(function(t,r){fs.readFile(path.join(__dirname,"../private/"+e),"utf-8",function(e,o){e?r(e):t(o)})})},e.prototype.readImage=function(e){return new Promise(function(t,r){fs.readFile(path.join(__dirname,"../private/"+e),"base64",function(e,o){e?r(e):t(o)})})},e}();exports.MethodManager=MethodManager;
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2Vycy9tZXRob2QubWFuYWdlci50cyJdLCJuYW1lcyI6WyJjb2xsZWN0aW9uc18xIiwicmVxdWlyZSIsImxvZ3NfMSIsImNvdW50ZXJzXzEiLCJwZGZfMSIsImF3c18xIiwiY2xvdWRjb252ZXJ0XzEiLCJwYXRoIiwiZnMiLCJub2RlbWFpbGVyIiwiYXdzIiwiYWNjb3VudHNfMSIsImluaXRfMSIsImNyb25fam9ic18xIiwiY3Jvbl9qb2JzXzIiLCJmbGFnc18xIiwibWV0aG9kX3Jlc3BvbnNlX2NvbGxlY3Rpb25fMSIsIm1vbmdvb3NlXzEiLCJjb21tb25fMSIsImxvZ19jb2xsZWN0aW9uXzEiLCJNZXRob2RNYW5hZ2VyIiwibWFpblNlcnZlciIsInNlcnZlckNvbmZpZyIsIl90aGlzIiwidGhpcyIsIl9tZXRob2RzIiwiX3NlbmRRdWV1ZSIsIl9ydW5uaW5nUXVldWUiLCJfbWFpblNlcnZlciIsImxvYWRTZXJ2ZXJJbml0IiwibG9hZFNlcnZlckNyb25Kb2JzIiwibG9hZEFjY291bnRNZXRob2RzIiwibG9hZEFXU01ldGhvZHMiLCJsb2FkQ2xvdWRDb252ZXJ0TWV0aG9kcyIsImxvYWRDb2xsZWN0aW9uTWV0aG9kcyIsImxvYWRDb3VudGVyTWV0aG9kcyIsImxvYWRMb2dNZXRob2RzIiwibG9hZFBERk1ldGhvZHMiLCJsb2FkQ3JvbkpvYk1ldGhvZHMiLCJsb2FkRmxhZ01ldGhvZHMiLCJfbWFpbGVyIiwiY3JlYXRlVHJhbnNwb3J0IiwiU0VTIiwiYXBpVmVyc2lvbiIsImFjY2Vzc0tleUlkIiwiQVdTQUNDRVNTS0VZSUQiLCJzZWNyZXRBY2Nlc3NLZXkiLCJBV1NTRUNSRVRBQ0NFU1NLRVkiLCJyZWdpb24iLCJBV1NTRVNfUkVHSU9OIiwiX2F3cyIsIlMzIiwiQVdTUkVHSU9OIiwic2V0SW50ZXJ2YWwiLCJsZW5ndGgiLCJpIiwid3MiLCJnZXRXUyIsImlkX3dzIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJidWZmZXJlZEFtb3VudCIsInNlbmRJdGVtIiwicG9wIiwic2VuZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwidW5zdWJzY3JpYmVXUyIsIm1ldGhvZCIsImdldEJpbmFyeVNpemUiLCJtZXRob2REYXRhIiwiTG9ncyIsImNyZWF0ZSIsIl9pZCIsIlR5cGVzIiwiT2JqZWN0SWQiLCJ0b0hleFN0cmluZyIsImRhdGUiLCJEYXRlIiwidHlwZSIsInRpdGxlIiwibWVzc2FnZSIsIm1lc3NhZ2VJZCIsInBheWxvYWQiLCJ1c2VyIiwiTWV0aG9kUmVzcG9uc2VzIiwiX192IiwiaWRfdXNlciIsIm1lc3NhZ2VfaWQiLCJyZXNwb25zZSIsInNwbGljZSIsInByb3RvdHlwZSIsImdldE1haW5TZXJ2ZXIiLCJtZXRob2RzIiwiT2JqZWN0IiwiYXNzaWduIiwiY2FsbE1ldGhvZENyb24iLCJfaSIsImFyZ3VtZW50cyIsInRoYXQiLCJzZW5kRW1haWwiLCJza2lwVmFsaWRhdGlvbiIsImNoZWNrIiwiX3NjaGVtYSIsInZhbE9iaiIsInJvb3RLZXlzIiwia2V5cyIsImZpbHRlciIsImEiLCJpbmNsdWRlcyIsInZhbGlkYXRlIiwiZXJyb3JzIiwiX2EiLCJmdW5jdGlvbiIsImNhbGwiLCJhcHBseSIsImNvbmNhdCIsImNhbGxNZXRob2RRdWV1ZSIsInVwZGF0ZSIsInVwZGF0ZUNvcHkiLCJkZWVwQ29weSIsIm1ldGhvZF9kYXRhIiwic2VydmVyUmVzIiwiaGFzRXJyb3IiLCJnZXRRdWV1ZU1hbmFnZXIiLCJhZGRNZXRob2RSZXNwb25zZSIsInRoZW4iLCJyZXMiLCJlcnIiLCJjYWxsTWV0aG9kIiwic2VuZFdTIiwiY2FsbE1ldGhvZEludGVybmFsIiwicHJvbWlzZSIsInNlbmRUbyIsInN1YmplY3QiLCJ0ZXh0IiwiaHRtbCIsImF0dGFjaG1lbnRzIiwic2VuZE1haWwiLCJyZXBseVRvIiwidW5kZWZpbmVkIiwiZnJvbSIsIk1BSUxfRlJPTSIsInRvIiwiaW5mbyIsImdldEFXUyIsInJlYWRGaWxlIiwiZmlsZU5hbWUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJyZWFkSW1hZ2UiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoib0VBQ0EsSUFBQUEsY0FBQUMsUUFBQSwwQkFFQUMsT0FBQUQsUUFBQSxtQkFDQUUsV0FBQUYsUUFBQSx1QkFDQUcsTUFBQUgsUUFBQSxrQkFDQUksTUFBQUosUUFBQSxrQkFDQUssZUFBQUwsUUFBQSwyQkFDQU0sS0FBQU4sUUFBQSxRQUNBTyxHQUFBUCxRQUFBLE1BQ0FRLFdBQUFSLFFBQUEsY0FFQVMsSUFBQVQsUUFBQSxXQUNBVSxXQUFBVixRQUFBLHVCQUNBVyxPQUFBWCxRQUFBLG9CQUNBWSxZQUFBWixRQUFBLHlCQUNBYSxZQUFBYixRQUFBLHdCQUNBYyxRQUFBZCxRQUFBLG9CQUVBZSw2QkFBQWYsUUFBQSw2Q0FDQWdCLFdBQUFoQixRQUFBLFlBQ0FpQixTQUFBakIsUUFBQSxrQkFDQWtCLGlCQUFBbEIsUUFBQSxpQ0FHQW1CLGNBQUEsV0FZQyxTQUFBQSxFQUFZQyxFQUFZQyxHQUF4QixJQUFBQyxFQUFBQyxLQVRPQSxLQUFBQyxTQUF3QixHQU12QkQsS0FBQUUsV0FBYSxHQUNiRixLQUFBRyxlQUFnQixFQUd2QkgsS0FBS0ksWUFBY1AsRUFFbkJHLEtBQUtGLGFBQWVBLEVBR3BCVixPQUFBaUIsaUJBQ0FoQixZQUFBaUIscUJBR0FuQixXQUFBb0IsbUJBQW1CUCxNQUNuQm5CLE1BQUEyQixlQUFlUixNQUNmbEIsZUFBQTJCLHdCQUF3QlQsTUFDeEJ4QixjQUFBa0Msc0JBQXNCVixNQUN0QnJCLFdBQUFnQyxtQkFBbUJYLE1BQ25CdEIsT0FBQWtDLGVBQWVaLE1BQ2ZwQixNQUFBaUMsZUFBZWIsTUFDZlYsWUFBQXdCLG1CQUFtQmQsTUFDbkJULFFBQUF3QixnQkFBZ0JmLE1BRWhCQSxLQUFLZ0IsUUFBVS9CLFdBQVdnQyxnQkFBZ0IsQ0FDekNDLElBQUssSUFBSWhDLElBQUlnQyxJQUFJLENBQ2hCQyxXQUFZLGFB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QUNIc0IsRUFBT3RCLEdBR1BxQixFQUFRdEIsUUFLYi9HLEVBM2tCQSxHQUFhMEksUUFBQTFJLGNBQUFBIiwiZmlsZSI6Im1hbmFnZXJzL21ldGhvZC5tYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VydmVyUmVzcG9uc2VNb2RlbCB9IGZyb20gJy4uL21vZGVscy9zZXJ2ZXItcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgbG9hZENvbGxlY3Rpb25NZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBNZXRob2RNb2RlbCB9IGZyb20gJy4uL21vZGVscy9tZXRob2QubW9kZWwnO1xuaW1wb3J0IHsgbG9hZExvZ01ldGhvZHMgfSBmcm9tICcuLi9tZXRob2RzL2xvZ3MnO1xuaW1wb3J0IHsgbG9hZENvdW50ZXJNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9jb3VudGVycyc7XG5pbXBvcnQgeyBsb2FkUERGTWV0aG9kcyB9IGZyb20gJy4uL21ldGhvZHMvcGRmJztcbmltcG9ydCB7IGxvYWRBV1NNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9hd3MnO1xuaW1wb3J0IHsgbG9hZENsb3VkQ29udmVydE1ldGhvZHMgfSBmcm9tICcuLi9tZXRob2RzL2Nsb3VkY29udmVydCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgbm9kZW1haWxlciBmcm9tICdub2RlbWFpbGVyJztcbmltcG9ydCAqIGFzIGltYXAgZnJvbSAnaW1hcCc7XG5pbXBvcnQgKiBhcyBhd3MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBsb2FkQWNjb3VudE1ldGhvZHMgfSBmcm9tICcuLi9tZXRob2RzL2FjY291bnRzJztcbmltcG9ydCB7IGxvYWRTZXJ2ZXJJbml0IH0gZnJvbSAnLi4vZml4dHVyZXMvaW5pdCc7XG5pbXBvcnQgeyBsb2FkU2VydmVyQ3JvbkpvYnMgfSBmcm9tICcuLi9maXh0dXJlcy9jcm9uLWpvYnMnO1xuaW1wb3J0IHsgbG9hZENyb25Kb2JNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9jcm9uLWpvYnMnO1xuaW1wb3J0IHsgbG9hZEZsYWdNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9mbGFncyc7XG5pbXBvcnQgeyBRdWV1ZU1ldGhvZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3F1ZXVlLW1ldGhvZC5tb2RlbCc7XG5pbXBvcnQgeyBNZXRob2RSZXNwb25zZXMgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy9tZXRob2QtcmVzcG9uc2UuY29sbGVjdGlvbic7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJ21vbmdvb3NlJztcbmltcG9ydCB7IGRlZXBDb3B5LCBnZXRCaW5hcnlTaXplIH0gZnJvbSAnLi4vdXRpbC9jb21tb24nO1xuaW1wb3J0IHsgTG9ncyB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL2xvZy5jb2xsZWN0aW9uJztcbmltcG9ydCB7IFJlc29sdmVJT01haW5TZXJ2ZXIgfSBmcm9tICcuLi9zZXJ2ZXItYXBwJztcblxuZXhwb3J0IGNsYXNzIE1ldGhvZE1hbmFnZXIge1xuXG5cdHByaXZhdGUgX21haW5TZXJ2ZXI6IFJlc29sdmVJT01haW5TZXJ2ZXI7XG5cdHB1YmxpYyBfbWV0aG9kczogTWV0aG9kTW9kZWwgPSB7fTtcblx0cHJpdmF0ZSBfbWFpbGVyOiBub2RlbWFpbGVyLlRyYW5zcG9ydGVyO1xuXHRwcml2YXRlIF9pbWFwOiBpbWFwO1xuXHRwcml2YXRlIF9hd3M6IGF3cy5TMztcblx0cHJpdmF0ZSBzZXJ2ZXJDb25maWc7XG5cblx0cHJpdmF0ZSBfc2VuZFF1ZXVlID0gW107XG5cdHByaXZhdGUgX3J1bm5pbmdRdWV1ZSA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKG1haW5TZXJ2ZXIsIHNlcnZlckNvbmZpZykge1xuXHRcdHRoaXMuX21haW5TZXJ2ZXIgPSBtYWluU2VydmVyO1xuXG5cdFx0dGhpcy5zZXJ2ZXJDb25maWcgPSBzZXJ2ZXJDb25maWc7XG5cblx0XHQvLyBGaXh0dXJlc1xuXHRcdGxvYWRTZXJ2ZXJJbml0KCk7XG5cdFx0bG9hZFNlcnZlckNyb25Kb2JzKCk7XG5cblx0XHQvLyBNZXRob2RzXG5cdFx0bG9hZEFjY291bnRNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRBV1NNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRDbG91ZENvbnZlcnRNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRDb2xsZWN0aW9uTWV0aG9kcyh0aGlzKTtcblx0XHRsb2FkQ291bnRlck1ldGhvZHModGhpcyk7XG5cdFx0bG9hZExvZ01ldGhvZHModGhpcyk7XG5cdFx0bG9hZFBERk1ldGhvZHModGhpcyk7XG5cdFx0bG9hZENyb25Kb2JNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRGbGFnTWV0aG9kcyh0aGlzKTtcblxuXHRcdHRoaXMuX21haWxlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcblx0XHRcdFNFUzogbmV3IGF3cy5TRVMoe1xuXHRcdFx0XHRhcGlWZXJzaW9uOiAnMjAxMC0xMi0wMScsXG5cdFx0XHRcdGFjY2Vzc0tleUlkOiBzZXJ2ZXJDb25maWcuQVdTQUNDRVNTS0VZSUQsXG5cdFx0XHRcdHNlY3JldEFjY2Vzc0tleTogc2VydmVyQ29uZmlnLkFXU1NFQ1JFVEFDQ0VTU0tFWSxcblx0XHRcdFx0cmVnaW9uOiBzZXJ2ZXJDb25maWcuQVdTU0VTX1JFR0lPTlxuXHRcdFx0fSlcblx0XHR9KTtcblxuXHRcdC8vIHRoaXMuX2ltYXAgPSBuZXcgaW1hcCh7XG5cdFx0Ly8gXHR1c2VyOiB0aGlzLnNlcnZlckNvbmZpZ1snT1JERVJTX0VNQUlMJ10sXG5cdFx0Ly8gXHRwYXNzd29yZDogdGhpcy5zZXJ2ZXJDb25maWdbJ09SREVSU19QQVNTV09SRCddLFxuXHRcdC8vIFx0aG9zdDogdGhpcy5zZXJ2ZXJDb25maWdbJ09SREVSU19IT1NUJ10sXG5cdFx0Ly8gXHRwb3J0OiB0aGlzLnNlcnZlckNvbmZpZ1snT1JERVJTX1BPUlQnXSxcblx0XHQvLyBcdHRsczogdGhpcy5zZXJ2ZXJDb25maWdbJ09SREVSU19UTFMnXVxuXHRcdC8vIH0pO1xuXG5cdFx0Ly8gbGV0IHRoYXQgPSB0aGlzO1xuXG5cdFx0Ly8gbGV0IGNoZW1pY2FsTmFtZXMgPSBhd2FpdCBDaGVtaWNhbHMuZmluZCh7fSkuc2VsZWN0KCdkZXNjcmlwdGlvbicpLmV4ZWMoKTtcblx0XHQvLyBsZXQgam9iTmFtZXMgPSBhd2FpdCBKb2JzLmZpbmQoe3N0YXR1czogJ0FjdGl2ZSd9KS5zZWxlY3QoJ3dlbGwnKS5leGVjKCk7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhqb2JOYW1lcy5tYXAoYSA9PiBhLndlbGwpKTtcblxuXHRcdC8vIHRoaXMuX2ltYXAub25jZSgncmVhZHknLCAoKSA9PiB7XG5cdFx0Ly8gXHR0aGlzLl9pbWFwLm9wZW5Cb3goJ0lOQk9YJywgdHJ1ZSwgZnVuY3Rpb24oZXJyLCBib3gpIHtcblx0XHQvLyBcdFx0aWYgKGVycikge1xuXHRcdC8vIFx0XHRcdHRocm93IGVycjtcblx0XHQvLyBcdFx0fVxuXG5cdFx0Ly8gXHRcdHRoYXQuX2ltYXAuc2VhcmNoKFsgJ05FVycgXSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG5cblx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZyhlcnIsIHJlc3VsdHMpO1xuXG5cdFx0Ly8gXHRcdFx0aWYgKGVyciB8fCAhcmVzdWx0cy5sZW5ndGgpIHtcblx0XHQvLyBcdFx0XHRcdHJldHVybiB0aGF0Ll9pbWFwLmVuZCgpO1xuXHRcdC8vIFx0XHRcdH1cblxuXHRcdC8vIFx0XHRcdGxldCBmID0gdGhhdC5faW1hcC5mZXRjaChyZXN1bHRzWzBdLCB7IGJvZGllczogWydIRUFERVIuRklFTERTIChGUk9NKScsICdURVhUJ10gfSk7XG5cdFx0Ly8gXHRcdFx0Zi5vbignbWVzc2FnZScsIGZ1bmN0aW9uKG1zZywgc2Vxbm8pIHtcblx0XHQvLyBcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdNZXNzYWdlICMlZCcsIHNlcW5vKTtcblx0XHQvLyBcdFx0XHRcdGxldCBwcmVmaXggPSAnKCMnICsgc2Vxbm8gKyAnKSAnO1xuXHRcdC8vIFx0XHRcdFx0bXNnLm9uKCdib2R5JywgZnVuY3Rpb24oc3RyZWFtLCBpbmZvKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdGxldCBidWZmZXIgPSAnJywgY291bnQgPSAwO1xuXHRcdC8vIFx0XHRcdFx0XHRzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuXHRcdC8vIFx0XHRcdFx0XHRcdGNvdW50ICs9IGNodW5rLmxlbmd0aDtcblx0XHQvLyBcdFx0XHRcdFx0XHRidWZmZXIgKz0gY2h1bmsudG9TdHJpbmcoJ3V0ZjgnKTtcblx0XHQvLyBcdFx0XHRcdFx0fSk7XG5cdFx0Ly8gXHRcdFx0XHRcdHN0cmVhbS5vbmNlKCdlbmQnLCBmdW5jdGlvbigpIHtcblx0XHQvLyBcdFx0XHRcdFx0XHRpZiAoaW5mby53aGljaCA9PT0gJ1RFWFQnKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhidWZmZXIpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2codHlwZW9mKGJ1ZmZlcikpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0bGV0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcXHJcXG4nKTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGxpbmVzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBsZXQgaSA9IDA7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xuXG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdGxldCBkYXRlOiBEYXRlO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRsZXQgZGF0ZVN0cmluZztcblxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRpZiAobGluZS5pbmNsdWRlcygnRnJvbScpKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0Y29uc29sZS5sb2cobGluZSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdH1cblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0aWYgKCFsaW5lLmluY2x1ZGVzKCdjbGFzcz0zRCcpICYmICFsaW5lLmluY2x1ZGVzKCdzdHlsZT0zRCcpKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0aWYgKGxpbmUuaW5jbHVkZXMoJ1dlbGwnKSB8fCBsaW5lLmluY2x1ZGVzKCdXZWxsIE5hbWUnKSB8fCBsaW5lLmluY2x1ZGVzKCdKb2InKSB8fCBsaW5lLmluY2x1ZGVzKCdQYWQnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0bGV0IGJlc3QgPSBzdHJpbmdTaW1pbGFyaXR5LmZpbmRCZXN0TWF0Y2gobGluZSwgam9iTmFtZXMubWFwKGEgPT4gYS53ZWxsKSkuYmVzdE1hdGNoO1xuXHRcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGlmIChiZXN0ICYmIGJlc3QucmF0aW5nID4gMC41KSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRcdGNvbnNvbGUubG9nKCdXZWxsJywgbGluZSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0fVxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdGlmIChsaW5lLmluY2x1ZGVzKCdQcm9kdWN0JykgfHwgbGluZS5pbmNsdWRlcygnQ2hlbWljYWwnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0bGV0IGJlc3QgPSBzdHJpbmdTaW1pbGFyaXR5LmZpbmRCZXN0TWF0Y2gobGluZSwgY2hlbWljYWxOYW1lcy5tYXAoYSA9PiBhLmRlc2NyaXB0aW9uKSkuYmVzdE1hdGNoO1xuXHRcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGlmIChiZXN0ICYmIGJlc3QucmF0aW5nID4gMC41KSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRcdGNvbnNvbGUubG9nKCdDaGVtaWNhbCcsIGxpbmUpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0fVxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdH1cblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRpZiAobGluZS5pbmNsdWRlcygnUXVhbnRpdHknKSB8fCBsaW5lLmluY2x1ZGVzKCdRdHknKSB8fCBsaW5lLmluY2x1ZGVzKCdBbW91bnQnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2coJ1F0eScsIGxpbmUpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdH1cblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRpZiAobGluZS5pbmNsdWRlcygnRGF0ZScpKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZygnRGF0ZScsIGxpbmUpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2cobW9tZW50KERhdGUucGFyc2UobGluZSkpKTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGRhdGUgPSBtb21lbnQoRGF0ZS5wYXJzZShsaW5lKSkudG9EYXRlKCk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRkYXRlU3RyaW5nID0gbGluZTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHR9XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0aWYgKGxpbmUuaW5jbHVkZXMoJ1RpbWUnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2coJ1RpbWUnLCBsaW5lKTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKG1vbWVudChEYXRlLnBhcnNlKGxpbmUpKSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZyhtb21lbnQoZGF0ZS5zZXRUaW1lKERhdGUucGFyc2UobGluZSkpKSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0fVxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHR9XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyB9KTtcblx0XHQvLyBcdFx0XHRcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XG5cdFx0Ly8gXHRcdFx0XHRtc2cub25jZSgnYXR0cmlidXRlcycsIGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdGNvbnNvbGUubG9nKHByZWZpeCArICdBdHRyaWJ1dGVzOiAlcycsIGluc3BlY3QoYXR0cnMsIGZhbHNlLCA4KSk7XG5cdFx0Ly8gXHRcdFx0XHR9KTtcblxuXHRcdC8vIFx0XHRcdFx0bXNnLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uKCkge1xuXHRcdC8vIFx0XHRcdFx0XHRjb25zb2xlLmxvZyhwcmVmaXggKyAnRmluaXNoZWQnKTtcblx0XHQvLyBcdFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdH0pO1xuXHRcdFx0XHRcdFxuXHRcdC8vIFx0XHRcdGYub25jZSgnZXJyb3InLCBmdW5jdGlvbihlcnJvcikge1xuXHRcdC8vIFx0XHRcdFx0Y29uc29sZS5sb2coJ0ZldGNoIGVycm9yOiAnICsgZXJyb3IpO1xuXHRcdC8vIFx0XHRcdH0pO1xuXG5cdFx0Ly8gXHRcdFx0Zi5vbmNlKCdlbmQnLCBmdW5jdGlvbigpIHtcblx0XHQvLyBcdFx0XHRcdGNvbnNvbGUubG9nKCdEb25lIGZldGNoaW5nIGFsbCBtZXNzYWdlcyEnKTtcblx0XHQvLyBcdFx0XHRcdHRoYXQuX2ltYXAuZW5kKCk7XG5cdFx0Ly8gXHRcdFx0fSk7XG5cdFx0Ly8gXHRcdH0pO1xuXHRcdC8vIFx0fSk7XG5cdFx0Ly8gfSk7XG5cblx0XHQvLyB0aGlzLl9pbWFwLmNvbm5lY3QoKTtcblxuXHRcdHRoaXMuX2F3cyA9IG5ldyBhd3MuUzMoe1xuXHRcdFx0YWNjZXNzS2V5SWQ6IHNlcnZlckNvbmZpZy5BV1NBQ0NFU1NLRVlJRCxcblx0XHRcdHNlY3JldEFjY2Vzc0tleTogc2VydmVyQ29uZmlnLkFXU1NFQ1JFVEFDQ0VTU0tFWSxcblx0XHRcdHJlZ2lvbjogc2VydmVyQ29uZmlnLkFXU1JFR0lPTlxuXHRcdH0pO1xuXG5cdFx0c2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLl9ydW5uaW5nUXVldWUpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3NlbmRRdWV1ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9ydW5uaW5nUXVldWUgPSB0cnVlO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSB0aGlzLl9zZW5kUXVldWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdFx0XHRcdGxldCB3cyA9IHRoaXMuX21haW5TZXJ2ZXIuZ2V0V1ModGhpcy5fc2VuZFF1ZXVlW2ldLmlkX3dzKTtcblx0XHRcdFx0XHRcdGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSB3cy5PUEVOKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh3cy5idWZmZXJlZEFtb3VudCA8IDIwNDgwKSB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlbmRJdGVtID0gdGhpcy5fc2VuZFF1ZXVlLnBvcCgpO1xuXHRcdFx0XHRcdFx0XHRcdHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0uZGF0YSksIChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdFcnJvciBvbiBXUzogJywgZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tYWluU2VydmVyLnVuc3Vic2NyaWJlV1Mod3MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlbmRJdGVtLm1ldGhvZCAhPT0gJ2NvdW50UXVlcnknICYmIHNlbmRJdGVtLm1ldGhvZCAhPT0gJ2NvdW50Q29sbGVjdGlvbldpdGhRdWVyeScgJiYgc2VuZEl0ZW0ubWV0aG9kICE9PSAnZmluZCcgJiYgc2VuZEl0ZW0ubWV0aG9kICE9PSAnZmluZE9uZScgJiYgc2VuZEl0ZW0ubWV0aG9kICE9PSAnZmluZFdpdGhPcHRpb25zJyAmJiBzZW5kSXRlbS5tZXRob2QgIT09ICdzZXRXU0FwcFZlcnNpb24nICYmIHNlbmRJdGVtLm1ldGhvZCAhPT0gJ3VwbG9hZEZpbGVBbmRTYXZlJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0ubWV0aG9kRGF0YSkpIDwgMjAwMDAwICYmIGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0uZGF0YSkpIDwgMjAwMDAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdjbGllbnQtcmVzcG9uc2UnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAnQ2xpZW50IFJlc3BvbnNlJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiAnVXNlcjogJyArIHdzWyd1c2VyJ10gKyAnLCBNZXNzYWdlSWQ6ICcgKyBzZW5kSXRlbS5kYXRhLm1lc3NhZ2VJZCArICcsIE1ldGhvZDogJyArIHNlbmRJdGVtLm1ldGhvZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiBbSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0ubWV0aG9kRGF0YSksIHNlbmRJdGVtLmRhdGFdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogc2VuZEl0ZW0ubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHdzWyd1c2VyJ10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiBzZW5kSXRlbS5kYXRhLm1lc3NhZ2VJZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnY2xpZW50LXJlc3BvbnNlJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ0NsaWVudCBSZXNwb25zZScsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB3c1sndXNlciddICsgJywgTWVzc2FnZUlkOiAnICsgc2VuZEl0ZW0uZGF0YS5tZXNzYWdlSWQgKyAnLCBNZXRob2Q6ICcgKyBzZW5kSXRlbS5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGF5bG9hZDogJ1RvbyBCaWcnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogc2VuZEl0ZW0ubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHdzWyd1c2VyJ10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiBzZW5kSXRlbS5kYXRhLm1lc3NhZ2VJZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRNZXRob2RSZXNwb25zZXMuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0XHRcdFx0X192OiAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWRfdXNlcjogd3NbJ2lkX3VzZXInXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VfaWQ6IHNlbmRJdGVtLmRhdGEubWVzc2FnZUlkLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0ubWV0aG9kRGF0YSksXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZTogc2VuZEl0ZW0uZGF0YSxcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogc2VuZEl0ZW0ubWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZW5kUXVldWUuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX3J1bm5pbmdRdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSwgNTApO1xuXHR9XG5cblx0cHVibGljIGdldE1haW5TZXJ2ZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX21haW5TZXJ2ZXI7XG5cdH1cblxuXHQvLyBBZGQgbWV0aG9kcyB0byBwcml2YXRlIG1ldGhvZHMgb2JqZWN0XG5cdHB1YmxpYyBtZXRob2RzKG1ldGhvZDogTWV0aG9kTW9kZWwpIHtcblx0XHR0aGlzLl9tZXRob2RzID0gT2JqZWN0LmFzc2lnbih0aGlzLl9tZXRob2RzLCBtZXRob2QpO1xuXHR9XG5cblx0cHVibGljIGNhbGxNZXRob2RDcm9uKG1ldGhvZDogc3RyaW5nLCAuLi5tZXRob2REYXRhOiBhbnlbXSkge1xuXHRcdGxldCB0aGF0ID0gdGhpcztcblxuXHRcdGlmICghdGhhdC5fbWV0aG9kc1ttZXRob2RdKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnTm8gTWV0aG9kOiAnICsgbWV0aG9kKTtcblxuXHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gTWV0aG9kOiAnICsgbWV0aG9kKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRpZiAoKG1ldGhvZERhdGEubGVuZ3RoID4gMSB8fCBtZXRob2REYXRhWzBdKSAmJiAhdGhhdC5fbWV0aG9kc1ttZXRob2RdLnNraXBWYWxpZGF0aW9uKSB7XG5cdFx0XHRpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXS5jaGVjaykge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdObyBDaGVjayBGdW5jdGlvbiBGb3IgTWV0aG9kICcgKyBtZXRob2QpO1xuXG5cdFx0XHRcdHRoYXQuc2VuZEVtYWlsKCdkZXZAcmVzb2x2ZWlvLmNvbScsICdTRVJWRVIgLSBFcnJvciBEZXRlY3RlZCAtICcgKyB0aGF0LnNlcnZlckNvbmZpZ1snQ0xJRU5UX05BTUUnXSwgJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIG1ldGhvZCk7XG5cdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICghdGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrLl9zY2hlbWEpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignTm8gQ2hlY2sgU2NoZW1hIEZvciBNZXRob2QgJyArIG1ldGhvZCk7XG5cblx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblx0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRsZXQgdmFsT2JqID0ge307XG5cdFx0XHRcdGxldCB2YWxLZXlzID0gT2JqZWN0LmtleXModGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrLl9zY2hlbWEpO1xuXG5cdFx0XHRcdGxldCByb290S2V5cyA9IHZhbEtleXMuZmlsdGVyKGEgPT4gIWEuaW5jbHVkZXMoJy4nKSk7XG5cdFx0XHRcdFxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1ldGhvZERhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YWxPYmpbcm9vdEtleXNbaV1dID0gbWV0aG9kRGF0YVtpXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrLnZhbGlkYXRlKHZhbE9iaik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGVycm9ycykge1xuXHRcdFx0XHRcdGlmIChlcnJvcnMpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIE1ldGhvZCBDaGVjayAoJyArIG1ldGhvZCArICcpJywgZXJyb3JzKTtcblxuXHRcdFx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTWF0Y2ggRXJyb3IgT24gTWV0aG9kICcgKyBtZXRob2QgKyAnXFxuXFxuRGF0YSBCZWluZyBDaGVja2VkXFxuJyArIEpTT04uc3RyaW5naWZ5KHZhbE9iaiwgbnVsbCwgMikgKyAnXFxuXFxuRXJyb3JzXFxuJyArIEpTT04uc3RyaW5naWZ5KGVycm9ycywgbnVsbCwgMikpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdHRoYXQuX21ldGhvZHNbbWV0aG9kXS5mdW5jdGlvbi5jYWxsKE9iamVjdC5hc3NpZ24oe30sIHRoYXQsIHtpZF91c2VyOiAnJywgdXNlcjogJycsIGlkX3dzOiAnJ30pLCAuLi5tZXRob2REYXRhKTtcblx0fVxuXG5cdHB1YmxpYyBjYWxsTWV0aG9kUXVldWUodXBkYXRlOiBRdWV1ZU1ldGhvZE1vZGVsKSB7XG5cdFx0Ly8gY29uc29sZS5sb2coJ0NhbGwgTWV0aG9kIFF1ZXVlJywgdXBkYXRlKTtcblxuXHRcdGxldCB1cGRhdGVDb3B5ID0gZGVlcENvcHkodXBkYXRlKTtcblx0XHRcblx0XHRsZXQgdGhhdCA9IHRoaXM7XG5cblx0XHRpZiAoIXRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0pIHtcblx0XHRcdGNvbnNvbGUubG9nKCdObyBNZXRob2Q6ICcgKyB1cGRhdGUubWV0aG9kKTtcblxuXHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gTWV0aG9kOiAnICsgdXBkYXRlLm1ldGhvZCk7XG5cdFx0XHRcblx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdG1lc3NhZ2VJZDogdXBkYXRlLm1lc3NhZ2VJZCxcblx0XHRcdFx0aGFzRXJyb3I6IHRydWUsXG5cdFx0XHRcdGRhdGE6ICdJbnRlcm5hbCBFcnJvcidcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuX21haW5TZXJ2ZXIuZ2V0UXVldWVNYW5hZ2VyKCkuYWRkTWV0aG9kUmVzcG9uc2UodXBkYXRlQ29weSwgc2VydmVyUmVzKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgodXBkYXRlLm1ldGhvZF9kYXRhLmxlbmd0aCA+IDEgfHwgdXBkYXRlLm1ldGhvZF9kYXRhWzBdKSAmJiAhdGhhdC5fbWV0aG9kc1t1cGRhdGUubWV0aG9kXS5za2lwVmFsaWRhdGlvbikge1xuXHRcdFx0aWYgKCF0aGF0Ll9tZXRob2RzW3VwZGF0ZS5tZXRob2RdLmNoZWNrKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIHVwZGF0ZS5tZXRob2QpO1xuXG5cdFx0XHRcdHRoYXQuc2VuZEVtYWlsKCdkZXZAcmVzb2x2ZWlvLmNvbScsICdTRVJWRVIgLSBFcnJvciBEZXRlY3RlZCAtICcgKyB0aGF0LnNlcnZlckNvbmZpZ1snQ0xJRU5UX05BTUUnXSwgJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIHVwZGF0ZS5tZXRob2QpO1xuXHRcdFx0XHRcblx0XHRcdFx0bGV0IHNlcnZlclJlczogU2VydmVyUmVzcG9uc2VNb2RlbCA9IHtcblx0XHRcdFx0XHRtZXNzYWdlSWQ6IHVwZGF0ZS5tZXNzYWdlSWQsXG5cdFx0XHRcdFx0aGFzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0XHR9O1xuXHRcblx0XHRcdFx0dGhpcy5fbWFpblNlcnZlci5nZXRRdWV1ZU1hbmFnZXIoKS5hZGRNZXRob2RSZXNwb25zZSh1cGRhdGVDb3B5LCBzZXJ2ZXJSZXMpO1xuXHRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIXRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0uY2hlY2suX3NjaGVtYSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdObyBDaGVjayBTY2hlbWEgRm9yIE1ldGhvZCAnICsgdXBkYXRlLm1ldGhvZCk7XG5cblx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgdXBkYXRlLm1ldGhvZCk7XG5cdFx0XHRcdFxuXHRcdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRcdG1lc3NhZ2VJZDogdXBkYXRlLm1lc3NhZ2VJZCxcblx0XHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRkYXRhOiAnSW50ZXJuYWwgRXJyb3InXG5cdFx0XHRcdH07XG5cdFxuXHRcdFx0XHR0aGlzLl9tYWluU2VydmVyLmdldFF1ZXVlTWFuYWdlcigpLmFkZE1ldGhvZFJlc3BvbnNlKHVwZGF0ZUNvcHksIHNlcnZlclJlcyk7XG5cdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bGV0IHZhbE9iaiA9IHt9O1xuXHRcdFx0XHRsZXQgdmFsS2V5cyA9IE9iamVjdC5rZXlzKHRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0uY2hlY2suX3NjaGVtYSk7XG5cblx0XHRcdFx0bGV0IHJvb3RLZXlzID0gdmFsS2V5cy5maWx0ZXIoYSA9PiAhYS5pbmNsdWRlcygnLicpKTtcblx0XHRcdFx0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdXBkYXRlLm1ldGhvZF9kYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0dmFsT2JqW3Jvb3RLZXlzW2ldXSA9IHVwZGF0ZS5tZXRob2RfZGF0YVtpXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhhdC5fbWV0aG9kc1t1cGRhdGUubWV0aG9kXS5jaGVjay52YWxpZGF0ZSh2YWxPYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChlcnJvcnMpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBpbiBNZXRob2QgQ2hlY2sgKCcgKyB1cGRhdGUubWV0aG9kICsgJyknLCBlcnJvcnMpO1xuXG5cdFx0XHRcdFx0XHR0aGF0LnNlbmRFbWFpbCgnZGV2QHJlc29sdmVpby5jb20nLCAnU0VSVkVSIC0gRXJyb3IgRGV0ZWN0ZWQgLSAnICsgdGhhdC5zZXJ2ZXJDb25maWdbJ0NMSUVOVF9OQU1FJ10sICdNYXRjaCBFcnJvciBPbiBNZXRob2QgJyArIHVwZGF0ZS5tZXRob2QgKyAnXFxuXFxuRGF0YSBCZWluZyBDaGVja2VkXFxuJyArIEpTT04uc3RyaW5naWZ5KHZhbE9iaiwgbnVsbCwgMikgKyAnXFxuXFxuRXJyb3JzXFxuJyArIEpTT04uc3RyaW5naWZ5KGVycm9ycywgbnVsbCwgMikpO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSWQ6IHVwZGF0ZS5tZXNzYWdlSWQsXG5cdFx0XHRcdFx0XHRcdGhhc0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRkYXRhOiAnSW50ZXJuYWwgRXJyb3InXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XG5cdFx0XHRcdFx0XHR0aGlzLl9tYWluU2VydmVyLmdldFF1ZXVlTWFuYWdlcigpLmFkZE1ldGhvZFJlc3BvbnNlKHVwZGF0ZUNvcHksIHNlcnZlclJlcyk7XG5cdFx0XHRcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLmxvZygnUnVuIE1ldGhvZCcsIHVwZGF0ZS5tZXRob2QpO1xuXHRcdFxuXHRcdHRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0uZnVuY3Rpb24uY2FsbChPYmplY3QuYXNzaWduKHt9LCB0aGF0LCB7aWRfdXNlcjogdXBkYXRlLmlkX3VzZXIsIHVzZXI6IHVwZGF0ZS51c2VyLCBpZF93czogdXBkYXRlLmlkX3dzfSksIC4uLnVwZGF0ZS5tZXRob2RfZGF0YSkudGhlbihyZXMgPT4ge1xuXHRcdFx0bGV0IHNlcnZlclJlczogU2VydmVyUmVzcG9uc2VNb2RlbCA9IHtcblx0XHRcdFx0bWVzc2FnZUlkOiB1cGRhdGUubWVzc2FnZUlkLFxuXHRcdFx0XHRoYXNFcnJvcjogZmFsc2UsXG5cdFx0XHRcdGRhdGE6IHJlc1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fbWFpblNlcnZlci5nZXRRdWV1ZU1hbmFnZXIoKS5hZGRNZXRob2RSZXNwb25zZSh1cGRhdGVDb3B5LCBzZXJ2ZXJSZXMpO1xuXHRcdH0sIGVyciA9PiB7XG5cdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRtZXNzYWdlSWQ6IHVwZGF0ZS5tZXNzYWdlSWQsXG5cdFx0XHRcdGhhc0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRkYXRhOiBlcnJcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuX21haW5TZXJ2ZXIuZ2V0UXVldWVNYW5hZ2VyKCkuYWRkTWV0aG9kUmVzcG9uc2UodXBkYXRlQ29weSwgc2VydmVyUmVzKTtcblx0XHR9KTtcblx0fVxuXG5cblxuXHQvLyBDYWxsL3J1biBtZXRob2QgKEVtaXQgb24gU29ja2V0KVxuXHRwdWJsaWMgY2FsbE1ldGhvZCh3czogV2ViU29ja2V0LCBtZXNzYWdlSWQsIG1ldGhvZCwgLi4ubWV0aG9kRGF0YTogYW55W10pIHtcblx0XHRsZXQgdGhhdCA9IHRoaXM7XG5cblx0XHRpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXSkge1xuXHRcdFx0Y29uc29sZS5sb2coJ05vIE1ldGhvZDogJyArIG1ldGhvZCk7XG5cblx0XHRcdHRoYXQuc2VuZEVtYWlsKCdkZXZAcmVzb2x2ZWlvLmNvbScsICdTRVJWRVIgLSBFcnJvciBEZXRlY3RlZCAtICcgKyB0aGF0LnNlcnZlckNvbmZpZ1snQ0xJRU5UX05BTUUnXSwgJ05vIE1ldGhvZDogJyArIG1ldGhvZCk7XG5cdFx0XHRcblx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5zZW5kV1Mod3MsIG1ldGhvZCwgbWV0aG9kRGF0YSwgc2VydmVyUmVzKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgobWV0aG9kRGF0YS5sZW5ndGggPiAxIHx8IG1ldGhvZERhdGFbMF0pICYmICF0aGF0Ll9tZXRob2RzW21ldGhvZF0uc2tpcFZhbGlkYXRpb24pIHtcblx0XHRcdGlmICghdGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIG1ldGhvZCk7XG5cblx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblx0XHRcdFx0XG5cdFx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdFx0bWVzc2FnZUlkOiBtZXNzYWdlSWQsXG5cdFx0XHRcdFx0aGFzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0XHR9O1xuXHRcblx0XHRcdFx0dGhpcy5zZW5kV1Mod3MsIG1ldGhvZCwgbWV0aG9kRGF0YSwgc2VydmVyUmVzKTtcblx0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKCF0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2suX3NjaGVtYSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdObyBDaGVjayBTY2hlbWEgRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblxuXHRcdFx0XHR0aGF0LnNlbmRFbWFpbCgnZGV2QHJlc29sdmVpby5jb20nLCAnU0VSVkVSIC0gRXJyb3IgRGV0ZWN0ZWQgLSAnICsgdGhhdC5zZXJ2ZXJDb25maWdbJ0NMSUVOVF9OQU1FJ10sICdObyBDaGVjayBGdW5jdGlvbiBGb3IgTWV0aG9kICcgKyBtZXRob2QpO1xuXHRcdFx0XHRcblx0XHRcdFx0bGV0IHNlcnZlclJlczogU2VydmVyUmVzcG9uc2VNb2RlbCA9IHtcblx0XHRcdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcblx0XHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRkYXRhOiAnSW50ZXJuYWwgRXJyb3InXG5cdFx0XHRcdH07XG5cdFxuXHRcdFx0XHR0aGlzLnNlbmRXUyh3cywgbWV0aG9kLCBtZXRob2REYXRhLCBzZXJ2ZXJSZXMpO1xuXHRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGxldCB2YWxPYmogPSB7fTtcblx0XHRcdFx0bGV0IHZhbEtleXMgPSBPYmplY3Qua2V5cyh0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2suX3NjaGVtYSk7XG5cblx0XHRcdFx0bGV0IHJvb3RLZXlzID0gdmFsS2V5cy5maWx0ZXIoYSA9PiAhYS5pbmNsdWRlcygnLicpKTtcblx0XHRcdFx0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWV0aG9kRGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhbE9ialtyb290S2V5c1tpXV0gPSBtZXRob2REYXRhW2ldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2sudmFsaWRhdGUodmFsT2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXJyb3JzKSB7XG5cdFx0XHRcdFx0aWYgKGVycm9ycykge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3IgaW4gTWV0aG9kIENoZWNrICgnICsgbWV0aG9kICsgJyknLCBlcnJvcnMpO1xuXG5cdFx0XHRcdFx0XHR0aGF0LnNlbmRFbWFpbCgnZGV2QHJlc29sdmVpby5jb20nLCAnU0VSVkVSIC0gRXJyb3IgRGV0ZWN0ZWQgLSAnICsgdGhhdC5zZXJ2ZXJDb25maWdbJ0NMSUVOVF9OQU1FJ10sICdNYXRjaCBFcnJvciBPbiBNZXRob2QgJyArIG1ldGhvZCArICdcXG5cXG5EYXRhIEJlaW5nIENoZWNrZWRcXG4nICsgSlNPTi5zdHJpbmdpZnkodmFsT2JqLCBudWxsLCAyKSArICdcXG5cXG5FcnJvcnNcXG4nICsgSlNPTi5zdHJpbmdpZnkoZXJyb3JzLCBudWxsLCAyKSk7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0XHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0dGhpcy5zZW5kV1Mod3MsIG1ldGhvZCwgbWV0aG9kRGF0YSwgc2VydmVyUmVzKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHR0aGF0Ll9tZXRob2RzW21ldGhvZF0uZnVuY3Rpb24uY2FsbChPYmplY3QuYXNzaWduKHt9LCB0aGF0LCB7aWRfdXNlcjogd3NbJ2lkX3VzZXInXSwgdXNlcjogd3NbJ3VzZXInXSwgaWRfd3M6IHdzWydpZF9zb2NrZXQnXX0pLCAuLi5tZXRob2REYXRhKS50aGVuKHJlcyA9PiB7XG5cdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcblx0XHRcdFx0aGFzRXJyb3I6IGZhbHNlLFxuXHRcdFx0XHRkYXRhOiByZXNcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuc2VuZFdTKHdzLCBtZXRob2QsIG1ldGhvZERhdGEsIHNlcnZlclJlcyk7XG5cdFx0fSwgZXJyID0+IHtcblx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0ZGF0YTogZXJyXG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLnNlbmRXUyh3cywgbWV0aG9kLCBtZXRob2REYXRhLCBzZXJ2ZXJSZXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gQ2FsbC9ydW4gbWV0aG9kIGludGVybmFsIChObyBFbWl0IG9uIFNvY2tldClcblx0cHVibGljIGNhbGxNZXRob2RJbnRlcm5hbChtZXRob2QsIC4uLm1ldGhvZERhdGE6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcblx0XHRsZXQgdGhhdCA9IHRoaXM7XG5cblx0XHRpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXSkge1xuXHRcdFx0Y29uc29sZS5sb2coJ05vIE1ldGhvZDogJyArIG1ldGhvZCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKChtZXRob2REYXRhLmxlbmd0aCA+IDEgfHwgKG1ldGhvZERhdGFbMF0gJiYgdHlwZW9mKG1ldGhvZERhdGFbMF0pICE9PSAnZnVuY3Rpb24nKSkgJiYgIXRoYXQuX21ldGhvZHNbbWV0aG9kXS5za2lwVmFsaWRhdGlvbikge1xuXHRcdFx0aWYgKCF0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2spIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXS5jaGVjay5fc2NoZW1hKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIENoZWNrIFNjaGVtYSBGb3IgTWV0aG9kICcgKyBtZXRob2QpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHByb21pc2UgPSB0aGF0Ll9tZXRob2RzW21ldGhvZF0uZnVuY3Rpb24uY2FsbCh0aGF0LCAuLi5tZXRob2REYXRhKTtcblxuXHRcdGlmIChtZXRob2REYXRhW21ldGhvZERhdGEubGVuZ3RoIC0gMV0gJiYgdHlwZW9mKG1ldGhvZERhdGFbbWV0aG9kRGF0YS5sZW5ndGggLSAxXSkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHByb21pc2UudGhlbihyZXMgPT4gbWV0aG9kRGF0YVttZXRob2REYXRhLmxlbmd0aCAtIDFdKG51bGwsIHJlcyksIGVyciA9PiBtZXRob2REYXRhW21ldGhvZERhdGEubGVuZ3RoIC0gMV0oZXJyLCBudWxsKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb21pc2U7XG5cdH1cblxuXHRwcml2YXRlIHNlbmRXUyh3czogV2ViU29ja2V0LCBtZXRob2Q6IHN0cmluZywgbWV0aG9kRGF0YTogYW55W10sIGRhdGE6IFNlcnZlclJlc3BvbnNlTW9kZWwpIHtcblx0XHR0aGlzLl9zZW5kUXVldWUuc3BsaWNlKDAsIDAsIHtcblx0XHRcdGlkX3dzOiB3c1snaWRfc29ja2V0J10sXG5cdFx0XHRtZXRob2Q6IG1ldGhvZCxcblx0XHRcdG1ldGhvZERhdGE6IG1ldGhvZERhdGEsXG5cdFx0XHRkYXRhOiBkYXRhXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgc2VuZEVtYWlsKHNlbmRUbzogc3RyaW5nLCBzdWJqZWN0OiBzdHJpbmcsIHRleHQ/OiBzdHJpbmcsIGh0bWw/OiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogYW55W10pIHtcblx0XHR0aGlzLl9tYWlsZXIuc2VuZE1haWwoe1xuXHRcdFx0cmVwbHlUbzogdW5kZWZpbmVkLFxuXHRcdFx0ZnJvbTogdGhpcy5zZXJ2ZXJDb25maWcuTUFJTF9GUk9NLFxuXHRcdFx0dG86IHNlbmRUbyxcblx0XHRcdHN1YmplY3Q6IHN1YmplY3QsXG5cdFx0XHR0ZXh0OiB0ZXh0LFxuXHRcdFx0aHRtbDogaHRtbCxcblx0XHRcdGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c1xuXHRcdH0sIChlcnIsIGluZm8pID0+IHtcblx0XHRcdGlmIChlcnIpIHtcblx0XHRcdFx0Y29uc29sZS5sb2coZXJyKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRBV1MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2F3cztcblx0fVxuXG5cdHB1YmxpYyByZWFkRmlsZShmaWxlTmFtZSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRmcy5yZWFkRmlsZShwYXRoLmpvaW4oX19kaXJuYW1lLCAoJy4uL3ByaXZhdGUvJyArIGZpbGVOYW1lKSksICd1dGYtOCcsIChlcnIsIHJlcykgPT4geyBcblx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdHJlamVjdChlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUocmVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgcmVhZEltYWdlKGZpbGVOYW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGZzLnJlYWRGaWxlKHBhdGguam9pbihfX2Rpcm5hbWUsICgnLi4vcHJpdmF0ZS8nICsgZmlsZU5hbWUpKSwgJ2Jhc2U2NCcsIChlcnIsIHJlcykgPT4geyBcblx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdHJlamVjdChlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUocmVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn0iXX0=
|