1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const RunningStatus_1 = require("../RunningStatus");
|
4 | const Log_1 = require("../Log");
|
5 | /**
|
6 | * 对注册了的服务进行一层封装,便于ServicesManager使用。
|
7 | * 对于注册服务的生命周期进行管理。
|
8 | *
|
9 | * @class RegisteredService
|
10 | */
|
11 | class RegisteredService {
|
12 | constructor(service, manager) {
|
13 | /**
|
14 | * 绑定在服务上的错误监听器。
|
15 | *
|
16 | * @type {Function}
|
17 | */
|
18 | this._errorListener = async (err) => {
|
19 | const value = await this.service.onError(err);
|
20 | switch (value) {
|
21 | case false:
|
22 | this._manager.onError(err, this.service);
|
23 | break;
|
24 | case true:
|
25 | break;
|
26 | default:
|
27 | if (value instanceof Error)
|
28 | this._manager.onError(value, this.service);
|
29 | break;
|
30 | }
|
31 | };
|
32 | this._status = RunningStatus_1.RunningStatus.stopped;
|
33 | this.service = service;
|
34 | this._manager = manager;
|
35 | // 给服务绑定管理器
|
36 | this.service.servicesManager = manager;
|
37 | }
|
38 | /**
|
39 | * 服务的运行状态
|
40 | */
|
41 | get status() {
|
42 | return this._status;
|
43 | }
|
44 | /**
|
45 | * 启动服务。成功返回void,失败返回Error。
|
46 | * 如果抛出异常则一定是该程序内部逻辑错误
|
47 | * 这个方法仅供内部使用。
|
48 | *
|
49 | * @returns {Promise<Error | void>}
|
50 | */
|
51 | async _start() {
|
52 | //确保只有在stopped的情况下才能执行_start
|
53 | if (this._status !== RunningStatus_1.RunningStatus.stopped) {
|
54 | throw new Error(Log_1.log.s1.format(`服务:${this.service.name}`, '在还未完全关闭的情况下又再次被启动。', `当前的状态为:${RunningStatus_1.RunningStatus[this._status]}`));
|
55 | }
|
56 | try {
|
57 | Log_1.log.s1.l(Log_1.log.chalk.blue('服务:开始启动'), this.service.name);
|
58 | this._status = RunningStatus_1.RunningStatus.starting;
|
59 | await this.service.onStart();
|
60 | this.service.on('error', this._errorListener);
|
61 | Log_1.log.s1.l(Log_1.log.chalk.green('服务:成功启动'), this.service.name);
|
62 | this._status = RunningStatus_1.RunningStatus.running;
|
63 | }
|
64 | catch (err) {
|
65 | Log_1.log.s1.e(Log_1.log.chalk.red('服务:启动失败'), this.service.name, err);
|
66 | await this._stop();
|
67 | return err;
|
68 | }
|
69 | }
|
70 | /**
|
71 | * 停止服务。
|
72 | * 如果抛出异常则一定是该程序内部逻辑错误
|
73 | * 这个方法仅供内部使用。
|
74 | */
|
75 | async _stop() {
|
76 | //确保不会重复停止
|
77 | if (this._status === RunningStatus_1.RunningStatus.stopping || this._status === RunningStatus_1.RunningStatus.stopped) {
|
78 | throw new Error(Log_1.log.s1.format(`服务:${this.service.name}`, '在处于正在停止或已停止的状态下又再次被停止。', `当前的状态为:${RunningStatus_1.RunningStatus[this._status]}`));
|
79 | }
|
80 | try {
|
81 | Log_1.log.s1.l(Log_1.log.chalk.blue('服务:开始停止'), this.service.name);
|
82 | this._status = RunningStatus_1.RunningStatus.stopping;
|
83 | await this.service.onStop();
|
84 | Log_1.log.s1.l(Log_1.log.chalk.green('服务:成功停止'), this.service.name);
|
85 | }
|
86 | catch (err) {
|
87 | Log_1.log.s1.e(Log_1.log.chalk.red('服务:停止失败'), this.service.name, err);
|
88 | }
|
89 | finally {
|
90 | this._status = RunningStatus_1.RunningStatus.stopped;
|
91 | this.service.removeListener('error', this._errorListener);
|
92 | }
|
93 | }
|
94 | /**
|
95 | * 健康检查。
|
96 | * 如果抛出异常则一定是该程序内部逻辑错误
|
97 | * 这个方法仅供内部使用。
|
98 | *
|
99 | * @returns {(Promise<Error | void>)} 健康检查出现的错误
|
100 | */
|
101 | async _healthCheck() {
|
102 | // 确保只检查运行状况下的健康状态
|
103 | if (this._status !== RunningStatus_1.RunningStatus.running) {
|
104 | throw new Error(Log_1.log.s1.format(`服务:${this.service.name}`, '在非运行状态下进行了健康检查。', `当前的状态为:${RunningStatus_1.RunningStatus[this._status]}`));
|
105 | }
|
106 | try {
|
107 | await this.service.onHealthChecking();
|
108 | }
|
109 | catch (err) {
|
110 | Log_1.log.s1.w(`服务:${this.service.name}`, '运行状况异常:', err);
|
111 | return err;
|
112 | }
|
113 | }
|
114 | }
|
115 | exports.RegisteredService = RegisteredService;
|
116 |
|
117 | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJlZ2lzdGVyZWRTZXJ2aWNlL1JlZ2lzdGVyZWRTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsb0RBQWlEO0FBQ2pELGdDQUE2QjtBQUU3Qjs7Ozs7R0FLRztBQUNIO0lBMkNJLFlBQVksT0FBc0IsRUFBRSxPQUF3QjtRQXBDNUQ7Ozs7V0FJRztRQUNjLG1CQUFjLEdBQUcsS0FBSyxFQUFFLEdBQVU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU5QyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNaLEtBQUssS0FBSztvQkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN6QyxLQUFLLENBQUM7Z0JBQ1YsS0FBSyxJQUFJO29CQUNMLEtBQUssQ0FBQztnQkFDVjtvQkFDSSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDO3dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMvQyxLQUFLLENBQUM7WUFDZCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBZU0sWUFBTyxHQUFrQiw2QkFBYSxDQUFDLE9BQU8sQ0FBQztRQUduRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUV4QixXQUFXO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO0lBQzNDLENBQUM7SUFkRDs7T0FFRztJQUNILElBQVcsTUFBTTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFXRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFB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SUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQWEsQ0FBQyxPQUFPLENBQUM7WUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2Qsa0JBQWtCO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssNkJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQ1gsU0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQ1QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUN6QixpQkFBaUIsRUFDakIsVUFBVSw2QkFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUMxQyxDQUNKLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDWCxTQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZixDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBakpELDhDQWlKQyIsImZpbGUiOiJSZWdpc3RlcmVkU2VydmljZS9SZWdpc3RlcmVkU2VydmljZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2VNb2R1bGUgfSBmcm9tIFwiLi4vU2VydmljZU1vZHVsZS9TZXJ2aWNlTW9kdWxlXCI7XG5pbXBvcnQgeyBTZXJ2aWNlc01hbmFnZXIgfSBmcm9tIFwiLi4vU2VydmljZXNNYW5hZ2VyL1NlcnZpY2VzTWFuYWdlclwiO1xuaW1wb3J0IHsgUnVubmluZ1N0YXR1cyB9IGZyb20gXCIuLi9SdW5uaW5nU3RhdHVzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiLi4vTG9nXCI7XG5cbi8qKlxuICog5a+55rOo5YaM5LqG55qE5pyN5Yqh6L+b6KGM5LiA5bGC5bCB6KOF77yM5L6/5LqOU2VydmljZXNNYW5hZ2Vy5L2/55So44CCXG4gKiDlr7nkuo7ms6jlhozmnI3liqHnmoTnlJ/lkb3lkajmnJ/ov5vooYznrqHnkIbjgIJcbiAqIFxuICogQGNsYXNzIFJlZ2lzdGVyZWRTZXJ2aWNlXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpc3RlcmVkU2VydmljZSB7XG5cbiAgICAvKipcbiAgICAgKiDkv53lrZjlr7nmnI3liqHnrqHnkIblmajnmoTlvJXnlKhcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYW5hZ2VyOiBTZXJ2aWNlc01hbmFnZXI7XG5cbiAgICAvKipcbiAgICAgKiDnu5HlrprlnKjmnI3liqHkuIrnmoTplJnor6/nm5HlkKzlmajjgIJcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXJyb3JMaXN0ZW5lciA9IGFzeW5jIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLm9uRXJyb3IoZXJyKTtcblxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICAgIHRoaXMuX21hbmFnZXIub25FcnJvcihlcnIsIHRoaXMuc2VydmljZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYW5hZ2VyLm9uRXJyb3IodmFsdWUsIHRoaXMuc2VydmljZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICog5pyN5Yqh5a6e5L6LXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VNb2R1bGV9XG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VydmljZTogU2VydmljZU1vZHVsZTtcblxuICAgIC8qKlxuICAgICAqIOacjeWKoeeahOi/kOihjOeKtuaAgVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBwcml2YXRlIF9zdGF0dXM6IFJ1bm5pbmdTdGF0dXMgPSBSdW5uaW5nU3RhdHVzLnN0b3BwZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlOiBTZXJ2aWNlTW9kdWxlLCBtYW5hZ2VyOiBTZXJ2aWNlc01hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG5cbiAgICAgICAgLy8g57uZ5pyN5Yqh57uR5a6a566h55CG5ZmoXG4gICAgICAgIHRoaXMuc2VydmljZS5zZXJ2aWNlc01hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWQr+WKqOacjeWKoeOAguaIkOWKn+i/lOWbnnZvaWTvvIzlpLHotKXov5Tlm55FcnJvcuOAgiAgICBcbiAgICAgKiDlpoLmnpzmipvlh7rlvILluLjliJnkuIDlrprmmK/or6XnqIvluo/lhoXpg6jpgLvovpHplJnor68gICAgICBcbiAgICAgKiDov5nkuKrmlrnms5Xku4XkvpvlhoXpg6jkvb/nlKjjgIJcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxFcnJvciB8IHZvaWQ+fSBcbiAgICAgKi9cbiAgICBhc3luYyBfc3RhcnQoKTogUHJvbWlzZTxFcnJvciB8IHZvaWQ+IHtcbiAgICAgICAgLy/noa7kv53lj6rmnInlnKhzdG9wcGVk55qE5oOF5Ya15LiL5omN6IO95omn6KGMX3N0YXJ0XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXMgIT09IFJ1bm5pbmdTdGF0dXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGxvZy5zMS5mb3JtYXQoXG4gICAgICAgICAgICAgICAgICAgIGDmnI3liqHvvJoke3RoaXMuc2VydmljZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICflnKjov5jmnKrlrozlhajlhbPpl63nmoTmg4XlhrXkuIvlj4jlho3mrKHooqvlkK/liqjjgIInLFxuICAgICAgICAgICAgICAgICAgICBg5b2T5YmN55qE54q25oCB5Li677yaJHtSdW5uaW5nU3RhdHVzW3RoaXMuX3N0YXR1c119YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nLnMxLmwobG9nLmNoYWxrLmJsdWUoJ+acjeWKoe+8muW8gOWni+WQr+WKqCcpLCB0aGlzLnNlcnZpY2UubmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBSdW5uaW5nU3RhdHVzLnN0YXJ0aW5nO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2Uub25TdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLm9uKCdlcnJvcicsIHRoaXMuX2Vycm9yTGlzdGVuZXIpO1xuXG4gICAgICAgICAgICBsb2cuczEubChsb2cuY2hhbGsuZ3JlZW4oJ+acjeWKoe+8muaIkOWKn+WQr+WKqCcpLCB0aGlzLnNlcnZpY2UubmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBSdW5uaW5nU3RhdHVzLnJ1bm5pbmc7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLnMxLmUobG9nLmNoYWxrLnJlZCgn5pyN5Yqh77ya5ZCv5Yqo5aSx6LSlJyksIHRoaXMuc2VydmljZS5uYW1lLCBlcnIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc3RvcCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YGc5q2i5pyN5Yqh44CCICAgIFxuICAgICAqIOWmguaenOaKm+WHuuW8guW4uOWImeS4gOWumuaYr+ivpeeoi+W6j+WGhemDqOmAu+i+kemUmeivryAgICAgIFxuICAgICAqIOi/meS4quaWueazleS7heS+m+WGhemDqOS9v+eUqOOAglxuICAgICAqL1xuICAgIGFzeW5jIF9zdG9wKCkge1xuICAgICAgICAvL+ehruS/neS4jeS8mumHjeWkjeWBnOatolxuICAgICAgICBpZiAodGhpcy5fc3RhdHVzID09PSBSdW5uaW5nU3RhdHVzLnN0b3BwaW5nIHx8IHRoaXMuX3N0YXR1cyA9PT0gUnVubmluZ1N0YXR1cy5zdG9wcGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgbG9nLnMxLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgYOacjeWKoe+8miR7dGhpcy5zZXJ2aWNlLm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgJ+WcqOWkhOS6juato+WcqOWBnOatouaIluW3suWBnOatoueahOeKtuaAgeS4i+WPiOWGjeasoeiiq+WBnOatouOAgicsXG4gICAgICAgICAgICAgICAgICAgIGDlvZPliY3nmoTnirbmgIHkuLrvvJoke1J1bm5pbmdTdGF0dXNbdGhpcy5fc3RhdHVzXX1gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2cuczEubChsb2cuY2hhbGsuYmx1ZSgn5pyN5Yqh77ya5byA5aeL5YGc5q2iJyksIHRoaXMuc2VydmljZS5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFJ1bm5pbmdTdGF0dXMuc3RvcHBpbmc7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5vblN0b3AoKTtcblxuICAgICAgICAgICAgbG9nLnMxLmwobG9nLmNoYWxrLmdyZWVuKCfmnI3liqHvvJrmiJDlip/lgZzmraInKSwgdGhpcy5zZXJ2aWNlLm5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy5zMS5lKGxvZy5jaGFsay5yZWQoJ+acjeWKoe+8muWBnOatouWksei0pScpLCB0aGlzLnNlcnZpY2UubmFtZSwgZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFJ1bm5pbmdTdGF0dXMuc3RvcHBlZDtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9lcnJvckxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWBpeW6t+ajgOafpeOAglxuICAgICAqIOWmguaenOaKm+WHuuW8guW4uOWImeS4gOWumuaYr+ivpeeoi+W6j+WGhemDqOmAu+i+kemUmeivryAgICAgIFxuICAgICAqIOi/meS4quaWueazleS7heS+m+WGhemDqOS9v+eUqOOAglxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIHsoUHJvbWlzZTxFcnJvciB8IHZvaWQ+KX0g5YGl5bq35qOA5p+l5Ye6546w55qE6ZSZ6K+vXG4gICAgICovXG4gICAgYXN5bmMgX2hlYWx0aENoZWNrKCk6IFByb21pc2U8RXJyb3IgfCB2b2lkPiB7XG4gICAgICAgIC8vIOehruS/neWPquajgOafpei/kOihjOeKtuWGteS4i+eahOWBpeW6t+eKtuaAgVxuICAgICAgICBpZiAodGhpcy5fc3RhdHVzICE9PSBSdW5uaW5nU3RhdHVzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBsb2cuczEuZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICBg5pyN5Yqh77yaJHt0aGlzLnNlcnZpY2UubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAn5Zyo6Z2e6L+Q6KGM54q25oCB5LiL6L+b6KGM5LqG5YGl5bq35qOA5p+l44CCJyxcbiAgICAgICAgICAgICAgICAgICAgYOW9k+WJjeeahOeKtuaAgeS4uu+8miR7UnVubmluZ1N0YXR1c1t0aGlzLl9zdGF0dXNdfWBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5vbkhlYWx0aENoZWNraW5nKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLnMxLncoYOacjeWKoe+8miR7dGhpcy5zZXJ2aWNlLm5hbWV9YCwgJ+i/kOihjOeKtuWGteW8guW4uO+8micsIGVycik7XG4gICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==
|