@jsprismarine/prismarine 0.2.0 → 0.3.0

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 (174) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/Console.cjs.js +2 -2
  3. package/dist/Console.d.ts +1 -1
  4. package/dist/Console.d.ts.map +1 -1
  5. package/dist/Console.es.js +2 -2
  6. package/dist/Player.cjs.js +1 -1
  7. package/dist/Player.es.js +1 -1
  8. package/dist/{Protocol-C1DcF_Iw.cjs → Protocol-BVaFul30.cjs} +2 -2
  9. package/dist/{Protocol-9T3wX43U.js → Protocol-D9dzQTbF.js} +2 -2
  10. package/dist/Server-DAXmO2Rm.js +1864 -0
  11. package/dist/Server-nY-WO-m_.cjs +1886 -0
  12. package/dist/Server.cjs.js +1 -1
  13. package/dist/Server.d.ts.map +1 -1
  14. package/dist/Server.es.js +1 -1
  15. package/dist/block/Block.cjs.js +2 -2
  16. package/dist/block/Block.es.js +2 -2
  17. package/dist/block/blocks/Bookshelf.d.ts +1 -1
  18. package/dist/block/blocks/CoalOre.d.ts +1 -1
  19. package/dist/block/blocks/Gravel.d.ts +1 -1
  20. package/dist/block/blocks/WhiteBed.d.ts +1 -1
  21. package/dist/chat/ChatManager.cjs.js +1 -1
  22. package/dist/chat/ChatManager.d.ts.map +1 -1
  23. package/dist/chat/ChatManager.es.js +1 -1
  24. package/dist/command/Command.cjs.js +2 -2
  25. package/dist/command/Command.es.js +2 -2
  26. package/dist/command/CommandArguments.cjs.js +1 -1
  27. package/dist/command/CommandArguments.es.js +1 -1
  28. package/dist/command/CommandManager.cjs.js +2 -2
  29. package/dist/command/CommandManager.es.js +2 -2
  30. package/dist/command/Commands.cjs.js +1 -1
  31. package/dist/command/Commands.es.js +1 -1
  32. package/dist/command/index.cjs.js +1 -1
  33. package/dist/command/index.es.js +1 -1
  34. package/dist/command/vanilla/BanCommand.cjs.js +1 -1
  35. package/dist/command/vanilla/BanCommand.es.js +1 -1
  36. package/dist/command/vanilla/DeopCommand.cjs.js +1 -1
  37. package/dist/command/vanilla/DeopCommand.es.js +1 -1
  38. package/dist/command/vanilla/ExecuteCommand.cjs.js +1 -1
  39. package/dist/command/vanilla/ExecuteCommand.es.js +1 -1
  40. package/dist/command/vanilla/GamemodeCommand.cjs.js +1 -1
  41. package/dist/command/vanilla/GamemodeCommand.es.js +1 -1
  42. package/dist/command/vanilla/KickCommand.cjs.js +1 -1
  43. package/dist/command/vanilla/KickCommand.es.js +1 -1
  44. package/dist/command/vanilla/OpCommand.cjs.js +1 -1
  45. package/dist/command/vanilla/OpCommand.es.js +1 -1
  46. package/dist/command/vanilla/PardonCommand.cjs.js +1 -1
  47. package/dist/command/vanilla/PardonCommand.es.js +1 -1
  48. package/dist/command/vanilla/SummonCommand.cjs.js +1 -1
  49. package/dist/command/vanilla/SummonCommand.es.js +1 -1
  50. package/dist/command/vanilla/TpCommand.cjs.js +1 -1
  51. package/dist/command/vanilla/TpCommand.es.js +1 -1
  52. package/dist/config/ConfigBuilder.cjs.js +12 -4
  53. package/dist/config/ConfigBuilder.d.ts.map +1 -1
  54. package/dist/config/ConfigBuilder.es.js +12 -4
  55. package/dist/entity/Attribute.cjs.js +1 -1
  56. package/dist/entity/Attribute.d.ts.map +1 -1
  57. package/dist/entity/Attribute.es.js +1 -1
  58. package/dist/entity/Entity.cjs.js +4 -3
  59. package/dist/entity/Entity.d.ts.map +1 -1
  60. package/dist/entity/Entity.es.js +4 -3
  61. package/dist/entity/Metadata.cjs.js +1 -1
  62. package/dist/entity/Metadata.d.ts.map +1 -1
  63. package/dist/entity/Metadata.es.js +1 -1
  64. package/dist/events/EventManager.cjs.js +1 -1
  65. package/dist/events/EventManager.d.ts.map +1 -1
  66. package/dist/events/EventManager.es.js +1 -1
  67. package/dist/form/Form.cjs.js +2 -2
  68. package/dist/form/Form.d.ts +1 -1
  69. package/dist/form/Form.d.ts.map +1 -1
  70. package/dist/form/Form.es.js +2 -2
  71. package/dist/form/FormManager.cjs.js +1 -1
  72. package/dist/form/FormManager.d.ts.map +1 -1
  73. package/dist/form/FormManager.es.js +1 -1
  74. package/dist/form/IForm.d.ts.map +1 -1
  75. package/dist/form/ModalForm.cjs.js +1 -1
  76. package/dist/form/ModalForm.d.ts.map +1 -1
  77. package/dist/form/ModalForm.es.js +1 -1
  78. package/dist/{index-D7ZMTxc2.cjs → index-CVGv9HUF.cjs} +2 -2
  79. package/dist/{index-B3UWpR-P.js → index-O6jPg9jt.js} +2 -2
  80. package/dist/index.cjs.js +3 -3
  81. package/dist/index.es.js +3 -3
  82. package/dist/inventory/HumanInventory.cjs.js +1 -1
  83. package/dist/inventory/HumanInventory.d.ts.map +1 -1
  84. package/dist/inventory/HumanInventory.es.js +1 -1
  85. package/dist/inventory/Inventory.cjs.js +1 -1
  86. package/dist/inventory/Inventory.d.ts.map +1 -1
  87. package/dist/inventory/Inventory.es.js +1 -1
  88. package/dist/inventory/WindowManager.cjs.js +1 -1
  89. package/dist/inventory/WindowManager.d.ts.map +1 -1
  90. package/dist/inventory/WindowManager.es.js +1 -1
  91. package/dist/item/Armor.cjs.js +1 -1
  92. package/dist/item/Armor.d.ts +1 -1
  93. package/dist/item/Armor.d.ts.map +1 -1
  94. package/dist/item/Armor.es.js +1 -1
  95. package/dist/item/Item.cjs.js +2 -2
  96. package/dist/item/Item.es.js +2 -2
  97. package/dist/item/ItemManager.cjs.js +2 -2
  98. package/dist/item/ItemManager.d.ts +2 -2
  99. package/dist/item/ItemManager.d.ts.map +1 -1
  100. package/dist/item/ItemManager.es.js +2 -2
  101. package/dist/item/TieredTool.cjs.js +1 -1
  102. package/dist/item/TieredTool.d.ts.map +1 -1
  103. package/dist/item/TieredTool.es.js +1 -1
  104. package/dist/item/Tool.cjs.js +1 -1
  105. package/dist/item/Tool.d.ts +1 -1
  106. package/dist/item/Tool.d.ts.map +1 -1
  107. package/dist/item/Tool.es.js +1 -1
  108. package/dist/network/ClientConnection.cjs.js +1 -1
  109. package/dist/network/ClientConnection.d.ts +1 -1
  110. package/dist/network/ClientConnection.d.ts.map +1 -1
  111. package/dist/network/ClientConnection.es.js +1 -1
  112. package/dist/network/Handlers.cjs.js +1 -1
  113. package/dist/network/Handlers.es.js +1 -1
  114. package/dist/network/MinecraftSession.cjs.js +1 -1
  115. package/dist/network/MinecraftSession.d.ts +1 -1
  116. package/dist/network/MinecraftSession.d.ts.map +1 -1
  117. package/dist/network/MinecraftSession.es.js +1 -1
  118. package/dist/network/NetworkUtil.cjs.js +1 -1
  119. package/dist/network/NetworkUtil.d.ts.map +1 -1
  120. package/dist/network/NetworkUtil.es.js +1 -1
  121. package/dist/network/PacketRegistry.cjs.js +1 -1
  122. package/dist/network/PacketRegistry.d.ts +6 -6
  123. package/dist/network/PacketRegistry.d.ts.map +1 -1
  124. package/dist/network/PacketRegistry.es.js +1 -1
  125. package/dist/network/PlayerSession.cjs.js +1 -1
  126. package/dist/network/PlayerSession.d.ts.map +1 -1
  127. package/dist/network/PlayerSession.es.js +1 -1
  128. package/dist/network/Protocol.cjs.js +1 -1
  129. package/dist/network/Protocol.es.js +1 -1
  130. package/dist/network/handler/LoginHandler.cjs.js +1 -1
  131. package/dist/network/handler/LoginHandler.es.js +1 -1
  132. package/dist/permission/PermissionManager.cjs.js +4 -4
  133. package/dist/permission/PermissionManager.d.ts +1 -1
  134. package/dist/permission/PermissionManager.d.ts.map +1 -1
  135. package/dist/permission/PermissionManager.es.js +4 -4
  136. package/dist/plugin/PluginFile.cjs.js +1 -1
  137. package/dist/plugin/PluginFile.d.ts.map +1 -1
  138. package/dist/plugin/PluginFile.es.js +1 -1
  139. package/dist/plugin/PluginManager.cjs.js +5 -4
  140. package/dist/plugin/PluginManager.d.ts +2 -2
  141. package/dist/plugin/PluginManager.d.ts.map +1 -1
  142. package/dist/plugin/PluginManager.es.js +5 -4
  143. package/dist/query/QueryManager.cjs.js +1 -1
  144. package/dist/query/QueryManager.es.js +1 -1
  145. package/dist/utils/Logger.cjs.js +49 -38
  146. package/dist/utils/Logger.d.ts +4 -1
  147. package/dist/utils/Logger.d.ts.map +1 -1
  148. package/dist/utils/Logger.es.js +49 -38
  149. package/dist/utils/ParseTildeCaretNotation.cjs.js +1 -1
  150. package/dist/utils/ParseTildeCaretNotation.d.ts.map +1 -1
  151. package/dist/utils/ParseTildeCaretNotation.es.js +1 -1
  152. package/dist/utils/Timer.cjs.js +1 -1
  153. package/dist/utils/Timer.d.ts.map +1 -1
  154. package/dist/utils/Timer.es.js +1 -1
  155. package/dist/utils/UUID.cjs.js +2 -2
  156. package/dist/utils/UUID.es.js +2 -2
  157. package/dist/world/BaseGenerator.cjs.js +1 -1
  158. package/dist/world/BaseGenerator.d.ts.map +1 -1
  159. package/dist/world/BaseGenerator.es.js +1 -1
  160. package/dist/world/BlockPosition.cjs.js +1 -1
  161. package/dist/world/BlockPosition.d.ts.map +1 -1
  162. package/dist/world/BlockPosition.es.js +1 -1
  163. package/dist/world/GameruleManager.cjs.js +4 -4
  164. package/dist/world/GameruleManager.d.ts +3 -3
  165. package/dist/world/GameruleManager.d.ts.map +1 -1
  166. package/dist/world/GameruleManager.es.js +4 -4
  167. package/dist/world/Generator.d.ts.map +1 -1
  168. package/dist/world/WorldManager.cjs.js +3 -7
  169. package/dist/world/WorldManager.d.ts +1 -1
  170. package/dist/world/WorldManager.d.ts.map +1 -1
  171. package/dist/world/WorldManager.es.js +3 -7
  172. package/package.json +5 -5
  173. package/dist/Server-AfmPsq74.cjs +0 -1884
  174. package/dist/Server-Dyy9OCM8.js +0 -1862
@@ -1,1884 +0,0 @@
1
- 'use strict';
2
-
3
- const raknet = require('@jsprismarine/raknet');
4
- const chat_Chat = require('./chat/Chat.cjs.js');
5
- const ban_BanManager = require('./ban/BanManager.cjs.js');
6
- const network_packet_BatchPacket = require('./network/packet/BatchPacket.cjs.js');
7
- const block_BlockManager = require('./block/BlockManager.cjs.js');
8
- const block_BlockMappings = require('./block/BlockMappings.cjs.js');
9
- const events_chat_ChatEvent = require('./events/chat/ChatEvent.cjs.js');
10
- const chat_ChatManager = require('./chat/ChatManager.cjs.js');
11
- const entity_Entities = require('./Entities-BDAVWab4.cjs');
12
- const brigadier = require('@jsprismarine/brigadier');
13
- const network_type_CommandParameter = require('./network/type/CommandParameter.cjs.js');
14
- const network_type_CommandEnum = require('./network/type/CommandEnum.cjs.js');
15
- const world_Gamemode = require('./world/Gamemode.cjs.js');
16
- const utils_ParseTargetSelector = require('./utils/ParseTargetSelector.cjs.js');
17
- const utils_ParseTildeCaretNotation = require('./utils/ParseTildeCaretNotation.cjs.js');
18
- const command_CommandManager = require('./command/CommandManager.cjs.js');
19
- const Console = require('./Console.cjs.js');
20
- const events_EventManager = require('./events/EventManager.cjs.js');
21
- const network_Identifiers = require('./network/Identifiers.cjs.js');
22
- const item_ItemManager = require('./item/ItemManager.cjs.js');
23
- const network_handler_AnimateHandler = require('./network/handler/AnimateHandler.cjs.js');
24
- const network_handler_ClientCacheStatusHandler = require('./network/handler/ClientCacheStatusHandler.cjs.js');
25
- const network_handler_CommandRequestHandler = require('./network/handler/CommandRequestHandler.cjs.js');
26
- const network_handler_ContainerCloseHandler = require('./network/handler/ContainerCloseHandler.cjs.js');
27
- const network_handler_EmoteListHandler = require('./network/handler/EmoteListHandler.cjs.js');
28
- const network_handler_InteractHandler = require('./network/handler/InteractHandler.cjs.js');
29
- const network_handler_InventoryTransactionHandler = require('./network/handler/InventoryTransactionHandler.cjs.js');
30
- const network_handler_LevelSoundEventHandler = require('./network/handler/LevelSoundEventHandler.cjs.js');
31
- const network_packet_PlayStatusPacket = require('./network/packet/PlayStatusPacket.cjs.js');
32
- const network_packet_ResourcePacksInfoPacket = require('./network/packet/ResourcePacksInfoPacket.cjs.js');
33
- const network_type_PlayStatusType = require('./network/type/PlayStatusType.cjs.js');
34
- const network_packet_ChangeDimensionPacket = require('./network/packet/ChangeDimensionPacket.cjs.js');
35
- const network_packet_LevelChunkPacket = require('./network/packet/LevelChunkPacket.cjs.js');
36
- const entity_Metadata = require('./entity/Metadata.cjs.js');
37
- const inventory_ContainerEntry = require('./inventory/ContainerEntry.cjs.js');
38
- const world_CoordinateUtils = require('./world/CoordinateUtils.cjs.js');
39
- const form_FormManager = require('./form/FormManager.cjs.js');
40
- const entity_Human = require('./entity/Human.cjs.js');
41
- const network_type_MovementType = require('./network/type/MovementType.cjs.js');
42
- const events_player_PlayerSetGamemodeEvent = require('./events/player/PlayerSetGamemodeEvent.cjs.js');
43
- const events_player_PlayerToggleFlightEvent = require('./events/player/PlayerToggleFlightEvent.cjs.js');
44
- const events_player_PlayerToggleSprintEvent = require('./events/player/PlayerToggleSprintEvent.cjs.js');
45
- const network_type_TextType = require('./network/type/TextType.cjs.js');
46
- const utils_Timer = require('./utils/Timer.cjs.js');
47
- const math_Vector3 = require('./math/Vector3.cjs.js');
48
- const inventory_WindowManager = require('./inventory/WindowManager.cjs.js');
49
- const network_handler_MobEquipmentHandler = require('./network/handler/MobEquipmentHandler.cjs.js');
50
- const network_handler_ModalFormResponseHandler = require('./network/handler/ModalFormResponseHandler.cjs.js');
51
- const network_handler_MovePlayerHandler = require('./network/handler/MovePlayerHandler.cjs.js');
52
- const network_handler_PacketViolationWarningHandler = require('./network/handler/PacketViolationWarningHandler.cjs.js');
53
- const network_handler_PlayerActionHandler = require('./network/handler/PlayerActionHandler.cjs.js');
54
- const network_handler_RequestChunkRadiusHandler = require('./network/handler/RequestChunkRadiusHandler.cjs.js');
55
- const network_handler_ResourcePackResponseHandler = require('./network/handler/ResourcePackResponseHandler.cjs.js');
56
- const network_handler_ServerSettingsRequestHandler = require('./network/handler/ServerSettingsRequestHandler.cjs.js');
57
- const network_handler_SetDefaultGameTypeHandler = require('./network/handler/SetDefaultGameTypeHandler.cjs.js');
58
- const network_handler_SetLocalPlayerAsInitializedHandler = require('./network/handler/SetLocalPlayerAsInitializedHandler.cjs.js');
59
- const network_handler_SetPlayerGameTypeHandler = require('./network/handler/SetPlayerGameTypeHandler.cjs.js');
60
- const network_handler_TextHandler = require('./network/handler/TextHandler.cjs.js');
61
- const network_handler_TickSyncHandler = require('./network/handler/TickSyncHandler.cjs.js');
62
- const network_handler_RequestNetworkSettingsHandler = require('./network/handler/RequestNetworkSettingsHandler.cjs.js');
63
- const network_Packets = require('./Packets-p7HX7ygn.cjs');
64
- const permission_PermissionManager = require('./permission/PermissionManager.cjs.js');
65
- const plugin_PluginManager = require('./plugin/PluginManager.cjs.js');
66
- const query_QueryManager = require('./query/QueryManager.cjs.js');
67
- const events_raknet_RaknetConnectEvent = require('./events/raknet/RaknetConnectEvent.cjs.js');
68
- const events_raknet_RaknetDisconnectEvent = require('./events/raknet/RaknetDisconnectEvent.cjs.js');
69
- const events_raknet_RaknetEncapsulatedPacketEvent = require('./events/raknet/RaknetEncapsulatedPacketEvent.cjs.js');
70
- const SessionManager = require('./SessionManager.cjs.js');
71
- const events_other_TickEvent = require('./events/other/TickEvent.cjs.js');
72
- const world_WorldManager = require('./world/WorldManager.cjs.js');
73
- const network_packet_NetworkChunkPublisherUpdatePacket = require('./network/packet/NetworkChunkPublisherUpdatePacket.cjs.js');
74
- const network_packet_PlayerListPacket = require('./network/packet/PlayerListPacket.cjs.js');
75
- const network_packet_UpdateAbilitiesPacket = require('./network/packet/UpdateAbilitiesPacket.cjs.js');
76
- const network_packet_AddPlayerPacket = require('./network/packet/AddPlayerPacket.cjs.js');
77
- const network_packet_AvailableCommandsPacket = require('./network/packet/AvailableCommandsPacket.cjs.js');
78
- const network_packet_UpdateAdventureSettingsPacket = require('./network/packet/UpdateAdventureSettingsPacket.cjs.js');
79
- const network_packet_ChunkRadiusUpdatedPacket = require('./network/packet/ChunkRadiusUpdatedPacket.cjs.js');
80
- const network_packet_CreativeContentPacket = require('./network/packet/CreativeContentPacket.cjs.js');
81
- const network_packet_DisconnectPacket = require('./network/packet/DisconnectPacket.cjs.js');
82
- const network_packet_InventoryContentPacket = require('./network/packet/InventoryContentPacket.cjs.js');
83
- const network_packet_MobEquipmentPacket = require('./network/packet/MobEquipmentPacket.cjs.js');
84
- const network_packet_ModalFormRequestPacket = require('./network/packet/ModalFormRequestPacket.cjs.js');
85
- const network_packet_MovePlayerPacket = require('./network/packet/MovePlayerPacket.cjs.js');
86
- const network_packet_RemoveActorPacket = require('./network/packet/RemoveActorPacket.cjs.js');
87
- const network_packet_SetActorDataPacket = require('./network/packet/SetActorDataPacket.cjs.js');
88
- const network_packet_SetPlayerGameTypePacket = require('./network/packet/SetPlayerGameTypePacket.cjs.js');
89
- const network_packet_SetTimePacket = require('./network/packet/SetTimePacket.cjs.js');
90
- const network_packet_TextPacket = require('./network/packet/TextPacket.cjs.js');
91
- const network_packet_UpdateAttributesPacket = require('./network/packet/UpdateAttributesPacket.cjs.js');
92
- const network_packet_ToastRequestPacket = require('./network/packet/ToastRequestPacket.cjs.js');
93
- const world_BlockPosition = require('./world/BlockPosition.cjs.js');
94
- const world_chunk_Chunk = require('./world/chunk/Chunk.cjs.js');
95
- const network_type_CommandData = require('./network/type/CommandData.cjs.js');
96
- const Heap = require('heap');
97
- const item_Item = require('./item/Item.cjs.js');
98
- const network_type_PermissionType = require('./network/type/PermissionType.cjs.js');
99
- const network_type_PlayerPermissionType = require('./network/type/PlayerPermissionType.cjs.js');
100
- const utils_UUID = require('./utils/UUID.cjs.js');
101
- const BedrockData = require('@jsprismarine/bedrock-data');
102
- const network_MinecraftSession = require('./network/MinecraftSession.cjs.js');
103
- const assert = require('assert');
104
-
105
- const _interopDefault = e => e && e.__esModule ? e : { default: e };
106
-
107
- const Heap__default = /*#__PURE__*/_interopDefault(Heap);
108
- const assert__default = /*#__PURE__*/_interopDefault(assert);
109
-
110
- class CommandArgument {
111
- getReadableType() {
112
- return "";
113
- }
114
- getParameters() {
115
- return /* @__PURE__ */ new Set();
116
- }
117
- }
118
- class CommandArgumentGamemode {
119
- name;
120
- optional;
121
- flags;
122
- postfix;
123
- constructor(data) {
124
- this.name = data?.name ?? "gameMode";
125
- this.optional = data?.optional ?? false;
126
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
127
- this.postfix = data?.postfix ?? null;
128
- }
129
- parse(reader, _context) {
130
- const gm = reader.readString();
131
- world_Gamemode.default.getGamemodeId(gm);
132
- return gm;
133
- }
134
- async listSuggestions(_context, _builder) {
135
- return brigadier.Suggestions.empty();
136
- }
137
- getExamples() {
138
- return ["survival", "creative", "adventure", "spectator"];
139
- }
140
- getReadableType() {
141
- return this.name;
142
- }
143
- getParameters() {
144
- const gameModeEnum = new network_type_CommandEnum.default();
145
- gameModeEnum.enumName = "GameMode";
146
- gameModeEnum.enumValues = ["survival", "creative", "adventure", "spectator"];
147
- return /* @__PURE__ */ new Set([
148
- new network_type_CommandParameter.default({
149
- paramName: this.name,
150
- isOptional: this.optional,
151
- flags: this.flags,
152
- enum: gameModeEnum,
153
- postfix: this.postfix
154
- })
155
- ]);
156
- }
157
- }
158
- class CommandArgumentMob {
159
- name;
160
- optional;
161
- flags;
162
- postfix;
163
- constructor(data) {
164
- this.name = data?.name ?? "entityType";
165
- this.optional = data?.optional ?? false;
166
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
167
- this.postfix = data?.postfix ?? null;
168
- }
169
- parse(reader, _context) {
170
- let str = "";
171
- while (true) {
172
- if (!reader.canRead())
173
- break;
174
- const pos = reader.getCursor();
175
- const char = reader.read();
176
- if (char === " ") {
177
- reader.setCursor(pos);
178
- break;
179
- }
180
- str += char;
181
- }
182
- return str;
183
- }
184
- async listSuggestions(_context, _builder) {
185
- return brigadier.Suggestions.empty();
186
- }
187
- getExamples() {
188
- return [];
189
- }
190
- getReadableType() {
191
- return this.name;
192
- }
193
- getParameters() {
194
- const entityTypeEnum = new network_type_CommandEnum.default();
195
- entityTypeEnum.enumName = "EntityType";
196
- entityTypeEnum.enumValues = Object.entries(entity_Entities.Entities).map(([, entity]) => entity.MOB_ID);
197
- return /* @__PURE__ */ new Set([
198
- new network_type_CommandParameter.default({
199
- paramName: this.name,
200
- isOptional: this.optional,
201
- flags: this.flags,
202
- enum: entityTypeEnum,
203
- postfix: this.postfix
204
- })
205
- ]);
206
- }
207
- }
208
- class CommandArgumentEntity {
209
- name;
210
- optional;
211
- flags;
212
- postfix;
213
- constructor(data) {
214
- this.name = data?.name ?? "target";
215
- this.optional = data?.optional ?? false;
216
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
217
- this.postfix = data?.postfix ?? null;
218
- }
219
- parse(reader, context) {
220
- let player = "";
221
- while (true) {
222
- if (!reader.canRead())
223
- break;
224
- const pos = reader.getCursor();
225
- const char = reader.read();
226
- if (char === " ") {
227
- reader.setCursor(pos);
228
- break;
229
- }
230
- player += char;
231
- }
232
- if (player.startsWith("@"))
233
- try {
234
- return utils_ParseTargetSelector.default({
235
- input: player,
236
- source: context.getSource(),
237
- entities: context.getSource().getWorld().getEntities()
238
- });
239
- } catch (error) {
240
- if (!error.message.includes("no results"))
241
- throw error;
242
- return [];
243
- }
244
- return [context.getSource().getServer().getSessionManager().getPlayerByExactName(player)];
245
- }
246
- getReadableType() {
247
- return this.name;
248
- }
249
- getParameters() {
250
- return /* @__PURE__ */ new Set([
251
- new network_type_CommandParameter.default({
252
- paramName: this.name,
253
- paramType: network_type_CommandParameter.CommandParameterType.Target,
254
- isOptional: this.optional,
255
- flags: this.flags,
256
- postfix: this.postfix
257
- })
258
- ]);
259
- }
260
- }
261
- class CommandArgumentPosition extends math_Vector3.default {
262
- name;
263
- optional;
264
- flags;
265
- postfix;
266
- constructor(data) {
267
- super();
268
- this.name = data?.name ?? "position";
269
- this.optional = data?.optional ?? false;
270
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
271
- this.postfix = data?.postfix ?? null;
272
- }
273
- parse(reader, context) {
274
- const getPos = () => {
275
- let pos = "";
276
- while (true) {
277
- if (!reader.canRead())
278
- break;
279
- const cursor = reader.getCursor();
280
- const char = reader.read();
281
- if (char === " ") {
282
- reader.setCursor(cursor);
283
- break;
284
- }
285
- pos += char;
286
- }
287
- return pos;
288
- };
289
- this.setX(
290
- utils_ParseTildeCaretNotation.default({
291
- input: getPos(),
292
- source: context.getSource(),
293
- type: "x"
294
- })
295
- );
296
- reader.skip();
297
- this.setY(
298
- utils_ParseTildeCaretNotation.default({
299
- input: getPos(),
300
- source: context.getSource(),
301
- type: "y"
302
- })
303
- );
304
- reader.skip();
305
- this.setZ(
306
- utils_ParseTildeCaretNotation.default({
307
- input: getPos(),
308
- source: context.getSource(),
309
- type: "z"
310
- })
311
- );
312
- return this;
313
- }
314
- getReadableType() {
315
- return this.name;
316
- }
317
- getParameters() {
318
- return /* @__PURE__ */ new Set([
319
- new network_type_CommandParameter.default({
320
- paramName: this.name,
321
- paramType: network_type_CommandParameter.CommandParameterType.Position,
322
- isOptional: this.optional,
323
- flags: this.flags,
324
- postfix: this.postfix
325
- })
326
- ]);
327
- }
328
- }
329
- class CommandArgumentCommand {
330
- name;
331
- optional;
332
- flags;
333
- postfix;
334
- constructor(data) {
335
- this.name = data?.name ?? "command";
336
- this.optional = data?.optional ?? false;
337
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
338
- this.postfix = data?.postfix ?? null;
339
- }
340
- parse(reader, _context) {
341
- const command = reader.readString();
342
- return command;
343
- }
344
- getReadableType() {
345
- return this.name;
346
- }
347
- getParameters() {
348
- return /* @__PURE__ */ new Set([
349
- new network_type_CommandParameter.default({
350
- paramName: this.name,
351
- paramType: network_type_CommandParameter.CommandParameterType.Position,
352
- isOptional: this.optional,
353
- flags: this.flags,
354
- postfix: this.postfix
355
- })
356
- ]);
357
- }
358
- }
359
- class BooleanArgumentCommand {
360
- name;
361
- optional;
362
- flags;
363
- postfix;
364
- constructor(data) {
365
- this.name = data?.name ?? "boolean";
366
- this.optional = data?.optional ?? false;
367
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
368
- this.postfix = data?.postfix ?? null;
369
- }
370
- parse(reader, _context) {
371
- const boolean = reader.readString();
372
- if (boolean === "true")
373
- return true;
374
- return false;
375
- }
376
- getReadableType() {
377
- return this.name;
378
- }
379
- getParameters() {
380
- const booleanEnum = new network_type_CommandEnum.default();
381
- booleanEnum.enumName = "Boolean";
382
- booleanEnum.enumValues = ["true", "false"];
383
- return /* @__PURE__ */ new Set([
384
- new network_type_CommandParameter.default({
385
- paramName: this.name,
386
- isOptional: this.optional,
387
- enum: booleanEnum,
388
- flags: this.flags,
389
- postfix: this.postfix
390
- })
391
- ]);
392
- }
393
- }
394
- class PlayerArgumentCommand {
395
- name;
396
- optional;
397
- flags;
398
- postfix;
399
- constructor(data) {
400
- this.name = data?.name ?? "player";
401
- this.optional = data?.optional ?? false;
402
- this.flags = data?.flags ?? network_type_CommandParameter.CommandParameterFlags.NONE;
403
- this.postfix = data?.postfix ?? null;
404
- }
405
- parse(reader, _context) {
406
- const player = reader.readString();
407
- return player;
408
- }
409
- getReadableType() {
410
- return this.name;
411
- }
412
- getParameters() {
413
- const playerEnum = new network_type_CommandEnum.default();
414
- playerEnum.enumName = "Player";
415
- try {
416
- playerEnum.enumValues = Server.instance.getSessionManager().getAllPlayers().map((player) => player.getName());
417
- } catch {
418
- playerEnum.enumValues = [];
419
- }
420
- return /* @__PURE__ */ new Set([
421
- new network_type_CommandParameter.default({
422
- paramName: this.name,
423
- isOptional: this.optional,
424
- enum: playerEnum,
425
- flags: this.flags,
426
- postfix: this.postfix
427
- })
428
- ]);
429
- }
430
- }
431
-
432
- class LoginHandler {
433
- static NetID = network_Identifiers.default.LoginPacket;
434
- async handle(packet, server, connection) {
435
- const playStatus = new network_packet_PlayStatusPacket.default();
436
- if (packet.protocol !== network_Identifiers.default.Protocol) {
437
- playStatus.status = packet.protocol < network_Identifiers.default.Protocol ? network_type_PlayStatusType.default.LoginFailedClient : network_type_PlayStatusType.default.LoginFailedServer;
438
- await connection.sendDataPacket(playStatus, true);
439
- return;
440
- }
441
- if (!packet.displayName) {
442
- connection.disconnect("Invalid username!", false);
443
- return;
444
- }
445
- const world = server.getWorldManager().getDefaultWorld();
446
- const player = new Player(connection, world, server);
447
- player.username.name = packet.displayName;
448
- player.locale = packet.languageCode;
449
- player.randomId = packet.clientRandomId;
450
- player.uuid = packet.identity;
451
- player.xuid = packet.XUID;
452
- player.skin = packet.skin;
453
- player.device = packet.device;
454
- try {
455
- const oldPlayer = server.getSessionManager().getPlayerByExactName(packet.displayName);
456
- await oldPlayer.kick("Logged in from another location");
457
- } catch {
458
- }
459
- if (!player.xuid && server.getConfig().getOnlineMode()) {
460
- await player.kick("Server is in online-mode!");
461
- return;
462
- }
463
- await player.onEnable();
464
- const reason = server.getBanManager().isBanned(player);
465
- if (reason !== false) {
466
- await player.kick(`You have been banned${reason ? ` for reason: ${reason}` : ""}!`);
467
- return;
468
- }
469
- const session = connection.initPlayerConnection(server, player);
470
- await session.sendPlayStatus(network_type_PlayStatusType.default.LoginSuccess);
471
- await world.addEntity(player);
472
- const resourcePacksInfo = new network_packet_ResourcePacksInfoPacket.default();
473
- resourcePacksInfo.resourcePackRequired = false;
474
- resourcePacksInfo.forceServerPacksEnabled = false;
475
- resourcePacksInfo.hasScripts = false;
476
- resourcePacksInfo.hasAddonPacks = false;
477
- await connection.sendDataPacket(resourcePacksInfo, true);
478
- }
479
- }
480
-
481
- const Handlers = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
482
- __proto__: null,
483
- AnimateHandler: network_handler_AnimateHandler.default,
484
- ClientCacheStatusHandler: network_handler_ClientCacheStatusHandler.default,
485
- CommandRequestHandler: network_handler_CommandRequestHandler.default,
486
- ContainerCloseHandler: network_handler_ContainerCloseHandler.default,
487
- EmoteListHandler: network_handler_EmoteListHandler.default,
488
- InteractHandler: network_handler_InteractHandler.default,
489
- InventoryTransactionHandler: network_handler_InventoryTransactionHandler.default,
490
- LevelSoundEventHandler: network_handler_LevelSoundEventHandler.default,
491
- LoginHandler,
492
- MobEquipmentHandler: network_handler_MobEquipmentHandler.default,
493
- ModalFormResponseHandler: network_handler_ModalFormResponseHandler.default,
494
- MovePlayerHandler: network_handler_MovePlayerHandler.default,
495
- PacketViolationWarningHandler: network_handler_PacketViolationWarningHandler.default,
496
- PlayerActionHandler: network_handler_PlayerActionHandler.default,
497
- RequestChunkRadiusHandler: network_handler_RequestChunkRadiusHandler.default,
498
- RequestNetworkSettingsHandler: network_handler_RequestNetworkSettingsHandler.default,
499
- ResourcePackResponseHandler: network_handler_ResourcePackResponseHandler.default,
500
- ServerSettingsRequestHandler: network_handler_ServerSettingsRequestHandler.default,
501
- SetDefaultGameTypeHandler: network_handler_SetDefaultGameTypeHandler.default,
502
- SetLocalPlayerAsInitializedHandler: network_handler_SetLocalPlayerAsInitializedHandler.default,
503
- SetPlayerGameTypeHandler: network_handler_SetPlayerGameTypeHandler.default,
504
- TextHandler: network_handler_TextHandler.default,
505
- TickSyncHandler: network_handler_TickSyncHandler.default
506
- }, Symbol.toStringTag, { value: 'Module' }));
507
-
508
- class PlayerSession {
509
- connection;
510
- server;
511
- player;
512
- chunkSendQueue = [];
513
- loadedChunks = /* @__PURE__ */ new Set();
514
- loadingChunks = /* @__PURE__ */ new Set();
515
- constructor(server, connection, player) {
516
- this.server = server;
517
- this.connection = connection;
518
- this.player = player;
519
- }
520
- async update(_tick) {
521
- if (this.chunkSendQueue.length > 0) {
522
- const chunksToSend = this.chunkSendQueue.splice(0, Math.min(this.chunkSendQueue.length, 50));
523
- const batch = new network_packet_BatchPacket.default();
524
- for (const chunk of chunksToSend) {
525
- const pk = new network_packet_LevelChunkPacket.default();
526
- pk.chunkX = chunk.getX();
527
- pk.chunkZ = chunk.getZ();
528
- pk.clientSubChunkRequestsEnabled = false;
529
- pk.subChunkCount = chunk.getTopEmpty() + 4;
530
- pk.data = chunk.networkSerialize();
531
- batch.addPacket(pk);
532
- const hash = world_chunk_Chunk.default.packXZ(chunk.getX(), chunk.getZ());
533
- this.loadedChunks.add(hash);
534
- this.loadingChunks.delete(hash);
535
- }
536
- this.connection.sendBatch(batch, false);
537
- }
538
- this.player.viewDistance && await this.needNewChunks();
539
- }
540
- /**
541
- * Notify a client about change(s) to the adventure settings.
542
- *
543
- * @param player - The client-controlled entity
544
- */
545
- async sendSettings(player) {
546
- const target = player ?? this.player;
547
- const pk = new network_packet_UpdateAdventureSettingsPacket.default();
548
- pk.worldImmutable = target.gamemode === world_Gamemode.default.Spectator;
549
- pk.noAttackingPlayers = target.gamemode === world_Gamemode.default.Spectator;
550
- pk.noAttackingMobs = target.gamemode === world_Gamemode.default.Spectator;
551
- pk.autoJump = true;
552
- pk.showNameTags = true;
553
- await this.connection.sendDataPacket(pk);
554
- }
555
- async sendAbilities(player) {
556
- const target = player ?? this.player;
557
- const pk = new network_packet_UpdateAbilitiesPacket.default();
558
- pk.commandPermission = target.isOp() ? network_type_PermissionType.default.Operator : network_type_PermissionType.default.Normal;
559
- pk.playerPermission = target.isOp() ? network_type_PlayerPermissionType.default.Operator : network_type_PlayerPermissionType.default.Member;
560
- pk.targetActorUniqueId = target.getRuntimeId();
561
- const mainLayer = new network_packet_UpdateAbilitiesPacket.AbilityLayer();
562
- mainLayer.layerType = network_packet_UpdateAbilitiesPacket.AbilityLayerType.BASE;
563
- mainLayer.layerFlags = /* @__PURE__ */ new Map([
564
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.FLY_SPEED, true],
565
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.WALK_SPEED, true],
566
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.MAY_FLY, target.getAllowFlight()],
567
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.FLYING, target.isFlying()],
568
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.NO_CLIP, target.gamemode === world_Gamemode.default.Spectator],
569
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.OPERATOR_COMMANDS, target.isOp()],
570
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.TELEPORT, target.isOp()],
571
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.INVULNERABLE, target.gamemode === world_Gamemode.default.Creative],
572
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.MUTED, false],
573
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.WORLD_BUILDER, false],
574
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.INSTABUILD, target.gamemode === world_Gamemode.default.Creative],
575
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.LIGHTNING, false],
576
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.BUILD, target.gamemode !== world_Gamemode.default.Spectator],
577
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.MINE, target.gamemode !== world_Gamemode.default.Spectator],
578
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.DOORS_AND_SWITCHES, target.gamemode !== world_Gamemode.default.Spectator],
579
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.OPEN_CONTAINERS, target.gamemode !== world_Gamemode.default.Spectator],
580
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.ATTACK_PLAYERS, target.gamemode !== world_Gamemode.default.Spectator],
581
- [network_packet_UpdateAbilitiesPacket.AbilityLayerFlag.ATTACK_MOBS, target.gamemode !== world_Gamemode.default.Spectator]
582
- ]);
583
- mainLayer.flySpeed = 0.05;
584
- mainLayer.walkSpeed = 0.1;
585
- pk.abilityLayers = [mainLayer];
586
- await this.connection.sendDataPacket(pk);
587
- }
588
- async needNewChunks(forceResend = false, dist) {
589
- const currentXChunk = world_CoordinateUtils.default.fromBlockToChunk(this.player.getX());
590
- const currentZChunk = world_CoordinateUtils.default.fromBlockToChunk(this.player.getZ());
591
- const viewDistance = this.player.viewDistance ?? dist;
592
- const chunksToSendHeap = new Heap__default.default((a, b) => {
593
- const distXFirst = Math.abs(a[0] - currentXChunk);
594
- const distXSecond = Math.abs(b[0] - currentXChunk);
595
- const distZFirst = Math.abs(a[1] - currentZChunk);
596
- const distZSecond = Math.abs(b[1] - currentZChunk);
597
- return distXFirst + distZFirst > distXSecond + distZSecond ? 1 : -1;
598
- });
599
- for (let sendXChunk = -viewDistance; sendXChunk <= viewDistance; sendXChunk++) {
600
- for (let sendZChunk = -viewDistance; sendZChunk <= viewDistance; sendZChunk++) {
601
- if (sendXChunk * sendXChunk + sendZChunk * sendZChunk > viewDistance * viewDistance)
602
- continue;
603
- const newChunk = [currentXChunk + sendXChunk, currentZChunk + sendZChunk];
604
- const hash = world_chunk_Chunk.default.packXZ(newChunk[0], newChunk[1]);
605
- if (forceResend) {
606
- chunksToSendHeap.push(newChunk);
607
- } else if (!this.loadedChunks.has(hash) && !this.loadingChunks.has(hash)) {
608
- chunksToSendHeap.push(newChunk);
609
- }
610
- }
611
- }
612
- while (chunksToSendHeap.size() > 0) {
613
- const closestChunk = chunksToSendHeap.pop();
614
- const hash = world_chunk_Chunk.default.packXZ(closestChunk[0], closestChunk[1]);
615
- if (forceResend) {
616
- if (!this.loadedChunks.has(hash) && !this.loadingChunks.has(hash)) {
617
- this.loadingChunks.add(hash);
618
- await this.requestChunk(closestChunk[0], closestChunk[1]);
619
- } else {
620
- const loadedChunk = await this.player.getWorld().getChunk(closestChunk[0], closestChunk[1]);
621
- await this.sendChunk(loadedChunk);
622
- }
623
- } else {
624
- this.loadingChunks.add(hash);
625
- await this.requestChunk(closestChunk[0], closestChunk[1]);
626
- }
627
- }
628
- let unloaded = false;
629
- for (const hash of this.loadedChunks) {
630
- const [x, z] = world_chunk_Chunk.default.unpackXZ(hash);
631
- if (Math.abs(x - currentXChunk) > viewDistance || Math.abs(z - currentZChunk) > viewDistance) {
632
- unloaded = true;
633
- this.loadedChunks.delete(hash);
634
- }
635
- }
636
- for (const hash of this.loadingChunks) {
637
- const [x, z] = world_chunk_Chunk.default.unpackXZ(hash);
638
- if (Math.abs(x - currentXChunk) > viewDistance || Math.abs(z - currentZChunk) > viewDistance) {
639
- this.loadingChunks.delete(hash);
640
- }
641
- }
642
- if (!unloaded && this.chunkSendQueue.length !== 0) {
643
- await this.sendNetworkChunkPublisher(dist ?? viewDistance, []);
644
- }
645
- }
646
- async requestChunk(x, z) {
647
- const chunk = await this.player.getWorld().getChunk(x, z);
648
- this.chunkSendQueue.push(chunk);
649
- }
650
- /**
651
- * Clear the currently loaded and loading chunks.
652
- *
653
- * @remarks
654
- * Usually used for changing dimension, world, etc.
655
- */
656
- async clearChunks() {
657
- this.loadedChunks.clear();
658
- this.loadingChunks.clear();
659
- }
660
- async sendInventory() {
661
- const pk = new network_packet_InventoryContentPacket.default();
662
- pk.items = this.player.getInventory().getItems(true);
663
- pk.windowId = inventory_WindowManager.WindowIds.INVENTORY;
664
- await this.connection.sendDataPacket(pk);
665
- await this.sendHandItem(this.player.getInventory().getItemInHand());
666
- }
667
- async sendCreativeContents(empty = false) {
668
- const pk = new network_packet_CreativeContentPacket.default();
669
- if (empty) {
670
- await this.connection.sendDataPacket(pk);
671
- return;
672
- }
673
- const entries = [
674
- ...this.player.getServer().getBlockManager().getBlocks(),
675
- ...this.player.getServer().getItemManager().getItems()
676
- ];
677
- BedrockData.creativeitems.forEach((item) => {
678
- pk.items.push(
679
- ...entries.filter((entry) => {
680
- return entry.meta === (item.damage ?? 0) && entry.getId() === item.id;
681
- }).map(
682
- (entry) => new item_Item.default({
683
- id: entry.getId(),
684
- name: entry.getName(),
685
- meta: entry.meta
686
- })
687
- )
688
- );
689
- });
690
- await this.connection.sendDataPacket(pk);
691
- }
692
- /**
693
- * Sets the item in the player hand.
694
- *
695
- * @param item - The entity.
696
- */
697
- async sendHandItem(item) {
698
- const pk = new network_packet_MobEquipmentPacket.default();
699
- pk.runtimeEntityId = this.player.getRuntimeId();
700
- pk.item = item;
701
- pk.inventorySlot = this.player.getInventory().getHandSlotIndex();
702
- pk.hotbarSlot = this.player.getInventory().getHandSlotIndex();
703
- pk.windowId = 0;
704
- await this.connection.sendDataPacket(pk);
705
- }
706
- async sendForm(form) {
707
- const id = this.player.getFormManager().addForm(form);
708
- const pk = new network_packet_ModalFormRequestPacket.default();
709
- pk.formId = id;
710
- pk.formData = form.jsonSerialize();
711
- await this.connection.sendDataPacket(pk);
712
- }
713
- /**
714
- * Set the client's current tick.
715
- *
716
- * @param tick - The tick
717
- */
718
- async sendTime(tick) {
719
- const pk = new network_packet_SetTimePacket.default();
720
- pk.time = tick;
721
- await this.connection.sendDataPacket(pk);
722
- }
723
- /**
724
- * Set the client's gamemode.
725
- *
726
- * @param gamemode - the numeric gamemode ID
727
- */
728
- async sendGamemode(gamemode) {
729
- const pk = new network_packet_SetPlayerGameTypePacket.default();
730
- pk.gamemode = gamemode;
731
- await this.connection.sendDataPacket(pk);
732
- }
733
- async sendNetworkChunkPublisher(distance, savedChunks) {
734
- const pk = new network_packet_NetworkChunkPublisherUpdatePacket.default();
735
- pk.position = world_BlockPosition.default.fromVector3(this.player);
736
- pk.radius = distance << 4;
737
- pk.savedChunks = savedChunks;
738
- await this.connection.sendDataPacket(pk);
739
- }
740
- async sendAvailableCommands() {
741
- const pk = new network_packet_AvailableCommandsPacket.default();
742
- this.server.getCommandManager().getCommandsList().forEach((command) => {
743
- const commandClass = Array.from(this.server.getCommandManager().getCommands().values()).find(
744
- (cmd2) => cmd2.id.split(":")[1] === command[0]
745
- );
746
- if (!commandClass) {
747
- this.player.getServer().getLogger()?.warn(`Can't find corresponding command class for "${command[0]}"`);
748
- return;
749
- }
750
- if (!this.player.getServer().getPermissionManager().can(this.player).execute(commandClass.permission))
751
- return;
752
- const cmd = new network_type_CommandData.default();
753
- cmd.commandName = command[0];
754
- cmd.commandDescription = commandClass.description;
755
- if (commandClass.aliases.length > 0) {
756
- const cmdAliases = new network_type_CommandEnum.default();
757
- cmdAliases.enumName = `${command[0]}Aliases`;
758
- cmdAliases.enumValues = commandClass.aliases.concat(command[0]);
759
- cmd.aliases = cmdAliases;
760
- }
761
- command[2].forEach((arg, index) => {
762
- const parameters = arg.map((parameter) => {
763
- const parameters2 = parameter.getParameters();
764
- if (parameters2)
765
- return Array.from(parameters2.values());
766
- if (parameter instanceof CommandArgumentEntity)
767
- return [
768
- new network_type_CommandParameter.default({
769
- paramName: "target",
770
- paramType: network_type_CommandParameter.CommandParameterType.Target
771
- })
772
- ];
773
- if (parameter instanceof CommandArgumentGamemode)
774
- return [
775
- new network_type_CommandParameter.default({
776
- paramName: "gamemode",
777
- paramType: network_type_CommandParameter.CommandParameterType.String
778
- })
779
- ];
780
- if (parameter.constructor.name === "StringArgumentType")
781
- return [
782
- new network_type_CommandParameter.default({
783
- paramName: "value",
784
- paramType: network_type_CommandParameter.CommandParameterType.String
785
- })
786
- ];
787
- if (parameter.constructor.name === "IntegerArgumentType")
788
- return [
789
- new network_type_CommandParameter.default({
790
- paramName: "number",
791
- paramType: network_type_CommandParameter.CommandParameterType.Int
792
- })
793
- ];
794
- this.server.getLogger()?.warn(`Invalid parameter ${parameter.constructor.name}`);
795
- return [
796
- new network_type_CommandParameter.default({
797
- paramName: "value",
798
- paramType: network_type_CommandParameter.CommandParameterType.String
799
- })
800
- ];
801
- }).filter((a) => a).flat();
802
- cmd.overloads[index] = parameters;
803
- });
804
- pk.commandData.push(cmd);
805
- });
806
- const playerEnum = new network_type_CommandEnum.default();
807
- playerEnum.enumName = "Player";
808
- playerEnum.enumValues = this.player.getServer().getSessionManager().getAllPlayers().map((player) => player.getName());
809
- pk.softEnums = [playerEnum];
810
- }
811
- /**
812
- * Set the client's maximum view distance.
813
- *
814
- * @param distance - The view distance
815
- */
816
- async setViewDistance(distance) {
817
- this.player.viewDistance = distance;
818
- const pk = new network_packet_ChunkRadiusUpdatedPacket.default();
819
- pk.radius = distance;
820
- await this.connection.sendDataPacket(pk);
821
- }
822
- async sendAttributes(attributes) {
823
- const pk = new network_packet_UpdateAttributesPacket.default();
824
- pk.runtimeEntityId = this.player.getRuntimeId();
825
- pk.attributes = attributes ?? this.player.getAttributeManager().getAttributes();
826
- pk.tick = BigInt(0);
827
- await this.connection.sendDataPacket(pk);
828
- }
829
- async sendMetadata() {
830
- const pk = new network_packet_SetActorDataPacket.default();
831
- pk.runtimeEntityId = this.player.getRuntimeId();
832
- pk.metadata = this.player.getMetadataManager();
833
- pk.tick = BigInt(0);
834
- await this.connection.sendDataPacket(pk);
835
- }
836
- /**
837
- * Send a chat message to the client.
838
- *
839
- * @remarks
840
- * Refactor this completely.
841
- *
842
- * @param message - The message
843
- * @param xuid - The source xuid
844
- * @param parameters -
845
- * @param needsTranslation - If the TextType requires translation
846
- * @param type - The text type
847
- */
848
- async sendMessage(message, xuid = "", parameters = [], needsTranslation = false, type = network_type_TextType.default.Raw) {
849
- if (!message)
850
- throw new Error("A message is required");
851
- const pk = new network_packet_TextPacket.default();
852
- pk.type = type;
853
- pk.sourceName = "";
854
- pk.message = message;
855
- pk.needsTranslation = needsTranslation;
856
- pk.xuid = xuid;
857
- pk.platformChatId = "";
858
- pk.parameters = parameters;
859
- await this.connection.sendDataPacket(pk);
860
- }
861
- async sendToast(title, body) {
862
- if (!title)
863
- throw new Error("A toast title is required");
864
- if (!body)
865
- throw new Error("A toast body is required.");
866
- const pk = new network_packet_ToastRequestPacket.default();
867
- pk.title = title;
868
- pk.body = body;
869
- await this.connection.sendDataPacket(pk);
870
- }
871
- async sendChunk(chunk) {
872
- const pk = new network_packet_LevelChunkPacket.default();
873
- pk.chunkX = chunk.getX();
874
- pk.chunkZ = chunk.getZ();
875
- pk.clientSubChunkRequestsEnabled = false;
876
- pk.subChunkCount = chunk.getTopEmpty() + 4;
877
- pk.data = chunk.networkSerialize();
878
- await this.connection.sendDataPacket(pk, void 0, false);
879
- const hash = world_chunk_Chunk.default.packXZ(chunk.getX(), chunk.getZ());
880
- this.loadedChunks.add(hash);
881
- this.loadingChunks.delete(hash);
882
- }
883
- /**
884
- * Broadcast the movement to a defined player
885
- */
886
- async broadcastMove(player, mode = network_type_MovementType.default.Normal) {
887
- const pk = new network_packet_MovePlayerPacket.default();
888
- pk.runtimeEntityId = player.getRuntimeId();
889
- pk.positionX = player.getX();
890
- pk.positionY = player.getY();
891
- pk.positionZ = player.getZ();
892
- pk.pitch = player.pitch;
893
- pk.yaw = player.yaw;
894
- pk.headYaw = player.headYaw;
895
- pk.mode = mode;
896
- pk.onGround = player.isOnGround();
897
- if (mode === network_type_MovementType.default.Teleport) {
898
- pk.teleportCause = 0;
899
- pk.teleportItemId = 0;
900
- }
901
- pk.ridingEntityRuntimeId = BigInt(0);
902
- pk.tick = BigInt(0);
903
- await this.connection.sendDataPacket(pk);
904
- }
905
- /**
906
- * Adds the client to the player list of every player inside
907
- * the server and also to the player itself.
908
- */
909
- async addToPlayerList() {
910
- const playerList = new network_packet_PlayerListPacket.default();
911
- playerList.type = network_packet_PlayerListPacket.PlayerListAction.TYPE_ADD;
912
- const entry = new network_packet_PlayerListPacket.PlayerListEntry({
913
- uuid: utils_UUID.default.fromString(this.player.uuid),
914
- uniqueEntityid: this.player.getRuntimeId(),
915
- name: this.player.getName(),
916
- xuid: this.player.xuid,
917
- platformChatId: "",
918
- // TODO: read this value from Login
919
- buildPlatform: this.player.device ? this.player.device.os : -1,
920
- skin: this.player.skin,
921
- isTeacher: false,
922
- // TODO: figure out where to read teacher and host
923
- isHost: false
924
- });
925
- playerList.entries.push(entry);
926
- await this.server.broadcastPacket(playerList);
927
- this.server.getSessionManager().getPlayerList().set(this.player.uuid, entry);
928
- }
929
- /**
930
- * Removes a player from other players list
931
- */
932
- async removeFromPlayerList() {
933
- if (!this.player.uuid)
934
- return;
935
- const pk = new network_packet_PlayerListPacket.default();
936
- pk.type = network_packet_PlayerListPacket.PlayerListAction.TYPE_REMOVE;
937
- const entry = new network_packet_PlayerListPacket.PlayerListEntry({
938
- uuid: utils_UUID.default.fromString(this.player.getUUID())
939
- });
940
- pk.entries.push(entry);
941
- this.server.getSessionManager().getPlayerList().delete(this.player.uuid);
942
- await Promise.all(
943
- this.server.getSessionManager().getAllPlayers().map(async (player) => player.getNetworkSession().getConnection().sendDataPacket(pk))
944
- );
945
- }
946
- /**
947
- * Sends the full player list to the player.
948
- */
949
- async sendPlayerList() {
950
- const playerList = new network_packet_PlayerListPacket.default();
951
- playerList.type = network_packet_PlayerListPacket.PlayerListAction.TYPE_ADD;
952
- playerList.entries = Array.from(this.server.getSessionManager().getPlayerList().values());
953
- await this.connection.sendDataPacket(playerList);
954
- }
955
- /**
956
- * Spawn the player for another player
957
- *
958
- * @param player - the player to send the AddPlayerPacket to
959
- */
960
- async sendSpawn(player) {
961
- if (!player.getUUID()) {
962
- this.server.getLogger()?.error(`UUID for player ${player.getName()} is undefined`);
963
- return;
964
- }
965
- const pk = new network_packet_AddPlayerPacket.default();
966
- pk.uuid = utils_UUID.default.fromString(this.player.getUUID());
967
- pk.runtimeEntityId = this.player.getRuntimeId();
968
- pk.name = this.player.getName();
969
- pk.positionX = this.player.getX();
970
- pk.positionY = this.player.getY();
971
- pk.positionZ = this.player.getZ();
972
- pk.motionX = 0;
973
- pk.motionY = 0;
974
- pk.motionZ = 0;
975
- pk.pitch = this.player.pitch;
976
- pk.yaw = this.player.yaw;
977
- pk.headYaw = this.player.headYaw;
978
- pk.item = this.player.getInventory().getItemInHand();
979
- pk.deviceId = this.player.device?.id ?? "";
980
- pk.metadata = this.player.getMetadataManager();
981
- await player.getNetworkSession().getConnection().sendDataPacket(pk);
982
- }
983
- /**
984
- * Despawn the player entity from another player
985
- */
986
- async sendDespawn(player) {
987
- const pk = new network_packet_RemoveActorPacket.default();
988
- pk.uniqueEntityId = this.player.getRuntimeId();
989
- await player.getNetworkSession().getConnection().sendDataPacket(pk);
990
- }
991
- async sendPlayStatus(status) {
992
- const pk = new network_packet_PlayStatusPacket.default();
993
- pk.status = status;
994
- await this.connection.sendDataPacket(pk, true);
995
- }
996
- async kick(reason = "unknown reason") {
997
- const pk = new network_packet_DisconnectPacket.default();
998
- pk.skipMessage = false;
999
- pk.message = reason;
1000
- await this.connection.sendDataPacket(pk, true);
1001
- }
1002
- getConnection() {
1003
- return this.connection;
1004
- }
1005
- getPlayer() {
1006
- return this.player;
1007
- }
1008
- }
1009
-
1010
- const VANILLA_DEFAULT_SPAWN_RADIUS = 4;
1011
- class Player extends entity_Human.default {
1012
- address;
1013
- networkSession;
1014
- permissions;
1015
- // Only used for metrics
1016
- joinTimer = new utils_Timer.default();
1017
- // TODO: finish implementation
1018
- windows;
1019
- connected = false;
1020
- username = {
1021
- prefix: "<",
1022
- suffix: ">",
1023
- name: ""
1024
- };
1025
- locale = "";
1026
- randomId = 0;
1027
- uuid = "";
1028
- xuid = "";
1029
- skin = null;
1030
- viewDistance = 0;
1031
- gamemode = 0;
1032
- pitch = 0;
1033
- yaw = 0;
1034
- headYaw = 0;
1035
- onGround = false;
1036
- sprinting = false;
1037
- flying = false;
1038
- sneaking = false;
1039
- allowFight = false;
1040
- platformChatId = "";
1041
- device = null;
1042
- cacheSupport = false;
1043
- chunkSendQueue = /* @__PURE__ */ new Set();
1044
- currentChunk = null;
1045
- forms;
1046
- chatHandler;
1047
- /**
1048
- * Player's constructor.
1049
- */
1050
- constructor(connection, world, server) {
1051
- super(world, server);
1052
- this.address = connection.getRakNetSession().getAddress();
1053
- this.networkSession = new PlayerSession(server, connection, this);
1054
- this.windows = new inventory_WindowManager.default();
1055
- this.forms = new form_FormManager.default();
1056
- this.permissions = [];
1057
- this.joinTimer.reset();
1058
- this.chatHandler = async (evt) => {
1059
- if (evt.isCancelled())
1060
- return;
1061
- if (evt.getChat().getChannel() === "*.everyone" || evt.getChat().getChannel() === "*.ops" && this.isOp() || evt.getChat().getChannel() === `*.player.${this.getName()}`)
1062
- await this.sendMessage(
1063
- evt.getChat().getMessage(),
1064
- evt.getChat().getType(),
1065
- evt.getChat().getParameters(),
1066
- evt.getChat().isNeedsTranslation()
1067
- );
1068
- };
1069
- server.getEventManager().on("chat", this.chatHandler);
1070
- }
1071
- async onEnable() {
1072
- this.permissions = await this.getServer().getPermissionManager().getPermissions(this);
1073
- const playerData = await this.getWorld().getPlayerData(this);
1074
- await this.setX(playerData.position.x);
1075
- await this.setY(playerData.position.y);
1076
- await this.setZ(playerData.position.z);
1077
- this.pitch = playerData.position.pitch ?? 0;
1078
- this.yaw = playerData.position.yaw ?? 0;
1079
- playerData.inventory.forEach((item) => {
1080
- const entry = this.getServer().getItemManager().getItem(item.id) || this.getServer().getBlockManager().getBlock(item.id);
1081
- if (!entry) {
1082
- this.getServer().getLogger()?.warn(`Item/block with id ${item.id} is invalid`, "Player/onEnable");
1083
- return;
1084
- }
1085
- this.getInventory().setItem(
1086
- item.position,
1087
- new inventory_ContainerEntry.default({
1088
- item: entry,
1089
- count: item.count
1090
- })
1091
- );
1092
- });
1093
- if (!this.connected)
1094
- this.getServer().getLogger()?.debug(`(Complete player creation took ${this.joinTimer.stop()} ms)`, "Player/onEnable");
1095
- this.connected = true;
1096
- }
1097
- async onDisable() {
1098
- if (this.connected && this.xuid)
1099
- await this.getWorld().savePlayerData(this);
1100
- this.server.getEventManager().removeListener("chat", this.chatHandler);
1101
- this.connected = false;
1102
- }
1103
- /**
1104
- * Used to match vanilla behavior, will send chunks
1105
- * with an initial view radius of VANILLA_DEFAULT_SPAWN_RADIUS.
1106
- */
1107
- async sendInitialSpawnChunks() {
1108
- const minX = world_CoordinateUtils.default.fromBlockToChunk(this.x) - VANILLA_DEFAULT_SPAWN_RADIUS;
1109
- const minZ = world_CoordinateUtils.default.fromBlockToChunk(this.z) - VANILLA_DEFAULT_SPAWN_RADIUS;
1110
- const maxX = world_CoordinateUtils.default.fromBlockToChunk(this.x) + VANILLA_DEFAULT_SPAWN_RADIUS;
1111
- const maxZ = world_CoordinateUtils.default.fromBlockToChunk(this.z) + VANILLA_DEFAULT_SPAWN_RADIUS;
1112
- const savedChunks = [];
1113
- const sendQueue = [];
1114
- for (let chunkX = minX; chunkX <= maxX; ++chunkX) {
1115
- for (let chunkZ = minZ; chunkZ <= maxZ; ++chunkZ) {
1116
- savedChunks.push({ x: chunkX, z: chunkZ });
1117
- sendQueue.push(this.getWorld().getChunk(chunkX, chunkZ));
1118
- }
1119
- }
1120
- await this.networkSession.sendNetworkChunkPublisher(VANILLA_DEFAULT_SPAWN_RADIUS, savedChunks);
1121
- const getUniqueChunks = (sendList) => {
1122
- const xSet = /* @__PURE__ */ new Set();
1123
- const zSet = /* @__PURE__ */ new Set();
1124
- for (const coord of sendList) {
1125
- xSet.add(coord.x);
1126
- zSet.add(coord.z);
1127
- }
1128
- return Math.floor((xSet.size + zSet.size) / 2);
1129
- };
1130
- for (let i = 0; i < getUniqueChunks(savedChunks); ++i) {
1131
- await this.networkSession.sendNetworkChunkPublisher(VANILLA_DEFAULT_SPAWN_RADIUS, []);
1132
- }
1133
- for await (const chunk of sendQueue) {
1134
- await this.networkSession.sendChunk(chunk);
1135
- }
1136
- }
1137
- /**
1138
- * Change the player's current world.
1139
- *
1140
- * @param world - the new world
1141
- */
1142
- async setWorld(world) {
1143
- const dim0 = new network_packet_ChangeDimensionPacket.default();
1144
- dim0.dimension = 0;
1145
- dim0.position = this;
1146
- dim0.respawn = false;
1147
- const dim1 = new network_packet_ChangeDimensionPacket.default();
1148
- dim1.dimension = 1;
1149
- dim1.position = new math_Vector3.default(0, 0, 0);
1150
- dim1.respawn = false;
1151
- await this.networkSession.getConnection().sendDataPacket(dim0);
1152
- await this.networkSession.sendPlayStatus(network_type_PlayStatusType.default.PlayerSpawn);
1153
- await this.networkSession.getConnection().sendDataPacket(dim1);
1154
- await this.networkSession.sendPlayStatus(network_type_PlayStatusType.default.PlayerSpawn);
1155
- await this.getWorld().removeEntity(this);
1156
- await world.addEntity(this);
1157
- await super.setWorld.bind(this)(world);
1158
- await this.setPosition(new math_Vector3.default(0, 0, 0));
1159
- for (let x = -3; x < 3; x++) {
1160
- for (let z = -3; z < 3; z++) {
1161
- const pk = new network_packet_LevelChunkPacket.default();
1162
- pk.clientSubChunkRequestsEnabled = false;
1163
- pk.chunkX = x;
1164
- pk.chunkZ = z;
1165
- pk.data = Buffer.from("");
1166
- pk.subChunkCount = 0;
1167
- await this.networkSession.getConnection().sendDataPacket(pk);
1168
- }
1169
- }
1170
- await this.networkSession.getConnection().sendDataPacket(dim1);
1171
- await this.networkSession.sendPlayStatus(network_type_PlayStatusType.default.PlayerSpawn);
1172
- await this.networkSession.getConnection().sendDataPacket(dim0);
1173
- await this.networkSession.sendPlayStatus(network_type_PlayStatusType.default.PlayerSpawn);
1174
- this.currentChunk = null;
1175
- await this.networkSession.clearChunks();
1176
- await this.networkSession.needNewChunks();
1177
- await this.onEnable();
1178
- await this.networkSession.sendPlayStatus(network_type_PlayStatusType.default.PlayerSpawn);
1179
- }
1180
- isOnline() {
1181
- return this.connected;
1182
- }
1183
- async update(tick) {
1184
- await super.update.bind(this)(tick);
1185
- await this.networkSession.update(tick);
1186
- if (tick % (20 * 5 * 60 * 1) === 0) {
1187
- await this.networkSession.sendTime(tick);
1188
- }
1189
- for (const chunk of this.chunkSendQueue) {
1190
- await this.networkSession.sendNetworkChunkPublisher(this.viewDistance ?? VANILLA_DEFAULT_SPAWN_RADIUS, []);
1191
- await this.networkSession.sendChunk(chunk);
1192
- this.chunkSendQueue.delete(chunk);
1193
- }
1194
- }
1195
- async kick(reason = "unknown reason") {
1196
- this.getServer().getLogger()?.verbose(`Player with id §b${this.getRuntimeId()}§r was kicked: ${reason}`, "Player/kick");
1197
- await this.networkSession.kick(reason);
1198
- }
1199
- async sendSettings() {
1200
- }
1201
- // Return all the players in the same chunk,.
1202
- // TODO: move to world
1203
- getPlayersInChunk() {
1204
- return this.getServer().getSessionManager().getAllPlayers().filter((player) => player.getCurrentChunk() === this.getCurrentChunk());
1205
- }
1206
- // TODO: these
1207
- async sendSpawn() {
1208
- }
1209
- async sendDespawn() {
1210
- }
1211
- /**
1212
- * Send a chat message to the client.
1213
- * @param message - the message
1214
- */
1215
- async sendMessage(message, type = network_type_TextType.default.Raw, parameters = [], needsTranslation = false) {
1216
- await this.networkSession.sendMessage(message, "", parameters, needsTranslation, type);
1217
- }
1218
- /**
1219
- * Send a toast notification (like Xbox Live notifications)
1220
- * @param title - the toast title
1221
- * @param body - the toast body
1222
- */
1223
- async sendToast(title, body) {
1224
- await this.networkSession.sendToast(title, body);
1225
- }
1226
- async setGamemode(mode) {
1227
- const event = new events_player_PlayerSetGamemodeEvent.default(this, mode);
1228
- this.getServer().getEventManager().post(["playerSetGamemode", event]);
1229
- if (event.isCancelled())
1230
- return;
1231
- this.gamemode = event.getGamemode();
1232
- await this.networkSession.sendGamemode(this.gamemode);
1233
- if (this.gamemode === world_Gamemode.default.Creative || this.gamemode === world_Gamemode.default.Spectator)
1234
- this.allowFight = true;
1235
- else {
1236
- this.allowFight = false;
1237
- await this.setFlying(false);
1238
- }
1239
- await this.sendSettings();
1240
- }
1241
- getGamemode() {
1242
- return world_Gamemode.default.getGamemodeName(this.gamemode).toLowerCase();
1243
- }
1244
- getNetworkSession() {
1245
- return this.networkSession;
1246
- }
1247
- getAddress() {
1248
- return this.address;
1249
- }
1250
- getName() {
1251
- return this.username.name;
1252
- }
1253
- getFormattedUsername() {
1254
- return `${this.username.prefix}${this.username.name}${this.username.suffix}`;
1255
- }
1256
- getPermissions() {
1257
- return this.permissions;
1258
- }
1259
- getUUID() {
1260
- if (!this.uuid)
1261
- throw new Error("uuid is missing!");
1262
- return this.uuid;
1263
- }
1264
- getXUID() {
1265
- if (!this.xuid)
1266
- throw new Error("xuid is missing!");
1267
- return this.xuid;
1268
- }
1269
- getFormManager() {
1270
- return this.forms;
1271
- }
1272
- getWindows() {
1273
- return this.windows;
1274
- }
1275
- getAllowFlight() {
1276
- return this.allowFight;
1277
- }
1278
- isPlayer() {
1279
- return true;
1280
- }
1281
- /**
1282
- * Check if the `Player` is an operator.
1283
- *
1284
- * @returns `true` if this player is an operator otherwise `false`.
1285
- */
1286
- isOp() {
1287
- return this.getServer().getPermissionManager().isOp(this.getName());
1288
- }
1289
- /**
1290
- * Check if the `Player` is sprinting.
1291
- *
1292
- * @returns `true` if this player is sprinting otherwise `false`.
1293
- */
1294
- isSprinting() {
1295
- return this.sprinting;
1296
- }
1297
- async setSprinting(sprinting) {
1298
- if (sprinting === this.isSprinting())
1299
- return;
1300
- const event = new events_player_PlayerToggleSprintEvent.default(this, sprinting);
1301
- this.getServer().getEventManager().post(["playerToggleSprint", event]);
1302
- if (event.isCancelled())
1303
- return;
1304
- this.sprinting = event.getIsSprinting();
1305
- this.setDataFlag(entity_Metadata.MetadataFlag.INDEX, entity_Metadata.MetadataFlag.SPRINTING, this.isSprinting(), entity_Metadata.FlagType.BYTE);
1306
- await this.networkSession.sendMetadata();
1307
- }
1308
- isFlying() {
1309
- return this.flying;
1310
- }
1311
- async setFlying(flying) {
1312
- if (flying === this.isFlying())
1313
- return;
1314
- if (!this.getAllowFlight()) {
1315
- this.flying = false;
1316
- return;
1317
- }
1318
- const event = new events_player_PlayerToggleFlightEvent.default(this, flying);
1319
- this.getServer().getEventManager().post(["playerToggleFlight", event]);
1320
- if (event.isCancelled())
1321
- return;
1322
- this.flying = event.getIsFlying();
1323
- await this.sendSettings();
1324
- }
1325
- isSneaking() {
1326
- return this.sneaking;
1327
- }
1328
- async setSneaking(val) {
1329
- this.sneaking = val;
1330
- await this.sendSettings();
1331
- }
1332
- isOnGround() {
1333
- return this.onGround;
1334
- }
1335
- async setOnGround(val) {
1336
- if (val === this.onGround)
1337
- return;
1338
- this.onGround = val;
1339
- }
1340
- /**
1341
- * Set the position.
1342
- *
1343
- * @remarks
1344
- * This will notify the player's client about the position change.
1345
- *
1346
- * @param position - The position
1347
- * @param type - The movement type
1348
- */
1349
- async setPosition(position, type = network_type_MovementType.default.Normal) {
1350
- await this.setX(position.getX());
1351
- await this.setY(position.getY());
1352
- await this.setZ(position.getZ());
1353
- await this.networkSession.broadcastMove(this, type);
1354
- }
1355
- setCurrentChunk(chunk) {
1356
- if (this.currentChunk === chunk)
1357
- return;
1358
- this.currentChunk = chunk;
1359
- }
1360
- getCurrentChunk() {
1361
- return this.currentChunk;
1362
- }
1363
- }
1364
-
1365
- class ClientConnection extends network_MinecraftSession.default {
1366
- playerSession = null;
1367
- hasCompression = false;
1368
- constructor(session, logger) {
1369
- super(session, logger);
1370
- }
1371
- /**
1372
- * @internal
1373
- *
1374
- * @param server - the server instance
1375
- * @param player - the player instance
1376
- * @returns the new player session
1377
- */
1378
- initPlayerConnection(server, player) {
1379
- assert__default.default(this.playerSession === null, "Player session was already created");
1380
- this.playerSession = new PlayerSession(server, this, player);
1381
- return this.playerSession;
1382
- }
1383
- disconnect(reason = "disconnect.disconnected", hideReason = true) {
1384
- const packet = new network_packet_DisconnectPacket.default();
1385
- packet.skipMessage = hideReason;
1386
- packet.message = reason;
1387
- void this.sendDataPacket(packet);
1388
- this.rakSession.disconnect();
1389
- }
1390
- getPlayerSession() {
1391
- return this.playerSession;
1392
- }
1393
- getRakNetSession() {
1394
- return this.rakSession;
1395
- }
1396
- }
1397
-
1398
- class PacketRegistry {
1399
- server;
1400
- packets = /* @__PURE__ */ new Map();
1401
- handlers = /* @__PURE__ */ new Map();
1402
- constructor(server) {
1403
- this.server = server;
1404
- }
1405
- async onEnable() {
1406
- await this.registerPackets();
1407
- await this.registerHandlers();
1408
- }
1409
- async onDisable() {
1410
- this.handlers.clear();
1411
- this.packets.clear();
1412
- }
1413
- /**
1414
- * Register a packet.
1415
- * @param packet the packet.
1416
- */
1417
- registerPacket(packet) {
1418
- if (this.packets.has(packet.NetID))
1419
- throw new Error(
1420
- `Packet ${packet.name} is trying to use id ${packet.NetID.toString(16)} which already exists!`
1421
- );
1422
- this.packets.set(packet.NetID, packet);
1423
- this.server.getLogger()?.debug(`Packet with id §b${packet.name}§r registered`, "PacketRegistry/registerPacket");
1424
- }
1425
- /**
1426
- * Get a packet by it's network ID.
1427
- * @param id the NetID.
1428
- */
1429
- getPacket(id) {
1430
- if (!this.packets.has(id))
1431
- throw new Error(`Invalid packet with id ${id}!`);
1432
- return this.packets.get(id);
1433
- }
1434
- /**
1435
- * Remove a packet from the registry.
1436
- * @param id the NetID.
1437
- */
1438
- removePacket(id) {
1439
- this.packets.delete(id);
1440
- }
1441
- registerHandler(id, handler) {
1442
- if (this.handlers.has(id))
1443
- throw new Error(`Handler with id ${id} already exists!`);
1444
- this.handlers.set(id, handler);
1445
- this.server.getLogger()?.debug(`Handler with id §b${handler.constructor.name}§r registered`, "PacketRegistry/registerHandler");
1446
- }
1447
- getHandler(id) {
1448
- if (!this.handlers.has(id))
1449
- throw new Error(`Invalid handler with id ${id.toString(16)}!`);
1450
- return this.handlers.get(id);
1451
- }
1452
- /**
1453
- * Merge two handlers.
1454
- * This is useful if you want to extend a handler without actually replacing it.
1455
- *
1456
- * @param handler the first handler, executed first.
1457
- * @param handler2 the second handler.
1458
- */
1459
- appendHandler(handler, handler2) {
1460
- const res = new class Handler {
1461
- async handle(packet, server, session) {
1462
- await handler.handle(packet, server, session);
1463
- await handler2.handle(packet, server, session);
1464
- }
1465
- }();
1466
- return res;
1467
- }
1468
- /**
1469
- * Remove a handler from the registry.
1470
- * @param id the handler id.
1471
- */
1472
- removeHandler(id) {
1473
- this.handlers.delete(id);
1474
- }
1475
- /**
1476
- * Dynamically register all packets exported by './Protocol'.
1477
- */
1478
- async registerPackets() {
1479
- const timer = new utils_Timer.default();
1480
- Object.entries(network_Packets.Packets).filter(([, value]) => value.name !== "DataPacket" && value.name !== "BatchPacket").map(([, value]) => this.registerPacket(value));
1481
- this.server.getLogger()?.verbose(
1482
- `Registered §b${this.packets.size}§r of §b${Array.from(Object.keys(network_Identifiers.default)).length - 2}§r packet(s) (took ${timer.stop()} ms)!`,
1483
- "PacketRegistry/registerPackets"
1484
- );
1485
- }
1486
- /**
1487
- * Dynamically register all handlers exported by './Handlers'.
1488
- */
1489
- async registerHandlers() {
1490
- const timer = new utils_Timer.default();
1491
- Object.entries(Handlers).map(([, value]) => this.registerHandler(value.NetID, new value()));
1492
- this.server.getLogger()?.verbose(
1493
- `Registered §b${this.handlers.size}§r packet handler(s) (took ${timer.stop()} ms)!`,
1494
- "PacketRegistry/registerHandlers"
1495
- );
1496
- }
1497
- /**
1498
- * Get all packets from the registry.
1499
- */
1500
- getPackets() {
1501
- return this.packets;
1502
- }
1503
- /**
1504
- * Get all handlers from the registry.
1505
- */
1506
- getHandlers() {
1507
- return this.handlers;
1508
- }
1509
- }
1510
-
1511
- class Server {
1512
- version;
1513
- raknet;
1514
- logger;
1515
- config;
1516
- tps = 20;
1517
- console;
1518
- eventManager = new events_EventManager.EventManager();
1519
- packetRegistry;
1520
- sessionManager = new SessionManager.default();
1521
- pluginManager;
1522
- commandManager;
1523
- worldManager;
1524
- itemManager;
1525
- blockManager;
1526
- queryManager;
1527
- chatManager;
1528
- permissionManager;
1529
- banManager;
1530
- stopping = false;
1531
- tickerTimer;
1532
- static MINECRAFT_TICK_TIME_MS = 1e3 / 20;
1533
- /**
1534
- * @deprecated
1535
- */
1536
- static instance;
1537
- constructor({ logger, config, version }) {
1538
- const advertisedVersion = network_Identifiers.default.MinecraftVersions.length <= 1 ? `§ev${network_Identifiers.default.MinecraftVersions.at(0)}§r` : `§ev${network_Identifiers.default.MinecraftVersions.at(0)}§r-§ev${network_Identifiers.default.MinecraftVersions.at(-1)}§r`;
1539
- logger?.info(
1540
- `Starting JSPrismarine server version §ev${version}§r for Minecraft: Bedrock Edition ${advertisedVersion} (protocol version §e${network_Identifiers.default.Protocol}§r)`,
1541
- "Server"
1542
- );
1543
- this.version = version;
1544
- this.logger = logger;
1545
- this.config = config;
1546
- this.console = new Console.default(this);
1547
- this.packetRegistry = new PacketRegistry(this);
1548
- this.itemManager = new item_ItemManager.default(this);
1549
- this.blockManager = new block_BlockManager.default(this);
1550
- this.worldManager = new world_WorldManager.default(this);
1551
- this.commandManager = new command_CommandManager.default(this);
1552
- this.pluginManager = new plugin_PluginManager.default(this);
1553
- this.queryManager = new query_QueryManager.default(this);
1554
- this.chatManager = new chat_ChatManager.default(this);
1555
- this.permissionManager = new permission_PermissionManager.default(this);
1556
- this.banManager = new ban_BanManager.default(this);
1557
- Server.instance = this;
1558
- }
1559
- async onEnable() {
1560
- this.config.onEnable();
1561
- await this.permissionManager.onEnable();
1562
- await this.pluginManager.onEnable();
1563
- await this.banManager.onEnable();
1564
- await this.itemManager.onEnable();
1565
- await this.blockManager.onEnable();
1566
- await this.commandManager.onEnable();
1567
- }
1568
- async onDisable() {
1569
- await this.commandManager.onDisable();
1570
- await this.blockManager.onDisable();
1571
- await this.itemManager.onDisable();
1572
- await this.banManager.onDisable();
1573
- await this.pluginManager.onDisable();
1574
- await this.permissionManager.onDisable();
1575
- await this.packetRegistry.onDisable();
1576
- this.config.onDisable();
1577
- }
1578
- async reload() {
1579
- await this.onDisable();
1580
- await this.onEnable();
1581
- }
1582
- async bootstrap(serverIp = "0.0.0.0", port = 19132) {
1583
- await this.onEnable();
1584
- block_BlockMappings.BlockMappings.initMappings();
1585
- await this.worldManager.onEnable();
1586
- await this.packetRegistry.onEnable();
1587
- this.raknet = new raknet.RakNetListener(this.getConfig().getMaxPlayers(), false);
1588
- this.raknet.start(serverIp, port);
1589
- this.raknet.on("openConnection", async (session) => {
1590
- const event = new events_raknet_RaknetConnectEvent.default(session);
1591
- await this.eventManager.emit("raknetConnect", event);
1592
- if (event.isCancelled()) {
1593
- session.disconnect();
1594
- return;
1595
- }
1596
- const token = session.getAddress().toToken();
1597
- if (this.sessionManager.has(token)) {
1598
- this.logger.error(
1599
- `Another client with token (${token}) is already connected!`,
1600
- "Server/listen/openConnection"
1601
- );
1602
- session.disconnect("Already connected from another location");
1603
- return;
1604
- }
1605
- const timer = new utils_Timer.default();
1606
- this.logger.debug(`${token} is attempting to connect`, "Server/listen/openConnection");
1607
- this.sessionManager.add(token, new ClientConnection(session, this.logger));
1608
- this.logger.verbose(`New connection handling took ${timer.stop()} ms`, "Server/listen/openConnection");
1609
- });
1610
- this.raknet.on("closeConnection", async (inetAddr, reason) => {
1611
- const event = new events_raknet_RaknetDisconnectEvent.default(inetAddr, reason);
1612
- await this.eventManager.emit("raknetDisconnect", event);
1613
- const time = Date.now();
1614
- const token = inetAddr.toToken();
1615
- try {
1616
- const player = this.sessionManager.getPlayer(token);
1617
- await player.getNetworkSession().removeFromPlayerList();
1618
- for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1619
- await player.getNetworkSession().sendDespawn(onlinePlayer);
1620
- }
1621
- if (player.getName()) {
1622
- const event2 = new events_chat_ChatEvent.default(
1623
- new chat_Chat.default(
1624
- this.console,
1625
- `§e%multiplayer.player.left`,
1626
- [player.getName()],
1627
- true,
1628
- "*.everyone",
1629
- chat_Chat.ChatType.TRANSLATION
1630
- )
1631
- );
1632
- await this.eventManager.emit("chat", event2);
1633
- }
1634
- await player.onDisable();
1635
- await player.getWorld().removeEntity(player);
1636
- this.sessionManager.remove(token);
1637
- } catch (error) {
1638
- this.logger.debug(
1639
- `Cannot remove connection from non-existing player (${token})`,
1640
- "Server/listen/raknetDisconnect"
1641
- );
1642
- this.logger.error(error, "Server/listen/raknetDisconnect");
1643
- }
1644
- this.logger.debug(`${token} disconnected due to ${reason}`, "Server/listen/raknetDisconnect");
1645
- this.logger.debug(
1646
- `Player destruction took about ${Date.now() - time} ms`,
1647
- "Server/listen/raknetDisconnect"
1648
- );
1649
- });
1650
- this.raknet.on("encapsulated", async (packet, inetAddr) => {
1651
- const event = new events_raknet_RaknetEncapsulatedPacketEvent.default(inetAddr, packet);
1652
- await this.eventManager.emit("raknetEncapsulatedPacket", event);
1653
- let connection;
1654
- if ((connection = this.sessionManager.get(inetAddr.toToken()) ?? null) === null) {
1655
- this.logger.error(`Got a packet from a closed connection (${inetAddr.toToken()})`);
1656
- return;
1657
- }
1658
- try {
1659
- const batched = new network_packet_BatchPacket.default(packet.content);
1660
- batched.compressed = connection.hasCompression;
1661
- for (const buf of await batched.asyncDecode()) {
1662
- const pid = buf[0];
1663
- if (!this.packetRegistry.getPackets().has(pid)) {
1664
- this.logger.warn(
1665
- `Packet 0x${pid.toString(16)} isn't implemented`,
1666
- "Server/listen/raknetEncapsulatedPacket"
1667
- );
1668
- continue;
1669
- }
1670
- const packet2 = new (this.packetRegistry.getPackets().get(pid))(buf);
1671
- try {
1672
- packet2.decode();
1673
- } catch (error) {
1674
- this.logger.error(error);
1675
- this.logger.error(
1676
- `Error while decoding packet: ${packet2.constructor.name}: ${error}`,
1677
- "Server/listen/raknetEncapsulatedPacket"
1678
- );
1679
- continue;
1680
- }
1681
- try {
1682
- const handler = this.packetRegistry.getHandler(pid);
1683
- this.logger.silly(
1684
- `Received §b${packet2.constructor.name}§r packet`,
1685
- "Server/listen/raknetEncapsulatedPacket"
1686
- );
1687
- await handler.handle(packet2, this, connection.getPlayerSession() ?? connection);
1688
- } catch (error) {
1689
- this.logger.error(
1690
- `Handler error ${packet2.constructor.name}-handler: (${error})`,
1691
- "Server/listen/raknetEncapsulatedPacket"
1692
- );
1693
- this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1694
- }
1695
- }
1696
- } catch (error) {
1697
- this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1698
- }
1699
- });
1700
- this.raknet.on("raw", async (buffer, inetAddr) => {
1701
- try {
1702
- await this.queryManager.onRaw(buffer, inetAddr);
1703
- } catch (error) {
1704
- this.logger.error(error, "Server/listen/raw");
1705
- this.logger.verbose(`QueryManager failed with error: ${error}`, "Server/listen/raw");
1706
- }
1707
- });
1708
- let tickCount = 0;
1709
- const tick = () => setTimeout(() => {
1710
- const event = new events_other_TickEvent.default(tickCount);
1711
- void this.eventManager.emit("tick", event);
1712
- for (const world of this.worldManager.getWorlds()) {
1713
- void world.update(event.getTick());
1714
- }
1715
- ++tickCount;
1716
- tick();
1717
- }, Server.MINECRAFT_TICK_TIME_MS);
1718
- this.tickerTimer = tick();
1719
- this.tickerTimer.unref();
1720
- this.logger.info(`JSPrismarine is now listening on port §b${port}`, "Server/listen");
1721
- }
1722
- /**
1723
- * Kills the server asynchronously.
1724
- */
1725
- async shutdown(options) {
1726
- if (this.stopping)
1727
- return;
1728
- this.stopping = true;
1729
- this.logger.info("Stopping server", "Server/kill");
1730
- await this.console.onDisable();
1731
- clearInterval(this.tickerTimer);
1732
- try {
1733
- for (const player of this.sessionManager.getAllPlayers()) {
1734
- await player.kick("Server closed.");
1735
- }
1736
- if (!options?.withoutSaving)
1737
- await this.worldManager.save();
1738
- await this.worldManager.onDisable();
1739
- await this.onDisable();
1740
- this.raknet.kill();
1741
- process.exit(options?.crash ? 1 : 0);
1742
- } catch (error) {
1743
- this.logger.error(error, "Server/kill");
1744
- process.exit(1);
1745
- }
1746
- }
1747
- async broadcastPacket(dataPacket) {
1748
- for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1749
- await onlinePlayer.getNetworkSession().getConnection().sendDataPacket(dataPacket);
1750
- }
1751
- }
1752
- getVersion() {
1753
- return this.version;
1754
- }
1755
- getIdentifiers() {
1756
- return network_Identifiers.default;
1757
- }
1758
- /**
1759
- * Returns the query manager
1760
- */
1761
- getQueryManager() {
1762
- return this.queryManager;
1763
- }
1764
- /**
1765
- * Returns the command manager
1766
- */
1767
- getCommandManager() {
1768
- return this.commandManager;
1769
- }
1770
- /**
1771
- * Returns the player manager
1772
- */
1773
- getSessionManager() {
1774
- return this.sessionManager;
1775
- }
1776
- /**
1777
- * Returns the world manager
1778
- */
1779
- getWorldManager() {
1780
- return this.worldManager;
1781
- }
1782
- /**
1783
- * Returns the item manager
1784
- */
1785
- getItemManager() {
1786
- return this.itemManager;
1787
- }
1788
- /**
1789
- * Returns the block manager
1790
- */
1791
- getBlockManager() {
1792
- return this.blockManager;
1793
- }
1794
- /**
1795
- * Returns the logger
1796
- */
1797
- getLogger() {
1798
- return this.logger;
1799
- }
1800
- /**
1801
- * Returns the packet registry
1802
- */
1803
- getPacketRegistry() {
1804
- return this.packetRegistry;
1805
- }
1806
- /**
1807
- * Returns the raknet instance
1808
- */
1809
- getRaknet() {
1810
- return this.raknet;
1811
- }
1812
- /**
1813
- * Returns the plugin manager
1814
- */
1815
- getPluginManager() {
1816
- return this.pluginManager;
1817
- }
1818
- /**
1819
- * Returns the event manager
1820
- */
1821
- getEventManager() {
1822
- return this.eventManager;
1823
- }
1824
- /**
1825
- * Returns the chat manager
1826
- */
1827
- getChatManager() {
1828
- return this.chatManager;
1829
- }
1830
- /**
1831
- * Returns the config
1832
- */
1833
- getConfig() {
1834
- return this.config;
1835
- }
1836
- /**
1837
- * Returns the console instance
1838
- */
1839
- getConsole() {
1840
- return this.console;
1841
- }
1842
- /**
1843
- * Returns the permission manager
1844
- */
1845
- getPermissionManager() {
1846
- return this.permissionManager;
1847
- }
1848
- /**
1849
- * Returns the ban manager
1850
- */
1851
- getBanManager() {
1852
- return this.banManager;
1853
- }
1854
- /**
1855
- * Returns this Prismarine instance
1856
- */
1857
- getServer() {
1858
- return this;
1859
- }
1860
- /**
1861
- * Returns the current TPS
1862
- */
1863
- getTPS() {
1864
- return this.tps;
1865
- }
1866
- }
1867
-
1868
- exports.BooleanArgumentCommand = BooleanArgumentCommand;
1869
- exports.ClientConnection = ClientConnection;
1870
- exports.CommandArgument = CommandArgument;
1871
- exports.CommandArgumentCommand = CommandArgumentCommand;
1872
- exports.CommandArgumentEntity = CommandArgumentEntity;
1873
- exports.CommandArgumentGamemode = CommandArgumentGamemode;
1874
- exports.CommandArgumentMob = CommandArgumentMob;
1875
- exports.CommandArgumentPosition = CommandArgumentPosition;
1876
- exports.Handlers = Handlers;
1877
- exports.LoginHandler = LoginHandler;
1878
- exports.PacketRegistry = PacketRegistry;
1879
- exports.Player = Player;
1880
- exports.PlayerArgumentCommand = PlayerArgumentCommand;
1881
- exports.PlayerSession = PlayerSession;
1882
- exports.Server = Server;
1883
- exports.VANILLA_DEFAULT_SPAWN_RADIUS = VANILLA_DEFAULT_SPAWN_RADIUS;
1884
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVyLUFmbVBzcTc0LmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQvQ29tbWFuZEFyZ3VtZW50cy50cyIsIi4uL3NyYy9uZXR3b3JrL2hhbmRsZXIvTG9naW5IYW5kbGVyLnRzIiwiLi4vc3JjL25ldHdvcmsvUGxheWVyU2Vzc2lvbi50cyIsIi4uL3NyYy9QbGF5ZXIudHMiLCIuLi9zcmMvbmV0d29yay9DbGllbnRDb25uZWN0aW9uLnRzIiwiLi4vc3JjL25ldHdvcmsvUGFja2V0UmVnaXN0cnkudHMiLCIuLi9zcmMvU2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEVudGl0aWVzIGZyb20gJy4uL2VudGl0eS9FbnRpdGllcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZENvbnRleHQsIFN0cmluZ1JlYWRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYnJpZ2FkaWVyJztcbmltcG9ydCB7IFN1Z2dlc3Rpb25zIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IENvbW1hbmRQYXJhbWV0ZXIsIHsgQ29tbWFuZFBhcmFtZXRlckZsYWdzLCBDb21tYW5kUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kUGFyYW1ldGVyJztcblxuaW1wb3J0IENvbW1hbmRFbnVtIGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kRW51bSc7XG5pbXBvcnQgR2FtZW1vZGUgZnJvbSAnLi4vd29ybGQvR2FtZW1vZGUnO1xuaW1wb3J0IFBhcnNlVGFyZ2V0U2VsZWN0b3IgZnJvbSAnLi4vdXRpbHMvUGFyc2VUYXJnZXRTZWxlY3Rvcic7XG5pbXBvcnQgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24gZnJvbSAnLi4vdXRpbHMvUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24nO1xuaW1wb3J0IHR5cGUgUGxheWVyIGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tICcuLi8nO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50R2FtZW1vZGUgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnZ2FtZU1vZGUnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgY29uc3QgZ20gPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIEdhbWVtb2RlLmdldEdhbWVtb2RlSWQoZ20pO1xuICAgICAgICByZXR1cm4gZ207XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBsaXN0U3VnZ2VzdGlvbnMoX2NvbnRleHQ6IGFueSwgX2J1aWxkZXI6IGFueSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHJldHVybiBTdWdnZXN0aW9ucy5lbXB0eSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0RXhhbXBsZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3N1cnZpdmFsJywgJ2NyZWF0aXZlJywgJ2FkdmVudHVyZScsICdzcGVjdGF0b3InXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgZ2FtZU1vZGVFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGdhbWVNb2RlRW51bS5lbnVtTmFtZSA9ICdHYW1lTW9kZSc7XG5cbiAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgZHluYW1pY1xuICAgICAgICBnYW1lTW9kZUVudW0uZW51bVZhbHVlcyA9IFsnc3Vydml2YWwnLCAnY3JlYXRpdmUnLCAnYWR2ZW50dXJlJywgJ3NwZWN0YXRvciddO1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBlbnVtOiBnYW1lTW9kZUVudW0sXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRNb2IgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnZW50aXR5VHlwZSc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlYWRlci5jYW5SZWFkKCkpIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBwb3MgPSByZWFkZXIuZ2V0Q3Vyc29yKCk7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChjaGFyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIuc2V0Q3Vyc29yKHBvcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0ciArPSBjaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGxpc3RTdWdnZXN0aW9ucyhfY29udGV4dDogYW55LCBfYnVpbGRlcjogYW55KSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgcmV0dXJuIFN1Z2dlc3Rpb25zLmVtcHR5KCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRFeGFtcGxlcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBlbnRpdHlUeXBlRW51bSA9IG5ldyBDb21tYW5kRW51bSgpO1xuICAgICAgICBlbnRpdHlUeXBlRW51bS5lbnVtTmFtZSA9ICdFbnRpdHlUeXBlJztcbiAgICAgICAgZW50aXR5VHlwZUVudW0uZW51bVZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKEVudGl0aWVzKS5tYXAoKFssIGVudGl0eV0pID0+IGVudGl0eS5NT0JfSUQpO1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBlbnVtOiBlbnRpdHlUeXBlRW51bSxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudEVudGl0eSBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICd0YXJnZXQnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBsZXQgcGxheWVyID0gJyc7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlYWRlci5jYW5SZWFkKCkpIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBwb3MgPSByZWFkZXIuZ2V0Q3Vyc29yKCk7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChjaGFyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIuc2V0Q3Vyc29yKHBvcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBsYXllciArPSBjaGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYXllci5zdGFydHNXaXRoKCdAJykpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVRhcmdldFNlbGVjdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdGllczogY29udGV4dC5nZXRTb3VyY2UoKS5nZXRXb3JsZCgpLmdldEVudGl0aWVzKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXJyb3IgYXMgYW55KS5tZXNzYWdlLmluY2x1ZGVzKCdubyByZXN1bHRzJykpIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2NvbnRleHQuZ2V0U291cmNlKCkuZ2V0U2VydmVyKCkuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJCeUV4YWN0TmFtZShwbGF5ZXIpXTsgLy8gVE9ETzogYnkgbmFtZSBub3QgZXhhY3RcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuVGFyZ2V0LFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kQXJndW1lbnRQb3NpdGlvbiBleHRlbmRzIFZlY3RvcjMgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAncG9zaXRpb24nO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBnZXRQb3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9zID0gJyc7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLmNhblJlYWQoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3IgPSByZWFkZXIuZ2V0Q3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhciA9IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2V0Q3Vyc29yKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBvcyArPSBjaGFyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNldFgoXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJlYWRlci5za2lwKCk7XG4gICAgICAgIHRoaXMuc2V0WShcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd5J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmVhZGVyLnNraXAoKTtcbiAgICAgICAgdGhpcy5zZXRaKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3onXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnY29tbWFuZCc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBjb21tYW5kID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcblxuICAgICAgICByZXR1cm4gY29tbWFuZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5Bcmd1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAnYm9vbGVhbic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBib29sZWFuID0gcmVhZGVyLnJlYWRTdHJpbmcoKTtcblxuICAgICAgICBpZiAoYm9vbGVhbiA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW5FbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGJvb2xlYW5FbnVtLmVudW1OYW1lID0gJ0Jvb2xlYW4nO1xuICAgICAgICBib29sZWFuRW51bS5lbnVtVmFsdWVzID0gWyd0cnVlJywgJ2ZhbHNlJ107XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IGJvb2xlYW5FbnVtLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyQXJndW1lbnRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3BsYXllcic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICBjb25zdCBwbGF5ZXJFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIHBsYXllckVudW0uZW51bU5hbWUgPSAnUGxheWVyJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBsYXllckVudW0uZW51bVZhbHVlcyA9IFNlcnZlci5pbnN0YW5jZVxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoKHBsYXllcikgPT4gcGxheWVyLmdldE5hbWUoKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcGxheWVyRW51bS5lbnVtVmFsdWVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBlbnVtOiBwbGF5ZXJFbnVtLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgQ2xpZW50Q29ubmVjdGlvbiBmcm9tICcuLi9DbGllbnRDb25uZWN0aW9uJztcbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuLi9JZGVudGlmaWVycyc7XG5pbXBvcnQgdHlwZSBMb2dpblBhY2tldCBmcm9tICcuLi9wYWNrZXQvTG9naW5QYWNrZXQnO1xuaW1wb3J0IHsgUGxheVN0YXR1c1BhY2tldCB9IGZyb20gJy4uL1BhY2tldHMnO1xuaW1wb3J0IFBsYXlTdGF0dXNUeXBlIGZyb20gJy4uL3R5cGUvUGxheVN0YXR1c1R5cGUnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB0eXBlIFByZUxvZ2luUGFja2V0SGFuZGxlciBmcm9tICcuL1ByZUxvZ2luUGFja2V0SGFuZGxlcic7XG5pbXBvcnQgUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQgZnJvbSAnLi4vcGFja2V0L1Jlc291cmNlUGFja3NJbmZvUGFja2V0JztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi8uLi9TZXJ2ZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dpbkhhbmRsZXIgaW1wbGVtZW50cyBQcmVMb2dpblBhY2tldEhhbmRsZXI8TG9naW5QYWNrZXQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIE5ldElEID0gSWRlbnRpZmllcnMuTG9naW5QYWNrZXQ7XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHBhY2tldDogTG9naW5QYWNrZXQsIHNlcnZlcjogU2VydmVyLCBjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHBsYXllciBjb3VudCA+PSBtYXggcGxheWVyc1xuXG4gICAgICAgIGNvbnN0IHBsYXlTdGF0dXMgPSBuZXcgUGxheVN0YXR1c1BhY2tldCgpO1xuXG4gICAgICAgIC8vIEtpY2sgY2xpZW50IGlmIGhhcyBuZXdlciAvIG9sZGVyIGNsaWVudCB2ZXJzaW9uXG4gICAgICAgIGlmIChwYWNrZXQucHJvdG9jb2wgIT09IElkZW50aWZpZXJzLlByb3RvY29sKSB7XG4gICAgICAgICAgICBwbGF5U3RhdHVzLnN0YXR1cyA9XG4gICAgICAgICAgICAgICAgcGFja2V0LnByb3RvY29sIDwgSWRlbnRpZmllcnMuUHJvdG9jb2xcbiAgICAgICAgICAgICAgICAgICAgPyBQbGF5U3RhdHVzVHlwZS5Mb2dpbkZhaWxlZENsaWVudFxuICAgICAgICAgICAgICAgICAgICA6IFBsYXlTdGF0dXNUeXBlLkxvZ2luRmFpbGVkU2VydmVyO1xuICAgICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwbGF5U3RhdHVzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtpY2sgdGhlIHBsYXllciBpZiB0aGVpciB1c2VybmFtZSBpcyBpbnZhbGlkXG4gICAgICAgIGlmICghcGFja2V0LmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoJ0ludmFsaWQgdXNlcm5hbWUhJywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHRyYXNoXG4gICAgICAgIGNvbnN0IHdvcmxkID0gc2VydmVyLmdldFdvcmxkTWFuYWdlcigpLmdldERlZmF1bHRXb3JsZCgpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBuZXcgUGxheWVyKGNvbm5lY3Rpb24sIHdvcmxkLCBzZXJ2ZXIpO1xuICAgICAgICBwbGF5ZXIudXNlcm5hbWUubmFtZSA9IHBhY2tldC5kaXNwbGF5TmFtZTtcbiAgICAgICAgcGxheWVyLmxvY2FsZSA9IHBhY2tldC5sYW5ndWFnZUNvZGU7XG4gICAgICAgIHBsYXllci5yYW5kb21JZCA9IHBhY2tldC5jbGllbnRSYW5kb21JZDtcbiAgICAgICAgcGxheWVyLnV1aWQgPSBwYWNrZXQuaWRlbnRpdHk7XG4gICAgICAgIHBsYXllci54dWlkID0gcGFja2V0LlhVSUQ7XG4gICAgICAgIHBsYXllci5za2luID0gcGFja2V0LnNraW47XG4gICAgICAgIHBsYXllci5kZXZpY2UgPSBwYWNrZXQuZGV2aWNlO1xuXG4gICAgICAgIC8vIFBsYXllciB3aXRoIHNhbWUgbmFtZSBpcyBhbHJlYWR5IG9ubGluZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb2xkUGxheWVyID0gc2VydmVyLmdldFNlc3Npb25NYW5hZ2VyKCkuZ2V0UGxheWVyQnlFeGFjdE5hbWUocGFja2V0LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IG9sZFBsYXllci5raWNrKCdMb2dnZWQgaW4gZnJvbSBhbm90aGVyIGxvY2F0aW9uJyk7XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICBpZiAoIXBsYXllci54dWlkICYmIHNlcnZlci5nZXRDb25maWcoKS5nZXRPbmxpbmVNb2RlKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHBsYXllci5raWNrKCdTZXJ2ZXIgaXMgaW4gb25saW5lLW1vZGUhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBwbGF5ZXIub25FbmFibGUoKTtcblxuICAgICAgICAvLyBUT0RPOiBlbmNyeXB0aW9uIGhhbmRzaGFrZVxuXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHNlcnZlci5nZXRCYW5NYW5hZ2VyKCkuaXNCYW5uZWQocGxheWVyKTtcbiAgICAgICAgaWYgKHJlYXNvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHBsYXllci5raWNrKGBZb3UgaGF2ZSBiZWVuIGJhbm5lZCR7cmVhc29uID8gYCBmb3IgcmVhc29uOiAke3JlYXNvbn1gIDogJyd9IWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5ZXIgY29ubmVjdGlvbiB0byBiZSByZWNvZ25pemVkIGFzIGEgY29ubmVjdGVkIHBsYXllclxuICAgICAgICBjb25zdCBzZXNzaW9uID0gY29ubmVjdGlvbi5pbml0UGxheWVyQ29ubmVjdGlvbihzZXJ2ZXIsIHBsYXllcik7XG4gICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuTG9naW5TdWNjZXNzKTtcblxuICAgICAgICBhd2FpdCB3b3JsZC5hZGRFbnRpdHkocGxheWVyKTtcblxuICAgICAgICAvLyBGaW5hbGl6ZSBjb25uZWN0aW9uIGhhbmRzaGFrZVxuICAgICAgICBjb25zdCByZXNvdXJjZVBhY2tzSW5mbyA9IG5ldyBSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCgpO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5yZXNvdXJjZVBhY2tSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5mb3JjZVNlcnZlclBhY2tzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5oYXNTY3JpcHRzID0gZmFsc2U7XG4gICAgICAgIHJlc291cmNlUGFja3NJbmZvLmhhc0FkZG9uUGFja3MgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChyZXNvdXJjZVBhY2tzSW5mbywgdHJ1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZEFyZ3VtZW50RW50aXR5LCBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSB9IGZyb20gJy4uL2NvbW1hbmQvQ29tbWFuZEFyZ3VtZW50cyc7XG5pbXBvcnQgQ29tbWFuZFBhcmFtZXRlciwgeyBDb21tYW5kUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4vdHlwZS9Db21tYW5kUGFyYW1ldGVyJztcbmltcG9ydCB0eXBlIHsgQ2h1bmtDb29yZCB9IGZyb20gJy4vcGFja2V0L05ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCc7XG5pbXBvcnQgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0IGZyb20gJy4vcGFja2V0L05ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCc7XG5pbXBvcnQgUGxheWVyTGlzdFBhY2tldCwgeyBQbGF5ZXJMaXN0QWN0aW9uLCBQbGF5ZXJMaXN0RW50cnkgfSBmcm9tICcuL3BhY2tldC9QbGF5ZXJMaXN0UGFja2V0JztcbmltcG9ydCBVcGRhdGVBYmlsaXRpZXNQYWNrZXQsIHtcbiAgICBBYmlsaXR5TGF5ZXIsXG4gICAgQWJpbGl0eUxheWVyRmxhZyxcbiAgICBBYmlsaXR5TGF5ZXJUeXBlXG59IGZyb20gJy4vcGFja2V0L1VwZGF0ZUFiaWxpdGllc1BhY2tldCc7XG5cbmltcG9ydCBBZGRQbGF5ZXJQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQWRkUGxheWVyUGFja2V0JztcbmltcG9ydCB0eXBlIHsgQXR0cmlidXRlIH0gZnJvbSAnLi4vZW50aXR5L0F0dHJpYnV0ZSc7XG5pbXBvcnQgQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQnO1xuaW1wb3J0IHsgQmF0Y2hQYWNrZXQgfSBmcm9tICcuL1BhY2tldHMnO1xuaW1wb3J0IEJsb2NrUG9zaXRpb24gZnJvbSAnLi4vd29ybGQvQmxvY2tQb3NpdGlvbic7XG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi4vd29ybGQvY2h1bmsvQ2h1bmsnO1xuaW1wb3J0IENodW5rUmFkaXVzVXBkYXRlZFBhY2tldCBmcm9tICcuL3BhY2tldC9DaHVua1JhZGl1c1VwZGF0ZWRQYWNrZXQnO1xuaW1wb3J0IHR5cGUgQ2xpZW50Q29ubmVjdGlvbiBmcm9tICcuL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IENvbW1hbmREYXRhIGZyb20gJy4vdHlwZS9Db21tYW5kRGF0YSc7XG5pbXBvcnQgQ29tbWFuZEVudW0gZnJvbSAnLi90eXBlL0NvbW1hbmRFbnVtJztcbmltcG9ydCBDb29yZGluYXRlVXRpbHMgZnJvbSAnLi4vd29ybGQvQ29vcmRpbmF0ZVV0aWxzJztcbmltcG9ydCBDcmVhdGl2ZUNvbnRlbnRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQ3JlYXRpdmVDb250ZW50UGFja2V0JztcbmltcG9ydCBEaXNjb25uZWN0UGFja2V0IGZyb20gJy4vcGFja2V0L0Rpc2Nvbm5lY3RQYWNrZXQnO1xuaW1wb3J0IEdhbWVtb2RlIGZyb20gJy4uL3dvcmxkL0dhbWVtb2RlJztcbmltcG9ydCBIZWFwIGZyb20gJ2hlYXAnO1xuaW1wb3J0IHR5cGUgSUZvcm0gZnJvbSAnLi4vZm9ybS9JRm9ybSc7XG5pbXBvcnQgSW52ZW50b3J5Q29udGVudFBhY2tldCBmcm9tICcuL3BhY2tldC9JbnZlbnRvcnlDb250ZW50UGFja2V0JztcbmltcG9ydCBJdGVtIGZyb20gJy4uL2l0ZW0vSXRlbSc7XG5pbXBvcnQgTGV2ZWxDaHVua1BhY2tldCBmcm9tICcuL3BhY2tldC9MZXZlbENodW5rUGFja2V0JztcbmltcG9ydCBNb2JFcXVpcG1lbnRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTW9iRXF1aXBtZW50UGFja2V0JztcbmltcG9ydCBNb2RhbEZvcm1SZXF1ZXN0UGFja2V0IGZyb20gJy4vcGFja2V0L01vZGFsRm9ybVJlcXVlc3RQYWNrZXQnO1xuaW1wb3J0IE1vdmVQbGF5ZXJQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTW92ZVBsYXllclBhY2tldCc7XG5pbXBvcnQgTW92ZW1lbnRUeXBlIGZyb20gJy4vdHlwZS9Nb3ZlbWVudFR5cGUnO1xuaW1wb3J0IFBlcm1pc3Npb25UeXBlIGZyb20gJy4vdHlwZS9QZXJtaXNzaW9uVHlwZSc7XG5pbXBvcnQgUGxheVN0YXR1c1BhY2tldCBmcm9tICcuL3BhY2tldC9QbGF5U3RhdHVzUGFja2V0JztcbmltcG9ydCB0eXBlIFBsYXllciBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IFBsYXllclBlcm1pc3Npb25UeXBlIGZyb20gJy4vdHlwZS9QbGF5ZXJQZXJtaXNzaW9uVHlwZSc7XG5pbXBvcnQgUmVtb3ZlQWN0b3JQYWNrZXQgZnJvbSAnLi9wYWNrZXQvUmVtb3ZlQWN0b3JQYWNrZXQnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgU2V0QWN0b3JEYXRhUGFja2V0IGZyb20gJy4vcGFja2V0L1NldEFjdG9yRGF0YVBhY2tldCc7XG5pbXBvcnQgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQgZnJvbSAnLi9wYWNrZXQvU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQnO1xuaW1wb3J0IFNldFRpbWVQYWNrZXQgZnJvbSAnLi9wYWNrZXQvU2V0VGltZVBhY2tldCc7XG5pbXBvcnQgVGV4dFBhY2tldCBmcm9tICcuL3BhY2tldC9UZXh0UGFja2V0JztcbmltcG9ydCBUZXh0VHlwZSBmcm9tICcuL3R5cGUvVGV4dFR5cGUnO1xuaW1wb3J0IFRvYXN0UmVxdWVzdFBhY2tldCBmcm9tICcuL3BhY2tldC9Ub2FzdFJlcXVlc3RQYWNrZXQnO1xuaW1wb3J0IFVVSUQgZnJvbSAnLi4vdXRpbHMvVVVJRCc7XG5pbXBvcnQgVXBkYXRlQWR2ZW50dXJlU2V0dGluZ3NQYWNrZXQgZnJvbSAnLi9wYWNrZXQvVXBkYXRlQWR2ZW50dXJlU2V0dGluZ3NQYWNrZXQnO1xuaW1wb3J0IFVwZGF0ZUF0dHJpYnV0ZXNQYWNrZXQgZnJvbSAnLi9wYWNrZXQvVXBkYXRlQXR0cmlidXRlc1BhY2tldCc7XG5pbXBvcnQgeyBXaW5kb3dJZHMgfSBmcm9tICcuLi9pbnZlbnRvcnkvV2luZG93TWFuYWdlcic7XG5pbXBvcnQgeyBjcmVhdGl2ZWl0ZW1zIH0gZnJvbSAnQGpzcHJpc21hcmluZS9iZWRyb2NrLWRhdGEnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbGF5ZXJTZXNzaW9uIHtcbiAgICBwcml2YXRlIGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb247XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2ZXI6IFNlcnZlcjtcbiAgICBwcml2YXRlIHBsYXllcjogUGxheWVyO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaHVua1NlbmRRdWV1ZTogQ2h1bmtbXSA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVkQ2h1bmtzOiBTZXQ8YmlnaW50PiA9IG5ldyBTZXQoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdDaHVua3M6IFNldDxiaWdpbnQ+ID0gbmV3IFNldCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyLCBjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uLCBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShfdGljazogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNodW5rU2VuZFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rc1RvU2VuZCA9IHRoaXMuY2h1bmtTZW5kUXVldWUuc3BsaWNlKDAsIE1hdGgubWluKHRoaXMuY2h1bmtTZW5kUXVldWUubGVuZ3RoLCA1MCkpO1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgQmF0Y2hQYWNrZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzVG9TZW5kKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuICAgICAgICAgICAgICAgIHBrLmNodW5rWCA9IGNodW5rLmdldFgoKTtcbiAgICAgICAgICAgICAgICBway5jaHVua1ogPSBjaHVuay5nZXRaKCk7XG4gICAgICAgICAgICAgICAgcGsuY2xpZW50U3ViQ2h1bmtSZXF1ZXN0c0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBway5zdWJDaHVua0NvdW50ID0gY2h1bmsuZ2V0VG9wRW1wdHkoKSArIDQ7XG4gICAgICAgICAgICAgICAgcGsuZGF0YSA9IGNodW5rLm5ldHdvcmtTZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgICBiYXRjaC5hZGRQYWNrZXQocGspO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzaCA9IENodW5rLnBhY2tYWihjaHVuay5nZXRYKCksIGNodW5rLmdldFooKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuYWRkKGhhc2gpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZEJhdGNoKGJhdGNoLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsYXllci52aWV3RGlzdGFuY2UgJiYgKGF3YWl0IHRoaXMubmVlZE5ld0NodW5rcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpZnkgYSBjbGllbnQgYWJvdXQgY2hhbmdlKHMpIHRvIHRoZSBhZHZlbnR1cmUgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxheWVyIC0gVGhlIGNsaWVudC1jb250cm9sbGVkIGVudGl0eVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kU2V0dGluZ3MocGxheWVyPzogUGxheWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBsYXllciA/PyB0aGlzLnBsYXllcjtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBVcGRhdGVBZHZlbnR1cmVTZXR0aW5nc1BhY2tldCgpO1xuICAgICAgICBway53b3JsZEltbXV0YWJsZSA9IHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuU3BlY3RhdG9yO1xuICAgICAgICBway5ub0F0dGFja2luZ1BsYXllcnMgPSB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcjtcbiAgICAgICAgcGsubm9BdHRhY2tpbmdNb2JzID0gdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3I7XG4gICAgICAgIHBrLmF1dG9KdW1wID0gdHJ1ZTsgLy8gVE9ETzogZ3JhYiB0aGlzIGluZm8gZWxzZXdoZXJlXG4gICAgICAgIHBrLnNob3dOYW1lVGFncyA9IHRydWU7IC8vIFRPRE86IHBsYXllciBtYXkgYmUgYWJsZSB0byBoaWRlIHRoZW1cblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQWJpbGl0aWVzKHBsYXllcj86IFBsYXllcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwbGF5ZXIgPz8gdGhpcy5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQWJpbGl0aWVzUGFja2V0KCk7XG4gICAgICAgIHBrLmNvbW1hbmRQZXJtaXNzaW9uID0gdGFyZ2V0LmlzT3AoKSA/IFBlcm1pc3Npb25UeXBlLk9wZXJhdG9yIDogUGVybWlzc2lvblR5cGUuTm9ybWFsO1xuICAgICAgICBway5wbGF5ZXJQZXJtaXNzaW9uID0gdGFyZ2V0LmlzT3AoKSA/IFBsYXllclBlcm1pc3Npb25UeXBlLk9wZXJhdG9yIDogUGxheWVyUGVybWlzc2lvblR5cGUuTWVtYmVyO1xuICAgICAgICBway50YXJnZXRBY3RvclVuaXF1ZUlkID0gdGFyZ2V0LmdldFJ1bnRpbWVJZCgpO1xuXG4gICAgICAgIGNvbnN0IG1haW5MYXllciA9IG5ldyBBYmlsaXR5TGF5ZXIoKTtcbiAgICAgICAgbWFpbkxheWVyLmxheWVyVHlwZSA9IEFiaWxpdHlMYXllclR5cGUuQkFTRTtcbiAgICAgICAgbWFpbkxheWVyLmxheWVyRmxhZ3MgPSBuZXcgTWFwKFtcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkZMWV9TUEVFRCwgdHJ1ZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5XQUxLX1NQRUVELCB0cnVlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk1BWV9GTFksIHRhcmdldC5nZXRBbGxvd0ZsaWdodCgpXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkZMWUlORywgdGFyZ2V0LmlzRmx5aW5nKCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuTk9fQ0xJUCwgdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuT1BFUkFUT1JfQ09NTUFORFMsIHRhcmdldC5pc09wKCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuVEVMRVBPUlQsIHRhcmdldC5pc09wKCldLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuSU5WVUxORVJBQkxFLCB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk1VVEVELCBmYWxzZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5XT1JMRF9CVUlMREVSLCBmYWxzZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5JTlNUQUJVSUxELCB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkxJR0hUTklORywgZmFsc2VdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuQlVJTEQsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk1JTkUsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkRPT1JTX0FORF9TV0lUQ0hFUywgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuT1BFTl9DT05UQUlORVJTLCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5BVFRBQ0tfUExBWUVSUywgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuQVRUQUNLX01PQlMsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXVxuICAgICAgICBdKTtcbiAgICAgICAgbWFpbkxheWVyLmZseVNwZWVkID0gMC4wNTtcbiAgICAgICAgbWFpbkxheWVyLndhbGtTcGVlZCA9IDAuMTtcblxuICAgICAgICBway5hYmlsaXR5TGF5ZXJzID0gW21haW5MYXllcl07XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbmVlZE5ld0NodW5rcyhmb3JjZVJlc2VuZCA9IGZhbHNlLCBkaXN0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRYQ2h1bmsgPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLnBsYXllci5nZXRYKCkpO1xuICAgICAgICBjb25zdCBjdXJyZW50WkNodW5rID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy5wbGF5ZXIuZ2V0WigpKTtcblxuICAgICAgICBjb25zdCB2aWV3RGlzdGFuY2UgPSB0aGlzLnBsYXllci52aWV3RGlzdGFuY2UgPz8gZGlzdDtcblxuICAgICAgICBjb25zdCBjaHVua3NUb1NlbmRIZWFwID0gbmV3IEhlYXAoKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlzdFhGaXJzdCA9IE1hdGguYWJzKGFbMF0hIC0gY3VycmVudFhDaHVuayk7XG4gICAgICAgICAgICBjb25zdCBkaXN0WFNlY29uZCA9IE1hdGguYWJzKGJbMF0hIC0gY3VycmVudFhDaHVuayk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3RaRmlyc3QgPSBNYXRoLmFicyhhWzFdISAtIGN1cnJlbnRaQ2h1bmspO1xuICAgICAgICAgICAgY29uc3QgZGlzdFpTZWNvbmQgPSBNYXRoLmFicyhiWzFdISAtIGN1cnJlbnRaQ2h1bmspO1xuXG4gICAgICAgICAgICByZXR1cm4gZGlzdFhGaXJzdCArIGRpc3RaRmlyc3QgPiBkaXN0WFNlY29uZCArIGRpc3RaU2Vjb25kID8gMSA6IC0xO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGxldCBzZW5kWENodW5rID0gLXZpZXdEaXN0YW5jZTsgc2VuZFhDaHVuayA8PSB2aWV3RGlzdGFuY2U7IHNlbmRYQ2h1bmsrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgc2VuZFpDaHVuayA9IC12aWV3RGlzdGFuY2U7IHNlbmRaQ2h1bmsgPD0gdmlld0Rpc3RhbmNlOyBzZW5kWkNodW5rKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZFhDaHVuayAqIHNlbmRYQ2h1bmsgKyBzZW5kWkNodW5rICogc2VuZFpDaHVuayA+IHZpZXdEaXN0YW5jZSAqIHZpZXdEaXN0YW5jZSkgY29udGludWU7IC8vIGVhcmx5IGV4aXQgaWYgY2h1bmsgaXMgb3V0c2lkZSBvZiB2aWV3IGRpc3RhbmNlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2h1bmsgPSBbY3VycmVudFhDaHVuayArIHNlbmRYQ2h1bmssIGN1cnJlbnRaQ2h1bmsgKyBzZW5kWkNodW5rXTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmsucGFja1haKG5ld0NodW5rWzBdISwgbmV3Q2h1bmtbMV0hKTtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JjZVJlc2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3NUb1NlbmRIZWFwLnB1c2gobmV3Q2h1bmspO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubG9hZGVkQ2h1bmtzLmhhcyhoYXNoKSAmJiAhdGhpcy5sb2FkaW5nQ2h1bmtzLmhhcyhoYXNoKSkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3NUb1NlbmRIZWFwLnB1c2gobmV3Q2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChjaHVua3NUb1NlbmRIZWFwLnNpemUoKSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3RDaHVuayA9IGNodW5rc1RvU2VuZEhlYXAucG9wKCkhO1xuICAgICAgICAgICAgY29uc3QgaGFzaCA9IENodW5rLnBhY2tYWihjbG9zZXN0Q2h1bmtbMF0hLCBjbG9zZXN0Q2h1bmtbMV0hKTtcbiAgICAgICAgICAgIGlmIChmb3JjZVJlc2VuZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWRDaHVua3MuaGFzKGhhc2gpICYmICF0aGlzLmxvYWRpbmdDaHVua3MuaGFzKGhhc2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5hZGQoaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdENodW5rKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZENodW5rID0gYXdhaXQgdGhpcy5wbGF5ZXIuZ2V0V29ybGQoKS5nZXRDaHVuayhjbG9zZXN0Q2h1bmtbMF0hLCBjbG9zZXN0Q2h1bmtbMV0hKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ2h1bmsobG9hZGVkQ2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RDaHVuayhjbG9zZXN0Q2h1bmtbMF0hLCBjbG9zZXN0Q2h1bmtbMV0hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1bmxvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaGFzaCBvZiB0aGlzLmxvYWRlZENodW5rcykge1xuICAgICAgICAgICAgY29uc3QgW3gsIHpdID0gQ2h1bmsudW5wYWNrWFooaGFzaCk7XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh4ISAtIGN1cnJlbnRYQ2h1bmspID4gdmlld0Rpc3RhbmNlIHx8IE1hdGguYWJzKHohIC0gY3VycmVudFpDaHVuaykgPiB2aWV3RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB1bmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuZGVsZXRlKGhhc2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMubG9hZGluZ0NodW5rcykge1xuICAgICAgICAgICAgY29uc3QgW3gsIHpdID0gQ2h1bmsudW5wYWNrWFooaGFzaCk7XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh4ISAtIGN1cnJlbnRYQ2h1bmspID4gdmlld0Rpc3RhbmNlIHx8IE1hdGguYWJzKHohIC0gY3VycmVudFpDaHVuaykgPiB2aWV3RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuZGVsZXRlKGhhc2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bmxvYWRlZCAmJiB0aGlzLmNodW5rU2VuZFF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKGRpc3QgPz8gdmlld0Rpc3RhbmNlLCBbXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdENodW5rKHg6IG51bWJlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gYXdhaXQgdGhpcy5wbGF5ZXIuZ2V0V29ybGQoKS5nZXRDaHVuayh4LCB6KTtcbiAgICAgICAgdGhpcy5jaHVua1NlbmRRdWV1ZS5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY3VycmVudGx5IGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3MuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzdWFsbHkgdXNlZCBmb3IgY2hhbmdpbmcgZGltZW5zaW9uLCB3b3JsZCwgZXRjLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjbGVhckNodW5rcygpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRJbnZlbnRvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQoKTtcbiAgICAgICAgcGsuaXRlbXMgPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRJdGVtcyh0cnVlKTtcbiAgICAgICAgcGsud2luZG93SWQgPSBXaW5kb3dJZHMuSU5WRU5UT1JZOyAvLyBJbnZlbnRvcnkgd2luZG93XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZEhhbmRJdGVtKHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW1JbkhhbmQoKSk7XG5cbiAgICAgICAgLyogVE9ETzogbm90IHdvcmtpbmcuLlxuICAgICAgICBwayA9IG5ldyBJbnZlbnRvcnlDb250ZW50UGFja2V0KCk7XG4gICAgICAgIHBrLml0ZW1zID0gW107IC8vIFRPRE9cbiAgICAgICAgcGsud2luZG93SWQgPSA3ODsgLy8gQXJtb3JJbnZlbnRvcnkgd2luZG93XG4gICAgICAgIHRoaXMuc2VuZERhdGFQYWNrZXQocGspO1xuXG4gICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9OaWNsYXNPbG9mc3Nvbi9NaU5FVC9ibG9iL21hc3Rlci9zcmMvTWlORVQvTWlORVQvUGxheWVyLmNzI0wxNzM2XG4gICAgICAgIC8vIFRPRE86IGRvY3VtZW50YXRlIGFib3V0XG4gICAgICAgIDB4N2MgKHVpIGNvbnRlbnQpXG4gICAgICAgIDB4NzcgKG9mZiBoYW5kKVxuICAgICAgICAqL1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQ3JlYXRpdmVDb250ZW50cyhlbXB0eSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IENyZWF0aXZlQ29udGVudFBhY2tldCgpO1xuICAgICAgICBpZiAoZW1wdHkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5wbGF5ZXIuZ2V0U2VydmVyKCkuZ2V0QmxvY2tNYW5hZ2VyKCkuZ2V0QmxvY2tzKCksXG4gICAgICAgICAgICAuLi50aGlzLnBsYXllci5nZXRTZXJ2ZXIoKS5nZXRJdGVtTWFuYWdlcigpLmdldEl0ZW1zKClcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBTb3J0IGJhc2VkIG9uIFBtbVAgQmVkcm9jay1kYXRhXG4gICAgICAgIGNyZWF0aXZlaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBway5pdGVtcy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLmVudHJpZXNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm1ldGEgPT09IChpdGVtLmRhbWFnZSA/PyAwKSAmJiBlbnRyeS5nZXRJZCgpID09PSBpdGVtLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJdGVtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVudHJ5LmdldElkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YTogZW50cnkubWV0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaXRlbSBpbiB0aGUgcGxheWVyIGhhbmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBlbnRpdHkuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRIYW5kSXRlbShpdGVtOiBJdGVtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE1vYkVxdWlwbWVudFBhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsuaXRlbSA9IGl0ZW07XG4gICAgICAgIHBrLmludmVudG9yeVNsb3QgPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRIYW5kU2xvdEluZGV4KCk7XG4gICAgICAgIHBrLmhvdGJhclNsb3QgPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRIYW5kU2xvdEluZGV4KCk7XG4gICAgICAgIHBrLndpbmRvd0lkID0gMDsgLy8gSW52ZW50b3J5IElEXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRGb3JtKGZvcm06IElGb3JtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5wbGF5ZXIuZ2V0Rm9ybU1hbmFnZXIoKS5hZGRGb3JtKGZvcm0pO1xuICAgICAgICBjb25zdCBwayA9IG5ldyBNb2RhbEZvcm1SZXF1ZXN0UGFja2V0KCk7XG4gICAgICAgIHBrLmZvcm1JZCA9IGlkO1xuICAgICAgICBway5mb3JtRGF0YSA9IGZvcm0uanNvblNlcmlhbGl6ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2xpZW50J3MgY3VycmVudCB0aWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpY2sgLSBUaGUgdGlja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kVGltZSh0aWNrOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgU2V0VGltZVBhY2tldCgpO1xuICAgICAgICBway50aW1lID0gdGljaztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNsaWVudCdzIGdhbWVtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGdhbWVtb2RlIC0gdGhlIG51bWVyaWMgZ2FtZW1vZGUgSURcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEdhbWVtb2RlKGdhbWVtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQoKTtcbiAgICAgICAgcGsuZ2FtZW1vZGUgPSBnYW1lbW9kZTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE5ldHdvcmtDaHVua1B1Ymxpc2hlcihkaXN0YW5jZTogbnVtYmVyLCBzYXZlZENodW5rczogQ2h1bmtDb29yZFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE5ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCgpO1xuICAgICAgICBway5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24uZnJvbVZlY3RvcjModGhpcy5wbGF5ZXIpO1xuICAgICAgICBway5yYWRpdXMgPSBkaXN0YW5jZSA8PCA0O1xuICAgICAgICBway5zYXZlZENodW5rcyA9IHNhdmVkQ2h1bmtzO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQXZhaWxhYmxlQ29tbWFuZHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0KCk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRDb21tYW5kTWFuYWdlcigpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZHNMaXN0KClcbiAgICAgICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZENsYXNzID0gQXJyYXkuZnJvbSh0aGlzLnNlcnZlci5nZXRDb21tYW5kTWFuYWdlcigpLmdldENvbW1hbmRzKCkudmFsdWVzKCkpLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChjbWQpID0+IGNtZC5pZC5zcGxpdCgnOicpWzFdID09PSBjb21tYW5kWzBdXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghY29tbWFuZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy53YXJuKGBDYW4ndCBmaW5kIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBjbGFzcyBmb3IgXCIke2NvbW1hbmRbMF19XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wbGF5ZXIuZ2V0U2VydmVyKCkuZ2V0UGVybWlzc2lvbk1hbmFnZXIoKS5jYW4odGhpcy5wbGF5ZXIpLmV4ZWN1dGUoY29tbWFuZENsYXNzLnBlcm1pc3Npb24pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICAgICAgICBjbWQuY29tbWFuZE5hbWUgPSBjb21tYW5kWzBdO1xuICAgICAgICAgICAgICAgIGNtZC5jb21tYW5kRGVzY3JpcHRpb24gPSBjb21tYW5kQ2xhc3MuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRDbGFzcy5hbGlhc2VzIS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtZEFsaWFzZXMgPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgICAgICAgICAgICAgY21kQWxpYXNlcy5lbnVtTmFtZSA9IGAke2NvbW1hbmRbMF19QWxpYXNlc2A7XG4gICAgICAgICAgICAgICAgICAgIGNtZEFsaWFzZXMuZW51bVZhbHVlcyA9IGNvbW1hbmRDbGFzcy5hbGlhc2VzIS5jb25jYXQoY29tbWFuZFswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNtZC5hbGlhc2VzID0gY21kQWxpYXNlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21tYW5kWzJdLmZvckVhY2goKGFyZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHBhcmFtZXRlci5nZXRQYXJhbWV0ZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHJldHVybiBBcnJheS5mcm9tKHBhcmFtZXRlcnMudmFsdWVzKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlciBpbnN0YW5jZW9mIENvbW1hbmRBcmd1bWVudEVudGl0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICd0YXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICdnYW1lbW9kZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnU3RyaW5nQXJndW1lbnRUeXBlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnSW50ZWdlckFyZ3VtZW50VHlwZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLkludFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpPy53YXJuKGBJbnZhbGlkIHBhcmFtZXRlciAke3BhcmFtZXRlci5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuU3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChhKSA9PiBhKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXQoKTtcbiAgICAgICAgICAgICAgICAgICAgY21kLm92ZXJsb2Fkc1tpbmRleF0gPSBwYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBrLmNvbW1hbmREYXRhLnB1c2goY21kKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwbGF5ZXJFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIHBsYXllckVudW0uZW51bU5hbWUgPSAnUGxheWVyJztcbiAgICAgICAgcGxheWVyRW51bS5lbnVtVmFsdWVzID0gdGhpcy5wbGF5ZXJcbiAgICAgICAgICAgIC5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgIC5tYXAoKHBsYXllcikgPT4gcGxheWVyLmdldE5hbWUoKSk7XG4gICAgICAgIHBrLnNvZnRFbnVtcyA9IFtwbGF5ZXJFbnVtXTtcbiAgICAgICAgLy8gVE9ETzogdXBkYXRlIGNvbW1hbmRzXG4gICAgICAgIC8vIGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNsaWVudCdzIG1heGltdW0gdmlldyBkaXN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXN0YW5jZSAtIFRoZSB2aWV3IGRpc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNldFZpZXdEaXN0YW5jZShkaXN0YW5jZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucGxheWVyLnZpZXdEaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICBjb25zdCBwayA9IG5ldyBDaHVua1JhZGl1c1VwZGF0ZWRQYWNrZXQoKTtcbiAgICAgICAgcGsucmFkaXVzID0gZGlzdGFuY2U7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZXNQYWNrZXQoKTtcbiAgICAgICAgcGsucnVudGltZUVudGl0eUlkID0gdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgIHBrLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzID8/IHRoaXMucGxheWVyLmdldEF0dHJpYnV0ZU1hbmFnZXIoKS5nZXRBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHBrLnRpY2sgPSBCaWdJbnQoMCk7IC8vIFRPRE9cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE1ldGFkYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBTZXRBY3RvckRhdGFQYWNrZXQoKTtcbiAgICAgICAgcGsucnVudGltZUVudGl0eUlkID0gdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgIHBrLm1ldGFkYXRhID0gdGhpcy5wbGF5ZXIuZ2V0TWV0YWRhdGFNYW5hZ2VyKCk7XG4gICAgICAgIHBrLnRpY2sgPSBCaWdJbnQoMCk7IC8vIFRPRE9cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2hhdCBtZXNzYWdlIHRvIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlZmFjdG9yIHRoaXMgY29tcGxldGVseS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0geHVpZCAtIFRoZSBzb3VyY2UgeHVpZFxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIC1cbiAgICAgKiBAcGFyYW0gbmVlZHNUcmFuc2xhdGlvbiAtIElmIHRoZSBUZXh0VHlwZSByZXF1aXJlcyB0cmFuc2xhdGlvblxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIHRleHQgdHlwZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kTWVzc2FnZShcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICB4dWlkID0gJycsXG4gICAgICAgIHBhcmFtZXRlcnM6IHN0cmluZ1tdID0gW10sXG4gICAgICAgIG5lZWRzVHJhbnNsYXRpb24gPSBmYWxzZSxcbiAgICAgICAgdHlwZSA9IFRleHRUeXBlLlJhd1xuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHRocm93IG5ldyBFcnJvcignQSBtZXNzYWdlIGlzIHJlcXVpcmVkJyk7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVGV4dFBhY2tldCgpO1xuICAgICAgICBway50eXBlID0gdHlwZTtcbiAgICAgICAgcGsuc291cmNlTmFtZSA9ICcnO1xuICAgICAgICBway5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgcGsubmVlZHNUcmFuc2xhdGlvbiA9IG5lZWRzVHJhbnNsYXRpb247XG4gICAgICAgIHBrLnh1aWQgPSB4dWlkO1xuICAgICAgICBway5wbGF0Zm9ybUNoYXRJZCA9ICcnOyAvLyBUT0RPXG4gICAgICAgIHBrLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kVG9hc3QodGl0bGU6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGl0bGUpIHRocm93IG5ldyBFcnJvcignQSB0b2FzdCB0aXRsZSBpcyByZXF1aXJlZCcpO1xuICAgICAgICBpZiAoIWJvZHkpIHRocm93IG5ldyBFcnJvcignQSB0b2FzdCBib2R5IGlzIHJlcXVpcmVkLicpO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFRvYXN0UmVxdWVzdFBhY2tldCgpO1xuICAgICAgICBway50aXRsZSA9IHRpdGxlO1xuICAgICAgICBway5ib2R5ID0gYm9keTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQ2h1bmsoY2h1bms6IENodW5rKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IExldmVsQ2h1bmtQYWNrZXQoKTtcbiAgICAgICAgcGsuY2h1bmtYID0gY2h1bmsuZ2V0WCgpO1xuICAgICAgICBway5jaHVua1ogPSBjaHVuay5nZXRaKCk7XG4gICAgICAgIHBrLmNsaWVudFN1YkNodW5rUmVxdWVzdHNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHBrLnN1YkNodW5rQ291bnQgPSBjaHVuay5nZXRUb3BFbXB0eSgpICsgNDsgLy8gYWRkIHRoZSB1c2VsZXNzIGxheWVycyBoYWNrXG4gICAgICAgIHBrLmRhdGEgPSBjaHVuay5uZXR3b3JrU2VyaWFsaXplKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwaywgdW5kZWZpbmVkLCBmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgaGFzaCA9IENodW5rLnBhY2tYWihjaHVuay5nZXRYKCksIGNodW5rLmdldFooKSk7XG4gICAgICAgIHRoaXMubG9hZGVkQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmRlbGV0ZShoYXNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3QgdGhlIG1vdmVtZW50IHRvIGEgZGVmaW5lZCBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYnJvYWRjYXN0TW92ZShwbGF5ZXI6IFBsYXllciwgbW9kZSA9IE1vdmVtZW50VHlwZS5Ob3JtYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgTW92ZVBsYXllclBhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSBwbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG5cbiAgICAgICAgcGsucG9zaXRpb25YID0gcGxheWVyLmdldFgoKTtcbiAgICAgICAgcGsucG9zaXRpb25ZID0gcGxheWVyLmdldFkoKTtcbiAgICAgICAgcGsucG9zaXRpb25aID0gcGxheWVyLmdldFooKTtcblxuICAgICAgICBway5waXRjaCA9IHBsYXllci5waXRjaDtcbiAgICAgICAgcGsueWF3ID0gcGxheWVyLnlhdztcbiAgICAgICAgcGsuaGVhZFlhdyA9IHBsYXllci5oZWFkWWF3O1xuXG4gICAgICAgIHBrLm1vZGUgPSBtb2RlO1xuXG4gICAgICAgIHBrLm9uR3JvdW5kID0gcGxheWVyLmlzT25Hcm91bmQoKTtcblxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIGlmIChtb2RlID09PSBNb3ZlbWVudFR5cGUuVGVsZXBvcnQpIHtcbiAgICAgICAgICAgIHBrLnRlbGVwb3J0Q2F1c2UgPSAwO1xuICAgICAgICAgICAgcGsudGVsZXBvcnRJdGVtSWQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcGsucmlkaW5nRW50aXR5UnVudGltZUlkID0gQmlnSW50KDApO1xuICAgICAgICBway50aWNrID0gQmlnSW50KDApOyAvLyBUT0RPXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgY2xpZW50IHRvIHRoZSBwbGF5ZXIgbGlzdCBvZiBldmVyeSBwbGF5ZXIgaW5zaWRlXG4gICAgICogdGhlIHNlcnZlciBhbmQgYWxzbyB0byB0aGUgcGxheWVyIGl0c2VsZi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYWRkVG9QbGF5ZXJMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwbGF5ZXJMaXN0ID0gbmV3IFBsYXllckxpc3RQYWNrZXQoKTtcbiAgICAgICAgcGxheWVyTGlzdC50eXBlID0gUGxheWVyTGlzdEFjdGlvbi5UWVBFX0FERDtcblxuICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBQbGF5ZXJMaXN0RW50cnkoe1xuICAgICAgICAgICAgdXVpZDogVVVJRC5mcm9tU3RyaW5nKHRoaXMucGxheWVyLnV1aWQpLFxuICAgICAgICAgICAgdW5pcXVlRW50aXR5aWQ6IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5wbGF5ZXIuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgeHVpZDogdGhpcy5wbGF5ZXIueHVpZCxcbiAgICAgICAgICAgIHBsYXRmb3JtQ2hhdElkOiAnJywgLy8gVE9ETzogcmVhZCB0aGlzIHZhbHVlIGZyb20gTG9naW5cbiAgICAgICAgICAgIGJ1aWxkUGxhdGZvcm06IHRoaXMucGxheWVyLmRldmljZSA/IHRoaXMucGxheWVyLmRldmljZS5vcyA6IC0xLFxuICAgICAgICAgICAgc2tpbjogdGhpcy5wbGF5ZXIuc2tpbiEsXG4gICAgICAgICAgICBpc1RlYWNoZXI6IGZhbHNlLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoZXJlIHRvIHJlYWQgdGVhY2hlciBhbmQgaG9zdFxuICAgICAgICAgICAgaXNIb3N0OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcGxheWVyTGlzdC5lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2VydmVyLmJyb2FkY2FzdFBhY2tldChwbGF5ZXJMaXN0KTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJMaXN0KCkuc2V0KHRoaXMucGxheWVyLnV1aWQsIGVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcGxheWVyIGZyb20gb3RoZXIgcGxheWVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUZyb21QbGF5ZXJMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMucGxheWVyLnV1aWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgICAgIHBrLnR5cGUgPSBQbGF5ZXJMaXN0QWN0aW9uLlRZUEVfUkVNT1ZFO1xuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IFBsYXllckxpc3RFbnRyeSh7XG4gICAgICAgICAgICB1dWlkOiBVVUlELmZyb21TdHJpbmcodGhpcy5wbGF5ZXIuZ2V0VVVJRCgpKVxuICAgICAgICB9KTtcbiAgICAgICAgcGsuZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgICAgICB0aGlzLnNlcnZlci5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckxpc3QoKS5kZWxldGUodGhpcy5wbGF5ZXIudXVpZCk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKHBsYXllcikgPT4gcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGUgZnVsbCBwbGF5ZXIgbGlzdCB0byB0aGUgcGxheWVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kUGxheWVyTGlzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGxheWVyTGlzdCA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgICAgIHBsYXllckxpc3QudHlwZSA9IFBsYXllckxpc3RBY3Rpb24uVFlQRV9BREQ7XG4gICAgICAgIHBsYXllckxpc3QuZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5zZXJ2ZXIuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJMaXN0KCkudmFsdWVzKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGxheWVyTGlzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3Bhd24gdGhlIHBsYXllciBmb3IgYW5vdGhlciBwbGF5ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGF5ZXIgLSB0aGUgcGxheWVyIHRvIHNlbmQgdGhlIEFkZFBsYXllclBhY2tldCB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kU3Bhd24ocGxheWVyOiBQbGF5ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFwbGF5ZXIuZ2V0VVVJRCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKT8uZXJyb3IoYFVVSUQgZm9yIHBsYXllciAke3BsYXllci5nZXROYW1lKCl9IGlzIHVuZGVmaW5lZGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQWRkUGxheWVyUGFja2V0KCk7XG4gICAgICAgIHBrLnV1aWQgPSBVVUlELmZyb21TdHJpbmcodGhpcy5wbGF5ZXIuZ2V0VVVJRCgpKTsgLy8gVE9ETzogdGVtcCBzb2x1dGlvblxuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsubmFtZSA9IHRoaXMucGxheWVyLmdldE5hbWUoKTtcblxuICAgICAgICBway5wb3NpdGlvblggPSB0aGlzLnBsYXllci5nZXRYKCk7XG4gICAgICAgIHBrLnBvc2l0aW9uWSA9IHRoaXMucGxheWVyLmdldFkoKTtcbiAgICAgICAgcGsucG9zaXRpb25aID0gdGhpcy5wbGF5ZXIuZ2V0WigpO1xuXG4gICAgICAgIC8vIFRPRE86IG1vdGlvblxuICAgICAgICBway5tb3Rpb25YID0gMDtcbiAgICAgICAgcGsubW90aW9uWSA9IDA7XG4gICAgICAgIHBrLm1vdGlvblogPSAwO1xuXG4gICAgICAgIHBrLnBpdGNoID0gdGhpcy5wbGF5ZXIucGl0Y2g7XG4gICAgICAgIHBrLnlhdyA9IHRoaXMucGxheWVyLnlhdztcbiAgICAgICAgcGsuaGVhZFlhdyA9IHRoaXMucGxheWVyLmhlYWRZYXc7XG5cbiAgICAgICAgcGsuaXRlbSA9IHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW1JbkhhbmQoKTtcblxuICAgICAgICBway5kZXZpY2VJZCA9IHRoaXMucGxheWVyLmRldmljZT8uaWQgPz8gJyc7XG4gICAgICAgIHBrLm1ldGFkYXRhID0gdGhpcy5wbGF5ZXIuZ2V0TWV0YWRhdGFNYW5hZ2VyKCk7XG4gICAgICAgIGF3YWl0IHBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgICAgIC8vIFRPRE86IGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKHBsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzcGF3biB0aGUgcGxheWVyIGVudGl0eSBmcm9tIGFub3RoZXIgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmREZXNwYXduKHBsYXllcjogUGxheWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFJlbW92ZUFjdG9yUGFja2V0KCk7XG4gICAgICAgIHBrLnVuaXF1ZUVudGl0eUlkID0gdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCk7IC8vIFdlIHVzZSBydW50aW1lIGFzIHVuaXF1ZVxuICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kUGxheVN0YXR1cyhzdGF0dXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBQbGF5U3RhdHVzUGFja2V0KCk7XG4gICAgICAgIHBrLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMga2ljayhyZWFzb24gPSAndW5rbm93biByZWFzb24nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IERpc2Nvbm5lY3RQYWNrZXQoKTtcbiAgICAgICAgcGsuc2tpcE1lc3NhZ2UgPSBmYWxzZTtcbiAgICAgICAgcGsubWVzc2FnZSA9IHJlYXNvbjtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29ubmVjdGlvbigpOiBDbGllbnRDb25uZWN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGxheWVyKCk6IFBsYXllciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDaGFuZ2VEaW1lbnNpb25QYWNrZXQsIExldmVsQ2h1bmtQYWNrZXQgfSBmcm9tICcuL25ldHdvcmsvUGFja2V0cyc7XG5pbXBvcnQgeyBGbGFnVHlwZSwgTWV0YWRhdGFGbGFnIH0gZnJvbSAnLi9lbnRpdHkvTWV0YWRhdGEnO1xuaW1wb3J0IHR5cGUgQ2hhdEV2ZW50IGZyb20gJy4vZXZlbnRzL2NoYXQvQ2hhdEV2ZW50JztcbmltcG9ydCB0eXBlIENodW5rIGZyb20gJy4vd29ybGQvY2h1bmsvQ2h1bmsnO1xuaW1wb3J0IHR5cGUgeyBDaHVua0Nvb3JkIH0gZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9OZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQnO1xuaW1wb3J0IHR5cGUgQ2xpZW50Q29ubmVjdGlvbiBmcm9tICcuL25ldHdvcmsvQ2xpZW50Q29ubmVjdGlvbic7XG5pbXBvcnQgQ29udGFpbmVyRW50cnkgZnJvbSAnLi9pbnZlbnRvcnkvQ29udGFpbmVyRW50cnknO1xuaW1wb3J0IENvb3JkaW5hdGVVdGlscyBmcm9tICcuL3dvcmxkL0Nvb3JkaW5hdGVVdGlscyc7XG5pbXBvcnQgdHlwZSBEZXZpY2UgZnJvbSAnLi91dGlscy9EZXZpY2UnO1xuaW1wb3J0IEZvcm1NYW5hZ2VyIGZyb20gJy4vZm9ybS9Gb3JtTWFuYWdlcic7XG5pbXBvcnQgR2FtZW1vZGUgZnJvbSAnLi93b3JsZC9HYW1lbW9kZSc7XG5pbXBvcnQgSHVtYW4gZnJvbSAnLi9lbnRpdHkvSHVtYW4nO1xuaW1wb3J0IHR5cGUgeyBJbmV0QWRkcmVzcyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCBNb3ZlbWVudFR5cGUgZnJvbSAnLi9uZXR3b3JrL3R5cGUvTW92ZW1lbnRUeXBlJztcbmltcG9ydCBQbGF5U3RhdHVzVHlwZSBmcm9tICcuL25ldHdvcmsvdHlwZS9QbGF5U3RhdHVzVHlwZSc7XG5pbXBvcnQgUGxheWVyU2Vzc2lvbiBmcm9tICcuL25ldHdvcmsvUGxheWVyU2Vzc2lvbic7XG5pbXBvcnQgUGxheWVyU2V0R2FtZW1vZGVFdmVudCBmcm9tICcuL2V2ZW50cy9wbGF5ZXIvUGxheWVyU2V0R2FtZW1vZGVFdmVudCc7XG5pbXBvcnQgUGxheWVyVG9nZ2xlRmxpZ2h0RXZlbnQgZnJvbSAnLi9ldmVudHMvcGxheWVyL1BsYXllclRvZ2dsZUZsaWdodEV2ZW50JztcbmltcG9ydCBQbGF5ZXJUb2dnbGVTcHJpbnRFdmVudCBmcm9tICcuL2V2ZW50cy9wbGF5ZXIvUGxheWVyVG9nZ2xlU3ByaW50RXZlbnQnO1xuaW1wb3J0IHR5cGUgU2tpbiBmcm9tICcuL3V0aWxzL3NraW4vU2tpbic7XG5pbXBvcnQgVGV4dFR5cGUgZnJvbSAnLi9uZXR3b3JrL3R5cGUvVGV4dFR5cGUnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vdXRpbHMvVGltZXInO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IFdpbmRvd01hbmFnZXIgZnJvbSAnLi9pbnZlbnRvcnkvV2luZG93TWFuYWdlcic7XG5pbXBvcnQgdHlwZSBXb3JsZCBmcm9tICcuL3dvcmxkL1dvcmxkJztcblxuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4vU2VydmVyJztcblxuLy8gRGVmYXVsdCBzcGF3biB2aWV3IGRpc3RhbmNlIHVzZWQgaW4gdmFuaWxsYVxuZXhwb3J0IGNvbnN0IFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMgPSA0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBIdW1hbiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiBJbmV0QWRkcmVzcztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5ldHdvcmtTZXNzaW9uOiBQbGF5ZXJTZXNzaW9uO1xuICAgIHByaXZhdGUgcGVybWlzc2lvbnM6IHN0cmluZ1tdO1xuXG4gICAgLy8gT25seSB1c2VkIGZvciBtZXRyaWNzXG4gICAgcHJpdmF0ZSBqb2luVGltZXIgPSBuZXcgVGltZXIoKTtcblxuICAgIC8vIFRPRE86IGZpbmlzaCBpbXBsZW1lbnRhdGlvblxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93czogV2luZG93TWFuYWdlcjtcblxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIHVzZXJuYW1lID0ge1xuICAgICAgICBwcmVmaXg6ICc8JyxcbiAgICAgICAgc3VmZml4OiAnPicsXG4gICAgICAgIG5hbWU6ICcnXG4gICAgfTtcblxuICAgIHB1YmxpYyBsb2NhbGUgPSAnJztcbiAgICBwdWJsaWMgcmFuZG9tSWQgPSAwO1xuXG4gICAgcHVibGljIHV1aWQgPSAnJztcbiAgICBwdWJsaWMgeHVpZCA9ICcnO1xuICAgIHB1YmxpYyBza2luOiBTa2luIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgdmlld0Rpc3RhbmNlID0gMDtcbiAgICBwdWJsaWMgZ2FtZW1vZGUgPSAwO1xuXG4gICAgcHVibGljIHBpdGNoID0gMDtcbiAgICBwdWJsaWMgeWF3ID0gMDtcbiAgICBwdWJsaWMgaGVhZFlhdyA9IDA7XG5cbiAgICBwcml2YXRlIG9uR3JvdW5kID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzcHJpbnRpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGZseWluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgc25lYWtpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFsbG93RmlnaHQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBwbGF0Zm9ybUNoYXRJZCA9ICcnO1xuXG4gICAgcHVibGljIGRldmljZTogRGV2aWNlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY2FjaGVTdXBwb3J0ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2h1bmtTZW5kUXVldWUgPSBuZXcgU2V0PENodW5rPigpO1xuICAgIHB1YmxpYyBjdXJyZW50Q2h1bms6IGJpZ2ludCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtczogRm9ybU1hbmFnZXI7XG5cbiAgICBwcml2YXRlIGNoYXRIYW5kbGVyOiAoZXZlbnQ6IENoYXRFdmVudCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFBsYXllcidzIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uLCB3b3JsZDogV29ybGQsIHNlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHN1cGVyKHdvcmxkLCBzZXJ2ZXIpO1xuICAgICAgICB0aGlzLmFkZHJlc3MgPSBjb25uZWN0aW9uLmdldFJha05ldFNlc3Npb24oKS5nZXRBZGRyZXNzKCk7XG4gICAgICAgIHRoaXMubmV0d29ya1Nlc3Npb24gPSBuZXcgUGxheWVyU2Vzc2lvbihzZXJ2ZXIsIGNvbm5lY3Rpb24sIHRoaXMpO1xuICAgICAgICB0aGlzLndpbmRvd3MgPSBuZXcgV2luZG93TWFuYWdlcigpO1xuICAgICAgICB0aGlzLmZvcm1zID0gbmV3IEZvcm1NYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5qb2luVGltZXIucmVzZXQoKTtcblxuICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBtZXNzIDovXG4gICAgICAgIHRoaXMuY2hhdEhhbmRsZXIgPSBhc3luYyAoZXZ0OiBDaGF0RXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldnQuaXNDYW5jZWxsZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBwcm9wZXIgY2hhbm5lbCBzeXN0ZW1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmdldENoYW5uZWwoKSA9PT0gJyouZXZlcnlvbmUnIHx8XG4gICAgICAgICAgICAgICAgKGV2dC5nZXRDaGF0KCkuZ2V0Q2hhbm5lbCgpID09PSAnKi5vcHMnICYmIHRoaXMuaXNPcCgpKSB8fFxuICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0Q2hhbm5lbCgpID09PSBgKi5wbGF5ZXIuJHt0aGlzLmdldE5hbWUoKX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRNZXNzYWdlKCksXG4gICAgICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0VHlwZSgpIGFzIG51bWJlciBhcyBUZXh0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRQYXJhbWV0ZXJzKCksXG4gICAgICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuaXNOZWVkc1RyYW5zbGF0aW9uKClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNlcnZlci5nZXRFdmVudE1hbmFnZXIoKS5vbignY2hhdCcsIHRoaXMuY2hhdEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0U2VydmVyKCkuZ2V0UGVybWlzc2lvbk1hbmFnZXIoKS5nZXRQZXJtaXNzaW9ucyh0aGlzKTtcblxuICAgICAgICBjb25zdCBwbGF5ZXJEYXRhID0gYXdhaXQgdGhpcy5nZXRXb3JsZCgpLmdldFBsYXllckRhdGEodGhpcyk7XG5cbiAgICAgICAgLy8gdm9pZCB0aGlzLnNldEdhbWVtb2RlKEdhbWVtb2RlLmdldEdhbWVtb2RlSWQocGxheWVyRGF0YS5nYW1lbW9kZSkpO1xuICAgICAgICAvLyBUT0RPOiBjYWxsaW5nIHRoaXMgYmVmb3JlIHRoZSBwbGF5ZXIgaXMgc3Bhd25pbmcgd2lsbCBjcmVhdGUgYW4gdW5kZWZpbmVkIGJlaGF2aW9yXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIGEgU2V0UGxheWVyR2FtZVR5cGUgcGFja2V0IGJyZWFraW5nIHRoZSBsb2dpbiBzZXF1ZW5jZVxuICAgICAgICAvLyBpJ2xsIGtlZXAgdGhpcyBjb21tZW50IHdoaWxlIGl0J3MgYnJva2VuXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WChwbGF5ZXJEYXRhLnBvc2l0aW9uLngpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFkocGxheWVyRGF0YS5wb3NpdGlvbi55KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRaKHBsYXllckRhdGEucG9zaXRpb24ueik7XG4gICAgICAgIHRoaXMucGl0Y2ggPSBwbGF5ZXJEYXRhLnBvc2l0aW9uLnBpdGNoID8/IDA7XG4gICAgICAgIHRoaXMueWF3ID0gcGxheWVyRGF0YS5wb3NpdGlvbi55YXcgPz8gMDtcblxuICAgICAgICBwbGF5ZXJEYXRhLmludmVudG9yeS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRJdGVtTWFuYWdlcigpLmdldEl0ZW0oaXRlbS5pZCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrKGl0ZW0uaWQpO1xuXG4gICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRMb2dnZXIoKT8ud2FybihgSXRlbS9ibG9jayB3aXRoIGlkICR7aXRlbS5pZH0gaXMgaW52YWxpZGAsICdQbGF5ZXIvb25FbmFibGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0SW52ZW50b3J5KCkuc2V0SXRlbShcbiAgICAgICAgICAgICAgICBpdGVtLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG5ldyBDb250YWluZXJFbnRyeSh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IGVudHJ5LFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogaXRlbS5jb3VudFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKVxuICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAgID8uZGVidWcoYChDb21wbGV0ZSBwbGF5ZXIgY3JlYXRpb24gdG9vayAke3RoaXMuam9pblRpbWVyLnN0b3AoKX0gbXMpYCwgJ1BsYXllci9vbkVuYWJsZScpO1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkICYmIHRoaXMueHVpZCkgYXdhaXQgdGhpcy5nZXRXb3JsZCgpLnNhdmVQbGF5ZXJEYXRhKHRoaXMpO1xuICAgICAgICB0aGlzLnNlcnZlci5nZXRFdmVudE1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcignY2hhdCcsIHRoaXMuY2hhdEhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBtYXRjaCB2YW5pbGxhIGJlaGF2aW9yLCB3aWxsIHNlbmQgY2h1bmtzXG4gICAgICogd2l0aCBhbiBpbml0aWFsIHZpZXcgcmFkaXVzIG9mIFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRJbml0aWFsU3Bhd25DaHVua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1pblggPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLngpIC0gVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUztcbiAgICAgICAgY29uc3QgbWluWiA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMueikgLSBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTO1xuICAgICAgICBjb25zdCBtYXhYID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy54KSArIFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVM7XG4gICAgICAgIGNvbnN0IG1heFogPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLnopICsgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUztcblxuICAgICAgICBjb25zdCBzYXZlZENodW5rczogQ2h1bmtDb29yZFtdID0gW107XG4gICAgICAgIGNvbnN0IHNlbmRRdWV1ZTogQXJyYXk8UHJvbWlzZTxDaHVuaz4+ID0gW107XG4gICAgICAgIGZvciAobGV0IGNodW5rWCA9IG1pblg7IGNodW5rWCA8PSBtYXhYOyArK2NodW5rWCkge1xuICAgICAgICAgICAgZm9yIChsZXQgY2h1bmtaID0gbWluWjsgY2h1bmtaIDw9IG1heFo7ICsrY2h1bmtaKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogdmFuaWxsYSBkb2VzIG5vdCBzZW5kIGFsbCBvZiB0aGVtLCBidXQgaW4gYSByYW5nZVxuICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlIGl0IGRvZXMgc2VuZCB0aGVtIGZyb20geCA9PiBbLTM7IDNdIGFuZCB6ID0+IFstMzsgMl1cbiAgICAgICAgICAgICAgICBzYXZlZENodW5rcy5wdXNoKHsgeDogY2h1bmtYLCB6OiBjaHVua1ogfSk7XG4gICAgICAgICAgICAgICAgc2VuZFF1ZXVlLnB1c2godGhpcy5nZXRXb3JsZCgpLmdldENodW5rKGNodW5rWCwgY2h1bmtaKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmROZXR3b3JrQ2h1bmtQdWJsaXNoZXIoVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUywgc2F2ZWRDaHVua3MpO1xuXG4gICAgICAgIGNvbnN0IGdldFVuaXF1ZUNodW5rcyA9IChzZW5kTGlzdDogQ2h1bmtDb29yZFtdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4U2V0ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgICAgICBjb25zdCB6U2V0ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY29vcmQgb2Ygc2VuZExpc3QpIHtcbiAgICAgICAgICAgICAgICB4U2V0LmFkZChjb29yZC54KTtcbiAgICAgICAgICAgICAgICB6U2V0LmFkZChjb29yZC56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHhTZXQuc2l6ZSArIHpTZXQuc2l6ZSkgLyAyKTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdldFVuaXF1ZUNodW5rcyhzYXZlZENodW5rcyk7ICsraSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc2VuZFF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRDaHVuayhjaHVuayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIHBsYXllcidzIGN1cnJlbnQgd29ybGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd29ybGQgLSB0aGUgbmV3IHdvcmxkXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNldFdvcmxkKHdvcmxkOiBXb3JsZCkge1xuICAgICAgICBjb25zdCBkaW0wID0gbmV3IENoYW5nZURpbWVuc2lvblBhY2tldCgpO1xuICAgICAgICBkaW0wLmRpbWVuc2lvbiA9IDA7XG4gICAgICAgIGRpbTAucG9zaXRpb24gPSB0aGlzO1xuICAgICAgICBkaW0wLnJlc3Bhd24gPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBkaW0xID0gbmV3IENoYW5nZURpbWVuc2lvblBhY2tldCgpO1xuICAgICAgICBkaW0xLmRpbWVuc2lvbiA9IDE7XG4gICAgICAgIGRpbTEucG9zaXRpb24gPSBuZXcgVmVjdG9yMygwLCAwLCAwKTsgLy8gVE9ETzogbG9hZCB0aGlzIHByb3Blcmx5XG4gICAgICAgIGRpbTEucmVzcGF3biA9IGZhbHNlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KGRpbTApO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMSk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0V29ybGQoKS5yZW1vdmVFbnRpdHkodGhpcyk7XG4gICAgICAgIGF3YWl0IHdvcmxkLmFkZEVudGl0eSh0aGlzKTtcbiAgICAgICAgYXdhaXQgc3VwZXIuc2V0V29ybGQuYmluZCh0aGlzKSh3b3JsZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRQb3NpdGlvbihuZXcgVmVjdG9yMygwLCAwLCAwKSk7XG4gICAgICAgIGZvciAobGV0IHggPSAtMzsgeCA8IDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeiA9IC0zOyB6IDwgMzsgeisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuICAgICAgICAgICAgICAgIHBrLmNsaWVudFN1YkNodW5rUmVxdWVzdHNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGsuY2h1bmtYID0geDsgLy8gVE9ET1xuICAgICAgICAgICAgICAgIHBrLmNodW5rWiA9IHo7IC8vIFRPRE9cbiAgICAgICAgICAgICAgICBway5kYXRhID0gQnVmZmVyLmZyb20oJycpO1xuICAgICAgICAgICAgICAgIHBrLnN1YkNodW5rQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KGRpbTEpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuXG4gICAgICAgIHRoaXMuY3VycmVudENodW5rID0gbnVsbDtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5jbGVhckNodW5rcygpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLm5lZWROZXdDaHVua3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPbmxpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKHRpY2s6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBDYWxsIHN1cGVyIG1ldGhvZFxuICAgICAgICBhd2FpdCBzdXBlci51cGRhdGUuYmluZCh0aGlzKSh0aWNrKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi51cGRhdGUodGljayk7XG5cbiAgICAgICAgLy8gVE9ETzogZ2V0IGRvY3VtZW50YXRpb24gYWJvdXQgdGltaW5ncyBmcm9tIHZhbmlsbGFcbiAgICAgICAgLy8gMSBzZWNvbmQgLyAyMCA9IDEgdGljaywgMjAgKiA1ID0gMSBzZWNvbmRcbiAgICAgICAgLy8gMSBzZWNvbmQgKiA2MCA9IDEgbWludXRlXG4gICAgICAgIGlmICh0aWNrICUgKDIwICogNSAqIDYwICogMSkgPT09IDApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFRpbWUodGljayk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHRoaXMuY2h1bmtTZW5kUXVldWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE5ldHdvcmtDaHVua1B1Ymxpc2hlcih0aGlzLnZpZXdEaXN0YW5jZSA/PyBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTLCBbXSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRDaHVuayhjaHVuayk7XG4gICAgICAgICAgICB0aGlzLmNodW5rU2VuZFF1ZXVlLmRlbGV0ZShjaHVuayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMga2ljayhyZWFzb24gPSAndW5rbm93biByZWFzb24nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKClcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy52ZXJib3NlKGBQbGF5ZXIgd2l0aCBpZCDCp2Ike3RoaXMuZ2V0UnVudGltZUlkKCl9wqdyIHdhcyBraWNrZWQ6ICR7cmVhc29ufWAsICdQbGF5ZXIva2ljaycpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmtpY2socmVhc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvKiBcbiAgICAgICAgICAgIFRPRE9cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kU2V0dGluZ3ModGhpcyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTsgKi9cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBzYW1lIGNodW5rLC5cbiAgICAvLyBUT0RPOiBtb3ZlIHRvIHdvcmxkXG4gICAgcHVibGljIGdldFBsYXllcnNJbkNodW5rKCk6IFBsYXllcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VydmVyKClcbiAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAuZmlsdGVyKChwbGF5ZXIpID0+IHBsYXllci5nZXRDdXJyZW50Q2h1bmsoKSA9PT0gdGhpcy5nZXRDdXJyZW50Q2h1bmsoKSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdGhlc2VcbiAgICBwdWJsaWMgYXN5bmMgc2VuZFNwYXduKCkge31cbiAgICBwdWJsaWMgYXN5bmMgc2VuZERlc3Bhd24oKSB7fVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNoYXQgbWVzc2FnZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgdHlwZTogVGV4dFR5cGUgPSBUZXh0VHlwZS5SYXcsXG4gICAgICAgIHBhcmFtZXRlcnM6IHN0cmluZ1tdID0gW10sXG4gICAgICAgIG5lZWRzVHJhbnNsYXRpb24gPSBmYWxzZVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUT0RPOiBEbyB0aGlzIHByb3Blcmx5IGxpa2UgamF2YSBlZGl0aW9uLFxuICAgICAgICAvLyBpbiBvdGhlciB3b3JkcywgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIEpTT04gZm9ybWF0dGVkLlxuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRNZXNzYWdlKG1lc3NhZ2UsICcnLCBwYXJhbWV0ZXJzLCBuZWVkc1RyYW5zbGF0aW9uLCB0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgdG9hc3Qgbm90aWZpY2F0aW9uIChsaWtlIFhib3ggTGl2ZSBub3RpZmljYXRpb25zKVxuICAgICAqIEBwYXJhbSB0aXRsZSAtIHRoZSB0b2FzdCB0aXRsZVxuICAgICAqIEBwYXJhbSBib2R5IC0gdGhlIHRvYXN0IGJvZHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFRvYXN0KHRpdGxlOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRUb2FzdCh0aXRsZSwgYm9keSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEdhbWVtb2RlKG1vZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQbGF5ZXJTZXRHYW1lbW9kZUV2ZW50KHRoaXMsIG1vZGUpO1xuICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEV2ZW50TWFuYWdlcigpLnBvc3QoWydwbGF5ZXJTZXRHYW1lbW9kZScsIGV2ZW50XSk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5nYW1lbW9kZSA9IGV2ZW50LmdldEdhbWVtb2RlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZEdhbWVtb2RlKHRoaXMuZ2FtZW1vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmdhbWVtb2RlID09PSBHYW1lbW9kZS5DcmVhdGl2ZSB8fCB0aGlzLmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3IpIHRoaXMuYWxsb3dGaWdodCA9IHRydWU7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxvd0ZpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEZseWluZyhmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHYW1lbW9kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gR2FtZW1vZGUuZ2V0R2FtZW1vZGVOYW1lKHRoaXMuZ2FtZW1vZGUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5ldHdvcmtTZXNzaW9uKCk6IFBsYXllclNlc3Npb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrU2Vzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VybmFtZS5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRVc2VybmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy51c2VybmFtZS5wcmVmaXh9JHt0aGlzLnVzZXJuYW1lLm5hbWV9JHt0aGlzLnVzZXJuYW1lLnN1ZmZpeH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQZXJtaXNzaW9ucygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVVUlEKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy51dWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3V1aWQgaXMgbWlzc2luZyEnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy51dWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRYVUlEKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy54dWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3h1aWQgaXMgbWlzc2luZyEnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy54dWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtTWFuYWdlcigpOiBGb3JtTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRXaW5kb3dzKCk6IFdpbmRvd01hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy53aW5kb3dzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd0ZsaWdodCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsb3dGaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQbGF5ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBgUGxheWVyYCBpcyBhbiBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHBsYXllciBpcyBhbiBvcGVyYXRvciBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VydmVyKCkuZ2V0UGVybWlzc2lvbk1hbmFnZXIoKS5pc09wKHRoaXMuZ2V0TmFtZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgYFBsYXllcmAgaXMgc3ByaW50aW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgcGxheWVyIGlzIHNwcmludGluZyBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTcHJpbnRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwcmludGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0U3ByaW50aW5nKHNwcmludGluZzogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3ByaW50aW5nID09PSB0aGlzLmlzU3ByaW50aW5nKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQbGF5ZXJUb2dnbGVTcHJpbnRFdmVudCh0aGlzLCBzcHJpbnRpbmcpO1xuICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEV2ZW50TWFuYWdlcigpLnBvc3QoWydwbGF5ZXJUb2dnbGVTcHJpbnQnLCBldmVudF0pO1xuICAgICAgICBpZiAoZXZlbnQuaXNDYW5jZWxsZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc3ByaW50aW5nID0gZXZlbnQuZ2V0SXNTcHJpbnRpbmcoKTtcblxuICAgICAgICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBwdXQgdGhpc1xuICAgICAgICB0aGlzLnNldERhdGFGbGFnKE1ldGFkYXRhRmxhZy5JTkRFWCwgTWV0YWRhdGFGbGFnLlNQUklOVElORywgdGhpcy5pc1NwcmludGluZygpLCBGbGFnVHlwZS5CWVRFKTtcblxuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRNZXRhZGF0YSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZseWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmx5aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRGbHlpbmcoZmx5aW5nOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChmbHlpbmcgPT09IHRoaXMuaXNGbHlpbmcoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0QWxsb3dGbGlnaHQoKSkge1xuICAgICAgICAgICAgdGhpcy5mbHlpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFBsYXllclRvZ2dsZUZsaWdodEV2ZW50KHRoaXMsIGZseWluZyk7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucG9zdChbJ3BsYXllclRvZ2dsZUZsaWdodCcsIGV2ZW50XSk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5mbHlpbmcgPSBldmVudC5nZXRJc0ZseWluZygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1NuZWFraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbmVha2luZztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0U25lYWtpbmcodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc25lYWtpbmcgPSB2YWw7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzT25Hcm91bmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9uR3JvdW5kO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRPbkdyb3VuZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdGhpcy5vbkdyb3VuZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMub25Hcm91bmQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyB3aWxsIG5vdGlmeSB0aGUgcGxheWVyJ3MgY2xpZW50IGFib3V0IHRoZSBwb3NpdGlvbiBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHlwZSAtIFRoZSBtb3ZlbWVudCB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNldFBvc2l0aW9uKHBvc2l0aW9uOiBWZWN0b3IzLCB0eXBlOiBNb3ZlbWVudFR5cGUgPSBNb3ZlbWVudFR5cGUuTm9ybWFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WChwb3NpdGlvbi5nZXRYKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFkocG9zaXRpb24uZ2V0WSgpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRaKHBvc2l0aW9uLmdldFooKSk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uYnJvYWRjYXN0TW92ZSh0aGlzLCB0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VycmVudENodW5rKGNodW5rOiBiaWdpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rID09PSBjaHVuaykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRDaHVuayA9IGNodW5rO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50Q2h1bmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaHVuayE7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VyLCBQbGF5ZXIsIFBsYXllclNlc3Npb24sIFNlcnZlciB9IGZyb20gJy4uLyc7XG5cbmltcG9ydCB7IERpc2Nvbm5lY3RQYWNrZXQgfSBmcm9tICcuL1BhY2tldHMnO1xuaW1wb3J0IE1pbmVjcmFmdFNlc3Npb24gZnJvbSAnLi9NaW5lY3JhZnRTZXNzaW9uJztcbmltcG9ydCB0eXBlIHsgUmFrTmV0U2Vzc2lvbiB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgcGxheWVyIGNyZWF0aW9uIGl0c2VsZiwgdmVyeSBoZWxwZnVsIGFzXG4gKiBpdCBoZWxwcyB0byBub3Qgd2FzdGUgcmVzb3VyY2VzIGluIGNhc2UgdGhlIGNsaWVudCB0cnlpbmcgdG8gY29ubmVjdCBpcyBzaW1wbHlcbiAqIG91dGRhdGVkIG9yIHNlbmRzIGludmFsaWQgZGF0YSBkdXJpbmcgdGhlIGxvZ2luIGhhbmRzaGFrZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50Q29ubmVjdGlvbiBleHRlbmRzIE1pbmVjcmFmdFNlc3Npb24ge1xuICAgIHByaXZhdGUgcGxheWVyU2Vzc2lvbjogUGxheWVyU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBoYXNDb21wcmVzc2lvbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlc3Npb246IFJha05ldFNlc3Npb24sIGxvZ2dlcj86IExvZ2dlcikge1xuICAgICAgICBzdXBlcihzZXNzaW9uLCBsb2dnZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQHBhcmFtIHNlcnZlciAtIHRoZSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gcGxheWVyIC0gdGhlIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHRoZSBuZXcgcGxheWVyIHNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdFBsYXllckNvbm5lY3Rpb24oc2VydmVyOiBTZXJ2ZXIsIHBsYXllcjogUGxheWVyKTogUGxheWVyU2Vzc2lvbiB7XG4gICAgICAgIGFzc2VydCh0aGlzLnBsYXllclNlc3Npb24gPT09IG51bGwsICdQbGF5ZXIgc2Vzc2lvbiB3YXMgYWxyZWFkeSBjcmVhdGVkJyk7XG5cbiAgICAgICAgdGhpcy5wbGF5ZXJTZXNzaW9uID0gbmV3IFBsYXllclNlc3Npb24oc2VydmVyLCB0aGlzLCBwbGF5ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXJTZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNjb25uZWN0KHJlYXNvbiA9ICdkaXNjb25uZWN0LmRpc2Nvbm5lY3RlZCcsIGhpZGVSZWFzb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBEaXNjb25uZWN0UGFja2V0KCk7XG4gICAgICAgIHBhY2tldC5za2lwTWVzc2FnZSA9IGhpZGVSZWFzb247XG4gICAgICAgIHBhY2tldC5tZXNzYWdlID0gcmVhc29uO1xuICAgICAgICB2b2lkIHRoaXMuc2VuZERhdGFQYWNrZXQocGFja2V0KTtcblxuICAgICAgICAvLyBGb3JjZSBSYWtOZXQgdG8gcmVtb3ZlIHRoZSBzZXNzaW9uXG4gICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gaGFuZGxlIHRoZSBkZWFkIHNlc3Npb25cbiAgICAgICAgdGhpcy5yYWtTZXNzaW9uLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGxheWVyU2Vzc2lvbigpOiBQbGF5ZXJTZXNzaW9uIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllclNlc3Npb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJha05ldFNlc3Npb24oKTogUmFrTmV0U2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJha1Nlc3Npb247XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgSGFuZGxlcnMgZnJvbSAnLi9IYW5kbGVycyc7XG5pbXBvcnQgKiBhcyBQYWNrZXRzIGZyb20gJy4vUGFja2V0cyc7XG5cbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuL0lkZW50aWZpZXJzJztcbmltcG9ydCBQYWNrZXRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9QYWNrZXRIYW5kbGVyJztcbmltcG9ydCB7IFBsYXllclNlc3Npb24gfSBmcm9tICcuLi8nO1xuaW1wb3J0IFByZUxvZ2luUGFja2V0SGFuZGxlciBmcm9tICcuL2hhbmRsZXIvUHJlTG9naW5QYWNrZXRIYW5kbGVyJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4uL3V0aWxzL1RpbWVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFja2V0UmVnaXN0cnkge1xuICAgIHByaXZhdGUgc2VydmVyOiBTZXJ2ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRzOiBNYXA8bnVtYmVyLCB0eXBlb2YgUGFja2V0cy5EYXRhUGFja2V0PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBNYXA8bnVtYmVyLCBQYWNrZXRIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkVuYWJsZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBhY2tldHMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckhhbmRsZXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhY2tldHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHBhY2tldC5cbiAgICAgKiBAcGFyYW0gcGFja2V0IHRoZSBwYWNrZXQuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyUGFja2V0KHBhY2tldDogdHlwZW9mIFBhY2tldHMuRGF0YVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWNrZXRzLmhhcyhwYWNrZXQuTmV0SUQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQYWNrZXQgJHtwYWNrZXQubmFtZX0gaXMgdHJ5aW5nIHRvIHVzZSBpZCAke3BhY2tldC5OZXRJRC50b1N0cmluZygxNil9IHdoaWNoIGFscmVhZHkgZXhpc3RzIWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5wYWNrZXRzLnNldChwYWNrZXQuTmV0SUQsIHBhY2tldCk7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpPy5kZWJ1ZyhgUGFja2V0IHdpdGggaWQgwqdiJHtwYWNrZXQubmFtZX3Cp3IgcmVnaXN0ZXJlZGAsICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlclBhY2tldCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBhY2tldCBieSBpdCdzIG5ldHdvcmsgSUQuXG4gICAgICogQHBhcmFtIGlkIHRoZSBOZXRJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFja2V0KGlkOiBudW1iZXIpOiBhbnkge1xuICAgICAgICBpZiAoIXRoaXMucGFja2V0cy5oYXMoaWQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2V0IHdpdGggaWQgJHtpZH0hYCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0cy5nZXQoaWQpITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBwYWNrZXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICogQHBhcmFtIGlkIHRoZSBOZXRJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUGFja2V0KGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWNrZXRzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogbnVtYmVyLCBoYW5kbGVyOiBQYWNrZXRIYW5kbGVyPGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnMuaGFzKGlkKSkgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIHdpdGggaWQgJHtpZH0gYWxyZWFkeSBleGlzdHMhYCk7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5zZXQoaWQsIGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICA/LmRlYnVnKGBIYW5kbGVyIHdpdGggaWQgwqdiJHtoYW5kbGVyLmNvbnN0cnVjdG9yLm5hbWV9wqdyIHJlZ2lzdGVyZWRgLCAnUGFja2V0UmVnaXN0cnkvcmVnaXN0ZXJIYW5kbGVyJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhhbmRsZXIoaWQ6IG51bWJlcik6IFBhY2tldEhhbmRsZXI8YW55PiB8IFByZUxvZ2luUGFja2V0SGFuZGxlcjxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhbmRsZXJzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBoYW5kbGVyIHdpdGggaWQgJHtpZC50b1N0cmluZygxNil9IWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmdldChpZCkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIHR3byBoYW5kbGVycy5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleHRlbmQgYSBoYW5kbGVyIHdpdGhvdXQgYWN0dWFsbHkgcmVwbGFjaW5nIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIGZpcnN0IGhhbmRsZXIsIGV4ZWN1dGVkIGZpcnN0LlxuICAgICAqIEBwYXJhbSBoYW5kbGVyMiB0aGUgc2Vjb25kIGhhbmRsZXIuXG4gICAgICovXG4gICAgcHVibGljIGFwcGVuZEhhbmRsZXIoaGFuZGxlcjogUGFja2V0SGFuZGxlcjxhbnk+LCBoYW5kbGVyMjogUGFja2V0SGFuZGxlcjxhbnk+KTogUGFja2V0SGFuZGxlcjxhbnk+IHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IChjbGFzcyBIYW5kbGVyIHtcbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocGFja2V0OiBhbnksIHNlcnZlcjogU2VydmVyLCBzZXNzaW9uOiBQbGF5ZXJTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUocGFja2V0LCBzZXJ2ZXIsIHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIyLmhhbmRsZShwYWNrZXQsIHNlcnZlciwgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlcyBhcyBQYWNrZXRIYW5kbGVyPGFueT47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgaGFuZGxlciBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKiBAcGFyYW0gaWQgdGhlIGhhbmRsZXIgaWQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUhhbmRsZXIoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYWxsIHBhY2tldHMgZXhwb3J0ZWQgYnkgJy4vUHJvdG9jb2wnLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQYWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIHBhY2tldHNcbiAgICAgICAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBpZ25vcmUgRGF0YVBhY2tldCAmIEJhdGNoUGFja2V0XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKFBhY2tldHMpXG4gICAgICAgICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlLm5hbWUgIT09ICdEYXRhUGFja2V0JyAmJiB2YWx1ZS5uYW1lICE9PSAnQmF0Y2hQYWNrZXQnKVxuICAgICAgICAgICAgLm1hcCgoWywgdmFsdWVdKSA9PiB0aGlzLnJlZ2lzdGVyUGFja2V0KHZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5wYWNrZXRzLnNpemV9wqdyIG9mIMKnYiR7XG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oT2JqZWN0LmtleXMoSWRlbnRpZmllcnMpKS5sZW5ndGggLSAyXG4gICAgICAgICAgICAgICAgfcKnciBwYWNrZXQocykgKHRvb2sgJHt0aW1lci5zdG9wKCl9IG1zKSFgLFxuICAgICAgICAgICAgICAgICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlclBhY2tldHMnXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGFsbCBoYW5kbGVycyBleHBvcnRlZCBieSAnLi9IYW5kbGVycycuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckhhbmRsZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEhhbmRsZXJzKS5tYXAoKFssIHZhbHVlXSkgPT4gdGhpcy5yZWdpc3RlckhhbmRsZXIodmFsdWUuTmV0SUQhLCBuZXcgKHZhbHVlIGFzIGFueSkoKSkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgID8udmVyYm9zZShcbiAgICAgICAgICAgICAgICBgUmVnaXN0ZXJlZCDCp2Ike3RoaXMuaGFuZGxlcnMuc2l6ZX3Cp3IgcGFja2V0IGhhbmRsZXIocykgKHRvb2sgJHt0aW1lci5zdG9wKCl9IG1zKSFgLFxuICAgICAgICAgICAgICAgICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlckhhbmRsZXJzJ1xuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHBhY2tldHMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcHVibGljIGdldFBhY2tldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2tldHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBoYW5kbGVycyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFJha05ldExpc3RlbmVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuaW1wb3J0IENoYXQsIHsgQ2hhdFR5cGUgfSBmcm9tICcuL2NoYXQvQ2hhdCc7XG5pbXBvcnQgQmFuTWFuYWdlciBmcm9tICcuL2Jhbi9CYW5NYW5hZ2VyJztcbmltcG9ydCBCYXRjaFBhY2tldCBmcm9tICcuL25ldHdvcmsvcGFja2V0L0JhdGNoUGFja2V0JztcbmltcG9ydCBCbG9ja01hbmFnZXIgZnJvbSAnLi9ibG9jay9CbG9ja01hbmFnZXInO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4vYmxvY2svQmxvY2tNYXBwaW5ncyc7XG5pbXBvcnQgQ2hhdEV2ZW50IGZyb20gJy4vZXZlbnRzL2NoYXQvQ2hhdEV2ZW50JztcbmltcG9ydCBDaGF0TWFuYWdlciBmcm9tICcuL2NoYXQvQ2hhdE1hbmFnZXInO1xuaW1wb3J0IENsaWVudENvbm5lY3Rpb24gZnJvbSAnLi9uZXR3b3JrL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IENvbW1hbmRNYW5hZ2VyIGZyb20gJy4vY29tbWFuZC9Db21tYW5kTWFuYWdlcic7XG5pbXBvcnQgQ29uc29sZSBmcm9tICcuL0NvbnNvbGUnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUGFja2V0IH0gZnJvbSAnLi9uZXR3b3JrL1BhY2tldHMnO1xuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9ldmVudHMvRXZlbnRNYW5hZ2VyJztcbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuL25ldHdvcmsvSWRlbnRpZmllcnMnO1xuaW1wb3J0IEl0ZW1NYW5hZ2VyIGZyb20gJy4vaXRlbS9JdGVtTWFuYWdlcic7XG5pbXBvcnQgUGFja2V0UmVnaXN0cnkgZnJvbSAnLi9uZXR3b3JrL1BhY2tldFJlZ2lzdHJ5JztcbmltcG9ydCBQZXJtaXNzaW9uTWFuYWdlciBmcm9tICcuL3Blcm1pc3Npb24vUGVybWlzc2lvbk1hbmFnZXInO1xuaW1wb3J0IFBsdWdpbk1hbmFnZXIgZnJvbSAnLi9wbHVnaW4vUGx1Z2luTWFuYWdlcic7XG5pbXBvcnQgUXVlcnlNYW5hZ2VyIGZyb20gJy4vcXVlcnkvUXVlcnlNYW5hZ2VyJztcbmltcG9ydCBSYWtuZXRDb25uZWN0RXZlbnQgZnJvbSAnLi9ldmVudHMvcmFrbmV0L1Jha25ldENvbm5lY3RFdmVudCc7XG5pbXBvcnQgUmFrbmV0RGlzY29ubmVjdEV2ZW50IGZyb20gJy4vZXZlbnRzL3Jha25ldC9SYWtuZXREaXNjb25uZWN0RXZlbnQnO1xuaW1wb3J0IFJha25ldEVuY2Fwc3VsYXRlZFBhY2tldEV2ZW50IGZyb20gJy4vZXZlbnRzL3Jha25ldC9SYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXRFdmVudCc7XG5pbXBvcnQgU2Vzc2lvbk1hbmFnZXIgZnJvbSAnLi9TZXNzaW9uTWFuYWdlcic7XG5pbXBvcnQgeyBUaWNrRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9FdmVudHMnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vdXRpbHMvVGltZXInO1xuaW1wb3J0IFdvcmxkTWFuYWdlciBmcm9tICcuL3dvcmxkL1dvcmxkTWFuYWdlcic7XG5cbmltcG9ydCB0eXBlIENvbmZpZyBmcm9tICcuL2NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHR5cGUgTG9nZ2VyQnVpbGRlciBmcm9tICcuL3V0aWxzL0xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IFJha05ldFNlc3Npb24sIEluZXRBZGRyZXNzIH0gZnJvbSAnQGpzcHJpc21hcmluZS9yYWtuZXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXIge1xuICAgIHByaXZhdGUgdmVyc2lvbiE6IHN0cmluZztcbiAgICBwcml2YXRlIHJha25ldCE6IFJha05ldExpc3RlbmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJCdWlsZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDb25maWc7XG4gICAgcHJpdmF0ZSB0cHMgPSAyMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnNvbGU6IENvbnNvbGU7XG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudE1hbmFnZXIgPSBuZXcgRXZlbnRNYW5hZ2VyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWNrZXRSZWdpc3RyeTogUGFja2V0UmVnaXN0cnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uTWFuYWdlciA9IG5ldyBTZXNzaW9uTWFuYWdlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTWFuYWdlcjogUGx1Z2luTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRNYW5hZ2VyOiBDb21tYW5kTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmxkTWFuYWdlcjogV29ybGRNYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXRlbU1hbmFnZXI6IEl0ZW1NYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tNYW5hZ2VyOiBCbG9ja01hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBxdWVyeU1hbmFnZXI6IFF1ZXJ5TWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoYXRNYW5hZ2VyOiBDaGF0TWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25NYW5hZ2VyOiBQZXJtaXNzaW9uTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhbk1hbmFnZXI6IEJhbk1hbmFnZXI7XG4gICAgcHJpdmF0ZSBzdG9wcGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgdGlja2VyVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUlORUNSQUZUX1RJQ0tfVElNRV9NUyA9IDEwMDAgLyAyMDtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTogU2VydmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHsgbG9nZ2VyLCBjb25maWcsIHZlcnNpb24gfTogeyBsb2dnZXI/OiBMb2dnZXJCdWlsZGVyOyBjb25maWc6IENvbmZpZzsgdmVyc2lvbjogc3RyaW5nIH0pIHtcbiAgICAgICAgY29uc3QgYWR2ZXJ0aXNlZFZlcnNpb24gPVxuICAgICAgICAgICAgSWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMubGVuZ3RoIDw9IDFcbiAgICAgICAgICAgICAgICA/IGDCp2V2JHtJZGVudGlmaWVycy5NaW5lY3JhZnRWZXJzaW9ucy5hdCgwKX3Cp3JgXG4gICAgICAgICAgICAgICAgOiBgwqdldiR7SWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMuYXQoMCl9wqdyLcKnZXYke0lkZW50aWZpZXJzLk1pbmVjcmFmdFZlcnNpb25zLmF0KC0xKX3Cp3JgO1xuXG4gICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBTdGFydGluZyBKU1ByaXNtYXJpbmUgc2VydmVyIHZlcnNpb24gwqdldiR7dmVyc2lvbn3Cp3IgZm9yIE1pbmVjcmFmdDogQmVkcm9jayBFZGl0aW9uICR7YWR2ZXJ0aXNlZFZlcnNpb259IChwcm90b2NvbCB2ZXJzaW9uIMKnZSR7SWRlbnRpZmllcnMuUHJvdG9jb2x9wqdyKWAsXG4gICAgICAgICAgICAnU2VydmVyJ1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyITtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuY29uc29sZSA9IG5ldyBDb25zb2xlKHRoaXMpO1xuICAgICAgICB0aGlzLnBhY2tldFJlZ2lzdHJ5ID0gbmV3IFBhY2tldFJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLml0ZW1NYW5hZ2VyID0gbmV3IEl0ZW1NYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLmJsb2NrTWFuYWdlciA9IG5ldyBCbG9ja01hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMud29ybGRNYW5hZ2VyID0gbmV3IFdvcmxkTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5jb21tYW5kTWFuYWdlciA9IG5ldyBDb21tYW5kTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5wbHVnaW5NYW5hZ2VyID0gbmV3IFBsdWdpbk1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMucXVlcnlNYW5hZ2VyID0gbmV3IFF1ZXJ5TWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5jaGF0TWFuYWdlciA9IG5ldyBDaGF0TWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uTWFuYWdlciA9IG5ldyBQZXJtaXNzaW9uTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iYW5NYW5hZ2VyID0gbmV3IEJhbk1hbmFnZXIodGhpcyk7XG5cbiAgICAgICAgU2VydmVyLmluc3RhbmNlID0gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uRW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZy5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25NYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJhbk1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pdGVtTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJsb2NrTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1hbmRNYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkRpc2FibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tbWFuZE1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYmxvY2tNYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLml0ZW1NYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJhbk1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJtaXNzaW9uTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYWNrZXRSZWdpc3RyeS5vbkRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5jb25maWcub25EaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkVuYWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290c3RyYXAoc2VydmVySXAgPSAnMC4wLjAuMCcsIHBvcnQgPSAxOTEzMik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9uRW5hYmxlKCk7XG4gICAgICAgIEJsb2NrTWFwcGluZ3MuaW5pdE1hcHBpbmdzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMud29ybGRNYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFja2V0UmVnaXN0cnkub25FbmFibGUoKTtcblxuICAgICAgICB0aGlzLnJha25ldCA9IG5ldyBSYWtOZXRMaXN0ZW5lcih0aGlzLmdldENvbmZpZygpLmdldE1heFBsYXllcnMoKSwgZmFsc2UpO1xuICAgICAgICB0aGlzLnJha25ldC5zdGFydChzZXJ2ZXJJcCwgcG9ydCk7XG5cbiAgICAgICAgdGhpcy5yYWtuZXQub24oJ29wZW5Db25uZWN0aW9uJywgYXN5bmMgKHNlc3Npb246IFJha05ldFNlc3Npb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFJha25ldENvbm5lY3RFdmVudChzZXNzaW9uKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3Jha25ldENvbm5lY3QnLCBldmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHNlc3Npb24uZ2V0QWRkcmVzcygpLnRvVG9rZW4oKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb25NYW5hZ2VyLmhhcyh0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEFub3RoZXIgY2xpZW50IHdpdGggdG9rZW4gKCR7dG9rZW59KSBpcyBhbHJlYWR5IGNvbm5lY3RlZCFgLFxuICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9vcGVuQ29ubmVjdGlvbidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzY29ubmVjdCgnQWxyZWFkeSBjb25uZWN0ZWQgZnJvbSBhbm90aGVyIGxvY2F0aW9uJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dG9rZW59IGlzIGF0dGVtcHRpbmcgdG8gY29ubmVjdGAsICdTZXJ2ZXIvbGlzdGVuL29wZW5Db25uZWN0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25NYW5hZ2VyLmFkZCh0b2tlbiwgbmV3IENsaWVudENvbm5lY3Rpb24oc2Vzc2lvbiwgdGhpcy5sb2dnZXIpKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYE5ldyBjb25uZWN0aW9uIGhhbmRsaW5nIHRvb2sgJHt0aW1lci5zdG9wKCl9IG1zYCwgJ1NlcnZlci9saXN0ZW4vb3BlbkNvbm5lY3Rpb24nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yYWtuZXQub24oJ2Nsb3NlQ29ubmVjdGlvbicsIGFzeW5jIChpbmV0QWRkcjogSW5ldEFkZHJlc3MsIHJlYXNvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBSYWtuZXREaXNjb25uZWN0RXZlbnQoaW5ldEFkZHIsIHJlYXNvbik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50TWFuYWdlci5lbWl0KCdyYWtuZXREaXNjb25uZWN0JywgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gaW5ldEFkZHIudG9Ub2tlbigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldFBsYXllcih0b2tlbik7XG5cbiAgICAgICAgICAgICAgICAvLyBEZS1zcGF3biB0aGUgcGxheWVyIHRvIGFsbCBvbmxpbmUgcGxheWVyc1xuICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLnJlbW92ZUZyb21QbGF5ZXJMaXN0KCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBvbmxpbmVQbGF5ZXIgb2YgdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRBbGxQbGF5ZXJzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuc2VuZERlc3Bhd24ob25saW5lUGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgd2UgZmFpbCBhdCBkZWNvZGluZyB0aGUgdXNlcm5hbWUgZm9yIHdoYXRldmVyIHJlYXNvblxuICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZ2V0TmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIGRpc2Nvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ2hhdEV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGDCp2UlbXVsdGlwbGF5ZXIucGxheWVyLmxlZnRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5ZXIuZ2V0TmFtZSgpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqLmV2ZXJ5b25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGF0VHlwZS5UUkFOU0xBVElPTlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50TWFuYWdlci5lbWl0KCdjaGF0JywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllci5vbkRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0V29ybGQoKS5yZW1vdmVFbnRpdHkocGxheWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25NYW5hZ2VyLnJlbW92ZSh0b2tlbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IHJlbW92ZSBjb25uZWN0aW9uIGZyb20gbm9uLWV4aXN0aW5nIHBsYXllciAoJHt0b2tlbn0pYCxcbiAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RGlzY29ubmVjdCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2xpc3Rlbi9yYWtuZXREaXNjb25uZWN0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3Rva2VufSBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWAsICdTZXJ2ZXIvbGlzdGVuL3Jha25ldERpc2Nvbm5lY3QnKTtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYFBsYXllciBkZXN0cnVjdGlvbiB0b29rIGFib3V0ICR7RGF0ZS5ub3coKSAtIHRpbWV9IG1zYCxcbiAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXREaXNjb25uZWN0J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yYWtuZXQub24oJ2VuY2Fwc3VsYXRlZCcsIGFzeW5jIChwYWNrZXQ6IGFueSwgaW5ldEFkZHI6IEluZXRBZGRyZXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBSYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXRFdmVudChpbmV0QWRkciwgcGFja2V0KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCcsIGV2ZW50KTtcblxuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb246IENsaWVudENvbm5lY3Rpb24gfCBudWxsO1xuICAgICAgICAgICAgaWYgKChjb25uZWN0aW9uID0gdGhpcy5zZXNzaW9uTWFuYWdlci5nZXQoaW5ldEFkZHIudG9Ub2tlbigpKSA/PyBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBHb3QgYSBwYWNrZXQgZnJvbSBhIGNsb3NlZCBjb25uZWN0aW9uICgke2luZXRBZGRyLnRvVG9rZW4oKX0pYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFJlYWQgYmF0Y2ggY29udGVudCBhbmQgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBjb25zdCBiYXRjaGVkID0gbmV3IEJhdGNoUGFja2V0KHBhY2tldC5jb250ZW50KTtcbiAgICAgICAgICAgICAgICBiYXRjaGVkLmNvbXByZXNzZWQgPSBjb25uZWN0aW9uLmhhc0NvbXByZXNzaW9uO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVhZCBhbGwgcGFja2V0cyBpbnNpZGUgYmF0Y2ggYW5kIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBidWYgb2YgYXdhaXQgYmF0Y2hlZC5hc3luY0RlY29kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IGJ1ZlswXSE7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhY2tldFJlZ2lzdHJ5LmdldFBhY2tldHMoKS5oYXMocGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUGFja2V0IDB4JHtwaWQudG9TdHJpbmcoMTYpfSBpc24ndCBpbXBsZW1lbnRlZGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHBhY2tldCBmcm9tIHJlZ2lzdHJ5XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyAodGhpcy5wYWNrZXRSZWdpc3RyeS5nZXRQYWNrZXRzKCkuZ2V0KHBpZCkhKShidWYpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGVjb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3Igd2hpbGUgZGVjb2RpbmcgcGFja2V0OiAke3BhY2tldC5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvcn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5wYWNrZXRSZWdpc3RyeS5nZXRIYW5kbGVyKHBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5zaWxseShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUmVjZWl2ZWQgwqdiJHtwYWNrZXQuY29uc3RydWN0b3IubmFtZX3Cp3IgcGFja2V0YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgKGhhbmRsZXIgYXMgYW55KS5oYW5kbGUocGFja2V0LCB0aGlzLCBjb25uZWN0aW9uLmdldFBsYXllclNlc3Npb24oKSA/PyBjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBIYW5kbGVyIGVycm9yICR7cGFja2V0LmNvbnN0cnVjdG9yLm5hbWV9LWhhbmRsZXI6ICgke2Vycm9yfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciwgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yYWtuZXQub24oJ3JhdycsIGFzeW5jIChidWZmZXI6IEJ1ZmZlciwgaW5ldEFkZHI6IEluZXRBZGRyZXNzKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlNYW5hZ2VyLm9uUmF3KGJ1ZmZlciwgaW5ldEFkZHIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciwgJ1NlcnZlci9saXN0ZW4vcmF3Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgUXVlcnlNYW5hZ2VyIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfWAsICdTZXJ2ZXIvbGlzdGVuL3JhdycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBjYWxjdWxhdGUgVFBTLlxuICAgICAgICBsZXQgdGlja0NvdW50ID0gMDtcbiAgICAgICAgY29uc3QgdGljayA9ICgpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBUaWNrRXZlbnQodGlja0NvdW50KTtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3RpY2snLCBldmVudCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdvcmxkIG9mIHRoaXMud29ybGRNYW5hZ2VyLmdldFdvcmxkcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgd29ybGQudXBkYXRlKGV2ZW50LmdldFRpY2soKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgKyt0aWNrQ291bnQ7XG4gICAgICAgICAgICAgICAgdGljaygpO1xuICAgICAgICAgICAgfSwgU2VydmVyLk1JTkVDUkFGVF9USUNLX1RJTUVfTVMpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRpY2tpbmdcbiAgICAgICAgdGhpcy50aWNrZXJUaW1lciA9IHRpY2soKTtcbiAgICAgICAgdGhpcy50aWNrZXJUaW1lci51bnJlZigpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEpTUHJpc21hcmluZSBpcyBub3cgbGlzdGVuaW5nIG9uIHBvcnQgwqdiJHtwb3J0fWAsICdTZXJ2ZXIvbGlzdGVuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2lsbHMgdGhlIHNlcnZlciBhc3luY2hyb25vdXNseS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IHsgd2l0aG91dFNhdmluZz86IGJvb2xlYW47IGNyYXNoPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwaW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuc3RvcHBpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1N0b3BwaW5nIHNlcnZlcicsICdTZXJ2ZXIva2lsbCcpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbnNvbGUub25EaXNhYmxlKCk7XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpY2tlclRpbWVyKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gS2ljayBhbGwgb25saW5lIHBsYXllcnNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0QWxsUGxheWVycygpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLmtpY2soJ1NlcnZlciBjbG9zZWQuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgYWxsIHdvcmxkc1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zPy53aXRob3V0U2F2aW5nKSBhd2FpdCB0aGlzLndvcmxkTWFuYWdlci5zYXZlKCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMud29ybGRNYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkRpc2FibGUoKTtcbiAgICAgICAgICAgIHRoaXMucmFrbmV0LmtpbGwoKTsgLy8gdGhpcy5yYWtuZXQgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHdlIGtpbGwgdGhlIHNlcnZlciByZWFsbHkgZWFybHlcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdChvcHRpb25zPy5jcmFzaCA/IDEgOiAwKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2tpbGwnKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBicm9hZGNhc3RQYWNrZXQ8VCBleHRlbmRzIERhdGFQYWNrZXQ+KGRhdGFQYWNrZXQ6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gTWF5YmUgaSBjYW4gaW1wcm92ZSB0aGlzIGJ5IHVzaW5nIHRoZSBVRFAgYnJvYWRjYXN0LCBhbGwgdW5jb25uZWN0ZWQgY2xpZW50c1xuICAgICAgICAvLyB3aWxsIGlnbm9yZSB0aGUgY29ubmVjdGVkIHBhY2tldCBwcm9iYWJseSwgYnV0IG1heSBjYXVzZSBpc3N1ZXMuXG4gICAgICAgIGZvciAoY29uc3Qgb25saW5lUGxheWVyIG9mIHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0QWxsUGxheWVycygpKSB7XG4gICAgICAgICAgICBhd2FpdCBvbmxpbmVQbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGF0YVBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJZGVudGlmaWVycygpIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UXVlcnlNYW5hZ2VyKCk6IFF1ZXJ5TWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5TWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29tbWFuZE1hbmFnZXIoKTogQ29tbWFuZE1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwbGF5ZXIgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZXNzaW9uTWFuYWdlcigpOiBTZXNzaW9uTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb25NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdvcmxkIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0V29ybGRNYW5hZ2VyKCk6IFdvcmxkTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SXRlbU1hbmFnZXIoKTogSXRlbU1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBibG9jayBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldEJsb2NrTWFuYWdlcigpOiBCbG9ja01hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja01hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbG9nZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldExvZ2dlcigpOiBMb2dnZXJCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhY2tldCByZWdpc3RyeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWNrZXRSZWdpc3RyeSgpOiBQYWNrZXRSZWdpc3RyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2tldFJlZ2lzdHJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJha25ldCBpbnN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSYWtuZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJha25ldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4gbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQbHVnaW5NYW5hZ2VyKCk6IFBsdWdpbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGV2ZW50IG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXZlbnRNYW5hZ2VyKCk6IEV2ZW50TWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50TWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjaGF0IG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2hhdE1hbmFnZXIoKTogQ2hhdE1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGF0TWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb25maWdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZmlnKCk6IENvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb25zb2xlIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldENvbnNvbGUoKTogQ29uc29sZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnNvbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbiBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFBlcm1pc3Npb25NYW5hZ2VyKCk6IFBlcm1pc3Npb25NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmFuIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmFuTWFuYWdlcigpOiBCYW5NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFuTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgUHJpc21hcmluZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZXJ2ZXIoKTogU2VydmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBUUFNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VFBTKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRwcztcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiQ29tbWFuZFBhcmFtZXRlckZsYWdzIiwiR2FtZW1vZGUiLCJTdWdnZXN0aW9ucyIsIkNvbW1hbmRFbnVtIiwiQ29tbWFuZFBhcmFtZXRlciIsIkVudGl0aWVzIiwiUGFyc2VUYXJnZXRTZWxlY3RvciIsIkNvbW1hbmRQYXJhbWV0ZXJUeXBlIiwiVmVjdG9yMyIsIlBhcnNlVGlsZGVDYXJldE5vdGF0aW9uIiwiSWRlbnRpZmllcnMiLCJQbGF5U3RhdHVzUGFja2V0IiwiUGxheVN0YXR1c1R5cGUiLCJSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCIsIkJhdGNoUGFja2V0IiwiTGV2ZWxDaHVua1BhY2tldCIsIkNodW5rIiwiVXBkYXRlQWR2ZW50dXJlU2V0dGluZ3NQYWNrZXQiLCJVcGRhdGVBYmlsaXRpZXNQYWNrZXQiLCJQZXJtaXNzaW9uVHlwZSIsIlBsYXllclBlcm1pc3Npb25UeXBlIiwiQWJpbGl0eUxheWVyIiwiQWJpbGl0eUxheWVyVHlwZSIsIkFiaWxpdHlMYXllckZsYWciLCJDb29yZGluYXRlVXRpbHMiLCJIZWFwIiwiSW52ZW50b3J5Q29udGVudFBhY2tldCIsIldpbmRvd0lkcyIsIkNyZWF0aXZlQ29udGVudFBhY2tldCIsImNyZWF0aXZlaXRlbXMiLCJJdGVtIiwiTW9iRXF1aXBtZW50UGFja2V0IiwiTW9kYWxGb3JtUmVxdWVzdFBhY2tldCIsIlNldFRpbWVQYWNrZXQiLCJTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCIsIk5ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCIsIkJsb2NrUG9zaXRpb24iLCJBdmFpbGFibGVDb21tYW5kc1BhY2tldCIsImNtZCIsIkNvbW1hbmREYXRhIiwicGFyYW1ldGVycyIsIkNodW5rUmFkaXVzVXBkYXRlZFBhY2tldCIsIlVwZGF0ZUF0dHJpYnV0ZXNQYWNrZXQiLCJTZXRBY3RvckRhdGFQYWNrZXQiLCJUZXh0VHlwZSIsIlRleHRQYWNrZXQiLCJUb2FzdFJlcXVlc3RQYWNrZXQiLCJNb3ZlbWVudFR5cGUiLCJNb3ZlUGxheWVyUGFja2V0IiwiUGxheWVyTGlzdFBhY2tldCIsIlBsYXllckxpc3RBY3Rpb24iLCJQbGF5ZXJMaXN0RW50cnkiLCJVVUlEIiwiQWRkUGxheWVyUGFja2V0IiwiUmVtb3ZlQWN0b3JQYWNrZXQiLCJEaXNjb25uZWN0UGFja2V0IiwiSHVtYW4iLCJUaW1lciIsIldpbmRvd01hbmFnZXIiLCJGb3JtTWFuYWdlciIsIkNvbnRhaW5lckVudHJ5IiwiQ2hhbmdlRGltZW5zaW9uUGFja2V0IiwiUGxheWVyU2V0R2FtZW1vZGVFdmVudCIsIlBsYXllclRvZ2dsZVNwcmludEV2ZW50IiwiTWV0YWRhdGFGbGFnIiwiRmxhZ1R5cGUiLCJQbGF5ZXJUb2dnbGVGbGlnaHRFdmVudCIsIk1pbmVjcmFmdFNlc3Npb24iLCJhc3NlcnQiLCJQYWNrZXRzIiwiRXZlbnRNYW5hZ2VyIiwiU2Vzc2lvbk1hbmFnZXIiLCJDb25zb2xlIiwiSXRlbU1hbmFnZXIiLCJCbG9ja01hbmFnZXIiLCJXb3JsZE1hbmFnZXIiLCJDb21tYW5kTWFuYWdlciIsIlBsdWdpbk1hbmFnZXIiLCJRdWVyeU1hbmFnZXIiLCJDaGF0TWFuYWdlciIsIlBlcm1pc3Npb25NYW5hZ2VyIiwiQmFuTWFuYWdlciIsIkJsb2NrTWFwcGluZ3MiLCJSYWtOZXRMaXN0ZW5lciIsIlJha25ldENvbm5lY3RFdmVudCIsIlJha25ldERpc2Nvbm5lY3RFdmVudCIsImV2ZW50IiwiQ2hhdEV2ZW50IiwiQ2hhdCIsIkNoYXRUeXBlIiwiUmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0RXZlbnQiLCJwYWNrZXQiLCJUaWNrRXZlbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjTyxNQUFlLGVBQWdCLENBQUE7QUFBQSxFQUMzQixlQUEwQixHQUFBO0FBQzdCLElBQU8sT0FBQSxFQUFBLENBQUE7QUFBQSxHQUNYO0FBQUEsRUFDTyxhQUFtRCxHQUFBO0FBQ3RELElBQUEsMkJBQVcsR0FBSSxFQUFBLENBQUE7QUFBQSxHQUNuQjtBQUNKLENB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