badmfck-api-server 2.4.7 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/apiServer/APIService.js +2 -1
- package/dist/apiServer/APIService.js.map +1 -0
- package/dist/apiServer/BaseEndpoint.js +1 -0
- package/dist/apiServer/BaseEndpoint.js.map +1 -0
- package/dist/apiServer/BaseService.js +1 -0
- package/dist/apiServer/BaseService.js.map +1 -0
- package/dist/apiServer/ClusterService.d.ts +18 -5
- package/dist/apiServer/ClusterService.js +45 -14
- package/dist/apiServer/ClusterService.js.map +1 -0
- package/dist/apiServer/DocumentService.js +1 -0
- package/dist/apiServer/DocumentService.js.map +1 -0
- package/dist/apiServer/HUBService.d.ts +11 -4
- package/dist/apiServer/HUBService.js +79 -18
- package/dist/apiServer/HUBService.js.map +1 -0
- package/dist/apiServer/LocalRequest.js +1 -0
- package/dist/apiServer/LocalRequest.js.map +1 -0
- package/dist/apiServer/LogService.js +1 -0
- package/dist/apiServer/LogService.js.map +1 -0
- package/dist/apiServer/MysqlService.js +4 -3
- package/dist/apiServer/MysqlService.js.map +1 -0
- package/dist/apiServer/WSAPITransport.js +1 -0
- package/dist/apiServer/WSAPITransport.js.map +1 -0
- package/dist/apiServer/WebSocketHandler.d.ts +0 -0
- package/dist/apiServer/WebSocketHandler.js +2 -0
- package/dist/apiServer/WebSocketHandler.js.map +1 -0
- package/dist/apiServer/WebsocketService.js +1 -0
- package/dist/apiServer/WebsocketService.js.map +1 -0
- package/dist/apiServer/cluster/HUBConnection.d.ts +25 -25
- package/dist/apiServer/cluster/HUBConnection.js +107 -88
- package/dist/apiServer/cluster/HUBConnection.js.map +1 -0
- package/dist/apiServer/cluster/HUBHandlres.d.ts +0 -0
- package/dist/apiServer/cluster/HUBHandlres.js +2 -0
- package/dist/apiServer/cluster/HUBHandlres.js.map +1 -0
- package/dist/apiServer/deployment/Deployment.js +1 -0
- package/dist/apiServer/deployment/Deployment.js.map +1 -0
- package/dist/apiServer/helper/DataProvider.js +1 -0
- package/dist/apiServer/helper/DataProvider.js.map +1 -0
- package/dist/apiServer/helper/Sleep.d.ts +1 -0
- package/dist/apiServer/helper/Sleep.js +6 -0
- package/dist/apiServer/helper/Sleep.js.map +1 -0
- package/dist/apiServer/helper/UID.js +1 -0
- package/dist/apiServer/helper/UID.js.map +1 -0
- package/dist/apiServer/helper/Validator.js +1 -0
- package/dist/apiServer/helper/Validator.js.map +1 -0
- package/dist/apiServer/monitor/Monitor.js +1 -0
- package/dist/apiServer/monitor/Monitor.js.map +1 -0
- package/dist/apiServer/routes/Liveness.js +1 -0
- package/dist/apiServer/routes/Liveness.js.map +1 -0
- package/dist/apiServer/routes/Readiness.js +1 -0
- package/dist/apiServer/routes/Readiness.js.map +1 -0
- package/dist/apiServer/structures/DefaultErrors.js +1 -0
- package/dist/apiServer/structures/DefaultErrors.js.map +1 -0
- package/dist/apiServer/structures/HTTPStatus.js +1 -0
- package/dist/apiServer/structures/HTTPStatus.js.map +1 -0
- package/dist/apiServer/structures/Interfaces.js +1 -0
- package/dist/apiServer/structures/Interfaces.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/package.json +2 -2
@@ -1,4 +1,7 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
6
|
exports.HUBService = exports.REQ_CLUSTER_NODE = void 0;
|
4
7
|
const ws_1 = require("ws");
|
@@ -7,6 +10,7 @@ const BaseService_1 = require("./BaseService");
|
|
7
10
|
const HUBConnection_1 = require("./cluster/HUBConnection");
|
8
11
|
const LogService_1 = require("./LogService");
|
9
12
|
const badmfck_signal_1 = require("badmfck-signal");
|
13
|
+
const DefaultErrors_1 = __importDefault(require("./structures/DefaultErrors"));
|
10
14
|
exports.REQ_CLUSTER_NODE = new badmfck_signal_1.Req(undefined, "REQ_CLUSTER_NODE");
|
11
15
|
class HUBService extends BaseService_1.BaseService {
|
12
16
|
options;
|
@@ -15,6 +19,29 @@ class HUBService extends BaseService_1.BaseService {
|
|
15
19
|
constructor(options) {
|
16
20
|
super("HUBService");
|
17
21
|
this.options = options;
|
22
|
+
this.handlers = [
|
23
|
+
new badmfck_signal_1.Req(async (req) => {
|
24
|
+
if (!req.data || !Array.isArray(req.data))
|
25
|
+
return { ...DefaultErrors_1.default.BAD_REQUEST, details: "data array is not set" };
|
26
|
+
const incomingCluster = this.nodes.get(req.connection.options.targetID ?? "");
|
27
|
+
if (!incomingCluster)
|
28
|
+
return { ...DefaultErrors_1.default.BAD_REQUEST, details: "cluster for incoming connection not found" };
|
29
|
+
const result = [];
|
30
|
+
for (let i of req.data) {
|
31
|
+
const clusterNode = this.nodes.get(i);
|
32
|
+
if (clusterNode) {
|
33
|
+
result.push({
|
34
|
+
url: clusterNode.url,
|
35
|
+
publicKey: clusterNode.publicKey,
|
36
|
+
id: clusterNode.clusterID
|
37
|
+
});
|
38
|
+
}
|
39
|
+
if (incomingCluster.watchlist.filter(x => x === i).length === 0)
|
40
|
+
incomingCluster.watchlist.push(i + "");
|
41
|
+
}
|
42
|
+
return result;
|
43
|
+
}, "REQ_PARTY")
|
44
|
+
];
|
18
45
|
}
|
19
46
|
async init() {
|
20
47
|
super.init();
|
@@ -26,11 +53,16 @@ class HUBService extends BaseService_1.BaseService {
|
|
26
53
|
path: "/hub"
|
27
54
|
});
|
28
55
|
wss.on("connection", (ws) => {
|
29
|
-
(0, LogService_1.logInfo)("HUBService: new connection on wss server");
|
30
56
|
const conn = new HUBConnection_1.HUBConnection({
|
31
57
|
ws: ws,
|
32
|
-
|
33
|
-
|
58
|
+
direction: "incoming",
|
59
|
+
hostID: this.options.hostID,
|
60
|
+
hostPrivateKey: this.options.hostPrivateKey,
|
61
|
+
hostPublicKey: this.options.hostPublicKey,
|
62
|
+
hostURL: this.options.hostURL + "/hub",
|
63
|
+
targetID: null,
|
64
|
+
targetPublicKey: null,
|
65
|
+
targetURL: null,
|
34
66
|
onAuthorized: () => this.onConnectionAuthorized(conn),
|
35
67
|
onClose: () => this.onConnectionClosed(conn),
|
36
68
|
handlers: this.handlers
|
@@ -41,31 +73,60 @@ class HUBService extends BaseService_1.BaseService {
|
|
41
73
|
});
|
42
74
|
}
|
43
75
|
onConnectionAuthorized(conn) {
|
44
|
-
(
|
45
|
-
|
76
|
+
if (!conn.options.targetID) {
|
77
|
+
(0, LogService_1.logError)("HUBService: connection targetID is not set");
|
78
|
+
return;
|
79
|
+
}
|
80
|
+
let clusterNode = this.nodes.get(conn.options.targetID);
|
46
81
|
if (!clusterNode) {
|
47
82
|
(0, LogService_1.logInfo)("HUBService: new cluster node connected");
|
48
83
|
clusterNode = {
|
49
|
-
clusterID: conn.
|
50
|
-
url: conn.
|
51
|
-
publicKey: conn.
|
52
|
-
privateKey:
|
53
|
-
ws: []
|
84
|
+
clusterID: conn.options.targetID,
|
85
|
+
url: conn.options.targetURL,
|
86
|
+
publicKey: conn.options.targetPublicKey,
|
87
|
+
privateKey: conn.options.hostPrivateKey,
|
88
|
+
ws: [],
|
89
|
+
watchlist: []
|
54
90
|
};
|
55
|
-
this.nodes.set(conn.
|
91
|
+
this.nodes.set(conn.options.targetID, clusterNode);
|
56
92
|
}
|
57
93
|
clusterNode.ws.push(conn);
|
94
|
+
(0, LogService_1.logInfo)("HUBService: new authorized connection added to cluster node");
|
95
|
+
for (let [id, cluster] of this.nodes) {
|
96
|
+
for (let i of cluster.watchlist) {
|
97
|
+
if (i === clusterNode.clusterID) {
|
98
|
+
cluster.ws.forEach(x => {
|
99
|
+
x.send({
|
100
|
+
method: "S_PARTY_AVAILABLE",
|
101
|
+
data: {
|
102
|
+
url: clusterNode.url,
|
103
|
+
publicKey: clusterNode.publicKey,
|
104
|
+
id: clusterNode.clusterID
|
105
|
+
},
|
106
|
+
callbackID: 0
|
107
|
+
});
|
108
|
+
});
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
58
112
|
}
|
59
113
|
onConnectionClosed(conn) {
|
114
|
+
if (!conn.options.targetID) {
|
115
|
+
(0, LogService_1.logError)("HUBService: connection targetID is not set");
|
116
|
+
return;
|
117
|
+
}
|
118
|
+
const clusterNode = this.nodes.get(conn.options.targetID);
|
119
|
+
if (!clusterNode) {
|
120
|
+
(0, LogService_1.logError)("HUBService: cluster node not found");
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
clusterNode.ws = clusterNode.ws.filter(x => x !== conn);
|
60
124
|
(0, LogService_1.logInfo)("HUBService: connection closed");
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
if (!clusterNode.ws.length) {
|
65
|
-
(0, LogService_1.logInfo)("HUBService: cluster node disconnected");
|
66
|
-
this.nodes.delete(conn.clientID);
|
67
|
-
}
|
125
|
+
if (!clusterNode.ws.length) {
|
126
|
+
(0, LogService_1.logInfo)("HUBService: cluster node disconnected");
|
127
|
+
this.nodes.delete(conn.options.targetID);
|
68
128
|
}
|
69
129
|
}
|
70
130
|
}
|
71
131
|
exports.HUBService = HUBService;
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSFVCU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvSFVCU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQkFBZ0Q7QUFDaEQsNkNBQStDO0FBQy9DLCtDQUE0QztBQUM1QywyREFBd0Q7QUFDeEQsNkNBQWlEO0FBQ2pELG1EQUE2QztBQUU3QywrRUFBdUQ7QUEwQjFDLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxvQkFBRyxDQUFzRCxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUU1SCxNQUFhLFVBQVcsU0FBUSx5QkFBVztJQUUxQyxPQUFPLENBQW9CO0lBQzNCLEtBQUssR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3QyxRQUFRLEdBQThELEVBQUUsQ0FBQztJQUV6RSxZQUFZLE9BQTBCO1FBQ3JDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2YsSUFBSSxvQkFBRyxDQUF3QyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBRTVELElBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUN2QyxPQUFPLEVBQUMsR0FBRyx1QkFBYSxDQUFDLFdBQVcsRUFBQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsQ0FBQTtnQkFHdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxJQUFHLENBQUMsZUFBZTtvQkFDbEIsT0FBTyxFQUFDLEdBQUcsdUJBQWEsQ0FBQyxXQUFXLEVBQUMsT0FBTyxFQUFDLDJDQUEyQyxFQUFDLENBQUE7Z0JBRzFGLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsS0FBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFDO29CQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsSUFBRyxXQUFXLEVBQUM7d0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQzs0QkFDWCxHQUFHLEVBQUMsV0FBVyxDQUFDLEdBQUc7NEJBQ25CLFNBQVMsRUFBQyxXQUFXLENBQUMsU0FBUzs0QkFDL0IsRUFBRSxFQUFDLFdBQVcsQ0FBQyxTQUFTO3lCQUN4QixDQUFDLENBQUE7cUJBQ0Y7b0JBRUQsSUFBRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsRUFBRSxDQUFBLENBQUMsS0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUcsQ0FBQzt3QkFDdkQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN0QztnQkFFRCxPQUFPLE1BQU0sQ0FBQztZQUVmLENBQUMsRUFBRSxXQUFXLENBQUM7U0FDZixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1QsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSw0QkFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9DLE1BQU0sR0FBRyxHQUFHLElBQUksb0JBQWUsQ0FBQztZQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDbkIsSUFBSSxFQUFFLE1BQU07U0FDWixDQUFDLENBQUE7UUFFRixHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQzNCLE1BQU0sSUFBSSxHQUFrQixJQUFJLDZCQUFhLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxVQUFVO2dCQUVyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUMzQixjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO2dCQUN6QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsTUFBTTtnQkFHdEMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsZUFBZSxFQUFFLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxJQUFJO2dCQUVmLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDNUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3ZCLENBQUMsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QixPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzFDLENBQUMsQ0FBQyxDQUFBO0lBRUgsQ0FBQztJQUVELHNCQUFzQixDQUFDLElBQW1CO1FBRXpDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUMzQixJQUFBLHFCQUFRLEVBQUMsNENBQTRDLENBQUMsQ0FBQTtZQUN0RCxPQUFPO1NBQ1A7UUFFRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDakIsSUFBQSxvQkFBTyxFQUFDLHdDQUF3QyxDQUFDLENBQUE7WUFDakQsV0FBVyxHQUFHO2dCQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQ2hDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVU7Z0JBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWdCO2dCQUN4QyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUN2QyxFQUFFLEVBQUUsRUFBRTtnQkFDTixTQUFTLEVBQUMsRUFBRTthQUNaLENBQUE7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUNuRDtRQUVELFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUEsb0JBQU8sRUFBQyw2REFBNkQsQ0FBQyxDQUFBO1FBR3RFLEtBQUksSUFBSSxDQUFDLEVBQUUsRUFBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFDO1lBQ2xDLEtBQUksSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBQztnQkFDOUIsSUFBRyxDQUFDLEtBQUcsV0FBVyxDQUFDLFNBQVMsRUFBQztvQkFFNUIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBLEVBQUU7d0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQ04sTUFBTSxFQUFDLG1CQUFtQjs0QkFDMUIsSUFBSSxFQUFDO2dDQUNKLEdBQUcsRUFBQyxXQUFZLENBQUMsR0FBRztnQ0FDcEIsU0FBUyxFQUFDLFdBQVksQ0FBQyxTQUFTO2dDQUNoQyxFQUFFLEVBQUMsV0FBWSxDQUFDLFNBQVM7NkJBQ3pCOzRCQUNELFVBQVUsRUFBQyxDQUFDO3lCQUNaLENBQUMsQ0FBQTtvQkFDSCxDQUFDLENBQUMsQ0FBQTtpQkFDRjthQUNEO1NBQ0Q7SUFDRixDQUFDO0lBR0Qsa0JBQWtCLENBQUMsSUFBbUI7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQzNCLElBQUEscUJBQVEsRUFBQyw0Q0FBNEMsQ0FBQyxDQUFBO1lBQ3RELE9BQU87U0FDUDtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNqQixJQUFBLHFCQUFRLEVBQUMsb0NBQW9DLENBQUMsQ0FBQTtZQUM5QyxPQUFPO1NBQ1A7UUFFRCxXQUFXLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUEsb0JBQU8sRUFBQywrQkFBK0IsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUMzQixJQUFBLG9CQUFPLEVBQUMsdUNBQXVDLENBQUMsQ0FBQTtZQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBRXpDO0lBQ0YsQ0FBQztDQUNEO0FBdkpELGdDQXVKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXZWJTb2NrZXQsIHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyBSRVFfSFRUUF9TRVJWRVIgfSBmcm9tIFwiLi9BUElTZXJ2aWNlXCI7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gXCIuL0Jhc2VTZXJ2aWNlXCI7XG5pbXBvcnQgeyBIVUJDb25uZWN0aW9uIH0gZnJvbSBcIi4vY2x1c3Rlci9IVUJDb25uZWN0aW9uXCI7XG5pbXBvcnQgeyBsb2dFcnJvciwgbG9nSW5mbyB9IGZyb20gXCIuL0xvZ1NlcnZpY2VcIjtcbmltcG9ydCBTaWduYWwsIHsgUmVxIH0gZnJvbSBcImJhZG1mY2stc2lnbmFsXCI7XG5pbXBvcnQgeyBJRXJyb3IgfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL0ludGVyZmFjZXNcIjtcbmltcG9ydCBEZWZhdWx0RXJyb3JzIGZyb20gXCIuL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHsgSVBhcnR5SG9zdCB9IGZyb20gXCIuL0NsdXN0ZXJTZXJ2aWNlXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBIVUJTZXJ2aWNlT3B0aW9ucyB7XG5cdGhvc3RJRDogc3RyaW5nLFxuXHRob3N0UHVibGljS2V5OiBzdHJpbmcsXG5cdGhvc3RQcml2YXRlS2V5OiBzdHJpbmcsXG5cdGhvc3RVUkw6IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2x1c3Rlck5vZGUge1xuXHRjbHVzdGVySUQ6IHN0cmluZyxcblx0dXJsOiBzdHJpbmcsXG5cdHB1YmxpY0tleTogc3RyaW5nLFxuXHRwcml2YXRlS2V5OiBzdHJpbmcsXG5cdHdzOiBIVUJDb25uZWN0aW9uW10sXG5cdHdhdGNobGlzdDpzdHJpbmdbXSAvLyBwYXJ0aWVzIGlkIHRoYXQgdGhpcyBjbHVzdGVyIGNhbiBjb25uZWN0IHRvXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYnNvY2tldFBhY2tldDxUID0gYW55PiB7XG5cdGRhdGE6IFQsXG5cdGF1dGhvcml6ZWQ6IGJvb2xlYW5cblx0Y29ubmVjdGlvbjogSFVCQ29ubmVjdGlvblxufVxuXG5leHBvcnQgY29uc3QgUkVRX0NMVVNURVJfTk9ERSA9IG5ldyBSZXE8c3RyaW5nLCB7IHVybDogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyB9IHwgSUVycm9yPih1bmRlZmluZWQsIFwiUkVRX0NMVVNURVJfTk9ERVwiKTtcblxuZXhwb3J0IGNsYXNzIEhVQlNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cblx0b3B0aW9uczogSFVCU2VydmljZU9wdGlvbnM7XG5cdG5vZGVzOiBNYXA8c3RyaW5nLCBJQ2x1c3Rlck5vZGU+ID0gbmV3IE1hcCgpO1xuXHRoYW5kbGVyczogKFNpZ25hbDxJV2Vic29ja2V0UGFja2V0PiB8IFJlcTxJV2Vic29ja2V0UGFja2V0LCBhbnk+KVtdID0gW107XG5cblx0Y29uc3RydWN0b3Iob3B0aW9uczogSFVCU2VydmljZU9wdGlvbnMpIHtcblx0XHRzdXBlcihcIkhVQlNlcnZpY2VcIilcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuaGFuZGxlcnMgPSBbXG5cdFx0XHRuZXcgUmVxPElXZWJzb2NrZXRQYWNrZXQsIElQYXJ0eUhvc3RbXXxJRXJyb3I+KGFzeW5jIChyZXEpID0+IHtcblx0XHRcdFx0Ly8gY2hlY2sgaW5jb21pbmcgcGFyYW1zXG5cdFx0XHRcdGlmKCFyZXEuZGF0YSB8fCAhQXJyYXkuaXNBcnJheShyZXEuZGF0YSkpXG5cdFx0XHRcdFx0cmV0dXJuIHsuLi5EZWZhdWx0RXJyb3JzLkJBRF9SRVFVRVNULGRldGFpbHM6XCJkYXRhIGFycmF5IGlzIG5vdCBzZXRcIn1cblxuXHRcdFx0XHQvLyBnZXQgaW5jb21pbmcgY2x1c3RlclxuXHRcdFx0XHRjb25zdCBpbmNvbWluZ0NsdXN0ZXIgPSB0aGlzLm5vZGVzLmdldChyZXEuY29ubmVjdGlvbi5vcHRpb25zLnRhcmdldElEID8/IFwiXCIpO1xuXHRcdFx0XHRpZighaW5jb21pbmdDbHVzdGVyKVxuXHRcdFx0XHRcdHJldHVybiB7Li4uRGVmYXVsdEVycm9ycy5CQURfUkVRVUVTVCxkZXRhaWxzOlwiY2x1c3RlciBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiBub3QgZm91bmRcIn1cblxuXHRcdFx0XHQvLyBjaGVja1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBbXTsgXG5cdFx0XHRcdGZvcihsZXQgaSBvZiByZXEuZGF0YSl7XG5cdFx0XHRcdFx0Y29uc3QgY2x1c3Rlck5vZGUgPSB0aGlzLm5vZGVzLmdldChpKTtcblx0XHRcdFx0XHRpZihjbHVzdGVyTm9kZSl7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHVybDpjbHVzdGVyTm9kZS51cmwsXG5cdFx0XHRcdFx0XHRcdHB1YmxpY0tleTpjbHVzdGVyTm9kZS5wdWJsaWNLZXksXG5cdFx0XHRcdFx0XHRcdGlkOmNsdXN0ZXJOb2RlLmNsdXN0ZXJJRFx0XHRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoaW5jb21pbmdDbHVzdGVyLndhdGNobGlzdC5maWx0ZXIoeD0+eD09PWkpLmxlbmd0aD09PTApXG5cdFx0XHRcdFx0XHRpbmNvbWluZ0NsdXN0ZXIud2F0Y2hsaXN0LnB1c2goaStcIlwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHRcdH0sIFwiUkVRX1BBUlRZXCIpXG5cdFx0XTtcblx0fVxuXG5cdGFzeW5jIGluaXQoKSB7XG5cdFx0c3VwZXIuaW5pdCgpO1xuXHR9XG5cblx0YXN5bmMgYXBwbGljYXRpb25SZWFkeSgpIHtcblx0XHRjb25zdCBzZXJ2ZXIgPSBhd2FpdCBSRVFfSFRUUF9TRVJWRVIucmVxdWVzdCgpO1xuXG5cdFx0Y29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7XG5cdFx0XHRzZXJ2ZXI6IHNlcnZlci5odHRwLFxuXHRcdFx0cGF0aDogXCIvaHViXCJcblx0XHR9KVxuXG5cdFx0d3NzLm9uKFwiY29ubmVjdGlvblwiLCAod3MpID0+IHtcblx0XHRcdGNvbnN0IGNvbm46IEhVQkNvbm5lY3Rpb24gPSBuZXcgSFVCQ29ubmVjdGlvbih7XG5cdFx0XHRcdHdzOiB3cyxcblx0XHRcdFx0ZGlyZWN0aW9uOiBcImluY29taW5nXCIsXG5cblx0XHRcdFx0aG9zdElEOiB0aGlzLm9wdGlvbnMuaG9zdElELFxuXHRcdFx0XHRob3N0UHJpdmF0ZUtleTogdGhpcy5vcHRpb25zLmhvc3RQcml2YXRlS2V5LFxuXHRcdFx0XHRob3N0UHVibGljS2V5OiB0aGlzLm9wdGlvbnMuaG9zdFB1YmxpY0tleSxcblx0XHRcdFx0aG9zdFVSTDogdGhpcy5vcHRpb25zLmhvc3RVUkwgKyBcIi9odWJcIixcblxuXHRcdFx0XHQvLyB3aWxsIGJlIGZpbGxlZCBhZnRlciBhdXRob3JpemF0aW9uXG5cdFx0XHRcdHRhcmdldElEOiBudWxsLFxuXHRcdFx0XHR0YXJnZXRQdWJsaWNLZXk6IG51bGwsXG5cdFx0XHRcdHRhcmdldFVSTDogbnVsbCxcblxuXHRcdFx0XHRvbkF1dGhvcml6ZWQ6ICgpID0+IHRoaXMub25Db25uZWN0aW9uQXV0aG9yaXplZChjb25uKSxcblx0XHRcdFx0b25DbG9zZTogKCkgPT4gdGhpcy5vbkNvbm5lY3Rpb25DbG9zZWQoY29ubiksXG5cdFx0XHRcdGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzXG5cdFx0XHR9KVxuXHRcdH0pXG5cblx0XHR3c3Mub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiSFVCU2VydmljZTogZXJyb3I6IFwiLCBlcnIpXG5cdFx0fSlcblxuXHR9XG5cblx0b25Db25uZWN0aW9uQXV0aG9yaXplZChjb25uOiBIVUJDb25uZWN0aW9uKSB7XG5cdFx0XG5cdFx0aWYgKCFjb25uLm9wdGlvbnMudGFyZ2V0SUQpIHtcblx0XHRcdGxvZ0Vycm9yKFwiSFVCU2VydmljZTogY29ubmVjdGlvbiB0YXJnZXRJRCBpcyBub3Qgc2V0XCIpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGNsdXN0ZXJOb2RlID0gdGhpcy5ub2Rlcy5nZXQoY29ubi5vcHRpb25zLnRhcmdldElEKVxuXG5cdFx0aWYgKCFjbHVzdGVyTm9kZSkge1xuXHRcdFx0bG9nSW5mbyhcIkhVQlNlcnZpY2U6IG5ldyBjbHVzdGVyIG5vZGUgY29ubmVjdGVkXCIpXG5cdFx0XHRjbHVzdGVyTm9kZSA9IHtcblx0XHRcdFx0Y2x1c3RlcklEOiBjb25uLm9wdGlvbnMudGFyZ2V0SUQsXG5cdFx0XHRcdHVybDogY29ubi5vcHRpb25zLnRhcmdldFVSTCEsXG5cdFx0XHRcdHB1YmxpY0tleTogY29ubi5vcHRpb25zLnRhcmdldFB1YmxpY0tleSEsXG5cdFx0XHRcdHByaXZhdGVLZXk6IGNvbm4ub3B0aW9ucy5ob3N0UHJpdmF0ZUtleSxcblx0XHRcdFx0d3M6IFtdLFxuXHRcdFx0XHR3YXRjaGxpc3Q6W11cblx0XHRcdH1cblx0XHRcdHRoaXMubm9kZXMuc2V0KGNvbm4ub3B0aW9ucy50YXJnZXRJRCwgY2x1c3Rlck5vZGUpO1xuXHRcdH1cblxuXHRcdGNsdXN0ZXJOb2RlLndzLnB1c2goY29ubik7XG5cdFx0bG9nSW5mbyhcIkhVQlNlcnZpY2U6IG5ldyBhdXRob3JpemVkIGNvbm5lY3Rpb24gYWRkZWQgdG8gY2x1c3RlciBub2RlXCIpXG5cblx0XHQvLyBGSU5EIElOIFdBVENITElTVFxuXHRcdGZvcihsZXQgW2lkLGNsdXN0ZXJdIG9mIHRoaXMubm9kZXMpe1xuXHRcdFx0Zm9yKGxldCBpIG9mIGNsdXN0ZXIud2F0Y2hsaXN0KXtcblx0XHRcdFx0aWYoaT09PWNsdXN0ZXJOb2RlLmNsdXN0ZXJJRCl7XG5cdFx0XHRcdFx0Ly8gc2VuZCB0byBjbHVzdGVyXG5cdFx0XHRcdFx0Y2x1c3Rlci53cy5mb3JFYWNoKHg9Pntcblx0XHRcdFx0XHRcdHguc2VuZCh7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDpcIlNfUEFSVFlfQVZBSUxBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdGRhdGE6e1xuXHRcdFx0XHRcdFx0XHRcdHVybDpjbHVzdGVyTm9kZSEudXJsLFxuXHRcdFx0XHRcdFx0XHRcdHB1YmxpY0tleTpjbHVzdGVyTm9kZSEucHVibGljS2V5LFxuXHRcdFx0XHRcdFx0XHRcdGlkOmNsdXN0ZXJOb2RlIS5jbHVzdGVySURcdFx0XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrSUQ6MFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblxuXHRvbkNvbm5lY3Rpb25DbG9zZWQoY29ubjogSFVCQ29ubmVjdGlvbikge1xuXHRcdFxuXHRcdGlmICghY29ubi5vcHRpb25zLnRhcmdldElEKSB7XG5cdFx0XHRsb2dFcnJvcihcIkhVQlNlcnZpY2U6IGNvbm5lY3Rpb24gdGFyZ2V0SUQgaXMgbm90IHNldFwiKVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRjb25zdCBjbHVzdGVyTm9kZSA9IHRoaXMubm9kZXMuZ2V0KGNvbm4ub3B0aW9ucy50YXJnZXRJRCk7XG5cblx0XHRpZiAoIWNsdXN0ZXJOb2RlKSB7XG5cdFx0XHRsb2dFcnJvcihcIkhVQlNlcnZpY2U6IGNsdXN0ZXIgbm9kZSBub3QgZm91bmRcIilcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjbHVzdGVyTm9kZS53cyA9IGNsdXN0ZXJOb2RlLndzLmZpbHRlcih4ID0+IHggIT09IGNvbm4pO1xuXG5cdFx0bG9nSW5mbyhcIkhVQlNlcnZpY2U6IGNvbm5lY3Rpb24gY2xvc2VkXCIpXG5cdFx0aWYgKCFjbHVzdGVyTm9kZS53cy5sZW5ndGgpIHtcblx0XHRcdGxvZ0luZm8oXCJIVUJTZXJ2aWNlOiBjbHVzdGVyIG5vZGUgZGlzY29ubmVjdGVkXCIpXG5cdFx0XHR0aGlzLm5vZGVzLmRlbGV0ZShjb25uLm9wdGlvbnMudGFyZ2V0SUQpO1xuXHRcdFx0XG5cdFx0fVxuXHR9XG59Il19
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"HUBService.js","sourceRoot":"","sources":["../../src/apiServer/HUBService.ts"],"names":[],"mappings":"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","sourcesContent":["import WebSocket, { WebSocketServer } from \"ws\";\nimport { REQ_HTTP_SERVER } from \"./APIService\";\nimport { BaseService } from \"./BaseService\";\nimport { HUBConnection } from \"./cluster/HUBConnection\";\nimport { logError, logInfo } from \"./LogService\";\nimport Signal, { Req } from \"badmfck-signal\";\nimport { IError } from \"./structures/Interfaces\";\nimport DefaultErrors from \"./structures/DefaultErrors\";\nimport { IPartyHost } from \"./ClusterService\";\n\n\nexport interface HUBServiceOptions {\n\thostID: string,\n\thostPublicKey: string,\n\thostPrivateKey: string,\n\thostURL: string,\n}\n\nexport interface IClusterNode {\n\tclusterID: string,\n\turl: string,\n\tpublicKey: string,\n\tprivateKey: string,\n\tws: HUBConnection[],\n\twatchlist:string[] // parties id that this cluster can connect to\n}\n\nexport interface IWebsocketPacket<T = any> {\n\tdata: T,\n\tauthorized: boolean\n\tconnection: HUBConnection\n}\n\nexport const REQ_CLUSTER_NODE = new Req<string, { url: string, publicKey: string } | IError>(undefined, \"REQ_CLUSTER_NODE\");\n\nexport class HUBService extends BaseService {\n\n\toptions: HUBServiceOptions;\n\tnodes: Map<string, IClusterNode> = new Map();\n\thandlers: (Signal<IWebsocketPacket> | Req<IWebsocketPacket, any>)[] = [];\n\n\tconstructor(options: HUBServiceOptions) {\n\t\tsuper(\"HUBService\")\n\t\tthis.options = options;\n\t\tthis.handlers = [\n\t\t\tnew Req<IWebsocketPacket, IPartyHost[]|IError>(async (req) => {\n\t\t\t\t// check incoming params\n\t\t\t\tif(!req.data || !Array.isArray(req.data))\n\t\t\t\t\treturn {...DefaultErrors.BAD_REQUEST,details:\"data array is not set\"}\n\n\t\t\t\t// get incoming cluster\n\t\t\t\tconst incomingCluster = this.nodes.get(req.connection.options.targetID ?? \"\");\n\t\t\t\tif(!incomingCluster)\n\t\t\t\t\treturn {...DefaultErrors.BAD_REQUEST,details:\"cluster for incoming connection not found\"}\n\n\t\t\t\t// check\n\t\t\t\tconst result = []; \n\t\t\t\tfor(let i of req.data){\n\t\t\t\t\tconst clusterNode = this.nodes.get(i);\n\t\t\t\t\tif(clusterNode){\n\t\t\t\t\t\tresult.push({\n\t\t\t\t\t\t\turl:clusterNode.url,\n\t\t\t\t\t\t\tpublicKey:clusterNode.publicKey,\n\t\t\t\t\t\t\tid:clusterNode.clusterID\t\t\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\tif(incomingCluster.watchlist.filter(x=>x===i).length===0)\n\t\t\t\t\t\tincomingCluster.watchlist.push(i+\"\");\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t}, \"REQ_PARTY\")\n\t\t];\n\t}\n\n\tasync init() {\n\t\tsuper.init();\n\t}\n\n\tasync applicationReady() {\n\t\tconst server = await REQ_HTTP_SERVER.request();\n\n\t\tconst wss = new WebSocketServer({\n\t\t\tserver: server.http,\n\t\t\tpath: \"/hub\"\n\t\t})\n\n\t\twss.on(\"connection\", (ws) => {\n\t\t\tconst conn: HUBConnection = new HUBConnection({\n\t\t\t\tws: ws,\n\t\t\t\tdirection: \"incoming\",\n\n\t\t\t\thostID: this.options.hostID,\n\t\t\t\thostPrivateKey: this.options.hostPrivateKey,\n\t\t\t\thostPublicKey: this.options.hostPublicKey,\n\t\t\t\thostURL: this.options.hostURL + \"/hub\",\n\n\t\t\t\t// will be filled after authorization\n\t\t\t\ttargetID: null,\n\t\t\t\ttargetPublicKey: null,\n\t\t\t\ttargetURL: null,\n\n\t\t\t\tonAuthorized: () => this.onConnectionAuthorized(conn),\n\t\t\t\tonClose: () => this.onConnectionClosed(conn),\n\t\t\t\thandlers: this.handlers\n\t\t\t})\n\t\t})\n\n\t\twss.on(\"error\", (err) => {\n\t\t\tconsole.error(\"HUBService: error: \", err)\n\t\t})\n\n\t}\n\n\tonConnectionAuthorized(conn: HUBConnection) {\n\t\t\n\t\tif (!conn.options.targetID) {\n\t\t\tlogError(\"HUBService: connection targetID is not set\")\n\t\t\treturn;\n\t\t}\n\n\t\tlet clusterNode = this.nodes.get(conn.options.targetID)\n\n\t\tif (!clusterNode) {\n\t\t\tlogInfo(\"HUBService: new cluster node connected\")\n\t\t\tclusterNode = {\n\t\t\t\tclusterID: conn.options.targetID,\n\t\t\t\turl: conn.options.targetURL!,\n\t\t\t\tpublicKey: conn.options.targetPublicKey!,\n\t\t\t\tprivateKey: conn.options.hostPrivateKey,\n\t\t\t\tws: [],\n\t\t\t\twatchlist:[]\n\t\t\t}\n\t\t\tthis.nodes.set(conn.options.targetID, clusterNode);\n\t\t}\n\n\t\tclusterNode.ws.push(conn);\n\t\tlogInfo(\"HUBService: new authorized connection added to cluster node\")\n\n\t\t// FIND IN WATCHLIST\n\t\tfor(let [id,cluster] of this.nodes){\n\t\t\tconsole.log(\"find id in watchlist throught clusters\")\n\t\t\tfor(let i of cluster.watchlist){\n\t\t\t\tif(i===clusterNode.clusterID){\n\t\t\t\t\t// send to cluster\n\t\t\t\t\tcluster.ws.forEach(x=>{\n\t\t\t\t\t\tx.send({\n\t\t\t\t\t\t\tmethod:\"S_PARTY_AVAILABLE\",\n\t\t\t\t\t\t\tdata:{\n\t\t\t\t\t\t\t\turl:clusterNode!.url,\n\t\t\t\t\t\t\t\tpublicKey:clusterNode!.publicKey,\n\t\t\t\t\t\t\t\tid:clusterNode!.clusterID\t\t\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcallbackID:1\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\tonConnectionClosed(conn: HUBConnection) {\n\t\t\n\t\tif (!conn.options.targetID) {\n\t\t\tlogError(\"HUBService: connection targetID is not set\")\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst clusterNode = this.nodes.get(conn.options.targetID);\n\n\t\tif (!clusterNode) {\n\t\t\tlogError(\"HUBService: cluster node not found\")\n\t\t\treturn;\n\t\t}\n\n\t\tclusterNode.ws = clusterNode.ws.filter(x => x !== conn);\n\n\t\tlogInfo(\"HUBService: connection closed\")\n\t\tif (!clusterNode.ws.length) {\n\t\t\tlogInfo(\"HUBService: cluster node disconnected\")\n\t\t\tthis.nodes.delete(conn.options.targetID);\n\t\t}\n\t}\n}"]}
|
@@ -30,3 +30,4 @@ const LocalRequest = async (ep, data, method, headers) => {
|
|
30
30
|
console.log(resp);
|
31
31
|
};
|
32
32
|
exports.LocalRequest = LocalRequest;
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9jYWxSZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaVNlcnZlci9Mb2NhbFJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQXdFO0FBc0NqRSxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsRUFBVSxFQUFFLElBQVUsRUFBRSxNQUFlLEVBQUMsT0FBOEIsRUFBRSxFQUFFO0lBQzVHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUNiLElBQUksTUFBTTtRQUNULENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDMUIsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNO1FBQ2xCLENBQUMsR0FBRyxNQUFNLENBQUE7SUFFWCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3JCLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JCLElBQUksR0FBRyxHQUFHLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztJQUV4QyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3RDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDOUIsSUFBSTtRQUNILElBQUksQ0FBQyxLQUFLLEtBQUs7WUFDZCxJQUFJLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxFQUFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLE1BQU07WUFDZixJQUFJLEdBQUcsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsRUFBQyxPQUFPLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQTtLQUNyRDtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBQyxDQUFDLENBQUMsQ0FBQTtLQUNyQztJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDbEIsQ0FBQyxDQUFBO0FBekJZLFFBQUEsWUFBWSxnQkF5QnhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVzcG9uc2UsIEludGVybmFsQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcImF4aW9zXCJcblxuLypheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHg6SW50ZXJuYWxBeGlvc1JlcXVlc3RDb25maWc8YW55Pik9Pntcblx0Y29uc29sZS5sb2coYEFYSU9TIFJFUTpcXG5cXHR1cmw6JHt4LnVybH1cXG5cXHRtZXRob2Q6ICR7eC5tZXRob2R9XFxuXFx0ZGF0YTogJHsoKCk9Pntcblx0XHRpZih0eXBlb2YgeC5kYXRhID09PSBcInN0cmluZ1wiIClcblx0XHRcdHJldHVybiB4LmRhdGFcblxuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh4LmRhdGEsbnVsbCxcIlxcdFxcdFwiKTtcblx0fSkoKX1cXG5cXHRoZWFkZXJzOlxcbiR7KCgpPT57XG5cdFx0bGV0IGggPSBcIlwiO1xuXHRcdGZvcihsZXQgaSBpbiB4LmhlYWRlcnMpe1xuXHRcdFx0aWYoaCE9PVwiXCIpXG5cdFx0XHRcdGgrPVwiXFxuXCJcblx0XHRcdGgrPVwiXFx0XFx0XCIraStcIiA9IFwiK3guaGVhZGVyc1tpXVxuXHRcdH1cblx0XHRyZXR1cm4gaFxuXHR9KSgpfWApXG5cdHJldHVybiB4O1xufSlcblxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZSgoeDpBeGlvc1Jlc3BvbnNlKT0+e1xuXHRjb25zb2xlLmxvZyhgQVhJT1MgUkVTUDpcXG5cXHRkYXRhOiAkeygoKT0+e1xuXHRcdGlmKHR5cGVvZiB4LmRhdGEgPT09IFwic3RyaW5nXCIgKVxuXHRcdFx0cmV0dXJuIHguZGF0YVxuXG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHguZGF0YSxudWxsLFwiXFx0XFx0XCIpO1xuXHR9KSgpfVxcblxcdGhlYWRlcnM6XFxuJHsoKCk9Pntcblx0XHRsZXQgaCA9IFwiXCI7XG5cdFx0Zm9yKGxldCBpIGluIHguaGVhZGVycyl7XG5cdFx0XHRpZihoIT09XCJcIilcblx0XHRcdFx0aCs9XCJcXG5cIlxuXHRcdFx0aCs9XCJcXHRcXHRcIitpK1wiID0gXCIreC5oZWFkZXJzW2ldXG5cdFx0fVxuXHRcdHJldHVybiBoXG5cdH0pKCl9YClcblx0cmV0dXJuIHg7XG59KSovXG5cbmV4cG9ydCBjb25zdCBMb2NhbFJlcXVlc3QgPSBhc3luYyAoZXA6IHN0cmluZywgZGF0YT86IGFueSwgbWV0aG9kPzogc3RyaW5nLGhlYWRlcnM/Ontba2V5OnN0cmluZ106c3RyaW5nfSkgPT4ge1xuXHRsZXQgbSA9IFwiZ2V0XCJcblx0aWYgKG1ldGhvZClcblx0XHRtID0gbWV0aG9kLnRvTG93ZXJDYXNlKCk7XG5cdGlmIChkYXRhICYmICFtZXRob2QpXG5cdFx0bSA9IFwicG9zdFwiXG5cblx0aWYgKGVwLnN0YXJ0c1dpdGgoXCIvXCIpKVxuXHRcdGVwID0gZXAuc3Vic3RyaW5nKDEpXG5cdGxldCB1cmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA5MS9cIiArIGVwO1xuXHRcblx0aWYgKGVwLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImh0dHBcIikpXG5cdFx0dXJsID0gZXA7XG5cblx0bGV0IHJlc3AgPSBudWxsO1xuXHRjb25zb2xlLmxvZyhcIm9wZW4gdXJsOiBcIiwgdXJsKVxuXHR0cnkge1xuXHRcdGlmIChtID09PSBcImdldFwiKVxuXHRcdFx0cmVzcCA9IGF3YWl0IGF4aW9zLmdldCh1cmwse2hlYWRlcnM6aGVhZGVyc30pO1xuXHRcdGlmIChtID09PSBcInBvc3RcIilcblx0XHRcdHJlc3AgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgZGF0YSx7aGVhZGVyczpoZWFkZXJzfSlcblx0fSBjYXRjaCAoZSkge1xuXHRcdGNvbnNvbGUubG9nKFwiRVJST1IhIGNhbnQgb3BlbiB1cmxcIixlKVxuXHR9XG5cdGNvbnNvbGUubG9nKHJlc3ApXG59XG4iXX0=
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LocalRequest.js","sourceRoot":"","sources":["../../src/apiServer/LocalRequest.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAwE;AAsCjE,MAAM,YAAY,GAAG,KAAK,EAAE,EAAU,EAAE,IAAU,EAAE,MAAe,EAAC,OAA8B,EAAE,EAAE;IAC5G,IAAI,CAAC,GAAG,KAAK,CAAA;IACb,IAAI,MAAM;QACT,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC,MAAM;QAClB,CAAC,GAAG,MAAM,CAAA;IAEX,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACrB,IAAI,GAAG,GAAG,wBAAwB,GAAG,EAAE,CAAC;IAExC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,GAAG,GAAG,EAAE,CAAC;IAEV,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IAC9B,IAAI;QACH,IAAI,CAAC,KAAK,KAAK;YACd,IAAI,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAC,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,MAAM;YACf,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAC,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAA;KACrD;IAAC,OAAO,CAAC,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAC,CAAC,CAAC,CAAA;KACrC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAClB,CAAC,CAAA;AAzBY,QAAA,YAAY,gBAyBxB","sourcesContent":["import axios, { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\n\n/*axios.interceptors.request.use((x:InternalAxiosRequestConfig<any>)=>{\n\tconsole.log(`AXIOS REQ:\\n\\turl:${x.url}\\n\\tmethod: ${x.method}\\n\\tdata: ${(()=>{\n\t\tif(typeof x.data === \"string\" )\n\t\t\treturn x.data\n\n\t\treturn JSON.stringify(x.data,null,\"\\t\\t\");\n\t})()}\\n\\theaders:\\n${(()=>{\n\t\tlet h = \"\";\n\t\tfor(let i in x.headers){\n\t\t\tif(h!==\"\")\n\t\t\t\th+=\"\\n\"\n\t\t\th+=\"\\t\\t\"+i+\" = \"+x.headers[i]\n\t\t}\n\t\treturn h\n\t})()}`)\n\treturn x;\n})\n\naxios.interceptors.response.use((x:AxiosResponse)=>{\n\tconsole.log(`AXIOS RESP:\\n\\tdata: ${(()=>{\n\t\tif(typeof x.data === \"string\" )\n\t\t\treturn x.data\n\n\t\treturn JSON.stringify(x.data,null,\"\\t\\t\");\n\t})()}\\n\\theaders:\\n${(()=>{\n\t\tlet h = \"\";\n\t\tfor(let i in x.headers){\n\t\t\tif(h!==\"\")\n\t\t\t\th+=\"\\n\"\n\t\t\th+=\"\\t\\t\"+i+\" = \"+x.headers[i]\n\t\t}\n\t\treturn h\n\t})()}`)\n\treturn x;\n})*/\n\nexport const LocalRequest = async (ep: string, data?: any, method?: string,headers?:{[key:string]:string}) => {\n\tlet m = \"get\"\n\tif (method)\n\t\tm = method.toLowerCase();\n\tif (data && !method)\n\t\tm = \"post\"\n\n\tif (ep.startsWith(\"/\"))\n\t\tep = ep.substring(1)\n\tlet url = \"http://localhost:8091/\" + ep;\n\t\n\tif (ep.toLowerCase().startsWith(\"http\"))\n\t\turl = ep;\n\n\tlet resp = null;\n\tconsole.log(\"open url: \", url)\n\ttry {\n\t\tif (m === \"get\")\n\t\t\tresp = await axios.get(url,{headers:headers});\n\t\tif (m === \"post\")\n\t\t\tresp = await axios.post(url, data,{headers:headers})\n\t} catch (e) {\n\t\tconsole.log(\"ERROR! cant open url\",e)\n\t}\n\tconsole.log(resp)\n}\n"]}
|
@@ -216,3 +216,4 @@ class LogService extends BaseService_1.BaseService {
|
|
216
216
|
}
|
217
217
|
}
|
218
218
|
exports.LogService = LogService;
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvTG9nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlFQUE2QztBQUM3QywrQ0FBNEM7QUFFNUMsSUFBWSxTQU1YO0FBTkQsV0FBWSxTQUFTO0lBQ2pCLHVDQUFLLENBQUE7SUFDTCx5Q0FBTSxDQUFBO0lBQ04seUNBQU0sQ0FBQTtJQUNOLDJDQUFPLENBQUE7SUFDUCx5Q0FBTSxDQUFBO0FBQ1YsQ0FBQyxFQU5XLFNBQVMseUJBQVQsU0FBUyxRQU1wQjtBQWtCTSxNQUFNLG9CQUFvQixHQUFDLEdBQXFCLEVBQUU7SUFDckQsT0FBTztRQUNILFNBQVMsRUFBQyxHQUFHO1FBQ2IsU0FBUyxFQUFDLElBQUk7UUFDZCxLQUFLLEVBQUMsU0FBUyxDQUFDLEdBQUc7S0FDdEIsQ0FBQTtBQUNMLENBQUMsQ0FBQTtBQU5ZLFFBQUEsb0JBQW9CLHdCQU1oQztBQUVNLE1BQU0sT0FBTyxHQUFDLENBQUMsT0FBVyxFQUFDLEdBQUcsUUFBYyxFQUFDLEVBQUUsR0FBQyxhQUFLLENBQUMsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLENBQUMsT0FBTyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQTtBQUF2RyxRQUFBLE9BQU8sV0FBZ0c7QUFDN0csTUFBTSxPQUFPLEdBQUMsQ0FBQyxPQUFXLEVBQUMsR0FBRyxRQUFjLEVBQUMsRUFBRSxHQUFDLGFBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUMsU0FBUyxDQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsQ0FBQyxPQUFPLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFBO0FBQXZHLFFBQUEsT0FBTyxXQUFnRztBQUM3RyxN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QUFHLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtvQkFDbkMsR0FBRyxHQUFHLFlBQVksR0FBQyxJQUFJLENBQUMsSUFBSSxHQUFDLE1BQU0sR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JFO2dCQUFBLE9BQU0sQ0FBQyxFQUFDLEdBQUU7YUFDZDtZQUVELElBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLEdBQUcsR0FBQyxpQkFBaUIsR0FBQyxJQUFJLENBQUMsTUFBTSxDQUFBO1NBRXhDO2FBQUk7WUFDRCxHQUFHLEdBQUMsSUFBSSxHQUFDLEVBQUUsQ0FBQTtTQUNkO1FBRUQsSUFBRyxHQUFHLENBQUMsTUFBTSxHQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBRyxTQUFTLENBQUMsSUFBSTtZQUMxRCxHQUFHLEdBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBQyxjQUFjLEdBQUMsR0FBRyxDQUFDLE1BQU0sR0FBQyxHQUFHLENBQUE7UUFDN0UsT0FBTyxHQUFHLENBQUE7SUFDZCxDQUFDOztBQWpNTCxnQ0FrTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2lnbmFsLCB7IFJlcSB9IGZyb20gXCJiYWRtZmNrLXNpZ25hbFwiO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2UgfSBmcm9tIFwiLi9CYXNlU2VydmljZVwiO1xuXG5leHBvcnQgZW51bSBMT0dfTEVWRUx7XG4gICAgQUxMPTAsXG4gICAgSU5GTz0xLFxuICAgIFdBUk49MixcbiAgICBFUlJPUj0zLFxuICAgIENSSVQ9NFxufVxuZXhwb3J0IGludGVyZmFjZSBJTG9nSXRlbXtcbiAgICBpZDpudW1iZXIsXG4gICAgbGV2ZWw6TE9HX0xFVkVMLFxuICAgIHRpbWU6bnVtYmVyLFxuICAgIHRleHQ6c3RyaW5nXG4gICAgZGF0ZTpzdHJpbmdcbiAgICBzb3VyY2U6c3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ1NlcnZpY2VPcHRpb25ze1xuICAgIG91dHB1dD86KGRhdGE6SUxvZ0l0ZW0pPT52b2lkLFxuICAgIHN0YWNrU2l6ZTpudW1iZXJcbiAgICBsZXZlbDpMT0dfTEVWRUxcbiAgICB0ZXh0TGltaXQ6bnVtYmVyXG4gICAgd2F0Y2hGb3I/OnN0cmluZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0TG9nT3B0aW9ucz0oKTpJTG9nU2VydmljZU9wdGlvbnM9PntcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFja1NpemU6MTAwLFxuICAgICAgICB0ZXh0TGltaXQ6MTAyNCxcbiAgICAgICAgbGV2ZWw6TE9HX0xFVkVMLkFMTFxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ0luZm89KG1lc3NhZ2U6YW55LC4uLm9wdGlvbmFsOmFueVtdKT0+e1NfTE9HLmludm9rZSh7bGV2ZWw6TE9HX0xFVkVMLklORk8sZGF0YTpbbWVzc2FnZSxvcHRpb25hbF19KX1cbmV4cG9ydCBjb25zdCBsb2dXYXJuPShtZXNzYWdlOmFueSwuLi5vcHRpb25hbDphbnlbXSk9PntTX0xPRy5pbnZva2Uoe2xldmVsOkxPR19MRVZFTC5XQVJOLGRhdGE6W21lc3NhZ2Usb3B0aW9uYWxdfSl9XG5leHBvcnQgY29uc3QgbG9nQ3JpdD0obWVzc2FnZTphbnksLi4ub3B0aW9uYWw6YW55W10pPT57U19MT0cuaW52b2tlKHtsZXZlbDpMT0dfTEVWRUwuQ1JJVCxkYXRhOlttZXNzYWdlLG9wdGlvbmFsXX0pfVxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yPShtZXNzYWdlOmFueSwuLi5vcHRpb25hbDphbnlbXSk9PntTX0xPRy5pbnZva2Uoe2xldmVsOkxPR19MRVZFTC5FUlJPUixkYXRhOlttZXNzYWdlLG9wdGlvbmFsXX0pfVxuXG5cbmV4cG9ydCBjb25zdCBTX0xPRz1uZXcgU2lnbmFsPHtsZXZlbDpMT0dfTEVWRUwsZGF0YTphbnlbXX0+KClcbmV4cG9ydCBjb25zdCBTX0xPR19DUkVBVEVEPW5ldyBTaWduYWw8SUxvZ0l0ZW0+KClcbmV4cG9ydCBjb25zdCBTX0xPR19DSEFOR0VfTEVWRUw9bmV3IFNpZ25hbDxMT0dfTEVWRUw+KCk7XG5leHBvcnQgY29uc3QgU19MT0dfRkxVU0g9bmV3IFNpZ25hbDx2b2lkPigpO1xuZXhwb3J0IGNvbnN0IFNfTE9HX0FERF9TRVJWSUNFX1RPX1dBVENIPW5ldyBTaWduYWw8c3RyaW5nPigpO1xuZXhwb3J0IGNvbnN0IFNfTE9HX1JFTU9WRV9TRVJWSUNFX0ZST01fV0FUQ0g9bmV3IFNpZ25hbDxzdHJpbmc+KCk7XG5leHBvcnQgY29uc3QgU19MT0dfU0VUX1RFWFRfTElNSVQ9bmV3IFNpZ25hbDxudW1iZXI+KCk7XG5leHBvcnQgY29uc3QgUkVRX0xPRz1uZXcgUmVxPHtsYXN0SUQ6bnVtYmVyfXxudWxsfHVuZGVmaW5lZCxJTG9nSXRlbVtdPigpO1xuZXhwb3J0IGNvbnN0IFJFUV9MT0dfVU5JUVVFX1NFUlZJQ0VTPW5ldyBSZXE8dm9pZCx7bmFtZTpzdHJpbmcsY291bnQ6bnVtYmVyfVtdPigpO1xuXG5leHBvcnQgY2xhc3MgTG9nU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNle1xuXG4gICAgc3RhdGljIG5leHRJRD0wO1xuICAgIGxvZzpJTG9nSXRlbVtdPVtdO1xuICAgIG9wdGlvbnM6SUxvZ1NlcnZpY2VPcHRpb25zXG4gICAgbGV2ZWw6TE9HX0xFVkVMPUxPR19MRVZFTC5BTExcbiAgICBcbiAgICB1bmlxdWVTZXJ2aWNlczpNYXA8c3RyaW5nLG51bWJlcj49bmV3IE1hcCgpIC8vIHNlcnZpY2UgbmFtZSAobmFtZS5qcykgJiBjb3VudCBvZiBsb2cgcmVxdWVzdHNcblxuICAgIGNvbnN0cnVjdG9yKG9wdD86SUxvZ1NlcnZpY2VPcHRpb25zKXtcbiAgICAgICAgc3VwZXIoXCJMb2dTZXJ2aWNlXCIpO1xuICAgICAgICBpZighb3B0KVxuICAgICAgICAgICAgb3B0PWdldERlZmF1bHRMb2dPcHRpb25zKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucz1vcHQ7XG4gICAgICAgIHRoaXMubGV2ZWwgPSBvcHQubGV2ZWxcbiAgICAgICAgdGhpcy5jaGVja1RleHRMaW1pdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKXtcbiAgICAgICAgXG4gICAgICAgIFJFUV9MT0dfVU5JUVVFX1NFUlZJQ0VTLmxpc3RlbmVyID0gYXN5bmMgKCk9PntcbiAgICAgICAgICAgIGNvbnN0IGFycj1bXTtcbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiB0aGlzLnVuaXF1ZVNlcnZpY2VzKVxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHtuYW1lOmlbMF0sY291bnQ6aVsxXX0pXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgUkVRX0xPRy5saXN0ZW5lciA9IGFzeW5jIChyZXEpID0+IHtcbiAgICAgICAgICAgIGlmKHJlcSAmJiByZXEubGFzdElEKXsgIFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9dGhpcy5sb2cuZmlsdGVyKHZhbD0+dmFsLmlkPnJlcS5sYXN0SUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfWVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnRoaXMubG9nXVxuICAgICAgICB9XG5cbiAgICAgICAgU19MT0dfU0VUX1RFWFRfTElNSVQuc3Vic2NyaWJlKGw9PntcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50ZXh0TGltaXQ9bDtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUZXh0TGltaXQoKTtcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIFNfTE9HX0FERF9TRVJWSUNFX1RPX1dBVENILnN1YnNjcmliZShzZXJ2aWNlPT57XG4gICAgICAgICAgICBpZighdGhpcy5vcHRpb25zLndhdGNoRm9yKVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy53YXRjaEZvcj1bXTtcblxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLndhdGNoRm9yLmZpbmQodmFsPT52YWw9PT1zZXJ2aWNlKSl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TG9nU2VydmljZS5qc31cIixcIlNlcnZpY2UgXFxcIlwiK3NlcnZpY2UrXCJcXFwiIGFsZXJlYWR5IGFkZGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy53YXRjaEZvci5wdXNoKHNlcnZpY2UpO1xuICAgICAgICB9KVxuXG4gICAgICAgIFNfTE9HX1JFTU9WRV9TRVJWSUNFX0ZST01fV0FUQ0guc3Vic2NyaWJlKHNlcnZpY2U9PntcbiAgICAgICAgICAgIGlmKCF0aGlzLm9wdGlvbnMud2F0Y2hGb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy5vcHRpb25zLndhdGNoRm9yLmZpbmRJbmRleCh2YWw9PnZhbD09PXNlcnZpY2UpXG4gICAgICAgICAgICBpZihpPi0xKVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy53YXRjaEZvci5zcGxpY2UoaSwxKTtcbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiJHtMb2dTZXJ2aWNlLmpzfVwiLFwiU2VydmljZSBcXFwiXCIrc2VydmljZStcIlxcXCIgbm90IGRlbGV0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgU19MT0dfQ0hBTkdFX0xFVkVMLnN1YnNjcmliZShsPT57dGhpcy5sZXZlbD1sfSlcblxuICAgICAgICBTX0xPR19GTFVTSC5zdWJzY3JpYmUoKCk9PnRoaXMubG9nPVtdKVxuXG4gICAgICAgIFNfTE9HLnN1YnNjcmliZSgobG9nKT0+e1xuXG4gICAgICAgICAgICBpZihsb2cubGV2ZWw8dGhpcy5sZXZlbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG1zZz1sb2cuZGF0YVswXTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsPWxvZy5kYXRhWzFdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLmNyZWF0ZVRleHQobXNnLGxvZy5sZXZlbCk7XG4gICAgICAgICAgICBsZXQgc291cmNlPVwiXCI7XG4gICAgICAgICAgICBpZih0ZXh0LnN0YXJ0c1dpdGgoXCIke1wiKSAmJiB0ZXh0LmVuZHNXaXRoKFwifVwiKSAmJiB0ZXh0LmluZGV4T2YoXCIuanNcIikhPT0tMSl7XG4gICAgICAgICAgICAgICAgc291cmNlPXRleHQuc3Vic3RyaW5nKDIsdGV4dC5sZW5ndGgtMSk7XG4gICAgICAgICAgICAgICAgdGV4dCA9IFwiXCJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXNjPXRoaXMudW5pcXVlU2VydmljZXMuZ2V0KHNvdXJjZSkgPz8gMDtcbiAgICAgICAgICAgIHRoaXMudW5pcXVlU2VydmljZXMuc2V0KHNvdXJjZSx1c2MrMSlcblxuICAgICAgICAgICAgbGV0IHNob3dsb2c9dHJ1ZTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMud2F0Y2hGb3IgJiYgQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMud2F0Y2hGb3IpICYmIHRoaXMub3B0aW9ucy53YXRjaEZvci5sZW5ndGg+MCl7XG4gICAgICAgICAgICAgICAgc2hvd2xvZz1mYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgb2YgdGhpcy5vcHRpb25zLndhdGNoRm9yKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoc291cmNlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpLnRvTG93ZXJDYXNlKCkpIT09LTEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd2xvZz10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKCFzaG93bG9nICYmIHRoaXMubGV2ZWw9PT1MT0dfTEVWRUwuQ1JJVClcbiAgICAgICAgICAgICAgICBzaG93bG9nPXRydWU7XG5cbiAgICAgICAgICAgIGlmKG9wdGlvbmFsKXtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgb2Ygb3B0aW9uYWwpXG4gICAgICAgICAgICAgICAgICAgIHRleHQrPVwiLCBcIit0aGlzLmNyZWF0ZVRleHQoaSx0aGlzLmxldmVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBsb2dpdGVtOklMb2dJdGVtPXtcbiAgICAgICAgICAgICAgICBsZXZlbDpsb2cubGV2ZWwsXG4gICAgICAgICAgICAgICAgaWQ6TG9nU2VydmljZS5uZXh0SUQrKyxcbiAgICAgICAgICAgICAgICB0ZXh0OnRleHQsXG4gICAgICAgICAgICAgICAgdGltZTpkLmdldFRpbWUoKSxcbiAgICAgICAgICAgICAgICBkYXRlOnRoaXMuY3JlYXRlRGF0ZShkKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6c291cmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG91dHB1dCBhcyBzdHJpbmdcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5vdXRwdXQpeyAgICBcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMub3V0cHV0KGxvZ2l0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmaXJlIGxvZyBpdGVtXG4gICAgICAgICAgICBTX0xPR19DUkVBVEVELmludm9rZShsb2dpdGVtKVxuXG4gICAgICAgICAgICAvLyBhZGQgbG9nIGl0ZW0gdG8gc3RhY2tcbiAgICAgICAgICAgIHRoaXMubG9nLnB1c2gobG9naXRlbSk7XG4gICAgICAgICAgICBsZXQgbGltaXQgPSB0aGlzLm9wdGlvbnMuc3RhY2tTaXplID8/IDEwMFxuICAgICAgICAgICAgaWYobGltaXQ+MTAwMClcbiAgICAgICAgICAgICAgICBsaW1pdCA9IDEwMDBcbiAgICAgICAgICAgIGlmKHRoaXMubG9nLmxlbmd0aD5saW1pdClcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5zaGlmdCgpO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgc3VwZXIuaW5pdCgpO1xuICAgIH1cblxuICAgIGNoZWNrVGV4dExpbWl0KCl7XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy50ZXh0TGltaXQ+MTAyNCo0KVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRleHRMaW1pdD0xMDI0KjRcbiAgICB9XG5cbiAgICBjcmVhdGVEYXRlKGQ/OkRhdGUpOnN0cmluZ3tcbiAgICAgICAgaWYoIWQpXG4gICAgICAgICAgICBkPW5ldyBEYXRlKCk7XG4gICAgICAgIHJldHVybiBkLmdldEZ1bGxZZWFyKCkrXCItXCIrdGhpcy5sZWFkWmVybyhkLmdldE1vbnRoKCkrMSkrXCItXCIrdGhpcy5sZWFkWmVybyhkLmdldERhdGUoKSkrXCIgXCIrdGhpcy5sZWFkWmVybyhkLmdldEhvdXJzKCkpK1wiOlwiK3RoaXMubGVhZFplcm8oZC5nZXRNaW51dGVzKCkpK1wiOlwiK3RoaXMubGVhZFplcm8oZC5nZXRTZWNvbmRzKCkpO1xuICAgIH1cblxuICAgIGxlYWRaZXJvKG51bTpudW1iZXIpOnN0cmluZ3tcbiAgICAgICAgaWYobnVtPDEwKVxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiK251bTtcbiAgICAgICAgcmV0dXJuIG51bStcIlwiXG4gICAgfVxuXG4gICAgY3JlYXRlVGV4dChkYXRhOmFueSxsZXZlbDpMT0dfTEVWRUwpe1xuICAgICAgICBcbiAgICAgICAgaWYoZGF0YSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBcIm51bGxcIlxuXG4gICAgICAgIGlmKGRhdGEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiXG5cbiAgICAgICAgbGV0IHJlcz1cIlwiXG4gICAgICAgIFxuICAgICAgICBpZih0eXBlb2YgZGF0YSA9PT1cIm9iamVjdFwiKXtcbiAgICAgICAgICAgXG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID1KU09OLnN0cmluZ2lmeShkYXRhLG51bGwsXCJcXHRcIilcbiAgICAgICAgICAgICAgICByZXMgPSB0bXAgPz8gXCJcIjtcbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBpZihcInRvU3RyaW5nXCIgaW4gZGF0YSAmJiBkYXRhLnRvU3RyaW5nICYmIHR5cGVvZiBkYXRhLnRvU3RyaW5nID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICBcblxuICAgICAgICAgICAgaWYoYCR7ZGF0YX1gPT09XCJbb2JqZWN0IE1hcF1cIiAmJiBcInNpemVcIiBpbiBkYXRhKXtcbiAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcGFyc2UgbWFwIVxuICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyPVtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgb2YgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHtrZXk6aVswXSx2YWx1ZTppWzFdfSlcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gXCJNQVAgKHNpemU6XCIrZGF0YS5zaXplK1wiKSBcXG5cIitKU09OLnN0cmluZ2lmeShhcnIsbnVsbCxcIlxcdFwiKTtcbiAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KGRhdGEpKVxuICAgICAgICAgICAgICAgIHJlcytcIiwgdG90YWwgaXRlbXM6IFwiK2RhdGEubGVuZ3RoICAgXG5cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXM9ZGF0YStcIlwiXG4gICAgICAgIH1cblxuICAgICAgICBpZihyZXMubGVuZ3RoPnRoaXMub3B0aW9ucy50ZXh0TGltaXQgJiYgbGV2ZWw9PT1MT0dfTEVWRUwuSU5GTylcbiAgICAgICAgICAgIHJlcz1yZXMuc3Vic3RyaW5nKDAsdGhpcy5vcHRpb25zLnRleHRMaW1pdCkrXCIuLi4gKHRvdGFsOiBcIityZXMubGVuZ3RoK1wiKVwiXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG59Il19
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LogService.js","sourceRoot":"","sources":["../../src/apiServer/LogService.ts"],"names":[],"mappings":"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","sourcesContent":["import Signal, { Req } from \"badmfck-signal\";\nimport { BaseService } from \"./BaseService\";\n\nexport enum LOG_LEVEL{\n ALL=0,\n INFO=1,\n WARN=2,\n ERROR=3,\n CRIT=4\n}\nexport interface ILogItem{\n id:number,\n level:LOG_LEVEL,\n time:number,\n text:string\n date:string\n source:string\n}\n\nexport interface ILogServiceOptions{\n output?:(data:ILogItem)=>void,\n stackSize:number\n level:LOG_LEVEL\n textLimit:number\n watchFor?:string[]\n}\n\nexport const getDefaultLogOptions=():ILogServiceOptions=>{\n return {\n stackSize:100,\n textLimit:1024,\n level:LOG_LEVEL.ALL\n }\n}\n\nexport const logInfo=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.INFO,data:[message,optional]})}\nexport const logWarn=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.WARN,data:[message,optional]})}\nexport const logCrit=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.CRIT,data:[message,optional]})}\nexport const logError=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.ERROR,data:[message,optional]})}\n\n\nexport const S_LOG=new Signal<{level:LOG_LEVEL,data:any[]}>()\nexport const S_LOG_CREATED=new Signal<ILogItem>()\nexport const S_LOG_CHANGE_LEVEL=new Signal<LOG_LEVEL>();\nexport const S_LOG_FLUSH=new Signal<void>();\nexport const S_LOG_ADD_SERVICE_TO_WATCH=new Signal<string>();\nexport const S_LOG_REMOVE_SERVICE_FROM_WATCH=new Signal<string>();\nexport const S_LOG_SET_TEXT_LIMIT=new Signal<number>();\nexport const REQ_LOG=new Req<{lastID:number}|null|undefined,ILogItem[]>();\nexport const REQ_LOG_UNIQUE_SERVICES=new Req<void,{name:string,count:number}[]>();\n\nexport class LogService extends BaseService{\n\n static nextID=0;\n log:ILogItem[]=[];\n options:ILogServiceOptions\n level:LOG_LEVEL=LOG_LEVEL.ALL\n \n uniqueServices:Map<string,number>=new Map() // service name (name.js) & count of log requests\n\n constructor(opt?:ILogServiceOptions){\n super(\"LogService\");\n if(!opt)\n opt=getDefaultLogOptions();\n this.options=opt;\n this.level = opt.level\n this.checkTextLimit();\n }\n\n async init(){\n \n REQ_LOG_UNIQUE_SERVICES.listener = async ()=>{\n const arr=[];\n for(let i of this.uniqueServices)\n arr.push({name:i[0],count:i[1]})\n return arr;\n }\n\n REQ_LOG.listener = async (req) => {\n if(req && req.lastID){ \n let result=this.log.filter(val=>val.id>req.lastID)\n return result\n }else\n return [...this.log]\n }\n\n S_LOG_SET_TEXT_LIMIT.subscribe(l=>{\n this.options.textLimit=l;\n this.checkTextLimit();\n })\n \n S_LOG_ADD_SERVICE_TO_WATCH.subscribe(service=>{\n if(!this.options.watchFor)\n this.options.watchFor=[];\n\n if(this.options.watchFor.find(val=>val===service)){\n logCrit(\"${LogService.js}\",\"Service \\\"\"+service+\"\\\" aleready added\");\n return;\n }\n this.options.watchFor.push(service);\n })\n\n S_LOG_REMOVE_SERVICE_FROM_WATCH.subscribe(service=>{\n if(!this.options.watchFor)\n return;\n\n try{\n const i = this.options.watchFor.findIndex(val=>val===service)\n if(i>-1)\n this.options.watchFor.splice(i,1);\n }catch(e){\n logCrit(\"${LogService.js}\",\"Service \\\"\"+service+\"\\\" not deleted\");\n }\n })\n\n S_LOG_CHANGE_LEVEL.subscribe(l=>{this.level=l})\n\n S_LOG_FLUSH.subscribe(()=>this.log=[])\n\n S_LOG.subscribe((log)=>{\n\n if(log.level<this.level)\n return;\n\n const msg=log.data[0];\n const optional=log.data[1];\n let text = this.createText(msg,log.level);\n let source=\"\";\n if(text.startsWith(\"${\") && text.endsWith(\"}\") && text.indexOf(\".js\")!==-1){\n source=text.substring(2,text.length-1);\n text = \"\"\n }\n\n const usc=this.uniqueServices.get(source) ?? 0;\n this.uniqueServices.set(source,usc+1)\n\n let showlog=true;\n if(this.options && this.options.watchFor && Array.isArray(this.options.watchFor) && this.options.watchFor.length>0){\n showlog=false;\n for(let i of this.options.watchFor){\n if(source.toLowerCase().indexOf(i.toLowerCase())!==-1){\n showlog=true;\n break;\n }\n }\n }\n\n if(!showlog && this.level===LOG_LEVEL.CRIT)\n showlog=true;\n\n if(optional){\n for(let i of optional)\n text+=\", \"+this.createText(i,this.level);\n }\n\n const d = new Date();\n const logitem:ILogItem={\n level:log.level,\n id:LogService.nextID++,\n text:text,\n time:d.getTime(),\n date:this.createDate(d),\n source:source\n }\n\n // output as string\n if(this.options.output){ \n this.options.output(logitem);\n }\n\n // fire log item\n S_LOG_CREATED.invoke(logitem)\n\n // add log item to stack\n this.log.push(logitem);\n let limit = this.options.stackSize ?? 100\n if(limit>1000)\n limit = 1000\n if(this.log.length>limit)\n this.log.shift();\n\n })\n\n super.init();\n }\n\n checkTextLimit(){\n if(this.options.textLimit>1024*4)\n this.options.textLimit=1024*4\n }\n\n createDate(d?:Date):string{\n if(!d)\n d=new Date();\n return d.getFullYear()+\"-\"+this.leadZero(d.getMonth()+1)+\"-\"+this.leadZero(d.getDate())+\" \"+this.leadZero(d.getHours())+\":\"+this.leadZero(d.getMinutes())+\":\"+this.leadZero(d.getSeconds());\n }\n\n leadZero(num:number):string{\n if(num<10)\n return \"0\"+num;\n return num+\"\"\n }\n\n createText(data:any,level:LOG_LEVEL){\n \n if(data === null)\n return \"null\"\n\n if(data === undefined)\n return \"undefined\"\n\n let res=\"\"\n \n if(typeof data ===\"object\"){\n \n try{\n const tmp =JSON.stringify(data,null,\"\\t\")\n res = tmp ?? \"\";\n }catch(e){\n if(\"toString\" in data && data.toString && typeof data.toString === \"function\")\n res = data.toString()\n }\n \n\n if(`${data}`===\"[object Map]\" && \"size\" in data){\n // try to parse map!\n try{\n const arr=[];\n for(let i of data)\n arr.push({key:i[0],value:i[1]})\n res = \"MAP (size:\"+data.size+\") \\n\"+JSON.stringify(arr,null,\"\\t\");\n }catch(e){}\n }\n \n if(Array.isArray(data))\n res+\", total items: \"+data.length \n\n }else{\n res=data+\"\"\n }\n\n if(res.length>this.options.textLimit && level===LOG_LEVEL.INFO)\n res=res.substring(0,this.options.textLimit)+\"... (total: \"+res.length+\")\"\n return res\n }\n}"]}
|
@@ -429,9 +429,9 @@ class MysqlService extends BaseService_1.BaseService {
|
|
429
429
|
name: mo.name ?? i,
|
430
430
|
value: mo.value,
|
431
431
|
system: mo.system,
|
432
|
-
ignoreInInsert: mo.
|
433
|
-
ignoreInUpdate: mo.
|
434
|
-
useInReplace: mo.
|
432
|
+
ignoreInInsert: mo.ignoreInInsert,
|
433
|
+
ignoreInUpdate: mo.ignoreInUpdate,
|
434
|
+
useInReplace: mo.useInReplace
|
435
435
|
});
|
436
436
|
}
|
437
437
|
else {
|
@@ -701,3 +701,4 @@ const encrypt = (txt) => {
|
|
701
701
|
}
|
702
702
|
};
|
703
703
|
exports.default = MysqlService;
|
704
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaVNlcnZlci9NeXNxbFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSwrQ0FBNEM7QUFDNUMsaUVBQTZDO0FBQzdDLG1DQUFxRTtBQUNyRSw2Q0FBbUU7QUFDbkUsc0RBQXVDO0FBQ3ZDLDRDQUFtQjtBQUNuQixnREFBdUI7QUFHVixRQUFBLGVBQWUsR0FBQyxJQUFJLHdCQUFNLEVBQVEsQ0FBQTtBQUNsQyxRQUFBLGVBQWUsR0FBRyxJQUFJLG9CQUFHLENBQXdDLFNBQVMsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRzlGLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxvQkFBRyxDQUF5QixTQUFTLEVBQUMsOEJBQThCLENBQUMsQ0FBQztBQUM3RixRQUFBLGdCQUFnQixHQUFDLElBQUksb0JBQUcsQ0FBNEMsU0FBUyxFQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFDckgsUUFBQSxpQkFBaUIsR0FBQyxJQUFJLG9CQUFHLENBQXlCLFNBQVMsRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2pGLFFBQUEsbUJBQW1CLEdBQUMsSUFBSSxvQkFBRyxDQUF5QixTQUFTLEVBQUMscUJBQXFCLENBQUMsQ0FBQztBQUUzRixNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsS0FBNkIsRUFBd0IsRUFBRSxHQUFDLE9BQU8sTUFBTSx1QkFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQTtBQUExSCxRQUFBLFlBQVksZ0JBQThHO0FBMEV2SSxNQUFhLFlBQWEsU0FBUSx5QkFBVztJQUV6QyxtQkFBbUIsR0FBQyxJQUFJLEdBQUMsQ0FBQyxDQUFDO0lBQzNCLFlBQVksR0FBQyxLQUFLLENBQUM7SUFDbkIsSUFBSSxHQUFpQixJQUFJLENBQUM7SUFDMUIsT0FBTyxDQUFxQjtJQUM1Qixj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QUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdELFNBQVMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDO0tBQ3BCO0lBQUEsT0FBTSxDQUFDLEVBQUM7UUFDTCxPQUFPLElBQUksQ0FBQztLQUNmO0FBQ0gsQ0FBQyxDQUFBO0FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFVLEVBQWEsRUFBRTtJQUN4QyxJQUFHO1FBQ0MsSUFBSSxRQUFRLEdBQUcsSUFBQSx1QkFBYyxFQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQ3JELFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsU0FBUyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDOUQ7SUFBQSxPQUFNLENBQUMsRUFBQztRQUNMLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDLENBQUE7QUFFRCxrQkFBZSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvL2ltcG9ydCBteXNxbCwgeyBGaWVsZEluZm8sIE15c3FsRXJyb3IsIFBvb2wsIFBvb2xDb25uZWN0aW9uIH0gZnJvbSBcIm15c3FsXCJcblxuaW1wb3J0IHsgQmFzZVNlcnZpY2UgfSBmcm9tIFwiLi9CYXNlU2VydmljZVwiO1xuaW1wb3J0IFNpZ25hbCwgeyBSZXEgfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIjtcbmltcG9ydCB7IGNyZWF0ZUNpcGhlcml2LCBjcmVhdGVEZWNpcGhlcml2LCBjcmVhdGVIYXNoIH0gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgeyBsb2dDcml0LCBsb2dFcnJvciwgbG9nSW5mbywgbG9nV2FybiB9IGZyb20gXCIuL0xvZ1NlcnZpY2VcIjtcbmltcG9ydCAqIGFzIG15c3FsIGZyb20gXCJteXNxbDIvcHJvbWlzZVwiXG5pbXBvcnQgZnMgZnJvbSBcImZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IElFcnJvciB9IGZyb20gXCIuL3N0cnVjdHVyZXMvSW50ZXJmYWNlc1wiO1xuXG5leHBvcnQgY29uc3QgU19NWVNRTF9TVEFSVEVEPW5ldyBTaWduYWw8dm9pZD4oKVxuZXhwb3J0IGNvbnN0IFJFUV9NWVNRTF9RVUVSWSA9IG5ldyBSZXE8TXlTcWxRdWVyeXxNeVNxbFF1ZXJ5W10sTXlzcWxSZXN1bHRbXT4odW5kZWZpbmVkLFwiUkVRX01ZU1FMX1FVRVJZXCIpO1xuLy9leHBvcnQgY29uc3QgUkVRX01ZU1FMX1RSQU5TQUNUSU9OID0gbmV3IFJlcTxNeVNxbFF1ZXJ5W10sTXlzcWxSZXN1bHQ+KHVuZGVmaW5lZCxcIlJFUV9NWVNRTF9UUkFOU0FDVElPTlwiKTtcblxuZXhwb3J0IGNvbnN0IFJFUV9NWVNRTF9UQkVHSU4gPSBuZXcgUmVxPHZvaWQsTXlzcWxFcnJvcnxudW1iZXI+KHVuZGVmaW5lZCxcIlJFUV9NWVNRTF9UUkFOU0FDVElPTl9CRUdJTkdcIik7IC8vIHJldHVybiB0cmFuc2FjdGlvbiBpZCBvciBteXNxbCBlcnJvclxuZXhwb3J0IGNvbnN0IFJFUV9NWVNRTF9UUVVFUlk9bmV3IFJlcTx7cXVlcnk6TXlTcWxRdWVyeSx0aWQ6bnVtYmVyfSxNeXNxbFJlc3VsdD4odW5kZWZpbmVkLFwiUkVRX01ZU1FMX1RSQU5TQUNUSU9OX0FERF9PUEVSQVRJT05cIik7IC8vIHRpZCBtZWFucyB0cmFuc2FjdGlvbiBpZFxuZXhwb3J0IGNvbnN0IFJFUV9NWVNRTF9UQ09NTUlUPW5ldyBSZXE8bnVtYmVyLE15c3FsRXJyb3J8bnVsbD4odW5kZWZpbmVkLFwiUkVRX01ZU1FMX1RDT01NSVRcIik7IC8vIHRpZFxuZXhwb3J0IGNvbnN0IFJFUV9NWVNRTF9UUk9MTEJBQ0s9bmV3IFJlcTxudW1iZXIsTXlzcWxFcnJvcnxudWxsPih1bmRlZmluZWQsXCJSRVFfTVlTUUxfVFJPTExCQUNLXCIpOyAvLyB0aWRcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVRdWVyeSA9IGFzeW5jIChxdWVyeTpNeVNxbFF1ZXJ5fE15U3FsUXVlcnlbXSk6UHJvbWlzZTxNeXNxbFJlc3VsdFtdPj0+e3JldHVybiBhd2FpdCBSRVFfTVlTUUxfUVVFUlkucmVxdWVzdChxdWVyeSl9XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXlzcWxTZXJ2aWNlT3B0aW9uc3tcbiAgICBjb25uZWN0aW9uTGltaXQ6bnVtYmVyLFxuICAgIGhvc3Q6c3RyaW5nLFxuICAgIHVzZXI6c3RyaW5nLFxuICAgIHBhc3N3b3JkOnN0cmluZyxcbiAgICBwb3J0Om51bWJlcixcbiAgICBkYXRhYmFzZTpzdHJpbmcsICBcbiAgICBxdWV1ZUxpbWl0PzpudW1iZXIsXG4gICAgdHJhbnNhY3Rpb25GYWlsUmVwb3J0PzoodHJ4OklUcmFuc2FjdGlvbixtZXNzYWdlOnN0cmluZyk9PnZvaWQsXG4gICAgdHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyPzpzdHJpbmcsXG4gICAgZGVidWc/OmJvb2xlYW4sXG4gICAgbmF4VHJhbnNhY3Rpb25XYWl0VGltZT86bnVtYmVyLFxuXHRtaWdyYXRpb25zPzp7XG5cdFx0ZGlyOnN0cmluZyxcblx0XHRjYWxsYmFjazooKT0+dm9pZFxuXHR9fG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNeXNxbEVycm9ye1xuICAgIGNvZGU6IHN0cmluZyxcbiAgICBlcnJubzogbnVtYmVyLFxuICAgIHNxbDogc3RyaW5nLFxuICAgIG5hbWU6c3RyaW5nLFxuICAgIG1lc3NhZ2U6c3RyaW5nXG4gICAgZmF0YWw/OmJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNeXNxbFJlc3VsdHtcbiAgICBlcnJvcj86TXlzcWxFcnJvcnxudWxsLFxuICAgIHJvbGxiYWNrRXJyb3I/Ok15c3FsRXJyb3J8bnVsbCxcbiAgICBpc0R1cGxpY2F0ZUVycm9yPzpib29sZWFuXG4gICAgZGF0YTphbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNeVNxbFF1ZXJ5e1xuICAgIHF1ZXJ5OnN0cmluZ1xuICAgIGZpZWxkczpNeXNxbFF1ZXJ5RmllbGRbXXxNeXNxbFF1ZXJ5RmllbGRPYmplY3QsXG4gICAgcm9sbGJhY2tRdWVyeT86c3RyaW5nfG51bGxcbiAgICB0cmFuc2FjdGlvbklEPzpudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNeXNxbFF1ZXJ5RmllbGR7XG4gICAgbmFtZTpzdHJpbmcsXG4gICAgdmFsdWU6c3RyaW5nfG51bWJlcnxib29sZWFufG51bGx8dW5kZWZpbmVkLFxuICAgIHN5c3RlbT86Ym9vbGVhbixcbiAgICBpZ25vcmVJbkluc2VydD86Ym9vbGVhbixcbiAgICBpZ25vcmVJblVwZGF0ZT86Ym9vbGVhblxuICAgIHVzZUluUmVwbGFjZT86Ym9vbGVhbixcbiAgICBfcGFyc2VkVmFsdWU/OnN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRyYW5zYWN0aW9ue1xuICAgIGlkOm51bWJlclxuICAgIHRpbWVzdGFtcDpudW1iZXIsXG4gICAgY29ubjpteXNxbC5Qb29sQ29ubmVjdGlvbixcbiAgICBxdWVyaWVzOntzcWw6c3RyaW5nLHN0YXR1czpzdHJpbmd9W11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNeXNxbFF1ZXJ5RmllbGRPYmplY3QgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLHN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxudWxsfHVuZGVmaW5lZHx7bmFtZT86c3RyaW5nfG51bGwsdmFsdWU6c3RyaW5nfG51bWJlcnxib29sZWFufG51bGx8dW5kZWZpbmVkLHN5c3RlbT86Ym9vbGVhbixpZ25vcmVJbkluc2VydD86Ym9vbGVhbixpZ25vcmVJblVwZGF0ZT86Ym9vbGVhbix1c2VJblJlcGxhY2U/OmJvb2xlYW59PntcblxufVxuICAgIFxuXG4vKipcbiAqIE15c3FsIFNlcnZpY2VzLCBleGVjdXRlIHF1ZXJpZXNcbiAqIE15U3FsUXVlcnkucXVlcnk6XG4gKiBAZmllbGRzIC0gcmVwbGFjZWQgYnkgZmllbGQncyBuYW1lc1xuICogQHZhbHVlcyAtIHJlcGxhY2VkIGJ5IHBhcnNlZCB2YWx1ZXNcbiAqIEBvbnVwZGF0ZSAtIHJlcGFsY2VkIGJ5IHBhaXIgZmllbGQgbmFtZSA9IHZhbHVlXG4gKiBAb25kdXBsaWNhdGUgLSByZXBsYWNlZCBieSBwYWlyIGZpZWxkIG5hbWUgPSB2YWx1ZVxuICovXG5cbmV4cG9ydCBjbGFzcyBNeXNxbFNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZXtcblxuICAgIHJlY29ubmVjdGlvblRpbWVvdXQ9MTAwMCozO1xuICAgIHJlY29ubmVjdGluZz1mYWxzZTtcbiAgICBwb29sOm15c3FsLlBvb2x8bnVsbD1udWxsO1xuICAgIG9wdGlvbnM6TXlzcWxTZXJ2aWNlT3B0aW9ucztcbiAgICBzZXJ2aWNlU3RhcnRlZD1mYWxzZTtcbiAgICB0aW1lb3V0SUQ6YW55XG5cbiAgICBkZWJ1Zz1mYWxzZTtcblxuICAgIHF1ZXJpZXM9W107IC8vIFRPRE86IFNUT1JFIFFVRVJJRVMgU0VOVFMgQkVGT1JFIFRIRSBTRVJWSUNFIElTIFNUQVJURUQhXG4gICAgc3RhdGljIG5leHRUcmFuc2FjdGlvbklEPTE7XG4gICAgdHJhbnNhY3Rpb25zOklUcmFuc2FjdGlvbltdPVtdXG5cbiAgICBtYXhUcmFuc2FjdGlvbldhaXRUaW1lID0gMTAwMCo2MCoxOyAvLyAxIG1pbiBhbmQgZGV0ZWxldGUgdHJhbnNhY3Rpb25cblxuICAgIGZhaWxSZXBvcnRGaWxlU3RyZWFtOmZzLldyaXRlU3RyZWFtfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU6c3RyaW5nfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWU6bnVtYmVyPTA7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOk15c3FsU2VydmljZU9wdGlvbnMpe1xuICAgICAgICBzdXBlcihcIm15c3FsXCIpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBcblxuICAgICAgICAvLyBkZWNyeXB0IHdoZW4gbmVlZGVkXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5ob3N0LnN0YXJ0c1dpdGgoXCJfXCIpKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhvc3QgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy5ob3N0LnN1YnN0cmluZygxKSkgPz8gdGhpcy5vcHRpb25zLmhvc3RcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnVzZXIuc3RhcnRzV2l0aChcIl9cIikpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudXNlciA9IGRlY3J5cHQodGhpcy5vcHRpb25zLnVzZXIuc3Vic3RyaW5nKDEpKSA/PyB0aGlzLm9wdGlvbnMudXNlclxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGF0YWJhc2Uuc3RhcnRzV2l0aChcIl9cIikpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGF0YWJhc2UgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy5kYXRhYmFzZS5zdWJzdHJpbmcoMSkpID8/IHRoaXMub3B0aW9ucy5kYXRhYmFzZVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMucGFzc3dvcmQuc3RhcnRzV2l0aChcIl9cIikpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFzc3dvcmQgPSBkZWNyeXB0KHRoaXMub3B0aW9ucy5wYXNzd29yZC5zdWJzdHJpbmcoMSkpID8/IHRoaXMub3B0aW9ucy5wYXNzd29yZFxuXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgIHRoaXMuZGVidWcgPSB0cnVlXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5uYXhUcmFuc2FjdGlvbldhaXRUaW1lKVxuICAgICAgICAgICAgdGhpcy5tYXhUcmFuc2FjdGlvbldhaXRUaW1lID0gdGhpcy5vcHRpb25zLm5heFRyYW5zYWN0aW9uV2FpdFRpbWU7XG5cbiAgICAgICAgc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy50cmFuc2FjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZElEczpudW1iZXJbXT1bXTtcbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiB0aGlzLnRyYW5zYWN0aW9ucyl7XG4gICAgICAgICAgICAgICAgaWYobm93LWkudGltZXN0YW1wPnRoaXMubWF4VHJhbnNhY3Rpb25XYWl0VGltZSl7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yKFwiUmVsZWFzZSB0cmFuc2FjdGlvbiBjb25uZWN0aW9uIGR1ZSB0byB0aW1lb3V0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbihpLHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVkSURzLnB1c2goaS5pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbnMuZmlsdGVyKGk9PiFyZW1vdmVkSURzLmluY2x1ZGVzKGkuaWQpKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVtb3ZlZDogXCIsY291bnQtdGhpcy50cmFuc2FjdGlvbnMubGVuZ3RoKVxuXG4gICAgICAgICAgICBcblxuICAgICAgICB9LDEwMDAqMzApXG5cbiAgICAgICAgc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgICAgICAgIGlmKCF0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGFmdGVyIDE1IG1pbiBvZiBpbmFjdGl2aXR5LCBjbG9zZSBmaWxlXG4gICAgICAgICAgICBpZihEYXRlLm5vdygpLXRoaXMuZmFpbFJlcG9ydExhc3RBY2Nlc3NUaW1lPjEwMDAqNjAqMTUpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbT1udWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sMTAwMCo2MCo1KVxuXG4gICAgICAgIGlmKG9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhvcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcikpe1xuICAgICAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMob3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcj11bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgY3JlYXRlIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0IGRpclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGV4ZWN1dGVRdWVyeSAocXVlcnk6TXlTcWxRdWVyeXxNeVNxbFF1ZXJ5W10pOlByb21pc2U8TXlzcWxSZXN1bHRbXT57IHJldHVybiBhd2FpdCBSRVFfTVlTUUxfUVVFUlkucmVxdWVzdChxdWVyeSkgfVxuXG4gICAgYXN5bmMgaW5pdCgpe1xuICAgICAgICBzdXBlci5pbml0KCk7XG5cbiAgICAgICAgLy8gc2V0dXAgcHJvY2VzcyBleGl0IGhhbmRsZXJzIGludGVycnVwdCAoY3RybCtjKVxuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmlzaEFwcCgpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgLy8gdGVybWluYXRlIChraWxsKVxuICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJyxhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmlzaEFwcCgpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlcnZpY2VTdGFydGVkPWZhbHNlO1xuICAgICAgICBsZXQgcG9vbENyZWF0ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgIHdoaWxlKCFwb29sQ3JlYXRlZCl7XG4gICAgICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDb25uZWN0aW5nIHRvIE1ZU1FMIVwiKVxuICAgICAgICAgICAgcG9vbENyZWF0ZWQgPSBhd2FpdCB0aGlzLnJlY3JlYXRlUG9vbCgpO1xuICAgICAgICAgICAgaWYoIXBvb2xDcmVhdGVkKXtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDYW4ndCBjb25uZWN0IHRvIE1ZU1FMISBSZXRyeWluZyBpbiAzIHNlY29uZHMuLi5cIilcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PnNldFRpbWVvdXQocmVzb2x2ZSwzMDAwKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFJFUV9NWVNRTF9RVUVSWS5saXN0ZW5lcj1hc3luYyBkYXRhID0+e1xuICAgICAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkoZGF0YSkpXG4gICAgICAgICAgICAgICAgZGF0YT1bZGF0YV07XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcz1bXVxuICAgICAgICAgICAgZm9yKGxldCBpIG9mIGRhdGEpe1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gTXlzcWxTZXJ2aWNlLnByZXBhcmVRdWVyeShpLnF1ZXJ5LGkuZmllbGRzKTtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuZXhlY3V0ZShxdWVyeSxpLnJvbGxiYWNrUXVlcnkgPz8gbnVsbCxpLnRyYW5zYWN0aW9uSUQgPz8gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhlY3V0ZSBxdWVyaWVzOiBcIixkYXRhLmxlbmd0aClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJFUV9NWVNRTF9UQkVHSU4ubGlzdGVuZXI9YXN5bmMgKCk9PnsgIFxuICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMucG9vbD8uZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICAgICAgaWYoIWNvbm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtjb2RlOlwiTk9fUE9PTFwiLGVycm5vOjEwMDAwMCxmYXRhbDp0cnVlLHNxbDpcIlwiLG5hbWU6XCJOT19QT09MXCIsbWVzc2FnZTpcIk15c3FsIHBvb2wgbm90IGNyZWF0ZWRcIn1cblxuICAgICAgICAgICAgLy8gZmluZCBjb25uIGluIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgZm9yKGxldCBpIG9mIHRoaXMudHJhbnNhY3Rpb25zKXtcbiAgICAgICAgICAgICAgICBpZihpLmNvbm49PT1jb25uKXtcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIllvdXIgY29ubmVjdGlvbiBpcyBpbiB0cmFuc2FjdGlvblwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NvZGU6XCJDT05OX0lOX1RSWFwiLGVycm5vOjEwMDAwNSxmYXRhbDp0cnVlLHNxbDpcIlwiLG5hbWU6XCJDT05OX0lOX1RSWFwiLG1lc3NhZ2U6XCJDb25uZWN0aW9uIGlzIGluIHRyYW5zYWN0aW9uXCJ9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aWQgPSBNeXNxbFNlcnZpY2UubmV4dFRyYW5zYWN0aW9uSUQrKztcbiAgICAgICAgICAgIGlmKHRoaXMuZGVidWcpXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJCZWdpbiB0cmFuc2FjdGlvbiB3aXRoIGlkIFwiLHRpZClcblxuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGNvbm4uYmVnaW5UcmFuc2FjdGlvbigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm4ucXVlcnkoXCJTVEFSVCBUUkFOU0FDVElPTlwiKTtcbiAgICAgICAgICAgICAgICAvL2NvbnN0IHJlcyA9IGF3YWl0IGNvbm4ucXVlcnkoXCJTRVQgYXV0b2NvbW1pdD0wXCIpO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGVidWcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJhbnNhY3Rpb24gc3RhcnRlZFwiKVxuXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICB0aGlzLnJvbGxiYWNrVHJhbnNhY3Rpb24oe2lkOnRpZCxjb25uOmNvbm4sdGltZXN0YW1wOkRhdGUubm93KCkscXVlcmllczpbe3NxbDpcIlNUQVJUIFRSQU5TQUNUSU9OXCIsc3RhdHVzOlwiZXJyb3JcIn1dfSlcbiAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6dGlkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDpEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIGNvbm46Y29ubixcbiAgICAgICAgICAgICAgICBxdWVyaWVzOltdXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJhbnNhY3Rpb25zIHBvb2w6IFwiLHRoaXMudHJhbnNhY3Rpb25zKVxuXG4gICAgICAgICAgICByZXR1cm4gdGlkO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBSRVFfTVlTUUxfVFFVRVJZLmxpc3RlbmVyPWFzeW5jIGRhdGE9PntcbiAgICAgICAgICAgIGNvbnN0IHRyeCA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbmQoaT0+aS5pZD09PWRhdGEudGlkKTtcbiAgICAgICAgICAgIGlmKCF0cngpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlcnI6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTpcIk5PX1RSWFwiLFxuICAgICAgICAgICAgICAgICAgICBlcnJubzoxMDAwMDQsXG4gICAgICAgICAgICAgICAgICAgIGZhdGFsOnRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNxbDpcIlwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOlwiTk9fVFJYXCIsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XCJUcmFuc2FjdGlvbiBub3QgZm91bmRcIlxuICAgICAgICAgICAgICAgIH0sZGF0YTpudWxsLHJvbGxiYWNrRXJyb3I6bnVsbH1cblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBNeXNxbFNlcnZpY2UucHJlcGFyZVF1ZXJ5KGRhdGEucXVlcnkucXVlcnksZGF0YS5xdWVyeS5maWVsZHMpO1xuICAgICAgICAgICAgbGV0IGVycj1udWxsO1xuICAgICAgICAgICAgbGV0IHNxbERhdGEgPSBudWxsO1xuXG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhlY3V0ZSBxdWVyeSBvbiB0cmFuc2FjdGlvbjogXCIsdHJ4KVxuXG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgc3FsRGF0YSA9IGF3YWl0IHRyeC5jb25uLnF1ZXJ5KHF1ZXJ5KTtcbiAgICAgICAgICAgIH1jYXRjaChlKXsgZXJyID0gdGhpcy5jcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZSk7fVxuXG4gICAgICAgICAgICBpZihlcnIpXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKHRyeCk7XG5cbiAgICAgICAgICAgIGlmKHRoaXMuZGVidWcpXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJRdWVyeSBleGVjdXRpb24gc3RhdHVzOlwiLGVycj9lcnIubWVzc2FnZTpcImNvbXBsZXRlZFwiKVxuXG4gICAgICAgICAgICB0cngucXVlcmllcy5wdXNoKHtzcWw6cXVlcnksc3RhdHVzOmVycj9lcnIubWVzc2FnZTpcImNvbXBsZXRlZFwifSlcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOnNxbERhdGE/c3FsRGF0YVswXTpudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOmVycixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBSRVFfTVlTUUxfVFJPTExCQUNLLmxpc3RlbmVyPWFzeW5jICh0aWQ6bnVtYmVyKT0+e1xuICAgICAgICAgICAgY29uc3QgdHJ4ID0gdGhpcy50cmFuc2FjdGlvbnMuZmluZChpPT5pLmlkPT09dGlkKTtcbiAgICAgICAgICAgIGlmKCF0cngpe1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6XCJOT19UUlhcIixcbiAgICAgICAgICAgICAgICAgICAgZXJybm86MTAwMDA0LFxuICAgICAgICAgICAgICAgICAgICBmYXRhbDp0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcWw6XCJcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpcIk5PX1RSWFwiLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlwiVHJhbnNhY3Rpb24gbm90IGZvdW5kXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbih0cngpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBSRVFfTVlTUUxfVENPTU1JVC5saXN0ZW5lcj1hc3luYyAodGlkOm51bWJlcik9PntcbiAgICAgICAgICAgIGNvbnN0IHRyeCA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbmQoaT0+aS5pZD09PXRpZCk7XG4gICAgICAgICAgICBpZighdHJ4KXtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOlwiTk9fVFJYXCIsXG4gICAgICAgICAgICAgICAgICAgIGVycm5vOjEwMDAwNCxcbiAgICAgICAgICAgICAgICAgICAgZmF0YWw6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3FsOlwiXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6XCJOT19UUlhcIixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcIlRyYW5zYWN0aW9uIG5vdCBmb3VuZFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmKHRoaXMuZGVidWcpXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDb21taXQgdHJhbnNhY3Rpb246XCIsdHJ4KVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyByZW1vdmUgZnJvbSB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbnMuZmlsdGVyKGk9PmkuaWQhPT10aWQpO1xuXG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJhbnNhY3Rpb24gcG9vbDpcIix0aGlzLnRyYW5zYWN0aW9ucyApXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHRoaXMuY29tbWl0KHRyeCk7XG5cbiAgICAgICAgICAgIHJldHVybiBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjb21taXQodHJ4OklUcmFuc2FjdGlvbik6UHJvbWlzZTxNeXNxbEVycm9yfG51bGw+e1xuICAgICAgIFxuICAgICAgICB0cnl7XG4gICAgICAgICAgICBhd2FpdCB0cnguY29ubi5jb21taXQoKTtcbiAgICAgICAgICAgIC8vYXdhaXQgdHJ4LmNvbm4ucXVlcnkoXCJDT01NSVRcIik7XG4gICAgICAgICAgICB0cnguY29ubi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbGVhc2UoKTtcbiAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKHRyeCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICB9XG5cbiAgICBhc3luYyByb2xsYmFja1RyYW5zYWN0aW9uKHRyeDpJVHJhbnNhY3Rpb24sZG9uTm90UmVtb3ZlPzpib29sZWFuKTpQcm9taXNlPE15c3FsRXJyb3J8bnVsbD57XG4gICAgICAgIGxldCBlcnI9bnVsbDtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJSb2xsYmFjayBzdGFydGVkXCIsdHJ4LmNvbm4pXG4gICAgICAgICAgICBhd2FpdCB0cnguY29ubi5yb2xsYmFjaygpO1xuICAgICAgICAgICAgYXdhaXQgdHJ4LmNvbm4uY29tbWl0KCk7XG4gICAgICAgICAgICAvL2F3YWl0IHRyeC5jb25uLnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICAgICAgICB0cnguY29ubi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIGlmKCFkb25Ob3RSZW1vdmUpXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9ucy5maWx0ZXIoaT0+aS5pZCE9PXRyeC5pZCk7XG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUm9sbGJhY2sgY29tcGxldGVcIix0cnguY29ubilcbiAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3Qgcm9sbGJhY2sgdHJhbnNhY3Rpb25cIix0cngpXG4gICAgICAgICAgICBlcnIgPSB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3JlVHJhbnNhY3Rpb25Bc1Byb2JsZW0odHJ4LFwicm9sbGJhY2tcIilcbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG5cbiAgICBhc3luYyBmaW5pc2hBcHAoKXtcbiAgICAgICAgY29uc29sZS5sb2coXCJGaW5pc2hpbmcgbXlzcWwgc2VydmljZVwiKVxuICAgICAgICBmb3IobGV0IGkgb2YgdGhpcy50cmFuc2FjdGlvbnMpXG4gICAgICAgICAgICB0aGlzLnJvbGxiYWNrVHJhbnNhY3Rpb24oaSk7XG5cbiAgICAgICAgaWYodGhpcy5wb29sKXtcbiAgICAgICAgICAgIHRyeXthd2FpdCB0aGlzLnBvb2wuZW5kKCk7fWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNsb3NlIE1ZU1FMIHBvb2whXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbT1udWxsO1xuICAgIH1cblxuICAgIGFzeW5jIHN0b3JlVHJhbnNhY3Rpb25Bc1Byb2JsZW0odHJ4OklUcmFuc2FjdGlvbixtZXNzYWdlOnN0cmluZyl7XG5cbiAgICAgICAgaWYoIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQgJiYgIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpe1xuICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgcmVwb3J0IGZhaWxlZCB0cmFuc2FjdGlvbiwgbm8gcmVwb3J0IGZ1bmN0aW9uOiB0cmFuc2FjdGlvbkZhaWxSZXBvcnQgaW4gb3B0aW9ucywgYW5kIHRyYW5zYWN0aW9uRmFpbFJlcG9ydERpciBpc250IHNldFwiKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKXtcbiAgICAgICAgICAgIGNvbnN0IHl5eW1tZGQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsMTApLnJlcGxhY2VBbGwoXCItXCIsXCJcIik7XG5cbiAgICAgICAgICAgIC8vc3RvcmUgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyLHl5eW1tZGQrXCIuanNvblwiKTtcbiAgICAgICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW1OYW1lIT09ZmlsZSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW09bnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYodGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWUpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZT1maWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3RvcmUgdHJhbnNhY3Rpb24gZmFpbCByZXBvcnQ6IFwiLGZpbGUsdHJ4LG1lc3NhZ2UpXG5cbiAgICAgICAgICAgIGlmKCF0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcblxuICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeSh7cXVlcmllczp0cngucXVlcmllcyx0aW1lOnRyeC50aW1lc3RhbXAsZGF0ZSxtZXNzYWdlfSkrXCJcXG59RU9Ce1xcblwiLGVycj0+e1xuICAgICAgICAgICAgICAgIGlmKGVycilcbiAgICAgICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3Qgd3JpdGUgdG8gdHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgZmlsZVwiKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiVHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgc3RvcmVkXCIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydClcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQodHJ4LG1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgYXN5bmMgcmVjcmVhdGVQb29sKCk6UHJvbWlzZTxib29sZWFuPntcblxuICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDb25uZWN0aW5nIHRvIG15c3FsOiBcXG4gSE9TVDogXCIrdGhpcy5vcHRpb25zLmhvc3QrJ1xcbiBQT1JUOicrdGhpcy5vcHRpb25zLnBvcnQpXG5cbiAgICAgICAgaWYodGhpcy5wb29sKXtcbiAgICAgICAgICAgIHRoaXMucG9vbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeXthd2FpdCB0aGlzLnBvb2wuZW5kKCk7fWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNsb3NlIE1ZU1FMIHBvb2whXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgdGhpcy5wb29sID1teXNxbC5jcmVhdGVQb29sKHtcbiAgICAgICAgICAgICAgICBob3N0OiB0aGlzLm9wdGlvbnMuaG9zdFxuICAgICAgICAgICAgICAgICx1c2VyOiB0aGlzLm9wdGlvbnMudXNlclxuICAgICAgICAgICAgICAgICxwYXNzd29yZDogdGhpcy5vcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgICAgICAgLGRhdGFiYXNlOiB0aGlzLm9wdGlvbnMuZGF0YWJhc2VcbiAgICAgICAgICAgICAgICAscG9ydDogdGhpcy5vcHRpb25zLnBvcnRcbiAgICAgICAgICAgICAgICAsY29ubmVjdGlvbkxpbWl0OiB0aGlzLm9wdGlvbnMuY29ubmVjdGlvbkxpbWl0XG4gICAgICAgICAgICAgICAgLHF1ZXVlTGltaXQ6IDEwXG4gICAgICAgICAgICAgICAgLG11bHRpcGxlU3RhdGVtZW50czogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhXCIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvb2w/Lm9uKCdjb25uZWN0aW9uJywgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGxvZ0luZm8oXCIke015c3FsU2VydmljZS5qc31cIixcIk1ZU1FMIENPTk5FQ1RJT04gQ1JFQVRFRFwiKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb29sPy5vbignYWNxdWlyZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJNWVNRTCBDT05ORUNUSU9OIEFDUVVJUkVEXCIpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMucG9vbD8ub24oJ3JlbGVhc2UnLCAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiTVlTUUwgQ09OTkVDVElPTiBSRUxFQVNFRFwiKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnBvb2w/Lm9uKCdlbnF1ZXVlJywgKCkgPT4ge1xuICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiTVlTUUwgQ09OTkVDVElPTiBFTlFVRVVFRFwiKVxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY29ubmVjdGlvblxuICAgICAgICBpZih0aGlzLmRlYnVnKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDaGVjayBteXNxbCBjb25uZWN0aW9uXCIpXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSxyZWplY3QpPT57XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMucG9vbD8uZ2V0Q29ubmVjdGlvbigpXG4gICAgICAgICAgICAgICAgaWYoY29ubil7XG4gICAgICAgICAgICAgICAgICAgIGNvbm4/LnJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ29ubmVjdGVkIHRvIE1ZU1FMIVwiKVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1lbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgY29ubmVjdCB0byBNWVNRTCFcIilcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGFzeW5jIG9uQXBwbGljYXRpb25SZWFkeSgpIHt9XG5cblxuICAgIHN0YXRpYyBmaWVsZHNUb09iamVjdChmaWVsZHM6TXlzcWxRdWVyeUZpZWxkW118TXlzcWxRdWVyeUZpZWxkT2JqZWN0LGlnbm9yZVN5c3RlbVBhcmFtZXRlcnM/OmJvb2xlYW4pOk15c3FsUXVlcnlGaWVsZE9iamVjdHtcbiAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkoZmllbGRzKSlcbiAgICAgICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgICAgIGNvbnN0IG9iajpNeXNxbFF1ZXJ5RmllbGRPYmplY3Q9e307XG4gICAgICAgIGZvcihsZXQgaSBvZiBmaWVsZHMpe1xuICAgICAgICAgICAgaWYoIWkubmFtZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBpLnZhbHVlIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgb2JqW2kubmFtZV09aS52YWx1ZTtcbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgaWYoIWlnbm9yZVN5c3RlbVBhcmFtZXRlcnMpe1xuICAgICAgICAgICAgICAgICAgICBvYmpbaS5uYW1lXT17XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTppLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtOmkuc3lzdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlSW5JbnNlcnQ6aS5pZ25vcmVJbkluc2VydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUluVXBkYXRlOmkuaWdub3JlSW5VcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VJblJlcGxhY2U6aS51c2VJblJlcGxhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOmkubmFtZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2JqW2kubmFtZV09aS52YWx1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBzdGF0aWMgb2JqZWN0VG9GaWVsZHMob2JqOk15c3FsUXVlcnlGaWVsZE9iamVjdHxNeXNxbFF1ZXJ5RmllbGRbXSk6TXlzcWxRdWVyeUZpZWxkW117XG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIGNvbnN0IGZpZWxkczpNeXNxbFF1ZXJ5RmllbGRbXT1bXTtcbiAgICAgICAgZm9yKGxldCBpIGluIG9iail7XG4gICAgICAgICAgICBpZihvYmpbaV0gJiYgdHlwZW9mIG9ialtpXSA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgICAgICAgICAgbGV0IG1vID0gb2JqW2ldIGFzIFJlY29yZDxzdHJpbmcsc3RyaW5nfG51bWJlcnxib29sZWFufG51bGx8dW5kZWZpbmVkPjtcbiAgICAgICAgICAgICAgICBpZighbW8pe1xuICAgICAgICAgICAgICAgICAgICBtbz17XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOmksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtOmZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlSW5JbnNlcnQ6ZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVJblVwZGF0ZTpmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUluUmVwbGFjZTpmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTptby5uYW1lIGFzIHN0cmluZyA/PyBpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTptby52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3lzdGVtOm1vLnN5c3RlbSBhcyBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVJbkluc2VydDptby5pZ25vcmVJbkluc2VydCBhcyBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVJblVwZGF0ZTptby5pZ25vcmVJblVwZGF0ZSBhcyBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICB1c2VJblJlcGxhY2U6bW8udXNlSW5SZXBsYWNlIGFzIGJvb2xlYW5cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOmksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOm9ialtpXSBhcyBzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuXG4gICAgc3RhdGljIHByZXBhcmVRdWVyeShxdWVyeTpzdHJpbmcsZmllbGRzOk15c3FsUXVlcnlGaWVsZFtdfE15c3FsUXVlcnlGaWVsZE9iamVjdCk6c3RyaW5ne1xuICAgICAgICBcbiAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkoZmllbGRzKSlcbiAgICAgICAgICAgIGZpZWxkcyA9IE15c3FsU2VydmljZS5vYmplY3RUb0ZpZWxkcyhmaWVsZHMpO1xuXG4gICAgICAgIGZvcihsZXQgaSBvZiBmaWVsZHMpe1xuICAgICAgICAgICAgY29uc3QgdmFsID10aGlzLnByZXBhcmVRdWVyeUZpZWxkVmFsdWUoaS52YWx1ZSxpLnN5c3RlbSk7XG4gICAgICAgICAgICBpLl9wYXJzZWRWYWx1ZT12YWw7XG4gICAgICAgICAgICBxdWVyeT1xdWVyeS5yZXBsYWNlQWxsKFwiQFwiK2kubmFtZSx2YWwrXCJcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRtcCA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKHRtcC5pbmRleE9mKFwic2VsZWN0XCIpPT09MCAmJiB0bXAuaW5kZXhPZihcImxpbWl0XCIpPT09LTEpXG4gICAgICAgICAgICBxdWVyeSs9XCIgTElNSVQgMTAwXCJcbiAgICAgICAgXG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZUFsbChcIkBOT0xJTUlUXCIsXCJcIilcblxuXG4gICAgICAgIGlmKHF1ZXJ5LmluZGV4T2YoXCJAZmllbGRzXCIpIT09LTEpe1xuICAgICAgICAgICAgbGV0IGluc2VydEZpZWxkTmFtZXM9W11cbiAgICAgICAgICAgIGxldCBpbnNlcnRGaWVsZFZhbHVlcz1bXVxuICAgICAgICAgICAgZm9yKGxldCBpIG9mIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgaWYoaS5pZ25vcmVJbkluc2VydClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpbnNlcnRGaWVsZE5hbWVzLnB1c2goJ2AnK2kubmFtZS5yZXBsYWNlQWxsKFwiYFwiLCcnKS5yZXBsYWNlQWxsKCdcXFwiJyxcIlwiKS5yZXBsYWNlQWxsKCdcXCcnLFwiXCIpKydgJylcbiAgICAgICAgICAgICAgICBpbnNlcnRGaWVsZFZhbHVlcy5wdXNoKGkuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWVyeT1xdWVyeVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCdAZmllbGRzJyxpbnNlcnRGaWVsZE5hbWVzLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCdAdmFsdWVzJyxpbnNlcnRGaWVsZFZhbHVlcy5qb2luKFwiLFwiKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHF1ZXJ5LmluZGV4T2YoXCJAaW5zZXJ0XCIpIT09LTEpe1xuICAgICAgICAgICAgbGV0IG9uaW5zZXJ0TmFtZXM9W11cbiAgICAgICAgICAgIGxldCBvbmluc2VydFZhbHVlcz1bXVxuICAgICAgICAgICAgZm9yKGxldCBpIG9mIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgaWYoaS5pZ25vcmVJbkluc2VydClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgb25pbnNlcnROYW1lcy5wdXNoKGkubmFtZSlcbiAgICAgICAgICAgICAgICBvbmluc2VydFZhbHVlcy5wdXNoKGkuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQGluc2VydFwiLGAoJHtvbmluc2VydE5hbWVzLmpvaW4oXCIsXCIpfSkgVkFMVUVTICgke29uaW5zZXJ0VmFsdWVzLmpvaW4oXCIsXCIpfSlgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYocXVlcnkuaW5kZXhPZihcIkBvbnVwZGF0ZVwiKSE9PS0xKXtcbiAgICAgICAgICAgIGxldCBvblVwZGF0ZT1bXVxuICAgICAgICAgICAgZm9yKGxldCBpIG9mIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgaWYoaS5pZ25vcmVJblVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgb25VcGRhdGUucHVzaCgnYCcraS5uYW1lLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AgPSAnK2kuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQG9udXBkYXRlXCIsb25VcGRhdGUuam9pbihcIiAsIFwiKSlcbiAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHF1ZXJ5LmluZGV4T2YoJ0BvbmR1cGxpY2F0ZScpIT09LTEpe1xuICAgICAgICAgICAgbGV0IG9uRHVwbGljYXRlPVtdO1xuICAgICAgICAgICAgZm9yKGxldCBpIG9mIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgaWYoIWkudXNlSW5SZXBsYWNlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBvbkR1cGxpY2F0ZS5wdXNoKCdgJytpLm5hbWUucmVwbGFjZUFsbChcImBcIiwnJykucmVwbGFjZUFsbCgnXFxcIicsXCJcIikucmVwbGFjZUFsbCgnXFwnJyxcIlwiKSsnYCA9ICcraS5fcGFyc2VkVmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAb25kdXBsaWNhdGVcIixvbkR1cGxpY2F0ZS5qb2luKFwiICwgXCIpKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuICBxdWVyeTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJlcGFyZVF1ZXJ5RmllbGRWYWx1ZSh2YWx1ZTpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWQsc3lzdGVtPzpib29sZWFuKTpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWR7XG4gICAgICAgIGlmKCFzeXN0ZW0gJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWU/dmFsdWUucmVwbGFjZUFsbCgnXCInLCdcXFxcXCInKTpudWxsXG4gICAgICAgICAgICBpZih2YWx1ZSE9PW51bGwpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSAnXCInK3ZhbHVlKydcIidcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiTlVMTFwiXG4gICAgICAgIH1cbiAgICAgICAgaWYodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBcIk5VTExcIlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG5cbiAgICBhc3luYyBleGVjdXRlKHF1ZXJ5OnN0cmluZyxyb2xsYmFja1F1ZXJ5OnN0cmluZ3xudWxsLHRyYW5zYWN0aW9uSUQ6bnVtYmVyKTpQcm9taXNlPE15c3FsUmVzdWx0PntcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlOihkYXRhOk15c3FsUmVzdWx0KT0+dm9pZCxyZWplY3QpPT57XG4gICAgICAgICAgICAvLyBDaGVjayBwb29sXG4gICAgICAgICAgICBpZighdGhpcy5wb29sKXtcbiAgICAgICAgICAgICAgICBsb2dFcnJvcihcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiTm8gcG9vbFwiKVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjp7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcIk5PX1BPT0xcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNxbDogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOlwiTk9fUE9PTFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcIk15c3FsIHBvb2wgbm90IGNyZWF0ZWRcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGxldCBjb25uOm15c3FsLlBvb2xDb25uZWN0aW9ufG51bGw9bnVsbFxuICAgICAgICAgICAgICAgIGlmKHRyYW5zYWN0aW9uSUQgJiYgdHJhbnNhY3Rpb25JRD4wKXtcbiAgICAgICAgICAgICAgICAgICAgY29ubiA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbmQoaT0+aS5pZD09PXRyYW5zYWN0aW9uSUQpPy5jb25uID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGVidWcpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4ZWN1dGUgcXVlcnkgb24gdHJhbnNhY3Rpb246IFwiLGNvbm4pXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGNvbm4gPSBhd2FpdCB0aGlzLnBvb2wuZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGVidWcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhlY3V0ZSBxdWVyeVwiLGNvbm4pXG5cbiAgICAgICAgICAgICAgICAvLyBpZiBjb25uZWN0aW9uIG5vdCBjcmVhdGVkXG4gICAgICAgICAgICAgICAgaWYoIWNvbm4pe1xuICAgICAgICAgICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsYE5vIGNvbm5lY3Rpb24gY3JlYXRlZCFgKVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBcIk5PX0NPTk5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbDogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcIk5PX0NPTk5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlwiTXlzcWwgcG9vbCBjYW50IGdldCBjb25uZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBzZW5kIHF1ZXJ5XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIG9mIHRoaXMudHJhbnNhY3Rpb25zKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoaS5jb25uPT09Y29ubil7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dJbmZvKFwiWW91ciBjb25uZWN0aW9uIGlzIGluIHRyYW5zYWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRRdWVyeShjb25uLHF1ZXJ5LHJlc29sdmUscm9sbGJhY2tRdWVyeSk7XG5cbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBsb2dFcnJvcihcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLGUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIHJlY3JlYXRlIHBvb2wsIGNvbm5lY3Rpb24gZXJyb3JcbiAgICAgICAgICAgICAgICBpZihgJHtlfWAuaW5kZXhPZignRUNPTk5SRUZVU0VEJykhPT0tMSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNyZWF0ZVBvb2woKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogXCJOT19DT05OXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcWw6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcIk5PX0NPTk5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6KGUgJiYgdHlwZW9mIGUgPT09IFwib2JqZWN0XCIgJiYgXCJtZXNzYWdlXCIgaW4gZSBhcyBhbnkpPyhlIGFzIGFueSkubWVzc2FnZTpcIk15c3FsIGNhbnQgZ2V0IGNvbm5lY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VuZFF1ZXJ5KGNvbm46bXlzcWwuUG9vbENvbm5lY3Rpb24scXVlcnk6c3RyaW5nLHJlc29sdmU6KGRhdGE6TXlzcWxSZXN1bHQpPT52b2lkLHJvbGxiYWNrOnN0cmluZ3xudWxsKXtcbiAgICAgICAgXG4gICAgICAgIGxldCBlcnJDYXRjaGVkPWZhbHNlO1xuXG4gICAgICAgIGNvbm4ub24oXCJlcnJvclwiLGFzeW5jIGVycj0+e1xuICAgICAgICAgICAgZXJyQ2F0Y2hlZD10cnVlO1xuXG4gICAgICAgICAgICBsZXQgcm9sbGJhY2tFcnJvciA9IG51bGw7XG4gICAgICAgICAgICBpZihyb2xsYmFjaylcbiAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yPShhd2FpdCB0aGlzLnF1ZXJ5QXN5bmMoY29ubixyb2xsYmFjaykpLmVyclxuICAgICAgIFxuICAgICAgICAgICAgbG9nRXJyb3IoXCIke015c3FsU2VydmljZS5qc30tPmNvbm4ub24oJ2Vycm9yJylcIixlcnIpXG5cbiAgICAgICAgICAgIC8vIGNsb3NlIGNvbm4gb24gc3VjY2Vzc1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGNvbm4ucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIGNvbm4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB9Y2F0Y2goZSl7fVxuICAgICBcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGVycm9yOntcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJDT05OX0VSUlwiLFxuICAgICAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAzLFxuICAgICAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3FsOiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpcIkNPTk5fRVJSXCIsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XCJFcnJvcjogXCIrZXJyXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcjpyb2xsYmFja0Vycm9yXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG5cblxuICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIscXVlcnkpXG5cbiAgICAgICAgLy8gc2VuZCBxdWVyeVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnlBc3luYyhjb25uLHF1ZXJ5KTtcblxuICAgICAgICAvLyBoYW5kbGUgZXJyb3JcbiAgICAgICAgaWYocXVlcnlSZXN1bHQuZXJyKXtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gcm9sbGJhY2tcbiAgICAgICAgICAgIGxldCByb2xsYmFja0Vycm9yPW51bGw7XG4gICAgICAgICAgICBpZihyb2xsYmFjaylcbiAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yPShhd2FpdCB0aGlzLnF1ZXJ5QXN5bmMoY29ubixyb2xsYmFjaykpLmVyclxuXG4gICAgICAgICAgICAvLyBjbG9zZSBjb25uZWN0aW9uXG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29ubi5yZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgY29ubi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH1jYXRjaChlKXt9XG5cbiAgICAgICAgICAgIC8vIGRldGVybWluZSBkdXBsaWNhdGUgZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IGR1cCA9IGAke3F1ZXJ5UmVzdWx0LmVycn1gLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImVyX2R1cF9lbnRyeVwiKSE9PS0xO1xuXG4gICAgICAgICAgICBsb2dFcnJvcihcIiR7TXlzcWxTZXJ2aWNlLmpzfS0+cXVlcnkgZXJyb3JcIixxdWVyeVJlc3VsdC5lcnIpO1xuXG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBlcnJvcjpxdWVyeVJlc3VsdC5lcnIsXG4gICAgICAgICAgICAgICAgZGF0YTpudWxsLFxuICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3I6cm9sbGJhY2tFcnJvcixcbiAgICAgICAgICAgICAgICBpc0R1cGxpY2F0ZUVycm9yOmR1cFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gY2xvc2UgY29ubiBvbiBzdWNjZXNzXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbm4ucmVsZWFzZSgpO1xuICAgICAgICAgICAgY29ubi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfWNhdGNoKGUpe31cblxuICAgICAgICAvLyBoYW5kbGUgc3VjY2Vzc1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGVycm9yOnF1ZXJ5UmVzdWx0LmVycixcbiAgICAgICAgICAgIGRhdGE6cXVlcnlSZXN1bHQucmVzdWx0cyxcbiAgICAgICAgfSlcblxuICAgIH1cblxuXG4gICAgLy8gQXN5bmMgcXVlcnkgd3JhcHBlciB0byBjb25uLnF1ZXJ5XG4gICAgYXN5bmMgcXVlcnlBc3luYyhjb25uOm15c3FsLlBvb2xDb25uZWN0aW9uLHF1ZXJ5OnN0cmluZyk6UHJvbWlzZTx7ZXJyOk15c3FsRXJyb3J8bnVsbCxyZXN1bHRzPzphbnl9PntcblxuICAgICAgICBsZXQgcmVzdWx0PW51bGw7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbm4ucXVlcnkocXVlcnkpO1xuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICByZXR1cm4ge2Vycjp0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyOm51bGwsXG4gICAgICAgICAgICByZXN1bHRzOnJlc3VsdFswXSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZU15c3FsUXVlcnlFcnJvcihlcnI6YW55KTpNeXNxbEVycm9ye1xuICAgICAgICBpZihlcnIgJiYgIHR5cGVvZiBlcnI9PT1cIm9iamVjdFwiICYmIFwiY29kZVwiIGluIGVyciAmJiBcImVycm5vXCIgaW4gZXJyICYmIFwic3FsXCIgaW4gZXJyICYmIFwibmFtZVwiIGluIGVyciAmJiBcIm1lc3NhZ2VcIiBpbiBlcnIpe1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogZXJyLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVycm5vOiBlcnIuZXJybm8sXG4gICAgICAgICAgICAgICAgICAgIHNxbDogZXJyLnNxbCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTplcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTplcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJRVUVSWV9FUlJcIixcbiAgICAgICAgICAgICAgICBlcnJubzogMTAwMDAyLFxuICAgICAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNxbDogXCJubyBxdWVyeVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6XCJRVUVSWV9FUlJcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlwiRXJyb3I6IFwiKyhlcnIpP2VycjpcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuY29uc3Qgc2VjcmV0X2tleT1cIkFLTFdrYWp3JV4mZGd3cWh3Izk4NDUzaTIzYmZrMjNybjJrbmtuZ2xyZ2plaXRcIlxuY29uc3Qgc2VjcmV0X2l2PVwicnRoYWRyZmsyM3JuMmtuIypGTktBQGd0NDRkZjN0c2xyZ2ojIyFpdFwiXG5cbi8vIEdlbmVyYXRlIHNlY3JldCBoYXNoIHdpdGggY3J5cHRvIHRvIHVzZSBmb3IgZW5jcnlwdGlvblxuY29uc3Qga2V5ID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlY3JldF9rZXkpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDMyKVxuY29uc3QgaXYgPSBjcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc2VjcmV0X2l2KS5kaWdlc3QoJ2hleCcpLnN1YnN0cmluZygwLCAxNilcblxuY29uc3QgZGVjcnlwdCA9KGVuY3J5cHRlZDpzdHJpbmcpOnN0cmluZ3xudWxsPT57XG4gIHRyeXtcbiAgICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5mcm9tKGVuY3J5cHRlZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBrZXksIGl2KTtcbiAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkLCAnYmluYXJ5JywgJ3V0ZjgnKTtcbiAgICAgIGRlY3J5cHRlZCArPSBkZWNpcGhlci5maW5hbCgndXRmOCcpO1xuICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgfWNhdGNoKGUpe1xuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY29uc3QgZW5jcnlwdCA9ICh0eHQ6c3RyaW5nKTpzdHJpbmd8bnVsbD0+e1xuICB0cnl7XG4gICAgICBsZXQgZW5jaXBoZXIgPSBjcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBrZXksIGl2KSxcbiAgICAgIGVuY3J5cHRlZCA9IGVuY2lwaGVyLnVwZGF0ZSh0eHQsICd1dGY4JywgJ2JpbmFyeScpO1xuICAgICAgZW5jcnlwdGVkICs9IGVuY2lwaGVyLmZpbmFsKCdiaW5hcnknKTtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShlbmNyeXB0ZWQsICdiaW5hcnknKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1jYXRjaChlKXtcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE15c3FsU2VydmljZTsiXX0=
|