@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
@@ -0,0 +1,1886 @@
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 || 0;
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
+ }).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.length > 0 ? 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;
1078
+ this.yaw = playerData.position.yaw;
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.logger.onEnable();
1562
+ await this.permissionManager.onEnable();
1563
+ await this.pluginManager.onEnable();
1564
+ await this.banManager.onEnable();
1565
+ await this.itemManager.onEnable();
1566
+ await this.blockManager.onEnable();
1567
+ await this.commandManager.onEnable();
1568
+ }
1569
+ async onDisable() {
1570
+ await this.commandManager.onDisable();
1571
+ await this.blockManager.onDisable();
1572
+ await this.itemManager.onDisable();
1573
+ await this.banManager.onDisable();
1574
+ await this.pluginManager.onDisable();
1575
+ await this.permissionManager.onDisable();
1576
+ await this.packetRegistry.onDisable();
1577
+ this.config.onDisable();
1578
+ await this.logger.onDisable();
1579
+ }
1580
+ async reload() {
1581
+ await this.onDisable();
1582
+ await this.onEnable();
1583
+ }
1584
+ async bootstrap(serverIp = "0.0.0.0", port = 19132) {
1585
+ await this.onEnable();
1586
+ block_BlockMappings.BlockMappings.initMappings();
1587
+ await this.worldManager.onEnable();
1588
+ await this.packetRegistry.onEnable();
1589
+ this.raknet = new raknet.RakNetListener(this.getConfig().getMaxPlayers(), false);
1590
+ this.raknet.start(serverIp, port);
1591
+ this.raknet.on("openConnection", async (session) => {
1592
+ const event = new events_raknet_RaknetConnectEvent.default(session);
1593
+ await this.eventManager.emit("raknetConnect", event);
1594
+ if (event.isCancelled()) {
1595
+ session.disconnect();
1596
+ return;
1597
+ }
1598
+ const token = session.getAddress().toToken();
1599
+ if (this.sessionManager.has(token)) {
1600
+ this.logger.error(
1601
+ `Another client with token (${token}) is already connected!`,
1602
+ "Server/listen/openConnection"
1603
+ );
1604
+ session.disconnect("Already connected from another location");
1605
+ return;
1606
+ }
1607
+ const timer = new utils_Timer.default();
1608
+ this.logger.debug(`${token} is attempting to connect`, "Server/listen/openConnection");
1609
+ this.sessionManager.add(token, new ClientConnection(session, this.logger));
1610
+ this.logger.verbose(`New connection handling took ${timer.stop()} ms`, "Server/listen/openConnection");
1611
+ });
1612
+ this.raknet.on("closeConnection", async (inetAddr, reason) => {
1613
+ const event = new events_raknet_RaknetDisconnectEvent.default(inetAddr, reason);
1614
+ await this.eventManager.emit("raknetDisconnect", event);
1615
+ const time = Date.now();
1616
+ const token = inetAddr.toToken();
1617
+ try {
1618
+ const player = this.sessionManager.getPlayer(token);
1619
+ await player.getNetworkSession().removeFromPlayerList();
1620
+ for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1621
+ await player.getNetworkSession().sendDespawn(onlinePlayer);
1622
+ }
1623
+ if (player.getName()) {
1624
+ const event2 = new events_chat_ChatEvent.default(
1625
+ new chat_Chat.default(
1626
+ this.console,
1627
+ `§e%multiplayer.player.left`,
1628
+ [player.getName()],
1629
+ true,
1630
+ "*.everyone",
1631
+ chat_Chat.ChatType.TRANSLATION
1632
+ )
1633
+ );
1634
+ await this.eventManager.emit("chat", event2);
1635
+ }
1636
+ await player.onDisable();
1637
+ await player.getWorld().removeEntity(player);
1638
+ this.sessionManager.remove(token);
1639
+ } catch (error) {
1640
+ this.logger.debug(
1641
+ `Cannot remove connection from non-existing player (${token})`,
1642
+ "Server/listen/raknetDisconnect"
1643
+ );
1644
+ this.logger.error(error, "Server/listen/raknetDisconnect");
1645
+ }
1646
+ this.logger.debug(`${token} disconnected due to ${reason}`, "Server/listen/raknetDisconnect");
1647
+ this.logger.debug(
1648
+ `Player destruction took about ${Date.now() - time} ms`,
1649
+ "Server/listen/raknetDisconnect"
1650
+ );
1651
+ });
1652
+ this.raknet.on("encapsulated", async (packet, inetAddr) => {
1653
+ const event = new events_raknet_RaknetEncapsulatedPacketEvent.default(inetAddr, packet);
1654
+ await this.eventManager.emit("raknetEncapsulatedPacket", event);
1655
+ let connection;
1656
+ if ((connection = this.sessionManager.get(inetAddr.toToken()) ?? null) === null) {
1657
+ this.logger.error(`Got a packet from a closed connection (${inetAddr.toToken()})`);
1658
+ return;
1659
+ }
1660
+ try {
1661
+ const batched = new network_packet_BatchPacket.default(packet.content);
1662
+ batched.compressed = connection.hasCompression;
1663
+ for (const buf of await batched.asyncDecode()) {
1664
+ const pid = buf[0];
1665
+ if (!this.packetRegistry.getPackets().has(pid)) {
1666
+ this.logger.warn(
1667
+ `Packet 0x${pid.toString(16)} isn't implemented`,
1668
+ "Server/listen/raknetEncapsulatedPacket"
1669
+ );
1670
+ continue;
1671
+ }
1672
+ const packet2 = new (this.packetRegistry.getPackets().get(pid))(buf);
1673
+ try {
1674
+ packet2.decode();
1675
+ } catch (error) {
1676
+ this.logger.error(error);
1677
+ this.logger.error(
1678
+ `Error while decoding packet: ${packet2.constructor.name}: ${error}`,
1679
+ "Server/listen/raknetEncapsulatedPacket"
1680
+ );
1681
+ continue;
1682
+ }
1683
+ try {
1684
+ const handler = this.packetRegistry.getHandler(pid);
1685
+ this.logger.silly(
1686
+ `Received §b${packet2.constructor.name}§r packet`,
1687
+ "Server/listen/raknetEncapsulatedPacket"
1688
+ );
1689
+ await handler.handle(packet2, this, connection.getPlayerSession() ?? connection);
1690
+ } catch (error) {
1691
+ this.logger.error(
1692
+ `Handler error ${packet2.constructor.name}-handler: (${error})`,
1693
+ "Server/listen/raknetEncapsulatedPacket"
1694
+ );
1695
+ this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1696
+ }
1697
+ }
1698
+ } catch (error) {
1699
+ this.logger.error(error, "Server/listen/raknetEncapsulatedPacket");
1700
+ }
1701
+ });
1702
+ this.raknet.on("raw", async (buffer, inetAddr) => {
1703
+ try {
1704
+ await this.queryManager.onRaw(buffer, inetAddr);
1705
+ } catch (error) {
1706
+ this.logger.error(error, "Server/listen/raw");
1707
+ this.logger.verbose(`QueryManager failed with error: ${error}`, "Server/listen/raw");
1708
+ }
1709
+ });
1710
+ let tickCount = 0;
1711
+ const tick = () => setTimeout(() => {
1712
+ const event = new events_other_TickEvent.default(tickCount);
1713
+ void this.eventManager.emit("tick", event);
1714
+ for (const world of this.worldManager.getWorlds()) {
1715
+ void world.update(event.getTick());
1716
+ }
1717
+ ++tickCount;
1718
+ tick();
1719
+ }, Server.MINECRAFT_TICK_TIME_MS);
1720
+ this.tickerTimer = tick();
1721
+ this.tickerTimer.unref();
1722
+ this.logger.info(`JSPrismarine is now listening on port §b${port}`, "Server/listen");
1723
+ }
1724
+ /**
1725
+ * Kills the server asynchronously.
1726
+ */
1727
+ async shutdown(options) {
1728
+ if (this.stopping)
1729
+ return;
1730
+ this.stopping = true;
1731
+ this.logger.info("Stopping server", "Server/kill");
1732
+ await this.console.onDisable();
1733
+ clearInterval(this.tickerTimer);
1734
+ try {
1735
+ for (const player of this.sessionManager.getAllPlayers()) {
1736
+ await player.kick("Server closed.");
1737
+ }
1738
+ if (!options?.withoutSaving)
1739
+ await this.worldManager.save();
1740
+ await this.worldManager.onDisable();
1741
+ await this.onDisable();
1742
+ this.raknet.kill();
1743
+ process.exit(options?.crash ? 1 : 0);
1744
+ } catch (error) {
1745
+ this.logger.error(error, "Server/kill");
1746
+ process.exit(1);
1747
+ }
1748
+ }
1749
+ async broadcastPacket(dataPacket) {
1750
+ for (const onlinePlayer of this.sessionManager.getAllPlayers()) {
1751
+ await onlinePlayer.getNetworkSession().getConnection().sendDataPacket(dataPacket);
1752
+ }
1753
+ }
1754
+ getVersion() {
1755
+ return this.version;
1756
+ }
1757
+ getIdentifiers() {
1758
+ return network_Identifiers.default;
1759
+ }
1760
+ /**
1761
+ * Returns the query manager
1762
+ */
1763
+ getQueryManager() {
1764
+ return this.queryManager;
1765
+ }
1766
+ /**
1767
+ * Returns the command manager
1768
+ */
1769
+ getCommandManager() {
1770
+ return this.commandManager;
1771
+ }
1772
+ /**
1773
+ * Returns the player manager
1774
+ */
1775
+ getSessionManager() {
1776
+ return this.sessionManager;
1777
+ }
1778
+ /**
1779
+ * Returns the world manager
1780
+ */
1781
+ getWorldManager() {
1782
+ return this.worldManager;
1783
+ }
1784
+ /**
1785
+ * Returns the item manager
1786
+ */
1787
+ getItemManager() {
1788
+ return this.itemManager;
1789
+ }
1790
+ /**
1791
+ * Returns the block manager
1792
+ */
1793
+ getBlockManager() {
1794
+ return this.blockManager;
1795
+ }
1796
+ /**
1797
+ * Returns the logger
1798
+ */
1799
+ getLogger() {
1800
+ return this.logger;
1801
+ }
1802
+ /**
1803
+ * Returns the packet registry
1804
+ */
1805
+ getPacketRegistry() {
1806
+ return this.packetRegistry;
1807
+ }
1808
+ /**
1809
+ * Returns the raknet instance
1810
+ */
1811
+ getRaknet() {
1812
+ return this.raknet;
1813
+ }
1814
+ /**
1815
+ * Returns the plugin manager
1816
+ */
1817
+ getPluginManager() {
1818
+ return this.pluginManager;
1819
+ }
1820
+ /**
1821
+ * Returns the event manager
1822
+ */
1823
+ getEventManager() {
1824
+ return this.eventManager;
1825
+ }
1826
+ /**
1827
+ * Returns the chat manager
1828
+ */
1829
+ getChatManager() {
1830
+ return this.chatManager;
1831
+ }
1832
+ /**
1833
+ * Returns the config
1834
+ */
1835
+ getConfig() {
1836
+ return this.config;
1837
+ }
1838
+ /**
1839
+ * Returns the console instance
1840
+ */
1841
+ getConsole() {
1842
+ return this.console;
1843
+ }
1844
+ /**
1845
+ * Returns the permission manager
1846
+ */
1847
+ getPermissionManager() {
1848
+ return this.permissionManager;
1849
+ }
1850
+ /**
1851
+ * Returns the ban manager
1852
+ */
1853
+ getBanManager() {
1854
+ return this.banManager;
1855
+ }
1856
+ /**
1857
+ * Returns this Prismarine instance
1858
+ */
1859
+ getServer() {
1860
+ return this;
1861
+ }
1862
+ /**
1863
+ * Returns the current TPS
1864
+ */
1865
+ getTPS() {
1866
+ return this.tps;
1867
+ }
1868
+ }
1869
+
1870
+ exports.BooleanArgumentCommand = BooleanArgumentCommand;
1871
+ exports.ClientConnection = ClientConnection;
1872
+ exports.CommandArgument = CommandArgument;
1873
+ exports.CommandArgumentCommand = CommandArgumentCommand;
1874
+ exports.CommandArgumentEntity = CommandArgumentEntity;
1875
+ exports.CommandArgumentGamemode = CommandArgumentGamemode;
1876
+ exports.CommandArgumentMob = CommandArgumentMob;
1877
+ exports.CommandArgumentPosition = CommandArgumentPosition;
1878
+ exports.Handlers = Handlers;
1879
+ exports.LoginHandler = LoginHandler;
1880
+ exports.PacketRegistry = PacketRegistry;
1881
+ exports.Player = Player;
1882
+ exports.PlayerArgumentCommand = PlayerArgumentCommand;
1883
+ exports.PlayerSession = PlayerSession;
1884
+ exports.Server = Server;
1885
+ exports.VANILLA_DEFAULT_SPAWN_RADIUS = VANILLA_DEFAULT_SPAWN_RADIUS;
1886
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVyLW5ZLVdPLW1fLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQvQ29tbWFuZEFyZ3VtZW50cy50cyIsIi4uL3NyYy9uZXR3b3JrL2hhbmRsZXIvTG9naW5IYW5kbGVyLnRzIiwiLi4vc3JjL25ldHdvcmsvUGxheWVyU2Vzc2lvbi50cyIsIi4uL3NyYy9QbGF5ZXIudHMiLCIuLi9zcmMvbmV0d29yay9DbGllbnRDb25uZWN0aW9uLnRzIiwiLi4vc3JjL25ldHdvcmsvUGFja2V0UmVnaXN0cnkudHMiLCIuLi9zcmMvU2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEVudGl0aWVzIGZyb20gJy4uL2VudGl0eS9FbnRpdGllcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZENvbnRleHQsIFN0cmluZ1JlYWRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYnJpZ2FkaWVyJztcbmltcG9ydCB7IFN1Z2dlc3Rpb25zIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IENvbW1hbmRQYXJhbWV0ZXIsIHsgQ29tbWFuZFBhcmFtZXRlckZsYWdzLCBDb21tYW5kUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kUGFyYW1ldGVyJztcblxuaW1wb3J0IENvbW1hbmRFbnVtIGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kRW51bSc7XG5pbXBvcnQgR2FtZW1vZGUgZnJvbSAnLi4vd29ybGQvR2FtZW1vZGUnO1xuaW1wb3J0IFBhcnNlVGFyZ2V0U2VsZWN0b3IgZnJvbSAnLi4vdXRpbHMvUGFyc2VUYXJnZXRTZWxlY3Rvcic7XG5pbXBvcnQgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24gZnJvbSAnLi4vdXRpbHMvUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24nO1xuaW1wb3J0IHR5cGUgUGxheWVyIGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tICcuLi8nO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHVibGljIGdldFJlYWRhYmxlVHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50R2FtZW1vZGUgaW1wbGVtZW50cyBDb21tYW5kQXJndW1lbnQge1xuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBmbGFnczogQ29tbWFuZFBhcmFtZXRlckZsYWdzO1xuICAgIHByaXZhdGUgcG9zdGZpeDogc3RyaW5nIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhPzogeyBuYW1lPzogc3RyaW5nOyBvcHRpb25hbD86IGJvb2xlYW47IGZsYWdzPzogQ29tbWFuZFBhcmFtZXRlckZsYWdzOyBwb3N0Zml4Pzogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/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+PSBtYXggcGxheWVyc1xuXG4gICAgICAgIGNvbnN0IHBsYXlTdGF0dXMgPSBuZXcgUGxheVN0YXR1c1BhY2tldCgpO1xuXG4gICAgICAgIC8vIEtpY2sgY2xpZW50IGlmIGhhcyBuZXdlciAvIG9sZGVyIGNsaWVudCB2ZXJzaW9uXG4gICAgICAgIGlmIChwYWNrZXQucHJvdG9jb2wgIT09IElkZW50aWZpZXJzLlByb3RvY29sKSB7XG4gICAgICAgICAgICBwbGF5U3RhdHVzLnN0YXR1cyA9XG4gICAgICAgICAgICAgICAgcGFja2V0LnByb3RvY29sIDwgSWRlbnRpZmllcnMuUHJvdG9jb2xcbiAgICAgICAgICAgICAgICAgICAgPyBQbGF5U3RhdHVzVHlwZS5Mb2dpbkZhaWxlZENsaWVudFxuICAgICAgICAgICAgICAgICAgICA6IFBsYXlTdGF0dXNUeXBlLkxvZ2luRmFpbGVkU2VydmVyO1xuICAgICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwbGF5U3RhdHVzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtpY2sgdGhlIHBsYXllciBpZiB0aGVpciB1c2VybmFtZSBpcyBpbnZhbGlkXG4gICAgICAgIGlmICghcGFja2V0LmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoJ0ludmFsaWQgdXNlcm5hbWUhJywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHRyYXNoXG4gICAgICAgIGNvbnN0IHdvcmxkID0gc2VydmVyLmdldFdvcmxkTWFuYWdlcigpLmdldERlZmF1bHRXb3JsZCgpITtcbiAgICAgICAgY29uc3QgcGxheWVyID0gbmV3IFBsYXllcihjb25uZWN0aW9uLCB3b3JsZCwgc2VydmVyKTtcbiAgICAgICAgcGxheWVyLnVzZXJuYW1lLm5hbWUgPSBwYWNrZXQuZGlzcGxheU5hbWU7XG4gICAgICAgIHBsYXllci5sb2NhbGUgPSBwYWNrZXQubGFuZ3VhZ2VDb2RlO1xuICAgICAgICBwbGF5ZXIucmFuZG9tSWQgPSBwYWNrZXQuY2xpZW50UmFuZG9tSWQ7XG4gICAgICAgIHBsYXllci51dWlkID0gcGFja2V0LmlkZW50aXR5O1xuICAgICAgICBwbGF5ZXIueHVpZCA9IHBhY2tldC5YVUlEO1xuICAgICAgICBwbGF5ZXIuc2tpbiA9IHBhY2tldC5za2luO1xuICAgICAgICBwbGF5ZXIuZGV2aWNlID0gcGFja2V0LmRldmljZTtcblxuICAgICAgICAvLyBQbGF5ZXIgd2l0aCBzYW1lIG5hbWUgaXMgYWxyZWFkeSBvbmxpbmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFBsYXllciA9IHNlcnZlci5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckJ5RXhhY3ROYW1lKHBhY2tldC5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBvbGRQbGF5ZXIua2ljaygnTG9nZ2VkIGluIGZyb20gYW5vdGhlciBsb2NhdGlvbicpO1xuICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgaWYgKCFwbGF5ZXIueHVpZCAmJiBzZXJ2ZXIuZ2V0Q29uZmlnKCkuZ2V0T25saW5lTW9kZSgpKSB7XG4gICAgICAgICAgICBhd2FpdCBwbGF5ZXIua2ljaygnU2VydmVyIGlzIGluIG9ubGluZS1tb2RlIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcGxheWVyLm9uRW5hYmxlKCk7XG5cbiAgICAgICAgLy8gVE9ETzogZW5jcnlwdGlvbiBoYW5kc2hha2VcblxuICAgICAgICBjb25zdCByZWFzb24gPSBzZXJ2ZXIuZ2V0QmFuTWFuYWdlcigpLmlzQmFubmVkKHBsYXllcik7XG4gICAgICAgIGlmIChyZWFzb24gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhd2FpdCBwbGF5ZXIua2ljayhgWW91IGhhdmUgYmVlbiBiYW5uZWQke3JlYXNvbiA/IGAgZm9yIHJlYXNvbjogJHtyZWFzb259YCA6ICcnfSFgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWVyIGNvbm5lY3Rpb24gdG8gYmUgcmVjb2duaXplZCBhcyBhIGNvbm5lY3RlZCBwbGF5ZXJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGNvbm5lY3Rpb24uaW5pdFBsYXllckNvbm5lY3Rpb24oc2VydmVyLCBwbGF5ZXIpO1xuICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLkxvZ2luU3VjY2Vzcyk7XG5cbiAgICAgICAgYXdhaXQgd29ybGQuYWRkRW50aXR5KHBsYXllcik7XG5cbiAgICAgICAgLy8gRmluYWxpemUgY29ubmVjdGlvbiBoYW5kc2hha2VcbiAgICAgICAgY29uc3QgcmVzb3VyY2VQYWNrc0luZm8gPSBuZXcgUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQoKTtcbiAgICAgICAgcmVzb3VyY2VQYWNrc0luZm8ucmVzb3VyY2VQYWNrUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzb3VyY2VQYWNrc0luZm8uZm9yY2VTZXJ2ZXJQYWNrc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzb3VyY2VQYWNrc0luZm8uaGFzU2NyaXB0cyA9IGZhbHNlO1xuICAgICAgICByZXNvdXJjZVBhY2tzSW5mby5oYXNBZGRvblBhY2tzID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocmVzb3VyY2VQYWNrc0luZm8sIHRydWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmRBcmd1bWVudEVudGl0eSwgQ29tbWFuZEFyZ3VtZW50R2FtZW1vZGUgfSBmcm9tICcuLi9jb21tYW5kL0NvbW1hbmRBcmd1bWVudHMnO1xuaW1wb3J0IENvbW1hbmRQYXJhbWV0ZXIsIHsgQ29tbWFuZFBhcmFtZXRlclR5cGUgfSBmcm9tICcuL3R5cGUvQ29tbWFuZFBhcmFtZXRlcic7XG5pbXBvcnQgdHlwZSB7IENodW5rQ29vcmQgfSBmcm9tICcuL3BhY2tldC9OZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQnO1xuaW1wb3J0IE5ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCBmcm9tICcuL3BhY2tldC9OZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQnO1xuaW1wb3J0IFBsYXllckxpc3RQYWNrZXQsIHsgUGxheWVyTGlzdEFjdGlvbiwgUGxheWVyTGlzdEVudHJ5IH0gZnJvbSAnLi9wYWNrZXQvUGxheWVyTGlzdFBhY2tldCc7XG5pbXBvcnQgVXBkYXRlQWJpbGl0aWVzUGFja2V0LCB7XG4gICAgQWJpbGl0eUxheWVyLFxuICAgIEFiaWxpdHlMYXllckZsYWcsXG4gICAgQWJpbGl0eUxheWVyVHlwZVxufSBmcm9tICcuL3BhY2tldC9VcGRhdGVBYmlsaXRpZXNQYWNrZXQnO1xuXG5pbXBvcnQgQWRkUGxheWVyUGFja2V0IGZyb20gJy4vcGFja2V0L0FkZFBsYXllclBhY2tldCc7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0ZSB9IGZyb20gJy4uL2VudGl0eS9BdHRyaWJ1dGUnO1xuaW1wb3J0IEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IGZyb20gJy4vcGFja2V0L0F2YWlsYWJsZUNvbW1hbmRzUGFja2V0JztcbmltcG9ydCB7IEJhdGNoUGFja2V0IH0gZnJvbSAnLi9QYWNrZXRzJztcbmltcG9ydCBCbG9ja1Bvc2l0aW9uIGZyb20gJy4uL3dvcmxkL0Jsb2NrUG9zaXRpb24nO1xuaW1wb3J0IENodW5rIGZyb20gJy4uL3dvcmxkL2NodW5rL0NodW5rJztcbmltcG9ydCBDaHVua1JhZGl1c1VwZGF0ZWRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvQ2h1bmtSYWRpdXNVcGRhdGVkUGFja2V0JztcbmltcG9ydCB0eXBlIENsaWVudENvbm5lY3Rpb24gZnJvbSAnLi9DbGllbnRDb25uZWN0aW9uJztcbmltcG9ydCBDb21tYW5kRGF0YSBmcm9tICcuL3R5cGUvQ29tbWFuZERhdGEnO1xuaW1wb3J0IENvbW1hbmRFbnVtIGZyb20gJy4vdHlwZS9Db21tYW5kRW51bSc7XG5pbXBvcnQgQ29vcmRpbmF0ZVV0aWxzIGZyb20gJy4uL3dvcmxkL0Nvb3JkaW5hdGVVdGlscyc7XG5pbXBvcnQgQ3JlYXRpdmVDb250ZW50UGFja2V0IGZyb20gJy4vcGFja2V0L0NyZWF0aXZlQ29udGVudFBhY2tldCc7XG5pbXBvcnQgRGlzY29ubmVjdFBhY2tldCBmcm9tICcuL3BhY2tldC9EaXNjb25uZWN0UGFja2V0JztcbmltcG9ydCBHYW1lbW9kZSBmcm9tICcuLi93b3JsZC9HYW1lbW9kZSc7XG5pbXBvcnQgSGVhcCBmcm9tICdoZWFwJztcbmltcG9ydCB0eXBlIElGb3JtIGZyb20gJy4uL2Zvcm0vSUZvcm0nO1xuaW1wb3J0IEludmVudG9yeUNvbnRlbnRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvSW52ZW50b3J5Q29udGVudFBhY2tldCc7XG5pbXBvcnQgSXRlbSBmcm9tICcuLi9pdGVtL0l0ZW0nO1xuaW1wb3J0IExldmVsQ2h1bmtQYWNrZXQgZnJvbSAnLi9wYWNrZXQvTGV2ZWxDaHVua1BhY2tldCc7XG5pbXBvcnQgTW9iRXF1aXBtZW50UGFja2V0IGZyb20gJy4vcGFja2V0L01vYkVxdWlwbWVudFBhY2tldCc7XG5pbXBvcnQgTW9kYWxGb3JtUmVxdWVzdFBhY2tldCBmcm9tICcuL3BhY2tldC9Nb2RhbEZvcm1SZXF1ZXN0UGFja2V0JztcbmltcG9ydCBNb3ZlUGxheWVyUGFja2V0IGZyb20gJy4vcGFja2V0L01vdmVQbGF5ZXJQYWNrZXQnO1xuaW1wb3J0IE1vdmVtZW50VHlwZSBmcm9tICcuL3R5cGUvTW92ZW1lbnRUeXBlJztcbmltcG9ydCBQZXJtaXNzaW9uVHlwZSBmcm9tICcuL3R5cGUvUGVybWlzc2lvblR5cGUnO1xuaW1wb3J0IFBsYXlTdGF0dXNQYWNrZXQgZnJvbSAnLi9wYWNrZXQvUGxheVN0YXR1c1BhY2tldCc7XG5pbXBvcnQgdHlwZSBQbGF5ZXIgZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCBQbGF5ZXJQZXJtaXNzaW9uVHlwZSBmcm9tICcuL3R5cGUvUGxheWVyUGVybWlzc2lvblR5cGUnO1xuaW1wb3J0IFJlbW92ZUFjdG9yUGFja2V0IGZyb20gJy4vcGFja2V0L1JlbW92ZUFjdG9yUGFja2V0JztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IFNldEFjdG9yRGF0YVBhY2tldCBmcm9tICcuL3BhY2tldC9TZXRBY3RvckRhdGFQYWNrZXQnO1xuaW1wb3J0IFNldFBsYXllckdhbWVUeXBlUGFja2V0IGZyb20gJy4vcGFja2V0L1NldFBsYXllckdhbWVUeXBlUGFja2V0JztcbmltcG9ydCBTZXRUaW1lUGFja2V0IGZyb20gJy4vcGFja2V0L1NldFRpbWVQYWNrZXQnO1xuaW1wb3J0IFRleHRQYWNrZXQgZnJvbSAnLi9wYWNrZXQvVGV4dFBhY2tldCc7XG5pbXBvcnQgVGV4dFR5cGUgZnJvbSAnLi90eXBlL1RleHRUeXBlJztcbmltcG9ydCBUb2FzdFJlcXVlc3RQYWNrZXQgZnJvbSAnLi9wYWNrZXQvVG9hc3RSZXF1ZXN0UGFja2V0JztcbmltcG9ydCBVVUlEIGZyb20gJy4uL3V0aWxzL1VVSUQnO1xuaW1wb3J0IFVwZGF0ZUFkdmVudHVyZVNldHRpbmdzUGFja2V0IGZyb20gJy4vcGFja2V0L1VwZGF0ZUFkdmVudHVyZVNldHRpbmdzUGFja2V0JztcbmltcG9ydCBVcGRhdGVBdHRyaWJ1dGVzUGFja2V0IGZyb20gJy4vcGFja2V0L1VwZGF0ZUF0dHJpYnV0ZXNQYWNrZXQnO1xuaW1wb3J0IHsgV2luZG93SWRzIH0gZnJvbSAnLi4vaW52ZW50b3J5L1dpbmRvd01hbmFnZXInO1xuaW1wb3J0IHsgY3JlYXRpdmVpdGVtcyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYmVkcm9jay1kYXRhJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxheWVyU2Vzc2lvbiB7XG4gICAgcHJpdmF0ZSBjb25uZWN0aW9uOiBDbGllbnRDb25uZWN0aW9uO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG4gICAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllcjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2h1bmtTZW5kUXVldWU6IENodW5rW10gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlZENodW5rczogU2V0PGJpZ2ludD4gPSBuZXcgU2V0KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nQ2h1bmtzOiBTZXQ8YmlnaW50PiA9IG5ldyBTZXQoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlciwgY29ubmVjdGlvbjogQ2xpZW50Q29ubmVjdGlvbiwgcGxheWVyOiBQbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoX3RpY2s6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jaHVua1NlbmRRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVua3NUb1NlbmQgPSB0aGlzLmNodW5rU2VuZFF1ZXVlLnNwbGljZSgwLCBNYXRoLm1pbih0aGlzLmNodW5rU2VuZFF1ZXVlLmxlbmd0aCwgNTApKTtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gbmV3IEJhdGNoUGFja2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rc1RvU2VuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBrID0gbmV3IExldmVsQ2h1bmtQYWNrZXQoKTtcbiAgICAgICAgICAgICAgICBway5jaHVua1ggPSBjaHVuay5nZXRYKCk7XG4gICAgICAgICAgICAgICAgcGsuY2h1bmtaID0gY2h1bmsuZ2V0WigpO1xuICAgICAgICAgICAgICAgIHBrLmNsaWVudFN1YkNodW5rUmVxdWVzdHNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGsuc3ViQ2h1bmtDb3VudCA9IGNodW5rLmdldFRvcEVtcHR5KCkgKyA0O1xuICAgICAgICAgICAgICAgIHBrLmRhdGEgPSBjaHVuay5uZXR3b3JrU2VyaWFsaXplKCk7XG4gICAgICAgICAgICAgICAgYmF0Y2guYWRkUGFja2V0KHBrKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBDaHVuay5wYWNrWFooY2h1bmsuZ2V0WCgpLCBjaHVuay5nZXRaKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuZGVsZXRlKGhhc2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmRCYXRjaChiYXRjaCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbGF5ZXIudmlld0Rpc3RhbmNlICYmIChhd2FpdCB0aGlzLm5lZWROZXdDaHVua3MoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZ5IGEgY2xpZW50IGFib3V0IGNoYW5nZShzKSB0byB0aGUgYWR2ZW50dXJlIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYXllciAtIFRoZSBjbGllbnQtY29udHJvbGxlZCBlbnRpdHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFNldHRpbmdzKHBsYXllcj86IFBsYXllcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwbGF5ZXIgPz8gdGhpcy5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQWR2ZW50dXJlU2V0dGluZ3NQYWNrZXQoKTtcbiAgICAgICAgcGsud29ybGRJbW11dGFibGUgPSB0YXJnZXQuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcjtcbiAgICAgICAgcGsubm9BdHRhY2tpbmdQbGF5ZXJzID0gdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3I7XG4gICAgICAgIHBrLm5vQXR0YWNraW5nTW9icyA9IHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuU3BlY3RhdG9yO1xuICAgICAgICBway5hdXRvSnVtcCA9IHRydWU7IC8vIFRPRE86IGdyYWIgdGhpcyBpbmZvIGVsc2V3aGVyZVxuICAgICAgICBway5zaG93TmFtZVRhZ3MgPSB0cnVlOyAvLyBUT0RPOiBwbGF5ZXIgbWF5IGJlIGFibGUgdG8gaGlkZSB0aGVtXG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEFiaWxpdGllcyhwbGF5ZXI/OiBQbGF5ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGxheWVyID8/IHRoaXMucGxheWVyO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFVwZGF0ZUFiaWxpdGllc1BhY2tldCgpO1xuICAgICAgICBway5jb21tYW5kUGVybWlzc2lvbiA9IHRhcmdldC5pc09wKCkgPyBQZXJtaXNzaW9uVHlwZS5PcGVyYXRvciA6IFBlcm1pc3Npb25UeXBlLk5vcm1hbDtcbiAgICAgICAgcGsucGxheWVyUGVybWlzc2lvbiA9IHRhcmdldC5pc09wKCkgPyBQbGF5ZXJQZXJtaXNzaW9uVHlwZS5PcGVyYXRvciA6IFBsYXllclBlcm1pc3Npb25UeXBlLk1lbWJlcjtcbiAgICAgICAgcGsudGFyZ2V0QWN0b3JVbmlxdWVJZCA9IHRhcmdldC5nZXRSdW50aW1lSWQoKTtcblxuICAgICAgICBjb25zdCBtYWluTGF5ZXIgPSBuZXcgQWJpbGl0eUxheWVyKCk7XG4gICAgICAgIG1haW5MYXllci5sYXllclR5cGUgPSBBYmlsaXR5TGF5ZXJUeXBlLkJBU0U7XG4gICAgICAgIG1haW5MYXllci5sYXllckZsYWdzID0gbmV3IE1hcChbXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5GTFlfU1BFRUQsIHRydWVdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuV0FMS19TUEVFRCwgdHJ1ZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5NQVlfRkxZLCB0YXJnZXQuZ2V0QWxsb3dGbGlnaHQoKV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5GTFlJTkcsIHRhcmdldC5pc0ZseWluZygpXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk5PX0NMSVAsIHRhcmdldC5nYW1lbW9kZSA9PT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk9QRVJBVE9SX0NPTU1BTkRTLCB0YXJnZXQuaXNPcCgpXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLlRFTEVQT1JULCB0YXJnZXQuaXNPcCgpXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLklOVlVMTkVSQUJMRSwgdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5DcmVhdGl2ZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5NVVRFRCwgZmFsc2VdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuV09STERfQlVJTERFUiwgZmFsc2VdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuSU5TVEFCVUlMRCwgdGFyZ2V0LmdhbWVtb2RlID09PSBHYW1lbW9kZS5DcmVhdGl2ZV0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5MSUdIVE5JTkcsIGZhbHNlXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkJVSUxELCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5NSU5FLCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl0sXG4gICAgICAgICAgICBbQWJpbGl0eUxheWVyRmxhZy5ET09SU19BTkRfU1dJVENIRVMsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLk9QRU5fQ09OVEFJTkVSUywgdGFyZ2V0LmdhbWVtb2RlICE9PSBHYW1lbW9kZS5TcGVjdGF0b3JdLFxuICAgICAgICAgICAgW0FiaWxpdHlMYXllckZsYWcuQVRUQUNLX1BMQVlFUlMsIHRhcmdldC5nYW1lbW9kZSAhPT0gR2FtZW1vZGUuU3BlY3RhdG9yXSxcbiAgICAgICAgICAgIFtBYmlsaXR5TGF5ZXJGbGFnLkFUVEFDS19NT0JTLCB0YXJnZXQuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLlNwZWN0YXRvcl1cbiAgICAgICAgXSk7XG4gICAgICAgIG1haW5MYXllci5mbHlTcGVlZCA9IDAuMDU7XG4gICAgICAgIG1haW5MYXllci53YWxrU3BlZWQgPSAwLjE7XG5cbiAgICAgICAgcGsuYWJpbGl0eUxheWVycyA9IFttYWluTGF5ZXJdO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5lZWROZXdDaHVua3MoZm9yY2VSZXNlbmQgPSBmYWxzZSwgZGlzdD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXJyZW50WENodW5rID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy5wbGF5ZXIuZ2V0WCgpKTtcbiAgICAgICAgY29uc3QgY3VycmVudFpDaHVuayA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMucGxheWVyLmdldFooKSk7XG5cbiAgICAgICAgY29uc3Qgdmlld0Rpc3RhbmNlID0gdGhpcy5wbGF5ZXIudmlld0Rpc3RhbmNlIHx8IGRpc3QgfHwgMDtcblxuICAgICAgICBjb25zdCBjaHVua3NUb1NlbmRIZWFwID0gbmV3IEhlYXAoKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlzdFhGaXJzdCA9IE1hdGguYWJzKGFbMF0hIC0gY3VycmVudFhDaHVuayk7XG4gICAgICAgICAgICBjb25zdCBkaXN0WFNlY29uZCA9IE1hdGguYWJzKGJbMF0hIC0gY3VycmVudFhDaHVuayk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3RaRmlyc3QgPSBNYXRoLmFicyhhWzFdISAtIGN1cnJlbnRaQ2h1bmspO1xuICAgICAgICAgICAgY29uc3QgZGlzdFpTZWNvbmQgPSBNYXRoLmFicyhiWzFdISAtIGN1cnJlbnRaQ2h1bmspO1xuXG4gICAgICAgICAgICByZXR1cm4gZGlzdFhGaXJzdCArIGRpc3RaRmlyc3QgPiBkaXN0WFNlY29uZCArIGRpc3RaU2Vjb25kID8gMSA6IC0xO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGxldCBzZW5kWENodW5rID0gLXZpZXdEaXN0YW5jZTsgc2VuZFhDaHVuayA8PSB2aWV3RGlzdGFuY2U7IHNlbmRYQ2h1bmsrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgc2VuZFpDaHVuayA9IC12aWV3RGlzdGFuY2U7IHNlbmRaQ2h1bmsgPD0gdmlld0Rpc3RhbmNlOyBzZW5kWkNodW5rKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZFhDaHVuayAqIHNlbmRYQ2h1bmsgKyBzZW5kWkNodW5rICogc2VuZFpDaHVuayA+IHZpZXdEaXN0YW5jZSAqIHZpZXdEaXN0YW5jZSkgY29udGludWU7IC8vIGVhcmx5IGV4aXQgaWYgY2h1bmsgaXMgb3V0c2lkZSBvZiB2aWV3IGRpc3RhbmNlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2h1bmsgPSBbY3VycmVudFhDaHVuayArIHNlbmRYQ2h1bmssIGN1cnJlbnRaQ2h1bmsgKyBzZW5kWkNodW5rXTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmsucGFja1haKG5ld0NodW5rWzBdISwgbmV3Q2h1bmtbMV0hKTtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JjZVJlc2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3NUb1NlbmRIZWFwLnB1c2gobmV3Q2h1bmspO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubG9hZGVkQ2h1bmtzLmhhcyhoYXNoKSAmJiAhdGhpcy5sb2FkaW5nQ2h1bmtzLmhhcyhoYXNoKSkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua3NUb1NlbmRIZWFwLnB1c2gobmV3Q2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChjaHVua3NUb1NlbmRIZWFwLnNpemUoKSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3RDaHVuayA9IGNodW5rc1RvU2VuZEhlYXAucG9wKCkhO1xuICAgICAgICAgICAgY29uc3QgaGFzaCA9IENodW5rLnBhY2tYWihjbG9zZXN0Q2h1bmtbMF0hLCBjbG9zZXN0Q2h1bmtbMV0hKTtcbiAgICAgICAgICAgIGlmIChmb3JjZVJlc2VuZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWRDaHVua3MuaGFzKGhhc2gpICYmICF0aGlzLmxvYWRpbmdDaHVua3MuaGFzKGhhc2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5hZGQoaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdENodW5rKGNsb3Nlc3RDaHVua1swXSEsIGNsb3Nlc3RDaHVua1sxXSEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZENodW5rID0gYXdhaXQgdGhpcy5wbGF5ZXIuZ2V0V29ybGQoKS5nZXRDaHVuayhjbG9zZXN0Q2h1bmtbMF0hLCBjbG9zZXN0Q2h1bmtbMV0hKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ2h1bmsobG9hZGVkQ2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmFkZChoYXNoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RDaHVuayhjbG9zZXN0Q2h1bmtbMF0hLCBjbG9zZXN0Q2h1bmtbMV0hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1bmxvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaGFzaCBvZiB0aGlzLmxvYWRlZENodW5rcykge1xuICAgICAgICAgICAgY29uc3QgW3gsIHpdID0gQ2h1bmsudW5wYWNrWFooaGFzaCk7XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh4ISAtIGN1cnJlbnRYQ2h1bmspID4gdmlld0Rpc3RhbmNlIHx8IE1hdGguYWJzKHohIC0gY3VycmVudFpDaHVuaykgPiB2aWV3RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB1bmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuZGVsZXRlKGhhc2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHRoaXMubG9hZGluZ0NodW5rcykge1xuICAgICAgICAgICAgY29uc3QgW3gsIHpdID0gQ2h1bmsudW5wYWNrWFooaGFzaCk7XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh4ISAtIGN1cnJlbnRYQ2h1bmspID4gdmlld0Rpc3RhbmNlIHx8IE1hdGguYWJzKHohIC0gY3VycmVudFpDaHVuaykgPiB2aWV3RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdDaHVua3MuZGVsZXRlKGhhc2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bmxvYWRlZCAmJiB0aGlzLmNodW5rU2VuZFF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKGRpc3QgPz8gdmlld0Rpc3RhbmNlLCBbXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdENodW5rKHg6IG51bWJlciwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gYXdhaXQgdGhpcy5wbGF5ZXIuZ2V0V29ybGQoKS5nZXRDaHVuayh4LCB6KTtcbiAgICAgICAgdGhpcy5jaHVua1NlbmRRdWV1ZS5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY3VycmVudGx5IGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3MuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzdWFsbHkgdXNlZCBmb3IgY2hhbmdpbmcgZGltZW5zaW9uLCB3b3JsZCwgZXRjLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjbGVhckNodW5rcygpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRDaHVua3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nQ2h1bmtzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRJbnZlbnRvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IEludmVudG9yeUNvbnRlbnRQYWNrZXQoKTtcbiAgICAgICAgcGsuaXRlbXMgPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRJdGVtcyh0cnVlKTtcbiAgICAgICAgcGsud2luZG93SWQgPSBXaW5kb3dJZHMuSU5WRU5UT1JZOyAvLyBJbnZlbnRvcnkgd2luZG93XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZEhhbmRJdGVtKHRoaXMucGxheWVyLmdldEludmVudG9yeSgpLmdldEl0ZW1JbkhhbmQoKSk7XG5cbiAgICAgICAgLyogVE9ETzogbm90IHdvcmtpbmcuLlxuICAgICAgICBwayA9IG5ldyBJbnZlbnRvcnlDb250ZW50UGFja2V0KCk7XG4gICAgICAgIHBrLml0ZW1zID0gW107IC8vIFRPRE9cbiAgICAgICAgcGsud2luZG93SWQgPSA3ODsgLy8gQXJtb3JJbnZlbnRvcnkgd2luZG93XG4gICAgICAgIHRoaXMuc2VuZERhdGFQYWNrZXQocGspO1xuXG4gICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9OaWNsYXNPbG9mc3Nvbi9NaU5FVC9ibG9iL21hc3Rlci9zcmMvTWlORVQvTWlORVQvUGxheWVyLmNzI0wxNzM2XG4gICAgICAgIC8vIFRPRE86IGRvY3VtZW50YXRlIGFib3V0XG4gICAgICAgIDB4N2MgKHVpIGNvbnRlbnQpXG4gICAgICAgIDB4NzcgKG9mZiBoYW5kKVxuICAgICAgICAqL1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQ3JlYXRpdmVDb250ZW50cyhlbXB0eSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IENyZWF0aXZlQ29udGVudFBhY2tldCgpO1xuICAgICAgICBpZiAoZW1wdHkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5wbGF5ZXIuZ2V0U2VydmVyKCkuZ2V0QmxvY2tNYW5hZ2VyKCkuZ2V0QmxvY2tzKCksXG4gICAgICAgICAgICAuLi50aGlzLnBsYXllci5nZXRTZXJ2ZXIoKS5nZXRJdGVtTWFuYWdlcigpLmdldEl0ZW1zKClcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBTb3J0IGJhc2VkIG9uIFBtbVAgQmVkcm9jay1kYXRhXG4gICAgICAgIGNyZWF0aXZlaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBway5pdGVtcy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLmVudHJpZXNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm1ldGEgPT09IChpdGVtLmRhbWFnZSA/PyAwKSAmJiBlbnRyeS5nZXRJZCgpID09PSBpdGVtLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJdGVtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVudHJ5LmdldElkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YTogZW50cnkubWV0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaXRlbSBpbiB0aGUgcGxheWVyIGhhbmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBlbnRpdHkuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRIYW5kSXRlbShpdGVtOiBJdGVtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE1vYkVxdWlwbWVudFBhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsuaXRlbSA9IGl0ZW07XG4gICAgICAgIHBrLmludmVudG9yeVNsb3QgPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRIYW5kU2xvdEluZGV4KCk7XG4gICAgICAgIHBrLmhvdGJhclNsb3QgPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRIYW5kU2xvdEluZGV4KCk7XG4gICAgICAgIHBrLndpbmRvd0lkID0gMDsgLy8gSW52ZW50b3J5IElEXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRGb3JtKGZvcm06IElGb3JtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5wbGF5ZXIuZ2V0Rm9ybU1hbmFnZXIoKS5hZGRGb3JtKGZvcm0pO1xuICAgICAgICBjb25zdCBwayA9IG5ldyBNb2RhbEZvcm1SZXF1ZXN0UGFja2V0KCk7XG4gICAgICAgIHBrLmZvcm1JZCA9IGlkO1xuICAgICAgICBway5mb3JtRGF0YSA9IGZvcm0uanNvblNlcmlhbGl6ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2xpZW50J3MgY3VycmVudCB0aWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpY2sgLSBUaGUgdGlja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kVGltZSh0aWNrOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgU2V0VGltZVBhY2tldCgpO1xuICAgICAgICBway50aW1lID0gdGljaztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNsaWVudCdzIGdhbWVtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGdhbWVtb2RlIC0gdGhlIG51bWVyaWMgZ2FtZW1vZGUgSURcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEdhbWVtb2RlKGdhbWVtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQoKTtcbiAgICAgICAgcGsuZ2FtZW1vZGUgPSBnYW1lbW9kZTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE5ldHdvcmtDaHVua1B1Ymxpc2hlcihkaXN0YW5jZTogbnVtYmVyLCBzYXZlZENodW5rczogQ2h1bmtDb29yZFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE5ldHdvcmtDaHVua1B1Ymxpc2hlclVwZGF0ZVBhY2tldCgpO1xuICAgICAgICBway5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24uZnJvbVZlY3RvcjModGhpcy5wbGF5ZXIpO1xuICAgICAgICBway5yYWRpdXMgPSBkaXN0YW5jZSA8PCA0O1xuICAgICAgICBway5zYXZlZENodW5rcyA9IHNhdmVkQ2h1bmtzO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZW5kQXZhaWxhYmxlQ29tbWFuZHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0KCk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRDb21tYW5kTWFuYWdlcigpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZHNMaXN0KClcbiAgICAgICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZENsYXNzID0gQXJyYXkuZnJvbSh0aGlzLnNlcnZlci5nZXRDb21tYW5kTWFuYWdlcigpLmdldENvbW1hbmRzKCkudmFsdWVzKCkpLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChjbWQpID0+IGNtZC5pZC5zcGxpdCgnOicpWzFdID09PSBjb21tYW5kWzBdXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghY29tbWFuZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy53YXJuKGBDYW4ndCBmaW5kIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBjbGFzcyBmb3IgXCIke2NvbW1hbmRbMF19XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wbGF5ZXIuZ2V0U2VydmVyKCkuZ2V0UGVybWlzc2lvbk1hbmFnZXIoKS5jYW4odGhpcy5wbGF5ZXIpLmV4ZWN1dGUoY29tbWFuZENsYXNzLnBlcm1pc3Npb24pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZERhdGEoKTtcbiAgICAgICAgICAgICAgICBjbWQuY29tbWFuZE5hbWUgPSBjb21tYW5kWzBdO1xuICAgICAgICAgICAgICAgIGNtZC5jb21tYW5kRGVzY3JpcHRpb24gPSBjb21tYW5kQ2xhc3MuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRDbGFzcy5hbGlhc2VzIS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtZEFsaWFzZXMgPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgICAgICAgICAgICAgY21kQWxpYXNlcy5lbnVtTmFtZSA9IGAke2NvbW1hbmRbMF19QWxpYXNlc2A7XG4gICAgICAgICAgICAgICAgICAgIGNtZEFsaWFzZXMuZW51bVZhbHVlcyA9IGNvbW1hbmRDbGFzcy5hbGlhc2VzIS5jb25jYXQoY29tbWFuZFswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNtZC5hbGlhc2VzID0gY21kQWxpYXNlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21tYW5kWzJdLmZvckVhY2goKGFyZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHBhcmFtZXRlci5nZXRQYXJhbWV0ZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHJldHVybiBBcnJheS5mcm9tKHBhcmFtZXRlcnMudmFsdWVzKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlciBpbnN0YW5jZW9mIENvbW1hbmRBcmd1bWVudEVudGl0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICd0YXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBDb21tYW5kQXJndW1lbnRHYW1lbW9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICdnYW1lbW9kZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnU3RyaW5nQXJndW1lbnRUeXBlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6ICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnSW50ZWdlckFyZ3VtZW50VHlwZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGU6IENvbW1hbmRQYXJhbWV0ZXJUeXBlLkludFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpPy53YXJuKGBJbnZhbGlkIHBhcmFtZXRlciAke3BhcmFtZXRlci5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZTogQ29tbWFuZFBhcmFtZXRlclR5cGUuU3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmxhdCgpO1xuICAgICAgICAgICAgICAgICAgICBjbWQub3ZlcmxvYWRzW2luZGV4XSA9IHBhcmFtZXRlcnM7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGsuY29tbWFuZERhdGEucHVzaChjbWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBsYXllckVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgcGxheWVyRW51bS5lbnVtTmFtZSA9ICdQbGF5ZXInO1xuICAgICAgICBwbGF5ZXJFbnVtLmVudW1WYWx1ZXMgPSB0aGlzLnBsYXllclxuICAgICAgICAgICAgLmdldFNlcnZlcigpXG4gICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmFtZSgpKTtcbiAgICAgICAgcGsuc29mdEVudW1zID0gW3BsYXllckVudW1dO1xuICAgICAgICAvLyBUT0RPOiB1cGRhdGUgY29tbWFuZHNcbiAgICAgICAgLy8gYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2xpZW50J3MgbWF4aW11bSB2aWV3IGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpc3RhbmNlIC0gVGhlIHZpZXcgZGlzdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0Vmlld0Rpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wbGF5ZXIudmlld0Rpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IENodW5rUmFkaXVzVXBkYXRlZFBhY2tldCgpO1xuICAgICAgICBway5yYWRpdXMgPSBkaXN0YW5jZTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEF0dHJpYnV0ZXMoYXR0cmlidXRlczogQXR0cmlidXRlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQXR0cmlidXRlc1BhY2tldCgpO1xuICAgICAgICBway5ydW50aW1lRW50aXR5SWQgPSB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgcGsuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMubGVuZ3RoID4gMCA/IGF0dHJpYnV0ZXMgOiB0aGlzLnBsYXllci5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCkuZ2V0QXR0cmlidXRlcygpO1xuICAgICAgICBway50aWNrID0gQmlnSW50KDApOyAvLyBUT0RPXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlbmRNZXRhZGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgU2V0QWN0b3JEYXRhUGFja2V0KCk7XG4gICAgICAgIHBrLnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICBway5tZXRhZGF0YSA9IHRoaXMucGxheWVyLmdldE1ldGFkYXRhTWFuYWdlcigpO1xuICAgICAgICBway50aWNrID0gQmlnSW50KDApOyAvLyBUT0RPXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNoYXQgbWVzc2FnZSB0byB0aGUgY2xpZW50LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZWZhY3RvciB0aGlzIGNvbXBsZXRlbHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIHh1aWQgLSBUaGUgc291cmNlIHh1aWRcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtXG4gICAgICogQHBhcmFtIG5lZWRzVHJhbnNsYXRpb24gLSBJZiB0aGUgVGV4dFR5cGUgcmVxdWlyZXMgdHJhbnNsYXRpb25cbiAgICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0ZXh0IHR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgeHVpZCA9ICcnLFxuICAgICAgICBwYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IFtdLFxuICAgICAgICBuZWVkc1RyYW5zbGF0aW9uID0gZmFsc2UsXG4gICAgICAgIHR5cGUgPSBUZXh0VHlwZS5SYXdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlKSB0aHJvdyBuZXcgRXJyb3IoJ0EgbWVzc2FnZSBpcyByZXF1aXJlZCcpO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IFRleHRQYWNrZXQoKTtcbiAgICAgICAgcGsudHlwZSA9IHR5cGU7XG4gICAgICAgIHBrLnNvdXJjZU5hbWUgPSAnJztcbiAgICAgICAgcGsubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHBrLm5lZWRzVHJhbnNsYXRpb24gPSBuZWVkc1RyYW5zbGF0aW9uO1xuICAgICAgICBway54dWlkID0geHVpZDtcbiAgICAgICAgcGsucGxhdGZvcm1DaGF0SWQgPSAnJzsgLy8gVE9ET1xuICAgICAgICBway5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFRvYXN0KHRpdGxlOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRpdGxlKSB0aHJvdyBuZXcgRXJyb3IoJ0EgdG9hc3QgdGl0bGUgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgaWYgKCFib2R5KSB0aHJvdyBuZXcgRXJyb3IoJ0EgdG9hc3QgYm9keSBpcyByZXF1aXJlZC4nKTtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBUb2FzdFJlcXVlc3RQYWNrZXQoKTtcbiAgICAgICAgcGsudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcGsuYm9keSA9IGJvZHk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZENodW5rKGNodW5rOiBDaHVuayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBMZXZlbENodW5rUGFja2V0KCk7XG4gICAgICAgIHBrLmNodW5rWCA9IGNodW5rLmdldFgoKTtcbiAgICAgICAgcGsuY2h1bmtaID0gY2h1bmsuZ2V0WigpO1xuICAgICAgICBway5jbGllbnRTdWJDaHVua1JlcXVlc3RzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBway5zdWJDaHVua0NvdW50ID0gY2h1bmsuZ2V0VG9wRW1wdHkoKSArIDQ7IC8vIGFkZCB0aGUgdXNlbGVzcyBsYXllcnMgaGFja1xuICAgICAgICBway5kYXRhID0gY2h1bmsubmV0d29ya1NlcmlhbGl6ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGssIHVuZGVmaW5lZCwgZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGhhc2ggPSBDaHVuay5wYWNrWFooY2h1bmsuZ2V0WCgpLCBjaHVuay5nZXRaKCkpO1xuICAgICAgICB0aGlzLmxvYWRlZENodW5rcy5hZGQoaGFzaCk7XG4gICAgICAgIHRoaXMubG9hZGluZ0NodW5rcy5kZWxldGUoaGFzaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0IHRoZSBtb3ZlbWVudCB0byBhIGRlZmluZWQgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGJyb2FkY2FzdE1vdmUocGxheWVyOiBQbGF5ZXIsIG1vZGUgPSBNb3ZlbWVudFR5cGUuTm9ybWFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBrID0gbmV3IE1vdmVQbGF5ZXJQYWNrZXQoKTtcbiAgICAgICAgcGsucnVudGltZUVudGl0eUlkID0gcGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuXG4gICAgICAgIHBrLnBvc2l0aW9uWCA9IHBsYXllci5nZXRYKCk7XG4gICAgICAgIHBrLnBvc2l0aW9uWSA9IHBsYXllci5nZXRZKCk7XG4gICAgICAgIHBrLnBvc2l0aW9uWiA9IHBsYXllci5nZXRaKCk7XG5cbiAgICAgICAgcGsucGl0Y2ggPSBwbGF5ZXIucGl0Y2g7XG4gICAgICAgIHBrLnlhdyA9IHBsYXllci55YXc7XG4gICAgICAgIHBrLmhlYWRZYXcgPSBwbGF5ZXIuaGVhZFlhdztcblxuICAgICAgICBway5tb2RlID0gbW9kZTtcblxuICAgICAgICBway5vbkdyb3VuZCA9IHBsYXllci5pc09uR3JvdW5kKCk7XG5cbiAgICAgICAgLy8gVE9ET1xuICAgICAgICBpZiAobW9kZSA9PT0gTW92ZW1lbnRUeXBlLlRlbGVwb3J0KSB7XG4gICAgICAgICAgICBway50ZWxlcG9ydENhdXNlID0gMDtcbiAgICAgICAgICAgIHBrLnRlbGVwb3J0SXRlbUlkID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHBrLnJpZGluZ0VudGl0eVJ1bnRpbWVJZCA9IEJpZ0ludCgwKTtcbiAgICAgICAgcGsudGljayA9IEJpZ0ludCgwKTsgLy8gVE9ET1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uc2VuZERhdGFQYWNrZXQocGspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGNsaWVudCB0byB0aGUgcGxheWVyIGxpc3Qgb2YgZXZlcnkgcGxheWVyIGluc2lkZVxuICAgICAqIHRoZSBzZXJ2ZXIgYW5kIGFsc28gdG8gdGhlIHBsYXllciBpdHNlbGYuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGFkZFRvUGxheWVyTGlzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGxheWVyTGlzdCA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgICAgIHBsYXllckxpc3QudHlwZSA9IFBsYXllckxpc3RBY3Rpb24uVFlQRV9BREQ7XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgUGxheWVyTGlzdEVudHJ5KHtcbiAgICAgICAgICAgIHV1aWQ6IFVVSUQuZnJvbVN0cmluZyh0aGlzLnBsYXllci51dWlkKSxcbiAgICAgICAgICAgIHVuaXF1ZUVudGl0eWlkOiB0aGlzLnBsYXllci5nZXRSdW50aW1lSWQoKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMucGxheWVyLmdldE5hbWUoKSxcbiAgICAgICAgICAgIHh1aWQ6IHRoaXMucGxheWVyLnh1aWQsXG4gICAgICAgICAgICBwbGF0Zm9ybUNoYXRJZDogJycsIC8vIFRPRE86IHJlYWQgdGhpcyB2YWx1ZSBmcm9tIExvZ2luXG4gICAgICAgICAgICBidWlsZFBsYXRmb3JtOiB0aGlzLnBsYXllci5kZXZpY2UgPyB0aGlzLnBsYXllci5kZXZpY2Uub3MgOiAtMSxcbiAgICAgICAgICAgIHNraW46IHRoaXMucGxheWVyLnNraW4hLFxuICAgICAgICAgICAgaXNUZWFjaGVyOiBmYWxzZSwgLy8gVE9ETzogZmlndXJlIG91dCB3aGVyZSB0byByZWFkIHRlYWNoZXIgYW5kIGhvc3RcbiAgICAgICAgICAgIGlzSG9zdDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHBsYXllckxpc3QuZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNlcnZlci5icm9hZGNhc3RQYWNrZXQocGxheWVyTGlzdCk7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldFNlc3Npb25NYW5hZ2VyKCkuZ2V0UGxheWVyTGlzdCgpLnNldCh0aGlzLnBsYXllci51dWlkLCBlbnRyeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHBsYXllciBmcm9tIG90aGVyIHBsYXllcnMgbGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZW1vdmVGcm9tUGxheWVyTGlzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBsYXllci51dWlkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgUGxheWVyTGlzdFBhY2tldCgpO1xuICAgICAgICBway50eXBlID0gUGxheWVyTGlzdEFjdGlvbi5UWVBFX1JFTU9WRTtcblxuICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBQbGF5ZXJMaXN0RW50cnkoe1xuICAgICAgICAgICAgdXVpZDogVVVJRC5mcm9tU3RyaW5nKHRoaXMucGxheWVyLmdldFVVSUQoKSlcbiAgICAgICAgfSk7XG4gICAgICAgIHBrLmVudHJpZXMucHVzaChlbnRyeSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0U2Vzc2lvbk1hbmFnZXIoKS5nZXRQbGF5ZXJMaXN0KCkuZGVsZXRlKHRoaXMucGxheWVyLnV1aWQpO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChwbGF5ZXIpID0+IHBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChwaykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhlIGZ1bGwgcGxheWVyIGxpc3QgdG8gdGhlIHBsYXllci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFBsYXllckxpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBsYXllckxpc3QgPSBuZXcgUGxheWVyTGlzdFBhY2tldCgpO1xuICAgICAgICBwbGF5ZXJMaXN0LnR5cGUgPSBQbGF5ZXJMaXN0QWN0aW9uLlRZUEVfQUREO1xuICAgICAgICBwbGF5ZXJMaXN0LmVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuc2VydmVyLmdldFNlc3Npb25NYW5hZ2VyKCkuZ2V0UGxheWVyTGlzdCgpLnZhbHVlcygpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnNlbmREYXRhUGFja2V0KHBsYXllckxpc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwYXduIHRoZSBwbGF5ZXIgZm9yIGFub3RoZXIgcGxheWVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxheWVyIC0gdGhlIHBsYXllciB0byBzZW5kIHRoZSBBZGRQbGF5ZXJQYWNrZXQgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFNwYXduKHBsYXllcjogUGxheWVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghcGxheWVyLmdldFVVSUQoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCk/LmVycm9yKGBVVUlEIGZvciBwbGF5ZXIgJHtwbGF5ZXIuZ2V0TmFtZSgpfSBpcyB1bmRlZmluZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IEFkZFBsYXllclBhY2tldCgpO1xuICAgICAgICBway51dWlkID0gVVVJRC5mcm9tU3RyaW5nKHRoaXMucGxheWVyLmdldFVVSUQoKSk7IC8vIFRPRE86IHRlbXAgc29sdXRpb25cbiAgICAgICAgcGsucnVudGltZUVudGl0eUlkID0gdGhpcy5wbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgIHBrLm5hbWUgPSB0aGlzLnBsYXllci5nZXROYW1lKCk7XG5cbiAgICAgICAgcGsucG9zaXRpb25YID0gdGhpcy5wbGF5ZXIuZ2V0WCgpO1xuICAgICAgICBway5wb3NpdGlvblkgPSB0aGlzLnBsYXllci5nZXRZKCk7XG4gICAgICAgIHBrLnBvc2l0aW9uWiA9IHRoaXMucGxheWVyLmdldFooKTtcblxuICAgICAgICAvLyBUT0RPOiBtb3Rpb25cbiAgICAgICAgcGsubW90aW9uWCA9IDA7XG4gICAgICAgIHBrLm1vdGlvblkgPSAwO1xuICAgICAgICBway5tb3Rpb25aID0gMDtcblxuICAgICAgICBway5waXRjaCA9IHRoaXMucGxheWVyLnBpdGNoO1xuICAgICAgICBway55YXcgPSB0aGlzLnBsYXllci55YXc7XG4gICAgICAgIHBrLmhlYWRZYXcgPSB0aGlzLnBsYXllci5oZWFkWWF3O1xuXG4gICAgICAgIHBrLml0ZW0gPSB0aGlzLnBsYXllci5nZXRJbnZlbnRvcnkoKS5nZXRJdGVtSW5IYW5kKCk7XG5cbiAgICAgICAgcGsuZGV2aWNlSWQgPSB0aGlzLnBsYXllci5kZXZpY2U/LmlkID8/ICcnO1xuICAgICAgICBway5tZXRhZGF0YSA9IHRoaXMucGxheWVyLmdldE1ldGFkYXRhTWFuYWdlcigpO1xuICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspO1xuICAgICAgICAvLyBUT0RPOiBhd2FpdCB0aGlzLnNlbmRTZXR0aW5ncyhwbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Bhd24gdGhlIHBsYXllciBlbnRpdHkgZnJvbSBhbm90aGVyIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kRGVzcGF3bihwbGF5ZXI6IFBsYXllcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBSZW1vdmVBY3RvclBhY2tldCgpO1xuICAgICAgICBway51bmlxdWVFbnRpdHlJZCA9IHRoaXMucGxheWVyLmdldFJ1bnRpbWVJZCgpOyAvLyBXZSB1c2UgcnVudGltZSBhcyB1bmlxdWVcbiAgICAgICAgYXdhaXQgcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkuZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFBsYXlTdGF0dXMoc3RhdHVzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGsgPSBuZXcgUGxheVN0YXR1c1BhY2tldCgpO1xuICAgICAgICBway5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwaywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGtpY2socmVhc29uID0gJ3Vua25vd24gcmVhc29uJyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwayA9IG5ldyBEaXNjb25uZWN0UGFja2V0KCk7XG4gICAgICAgIHBrLnNraXBNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgIHBrLm1lc3NhZ2UgPSByZWFzb247XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5zZW5kRGF0YVBhY2tldChwaywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbm5lY3Rpb24oKTogQ2xpZW50Q29ubmVjdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBsYXllcigpOiBQbGF5ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXI7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbmdlRGltZW5zaW9uUGFja2V0LCBMZXZlbENodW5rUGFja2V0IH0gZnJvbSAnLi9uZXR3b3JrL1BhY2tldHMnO1xuaW1wb3J0IHsgRmxhZ1R5cGUsIE1ldGFkYXRhRmxhZyB9IGZyb20gJy4vZW50aXR5L01ldGFkYXRhJztcbmltcG9ydCB0eXBlIENoYXRFdmVudCBmcm9tICcuL2V2ZW50cy9jaGF0L0NoYXRFdmVudCc7XG5pbXBvcnQgdHlwZSBDaHVuayBmcm9tICcuL3dvcmxkL2NodW5rL0NodW5rJztcbmltcG9ydCB0eXBlIHsgQ2h1bmtDb29yZCB9IGZyb20gJy4vbmV0d29yay9wYWNrZXQvTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0JztcbmltcG9ydCB0eXBlIENsaWVudENvbm5lY3Rpb24gZnJvbSAnLi9uZXR3b3JrL0NsaWVudENvbm5lY3Rpb24nO1xuaW1wb3J0IENvbnRhaW5lckVudHJ5IGZyb20gJy4vaW52ZW50b3J5L0NvbnRhaW5lckVudHJ5JztcbmltcG9ydCBDb29yZGluYXRlVXRpbHMgZnJvbSAnLi93b3JsZC9Db29yZGluYXRlVXRpbHMnO1xuaW1wb3J0IHR5cGUgRGV2aWNlIGZyb20gJy4vdXRpbHMvRGV2aWNlJztcbmltcG9ydCBGb3JtTWFuYWdlciBmcm9tICcuL2Zvcm0vRm9ybU1hbmFnZXInO1xuaW1wb3J0IEdhbWVtb2RlIGZyb20gJy4vd29ybGQvR2FtZW1vZGUnO1xuaW1wb3J0IEh1bWFuIGZyb20gJy4vZW50aXR5L0h1bWFuJztcbmltcG9ydCB0eXBlIHsgSW5ldEFkZHJlc3MgfSBmcm9tICdAanNwcmlzbWFyaW5lL3Jha25ldCc7XG5pbXBvcnQgTW92ZW1lbnRUeXBlIGZyb20gJy4vbmV0d29yay90eXBlL01vdmVtZW50VHlwZSc7XG5pbXBvcnQgUGxheVN0YXR1c1R5cGUgZnJvbSAnLi9uZXR3b3JrL3R5cGUvUGxheVN0YXR1c1R5cGUnO1xuaW1wb3J0IFBsYXllclNlc3Npb24gZnJvbSAnLi9uZXR3b3JrL1BsYXllclNlc3Npb24nO1xuaW1wb3J0IFBsYXllclNldEdhbWVtb2RlRXZlbnQgZnJvbSAnLi9ldmVudHMvcGxheWVyL1BsYXllclNldEdhbWVtb2RlRXZlbnQnO1xuaW1wb3J0IFBsYXllclRvZ2dsZUZsaWdodEV2ZW50IGZyb20gJy4vZXZlbnRzL3BsYXllci9QbGF5ZXJUb2dnbGVGbGlnaHRFdmVudCc7XG5pbXBvcnQgUGxheWVyVG9nZ2xlU3ByaW50RXZlbnQgZnJvbSAnLi9ldmVudHMvcGxheWVyL1BsYXllclRvZ2dsZVNwcmludEV2ZW50JztcbmltcG9ydCB0eXBlIFNraW4gZnJvbSAnLi91dGlscy9za2luL1NraW4nO1xuaW1wb3J0IFRleHRUeXBlIGZyb20gJy4vbmV0d29yay90eXBlL1RleHRUeXBlJztcbmltcG9ydCBUaW1lciBmcm9tICcuL3V0aWxzL1RpbWVyJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBXaW5kb3dNYW5hZ2VyIGZyb20gJy4vaW52ZW50b3J5L1dpbmRvd01hbmFnZXInO1xuaW1wb3J0IHR5cGUgV29ybGQgZnJvbSAnLi93b3JsZC9Xb3JsZCc7XG5cbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuL1NlcnZlcic7XG5cbi8vIERlZmF1bHQgc3Bhd24gdmlldyBkaXN0YW5jZSB1c2VkIGluIHZhbmlsbGFcbmV4cG9ydCBjb25zdCBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTID0gNDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxheWVyIGV4dGVuZHMgSHVtYW4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogSW5ldEFkZHJlc3M7XG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrU2Vzc2lvbjogUGxheWVyU2Vzc2lvbjtcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBzdHJpbmdbXTtcblxuICAgIC8vIE9ubHkgdXNlZCBmb3IgbWV0cmljc1xuICAgIHByaXZhdGUgam9pblRpbWVyID0gbmV3IFRpbWVyKCk7XG5cbiAgICAvLyBUT0RPOiBmaW5pc2ggaW1wbGVtZW50YXRpb25cbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd3M6IFdpbmRvd01hbmFnZXI7XG5cbiAgICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyB1c2VybmFtZSA9IHtcbiAgICAgICAgcHJlZml4OiAnPCcsXG4gICAgICAgIHN1ZmZpeDogJz4nLFxuICAgICAgICBuYW1lOiAnJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgbG9jYWxlID0gJyc7XG4gICAgcHVibGljIHJhbmRvbUlkID0gMDtcblxuICAgIHB1YmxpYyB1dWlkID0gJyc7XG4gICAgcHVibGljIHh1aWQgPSAnJztcbiAgICBwdWJsaWMgc2tpbjogU2tpbiB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIHZpZXdEaXN0YW5jZSA9IDA7XG4gICAgcHVibGljIGdhbWVtb2RlID0gMDtcblxuICAgIHB1YmxpYyBwaXRjaCA9IDA7XG4gICAgcHVibGljIHlhdyA9IDA7XG4gICAgcHVibGljIGhlYWRZYXcgPSAwO1xuXG4gICAgcHJpdmF0ZSBvbkdyb3VuZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3ByaW50aW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBmbHlpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIHNuZWFraW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhbGxvd0ZpZ2h0ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgcGxhdGZvcm1DaGF0SWQgPSAnJztcblxuICAgIHB1YmxpYyBkZXZpY2U6IERldmljZSB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGNhY2hlU3VwcG9ydCA9IGZhbHNlO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGNodW5rU2VuZFF1ZXVlID0gbmV3IFNldDxDaHVuaz4oKTtcbiAgICBwdWJsaWMgY3VycmVudENodW5rOiBiaWdpbnQgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybXM6IEZvcm1NYW5hZ2VyO1xuXG4gICAgcHJpdmF0ZSBjaGF0SGFuZGxlcjogKGV2ZW50OiBDaGF0RXZlbnQpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBQbGF5ZXIncyBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ2xpZW50Q29ubmVjdGlvbiwgd29ybGQ6IFdvcmxkLCBzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICBzdXBlcih3b3JsZCwgc2VydmVyKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gY29ubmVjdGlvbi5nZXRSYWtOZXRTZXNzaW9uKCkuZ2V0QWRkcmVzcygpO1xuICAgICAgICB0aGlzLm5ldHdvcmtTZXNzaW9uID0gbmV3IFBsYXllclNlc3Npb24oc2VydmVyLCBjb25uZWN0aW9uLCB0aGlzKTtcbiAgICAgICAgdGhpcy53aW5kb3dzID0gbmV3IFdpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5mb3JtcyA9IG5ldyBGb3JtTWFuYWdlcigpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gW107XG4gICAgICAgIHRoaXMuam9pblRpbWVyLnJlc2V0KCk7XG5cbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgbWVzcyA6L1xuICAgICAgICB0aGlzLmNoYXRIYW5kbGVyID0gYXN5bmMgKGV2dDogQ2hhdEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZ0LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVE9ETzogcHJvcGVyIGNoYW5uZWwgc3lzdGVtXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXZ0LmdldENoYXQoKS5nZXRDaGFubmVsKCkgPT09ICcqLmV2ZXJ5b25lJyB8fFxuICAgICAgICAgICAgICAgIChldnQuZ2V0Q2hhdCgpLmdldENoYW5uZWwoKSA9PT0gJyoub3BzJyAmJiB0aGlzLmlzT3AoKSkgfHxcbiAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmdldENoYW5uZWwoKSA9PT0gYCoucGxheWVyLiR7dGhpcy5nZXROYW1lKCl9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0TWVzc2FnZSgpLFxuICAgICAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmdldFR5cGUoKSBhcyBudW1iZXIgYXMgVGV4dFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGV2dC5nZXRDaGF0KCkuZ2V0UGFyYW1ldGVycygpLFxuICAgICAgICAgICAgICAgICAgICBldnQuZ2V0Q2hhdCgpLmlzTmVlZHNUcmFuc2xhdGlvbigpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZXJ2ZXIuZ2V0RXZlbnRNYW5hZ2VyKCkub24oJ2NoYXQnLCB0aGlzLmNoYXRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25FbmFibGUoKSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFNlcnZlcigpLmdldFBlcm1pc3Npb25NYW5hZ2VyKCkuZ2V0UGVybWlzc2lvbnModGhpcyk7XG5cbiAgICAgICAgY29uc3QgcGxheWVyRGF0YSA9IGF3YWl0IHRoaXMuZ2V0V29ybGQoKS5nZXRQbGF5ZXJEYXRhKHRoaXMpO1xuXG4gICAgICAgIC8vIHZvaWQgdGhpcy5zZXRHYW1lbW9kZShHYW1lbW9kZS5nZXRHYW1lbW9kZUlkKHBsYXllckRhdGEuZ2FtZW1vZGUpKTtcbiAgICAgICAgLy8gVE9ETzogY2FsbGluZyB0aGlzIGJlZm9yZSB0aGUgcGxheWVyIGlzIHNwYXduaW5nIHdpbGwgY3JlYXRlIGFuIHVuZGVmaW5lZCBiZWhhdmlvclxuICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBhIFNldFBsYXllckdhbWVUeXBlIHBhY2tldCBicmVha2luZyB0aGUgbG9naW4gc2VxdWVuY2VcbiAgICAgICAgLy8gaSdsbCBrZWVwIHRoaXMgY29tbWVudCB3aGlsZSBpdCdzIGJyb2tlblxuICAgICAgICBhd2FpdCB0aGlzLnNldFgocGxheWVyRGF0YS5wb3NpdGlvbi54KTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRZKHBsYXllckRhdGEucG9zaXRpb24ueSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WihwbGF5ZXJEYXRhLnBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnBpdGNoID0gcGxheWVyRGF0YS5wb3NpdGlvbi5waXRjaDtcbiAgICAgICAgdGhpcy55YXcgPSBwbGF5ZXJEYXRhLnBvc2l0aW9uLnlhdztcblxuICAgICAgICBwbGF5ZXJEYXRhLmludmVudG9yeS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRJdGVtTWFuYWdlcigpLmdldEl0ZW0oaXRlbS5pZCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrKGl0ZW0uaWQpO1xuXG4gICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKS5nZXRMb2dnZXIoKT8ud2FybihgSXRlbS9ibG9jayB3aXRoIGlkICR7aXRlbS5pZH0gaXMgaW52YWxpZGAsICdQbGF5ZXIvb25FbmFibGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0SW52ZW50b3J5KCkuc2V0SXRlbShcbiAgICAgICAgICAgICAgICBpdGVtLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG5ldyBDb250YWluZXJFbnRyeSh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IGVudHJ5LFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogaXRlbS5jb3VudFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKVxuICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAgID8uZGVidWcoYChDb21wbGV0ZSBwbGF5ZXIgY3JlYXRpb24gdG9vayAke3RoaXMuam9pblRpbWVyLnN0b3AoKX0gbXMpYCwgJ1BsYXllci9vbkVuYWJsZScpO1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkICYmIHRoaXMueHVpZCkgYXdhaXQgdGhpcy5nZXRXb3JsZCgpLnNhdmVQbGF5ZXJEYXRhKHRoaXMpO1xuICAgICAgICB0aGlzLnNlcnZlci5nZXRFdmVudE1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcignY2hhdCcsIHRoaXMuY2hhdEhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBtYXRjaCB2YW5pbGxhIGJlaGF2aW9yLCB3aWxsIHNlbmQgY2h1bmtzXG4gICAgICogd2l0aCBhbiBpbml0aWFsIHZpZXcgcmFkaXVzIG9mIFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlbmRJbml0aWFsU3Bhd25DaHVua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1pblggPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLngpIC0gVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUztcbiAgICAgICAgY29uc3QgbWluWiA9IENvb3JkaW5hdGVVdGlscy5mcm9tQmxvY2tUb0NodW5rKHRoaXMueikgLSBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTO1xuICAgICAgICBjb25zdCBtYXhYID0gQ29vcmRpbmF0ZVV0aWxzLmZyb21CbG9ja1RvQ2h1bmsodGhpcy54KSArIFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVM7XG4gICAgICAgIGNvbnN0IG1heFogPSBDb29yZGluYXRlVXRpbHMuZnJvbUJsb2NrVG9DaHVuayh0aGlzLnopICsgVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUztcblxuICAgICAgICBjb25zdCBzYXZlZENodW5rczogQ2h1bmtDb29yZFtdID0gW107XG4gICAgICAgIGNvbnN0IHNlbmRRdWV1ZTogQXJyYXk8UHJvbWlzZTxDaHVuaz4+ID0gW107XG4gICAgICAgIGZvciAobGV0IGNodW5rWCA9IG1pblg7IGNodW5rWCA8PSBtYXhYOyArK2NodW5rWCkge1xuICAgICAgICAgICAgZm9yIChsZXQgY2h1bmtaID0gbWluWjsgY2h1bmtaIDw9IG1heFo7ICsrY2h1bmtaKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogdmFuaWxsYSBkb2VzIG5vdCBzZW5kIGFsbCBvZiB0aGVtLCBidXQgaW4gYSByYW5nZVxuICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlIGl0IGRvZXMgc2VuZCB0aGVtIGZyb20geCA9PiBbLTM7IDNdIGFuZCB6ID0+IFstMzsgMl1cbiAgICAgICAgICAgICAgICBzYXZlZENodW5rcy5wdXNoKHsgeDogY2h1bmtYLCB6OiBjaHVua1ogfSk7XG4gICAgICAgICAgICAgICAgc2VuZFF1ZXVlLnB1c2godGhpcy5nZXRXb3JsZCgpLmdldENodW5rKGNodW5rWCwgY2h1bmtaKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmROZXR3b3JrQ2h1bmtQdWJsaXNoZXIoVkFOSUxMQV9ERUZBVUxUX1NQQVdOX1JBRElVUywgc2F2ZWRDaHVua3MpO1xuXG4gICAgICAgIGNvbnN0IGdldFVuaXF1ZUNodW5rcyA9IChzZW5kTGlzdDogQ2h1bmtDb29yZFtdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4U2V0ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgICAgICBjb25zdCB6U2V0ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY29vcmQgb2Ygc2VuZExpc3QpIHtcbiAgICAgICAgICAgICAgICB4U2V0LmFkZChjb29yZC54KTtcbiAgICAgICAgICAgICAgICB6U2V0LmFkZChjb29yZC56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHhTZXQuc2l6ZSArIHpTZXQuc2l6ZSkgLyAyKTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdldFVuaXF1ZUNodW5rcyhzYXZlZENodW5rcyk7ICsraSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5zZW5kTmV0d29ya0NodW5rUHVibGlzaGVyKFZBTklMTEFfREVGQVVMVF9TUEFXTl9SQURJVVMsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc2VuZFF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRDaHVuayhjaHVuayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIHBsYXllcidzIGN1cnJlbnQgd29ybGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd29ybGQgLSB0aGUgbmV3IHdvcmxkXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNldFdvcmxkKHdvcmxkOiBXb3JsZCkge1xuICAgICAgICBjb25zdCBkaW0wID0gbmV3IENoYW5nZURpbWVuc2lvblBhY2tldCgpO1xuICAgICAgICBkaW0wLmRpbWVuc2lvbiA9IDA7XG4gICAgICAgIGRpbTAucG9zaXRpb24gPSB0aGlzO1xuICAgICAgICBkaW0wLnJlc3Bhd24gPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBkaW0xID0gbmV3IENoYW5nZURpbWVuc2lvblBhY2tldCgpO1xuICAgICAgICBkaW0xLmRpbWVuc2lvbiA9IDE7XG4gICAgICAgIGRpbTEucG9zaXRpb24gPSBuZXcgVmVjdG9yMygwLCAwLCAwKTsgLy8gVE9ETzogbG9hZCB0aGlzIHByb3Blcmx5XG4gICAgICAgIGRpbTEucmVzcGF3biA9IGZhbHNlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KGRpbTApO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMSk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0V29ybGQoKS5yZW1vdmVFbnRpdHkodGhpcyk7XG4gICAgICAgIGF3YWl0IHdvcmxkLmFkZEVudGl0eSh0aGlzKTtcbiAgICAgICAgYXdhaXQgc3VwZXIuc2V0V29ybGQuYmluZCh0aGlzKSh3b3JsZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zZXRQb3NpdGlvbihuZXcgVmVjdG9yMygwLCAwLCAwKSk7XG4gICAgICAgIGZvciAobGV0IHggPSAtMzsgeCA8IDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeiA9IC0zOyB6IDwgMzsgeisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuICAgICAgICAgICAgICAgIHBrLmNsaWVudFN1YkNodW5rUmVxdWVzdHNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGsuY2h1bmtYID0geDsgLy8gVE9ET1xuICAgICAgICAgICAgICAgIHBrLmNodW5rWiA9IHo7IC8vIFRPRE9cbiAgICAgICAgICAgICAgICBway5kYXRhID0gQnVmZmVyLmZyb20oJycpO1xuICAgICAgICAgICAgICAgIHBrLnN1YkNodW5rQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KGRpbTEpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoZGltMCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuXG4gICAgICAgIHRoaXMuY3VycmVudENodW5rID0gbnVsbDtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi5jbGVhckNodW5rcygpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLm5lZWROZXdDaHVua3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPbmxpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKHRpY2s6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBDYWxsIHN1cGVyIG1ldGhvZFxuICAgICAgICBhd2FpdCBzdXBlci51cGRhdGUuYmluZCh0aGlzKSh0aWNrKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrU2Vzc2lvbi51cGRhdGUodGljayk7XG5cbiAgICAgICAgLy8gVE9ETzogZ2V0IGRvY3VtZW50YXRpb24gYWJvdXQgdGltaW5ncyBmcm9tIHZhbmlsbGFcbiAgICAgICAgLy8gMSBzZWNvbmQgLyAyMCA9IDEgdGljaywgMjAgKiA1ID0gMSBzZWNvbmRcbiAgICAgICAgLy8gMSBzZWNvbmQgKiA2MCA9IDEgbWludXRlXG4gICAgICAgIGlmICh0aWNrICUgKDIwICogNSAqIDYwICogMSkgPT09IDApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZFRpbWUodGljayk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHRoaXMuY2h1bmtTZW5kUXVldWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZE5ldHdvcmtDaHVua1B1Ymxpc2hlcih0aGlzLnZpZXdEaXN0YW5jZSB8fCBWQU5JTExBX0RFRkFVTFRfU1BBV05fUkFESVVTLCBbXSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRDaHVuayhjaHVuayk7XG4gICAgICAgICAgICB0aGlzLmNodW5rU2VuZFF1ZXVlLmRlbGV0ZShjaHVuayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMga2ljayhyZWFzb24gPSAndW5rbm93biByZWFzb24nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKClcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy52ZXJib3NlKGBQbGF5ZXIgd2l0aCBpZCDCp2Ike3RoaXMuZ2V0UnVudGltZUlkKCl9wqdyIHdhcyBraWNrZWQ6ICR7cmVhc29ufWAsICdQbGF5ZXIva2ljaycpO1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLmtpY2socmVhc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvKiBcbiAgICAgICAgICAgIFRPRE9cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdGhpcy5nZXRTZXJ2ZXIoKVxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kU2V0dGluZ3ModGhpcyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTsgKi9cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBzYW1lIGNodW5rLC5cbiAgICAvLyBUT0RPOiBtb3ZlIHRvIHdvcmxkXG4gICAgcHVibGljIGdldFBsYXllcnNJbkNodW5rKCk6IFBsYXllcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VydmVyKClcbiAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAuZmlsdGVyKChwbGF5ZXIpID0+IHBsYXllci5nZXRDdXJyZW50Q2h1bmsoKSA9PT0gdGhpcy5nZXRDdXJyZW50Q2h1bmsoKSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdGhlc2VcbiAgICBwdWJsaWMgYXN5bmMgc2VuZFNwYXduKCkge31cbiAgICBwdWJsaWMgYXN5bmMgc2VuZERlc3Bhd24oKSB7fVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNoYXQgbWVzc2FnZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgdHlwZTogVGV4dFR5cGUgPSBUZXh0VHlwZS5SYXcsXG4gICAgICAgIHBhcmFtZXRlcnM6IHN0cmluZ1tdID0gW10sXG4gICAgICAgIG5lZWRzVHJhbnNsYXRpb24gPSBmYWxzZVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUT0RPOiBEbyB0aGlzIHByb3Blcmx5IGxpa2UgamF2YSBlZGl0aW9uLFxuICAgICAgICAvLyBpbiBvdGhlciB3b3JkcywgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIEpTT04gZm9ybWF0dGVkLlxuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRNZXNzYWdlKG1lc3NhZ2UsICcnLCBwYXJhbWV0ZXJzLCBuZWVkc1RyYW5zbGF0aW9uLCB0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgdG9hc3Qgbm90aWZpY2F0aW9uIChsaWtlIFhib3ggTGl2ZSBub3RpZmljYXRpb25zKVxuICAgICAqIEBwYXJhbSB0aXRsZSAtIHRoZSB0b2FzdCB0aXRsZVxuICAgICAqIEBwYXJhbSBib2R5IC0gdGhlIHRvYXN0IGJvZHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZFRvYXN0KHRpdGxlOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRUb2FzdCh0aXRsZSwgYm9keSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEdhbWVtb2RlKG1vZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQbGF5ZXJTZXRHYW1lbW9kZUV2ZW50KHRoaXMsIG1vZGUpO1xuICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEV2ZW50TWFuYWdlcigpLnBvc3QoWydwbGF5ZXJTZXRHYW1lbW9kZScsIGV2ZW50XSk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5nYW1lbW9kZSA9IGV2ZW50LmdldEdhbWVtb2RlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uc2VuZEdhbWVtb2RlKHRoaXMuZ2FtZW1vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmdhbWVtb2RlID09PSBHYW1lbW9kZS5DcmVhdGl2ZSB8fCB0aGlzLmdhbWVtb2RlID09PSBHYW1lbW9kZS5TcGVjdGF0b3IpIHRoaXMuYWxsb3dGaWdodCA9IHRydWU7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxvd0ZpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEZseWluZyhmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHYW1lbW9kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gR2FtZW1vZGUuZ2V0R2FtZW1vZGVOYW1lKHRoaXMuZ2FtZW1vZGUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5ldHdvcmtTZXNzaW9uKCk6IFBsYXllclNlc3Npb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrU2Vzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VybmFtZS5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRVc2VybmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy51c2VybmFtZS5wcmVmaXh9JHt0aGlzLnVzZXJuYW1lLm5hbWV9JHt0aGlzLnVzZXJuYW1lLnN1ZmZpeH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQZXJtaXNzaW9ucygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVVUlEKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy51dWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3V1aWQgaXMgbWlzc2luZyEnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy51dWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRYVUlEKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy54dWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3h1aWQgaXMgbWlzc2luZyEnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy54dWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtTWFuYWdlcigpOiBGb3JtTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRXaW5kb3dzKCk6IFdpbmRvd01hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy53aW5kb3dzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxvd0ZsaWdodCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsb3dGaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQbGF5ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBgUGxheWVyYCBpcyBhbiBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHBsYXllciBpcyBhbiBvcGVyYXRvciBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VydmVyKCkuZ2V0UGVybWlzc2lvbk1hbmFnZXIoKS5pc09wKHRoaXMuZ2V0TmFtZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgYFBsYXllcmAgaXMgc3ByaW50aW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgcGxheWVyIGlzIHNwcmludGluZyBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTcHJpbnRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwcmludGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0U3ByaW50aW5nKHNwcmludGluZzogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3ByaW50aW5nID09PSB0aGlzLmlzU3ByaW50aW5nKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQbGF5ZXJUb2dnbGVTcHJpbnRFdmVudCh0aGlzLCBzcHJpbnRpbmcpO1xuICAgICAgICB0aGlzLmdldFNlcnZlcigpLmdldEV2ZW50TWFuYWdlcigpLnBvc3QoWydwbGF5ZXJUb2dnbGVTcHJpbnQnLCBldmVudF0pO1xuICAgICAgICBpZiAoZXZlbnQuaXNDYW5jZWxsZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc3ByaW50aW5nID0gZXZlbnQuZ2V0SXNTcHJpbnRpbmcoKTtcblxuICAgICAgICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBwdXQgdGhpc1xuICAgICAgICB0aGlzLnNldERhdGFGbGFnKE1ldGFkYXRhRmxhZy5JTkRFWCwgTWV0YWRhdGFGbGFnLlNQUklOVElORywgdGhpcy5pc1NwcmludGluZygpLCBGbGFnVHlwZS5CWVRFKTtcblxuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtTZXNzaW9uLnNlbmRNZXRhZGF0YSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZseWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmx5aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRGbHlpbmcoZmx5aW5nOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChmbHlpbmcgPT09IHRoaXMuaXNGbHlpbmcoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0QWxsb3dGbGlnaHQoKSkge1xuICAgICAgICAgICAgdGhpcy5mbHlpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFBsYXllclRvZ2dsZUZsaWdodEV2ZW50KHRoaXMsIGZseWluZyk7XG4gICAgICAgIHRoaXMuZ2V0U2VydmVyKCkuZ2V0RXZlbnRNYW5hZ2VyKCkucG9zdChbJ3BsYXllclRvZ2dsZUZsaWdodCcsIGV2ZW50XSk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5mbHlpbmcgPSBldmVudC5nZXRJc0ZseWluZygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1NuZWFraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbmVha2luZztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0U25lYWtpbmcodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc25lYWtpbmcgPSB2YWw7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzT25Hcm91bmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9uR3JvdW5kO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRPbkdyb3VuZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdGhpcy5vbkdyb3VuZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMub25Hcm91bmQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyB3aWxsIG5vdGlmeSB0aGUgcGxheWVyJ3MgY2xpZW50IGFib3V0IHRoZSBwb3NpdGlvbiBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHlwZSAtIFRoZSBtb3ZlbWVudCB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNldFBvc2l0aW9uKHBvc2l0aW9uOiBWZWN0b3IzLCB0eXBlOiBNb3ZlbWVudFR5cGUgPSBNb3ZlbWVudFR5cGUuTm9ybWFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0WChwb3NpdGlvbi5nZXRYKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFkocG9zaXRpb24uZ2V0WSgpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRaKHBvc2l0aW9uLmdldFooKSk7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya1Nlc3Npb24uYnJvYWRjYXN0TW92ZSh0aGlzLCB0eXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VycmVudENodW5rKGNodW5rOiBiaWdpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rID09PSBjaHVuaykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRDaHVuayA9IGNodW5rO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50Q2h1bmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaHVuayE7XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBMb2dnZXIsIFBsYXllciwgU2VydmVyIH0gZnJvbSAnLi4vJztcbmltcG9ydCB7IFBsYXllclNlc3Npb24gfSBmcm9tICcuLi8nO1xuXG5pbXBvcnQgeyBEaXNjb25uZWN0UGFja2V0IH0gZnJvbSAnLi9QYWNrZXRzJztcbmltcG9ydCBNaW5lY3JhZnRTZXNzaW9uIGZyb20gJy4vTWluZWNyYWZ0U2Vzc2lvbic7XG5pbXBvcnQgdHlwZSB7IFJha05ldFNlc3Npb24gfSBmcm9tICdAanNwcmlzbWFyaW5lL3Jha25ldCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgY29ubmVjdGlvbiBiZWZvcmUgdGhlIHBsYXllciBjcmVhdGlvbiBpdHNlbGYsIHZlcnkgaGVscGZ1bCBhc1xuICogaXQgaGVscHMgdG8gbm90IHdhc3RlIHJlc291cmNlcyBpbiBjYXNlIHRoZSBjbGllbnQgdHJ5aW5nIHRvIGNvbm5lY3QgaXMgc2ltcGx5XG4gKiBvdXRkYXRlZCBvciBzZW5kcyBpbnZhbGlkIGRhdGEgZHVyaW5nIHRoZSBsb2dpbiBoYW5kc2hha2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudENvbm5lY3Rpb24gZXh0ZW5kcyBNaW5lY3JhZnRTZXNzaW9uIHtcbiAgICBwcml2YXRlIHBsYXllclNlc3Npb246IFBsYXllclNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgaGFzQ29tcHJlc3Npb24gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXNzaW9uOiBSYWtOZXRTZXNzaW9uLCBsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICAgICAgc3VwZXIoc2Vzc2lvbiwgbG9nZ2VyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXJ2ZXIgLSB0aGUgc2VydmVyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHBsYXllciAtIHRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB0aGUgbmV3IHBsYXllciBzZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGluaXRQbGF5ZXJDb25uZWN0aW9uKHNlcnZlcjogU2VydmVyLCBwbGF5ZXI6IFBsYXllcik6IFBsYXllclNlc3Npb24ge1xuICAgICAgICBhc3NlcnQodGhpcy5wbGF5ZXJTZXNzaW9uID09PSBudWxsLCAnUGxheWVyIHNlc3Npb24gd2FzIGFscmVhZHkgY3JlYXRlZCcpO1xuXG4gICAgICAgIHRoaXMucGxheWVyU2Vzc2lvbiA9IG5ldyBQbGF5ZXJTZXNzaW9uKHNlcnZlciwgdGhpcywgcGxheWVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyU2Vzc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzY29ubmVjdChyZWFzb24gPSAnZGlzY29ubmVjdC5kaXNjb25uZWN0ZWQnLCBoaWRlUmVhc29uID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgRGlzY29ubmVjdFBhY2tldCgpO1xuICAgICAgICBwYWNrZXQuc2tpcE1lc3NhZ2UgPSBoaWRlUmVhc29uO1xuICAgICAgICBwYWNrZXQubWVzc2FnZSA9IHJlYXNvbjtcbiAgICAgICAgdm9pZCB0aGlzLnNlbmREYXRhUGFja2V0KHBhY2tldCk7XG5cbiAgICAgICAgLy8gRm9yY2UgUmFrTmV0IHRvIHJlbW92ZSB0aGUgc2Vzc2lvblxuICAgICAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGUgZGVhZCBzZXNzaW9uXG4gICAgICAgIHRoaXMucmFrU2Vzc2lvbi5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBsYXllclNlc3Npb24oKTogUGxheWVyU2Vzc2lvbiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXJTZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSYWtOZXRTZXNzaW9uKCk6IFJha05ldFNlc3Npb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5yYWtTZXNzaW9uO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIEhhbmRsZXJzIGZyb20gJy4vSGFuZGxlcnMnO1xuaW1wb3J0ICogYXMgUGFja2V0cyBmcm9tICcuL1BhY2tldHMnO1xuXG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi9JZGVudGlmaWVycyc7XG5pbXBvcnQgdHlwZSBQYWNrZXRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9QYWNrZXRIYW5kbGVyJztcbmltcG9ydCB0eXBlIHsgUGxheWVyU2Vzc2lvbiB9IGZyb20gJy4uLyc7XG5pbXBvcnQgdHlwZSBQcmVMb2dpblBhY2tldEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL1ByZUxvZ2luUGFja2V0SGFuZGxlcic7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCBUaW1lciBmcm9tICcuLi91dGlscy9UaW1lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhY2tldFJlZ2lzdHJ5IHtcbiAgICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0czogTWFwPG51bWJlciwgdHlwZW9mIFBhY2tldHMuRGF0YVBhY2tldD4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogTWFwPG51bWJlciwgUGFja2V0SGFuZGxlcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25FbmFibGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJQYWNrZXRzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJIYW5kbGVycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYWNrZXRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBwYWNrZXQuXG4gICAgICogQHBhcmFtIHBhY2tldCAtIHRoZSBwYWNrZXQuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyUGFja2V0KHBhY2tldDogdHlwZW9mIFBhY2tldHMuRGF0YVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWNrZXRzLmhhcyhwYWNrZXQuTmV0SUQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQYWNrZXQgJHtwYWNrZXQubmFtZX0gaXMgdHJ5aW5nIHRvIHVzZSBpZCAke3BhY2tldC5OZXRJRC50b1N0cmluZygxNil9IHdoaWNoIGFscmVhZHkgZXhpc3RzIWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5wYWNrZXRzLnNldChwYWNrZXQuTmV0SUQsIHBhY2tldCk7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpPy5kZWJ1ZyhgUGFja2V0IHdpdGggaWQgwqdiJHtwYWNrZXQubmFtZX3Cp3IgcmVnaXN0ZXJlZGAsICdQYWNrZXRSZWdpc3RyeS9yZWdpc3RlclBhY2tldCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBhY2tldCBieSBpdCdzIG5ldHdvcmsgSUQuXG4gICAgICogQHBhcmFtIGlkIC0gdGhlIE5ldElELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWNrZXQoaWQ6IG51bWJlcik6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5wYWNrZXRzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrZXQgd2l0aCBpZCAke2lkfSFgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRzLmdldChpZCkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHBhY2tldCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKiBAcGFyYW0gaWQgLSB0aGUgTmV0SUQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVBhY2tldChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFja2V0cy5kZWxldGUoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IG51bWJlciwgaGFuZGxlcjogUGFja2V0SGFuZGxlcjxhbnk+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzLmhhcyhpZCkpIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIWApO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMuc2V0KGlkLCBoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy5kZWJ1ZyhgSGFuZGxlciB3aXRoIGlkIMKnYiR7aGFuZGxlci5jb25zdHJ1Y3Rvci5uYW1lfcKnciByZWdpc3RlcmVkYCwgJ1BhY2tldFJlZ2lzdHJ5L3JlZ2lzdGVySGFuZGxlcicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRIYW5kbGVyKGlkOiBudW1iZXIpOiBQYWNrZXRIYW5kbGVyPGFueT4gfCBQcmVMb2dpblBhY2tldEhhbmRsZXI8YW55PiB7XG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5oYXMoaWQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaGFuZGxlciB3aXRoIGlkICR7aWQudG9TdHJpbmcoMTYpfSFgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5nZXQoaWQpITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSB0d28gaGFuZGxlcnMuXG4gICAgICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZXh0ZW5kIGEgaGFuZGxlciB3aXRob3V0IGFjdHVhbGx5IHJlcGxhY2luZyBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIGZpcnN0IGhhbmRsZXIsIGV4ZWN1dGVkIGZpcnN0LlxuICAgICAqIEBwYXJhbSBoYW5kbGVyMiAtIHRoZSBzZWNvbmQgaGFuZGxlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwZW5kSGFuZGxlcihoYW5kbGVyOiBQYWNrZXRIYW5kbGVyPGFueT4sIGhhbmRsZXIyOiBQYWNrZXRIYW5kbGVyPGFueT4pOiBQYWNrZXRIYW5kbGVyPGFueT4ge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgKGNsYXNzIEhhbmRsZXIge1xuICAgICAgICAgICAgcHVibGljIGFzeW5jIGhhbmRsZShwYWNrZXQ6IGFueSwgc2VydmVyOiBTZXJ2ZXIsIHNlc3Npb246IFBsYXllclNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZShwYWNrZXQsIHNlcnZlciwgc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcjIuaGFuZGxlKHBhY2tldCwgc2VydmVyLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4gcmVzIGFzIFBhY2tldEhhbmRsZXI8YW55PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBoYW5kbGVyIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqIEBwYXJhbSBpZCAtIHRoZSBoYW5kbGVyIGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVIYW5kbGVyKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5kZWxldGUoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGFsbCBwYWNrZXRzIGV4cG9ydGVkIGJ5ICcuL1Byb3RvY29sJy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGFja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGltZXIgPSBuZXcgVGltZXIoKTtcblxuICAgICAgICAvLyBEeW5hbWljYWxseSByZWdpc3RlciBwYWNrZXRzXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFudWFsbHkgaWdub3JlIERhdGFQYWNrZXQgJiBCYXRjaFBhY2tldFxuICAgICAgICBPYmplY3QuZW50cmllcyhQYWNrZXRzKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZS5uYW1lICE9PSAnRGF0YVBhY2tldCcgJiYgdmFsdWUubmFtZSAhPT0gJ0JhdGNoUGFja2V0JylcbiAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdGhpcy5yZWdpc3RlclBhY2tldCh2YWx1ZSkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgID8udmVyYm9zZShcbiAgICAgICAgICAgICAgICBgUmVnaXN0ZXJlZCDCp2Ike3RoaXMucGFja2V0cy5zaXplfcKnciBvZiDCp2Ike1xuICAgICAgICAgICAgICAgICAgICBBcnJheS5mcm9tKE9iamVjdC5rZXlzKElkZW50aWZpZXJzKSkubGVuZ3RoIC0gMlxuICAgICAgICAgICAgICAgIH3Cp3IgcGFja2V0KHMpICh0b29rICR7dGltZXIuc3RvcCgpfSBtcykhYCxcbiAgICAgICAgICAgICAgICAnUGFja2V0UmVnaXN0cnkvcmVnaXN0ZXJQYWNrZXRzJ1xuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEeW5hbWljYWxseSByZWdpc3RlciBhbGwgaGFuZGxlcnMgZXhwb3J0ZWQgYnkgJy4vSGFuZGxlcnMnLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJIYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGltZXIgPSBuZXcgVGltZXIoKTtcblxuICAgICAgICAvLyBEeW5hbWljYWxseSByZWdpc3RlciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QuZW50cmllcyhIYW5kbGVycykubWFwKChbLCB2YWx1ZV0pID0+IHRoaXMucmVnaXN0ZXJIYW5kbGVyKHZhbHVlLk5ldElEISwgbmV3ICh2YWx1ZSBhcyBhbnkpKCkpKTtcblxuICAgICAgICB0aGlzLnNlcnZlclxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICA/LnZlcmJvc2UoXG4gICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgwqdiJHt0aGlzLmhhbmRsZXJzLnNpemV9wqdyIHBhY2tldCBoYW5kbGVyKHMpICh0b29rICR7dGltZXIuc3RvcCgpfSBtcykhYCxcbiAgICAgICAgICAgICAgICAnUGFja2V0UmVnaXN0cnkvcmVnaXN0ZXJIYW5kbGVycydcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBwYWNrZXRzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYWNrZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgaGFuZGxlcnMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcHVibGljIGdldEhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBSYWtOZXRMaXN0ZW5lciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCBDaGF0LCB7IENoYXRUeXBlIH0gZnJvbSAnLi9jaGF0L0NoYXQnO1xuaW1wb3J0IEJhbk1hbmFnZXIgZnJvbSAnLi9iYW4vQmFuTWFuYWdlcic7XG5pbXBvcnQgQmF0Y2hQYWNrZXQgZnJvbSAnLi9uZXR3b3JrL3BhY2tldC9CYXRjaFBhY2tldCc7XG5pbXBvcnQgQmxvY2tNYW5hZ2VyIGZyb20gJy4vYmxvY2svQmxvY2tNYW5hZ2VyJztcbmltcG9ydCB7IEJsb2NrTWFwcGluZ3MgfSBmcm9tICcuL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuaW1wb3J0IENoYXRFdmVudCBmcm9tICcuL2V2ZW50cy9jaGF0L0NoYXRFdmVudCc7XG5pbXBvcnQgQ2hhdE1hbmFnZXIgZnJvbSAnLi9jaGF0L0NoYXRNYW5hZ2VyJztcbmltcG9ydCBDbGllbnRDb25uZWN0aW9uIGZyb20gJy4vbmV0d29yay9DbGllbnRDb25uZWN0aW9uJztcbmltcG9ydCBDb21tYW5kTWFuYWdlciBmcm9tICcuL2NvbW1hbmQvQ29tbWFuZE1hbmFnZXInO1xuaW1wb3J0IENvbnNvbGUgZnJvbSAnLi9Db25zb2xlJztcbmltcG9ydCB0eXBlIHsgRGF0YVBhY2tldCB9IGZyb20gJy4vbmV0d29yay9QYWNrZXRzJztcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gJy4vZXZlbnRzL0V2ZW50TWFuYWdlcic7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi9uZXR3b3JrL0lkZW50aWZpZXJzJztcbmltcG9ydCBJdGVtTWFuYWdlciBmcm9tICcuL2l0ZW0vSXRlbU1hbmFnZXInO1xuaW1wb3J0IFBhY2tldFJlZ2lzdHJ5IGZyb20gJy4vbmV0d29yay9QYWNrZXRSZWdpc3RyeSc7XG5pbXBvcnQgUGVybWlzc2lvbk1hbmFnZXIgZnJvbSAnLi9wZXJtaXNzaW9uL1Blcm1pc3Npb25NYW5hZ2VyJztcbmltcG9ydCBQbHVnaW5NYW5hZ2VyIGZyb20gJy4vcGx1Z2luL1BsdWdpbk1hbmFnZXInO1xuaW1wb3J0IFF1ZXJ5TWFuYWdlciBmcm9tICcuL3F1ZXJ5L1F1ZXJ5TWFuYWdlcic7XG5pbXBvcnQgUmFrbmV0Q29ubmVjdEV2ZW50IGZyb20gJy4vZXZlbnRzL3Jha25ldC9SYWtuZXRDb25uZWN0RXZlbnQnO1xuaW1wb3J0IFJha25ldERpc2Nvbm5lY3RFdmVudCBmcm9tICcuL2V2ZW50cy9yYWtuZXQvUmFrbmV0RGlzY29ubmVjdEV2ZW50JztcbmltcG9ydCBSYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXRFdmVudCBmcm9tICcuL2V2ZW50cy9yYWtuZXQvUmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0RXZlbnQnO1xuaW1wb3J0IFNlc3Npb25NYW5hZ2VyIGZyb20gJy4vU2Vzc2lvbk1hbmFnZXInO1xuaW1wb3J0IHsgVGlja0V2ZW50IH0gZnJvbSAnLi9ldmVudHMvRXZlbnRzJztcbmltcG9ydCBUaW1lciBmcm9tICcuL3V0aWxzL1RpbWVyJztcbmltcG9ydCBXb3JsZE1hbmFnZXIgZnJvbSAnLi93b3JsZC9Xb3JsZE1hbmFnZXInO1xuXG5pbXBvcnQgdHlwZSBDb25maWcgZnJvbSAnLi9jb25maWcvQ29uZmlnJztcbmltcG9ydCB0eXBlIExvZ2dlckJ1aWxkZXIgZnJvbSAnLi91dGlscy9Mb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBSYWtOZXRTZXNzaW9uLCBJbmV0QWRkcmVzcyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyIHtcbiAgICBwcml2YXRlIHZlcnNpb24hOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByYWtuZXQhOiBSYWtOZXRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyQnVpbGRlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnO1xuICAgIHByaXZhdGUgdHBzID0gMjA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25zb2xlOiBDb25zb2xlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRNYW5hZ2VyID0gbmV3IEV2ZW50TWFuYWdlcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0UmVnaXN0cnk6IFBhY2tldFJlZ2lzdHJ5O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvbk1hbmFnZXIgPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk1hbmFnZXI6IFBsdWdpbk1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kTWFuYWdlcjogQ29tbWFuZE1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3JsZE1hbmFnZXI6IFdvcmxkTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1NYW5hZ2VyOiBJdGVtTWFuYWdlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTWFuYWdlcjogQmxvY2tNYW5hZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlNYW5hZ2VyOiBRdWVyeU1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGF0TWFuYWdlcjogQ2hhdE1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uTWFuYWdlcjogUGVybWlzc2lvbk1hbmFnZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYW5NYW5hZ2VyOiBCYW5NYW5hZ2VyO1xuICAgIHByaXZhdGUgc3RvcHBpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIHRpY2tlclRpbWVyOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1JTkVDUkFGVF9USUNLX1RJTUVfTVMgPSAxMDAwIC8gMjA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6IFNlcnZlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih7IGxvZ2dlciwgY29uZmlnLCB2ZXJzaW9uIH06IHsgbG9nZ2VyPzogTG9nZ2VyQnVpbGRlcjsgY29uZmlnOiBDb25maWc7IHZlcnNpb246IHN0cmluZyB9KSB7XG4gICAgICAgIGNvbnN0IGFkdmVydGlzZWRWZXJzaW9uID1cbiAgICAgICAgICAgIElkZW50aWZpZXJzLk1pbmVjcmFmdFZlcnNpb25zLmxlbmd0aCA8PSAxXG4gICAgICAgICAgICAgICAgPyBgwqdldiR7SWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMuYXQoMCl9wqdyYFxuICAgICAgICAgICAgICAgIDogYMKnZXYke0lkZW50aWZpZXJzLk1pbmVjcmFmdFZlcnNpb25zLmF0KDApfcKnci3Cp2V2JHtJZGVudGlmaWVycy5NaW5lY3JhZnRWZXJzaW9ucy5hdCgtMSl9wqdyYDtcblxuICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgU3RhcnRpbmcgSlNQcmlzbWFyaW5lIHNlcnZlciB2ZXJzaW9uIMKnZXYke3ZlcnNpb259wqdyIGZvciBNaW5lY3JhZnQ6IEJlZHJvY2sgRWRpdGlvbiAke2FkdmVydGlzZWRWZXJzaW9ufSAocHJvdG9jb2wgdmVyc2lvbiDCp2Uke0lkZW50aWZpZXJzLlByb3RvY29sfcKncilgLFxuICAgICAgICAgICAgJ1NlcnZlcidcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciE7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmNvbnNvbGUgPSBuZXcgQ29uc29sZSh0aGlzKTtcbiAgICAgICAgdGhpcy5wYWNrZXRSZWdpc3RyeSA9IG5ldyBQYWNrZXRSZWdpc3RyeSh0aGlzKTtcbiAgICAgICAgdGhpcy5pdGVtTWFuYWdlciA9IG5ldyBJdGVtTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy5ibG9ja01hbmFnZXIgPSBuZXcgQmxvY2tNYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLndvcmxkTWFuYWdlciA9IG5ldyBXb3JsZE1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMuY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMucGx1Z2luTWFuYWdlciA9IG5ldyBQbHVnaW5NYW5hZ2VyKHRoaXMpO1xuICAgICAgICB0aGlzLnF1ZXJ5TWFuYWdlciA9IG5ldyBRdWVyeU1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMuY2hhdE1hbmFnZXIgPSBuZXcgQ2hhdE1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbk1hbmFnZXIgPSBuZXcgUGVybWlzc2lvbk1hbmFnZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmFuTWFuYWdlciA9IG5ldyBCYW5NYW5hZ2VyKHRoaXMpO1xuXG4gICAgICAgIFNlcnZlci5pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb25maWcub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJtaXNzaW9uTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbk1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5iYW5NYW5hZ2VyLm9uRW5hYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaXRlbU1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ibG9ja01hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tYW5kTWFuYWdlci5vbkVuYWJsZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25EaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1hbmRNYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJsb2NrTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pdGVtTWFuYWdlci5vbkRpc2FibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5iYW5NYW5hZ2VyLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbk1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvbk1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFja2V0UmVnaXN0cnkub25EaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5vbkRpc2FibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm9uRGlzYWJsZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLm9uRW5hYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3RzdHJhcChzZXJ2ZXJJcCA9ICcwLjAuMC4wJywgcG9ydCA9IDE5MTMyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub25FbmFibGUoKTtcbiAgICAgICAgQmxvY2tNYXBwaW5ncy5pbml0TWFwcGluZ3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JsZE1hbmFnZXIub25FbmFibGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYWNrZXRSZWdpc3RyeS5vbkVuYWJsZSgpO1xuXG4gICAgICAgIHRoaXMucmFrbmV0ID0gbmV3IFJha05ldExpc3RlbmVyKHRoaXMuZ2V0Q29uZmlnKCkuZ2V0TWF4UGxheWVycygpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMucmFrbmV0LnN0YXJ0KHNlcnZlcklwLCBwb3J0KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbignb3BlbkNvbm5lY3Rpb24nLCBhc3luYyAoc2Vzc2lvbjogUmFrTmV0U2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgUmFrbmV0Q29ubmVjdEV2ZW50KHNlc3Npb24pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgncmFrbmV0Q29ubmVjdCcsIGV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gc2Vzc2lvbi5nZXRBZGRyZXNzKCkudG9Ub2tlbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbk1hbmFnZXIuaGFzKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQW5vdGhlciBjbGllbnQgd2l0aCB0b2tlbiAoJHt0b2tlbn0pIGlzIGFscmVhZHkgY29ubmVjdGVkIWAsXG4gICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL29wZW5Db25uZWN0aW9uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNjb25uZWN0KCdBbHJlYWR5IGNvbm5lY3RlZCBmcm9tIGFub3RoZXIgbG9jYXRpb24nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHt0b2tlbn0gaXMgYXR0ZW1wdGluZyB0byBjb25uZWN0YCwgJ1NlcnZlci9saXN0ZW4vb3BlbkNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbk1hbmFnZXIuYWRkKHRva2VuLCBuZXcgQ2xpZW50Q29ubmVjdGlvbihzZXNzaW9uLCB0aGlzLmxvZ2dlcikpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgTmV3IGNvbm5lY3Rpb24gaGFuZGxpbmcgdG9vayAke3RpbWVyLnN0b3AoKX0gbXNgLCAnU2VydmVyL2xpc3Rlbi9vcGVuQ29ubmVjdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbignY2xvc2VDb25uZWN0aW9uJywgYXN5bmMgKGluZXRBZGRyOiBJbmV0QWRkcmVzcywgcmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFJha25ldERpc2Nvbm5lY3RFdmVudChpbmV0QWRkciwgcmVhc29uKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ3Jha25ldERpc2Nvbm5lY3QnLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBpbmV0QWRkci50b1Rva2VuKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0UGxheWVyKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIC8vIERlLXNwYXduIHRoZSBwbGF5ZXIgdG8gYWxsIG9ubGluZSBwbGF5ZXJzXG4gICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLmdldE5ldHdvcmtTZXNzaW9uKCkucmVtb3ZlRnJvbVBsYXllckxpc3QoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG9ubGluZVBsYXllciBvZiB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldEFsbFBsYXllcnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kRGVzcGF3bihvbmxpbmVQbGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSBmYWlsIGF0IGRlY29kaW5nIHRoZSB1c2VybmFtZSBmb3Igd2hhdGV2ZXIgcmVhc29uXG4gICAgICAgICAgICAgICAgaWYgKHBsYXllci5nZXROYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5ub3VuY2UgZGlzY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDaGF0RXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYMKnZSVtdWx0aXBsYXllci5wbGF5ZXIubGVmdGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXllci5nZXROYW1lKCldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyouZXZlcnlvbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXRUeXBlLlRSQU5TTEFUSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXZlbnRNYW5hZ2VyLmVtaXQoJ2NoYXQnLCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcGxheWVyLm9uRGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllci5nZXRXb3JsZCgpLnJlbW92ZUVudGl0eShwbGF5ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbk1hbmFnZXIucmVtb3ZlKHRva2VuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgcmVtb3ZlIGNvbm5lY3Rpb24gZnJvbSBub24tZXhpc3RpbmcgcGxheWVyICgke3Rva2VufSlgLFxuICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXREaXNjb25uZWN0J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIvbGlzdGVuL3Jha25ldERpc2Nvbm5lY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dG9rZW59IGRpc2Nvbm5lY3RlZCBkdWUgdG8gJHtyZWFzb259YCwgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RGlzY29ubmVjdCcpO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgUGxheWVyIGRlc3RydWN0aW9uIHRvb2sgYWJvdXQgJHtEYXRlLm5vdygpIC0gdGltZX0gbXNgLFxuICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldERpc2Nvbm5lY3QnXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbignZW5jYXBzdWxhdGVkJywgYXN5bmMgKHBhY2tldDogYW55LCBpbmV0QWRkcjogSW5ldEFkZHJlc3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFJha25ldEVuY2Fwc3VsYXRlZFBhY2tldEV2ZW50KGluZXRBZGRyLCBwYWNrZXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgncmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0JywgZXZlbnQpO1xuXG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbjogQ2xpZW50Q29ubmVjdGlvbiB8IG51bGw7XG4gICAgICAgICAgICBpZiAoKGNvbm5lY3Rpb24gPSB0aGlzLnNlc3Npb25NYW5hZ2VyLmdldChpbmV0QWRkci50b1Rva2VuKCkpID8/IG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEdvdCBhIHBhY2tldCBmcm9tIGEgY2xvc2VkIGNvbm5lY3Rpb24gKCR7aW5ldEFkZHIudG9Ub2tlbigpfSlgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhZCBiYXRjaCBjb250ZW50IGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoZWQgPSBuZXcgQmF0Y2hQYWNrZXQocGFja2V0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGJhdGNoZWQuY29tcHJlc3NlZCA9IGNvbm5lY3Rpb24uaGFzQ29tcHJlc3Npb247XG5cbiAgICAgICAgICAgICAgICAvLyBSZWFkIGFsbCBwYWNrZXRzIGluc2lkZSBiYXRjaCBhbmQgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGJ1ZiBvZiBhd2FpdCBiYXRjaGVkLmFzeW5jRGVjb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlkID0gYnVmWzBdITtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFja2V0UmVnaXN0cnkuZ2V0UGFja2V0cygpLmhhcyhwaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQYWNrZXQgMHgke3BpZC50b1N0cmluZygxNil9IGlzbid0IGltcGxlbWVudGVkYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcGFja2V0IGZyb20gcmVnaXN0cnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3ICh0aGlzLnBhY2tldFJlZ2lzdHJ5LmdldFBhY2tldHMoKS5nZXQocGlkKSEpKGJ1Zik7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC5kZWNvZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciB3aGlsZSBkZWNvZGluZyBwYWNrZXQ6ICR7cGFja2V0LmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnBhY2tldFJlZ2lzdHJ5LmdldEhhbmRsZXIocGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnNpbGx5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBSZWNlaXZlZCDCp2Ike3BhY2tldC5jb25zdHJ1Y3Rvci5uYW1lfcKnciBwYWNrZXRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCAoaGFuZGxlciBhcyBhbnkpLmhhbmRsZShwYWNrZXQsIHRoaXMsIGNvbm5lY3Rpb24uZ2V0UGxheWVyU2Vzc2lvbigpID8/IGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEhhbmRsZXIgZXJyb3IgJHtwYWNrZXQuY29uc3RydWN0b3IubmFtZX0taGFuZGxlcjogKCR7ZXJyb3J9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlcnZlci9saXN0ZW4vcmFrbmV0RW5jYXBzdWxhdGVkUGFja2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2xpc3Rlbi9yYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIvbGlzdGVuL3Jha25ldEVuY2Fwc3VsYXRlZFBhY2tldCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJha25ldC5vbigncmF3JywgYXN5bmMgKGJ1ZmZlcjogQnVmZmVyLCBpbmV0QWRkcjogSW5ldEFkZHJlc3MpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeU1hbmFnZXIub25SYXcoYnVmZmVyLCBpbmV0QWRkcik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLCAnU2VydmVyL2xpc3Rlbi9yYXcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBRdWVyeU1hbmFnZXIgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZXJyb3J9YCwgJ1NlcnZlci9saXN0ZW4vcmF3Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRPRE86IGNhbGN1bGF0ZSBUUFMuXG4gICAgICAgIGxldCB0aWNrQ291bnQgPSAwO1xuICAgICAgICBjb25zdCB0aWNrID0gKCkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFRpY2tFdmVudCh0aWNrQ291bnQpO1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5ldmVudE1hbmFnZXIuZW1pdCgndGljaycsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd29ybGQgb2YgdGhpcy53b3JsZE1hbmFnZXIuZ2V0V29ybGRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCB3b3JsZC51cGRhdGUoZXZlbnQuZ2V0VGljaygpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICArK3RpY2tDb3VudDtcbiAgICAgICAgICAgICAgICB0aWNrKCk7XG4gICAgICAgICAgICB9LCBTZXJ2ZXIuTUlORUNSQUZUX1RJQ0tfVElNRV9NUyk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGlja2luZ1xuICAgICAgICB0aGlzLnRpY2tlclRpbWVyID0gdGljaygpO1xuICAgICAgICB0aGlzLnRpY2tlclRpbWVyLnVucmVmKCk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSlNQcmlzbWFyaW5lIGlzIG5vdyBsaXN0ZW5pbmcgb24gcG9ydCDCp2Ike3BvcnR9YCwgJ1NlcnZlci9saXN0ZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLaWxscyB0aGUgc2VydmVyIGFzeW5jaHJvbm91c2x5LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogeyB3aXRob3V0U2F2aW5nPzogYm9vbGVhbjsgY3Jhc2g/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdG9wcGluZyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnU3RvcHBpbmcgc2VydmVyJywgJ1NlcnZlci9raWxsJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uc29sZS5vbkRpc2FibGUoKTtcblxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGlja2VyVGltZXIpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBLaWNrIGFsbCBvbmxpbmUgcGxheWVyc1xuICAgICAgICAgICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRBbGxQbGF5ZXJzKCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBwbGF5ZXIua2ljaygnU2VydmVyIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2F2ZSBhbGwgd29ybGRzXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnM/LndpdGhvdXRTYXZpbmcpIGF3YWl0IHRoaXMud29ybGRNYW5hZ2VyLnNhdmUoKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy53b3JsZE1hbmFnZXIub25EaXNhYmxlKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uRGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5yYWtuZXQua2lsbCgpOyAvLyB0aGlzLnJha25ldCBtaWdodCBiZSB1bmRlZmluZWQgaWYgd2Uga2lsbCB0aGUgc2VydmVyIHJlYWxseSBlYXJseVxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KG9wdGlvbnM/LmNyYXNoID8gMSA6IDApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdTZXJ2ZXIva2lsbCcpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJyb2FkY2FzdFBhY2tldDxUIGV4dGVuZHMgRGF0YVBhY2tldD4oZGF0YVBhY2tldDogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBNYXliZSBpIGNhbiBpbXByb3ZlIHRoaXMgYnkgdXNpbmcgdGhlIFVEUCBicm9hZGNhc3QsIGFsbCB1bmNvbm5lY3RlZCBjbGllbnRzXG4gICAgICAgIC8vIHdpbGwgaWdub3JlIHRoZSBjb25uZWN0ZWQgcGFja2V0IHByb2JhYmx5LCBidXQgbWF5IGNhdXNlIGlzc3Vlcy5cbiAgICAgICAgZm9yIChjb25zdCBvbmxpbmVQbGF5ZXIgb2YgdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRBbGxQbGF5ZXJzKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9ubGluZVBsYXllci5nZXROZXR3b3JrU2Vzc2lvbigpLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChkYXRhUGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldElkZW50aWZpZXJzKCkge1xuICAgICAgICByZXR1cm4gSWRlbnRpZmllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcXVlcnkgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRRdWVyeU1hbmFnZXIoKTogUXVlcnlNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbW1hbmQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb21tYW5kTWFuYWdlcigpOiBDb21tYW5kTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBsYXllciBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFNlc3Npb25NYW5hZ2VyKCk6IFNlc3Npb25NYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd29ybGQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRXb3JsZE1hbmFnZXIoKTogV29ybGRNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGl0ZW0gbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJdGVtTWFuYWdlcigpOiBJdGVtTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJsb2NrIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2tNYW5hZ2VyKCk6IEJsb2NrTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsb2dnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TG9nZ2VyKCk6IExvZ2dlckJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFja2V0IHJlZ2lzdHJ5XG4gICAgICovXG4gICAgcHVibGljIGdldFBhY2tldFJlZ2lzdHJ5KCk6IFBhY2tldFJlZ2lzdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0UmVnaXN0cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmFrbmV0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldFJha25ldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFrbmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBsdWdpbiBtYW5hZ2VyXG4gICAgICovXG4gICAgcHVibGljIGdldFBsdWdpbk1hbmFnZXIoKTogUGx1Z2luTWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbk1hbmFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZXZlbnQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFdmVudE1hbmFnZXIoKTogRXZlbnRNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNoYXQgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDaGF0TWFuYWdlcigpOiBDaGF0TWFuYWdlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25maWcoKTogQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbnNvbGUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uc29sZSgpOiBDb25zb2xlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc29sZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwZXJtaXNzaW9uIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGVybWlzc2lvbk1hbmFnZXIoKTogUGVybWlzc2lvbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiYW4gbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCYW5NYW5hZ2VyKCk6IEJhbk1hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5iYW5NYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBQcmlzbWFyaW5lIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldFNlcnZlcigpOiBTZXJ2ZXIge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFRQU1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUUFMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHBzO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJDb21tYW5kUGFyYW1ldGVyRmxhZ3MiLCJHYW1lbW9kZSIsIlN1Z2dlc3Rpb25zIiwiQ29tbWFuZEVudW0iLCJDb21tYW5kUGFyYW1ldGVyIiwiRW50aXRpZXMiLCJQYXJzZVRhcmdldFNlbGVjdG9yIiwiQ29tbWFuZFBhcmFtZXRlclR5cGUiLCJWZWN0b3IzIiwiUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24iLCJJZGVudGlmaWVycyIsIlBsYXlTdGF0dXNQYWNrZXQiLCJQbGF5U3RhdHVzVHlwZSIsIlJlc291cmNlUGFja3NJbmZvUGFja2V0IiwiQmF0Y2hQYWNrZXQiLCJMZXZlbENodW5rUGFja2V0IiwiQ2h1bmsiLCJVcGRhdGVBZHZlbnR1cmVTZXR0aW5nc1BhY2tldCIsIlVwZGF0ZUFiaWxpdGllc1BhY2tldCIsIlBlcm1pc3Npb25UeXBlIiwiUGxheWVyUGVybWlzc2lvblR5cGUiLCJBYmlsaXR5TGF5ZXIiLCJBYmlsaXR5TGF5ZXJUeXBlIiwiQWJpbGl0eUxheWVyRmxhZyIsIkNvb3JkaW5hdGVVdGlscyIsIkhlYXAiLCJJbnZlbnRvcnlDb250ZW50UGFja2V0IiwiV2luZG93SWRzIiwiQ3JlYXRpdmVDb250ZW50UGFja2V0IiwiY3JlYXRpdmVpdGVtcyIsIkl0ZW0iLCJNb2JFcXVpcG1lbnRQYWNrZXQiLCJNb2RhbEZvcm1SZXF1ZXN0UGFja2V0IiwiU2V0VGltZVBhY2tldCIsIlNldFBsYXllckdhbWVUeXBlUGFja2V0IiwiTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0IiwiQmxvY2tQb3NpdGlvbiIsIkF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IiwiY21kIiwiQ29tbWFuZERhdGEiLCJwYXJhbWV0ZXJzIiwiQ2h1bmtSYWRpdXNVcGRhdGVkUGFja2V0IiwiVXBkYXRlQXR0cmlidXRlc1BhY2tldCIsIlNldEFjdG9yRGF0YVBhY2tldCIsIlRleHRUeXBlIiwiVGV4dFBhY2tldCIsIlRvYXN0UmVxdWVzdFBhY2tldCIsIk1vdmVtZW50VHlwZSIsIk1vdmVQbGF5ZXJQYWNrZXQiLCJQbGF5ZXJMaXN0UGFja2V0IiwiUGxheWVyTGlzdEFjdGlvbiIsIlBsYXllckxpc3RFbnRyeSIsIlVVSUQiLCJBZGRQbGF5ZXJQYWNrZXQiLCJSZW1vdmVBY3RvclBhY2tldCIsIkRpc2Nvbm5lY3RQYWNrZXQiLCJIdW1hbiIsIlRpbWVyIiwiV2luZG93TWFuYWdlciIsIkZvcm1NYW5hZ2VyIiwiQ29udGFpbmVyRW50cnkiLCJDaGFuZ2VEaW1lbnNpb25QYWNrZXQiLCJQbGF5ZXJTZXRHYW1lbW9kZUV2ZW50IiwiUGxheWVyVG9nZ2xlU3ByaW50RXZlbnQiLCJNZXRhZGF0YUZsYWciLCJGbGFnVHlwZSIsIlBsYXllclRvZ2dsZUZsaWdodEV2ZW50IiwiTWluZWNyYWZ0U2Vzc2lvbiIsImFzc2VydCIsIlBhY2tldHMiLCJFdmVudE1hbmFnZXIiLCJTZXNzaW9uTWFuYWdlciIsIkNvbnNvbGUiLCJJdGVtTWFuYWdlciIsIkJsb2NrTWFuYWdlciIsIldvcmxkTWFuYWdlciIsIkNvbW1hbmRNYW5hZ2VyIiwiUGx1Z2luTWFuYWdlciIsIlF1ZXJ5TWFuYWdlciIsIkNoYXRNYW5hZ2VyIiwiUGVybWlzc2lvbk1hbmFnZXIiLCJCYW5NYW5hZ2VyIiwiQmxvY2tNYXBwaW5ncyIsIlJha05ldExpc3RlbmVyIiwiUmFrbmV0Q29ubmVjdEV2ZW50IiwiUmFrbmV0RGlzY29ubmVjdEV2ZW50IiwiZXZlbnQiLCJDaGF0RXZlbnQiLCJDaGF0IiwiQ2hhdFR5cGUiLCJSYWtuZXRFbmNhcHN1bGF0ZWRQYWNrZXRFdmVudCIsInBhY2tldCIsIlRpY2tFdmVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNPLE1BQWUsZUFBZ0IsQ0FBQTtBQUFBLEVBQzNCLGVBQTBCLEdB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