gamelet-cli 0.3.21 → 0.3.22

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 (53) hide show
  1. package/assets/package.json.twig +4 -4
  2. package/build/package.json +1 -1
  3. package/package.json +1 -1
  4. package/build/src/gamelet/download.js +0 -730
  5. package/build/src/gamelet/merges.js +0 -106
  6. package/build/src/gamelet/prepare.js +0 -275
  7. package/build/src/gamelet/upload.js +0 -279
  8. package/build/src/index.js +0 -86
  9. package/build/src/server/Constant.js +0 -10
  10. package/build/src/server/entities/Client.js +0 -57
  11. package/build/src/server/entities/ClientOwner.js +0 -67
  12. package/build/src/server/entities/ClientProject.js +0 -68
  13. package/build/src/server/entities/Gameroom.js +0 -88
  14. package/build/src/server/entities/GameroomBase.js +0 -244
  15. package/build/src/server/entities/Gamezone.js +0 -73
  16. package/build/src/server/entities/ListFilter.js +0 -193
  17. package/build/src/server/entities/Monitor.js +0 -81
  18. package/build/src/server/entities/Player.js +0 -132
  19. package/build/src/server/managers/ClientManager.js +0 -61
  20. package/build/src/server/managers/Database.js +0 -591
  21. package/build/src/server/managers/GameroomManager.js +0 -392
  22. package/build/src/server/managers/ManagerBase.js +0 -17
  23. package/build/src/server/managers/MonitorManager.js +0 -73
  24. package/build/src/server/managers/PlayerManager.js +0 -104
  25. package/build/src/server/managers/SocketManager.js +0 -50
  26. package/build/src/server/managers/UserManager.js +0 -58
  27. package/build/src/server/messages/Message.js +0 -141
  28. package/build/src/server/server.js +0 -110
  29. package/build/src/server/services/ServiceBase.js +0 -25
  30. package/build/src/server/services/clientService.js +0 -16
  31. package/build/src/server/services/gameroomService.js +0 -122
  32. package/build/src/server/services/gltserver.service.js +0 -24
  33. package/build/src/server/services/playerService.js +0 -30
  34. package/build/src/server/startServer.js +0 -31
  35. package/build/src/server/types/BadgeStatus.js +0 -25
  36. package/build/src/server/types/OrderType.js +0 -38
  37. package/build/src/server/types/SubmitType.js +0 -24
  38. package/build/src/server/types/TimeRange.js +0 -26
  39. package/build/src/server/utils/ArrayUtil.js +0 -126
  40. package/build/src/server/utils/IntUtil.js +0 -10
  41. package/build/src/server/utils/ObjectUtil.js +0 -191
  42. package/build/src/server/utils/StringUtil.js +0 -37
  43. package/build/src/server/vo/Database.js +0 -1
  44. package/build/src/server/vo/Gameroom.js +0 -1
  45. package/build/src/server/vo/Gamezone.js +0 -1
  46. package/build/src/server/vo/Player.js +0 -1
  47. package/build/src/server/vo/Response.js +0 -1
  48. package/build/src/server/vo/System.js +0 -1
  49. package/build/src/utils/cli.js +0 -49
  50. package/build/src/utils/file.js +0 -327
  51. package/build/src/utils/init.js +0 -42
  52. package/build/src/utils/log.js +0 -17
  53. package/build/src/utils/net.js +0 -39
@@ -1,392 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GameroomManager = void 0;
4
- const ObjectUtil_1 = require("./../utils/ObjectUtil");
5
- const ClientManager_1 = require("./ClientManager");
6
- const Message_1 = require("./../messages/Message");
7
- const GameroomBase_1 = require("./../entities/GameroomBase");
8
- const ListFilter_1 = require("./../entities/ListFilter");
9
- const Gamezone_1 = require("./../entities/Gamezone");
10
- const Gameroom_1 = require("./../entities/Gameroom");
11
- const ManagerBase_1 = require("./ManagerBase");
12
- const StringUtil_1 = require("../utils/StringUtil");
13
- class GameroomManager extends ManagerBase_1.ManagerBase {
14
- constructor(server) {
15
- super('GameroomManager');
16
- this.server = server;
17
- this.gameroomMap = {};
18
- /**
19
- * first key: client key
20
- * second key: gameZone code
21
- */
22
- this.gamezoneMap = {};
23
- }
24
- generateNewGameroomCode() {
25
- let code = StringUtil_1.StringUtil.generateRandomString(10);
26
- while (this.getGameroom(code)) {
27
- code = StringUtil_1.StringUtil.generateRandomString(10);
28
- }
29
- return code;
30
- }
31
- getGameroom(code) {
32
- return this.gameroomMap[code];
33
- }
34
- getGameroomByName(zoneCode, name) {
35
- for (let code in this.gameroomMap) {
36
- let room = this.gameroomMap[code];
37
- if (room.name == name && room.gamezone.code == zoneCode) {
38
- return room;
39
- }
40
- }
41
- return null;
42
- }
43
- getOrCreateGamezone(client, code) {
44
- let zoneMap = this.gamezoneMap[client.key];
45
- if (zoneMap) {
46
- return zoneMap[code] || this.createGameZone(client, code);
47
- }
48
- else {
49
- this.gamezoneMap[client.key] = {};
50
- }
51
- return this.createGameZone(client, code);
52
- }
53
- getGamezone(client, code) {
54
- let zoneMap = this.gamezoneMap[client.key];
55
- return zoneMap && zoneMap[code];
56
- }
57
- getClientZone(client) {
58
- return this.getOrCreateGamezone(client, '/Sys/Ch');
59
- }
60
- createGameZone(client, code) {
61
- let zone = new Gamezone_1.Gamezone(code, this.server, client);
62
- this.gamezoneMap[client.key][code] = zone;
63
- zone.once(GameroomBase_1.GameroomBase.EVENT.DISPOSED, () => {
64
- delete this.gamezoneMap[client.key][code];
65
- });
66
- zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_REMOVED, (p) => {
67
- zone.broadcast(Message_1.Message.forPlayerLeftZone(zone.code, p.code));
68
- });
69
- zone.on(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED, () => {
70
- zone.broadcast(Message_1.Message.forZoneStatusChanged(zone));
71
- });
72
- zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATE_CHANGED, (p, key, value) => {
73
- zone.broadcast(Message_1.Message.forZonePlayerStateChanged(zone.code, p.code, key, value, zone.getBrainer().code));
74
- });
75
- zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATES_CHANGED, (p, states) => {
76
- zone.broadcast(Message_1.Message.forZonePlayerStatesChanged(zone.code, p.code, states, zone.getBrainer().code));
77
- });
78
- zone.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, (p, value, brainerCode) => {
79
- zone.broadcast(Message_1.Message.forZonePlayerSyncedChanged(zone.code, p.code, value, brainerCode));
80
- });
81
- return zone;
82
- }
83
- createOrJoinGameroom(player, gamezoneCode, gameroomName, password, maxPlayers, state, stateJson, allowGuest) {
84
- let gameroom = this.getGameroomByName(gamezoneCode, gameroomName);
85
- if (gameroom) {
86
- return this.joinGameroom(player, gameroom.code, password);
87
- }
88
- else {
89
- return this.createGameroom(player, gamezoneCode, gameroomName, password, maxPlayers, state, stateJson, allowGuest);
90
- }
91
- }
92
- createGameroom(player, gamezoneCode, gameroomName, password, maxPlayers, state, stateJson, allowGuest) {
93
- this.designContract(!player.getGameroom(), 'Already in a gameroom');
94
- let gamezone = this.getOrCreateGamezone(player.client, gamezoneCode);
95
- let gameroom = new Gameroom_1.Gameroom(this.server, player.client, this.generateNewGameroomCode(), player, gamezone, gameroomName, password, maxPlayers, state, stateJson, allowGuest);
96
- this.gameroomMap[gameroom.code] = gameroom;
97
- gameroom.once(GameroomBase_1.GameroomBase.EVENT.DISPOSED, () => {
98
- delete this.gameroomMap[gameroom.code];
99
- gamezone.broadcast(Message_1.Message.forRoomClosed(gameroom));
100
- });
101
- gamezone.addGameroom(gameroom);
102
- gameroom.addPlayer(player);
103
- gamezone.broadcast(Message_1.Message.forRoomCreated(gameroom));
104
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.BRAINER_CHANGED, () => {
105
- if (gameroom.getBrainer()) {
106
- gameroom.broadcast(Message_1.Message.forRoomBrainerChanged(gameroom));
107
- }
108
- });
109
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_ADDED, (p) => {
110
- gameroom.broadcast(Message_1.Message.forPlayerJoinedRoom(gameroom.code, p));
111
- });
112
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_REMOVED, (p) => {
113
- gameroom.broadcast(Message_1.Message.forPlayerLeftRoom(gameroom.code, p.code));
114
- });
115
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED, () => {
116
- gameroom.broadcast(Message_1.Message.forRoomStatusChanged(gameroom));
117
- gamezone.broadcast(Message_1.Message.forRoomStatusChanged(gameroom));
118
- });
119
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATE_CHANGED, (p, key, value) => {
120
- gameroom.broadcast(Message_1.Message.forRoomPlayerStateChanged(gameroom.code, p.code, key, value));
121
- });
122
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_STATES_CHANGED, (p, states) => {
123
- gameroom.broadcast(Message_1.Message.forRoomPlayerStatesChanged(gameroom.code, p.code, states));
124
- });
125
- gameroom.on(GameroomBase_1.GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, (p, value, brainerCode) => {
126
- gameroom.broadcast(Message_1.Message.forRoomPlayerSyncedChanged(gameroom.code, p.code, value, brainerCode));
127
- });
128
- return Promise.resolve(gameroom);
129
- }
130
- joinGameroom(player, gameroomCode, password) {
131
- this.designContract(!player.getGameroom(), 'Already in a gameroom');
132
- let gameroom = this.getGameroom(gameroomCode);
133
- this.designContract(gameroom, 'Gameroom not found');
134
- this.designContract(gameroom.state == Gameroom_1.GameroomState.OPEN, 'The room is currently not open for joining.');
135
- this.designContract(!gameroom.password || gameroom.password == password, 'Password not matched');
136
- gameroom.addPlayer(player);
137
- return Promise.resolve(gameroom);
138
- }
139
- leaveGameroom(player, gameroomCode) {
140
- let gameroom = gameroomCode ? this.getGameroom(gameroomCode) : player.getGameroom();
141
- this.designContract(gameroom, 'Gameroom not found');
142
- gameroom.removePlayer(player);
143
- return Promise.resolve(gameroom.code);
144
- }
145
- enterGamezone(player, gamezoneCode) {
146
- let gamezone = this.getOrCreateGamezone(player.client, gamezoneCode);
147
- gamezone.addPlayer(player);
148
- return Promise.resolve(gamezone);
149
- }
150
- leaveGamezone(player, gamezoneCode) {
151
- let gamezone = this.getGamezone(player.client, gamezoneCode);
152
- if (gamezone) {
153
- gamezone.removePlayer(player);
154
- }
155
- return Promise.resolve(true);
156
- }
157
- queryGameroom(player, gameroomCode) {
158
- let gameroom = this.getGameroom(gameroomCode);
159
- this.designContract(gameroom, 'The gameroom is closed.');
160
- this.designContract(gameroom.client == player.client, 'The gameroom is not in your current game.');
161
- return Promise.resolve(gameroom);
162
- }
163
- listGamerooms(client, gamezoneCode, length, filter) {
164
- length = Math.min(100, length);
165
- let gamezone = this.getGamezone(client, gamezoneCode);
166
- if (gamezone) {
167
- return Promise.resolve(gamezone.listGamerooms(ListFilter_1.parsePropFilter(filter), length));
168
- }
169
- else {
170
- return Promise.resolve([]);
171
- }
172
- }
173
- listPlayersInGameroom(player) {
174
- let gameroom = player.getGameroom();
175
- this.designContract(gameroom, 'Not in any gameroom');
176
- return Promise.resolve(gameroom.listPlayers());
177
- }
178
- listPlayersOfGameroom(_player, gameroomCode) {
179
- let gameroom = this.getGameroom(gameroomCode);
180
- this.designContract(gameroom, 'The gameroom is closed.');
181
- return Promise.resolve(gameroom.listPlayers());
182
- }
183
- setGameroomState(player, state, stateJson) {
184
- let gameroom = player.getGameroom();
185
- this.designContract(gameroom, 'Not in any gameroom');
186
- this.designContract(gameroom.getBrainer() == player, 'Not the decision maker.');
187
- gameroom.state = state;
188
- stateJson && ObjectUtil_1.ObjectUtil.safeAssign(gameroom.stateJson, stateJson);
189
- gameroom.emit(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED);
190
- return Promise.resolve(gameroom);
191
- }
192
- setGameroomStateJson(player, stateJson) {
193
- let gameroom = player.getGameroom();
194
- this.designContract(gameroom, 'Not in any gameroom');
195
- this.designContract(gameroom.getBrainer() == player, 'Not the decision maker.');
196
- stateJson && ObjectUtil_1.ObjectUtil.safeAssign(gameroom.stateJson, stateJson);
197
- gameroom.emit(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED);
198
- return Promise.resolve(gameroom);
199
- }
200
- setRoomPlayerState(player, key, value) {
201
- let gameroom = player.getGameroom();
202
- this.designContract(gameroom, 'Not in any gameroom');
203
- gameroom.setPlayerState(player, key, value);
204
- return Promise.resolve(true);
205
- }
206
- setRoomPlayerStates(player, states) {
207
- let gameroom = player.getGameroom();
208
- this.designContract(gameroom, 'Not in any gameroom');
209
- gameroom.setPlayerStates(player, states);
210
- return Promise.resolve(true);
211
- }
212
- setRoomPlayerSynced(player, value, updateBrainer) {
213
- let gameroom = player.getGameroom();
214
- this.designContract(gameroom, 'Not in any gameroom');
215
- return gameroom.setPlayerSynced(player, value, updateBrainer)
216
- .then(() => gameroom.getBrainer().code);
217
- }
218
- updateRoomBrainer(player) {
219
- let gameroom = player.getGameroom();
220
- this.designContract(gameroom, 'Not in any gameroom');
221
- this.designContract(gameroom.getBrainer() == player, 'Not the decision maker.');
222
- return gameroom.updateBrainer(true)
223
- .then(brainer => brainer.code);
224
- }
225
- broadcastToRoom(player, gameroomCode, data) {
226
- let gameroom = this.getGameroom(gameroomCode);
227
- this.designContract(gameroom, 'The gameroom is closed.');
228
- gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ROOM, player.code, gameroom.code, data), player);
229
- return Promise.resolve(gameroom.playersCount);
230
- }
231
- broadcastToRoom2(player, gameroomCode, data) {
232
- let gameroom = this.getGameroom(gameroomCode);
233
- this.designContract(gameroom, 'The gameroom is closed.');
234
- gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ROOM, player.code, gameroom.code, data), player);
235
- return Promise.resolve({
236
- p: gameroom.playersCount,
237
- t: Date.now(),
238
- });
239
- }
240
- broadcastInRoom(player, data) {
241
- let gameroom = player.getGameroom();
242
- this.designContract(gameroom, 'Not in any gameroom');
243
- gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_ROOM, player.code, gameroom.code, data), player);
244
- return Promise.resolve(gameroom.playersCount);
245
- }
246
- broadcastInRoom2(player, data) {
247
- let gameroom = player.getGameroom();
248
- this.designContract(gameroom, 'Not in any gameroom');
249
- gameroom.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_ROOM, player.code, gameroom.code, data), player);
250
- return Promise.resolve({
251
- p: gameroom.playersCount,
252
- t: Date.now(),
253
- });
254
- }
255
- broadcastToZone(player, gamezoneCode, data) {
256
- let gamezone = this.getGamezone(player.client, gamezoneCode);
257
- if (gamezone) {
258
- gamezone.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ZONE, player.code, gamezone.code, data), player);
259
- return Promise.resolve(gamezone.playersCount);
260
- }
261
- else {
262
- return Promise.resolve(0);
263
- }
264
- }
265
- broadcastToZone2(player, gamezoneCode, data) {
266
- let gamezone = this.getGamezone(player.client, gamezoneCode);
267
- if (gamezone) {
268
- gamezone.broadcastByPlayer(Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_TO_ZONE, player.code, gamezone.code, data), player);
269
- return Promise.resolve({
270
- p: gamezone.playersCount,
271
- t: Date.now(),
272
- });
273
- }
274
- else {
275
- return Promise.resolve({
276
- p: 0,
277
- t: Date.now(),
278
- });
279
- }
280
- }
281
- broadcastInProject(monitor, project, data) {
282
- let msg = Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_PROJECT, monitor.code, '', data);
283
- let count = 0;
284
- for (let client of project.listClients()) {
285
- let gamezone = this.getClientZone(client);
286
- gamezone.broadcast(msg);
287
- count += client.playersCount;
288
- }
289
- return Promise.resolve(count);
290
- }
291
- broadcastInGamelet(monitor, data) {
292
- let msg = Message_1.Message.forBroadcast(Message_1.MessageType.BROADCAST_IN_GAMELET, monitor.code, '', data);
293
- let count = 0;
294
- for (let project of ClientManager_1.clientManager.listProjects()) {
295
- for (let client of project.listClients()) {
296
- let gamezone = this.getClientZone(client);
297
- gamezone.broadcast(msg);
298
- count += client.playersCount;
299
- }
300
- }
301
- return Promise.resolve(count);
302
- }
303
- sendDataToRoommate(player, playerCode, data) {
304
- let gameroom = player.getGameroom();
305
- this.designContract(gameroom, 'Not in any gameroom');
306
- let target = gameroom.getPlayer(playerCode);
307
- this.designContract(target, 'Target player not in this gameroom');
308
- return target.send(Message_1.Message.forDataToRoommate(player, data));
309
- }
310
- sendDataToRoomDecisionmaker(player, gameroomCode, data) {
311
- let gameroom = this.getGameroom(gameroomCode);
312
- this.designContract(gameroom, 'The gameroom is closed.');
313
- let target = gameroom.getBrainer();
314
- this.designContract(target, 'Decision maker not in the gameroom');
315
- let senderRoom = player.getGameroom();
316
- return target.send(Message_1.Message.forDataToRoomDecisionmaker(player, senderRoom ? senderRoom.code : '', gameroom.code, data));
317
- }
318
- setZonePlayerState(player, zoneCode, key, value) {
319
- let gamezone = this.getGamezone(player.client, zoneCode);
320
- this.designContract(gamezone, 'The zone does not exist.');
321
- gamezone.setPlayerState(player, key, value);
322
- return Promise.resolve(true);
323
- }
324
- setZonePlayerStates(player, zoneCode, states) {
325
- let gamezone = this.getGamezone(player.client, zoneCode);
326
- this.designContract(gamezone, 'The zone does not exist.');
327
- gamezone.setPlayerStates(player, states);
328
- return Promise.resolve(true);
329
- }
330
- setZonePlayerSynced(player, zoneCode, value, updateBrainer) {
331
- let gamezone = this.getGamezone(player.client, zoneCode);
332
- this.designContract(gamezone, 'The zone does not exist.');
333
- return gamezone.setPlayerSynced(player, value, updateBrainer)
334
- .then(() => gamezone.getBrainer().code);
335
- }
336
- getZonePlayerStates(player, zoneCode, playerCode) {
337
- let gamezone = this.getGamezone(player.client, zoneCode);
338
- this.designContract(gamezone, 'The zone does not exist.');
339
- let target = gamezone.getPlayer(playerCode);
340
- this.designContract(target, 'The player is not in the zone.');
341
- return Promise.resolve(gamezone.getPlayerStates(target));
342
- }
343
- getZonePlayersStates(player, zoneCode) {
344
- let gamezone = this.getGamezone(player.client, zoneCode);
345
- this.designContract(gamezone, 'The zone does not exist.');
346
- return Promise.resolve(gamezone.getPlayersStates());
347
- }
348
- setZoneStates(player, zoneCode, stateJson) {
349
- let gamezone = this.getGamezone(player.client, zoneCode);
350
- this.designContract(gamezone, 'The zone does not exist.');
351
- this.designContract(gamezone.includesPlayer(player), 'You are not in the zone');
352
- stateJson && ObjectUtil_1.ObjectUtil.safeAssign(gamezone.stateJson, stateJson);
353
- gamezone.emit(GameroomBase_1.GameroomBase.EVENT.STATUS_CHANGED);
354
- return Promise.resolve(gamezone);
355
- }
356
- getZoneStatistics(client, zoneCode) {
357
- let statistics = {
358
- code: zoneCode,
359
- players: 0,
360
- rooms: {
361
- open: { count: 0, players: 0 },
362
- locked: { count: 0, players: 0 },
363
- over: { count: 0, players: 0 },
364
- all: { count: 0, players: 0 }
365
- }
366
- };
367
- let zone = this.getGamezone(client, zoneCode);
368
- if (zone) {
369
- statistics.players = zone.playersCount;
370
- let rooms = zone.listAllGamerooms();
371
- statistics.rooms.all.count = rooms.length;
372
- for (let room of rooms) {
373
- if (room.state == Gameroom_1.GameroomState.OPEN) {
374
- ++statistics.rooms.open.count;
375
- statistics.rooms.open.players += room.playersCount;
376
- }
377
- else if (room.state == Gameroom_1.GameroomState.LOCKED) {
378
- ++statistics.rooms.locked.count;
379
- statistics.rooms.locked.players += room.playersCount;
380
- }
381
- else if (room.state == Gameroom_1.GameroomState.OVER) {
382
- ++statistics.rooms.over.count;
383
- statistics.rooms.over.players += room.playersCount;
384
- }
385
- statistics.rooms.all.players += room.playersCount;
386
- }
387
- }
388
- return Promise.resolve(statistics);
389
- }
390
- }
391
- exports.GameroomManager = GameroomManager;
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9tYW5hZ2Vycy9HYW1lcm9vbU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQW1EO0FBQ25ELG1EQUFnRDtBQUdoRCxtREFBNkQ7QUFDN0QsNkRBQTBEO0FBQzFELHlEQUF3RTtBQUV4RSxxREFBa0Q7QUFDbEQscURBQWlFO0FBQ2pFLCtDQUE0QztBQUU1QyxvREFBaUQ7QUFFakQsTUFBYSxlQUFnQixTQUFRLHlCQUFXO0lBVTVDLFlBQW9CLE1BQTBCO1FBQzFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRFQsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFSdEMsZ0JBQVcsR0FBZ0MsRUFBRSxDQUFDO1FBRXREOzs7V0FHRztRQUNLLGdCQUFXLEdBQW1ELEVBQUUsQ0FBQztJQUl6RSxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLElBQUksSUFBSSxHQUFXLHVCQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNCLElBQUksR0FBRyx1QkFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFZO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxJQUFZO1FBQzVDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMvQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFO2dCQUNyRCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYyxFQUFFLElBQVk7UUFDNUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM3RDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQWMsRUFBRSxJQUFZO1FBQ3BDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWM7UUFDeEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxjQUFjLENBQUMsTUFBYyxFQUFFLElBQVk7UUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDeEMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQVksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUU7WUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBUyxFQUFFLEdBQVcsRUFBRSxLQUFVLEVBQUUsRUFBRTtZQUNwRixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFPLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0csQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBUyxFQUFFLE1BQThCLEVBQUUsRUFBRTtZQUM1RixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFPLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQVksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFTLEVBQUUsS0FBYyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtZQUNqRyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFPLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQWMsRUFBRSxZQUFvQixFQUFFLFlBQW9CLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLEtBQW9CLEVBQUUsU0FBaUMsRUFBRSxVQUFtQjtRQUMvTCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLElBQUksUUFBUSxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3RIO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjLEVBQUUsWUFBb0IsRUFBRSxZQUFvQixFQUFFLFFBQWdCLEVBQUUsVUFBa0IsRUFBRSxLQUFvQixFQUFFLFNBQWlDLEVBQUUsVUFBbUI7UUFFekwsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRXBFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLElBQUksUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzVLLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUMzQyxRQUFRLENBQUMsSUFBSSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXJELFFBQVEsQ0FBQyxFQUFFLENBQUMsMkJBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUNqRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDdkIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDL0Q7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxFQUFFLENBQUMsMkJBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUU7WUFDdkQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxFQUFFLENBQUMsMkJBQVksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUU7WUFDekQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsRUFBRSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7WUFDaEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsRUFBRSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBUyxFQUFFLEdBQVcsRUFBRSxLQUFVLEVBQUUsRUFBRTtZQUN4RixRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFPLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLEVBQUUsQ0FBQywyQkFBWSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQVMsRUFBRSxNQUE4QixFQUFFLEVBQUU7WUFDaEcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBTyxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLEVBQUUsQ0FBQywyQkFBWSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQVMsRUFBRSxLQUFjLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1lBQ3JHLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQU8sQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFjLEVBQUUsWUFBb0IsRUFBRSxRQUFnQjtRQUMvRCxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFcEUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSx3QkFBYSxDQUFDLElBQUksRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDakcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjLEVBQUUsWUFBb0I7UUFDOUMsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNwRCxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjLEVBQUUsWUFBb0I7UUFDOUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjLEVBQUUsWUFBb0I7UUFDOUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzdELElBQUksUUFBUSxFQUFFO1lBQ1YsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWMsRUFBRSxZQUFvQjtRQUM5QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztRQUNuRyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFjLEVBQUUsWUFBb0IsRUFBRSxNQUFjLEVBQUUsTUFBbUI7UUFDbkYsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RELElBQUksUUFBUSxFQUFFO1lBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsNEJBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ25GO2FBQU07WUFDSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQscUJBQXFCLENBQUMsTUFBYztRQUNoQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNyRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELHFCQUFxQixDQUFDLE9BQWUsRUFBRSxZQUFvQjtRQUN2RCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDekQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsS0FBb0IsRUFBRSxTQUFrQztRQUNyRixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUNoRixRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixTQUFTLElBQUksdUJBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxRQUFRLENBQUMsSUFBSSxDQUFDLDJCQUFZLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsTUFBYyxFQUFFLFNBQWtDO1FBQ25FLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hGLFNBQVMsSUFBSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLFFBQVEsQ0FBQyxJQUFJLENBQUMsMkJBQVksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsR0FBVyxFQUFFLEtBQVU7UUFDdEQsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsTUFBYyxFQUFFLE1BQThCO1FBQzlELElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYyxFQUFFLEtBQWMsRUFBRSxhQUFzQjtRQUN0RSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNyRCxPQUFPLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUM7YUFDeEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBYztRQUM1QixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUNoRixPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQWMsRUFBRSxZQUFvQixFQUFFLElBQVM7UUFDM0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBTyxDQUFDLFlBQVksQ0FBQyxxQkFBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsWUFBb0IsRUFBRSxJQUFTO1FBQzVELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUN6RCxRQUFRLENBQUMsaUJBQWlCLENBQUMsaUJBQU8sQ0FBQyxZQUFZLENBQUMscUJBQVcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUgsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWTtZQUN4QixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUNoQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQWMsRUFBRSxJQUFTO1FBQ3JDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBTyxDQUFDLFlBQVksQ0FBQyxxQkFBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsSUFBUztRQUN0QyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNyRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsaUJBQU8sQ0FBQyxZQUFZLENBQUMscUJBQVcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUgsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWTtZQUN4QixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUNoQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQWMsRUFBRSxZQUFvQixFQUFFLElBQVM7UUFDM0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzdELElBQUksUUFBUSxFQUFFO1lBQ1YsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGlCQUFPLENBQUMsWUFBWSxDQUFDLHFCQUFXLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsWUFBb0IsRUFBRSxJQUFTO1FBQzVELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM3RCxJQUFJLFFBQVEsRUFBRTtZQUNWLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBTyxDQUFDLFlBQVksQ0FBQyxxQkFBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ25CLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWTtnQkFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDbkIsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxPQUFzQixFQUFFLElBQVM7UUFDbEUsSUFBSSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxZQUFZLENBQUMscUJBQVcsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUFnQixFQUFFLElBQVM7UUFDMUMsSUFBSSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxZQUFZLENBQUMscUJBQVcsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLE9BQU8sSUFBSSw2QkFBYSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQzlDLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUN0QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixLQUFLLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQzthQUNoQztTQUNKO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsVUFBa0IsRUFBRSxJQUFTO1FBQzVELElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztRQUNsRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsMkJBQTJCLENBQUMsTUFBYyxFQUFFLFlBQW9CLEVBQUUsSUFBUztRQUN2RSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDekQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQWMsRUFBRSxRQUFnQixFQUFFLEdBQVcsRUFBRSxLQUFVO1FBQ3hFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzFELFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWMsRUFBRSxRQUFnQixFQUFFLE1BQThCO1FBQ2hGLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzFELFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBYyxFQUFFLFFBQWdCLEVBQUUsS0FBYyxFQUFFLGFBQXNCO1FBQ3hGLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzFELE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQzthQUN4RCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQjtRQUNwRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUMxRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsTUFBYyxFQUFFLFFBQWdCO1FBQ2pELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzFELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxhQUFhLENBQUMsTUFBYyxFQUFFLFFBQWdCLEVBQUUsU0FBaUM7UUFDN0UsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLDBCQUEwQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDaEYsU0FBUyxJQUFJLHVCQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEUsUUFBUSxDQUFDLElBQUksQ0FBQywyQkFBWSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLFVBQVUsR0FBMEI7WUFDcEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsQ0FBQztZQUNWLEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO2dCQUM5QixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7YUFDaEM7U0FDSixDQUFDO1FBQ0YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxJQUFJLEVBQUU7WUFDTixVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFMUMsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSx3QkFBYSxDQUFDLElBQUksRUFBRTtvQkFDbEMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzlCLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2lCQUN0RDtxQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksd0JBQWEsQ0FBQyxNQUFNLEVBQUU7b0JBQzNDLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUNoQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztpQkFDeEQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLHdCQUFhLENBQUMsSUFBSSxFQUFFO29CQUN6QyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDOUIsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7aUJBQ3REO2dCQUVELFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ3JEO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNKO0FBaGFELDBDQWdhQyJ9
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ManagerBase = void 0;
4
- const MonitorManager_1 = require("./MonitorManager");
5
- class ManagerBase {
6
- constructor(name) {
7
- this.name = name;
8
- }
9
- designContract(condition, errorMsg) {
10
- if (!condition) {
11
- MonitorManager_1.monitorManager.error('', 'error', this.name, errorMsg);
12
- throw new Error(errorMsg);
13
- }
14
- }
15
- }
16
- exports.ManagerBase = ManagerBase;
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFuYWdlckJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmVyL21hbmFnZXJzL01hbmFnZXJCYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFrRDtBQUVsRCxNQUFhLFdBQVc7SUFFcEIsWUFBbUIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7SUFFL0IsQ0FBQztJQUVELGNBQWMsQ0FBQyxTQUFjLEVBQUUsUUFBZ0I7UUFDM0MsSUFBRyxDQUFDLFNBQVMsRUFBRTtZQUNYLCtCQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKO0FBWkQsa0NBWUMifQ==
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.monitorManager = void 0;
4
- const ClientManager_1 = require("./ClientManager");
5
- const Monitor_1 = require("./../entities/Monitor");
6
- const Message_1 = require("./../messages/Message");
7
- const StringUtil_1 = require("./../utils/StringUtil");
8
- const gltserver_service_1 = require("../services/gltserver.service");
9
- class MonitorManager {
10
- constructor() {
11
- this.channel = 'monitorCh';
12
- }
13
- initialize(clientCode, io) {
14
- this.monitorIO = io.of('/monitor');
15
- this.monitorIO.on('connection', (socket) => {
16
- socket.on(Message_1.MessageType.LOGIN, (token, cb) => {
17
- gltserver_service_1.serverService.validateAccessTokenForMonitor(token)
18
- .then(user => {
19
- if (this.monitor) {
20
- this.monitor.dispose();
21
- }
22
- ClientManager_1.clientManager.getClientProject(clientCode, true)
23
- .then(project => {
24
- this.monitor = new Monitor_1.Monitor(this.generateMonitorCode(socket), socket, project, user);
25
- this.monitor.initialize();
26
- cb({ data: { user: user } });
27
- });
28
- })
29
- .catch(err => {
30
- cb({ error: 'invalid credential, ' + err });
31
- socket.disconnect();
32
- });
33
- });
34
- });
35
- }
36
- generateMonitorCode(socket) {
37
- return 'CGM' + socket.client.id;
38
- }
39
- _log(projectCode, channel, prefix, data, color, player) {
40
- let msg = Message_1.Message.forMonitorLog(projectCode, channel, prefix, data, color, player);
41
- msg.send(this.monitorIO.to(this.channel));
42
- this.monitor && msg.send(this.monitor.socket);
43
- }
44
- log(projectCode, channel, prefix, data) {
45
- this._log(projectCode, channel, prefix, data, 'black');
46
- }
47
- logIncoming(projectCode, channel, prefix, data, player) {
48
- this._log(projectCode, channel, prefix, data, 'green', player);
49
- }
50
- logOutgoing(projectCode, channel, prefix, data, player) {
51
- this._log(projectCode, channel, prefix, data, 'blue', player);
52
- }
53
- error(projectCode, channel, prefix, err) {
54
- this._log(projectCode, channel, prefix, StringUtil_1.StringUtil.errorToString(err), 'red');
55
- }
56
- _event(projectCode, event, data) {
57
- let msg = Message_1.Message.forMonitorEvent(projectCode, event, data);
58
- msg.send(this.monitorIO.to(this.channel));
59
- this.monitor && msg.send(this.monitor.socket);
60
- }
61
- eventPlayerDisconnected(player) {
62
- this._event(player.client.project.code, 'playerDisconnected', {
63
- player: player.toMonitorPlayer()
64
- });
65
- }
66
- eventPlayerConneced(player) {
67
- this._event(player.client.project.code, 'playerConnected', {
68
- player: player.toMonitorPlayer()
69
- });
70
- }
71
- }
72
- exports.monitorManager = new MonitorManager();
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uaXRvck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmVyL21hbmFnZXJzL01vbml0b3JNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRDtBQUNoRCxtREFBZ0Q7QUFDaEQsbURBQTZEO0FBQzdELHNEQUFtRDtBQUVuRCxxRUFBOEQ7QUFHOUQsTUFBTSxjQUFjO0lBQXBCO1FBSVksWUFBTyxHQUFXLFdBQVcsQ0FBQztJQXlFMUMsQ0FBQztJQXJFRyxVQUFVLENBQUMsVUFBa0IsRUFBRSxFQUFtQjtRQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBdUIsRUFBRSxFQUFFO1lBQ3hELE1BQU0sQ0FBQyxFQUFFLENBQUMscUJBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBOEIsRUFBRSxFQUFFO2dCQUMzRSxpQ0FBYSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQztxQkFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNULElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMxQjtvQkFDRCw2QkFBYSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7eUJBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDWixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDcEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFD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
@@ -1,104 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.playerManager = void 0;
4
- const ManagerBase_1 = require("./ManagerBase");
5
- const Player_1 = require("../entities/Player");
6
- const Message_1 = require("../messages/Message");
7
- const ArrayUtil_1 = require("../utils/ArrayUtil");
8
- class PlayerManager extends ManagerBase_1.ManagerBase {
9
- constructor() {
10
- super('PlayerManager');
11
- this.players = {};
12
- this.clientUserMap = {};
13
- }
14
- initialize() {
15
- }
16
- listPlayers() {
17
- return ArrayUtil_1.ArrayUtil.listValuesOfObject(this.players);
18
- }
19
- createPlayer(socket, client, user, networkDelay) {
20
- let playerCode = this.generatePlayerCode(socket);
21
- this.designContract(!this.players[playerCode], 'The socket has been assigned to another user');
22
- let player = new Player_1.Player(playerCode, socket, client, user, networkDelay);
23
- this.processDuplicateLoginUser(player);
24
- this.players[player.code] = player;
25
- client.addPlayer(player);
26
- player.on(Player_1.Player.EVENT.DISCONNECTED, () => {
27
- delete this.players[player.code];
28
- (this.clientUserMap[player.clientUserKey] == player) && delete this.clientUserMap[player.clientUserKey];
29
- client.removePlayer(player);
30
- });
31
- return player;
32
- }
33
- getTotalPlayersCount() {
34
- let count = 0;
35
- for (let _key in this.players) {
36
- ++count;
37
- }
38
- return count;
39
- }
40
- getPlayerByCode(code) {
41
- return this.players[code];
42
- }
43
- generatePlayerCode(socket) {
44
- return 'CGP' + socket.client.id;
45
- }
46
- getPlayerByUsername(username) {
47
- for (let key in this.players) {
48
- let player = this.players[key];
49
- if (player.user.username == username) {
50
- return player;
51
- }
52
- }
53
- return null;
54
- }
55
- processDuplicateLoginUser(player) {
56
- let prevPlayer = this.clientUserMap[player.clientUserKey];
57
- if (prevPlayer && prevPlayer != player) {
58
- prevPlayer.disconnect();
59
- }
60
- this.clientUserMap[player.clientUserKey] = player;
61
- }
62
- updateNetworkDelay(player, networkDelay) {
63
- networkDelay = Math.max(10, networkDelay);
64
- player.setNetworkDelay(networkDelay);
65
- return Promise.resolve(networkDelay);
66
- }
67
- searchPlayers(player, term, length) {
68
- if (length <= 0 || !term || term.length < 2) {
69
- return Promise.resolve([]);
70
- }
71
- let list = [];
72
- for (let key in this.players) {
73
- let p = this.players[key];
74
- if (p.client == player.client && !p.user.guest) {
75
- if (p.user.nickname.includes(term) || p.user.username.includes(term)) {
76
- list.push(p);
77
- if (list.length >= length) {
78
- break;
79
- }
80
- }
81
- }
82
- }
83
- return Promise.resolve(list);
84
- }
85
- sendDataToPlayer(player, playerCode, data) {
86
- let target = this.players[playerCode];
87
- this.designContract(target, 'The player has left the game.');
88
- return target.send(Message_1.Message.forDataToPlayer(player, data));
89
- }
90
- gltReport(player, _zoneCode, _paramInt, _paramStr, _meta, disconnect) {
91
- if (disconnect) {
92
- setTimeout(() => player.disconnect(), 1);
93
- }
94
- player.addCheat();
95
- const room = player.getGameroom();
96
- if (room) {
97
- room.updateBrainer(false);
98
- room.broadcast(Message_1.Message.forPlayerCheated(player.code));
99
- }
100
- return Promise.resolve(1);
101
- }
102
- }
103
- exports.playerManager = new PlayerManager();
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxheWVyTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2ZXIvbWFuYWdlcnMvUGxheWVyTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrQ0FBNEM7QUFDNUMsK0NBQTRDO0FBQzVDLGlEQUE4QztBQUM5QyxrREFBK0M7QUFFL0MsTUFBTSxhQUFjLFNBQVEseUJBQVc7SUFLbkM7UUFDSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFKbkIsWUFBTyxHQUE4QixFQUFFLENBQUM7UUFDeEMsa0JBQWEsR0FBOEIsRUFBRSxDQUFDO0lBSXRELENBQUM7SUFFRCxVQUFVO0lBQ1YsQ0FBQztJQUVELFdBQVc7UUFDUCxPQUFPLHFCQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxZQUFZLENBQUMsTUFBdUIsRUFBRSxNQUFjLEVBQUUsSUFBYSxFQUFFLFlBQW9CO1FBQ3JGLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1FBQy9GLElBQUksTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDeEcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzNCLEVBQUUsS0FBSyxDQUFDO1NBQ1g7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUF1QjtRQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBZ0I7UUFDaEMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzFCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLEVBQUU7Z0JBQ2xDLE9BQU8sTUFBTSxDQUFDO2FBQ2pCO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8seUJBQXlCLENBQUMsTUFBYztRQUM1QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksTUFBTSxFQUFFO1lBQ3BDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUN0RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBYyxFQUFFLFlBQW9CO1FBQ25ELFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWMsRUFBRSxJQUFZLEVBQUUsTUFBYztRQUN0RCxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDYixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFO3dCQUN2QixNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLFVBQWtCLEVBQUUsSUFBUztRQUMxRCxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFDN0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFBRSxVQUFtQjtRQUM5RyxJQUFJLFVBQVUsRUFBRTtZQUNaLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDekQ7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNKO0FBRVksUUFBQSxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQyJ9