@bigtyphoon/melo 1.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +55 -0
  3. package/bin/commadtest.ts +10 -0
  4. package/bin/commands/add.ts +43 -0
  5. package/bin/commands/init.ts +292 -0
  6. package/bin/commands/kill.ts +21 -0
  7. package/bin/commands/list.ts +60 -0
  8. package/bin/commands/masterha.ts +40 -0
  9. package/bin/commands/restart.ts +48 -0
  10. package/bin/commands/start.ts +65 -0
  11. package/bin/commands/stop.ts +26 -0
  12. package/bin/melo.ts +30 -0
  13. package/bin/utils/constants.ts +27 -0
  14. package/bin/utils/utils.ts +130 -0
  15. package/dist/bin/commadtest.js +9 -0
  16. package/dist/bin/commands/add.js +40 -0
  17. package/dist/bin/commands/init.js +279 -0
  18. package/dist/bin/commands/kill.js +21 -0
  19. package/dist/bin/commands/list.js +65 -0
  20. package/dist/bin/commands/masterha.js +36 -0
  21. package/dist/bin/commands/restart.js +45 -0
  22. package/dist/bin/commands/start.js +58 -0
  23. package/dist/bin/commands/stop.js +20 -0
  24. package/dist/bin/melo.js +26 -0
  25. package/dist/bin/utils/constants.js +28 -0
  26. package/dist/bin/utils/utils.js +134 -0
  27. package/dist/lib/application.js +888 -0
  28. package/dist/lib/common/manager/appManager.js +112 -0
  29. package/dist/lib/common/manager/taskManager.js +39 -0
  30. package/dist/lib/common/remote/backend/msgRemote.js +63 -0
  31. package/dist/lib/common/remote/frontend/channelRemote.js +78 -0
  32. package/dist/lib/common/remote/frontend/sessionRemote.js +76 -0
  33. package/dist/lib/common/service/backendSessionService.js +337 -0
  34. package/dist/lib/common/service/channelService.js +514 -0
  35. package/dist/lib/common/service/connectionService.js +95 -0
  36. package/dist/lib/common/service/filterService.js +112 -0
  37. package/dist/lib/common/service/handlerService.js +187 -0
  38. package/dist/lib/common/service/sessionService.js +610 -0
  39. package/dist/lib/components/backendSession.js +14 -0
  40. package/dist/lib/components/channel.js +13 -0
  41. package/dist/lib/components/connection.js +12 -0
  42. package/dist/lib/components/connector.js +437 -0
  43. package/dist/lib/components/dictionary.js +93 -0
  44. package/dist/lib/components/master.js +39 -0
  45. package/dist/lib/components/monitor.js +25 -0
  46. package/dist/lib/components/protobuf.js +156 -0
  47. package/dist/lib/components/proxy.js +236 -0
  48. package/dist/lib/components/pushScheduler.js +62 -0
  49. package/dist/lib/components/remote.js +127 -0
  50. package/dist/lib/components/server.js +63 -0
  51. package/dist/lib/components/session.js +20 -0
  52. package/dist/lib/connectors/commands/handshake.js +119 -0
  53. package/dist/lib/connectors/commands/heartbeat.js +67 -0
  54. package/dist/lib/connectors/commands/kick.js +15 -0
  55. package/dist/lib/connectors/common/coder.js +90 -0
  56. package/dist/lib/connectors/common/handler.js +57 -0
  57. package/dist/lib/connectors/hybrid/IHybridSocket.js +3 -0
  58. package/dist/lib/connectors/hybrid/switcher.js +100 -0
  59. package/dist/lib/connectors/hybrid/tcpprocessor.js +40 -0
  60. package/dist/lib/connectors/hybrid/tcpsocket.js +171 -0
  61. package/dist/lib/connectors/hybrid/wsprocessor.js +49 -0
  62. package/dist/lib/connectors/hybridconnector.js +89 -0
  63. package/dist/lib/connectors/hybridsocket.js +139 -0
  64. package/dist/lib/connectors/mqtt/generate.js +113 -0
  65. package/dist/lib/connectors/mqtt/mqttadaptor.js +81 -0
  66. package/dist/lib/connectors/mqtt/protocol.js +48 -0
  67. package/dist/lib/connectors/mqttconnector.js +107 -0
  68. package/dist/lib/connectors/mqttsocket.js +59 -0
  69. package/dist/lib/connectors/sioconnector.js +135 -0
  70. package/dist/lib/connectors/siosocket.js +69 -0
  71. package/dist/lib/connectors/udpconnector.js +76 -0
  72. package/dist/lib/connectors/udpsocket.js +93 -0
  73. package/dist/lib/filters/handler/serial.js +44 -0
  74. package/dist/lib/filters/handler/time.js +32 -0
  75. package/dist/lib/filters/handler/timeout.js +45 -0
  76. package/dist/lib/filters/handler/toobusy.js +36 -0
  77. package/dist/lib/filters/rpc/rpcLog.js +43 -0
  78. package/dist/lib/filters/rpc/toobusy.js +41 -0
  79. package/dist/lib/index.js +81 -0
  80. package/dist/lib/interfaces/IComponent.js +3 -0
  81. package/dist/lib/interfaces/IConnector.js +3 -0
  82. package/dist/lib/interfaces/IHandlerFilter.js +3 -0
  83. package/dist/lib/interfaces/ILifeCycle.js +3 -0
  84. package/dist/lib/interfaces/IPlugin.js +3 -0
  85. package/dist/lib/interfaces/IPushScheduler.js +3 -0
  86. package/dist/lib/interfaces/ISocket.js +3 -0
  87. package/dist/lib/interfaces/IStore.js +3 -0
  88. package/dist/lib/interfaces/define.js +3 -0
  89. package/dist/lib/master/master.js +129 -0
  90. package/dist/lib/master/starter.js +236 -0
  91. package/dist/lib/master/watchdog.js +120 -0
  92. package/dist/lib/melo.js +125 -0
  93. package/dist/lib/modules/console.js +436 -0
  94. package/dist/lib/modules/masterwatcher.js +98 -0
  95. package/dist/lib/modules/monitorwatcher.js +124 -0
  96. package/dist/lib/modules/onlineUser.js +69 -0
  97. package/dist/lib/modules/restartNotifyModule.js +107 -0
  98. package/dist/lib/modules/watchServer.js +737 -0
  99. package/dist/lib/monitor/monitor.js +80 -0
  100. package/dist/lib/pushSchedulers/buffer.js +96 -0
  101. package/dist/lib/pushSchedulers/direct.js +58 -0
  102. package/dist/lib/pushSchedulers/multi.js +80 -0
  103. package/dist/lib/server/server.js +500 -0
  104. package/dist/lib/util/appUtil.js +306 -0
  105. package/dist/lib/util/constants.js +117 -0
  106. package/dist/lib/util/countDownLatch.js +51 -0
  107. package/dist/lib/util/events.js +20 -0
  108. package/dist/lib/util/handlerHelper.js +8 -0
  109. package/dist/lib/util/log.js +14 -0
  110. package/dist/lib/util/moduleUtil.js +101 -0
  111. package/dist/lib/util/pathUtil.js +134 -0
  112. package/dist/lib/util/remoterHelper.js +8 -0
  113. package/dist/lib/util/utils.js +358 -0
  114. package/dist/test/application.js +522 -0
  115. package/dist/test/config/log4js.json +28 -0
  116. package/dist/test/config/master.json +9 -0
  117. package/dist/test/config/servers.json +6 -0
  118. package/dist/test/filters/handler/serial.js +41 -0
  119. package/dist/test/filters/handler/time.js +41 -0
  120. package/dist/test/filters/handler/timeout.js +41 -0
  121. package/dist/test/filters/handler/toobusy.js +57 -0
  122. package/dist/test/filters/rpc/rpcLog.js +22 -0
  123. package/dist/test/filters/rpc/toobusy.js +39 -0
  124. package/dist/test/manager/mockChannelManager.js +77 -0
  125. package/dist/test/manager/taskManager.js +68 -0
  126. package/dist/test/mock-base/app/servers/other-file +0 -0
  127. package/dist/test/mock-plugin/components/mockPlugin.js +10 -0
  128. package/dist/test/mock-plugin/events/mockEvent.js +12 -0
  129. package/dist/test/modules/console.js +242 -0
  130. package/dist/test/pomelo.js +19 -0
  131. package/dist/test/remote/channelRemote.js +159 -0
  132. package/dist/test/service/channel.js +134 -0
  133. package/dist/test/service/channelService.js +216 -0
  134. package/dist/test/service/connectionService.js +114 -0
  135. package/dist/test/service/filterService.js +144 -0
  136. package/dist/test/service/handlerService.js +65 -0
  137. package/dist/test/service/sessionService.js +387 -0
  138. package/dist/test/util/countDownLatch.js +70 -0
  139. package/dist/test/util/pathUtil.js +108 -0
  140. package/dist/test/util/utils.js +140 -0
  141. package/lib/application.ts +1240 -0
  142. package/lib/common/manager/appManager.ts +118 -0
  143. package/lib/common/manager/taskManager.ts +50 -0
  144. package/lib/common/remote/backend/msgRemote.ts +134 -0
  145. package/lib/common/remote/frontend/channelRemote.ts +91 -0
  146. package/lib/common/remote/frontend/sessionRemote.ts +91 -0
  147. package/lib/common/service/backendSessionService.ts +388 -0
  148. package/lib/common/service/channelService.ts +609 -0
  149. package/lib/common/service/connectionService.ts +112 -0
  150. package/lib/common/service/filterService.ts +118 -0
  151. package/lib/common/service/handlerService.ts +224 -0
  152. package/lib/common/service/sessionService.ts +731 -0
  153. package/lib/components/backendSession.ts +14 -0
  154. package/lib/components/channel.ts +11 -0
  155. package/lib/components/connection.ts +13 -0
  156. package/lib/components/connector.ts +533 -0
  157. package/lib/components/dictionary.ts +121 -0
  158. package/lib/components/master.ts +41 -0
  159. package/lib/components/monitor.ts +30 -0
  160. package/lib/components/protobuf.ts +208 -0
  161. package/lib/components/proxy.ts +282 -0
  162. package/lib/components/pushScheduler.ts +70 -0
  163. package/lib/components/remote.ts +166 -0
  164. package/lib/components/server.ts +71 -0
  165. package/lib/components/session.ts +22 -0
  166. package/lib/connectors/commands/handshake.ts +155 -0
  167. package/lib/connectors/commands/heartbeat.ts +83 -0
  168. package/lib/connectors/commands/kick.ts +11 -0
  169. package/lib/connectors/common/coder.ts +93 -0
  170. package/lib/connectors/common/handler.ts +62 -0
  171. package/lib/connectors/hybrid/IHybridSocket.ts +9 -0
  172. package/lib/connectors/hybrid/switcher.ts +142 -0
  173. package/lib/connectors/hybrid/tcpprocessor.ts +43 -0
  174. package/lib/connectors/hybrid/tcpsocket.ts +223 -0
  175. package/lib/connectors/hybrid/wsprocessor.ts +57 -0
  176. package/lib/connectors/hybridconnector.ts +134 -0
  177. package/lib/connectors/hybridsocket.ts +168 -0
  178. package/lib/connectors/mqtt/generate.ts +103 -0
  179. package/lib/connectors/mqtt/mqttadaptor.ts +114 -0
  180. package/lib/connectors/mqtt/protocol.ts +49 -0
  181. package/lib/connectors/mqttconnector.ts +134 -0
  182. package/lib/connectors/mqttsocket.ts +79 -0
  183. package/lib/connectors/sioconnector.ts +161 -0
  184. package/lib/connectors/siosocket.ts +85 -0
  185. package/lib/connectors/udpconnector.ts +113 -0
  186. package/lib/connectors/udpsocket.ts +110 -0
  187. package/lib/filters/handler/serial.ts +46 -0
  188. package/lib/filters/handler/time.ts +35 -0
  189. package/lib/filters/handler/timeout.ts +50 -0
  190. package/lib/filters/handler/toobusy.ts +37 -0
  191. package/lib/filters/rpc/rpcLog.ts +42 -0
  192. package/lib/filters/rpc/toobusy.ts +41 -0
  193. package/lib/index.ts +74 -0
  194. package/lib/interfaces/IComponent.ts +47 -0
  195. package/lib/interfaces/IConnector.ts +20 -0
  196. package/lib/interfaces/IHandlerFilter.ts +15 -0
  197. package/lib/interfaces/ILifeCycle.ts +16 -0
  198. package/lib/interfaces/IPlugin.ts +65 -0
  199. package/lib/interfaces/IPushScheduler.ts +52 -0
  200. package/lib/interfaces/ISocket.ts +26 -0
  201. package/lib/interfaces/IStore.ts +10 -0
  202. package/lib/interfaces/define.ts +15 -0
  203. package/lib/master/master.ts +148 -0
  204. package/lib/master/starter.ts +234 -0
  205. package/lib/master/watchdog.ts +135 -0
  206. package/lib/melo.ts +152 -0
  207. package/lib/modules/console.ts +465 -0
  208. package/lib/modules/masterwatcher.ts +120 -0
  209. package/lib/modules/monitorwatcher.ts +151 -0
  210. package/lib/modules/onlineUser.ts +78 -0
  211. package/lib/modules/restartNotifyModule.ts +128 -0
  212. package/lib/modules/watchServer.ts +766 -0
  213. package/lib/monitor/monitor.ts +99 -0
  214. package/lib/pushSchedulers/buffer.ts +117 -0
  215. package/lib/pushSchedulers/direct.ts +65 -0
  216. package/lib/pushSchedulers/multi.ts +94 -0
  217. package/lib/server/server.ts +554 -0
  218. package/lib/util/appUtil.ts +313 -0
  219. package/lib/util/constants.ts +154 -0
  220. package/lib/util/countDownLatch.ts +72 -0
  221. package/lib/util/events.ts +15 -0
  222. package/lib/util/handlerHelper.ts +5 -0
  223. package/lib/util/log.ts +11 -0
  224. package/lib/util/moduleUtil.ts +110 -0
  225. package/lib/util/pathUtil.ts +132 -0
  226. package/lib/util/remoterHelper.ts +68 -0
  227. package/lib/util/utils.ts +365 -0
  228. package/package.json +93 -0
  229. package/template/game-server/.vscode/launch.json +27 -0
  230. package/template/game-server/app/servers/connector/handler/entryHandler.ts +50 -0
  231. package/template/game-server/app/servers/connector/remote/authRemoter.ts +36 -0
  232. package/template/game-server/app.ts +30 -0
  233. package/template/game-server/app.ts.mqtt +32 -0
  234. package/template/game-server/app.ts.sio +36 -0
  235. package/template/game-server/app.ts.sio.wss +34 -0
  236. package/template/game-server/app.ts.udp +31 -0
  237. package/template/game-server/app.ts.wss +40 -0
  238. package/template/game-server/config/adminServer.json +5 -0
  239. package/template/game-server/config/adminUser.json +22 -0
  240. package/template/game-server/config/clientProtos.json +1 -0
  241. package/template/game-server/config/dictionary.json +1 -0
  242. package/template/game-server/config/log4js.json +150 -0
  243. package/template/game-server/config/master.json +8 -0
  244. package/template/game-server/config/serverProtos.json +1 -0
  245. package/template/game-server/config/servers.json +12 -0
  246. package/template/game-server/copy.js +5 -0
  247. package/template/game-server/package.json +28 -0
  248. package/template/game-server/preload.ts +40 -0
  249. package/template/game-server/tsconfig.json +36 -0
  250. package/template/npm-install.bat +4 -0
  251. package/template/npm-install.sh +5 -0
  252. package/template/readme.md +31 -0
  253. package/template/shared/server.crt +15 -0
  254. package/template/shared/server.key +15 -0
  255. package/template/web-server/app.js +25 -0
  256. package/template/web-server/app.js.https +36 -0
  257. package/template/web-server/bin/component.bat +1 -0
  258. package/template/web-server/bin/component.sh +1 -0
  259. package/template/web-server/package.json +10 -0
  260. package/template/web-server/public/css/base.css +76 -0
  261. package/template/web-server/public/image/logo.png +0 -0
  262. package/template/web-server/public/image/sp.png +0 -0
  263. package/template/web-server/public/index.html +57 -0
  264. package/template/web-server/public/index.html.sio +58 -0
  265. package/template/web-server/public/js/lib/build/build.js +1730 -0
  266. package/template/web-server/public/js/lib/build/build.js.wss +1721 -0
  267. package/template/web-server/public/js/lib/component.json +6 -0
  268. package/template/web-server/public/js/lib/local/boot/component.json +11 -0
  269. package/template/web-server/public/js/lib/local/boot/index.js +11 -0
  270. package/template/web-server/public/js/lib/meloclient.js +456 -0
  271. package/template/web-server/public/js/lib/meloclient.js.wss +456 -0
  272. package/template/web-server/public/js/lib/socket.io.js +3 -0
  273. package/test/application.ts +607 -0
  274. package/test/filters/handler/serial.ts +47 -0
  275. package/test/filters/handler/time.ts +47 -0
  276. package/test/filters/handler/timeout.ts +46 -0
  277. package/test/filters/handler/toobusy.ts +59 -0
  278. package/test/filters/rpc/rpcLog.ts +20 -0
  279. package/test/filters/rpc/toobusy.ts +40 -0
  280. package/test/manager/mockChannelManager.ts +92 -0
  281. package/test/manager/taskManager.ts +78 -0
  282. package/test/mock-base/app/servers/other-file +0 -0
  283. package/test/mock-plugin/components/mockPlugin.ts +8 -0
  284. package/test/mock-plugin/events/mockEvent.ts +12 -0
  285. package/test/modules/console.ts +264 -0
  286. package/test/pomelo.ts +18 -0
  287. package/test/remote/channelRemote.ts +176 -0
  288. package/test/service/channel.ts +161 -0
  289. package/test/service/channelService.ts +243 -0
  290. package/test/service/connectionService.ts +142 -0
  291. package/test/service/filterService.ts +165 -0
  292. package/test/service/handlerService.ts +77 -0
  293. package/test/service/sessionService.ts +464 -0
  294. package/test/util/countDownLatch.ts +81 -0
  295. package/test/util/pathUtil.ts +122 -0
  296. package/test/util/utils.ts +165 -0
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPluginCronPath = exports.getPluginHandlerPath = exports.getPluginRemotePath = exports.getLogPath = exports.getScriptPath = exports.getHandlerPath = exports.remotePathRecord = exports.listUserRemoteDir = exports.getCronPath = exports.getUserRemotePath = exports.getSysRemotePath = exports.getRelativePath = void 0;
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const Constants = require("./constants");
7
+ const constants_1 = require("./constants");
8
+ /**
9
+ * Get relative path
10
+ *
11
+ * @param {String} path full path
12
+ * @return {String} relative path
13
+ */
14
+ function getRelativePath(path) {
15
+ return path.replace(process.cwd(), '');
16
+ }
17
+ exports.getRelativePath = getRelativePath;
18
+ /**
19
+ * Get system remote service path
20
+ *
21
+ * @param {String} role server role: frontend, backend
22
+ * @return {String} path string if the path exist else null
23
+ */
24
+ function getSysRemotePath(role) {
25
+ let p = path.join(__dirname, '/../common/remote/', role);
26
+ return fs.existsSync(p) ? p : null;
27
+ }
28
+ exports.getSysRemotePath = getSysRemotePath;
29
+ /**
30
+ * Get user remote service path
31
+ *
32
+ * @param {String} appBase application base path
33
+ * @param {String} serverType server type
34
+ * @return {String} path string if the path exist else null
35
+ */
36
+ function getUserRemotePath(appBase, serverType) {
37
+ let p = path.join(appBase, '/app/servers/', serverType, Constants.DIR.REMOTE);
38
+ return fs.existsSync(p) ? p : null;
39
+ }
40
+ exports.getUserRemotePath = getUserRemotePath;
41
+ /**
42
+ * Get user remote cron path
43
+ *
44
+ * @param {String} appBase application base path
45
+ * @param {String} serverType server type
46
+ * @return {String} path string if the path exist else null
47
+ */
48
+ function getCronPath(appBase, serverType) {
49
+ let p = path.join(appBase, '/app/servers/', serverType, Constants.DIR.CRON);
50
+ return fs.existsSync(p) ? p : null;
51
+ }
52
+ exports.getCronPath = getCronPath;
53
+ /**
54
+ * List all the subdirectory names of user remote directory
55
+ * which hold the codes for all the server types.
56
+ *
57
+ * @param {String} appBase application base path
58
+ * @return {Array} all the subdiretory name under servers/
59
+ */
60
+ function listUserRemoteDir(appBase) {
61
+ let base = path.join(appBase, '/app/servers/');
62
+ let files = fs.readdirSync(base);
63
+ return files.filter(function (fn) {
64
+ if (fn.charAt(0) === '.') {
65
+ return false;
66
+ }
67
+ return fs.statSync(path.join(base, fn)).isDirectory();
68
+ });
69
+ }
70
+ exports.listUserRemoteDir = listUserRemoteDir;
71
+ /**
72
+ * Compose remote path record
73
+ *
74
+ * @param {String} namespace remote path namespace, such as: 'sys', 'user'
75
+ * @param {String} serverType
76
+ * @param {String} path remote service source path
77
+ * @param {Boolean} relativePath convert path to relative path
78
+ * @return {Object} remote path record
79
+ */
80
+ function remotePathRecord(namespace, serverType, path, relativePath) {
81
+ if (relativePath) {
82
+ path = getRelativePath(path);
83
+ }
84
+ return { namespace: namespace, serverType: serverType, path: path };
85
+ }
86
+ exports.remotePathRecord = remotePathRecord;
87
+ /**
88
+ * Get handler path
89
+ *
90
+ * @param {String} appBase application base path
91
+ * @param {String} serverType server type
92
+ * @return {String} path string if the path exist else null
93
+ */
94
+ function getHandlerPath(appBase, serverType) {
95
+ let p = path.join(appBase, '/app/servers/', serverType, Constants.DIR.HANDLER);
96
+ return fs.existsSync(p) ? p : null;
97
+ }
98
+ exports.getHandlerPath = getHandlerPath;
99
+ /**
100
+ * Get admin script root path.
101
+ *
102
+ * @param {String} appBase application base path
103
+ * @return {String} script path string
104
+ */
105
+ function getScriptPath(appBase) {
106
+ return path.join(appBase, Constants.DIR.SCRIPT);
107
+ }
108
+ exports.getScriptPath = getScriptPath;
109
+ /**
110
+ * Get logs path.
111
+ *
112
+ * @param {String} appBase application base path
113
+ * @return {String} logs path string
114
+ */
115
+ function getLogPath(appBase) {
116
+ return path.join(appBase, Constants.DIR.LOG);
117
+ }
118
+ exports.getLogPath = getLogPath;
119
+ function getPluginRemotePath(basePath) {
120
+ let p = path.join(basePath, constants_1.DIR.REMOTE);
121
+ return fs.existsSync(p) ? p : null;
122
+ }
123
+ exports.getPluginRemotePath = getPluginRemotePath;
124
+ function getPluginHandlerPath(basePath) {
125
+ let p = path.join(basePath, constants_1.DIR.HANDLER);
126
+ return fs.existsSync(p) ? p : null;
127
+ }
128
+ exports.getPluginHandlerPath = getPluginHandlerPath;
129
+ function getPluginCronPath(basePath) {
130
+ let p = path.join(basePath, constants_1.DIR.CRON);
131
+ return fs.existsSync(p) ? p : null;
132
+ }
133
+ exports.getPluginCronPath = getPluginCronPath;
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbC9wYXRoVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHlDQUF5QztBQUV6QywyQ0FBa0M7QUFFbEM7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsSUFBWTtJQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQzFDLENBQUM7QUFGRCwwQ0FFQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsSUFBWTtJQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3ZDLENBQUM7QUFIRCw0Q0FHQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNqRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2QyxDQUFDO0FBSEQsOENBR0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixXQUFXLENBQUMsT0FBZSxFQUFFLFVBQWtCO0lBQzNELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxF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
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindRemoterMethod = void 0;
4
+ function bindRemoterMethod(method, thisArg, routeParamType) {
5
+ return method.bind(thisArg);
6
+ }
7
+ exports.bindRemoterMethod = bindRemoterMethod;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlckhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlsL3JlbW90ZXJIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbURBLFNBQWdCLGlCQUFpQixDQUE4QyxNQUFTLEVBQUUsT0FBVSxFQUFFLGNBQThDO0lBQ2hKLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQVEsQ0FBQztBQUN2QyxDQUFDO0FBRkQsOENBRUMifQ==
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.promisify = exports.extendsObject = exports.isObject = exports.headHandler = exports.loadCluster = exports.isLocal = exports.checkPort = exports.ping = exports.unicodeToUtf8 = exports.hasChineseChar = exports.format = exports.arrayDiff = exports.startsWith = exports.endsWith = exports.size = exports.invokeCallback = void 0;
4
+ const os = require("os");
5
+ const util = require("util");
6
+ const child_process_1 = require("child_process");
7
+ const melo_logger_1 = require("@bigtyphoon/melo-logger");
8
+ const Constants = require("./constants");
9
+ const path = require("path");
10
+ const melo_1 = require("../melo");
11
+ let logger = (0, melo_logger_1.getLogger)('melo', path.basename(__filename));
12
+ /**
13
+ * Invoke callback with check
14
+ */
15
+ function invokeCallback(cb, ...args) {
16
+ if (typeof cb === 'function') {
17
+ let len = args.length + 1;
18
+ if (len === 1) {
19
+ return cb();
20
+ }
21
+ if (len === 2) {
22
+ return cb(args[0]);
23
+ }
24
+ if (len === 3) {
25
+ return cb(args[0], args[1]);
26
+ }
27
+ if (len === 4) {
28
+ return cb(args[0], args[1], args[2]);
29
+ }
30
+ cb.apply(null, args);
31
+ // cb.apply(null, Array.prototype.slice.call(arguments, 1));
32
+ }
33
+ }
34
+ exports.invokeCallback = invokeCallback;
35
+ /**
36
+ * Get the count of elements of object
37
+ */
38
+ function size(obj) {
39
+ let count = 0;
40
+ for (let i in obj) {
41
+ if (obj.hasOwnProperty(i) && typeof obj[i] !== 'function') {
42
+ count++;
43
+ }
44
+ }
45
+ return count;
46
+ }
47
+ exports.size = size;
48
+ /**
49
+ * Check a string whether ends with another string
50
+ */
51
+ function endsWith(str, suffix) {
52
+ if (typeof str !== 'string' || typeof suffix !== 'string' ||
53
+ suffix.length > str.length) {
54
+ return false;
55
+ }
56
+ return str.indexOf(suffix, str.length - suffix.length) !== -1;
57
+ }
58
+ exports.endsWith = endsWith;
59
+ /**
60
+ * Check a string whether starts with another string
61
+ */
62
+ function startsWith(str, prefix) {
63
+ if (typeof str !== 'string' || typeof prefix !== 'string' ||
64
+ prefix.length > str.length) {
65
+ return false;
66
+ }
67
+ return str.indexOf(prefix) === 0;
68
+ }
69
+ exports.startsWith = startsWith;
70
+ /**
71
+ * Compare the two arrays and return the difference.
72
+ */
73
+ function arrayDiff(array1, array2) {
74
+ let o = {};
75
+ for (let i = 0, len = array2.length; i < len; i++) {
76
+ o[array2[i]] = true;
77
+ }
78
+ let result = [];
79
+ for (let i = 0, len = array1.length; i < len; i++) {
80
+ let v = array1[i];
81
+ if (o[v])
82
+ continue;
83
+ result.push(v);
84
+ }
85
+ return result;
86
+ }
87
+ exports.arrayDiff = arrayDiff;
88
+ /*
89
+ * Date format
90
+ */
91
+ function format(date, format) {
92
+ format = format || 'MMddhhmm';
93
+ let o = {
94
+ 'M+': date.getMonth() + 1,
95
+ 'd+': date.getDate(),
96
+ 'h+': date.getHours(),
97
+ 'm+': date.getMinutes(),
98
+ 's+': date.getSeconds(),
99
+ 'q+': Math.floor((date.getMonth() + 3) / 3),
100
+ 'S': date.getMilliseconds() // millisecond
101
+ };
102
+ if (/(y+)/.test(format)) {
103
+ format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
104
+ }
105
+ for (let k in o) {
106
+ if (new RegExp('(' + k + ')').test(format)) {
107
+ format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] :
108
+ ('00' + o[k]).substr(('' + o[k]).length));
109
+ }
110
+ }
111
+ return format;
112
+ }
113
+ exports.format = format;
114
+ /**
115
+ * check if has Chinese characters.
116
+ */
117
+ function hasChineseChar(str) {
118
+ if (/.*[\u4e00-\u9fa5]+.*$/.test(str)) {
119
+ return true;
120
+ }
121
+ else {
122
+ return false;
123
+ }
124
+ }
125
+ exports.hasChineseChar = hasChineseChar;
126
+ /**
127
+ * transform unicode to utf8
128
+ */
129
+ function unicodeToUtf8(str) {
130
+ let i, len, ch;
131
+ let utf8Str = '';
132
+ len = str.length;
133
+ for (i = 0; i < len; i++) {
134
+ ch = str.charCodeAt(i);
135
+ if ((ch >= 0x0) && (ch <= 0x7F)) {
136
+ utf8Str += str.charAt(i);
137
+ }
138
+ else if ((ch >= 0x80) && (ch <= 0x7FF)) {
139
+ utf8Str += String.fromCharCode(0xc0 | ((ch >> 6) & 0x1F));
140
+ utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
141
+ }
142
+ else if ((ch >= 0x800) && (ch <= 0xFFFF)) {
143
+ utf8Str += String.fromCharCode(0xe0 | ((ch >> 12) & 0xF));
144
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
145
+ utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
146
+ }
147
+ else if ((ch >= 0x10000) && (ch <= 0x1FFFFF)) {
148
+ utf8Str += String.fromCharCode(0xF0 | ((ch >> 18) & 0x7));
149
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 12) & 0x3F));
150
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
151
+ utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
152
+ }
153
+ else if ((ch >= 0x200000) && (ch <= 0x3FFFFFF)) {
154
+ utf8Str += String.fromCharCode(0xF8 | ((ch >> 24) & 0x3));
155
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 18) & 0x3F));
156
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 12) & 0x3F));
157
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
158
+ utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
159
+ }
160
+ else if ((ch >= 0x4000000) && (ch <= 0x7FFFFFFF)) {
161
+ utf8Str += String.fromCharCode(0xFC | ((ch >> 30) & 0x1));
162
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 24) & 0x3F));
163
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 18) & 0x3F));
164
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 12) & 0x3F));
165
+ utf8Str += String.fromCharCode(0x80 | ((ch >> 6) & 0x3F));
166
+ utf8Str += String.fromCharCode(0x80 | (ch & 0x3F));
167
+ }
168
+ }
169
+ return utf8Str;
170
+ }
171
+ exports.unicodeToUtf8 = unicodeToUtf8;
172
+ /**
173
+ * Ping server to check if network is available
174
+ *
175
+ */
176
+ function ping(host, cb) {
177
+ if (!isLocal(host)) {
178
+ let cmd = 'ping -w 15 ' + host;
179
+ (0, child_process_1.exec)(cmd, function (err, stdout, stderr) {
180
+ if (!!err) {
181
+ cb(false);
182
+ return;
183
+ }
184
+ cb(true);
185
+ });
186
+ }
187
+ else {
188
+ cb(true);
189
+ }
190
+ }
191
+ exports.ping = ping;
192
+ /**
193
+ * Check if server is exsit.
194
+ *
195
+ */
196
+ function checkPort(app, server, cb) {
197
+ if (!server.port && !server.clientPort) {
198
+ invokeCallback(cb, 'leisure');
199
+ return;
200
+ }
201
+ let port = server.port || server.clientPort;
202
+ const host = server.host;
203
+ const generateCommand = function (host, port) {
204
+ let cmd;
205
+ let ssh_params = app.get(Constants.RESERVED.SSH_CONFIG_PARAMS);
206
+ if (!!ssh_params && Array.isArray(ssh_params)) {
207
+ ssh_params = ssh_params.join(' ');
208
+ }
209
+ else {
210
+ ssh_params = '';
211
+ }
212
+ if (!isLocal(host)) {
213
+ cmd = util.format('ssh %s %s "netstat -an|awk \'{print $4}\'|grep %s|wc -l"', host, ssh_params, port);
214
+ }
215
+ else {
216
+ cmd = util.format('netstat -an|awk \'{print $4}\'|grep %s|wc -l', port);
217
+ }
218
+ return cmd;
219
+ };
220
+ const cmd1 = generateCommand(host, port);
221
+ (0, child_process_1.exec)(cmd1, function (err, stdout, stderr) {
222
+ if (err) {
223
+ logger.error('command %s execute with error: %j', cmd1, err.stack);
224
+ invokeCallback(cb, 'error');
225
+ }
226
+ else if (stdout.trim() !== '0') {
227
+ invokeCallback(cb, 'busy');
228
+ }
229
+ else {
230
+ port = server.clientPort;
231
+ const cmd2 = generateCommand(host, port);
232
+ (0, child_process_1.exec)(cmd2, function (err, stdout, stderr) {
233
+ if (err) {
234
+ logger.error('command %s execute with error: %j', cmd2, err.stack);
235
+ invokeCallback(cb, 'error');
236
+ }
237
+ else if (stdout.trim() !== '0') {
238
+ invokeCallback(cb, 'busy');
239
+ }
240
+ else {
241
+ invokeCallback(cb, 'leisure');
242
+ }
243
+ });
244
+ }
245
+ });
246
+ }
247
+ exports.checkPort = checkPort;
248
+ function isLocal(host) {
249
+ const app = melo_1.melo.app;
250
+ if (!app) {
251
+ return host === '127.0.0.1' || host === 'localhost' || host === '0.0.0.0' || inLocal(host);
252
+ }
253
+ else {
254
+ return host === '127.0.0.1' || host === 'localhost' || host === '0.0.0.0' || inLocal(host) || host === app.master.host;
255
+ }
256
+ }
257
+ exports.isLocal = isLocal;
258
+ /**
259
+ * Load cluster server.
260
+ *
261
+ */
262
+ function loadCluster(app, server, serverMap) {
263
+ let increaseFields = {};
264
+ let host = server.host;
265
+ let count = Number(server[Constants.RESERVED.CLUSTER_COUNT]);
266
+ let seq = app.clusterSeq[server.serverType];
267
+ if (!seq) {
268
+ seq = 0;
269
+ app.clusterSeq[server.serverType] = count;
270
+ }
271
+ else {
272
+ app.clusterSeq[server.serverType] = seq + count;
273
+ }
274
+ for (let key in server) {
275
+ let value = server[key].toString();
276
+ if (value.indexOf(Constants.RESERVED.CLUSTER_SIGNAL) > 0) {
277
+ let base = server[key].slice(0, -2);
278
+ increaseFields[key] = base;
279
+ }
280
+ }
281
+ let clone = function (src) {
282
+ let rs = {};
283
+ for (let key in src) {
284
+ rs[key] = src[key];
285
+ }
286
+ return rs;
287
+ };
288
+ for (let i = 0, l = seq; i < count; i++, l++) {
289
+ let cserver = clone(server);
290
+ cserver.id = Constants.RESERVED.CLUSTER_PREFIX + server.serverType + '-' + l;
291
+ for (let k in increaseFields) {
292
+ let v = parseInt(increaseFields[k]);
293
+ cserver[k] = v + i;
294
+ }
295
+ serverMap[cserver.id] = cserver;
296
+ }
297
+ }
298
+ exports.loadCluster = loadCluster;
299
+ // export function extends(origin, add)
300
+ // {
301
+ // if (!add || !this.isObject(add)) return origin;
302
+ // let keys = Object.keys(add);
303
+ // let i = keys.length;
304
+ // while (i--)
305
+ // {
306
+ // origin[keys[i]] = add[keys[i]];
307
+ // }
308
+ // return origin;
309
+ // };
310
+ function headHandler(headBuffer) {
311
+ let len = 0;
312
+ for (let i = 1; i < 4; i++) {
313
+ if (i > 1) {
314
+ len <<= 8;
315
+ }
316
+ len += headBuffer.readUInt8(i);
317
+ }
318
+ return len;
319
+ }
320
+ exports.headHandler = headHandler;
321
+ let inLocal = function (host) {
322
+ for (let index in localIps) {
323
+ if (host === localIps[index]) {
324
+ return true;
325
+ }
326
+ }
327
+ return false;
328
+ };
329
+ let localIps = function () {
330
+ let ifaces = os.networkInterfaces();
331
+ let ips = [];
332
+ let func = function (details) {
333
+ if (details.family === 'IPv4') {
334
+ ips.push(details.address);
335
+ }
336
+ };
337
+ for (let dev in ifaces) {
338
+ ifaces[dev].forEach(func);
339
+ }
340
+ return ips;
341
+ }();
342
+ function isObject(arg) {
343
+ return typeof arg === 'object' && arg !== null;
344
+ }
345
+ exports.isObject = isObject;
346
+ function extendsObject(origin, add) {
347
+ if (!add || !isObject(add))
348
+ return origin;
349
+ let keys = Object.keys(add);
350
+ let i = keys.length;
351
+ while (i--) {
352
+ origin[keys[i]] = add[keys[i]];
353
+ }
354
+ return origin;
355
+ }
356
+ exports.extendsObject = extendsObject;
357
+ exports.promisify = util.promisify;
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLGlEQUFtQztBQUNuQyx5REFBa0Q7QUFDbEQseUNBQXlDO0FBR3pDLDZCQUE2QjtBQUM3QixrQ0FBK0I7QUFFL0IsSUFBSSxNQUFNLEdBQUcsSUFBQSx1QkFBUyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFHMUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQUMsRUFBWSxFQUFFLEdBQUcsSUFBVztJQUN2RCxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtRQUMxQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUVELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEM7UUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyQiw0REFBNEQ7S0FDL0Q7QUFDTCxD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LENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FFdEQ7YUFBTSxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxFQUFFO1lBQzVDLE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBRXREO2FBQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsRUFBRTtZQUM5QyxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBRXREO2FBQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRTtZQUNoRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FFdEQ7S0FFSjtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUE1Q0Qsc0NBNENDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxFQUEwQjtJQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2hCLElBQUksR0FBRyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBQSxvQkFBSSxFQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUNuQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNWLE9BQU87YUFDVjtZQUNELEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO0tBQ047U0FBTTtRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNaO0FBQ0wsQ0FBQztBQWJELG9CQWFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEdBQWdCLEVBQUUsTUFBa0IsRUFBRSxFQUE0QjtJQUN4RixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDcEMsY0FBYyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QixPQUFPO0tBQ1Y7SUFDRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztJQUN6QixNQUFNLGVBQWUsR0FBRyxVQUFVLElBQVksRUFBRSxJQUFZO1FBQ3hELElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0MsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckM7YUFDSTtZQUNELFVBQVUsR0FBRyxFQUFFLENBQUM7U0FDbkI7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hCLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLDBEQUEwRCxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDekc7YUFBTTtZQUNILEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLDhDQUE4QyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDLENBQUM7SUFDRixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLElBQUEsb0JBQUksRUFBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU07UUFDcEMsSUFBSSxHQUFHLEVBQUU7WUFDTCxNQUFNLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsY0FBYyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUMvQjthQUFNLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtZQUM5QixjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDSCxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQUEsb0JBQUksRUFBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU07Z0JBQ3BDLElBQUksR0FBRyxFQUFFO29CQUNMLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkUsY0FBYyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDL0I7cUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFO29CQUM5QixjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDSCxjQUFjLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lCQUNqQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUE3Q0QsOEJBNkNDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLElBQVk7SUFDaEMsTUFBTSxHQUFHLEdBQUcsV0FBSSxDQUFDLEdBQUcsQ0FBQztJQUNyQixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ04sT0FBTyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDOUY7U0FBTTtRQUNILE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztLQUMxSDtBQUNMLENBQUM7QUFQRCwwQkFPQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxHQUFnQixFQUFFLE1BQWtCLEVBQUUsU0FBNkM7SUFDM0csSUFBSSxjQUFjLEdBQThCLEVBQUUsQ0FBQztJQUNuRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzdELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDTixHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO0tBQzdDO1NBQU07UUFDSCxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO0tBQ25EO0lBRUQsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUU7UUFDcEIsSUFBSSxLQUFLLEdBQUksTUFBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0RCxJQUFJLElBQUksR0FBSSxNQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDOUI7S0FDSjtJQUVELElBQUksS0FBSyxHQUFHLFVBQVUsR0FBUTtRQUMxQixJQUFJLEVBQUUsR0FBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDakIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFHLENBQUMsRUFBRSxFQUFFO1FBQzNDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM3RSxLQUFLLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztLQUNuQztBQUNMLENBQUM7QUFwQ0Qsa0NBb0NDO0FBRUQsdUNBQXVDO0FBQ3ZDLElBQUk7QUFDSixxREFBcUQ7QUFFckQsa0NBQWtDO0FBQ2xDLDBCQUEwQjtBQUMxQixpQkFBaUI7QUFDakIsT0FBTztBQUNQLHlDQUF5QztBQUN6QyxPQUFPO0FBQ1Asb0JBQW9CO0FBQ3BCLEtBQUs7QUFFTCxTQUFnQixXQUFXLENBQUMsVUFBa0I7SUFDMUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUCxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ2I7UUFDRCxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQVRELGtDQVNDO0FBRUQsSUFBSSxPQUFPLEdBQUcsVUFBVSxJQUFZO0lBQ2hDLEtBQUssSUFBSSxLQUFLLElBQUksUUFBUSxFQUFFO1FBQ3hCLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNmO0tBQ0o7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRixJQUFJLFFBQVEsR0FBRztJQUNYLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3BDLElBQUksR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUN2QixJQUFJLElBQUksR0FBRyxVQUFVLE9BQWdDO1FBQ2pELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDLENBQUM7SUFDRixLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtRQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDLEVBQUUsQ0FBQztBQUVKLFNBQWdCLFFBQVEsQ0FBQyxHQUFRO0lBQzdCLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDbkQsQ0FBQztBQUZELDRCQUVDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLE1BQVcsRUFBRSxHQUFRO0lBQy9DLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFMUMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxFQUFFLEVBQUU7UUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQVRELHNDQVNDO0FBRVUsUUFBQSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyJ9