b2b.service.js
33.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { Headers, Http, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs';
import { AppConfigService } from '../app-config/app-config.service';
import * as _ from 'lodash';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import 'rxjs/add/operator/map';
var B2bService = /** @class */ (function () {
function B2bService(http, appConfigService) {
this.http = http;
this.appConfigService = appConfigService;
this.verifyTokenUrl = '';
this.downloadTokenUrl = '';
this._verifyToken = new BehaviorSubject({});
this.verifyToken = {
'username': '$username',
'sessionId': '$sessionId',
'groupIntegrationNames': ['groupName1', 'groupName2', 'groupName3'],
'menus': ['menu1', 'menu2'],
'menuPermissions': [
{ 'menuName': 'menu1', 'permissions': ['add', 'edit', 'delete'] },
{ 'menuName': 'menu2', 'permissions': ['view', 'add', 'edit'] }
],
'attachmentToken': {
'token': 'DOWNLOADS_AEB496F6DED34FFF93F668412E3CDD38',
'expire': '2018-09-21 09:00:00'
}
};
this.config = appConfigService.getConfig();
// console.log('b2b config',this.config);
this.verifyTokenUrl = _.get(this.config, 'apiServers.portal-backend.verifyToken');
this.downloadTokenUrl = _.get(this.config, 'apiServers.portal-backend.downloadToken');
}
/**
* @return {?}
*/
B2bService.prototype.verify = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var body = {
'microIntegrationName': _.get(this.config, 'microIntegrationName')
};
return this.http.post(this.verifyTokenUrl, body, this.jwt()).map(function (res) {
// console.log(res.json());
// console.log(res);
res = res.json();
if (+res['resultCode'] === 20000) {
_this.verifyToken = res['resultData'];
_this._verifyToken.next(res['resultData']);
}
// else if(+res['resultCode'] === 40100){
// let __resultData = res['resultData'];
// this.checkSession(__resultData.userMessage);
// }
// console.log(this.verifyToken);
return res;
}).catch(function (error) { return Observable.throw(error.json().error || 'Server error'); }).toPromise();
};
/**
* @return {?}
*/
B2bService.prototype.subscribeVerifyToken = /**
* @return {?}
*/
function () {
return this._verifyToken.asObservable();
};
/**
* @return {?}
*/
B2bService.prototype.getVerifyToken = /**
* @return {?}
*/
function () {
return this._verifyToken.getValue();
};
/**
* @param {?} userMessage
* @return {?}
*/
B2bService.prototype.checkSession = /**
* @param {?} userMessage
* @return {?}
*/
function (userMessage) {
console.log('checkSession');
/** @type {?} */
var token = sessionStorage.getItem('token');
window.parent.postMessage(JSON.stringify({
command: "checkSession",
message: token,
userMessage: userMessage || 'Unknow'
}), '*');
console.log('checkSession', JSON.stringify({
command: "checkSession",
message: token,
userMessage: userMessage || 'Unknow'
}));
};
/** รับค่า role ที่มีสิทธิ์ */
// isCheckGroup(rolePermission) {
// console.log("rolePermission",rolePermission);
// /** mockup response*/
// let verify = [];
// this.verifyToken.menuPermissions.forEach(menuPermissions => {
// if (menuPermissions.menuName === rolePermission.role) {
// verify = menuPermissions.permissions;
// }
// });
// console.log("verify",verify);
// const checkArrary = _.intersection(verify, rolePermission.component);
// console.log("checkArrary",checkArrary);
// if (checkArrary.length !== 0) {
// return true;
// } else {
// return false;
// }
// }
/**
* รับค่า role ที่มีสิทธิ์
* @param {?} route
* @return {?}
*/
B2bService.prototype.isCheckGroup = /**
* รับค่า role ที่มีสิทธิ์
* @param {?} route
* @return {?}
*/
function (route) {
var e_1, _a;
/** @type {?} */
var verify = [];
try {
for (var _b = tslib_1.__values(this.verifyToken.menuPermissions), _c = _b.next(); !_c.done; _c = _b.next()) {
var menuPermissions = _c.value;
/** @type {?} */
var url = menuPermissions.url || "";
/** @type {?} */
var splitPath = url.split('?');
splitPath = splitPath.length > 0 ? splitPath[0].split('/') : [];
/** @type {?} */
var path = void 0; // ดึง path สุดท้าย
for (var i = 0; i <= splitPath.length; i++) {
// console.log('isCheckGroup splitPath[i]', splitPath[i]);
if (splitPath[i] === '#') {
path = splitPath[i + 1]; // ดึง path หลัง #
break;
}
}
// console.log("isCheckGroup path", path);
if (path === route.route) {
verify = menuPermissions.permissions;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
/** @type {?} */
var checkArrary = _.intersection(verify, route.component);
// console.log("isCheckGroup checkArrary", checkArrary);
if (checkArrary.length !== 0) {
return true;
}
else {
return false;
}
};
/** รับค่า guard ที่มีสิทธิ์ */
/**
* รับค่า guard ที่มีสิทธิ์
* @param {?} role
* @return {?}
*/
B2bService.prototype.isCheckGuard = /**
* รับค่า guard ที่มีสิทธิ์
* @param {?} role
* @return {?}
*/
function (role) {
/** *
* mockup response
@type {?} */
var checkArrary = _.intersection(this.verifyToken.menus, [role]);
// console.log("checkArrary",checkArrary);
if (checkArrary.length !== 0) {
return true;
}
else {
return false;
}
};
/**
* @return {?}
*/
B2bService.prototype.verifyDemo = /**
* @return {?}
*/
function () {
/** @type {?} */
var token = sessionStorage.getItem('token');
// console.log('token', token);
if (token && token === 'demo') {
return of({
'resultCode': '20000',
'resultDescription': 'Success',
'resultData': {
'b2bToken': '$b2bToken'
}
}).toPromise();
}
return of({
'resultCode': '40000',
'resultDescription': '',
}).toPromise();
};
/**
* @return {?}
*/
B2bService.prototype.jwt = /**
* @return {?}
*/
function () {
/** @type {?} */
var token = sessionStorage.getItem('token');
if (token) {
/** @type {?} */
var headers = new Headers({ 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', 'x-token': '1' });
return new RequestOptions({ headers: headers });
}
};
/**
* @return {?}
*/
B2bService.prototype.getAttachmentToken = /**
* @return {?}
*/
function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var now, expireDate, checkDateValid, response, e_2;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
now = new Date();
expireDate = new Date(this.verifyToken.attachmentToken.expire);
checkDateValid = now <= expireDate;
if (!checkDateValid) return [3 /*break*/, 1];
return [2 /*return*/, this.verifyToken.attachmentToken.token];
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, this.http.post(this.downloadTokenUrl, {}, this.jwt()).map(function (res) {
return res.json();
}).catch(function (error) { return Observable.throw(error.json().error || 'Server error'); }).toPromise()];
case 2:
response = _a.sent();
// console.log('response ',response);
if (+response['resultCode'] === 20000) {
this.verifyToken.attachmentToken = response['resultData'];
return [2 /*return*/, response['resultData'].token];
}
// else if(+response['resultCode'] === 40100){
// let __resultData = response['resultData'];
// this.checkSession(__resultData.userMessage);
// return '';
// }
else {
return [2 /*return*/, ''];
}
return [3 /*break*/, 4];
case 3:
e_2 = _a.sent();
console.log('error ', e_2);
return [2 /*return*/, ''];
case 4: return [2 /*return*/];
}
});
});
};
/** รับค่า guard ที่มีสิทธิ์ */
/**
* รับค่า guard ที่มีสิทธิ์
* @param {?} route
* @return {?}
*/
B2bService.prototype.isCheckGuardRoutePath = /**
* รับค่า guard ที่มีสิทธิ์
* @param {?} route
* @return {?}
*/
function (route) {
var e_3, _a;
try {
// console.log("route",route);
// console.log("this.verifyToken",this.verifyToken);
for (var _b = tslib_1.__values(this.verifyToken.menuPermissions), _c = _b.next(); !_c.done; _c = _b.next()) {
var menuPermissions = _c.value;
/** @type {?} */
var url = menuPermissions.url || "";
/** @type {?} */
var splitPath = url.split('?');
splitPath = splitPath.length > 0 ? splitPath[0].split('/') : [];
/** @type {?} */
var path = void 0; // ดึง path สุดท้าย
for (var i = 0; i <= splitPath.length; i++) {
// console.log('splitPath[i]', splitPath[i]);
if (splitPath[i] === '#') {
path = splitPath[i + 1]; // ดึง path หลัง #
break;
}
}
// console.log("path",path);
if (path === route) {
return true;
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_3) throw e_3.error; }
}
return false;
};
B2bService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
B2bService.ctorParameters = function () { return [
{ type: Http },
{ type: AppConfigService }
]; };
return B2bService;
}());
export { B2bService };
if (false) {
/** @type {?} */
B2bService.prototype.verifyTokenUrl;
/** @type {?} */
B2bService.prototype.downloadTokenUrl;
/** @type {?} */
B2bService.prototype._verifyToken;
/** @type {?} */
B2bService.prototype.config;
/** @type {?} */
B2bService.prototype.verifyToken;
/** @type {?} */
B2bService.prototype.http;
/** @type {?} */
B2bService.prototype.appConfigService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYjJiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2IyYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sdUJBQXVCLENBQUM7O0lBc0IzQixvQkFBb0IsSUFBVSxFQUNWO1FBREEsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUNWLHFCQUFnQixHQUFoQixnQkFBZ0I7OEJBbkJuQixFQUFFO2dDQUNBLEVBQUU7NEJBQ0QsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDOzJCQUV4QjtZQUNmLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLHVCQUF1QixFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7WUFDbkUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUMzQixpQkFBaUIsRUFBRTtnQkFDZixFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDakUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLE1BQU0s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b3JlJztcbmltcG9ydCB7IEhlYWRlcnMsIEh0dHAsIFJlcXVlc3RPcHRpb25zLCBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2FwcC1jb25maWcvYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvQmVoYXZpb3JTdWJqZWN0JztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEIyYlNlcnZpY2Uge1xuICAgIHZlcmlmeVRva2VuVXJsID0gJyc7XG4gICAgZG93bmxvYWRUb2tlblVybCA9ICcnO1xuICAgIF92ZXJpZnlUb2tlbjogYW55ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG4gICAgY29uZmlnOiBhbnk7XG4gICAgdmVyaWZ5VG9rZW46IGFueSA9IHtcbiAgICAgICAgJ3VzZXJuYW1lJzogJyR1c2VybmFtZScsXG4gICAgICAgICdzZXNzaW9uSWQnOiAnJHNlc3Npb25JZCcsXG4gICAgICAgICdncm91cEludGVncmF0aW9uTmFtZXMnOiBbJ2dyb3VwTmFtZTEnLCAnZ3JvdXBOYW1lMicsICdncm91cE5hbWUzJ10sXG4gICAgICAgICdtZW51cyc6IFsnbWVudTEnLCAnbWVudTInXSxcbiAgICAgICAgJ21lbnVQZXJtaXNzaW9ucyc6IFtcbiAgICAgICAgICAgIHsgJ21lbnVOYW1lJzogJ21lbnUxJywgJ3Blcm1pc3Npb25zJzogWydhZGQnLCAnZWRpdCcsICdkZWxldGUnXSB9LFxuICAgICAgICAgICAgeyAnbWVudU5hbWUnOiAnbWVudTInLCAncGVybWlzc2lvbnMnOiBbJ3ZpZXcnLCAnYWRkJywgJ2VkaXQnXSB9XG4gICAgICAgIF0sXG4gICAgICAgICdhdHRhY2htZW50VG9rZW4nOiB7XG4gICAgICAgICAgICAndG9rZW4nOiAnRE9XTkxPQURTX0FFQjQ5NkY2REVEMzRGRkY5M0Y2Njg0MTJFM0NERDM4JyxcbiAgICAgICAgICAgICdleHBpcmUnOiAnMjAxOC0wOS0yMSAwOTowMDowMCdcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBwQ29uZmlnU2VydmljZTogQXBwQ29uZmlnU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcHBDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnYjJiIGNvbmZpZycsdGhpcy5jb25maWcpO1xuICAgICAgICB0aGlzLnZlcmlmeVRva2VuVXJsID0gXy5nZXQodGhpcy5jb25maWcsICdhcGlTZXJ2ZXJzLnBvcnRhbC1iYWNrZW5kLnZlcmlmeVRva2VuJyk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRUb2tlblVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5wb3J0YWwtYmFja2VuZC5kb3dubG9hZFRva2VuJyk7XG4gICAgfVxuICAgIHZlcmlmeSgpIHtcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5jb25maWcuYXBpVmVyaWZ5VG9rZW4gKyB0aGlzLnVybCwgdGhpcy5qd3QoKSkudG9Qcm9taXNlKCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICAnbWljcm9JbnRlZ3JhdGlvbk5hbWUnOiBfLmdldCh0aGlzLmNvbmZpZywgJ21pY3JvSW50ZWdyYXRpb25OYW1lJylcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudmVyaWZ5VG9rZW5VcmwsIGJvZHksIHRoaXMuand0KCkpLm1hcCgocmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzLmpzb24oKSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgcmVzID0gcmVzLmpzb24oKTtcbiAgICAgICAgICAgIGlmICgrcmVzWydyZXN1bHRDb2RlJ10gPT09IDIwMDAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJpZnlUb2tlbiA9IHJlc1sncmVzdWx0RGF0YSddO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeVRva2VuLm5leHQocmVzWydyZXN1bHREYXRhJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBpZigrcmVzWydyZXN1bHRDb2RlJ10gPT09IDQwMTAwKXtcbiAgICAgICAgICAgIC8vICAgbGV0IF9fcmVzdWx0RGF0YSA9IHJlc1sncmVzdWx0RGF0YSddO1xuICAgICAgICAgICAgLy8gICB0aGlzLmNoZWNrU2Vzc2lvbihfX3Jlc3VsdERhdGEudXNlck1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy52ZXJpZnlUb2tlbik7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSkgPT4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvci5qc29uKCkuZXJyb3IgfHwgJ1NlcnZlciBlcnJvcicpKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3Vic2NyaWJlVmVyaWZ5VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlUb2tlbi5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBnZXRWZXJpZnlUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeVRva2VuLmdldFZhbHVlKCk7XG4gICAgfVxuXG5cbiAgICBjaGVja1Nlc3Npb24odXNlck1lc3NhZ2Upe1xuICAgICAgY29uc29sZS5sb2coJ2NoZWNrU2Vzc2lvbicpO1xuICAgICAgY29uc3QgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29tbWFuZDpcImNoZWNrU2Vzc2lvblwiLFxuICAgICAgICAgIG1lc3NhZ2U6IHRva2VuLFxuICAgICAgICAgIHVzZXJNZXNzYWdlOiB1c2VyTWVzc2FnZSB8fCAnVW5rbm93J1xuICAgICAgfSksICcqJyk7XG4gICAgICBjb25zb2xlLmxvZygnY2hlY2tTZXNzaW9uJyxKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29tbWFuZDpcImNoZWNrU2Vzc2lvblwiLFxuICAgICAgICAgIG1lc3NhZ2U6IHRva2VuLFxuICAgICAgICAgIHVzZXJNZXNzYWdlOiB1c2VyTWVzc2FnZSB8fCAnVW5rbm93J1xuICAgICAgfSkpO1xuICAgIH1cblxuXG4gICAgLyoqIOC4o+C4seC4muC4hOC5iOC4siByb2xlIOC4l+C4teC5iOC4oeC4teC4quC4tOC4l+C4mOC4tOC5jCAqL1xuICAgIC8vIGlzQ2hlY2tHcm91cChyb2xlUGVybWlzc2lvbikge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhcInJvbGVQZXJtaXNzaW9uXCIscm9sZVBlcm1pc3Npb24pO1xuICAgIC8vICAgICAvKiogbW9ja3VwIHJlc3BvbnNlKi9cbiAgICAvLyAgICAgbGV0IHZlcmlmeSA9IFtdO1xuICAgIC8vICAgICB0aGlzLnZlcmlmeVRva2VuLm1lbnVQZXJtaXNzaW9ucy5mb3JFYWNoKG1lbnVQZXJtaXNzaW9ucyA9PiB7XG4gICAgLy8gICAgICAgICBpZiAobWVudVBlcm1pc3Npb25zLm1lbnVOYW1lID09PSByb2xlUGVybWlzc2lvbi5yb2xlKSB7XG4gICAgLy8gICAgICAgICAgICAgdmVyaWZ5ID0gbWVudVBlcm1pc3Npb25zLnBlcm1pc3Npb25zO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJ2ZXJpZnlcIix2ZXJpZnkpO1xuXG4gICAgLy8gICAgIGNvbnN0IGNoZWNrQXJyYXJ5ID0gXy5pbnRlcnNlY3Rpb24odmVyaWZ5LCByb2xlUGVybWlzc2lvbi5jb21wb25lbnQpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWNrQXJyYXJ5XCIsY2hlY2tBcnJhcnkpO1xuICAgIC8vICAgICBpZiAoY2hlY2tBcnJhcnkubGVuZ3RoICE9PSAwKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIGlzQ2hlY2tHcm91cChyb3V0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCByb3V0ZVwiLCByb3V0ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIHRoaXMudmVyaWZ5VG9rZW5cIiwgdGhpcy52ZXJpZnlUb2tlbik7XG4gICAgICAgIGxldCB2ZXJpZnkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbWVudVBlcm1pc3Npb25zIG9mIHRoaXMudmVyaWZ5VG9rZW4ubWVudVBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzQ2hlY2tHcm91cCBtZW51UGVybWlzc2lvbnNcIiwgbWVudVBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSBtZW51UGVybWlzc2lvbnMudXJsIHx8IFwiXCI7XG4gICAgICAgICAgICBsZXQgc3BsaXRQYXRoID0gdXJsLnNwbGl0KCc/Jyk7XG4gICAgICAgICAgICBzcGxpdFBhdGggPSBzcGxpdFBhdGgubGVuZ3RoID4gMCA/IHNwbGl0UGF0aFswXS5zcGxpdCgnLycpIDogW107IC8vIHNwbGl0IHBhdGhcbiAgICAgICAgICAgIGxldCBwYXRoOyAvLyDguJTguLbguIcgcGF0aCDguKrguLjguJTguJfguYnguLLguKJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdpc0NoZWNrR3JvdXAgc3BsaXRQYXRoW2ldJywgc3BsaXRQYXRoW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXRQYXRoW2ldID09PSAnIycpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHNwbGl0UGF0aFtpICsgMV07IC8vIOC4lOC4tuC4hyBwYXRoIOC4q+C4peC4seC4hyAjXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIHBhdGhcIiwgcGF0aCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gcm91dGUucm91dGUpIHtcbiAgICAgICAgICAgICAgICB2ZXJpZnkgPSBtZW51UGVybWlzc2lvbnMucGVybWlzc2lvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0NoZWNrR3JvdXAgdmVyaWZ5XCIsIHZlcmlmeSk7XG5cbiAgICAgICAgY29uc3QgY2hlY2tBcnJhcnkgPSBfLmludGVyc2VjdGlvbih2ZXJpZnksIHJvdXRlLmNvbXBvbmVudCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNDaGVja0dyb3VwIGNoZWNrQXJyYXJ5XCIsIGNoZWNrQXJyYXJ5KTtcbiAgICAgICAgaWYgKGNoZWNrQXJyYXJ5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog4Lij4Lix4Lia4LiE4LmI4LiyIGd1YXJkIOC4l+C4teC5iOC4oeC4teC4quC4tOC4l+C4mOC4tOC5jCAqL1xuICAgIGlzQ2hlY2tHdWFyZChyb2xlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicm9sZVwiLHJvbGUpO1xuICAgICAgICAvKiogbW9ja3VwIHJlc3BvbnNlKi9cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnZlcmlmeVRva2VuLm1lbnVzKTtcbiAgICAgICAgY29uc3QgY2hlY2tBcnJhcnkgPSBfLmludGVyc2VjdGlvbih0aGlzLnZlcmlmeVRva2VuLm1lbnVzLCBbcm9sZV0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrQXJyYXJ5XCIsY2hlY2tBcnJhcnkpO1xuICAgICAgICBpZiAoY2hlY2tBcnJhcnkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZlcmlmeURlbW8oKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rva2VuJywgdG9rZW4pO1xuICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4gPT09ICdkZW1vJykge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICAncmVzdWx0Q29kZSc6ICcyMDAwMCcsXG4gICAgICAgICAgICAgICAgJ3Jlc3VsdERlc2NyaXB0aW9uJzogJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICdyZXN1bHREYXRhJzoge1xuICAgICAgICAgICAgICAgICAgICAnYjJiVG9rZW4nOiAnJGIyYlRva2VuJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRvUHJvbWlzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAncmVzdWx0Q29kZSc6ICc0MDAwMCcsXG4gICAgICAgICAgICAncmVzdWx0RGVzY3JpcHRpb24nOiAnJyxcbiAgICAgICAgfSkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBqd3QoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhdXRob3JpemF0aW9uIGhlYWRlciB3aXRoIGp3dCB0b2tlblxuICAgICAgICBjb25zdCB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG5cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIHRva2VuICwgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ3gtdG9rZW4nOiAnMScgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEF0dGFjaG1lbnRUb2tlbigpe1xuXG4gICAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgZXhwaXJlRGF0ZSA9IG5ldyBEYXRlKHRoaXMudmVyaWZ5VG9rZW4uYXR0YWNobWVudFRva2VuLmV4cGlyZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwibm93XCIsbm93KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJleHBpcmVEYXRlXCIsZXhwaXJlRGF0ZSk7XG4gICAgICAgIGxldCBjaGVja0RhdGVWYWxpZCA9IG5vdyA8PSBleHBpcmVEYXRlO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrRGF0ZVZhbGlkXCIsY2hlY2tEYXRlVmFsaWQpO1xuICAgICAgICBpZihjaGVja0RhdGVWYWxpZCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJpZnlUb2tlbi5hdHRhY2htZW50VG9rZW4udG9rZW47XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cC5wb3N0KHRoaXMuZG93bmxvYWRUb2tlblVybCwge30sIHRoaXMuand0KCkpLm1hcCgocmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSkgPT4gT2JzZXJ2YWJsZS50aHJvdyhlcnJvci5qc29uKCkuZXJyb3IgfHwgJ1NlcnZlciBlcnJvcicpKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygncmVzcG9uc2UgJyxyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgaWYgKCtyZXNwb25zZVsncmVzdWx0Q29kZSddID09PSAyMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcmlmeVRva2VuLmF0dGFjaG1lbnRUb2tlbiA9IHJlc3BvbnNlWydyZXN1bHREYXRhJ107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVsncmVzdWx0RGF0YSddLnRva2VuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbHNlIGlmKCtyZXNwb25zZVsncmVzdWx0Q29kZSddID09PSA0MDEwMCl7XG4gICAgICAgICAgICAgICAgLy8gICBsZXQgX19yZXN1bHREYXRhID0gcmVzcG9uc2VbJ3Jlc3VsdERhdGEnXTtcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuY2hlY2tTZXNzaW9uKF9fcmVzdWx0RGF0YS51c2VyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgLy8gICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9Y2F0Y2ggKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnLGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiog4Lij4Lix4Lia4LiE4LmI4LiyIGd1YXJkIOC4l+C4teC5iOC4oeC4teC4quC4tOC4l+C4mOC4tOC5jCAqL1xuICAgIGlzQ2hlY2tHdWFyZFJvdXRlUGF0aChyb3V0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJvdXRlXCIscm91dGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInRoaXMudmVyaWZ5VG9rZW5cIix0aGlzLnZlcmlmeVRva2VuKTtcbiAgICAgICAgZm9yKGxldCBtZW51UGVybWlzc2lvbnMgb2YgdGhpcy52ZXJpZnlUb2tlbi5tZW51UGVybWlzc2lvbnMpe1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtZW51UGVybWlzc2lvbnNcIixtZW51UGVybWlzc2lvbnMpO1xuICAgICAgICAgICAgbGV0IHVybCA9IG1lbnVQZXJtaXNzaW9ucy51cmwgfHwgXCJcIjtcbiAgICAgICAgICAgIGxldCBzcGxpdFBhdGggPSB1cmwuc3BsaXQoJz8nKTtcbiAgICAgICAgICAgIHNwbGl0UGF0aCA9IHNwbGl0UGF0aC5sZW5ndGggPiAwID8gc3BsaXRQYXRoWzBdLnNwbGl0KCcvJykgOiBbXTsgLy8gc3BsaXQgcGF0aFxuICAgICAgICAgICAgbGV0IHBhdGg7IC8vIOC4lOC4tuC4hyBwYXRoIOC4quC4uOC4lOC4l+C5ieC4suC4olxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc3BsaXRQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3NwbGl0UGF0aFtpXScsIHNwbGl0UGF0aFtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UGF0aFtpXSA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBzcGxpdFBhdGhbaSsxXTsgLy8g4LiU4Li24LiHIHBhdGgg4Lir4Lil4Lix4LiHICNcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXRoXCIscGF0aCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gcm91dGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19