@witnet/sdk 1.1.5 → 1.2.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 (192) hide show
  1. package/.env_witnet +13 -1
  2. package/dist/package.json +31 -24
  3. package/dist/src/bin/helpers.d.ts +59 -49
  4. package/dist/src/bin/helpers.d.ts.map +1 -1
  5. package/dist/src/bin/helpers.js +228 -229
  6. package/dist/src/index.d.ts +3 -4
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +4 -47
  9. package/dist/src/lib/crypto/account.d.ts +3 -3
  10. package/dist/src/lib/crypto/account.d.ts.map +1 -1
  11. package/dist/src/lib/crypto/account.js +31 -25
  12. package/dist/src/lib/crypto/coinbase.d.ts +4 -4
  13. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -1
  14. package/dist/src/lib/crypto/coinbase.js +8 -13
  15. package/dist/src/lib/crypto/index.d.ts +7 -7
  16. package/dist/src/lib/crypto/index.d.ts.map +1 -1
  17. package/dist/src/lib/crypto/index.js +7 -30
  18. package/dist/src/lib/crypto/interfaces.d.ts +5 -5
  19. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
  20. package/dist/src/lib/crypto/interfaces.js +2 -3
  21. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +5 -5
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -1
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +98 -85
  24. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +3 -4
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -1
  26. package/dist/src/lib/crypto/payloads/StakePayload.js +81 -71
  27. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +4 -5
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -1
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.js +36 -43
  30. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +3 -4
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -1
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +46 -48
  33. package/dist/src/lib/crypto/payloads.d.ts +5 -5
  34. package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
  35. package/dist/src/lib/crypto/payloads.js +44 -45
  36. package/dist/src/lib/crypto/signer.d.ts +3 -3
  37. package/dist/src/lib/crypto/signer.d.ts.map +1 -1
  38. package/dist/src/lib/crypto/signer.js +45 -88
  39. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +6 -6
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -1
  41. package/dist/src/lib/crypto/transmitters/DataRequests.js +6 -10
  42. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +5 -5
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -1
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +7 -11
  45. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +6 -7
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -1
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +9 -13
  48. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +5 -5
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -1
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +6 -10
  51. package/dist/src/lib/crypto/transmitters.d.ts +6 -6
  52. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -1
  53. package/dist/src/lib/crypto/transmitters.js +89 -76
  54. package/dist/src/lib/crypto/types.d.ts +1 -2
  55. package/dist/src/lib/crypto/types.d.ts.map +1 -1
  56. package/dist/src/lib/crypto/types.js +71 -67
  57. package/dist/src/lib/crypto/utils.d.ts +5 -5
  58. package/dist/src/lib/crypto/utils.d.ts.map +1 -1
  59. package/dist/src/lib/crypto/utils.js +48 -66
  60. package/dist/src/lib/crypto/wallet.d.ts +3 -3
  61. package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
  62. package/dist/src/lib/crypto/wallet.js +72 -89
  63. package/dist/src/lib/index.d.ts +5 -4
  64. package/dist/src/lib/index.d.ts.map +1 -1
  65. package/dist/src/lib/index.js +6 -44
  66. package/dist/src/lib/radon/ccdr/eth.d.ts +1 -1
  67. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -1
  68. package/dist/src/lib/radon/ccdr/eth.js +95 -83
  69. package/dist/src/lib/radon/ccdr/index.d.ts +2 -2
  70. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -1
  71. package/dist/src/lib/radon/ccdr/index.js +3 -39
  72. package/dist/src/lib/radon/ccdr/wit.d.ts +2 -2
  73. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -1
  74. package/dist/src/lib/radon/ccdr/wit.js +17 -19
  75. package/dist/src/lib/radon/filters.d.ts.map +1 -1
  76. package/dist/src/lib/radon/filters.js +23 -19
  77. package/dist/src/lib/radon/index.d.ts +10 -11
  78. package/dist/src/lib/radon/index.d.ts.map +1 -1
  79. package/dist/src/lib/radon/index.js +205 -187
  80. package/dist/src/lib/radon/reducers.d.ts +2 -2
  81. package/dist/src/lib/radon/reducers.d.ts.map +1 -1
  82. package/dist/src/lib/radon/reducers.js +48 -34
  83. package/dist/src/lib/radon/types.d.ts +2 -2
  84. package/dist/src/lib/radon/types.d.ts.map +1 -1
  85. package/dist/src/lib/radon/types.js +80 -110
  86. package/dist/src/lib/radon/utils.d.ts +3 -3
  87. package/dist/src/lib/radon/utils.d.ts.map +1 -1
  88. package/dist/src/lib/radon/utils.js +49 -52
  89. package/dist/src/lib/rest/kermit.d.ts +20 -0
  90. package/dist/src/lib/rest/kermit.d.ts.map +1 -0
  91. package/dist/src/lib/rest/kermit.js +68 -0
  92. package/dist/src/lib/rest/types.d.ts +5 -0
  93. package/dist/src/lib/rest/types.d.ts.map +1 -0
  94. package/dist/src/lib/rest/types.js +2 -0
  95. package/dist/src/lib/rpc/index.d.ts +2 -2
  96. package/dist/src/lib/rpc/index.d.ts.map +1 -1
  97. package/dist/src/lib/rpc/index.js +3 -19
  98. package/dist/src/lib/rpc/nodes.d.ts +13 -13
  99. package/dist/src/lib/rpc/nodes.d.ts.map +1 -1
  100. package/dist/src/lib/rpc/nodes.js +69 -98
  101. package/dist/src/lib/rpc/provider.d.ts +4 -4
  102. package/dist/src/lib/rpc/provider.d.ts.map +1 -1
  103. package/dist/src/lib/rpc/provider.js +106 -122
  104. package/dist/src/lib/rpc/types.d.ts +2 -2
  105. package/dist/src/lib/rpc/types.d.ts.map +1 -1
  106. package/dist/src/lib/rpc/types.js +13 -16
  107. package/dist/src/lib/types.d.ts +5 -4
  108. package/dist/src/lib/types.d.ts.map +1 -1
  109. package/dist/src/lib/types.js +3 -9
  110. package/dist/src/lib/utils.d.ts +5 -5
  111. package/dist/src/lib/utils.d.ts.map +1 -1
  112. package/dist/src/lib/utils.js +40 -99
  113. package/dist/witnet/assets/index.cjs +6 -0
  114. package/dist/witnet/assets/index.d.cts +29 -0
  115. package/dist/witnet/assets/index.d.cts.map +1 -0
  116. package/dist/witnet/assets/modals/index.cjs +9 -0
  117. package/dist/witnet/assets/modals/index.d.cts +16 -0
  118. package/dist/witnet/assets/modals/index.d.cts.map +1 -0
  119. package/dist/witnet/assets/modals/web3/eth.cjs +23 -0
  120. package/dist/witnet/assets/modals/web3/eth.d.cts +4 -0
  121. package/dist/witnet/assets/modals/web3/eth.d.cts.map +1 -0
  122. package/dist/witnet/assets/modals/web3/ipfs.cjs +18 -0
  123. package/dist/witnet/assets/modals/web3/ipfs.d.cts +3 -0
  124. package/dist/witnet/assets/modals/web3/ipfs.d.cts.map +1 -0
  125. package/dist/witnet/assets/modals/web3/wit.cjs +24 -0
  126. package/dist/witnet/assets/modals/web3/wit.d.cts +3 -0
  127. package/dist/witnet/assets/modals/web3/wit.d.cts.map +1 -0
  128. package/dist/witnet/assets/requests.cjs +43 -0
  129. package/dist/witnet/assets/requests.d.cts +10 -0
  130. package/dist/witnet/assets/requests.d.cts.map +1 -0
  131. package/package.json +31 -24
  132. package/src/bin/bots/watcher.cjs +354 -0
  133. package/src/bin/cli/history.cjs +31 -0
  134. package/src/bin/cli/inspect.js +545 -471
  135. package/src/bin/cli/network.js +658 -557
  136. package/src/bin/cli/nodes.js +392 -332
  137. package/src/bin/cli/radon.js +1071 -844
  138. package/src/bin/cli/wallet.js +1317 -1074
  139. package/src/bin/helpers.js +969 -868
  140. package/src/bin/index.js +329 -0
  141. package/witnet/assets/_index.cjs +5 -0
  142. package/witnet/assets/_requests.cjs +25 -0
  143. package/witnet/assets/_sources.cjs +36 -0
  144. package/witnet/assets/_templates.cjs +36 -0
  145. package/witnet/assets/index.cjs +4 -0
  146. package/witnet/assets/modals/index.cjs +7 -0
  147. package/witnet/assets/modals/web3/eth.cjs +27 -0
  148. package/witnet/assets/modals/web3/ipfs.cjs +22 -0
  149. package/witnet/assets/modals/web3/wit.cjs +28 -0
  150. package/witnet/assets/requests.cjs +49 -0
  151. package/witnet/witnet copy.proto +457 -0
  152. package/witnet/witnet.proto +456 -0
  153. package/witnet/witnet_toolkit-1.6.7-x86_64-pc-windows-msvc.exe +0 -0
  154. package/witnet/witnet_toolkit-1.7.1-x86_64-pc-windows-msvc.exe +0 -0
  155. package/witnet/witnet_toolkit-2.0.0-rc.7-x86_64-pc-windows-msvc.exe +0 -0
  156. package/witnet/witnet_toolkit-2.0.2-x86_64-pc-windows-msvc.exe +0 -0
  157. package/witnet/witnet_toolkit-2.0.21-x86_64-pc-windows-msvc.exe +0 -0
  158. package/witnet/witnet_toolkit-2.0.7-x86_64-pc-windows-msvc.exe +0 -0
  159. package/witnet/witnet_toolkit-2.0.8-x86_64-pc-windows-msvc.exe +0 -0
  160. package/dist/witnet/assets/index.d.ts +0 -29
  161. package/dist/witnet/assets/index.d.ts.map +0 -1
  162. package/dist/witnet/assets/index.js +0 -6
  163. package/dist/witnet/assets/modals/index.d.ts +0 -16
  164. package/dist/witnet/assets/modals/index.d.ts.map +0 -1
  165. package/dist/witnet/assets/modals/index.js +0 -11
  166. package/dist/witnet/assets/modals/web3/eth.d.ts +0 -5
  167. package/dist/witnet/assets/modals/web3/eth.d.ts.map +0 -1
  168. package/dist/witnet/assets/modals/web3/eth.js +0 -26
  169. package/dist/witnet/assets/modals/web3/ipfs.d.ts +0 -4
  170. package/dist/witnet/assets/modals/web3/ipfs.d.ts.map +0 -1
  171. package/dist/witnet/assets/modals/web3/ipfs.js +0 -18
  172. package/dist/witnet/assets/modals/web3/wit.d.ts +0 -4
  173. package/dist/witnet/assets/modals/web3/wit.d.ts.map +0 -1
  174. package/dist/witnet/assets/modals/web3/wit.js +0 -17
  175. package/dist/witnet/assets/requests.d.ts +0 -11
  176. package/dist/witnet/assets/requests.d.ts.map +0 -1
  177. package/dist/witnet/assets/requests.js +0 -43
  178. package/src/bin/cli/history.js +0 -31
  179. package/src/bin/postinstall.js +0 -9
  180. package/src/bin/toolkit.js +0 -290
  181. package/witnet/assets/_index.js +0 -8
  182. package/witnet/assets/_requests.js +0 -25
  183. package/witnet/assets/_sources.js +0 -36
  184. package/witnet/assets/_templates.js +0 -36
  185. package/witnet/assets/index.js +0 -4
  186. package/witnet/assets/modals/index.js +0 -9
  187. package/witnet/assets/modals/web3/eth.js +0 -29
  188. package/witnet/assets/modals/web3/ipfs.js +0 -22
  189. package/witnet/assets/modals/web3/wit.js +0 -21
  190. package/witnet/assets/requests.js +0 -49
  191. /package/witnet/assets/modals/web3/{btc.js → btc.cjs} +0 -0
  192. /package/witnet/assets/modals/web3/{sol.js → sol.cjs} +0 -0
@@ -1,12 +1,12 @@
1
- import { Type as ProtoType } from "protobufjs";
2
- import { Hash, Network } from "../types";
3
- import { ILedger, IJsonRpcProvider, ITransmitter, ITransactionPayload, ITransactionPayloadMultiSig } from "./interfaces";
4
- import { KeyedSignature, PublicKeyHashString, TransactionCallback, TransactionReceipt, TransactionStatus, Transmission } from "./types";
1
+ import protobuf from "protobufjs";
2
+ import type { Hash, Network } from "../types.js";
3
+ import type { IJsonRpcProvider, ILedger, ITransactionPayload, ITransactionPayloadMultiSig, ITransmitter } from "./interfaces.js";
4
+ import { type KeyedSignature, type PublicKeyHashString, type TransactionCallback, type TransactionReceipt, type TransactionStatus, type Transmission } from "./types.js";
5
5
  export declare abstract class Transmitter<Specs, Payload extends ITransactionPayload<Specs>> implements ITransmitter {
6
6
  readonly ledger: ILedger;
7
7
  readonly changePkh: PublicKeyHashString;
8
8
  protected _payload: Payload;
9
- protected _protoBuf: ProtoType;
9
+ protected _protoBuf: protobuf.Type;
10
10
  protected _signatures: Array<KeyedSignature>;
11
11
  protected _transactions: Array<Hash>;
12
12
  constructor(protoTypeName: string, payload: Payload, ledger: ILedger, changePkh?: PublicKeyHashString);
@@ -24,7 +24,7 @@ export declare abstract class Transmitter<Specs, Payload extends ITransactionPay
24
24
  timeoutSecs?: number;
25
25
  onCheckpoint?: TransactionCallback;
26
26
  onStatusChange?: TransactionCallback;
27
- }): Promise<TransactionReceipt>;
27
+ }): Promise<TransactionReceipt | unknown>;
28
28
  protected _cleanSignatures(newTarget: Specs): any;
29
29
  protected _getInflightBytecode(): Uint8Array | undefined;
30
30
  protected _getInflightReceipt(): TransactionReceipt | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"transmitters.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/transmitters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transmitters.d.ts","sourceRoot":"","sources":["../../../../src/lib/crypto/transmitters.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,21 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransmitterMultiSig = exports.Transmitter = void 0;
4
- const promisePoller = require('promise-poller').default;
5
- const protobufjs_1 = require("protobufjs");
6
- const protoRoot = protobufjs_1.Root.fromJSON(require("../../../witnet/witnet.proto.json"));
7
- const rpc_1 = require("../rpc");
8
- const utils_1 = require("../utils");
9
- const types_1 = require("./types");
10
- class Transmitter {
1
+ import { default as PromisePoller } from "promise-poller";
2
+ const promisePoller = PromisePoller.default;
3
+ import { createRequire } from "node:module";
4
+ const require = createRequire(import.meta.url);
5
+ import protobuf from "protobufjs";
6
+ const { Root: ProtoRoot } = protobuf;
7
+ const protoRoot = ProtoRoot.fromJSON(require("../../../witnet/witnet.proto.json"));
8
+ import { JsonRpcProvider } from "../rpc/index.js";
9
+ import { isHexString } from "../utils.js";
10
+ import { MempoolError, PublicKey, TimeoutError, TransmissionError, } from "./types.js";
11
+ export class Transmitter {
12
+ ledger;
13
+ changePkh;
14
+ _payload;
15
+ _protoBuf;
16
+ _signatures = [];
17
+ _transactions = [];
11
18
  constructor(protoTypeName, payload, ledger, changePkh) {
12
- this._signatures = [];
13
- this._transactions = [];
14
19
  this._protoBuf = protoRoot.lookupType(protoTypeName);
15
20
  this._payload = payload;
16
21
  this.ledger = ledger;
@@ -35,26 +40,31 @@ class Transmitter {
35
40
  return this._transactions;
36
41
  }
37
42
  get type() {
38
- return this._payload.constructor.name.split(/([a-z](?=[A-Z]))/g).slice(0, -1).join("");
43
+ return this._payload.constructor.name
44
+ .split(/([a-z](?=[A-Z]))/g)
45
+ .slice(0, -1)
46
+ .join("");
39
47
  }
40
48
  get _from() {
41
49
  if (this._signatures.length > 0) {
42
- return this._signatures
43
- .map(ks => {
44
- const pkh = types_1.PublicKey.fromProtobuf(ks.public_key).hash().toBech32(this.network);
50
+ return (this._signatures
51
+ .map((ks) => {
52
+ const pkh = PublicKey.fromProtobuf(ks.public_key)
53
+ .hash()
54
+ .toBech32(this.network);
45
55
  return this.ledger.getSigner(pkh)?.pkh || this.ledger.pkh;
46
56
  })
47
57
  // avoid repetitions
48
- .filter((pkh, index, array) => index === array.indexOf(pkh));
58
+ .filter((pkh, index, array) => index === array.indexOf(pkh)));
49
59
  }
50
60
  else {
51
61
  return undefined;
52
62
  }
53
63
  }
54
64
  get _prepared() {
55
- return (this._payload.prepared
56
- && !!this._signatures
57
- && this._signatures.length > 0);
65
+ return (this._payload.prepared &&
66
+ !!this._signatures &&
67
+ this._signatures.length > 0);
58
68
  }
59
69
  async sendTransaction(target) {
60
70
  let receipt = this._getInflightReceipt();
@@ -68,25 +78,25 @@ class Transmitter {
68
78
  // if current inflight was already transmitted and it's not yet known to fail ...
69
79
  return receipt;
70
80
  }
71
- // if we reach this point is because an inflight transaction is
81
+ // if we reach this point is because an inflight transaction is
72
82
  // ready to be transmitted
73
- rpc_1.JsonRpcProvider.receipts[receipt.hash].status = "pending";
74
- delete rpc_1.JsonRpcProvider.receipts[receipt.hash].error;
83
+ JsonRpcProvider.receipts[receipt.hash].status = "pending";
84
+ delete JsonRpcProvider.receipts[receipt.hash].error;
75
85
  return this.provider
76
86
  .sendRawTransaction(this._toJSON(false))
77
- .catch(err => {
78
- const error = new types_1.TransmissionError(this._getInflightTransmission(), err);
79
- rpc_1.JsonRpcProvider.receipts[receipt.hash].error = error;
87
+ .catch((err) => {
88
+ const error = new TransmissionError(this._getInflightTransmission(), err);
89
+ JsonRpcProvider.receipts[receipt.hash].error = error;
80
90
  throw error;
81
91
  })
82
- .then(accepted => {
92
+ .then((accepted) => {
83
93
  if (accepted) {
84
- rpc_1.JsonRpcProvider.receipts[receipt.hash].status = "relayed";
85
- return rpc_1.JsonRpcProvider.receipts[receipt.hash];
94
+ JsonRpcProvider.receipts[receipt.hash].status = "relayed";
95
+ return JsonRpcProvider.receipts[receipt.hash];
86
96
  }
87
97
  else {
88
- const error = new types_1.TransmissionError(this._getInflightTransmission(), Error(`Rejected for unknown reasons`));
89
- rpc_1.JsonRpcProvider.receipts[receipt.hash].error = error;
98
+ const error = new TransmissionError(this._getInflightTransmission(), Error(`Rejected for unknown reasons`));
99
+ JsonRpcProvider.receipts[receipt.hash].error = error;
90
100
  throw error;
91
101
  }
92
102
  });
@@ -115,7 +125,8 @@ class Transmitter {
115
125
  // if not yet prepared, try to cover transaction expenses with existing utxos on signers:
116
126
  let change = 0n;
117
127
  if (!this._payload.prepared) {
118
- change = await this._payload.consumeUtxos(this.ledger, reloadUtxos)
128
+ change = await this._payload
129
+ .consumeUtxos(this.ledger, reloadUtxos)
119
130
  .catch((err) => {
120
131
  throw Error(`${this.constructor.name}: cannot consume UTXOs from ${this.ledger.constructor.name} ${this.ledger.pkh}: ${err}.`);
121
132
  });
@@ -132,7 +143,7 @@ class Transmitter {
132
143
  return this._upsertTransactionReceipt(this._signTransactionPayload(), target, "signed");
133
144
  }
134
145
  async confirmTransaction(hash, options) {
135
- let receipt = rpc_1.JsonRpcProvider.receipts[hash];
146
+ const receipt = JsonRpcProvider.receipts[hash];
136
147
  if (!receipt || receipt.hash !== hash) {
137
148
  throw new Error(`${this.constructor.name}: transaction not found: ${hash}`);
138
149
  }
@@ -140,14 +151,13 @@ class Transmitter {
140
151
  throw new Error(`${this.constructor.name}: transaction status "${receipt.status}": ${hash}`);
141
152
  }
142
153
  else if (receipt.status === "removed") {
143
- throw new types_1.MempoolError(receipt, `${this.constructor.name}: transaction removed from mempool: ${hash}`);
154
+ throw new MempoolError(receipt, `${this.constructor.name}: transaction removed from mempool: ${hash}`);
144
155
  }
145
156
  else if (receipt.status === "relayed" && options?.onStatusChange)
146
157
  try {
147
158
  options.onStatusChange(receipt);
148
159
  }
149
160
  catch { }
150
- ;
151
161
  const globalTimer = (start, ms) => {
152
162
  return new Promise((_, reject) => {
153
163
  setTimeout(() => reject(`${this.constructor.name}: polling timeout after ${Math.floor((Date.now() - start) / 1000)} secs).`), ms);
@@ -160,31 +170,36 @@ class Transmitter {
160
170
  (options?.timeoutSecs || 600) * 1000,
161
171
  ];
162
172
  return Promise.race([
163
- globalTimer(Date.now(), globalTimeout)
164
- .catch((reason) => { throw new types_1.TimeoutError(globalTimeout, receipt, reason); }),
173
+ globalTimer(Date.now(), globalTimeout).catch((reason) => {
174
+ throw new TimeoutError(globalTimeout, receipt, reason);
175
+ }),
165
176
  promisePoller({
166
- taskFn: () => this.provider.getTransaction(hash).catch(err => err),
177
+ taskFn: () => this.provider.getTransaction(hash).catch((err) => err),
167
178
  shouldContinue: (error, report) => {
168
179
  const status = receipt.status;
169
180
  receipt.error = error;
170
- if (error instanceof Error && error.message.indexOf("ItemNotFound") >= 0) {
181
+ if (error instanceof Error &&
182
+ error.message.indexOf("ItemNotFound") >= 0) {
171
183
  receipt.status = "removed";
172
184
  }
173
185
  else
174
186
  switch (receipt.status) {
175
187
  case "relayed":
176
- if (report?.blockHash && (0, utils_1.isHexString)(report.blockHash)) {
188
+ if (report?.blockHash && isHexString(report.blockHash)) {
177
189
  receipt.confirmations = report.confirmations;
178
- receipt.blockHash = report.blockHash,
179
- receipt.blockEpoch = report.blockEpoch,
180
- receipt.blockTimestamp = report.blockTimestamp;
181
- receipt.status = (report.confirmed
190
+ (receipt.blockHash = report.blockHash),
191
+ (receipt.blockEpoch = report.blockEpoch),
192
+ (receipt.blockTimestamp = report.blockTimestamp);
193
+ receipt.status = report.confirmed
182
194
  ? "finalized"
183
- : (report?.confirmations >= confirmations ? "confirmed" : "mined"));
195
+ : report?.confirmations >= confirmations
196
+ ? "confirmed"
197
+ : "mined";
184
198
  }
185
199
  break;
186
200
  case "mined":
187
- if (!report?.blockHash || report.blockHash !== receipt.blockHash) {
201
+ if (!report?.blockHash ||
202
+ report.blockHash !== receipt.blockHash) {
188
203
  delete receipt.blockHash;
189
204
  delete receipt.blockEpoch;
190
205
  delete receipt.blockMiner;
@@ -192,9 +207,11 @@ class Transmitter {
192
207
  receipt.status = "relayed";
193
208
  }
194
209
  else {
195
- receipt.status = (report.confirmed
210
+ receipt.status = report.confirmed
196
211
  ? "finalized"
197
- : (report?.confirmations >= confirmations ? "confirmed" : "mined"));
212
+ : report?.confirmations >= confirmations
213
+ ? "confirmed"
214
+ : "mined";
198
215
  if (report?.confirmations !== receipt.confirmations) {
199
216
  receipt.confirmations = report.confirmations;
200
217
  if (receipt.status === "mined" && options?.onCheckpoint)
@@ -202,27 +219,25 @@ class Transmitter {
202
219
  options.onCheckpoint(receipt);
203
220
  }
204
221
  catch { }
205
- ;
206
222
  }
207
223
  }
208
224
  break;
209
225
  }
210
- ;
211
226
  if (status !== receipt.status) {
212
227
  receipt.timestamp = Math.floor(Date.now() / 1000);
213
- if (!["confirmed", "finalized"].includes(receipt.status) && options?.onStatusChange)
228
+ if (!["confirmed", "finalized"].includes(receipt.status) &&
229
+ options?.onStatusChange)
214
230
  try {
215
231
  options.onStatusChange(receipt);
216
232
  }
217
233
  catch { }
218
- ;
219
234
  }
220
- rpc_1.JsonRpcProvider.receipts[hash] = receipt;
235
+ JsonRpcProvider.receipts[hash] = receipt;
221
236
  return ["relayed", "mined"].includes(receipt.status);
222
237
  },
223
- interval, timeout,
224
- })
225
- .then(async () => {
238
+ interval,
239
+ timeout,
240
+ }).then(async () => {
226
241
  if (receipt.status === "removed" && receipt.type !== "Unstake") {
227
242
  // TRANSACTION REMOVED FROM MEMPOOL //
228
243
  // 1. Try to recover input utxos belonging to ledger's addresses:
@@ -233,7 +248,9 @@ class Transmitter {
233
248
  if (inputs.length === signatures.length) {
234
249
  inputs.forEach((metadata, index) => ({
235
250
  ...metadata,
236
- signer: types_1.PublicKey.fromProtobuf(signatures[index].public_key).hash().toBech32(this.network),
251
+ signer: PublicKey.fromProtobuf(signatures[index].public_key)
252
+ .hash()
253
+ .toBech32(this.network),
237
254
  }));
238
255
  }
239
256
  this.ledger.addUtxos(...utxos);
@@ -242,17 +259,17 @@ class Transmitter {
242
259
  console.error(`${this.constructor.name}: warning: cannot recover input UTXOS from tx ${hash}: ${err}`);
243
260
  }
244
261
  // 2. Throw MempoolError
245
- throw new types_1.MempoolError(receipt, `${this.constructor.name}: transaction removed from mempool: ${hash}`);
262
+ throw new MempoolError(receipt, `${this.constructor.name}: transaction removed from mempool: ${hash}`);
246
263
  }
247
264
  else {
248
265
  // TRANSACTION EITHER CONFIRMED OR FINALIZED //
249
- // 1. Try to load value transfer outputs into the ledger's local cache:
266
+ // 1. Try to load value transfer outputs into the ledger's local cache:
250
267
  try {
251
268
  const utxos = [];
252
269
  if (["Stake", "Unstake"].includes(receipt.type)) {
253
- let vto = (receipt.type === "Stake"
270
+ const vto = receipt.type === "Stake"
254
271
  ? receipt.tx[receipt.type].body?.output
255
- : receipt.tx[receipt.type].body?.withdrawal);
272
+ : receipt.tx[receipt.type].body?.withdrawal;
256
273
  if (vto) {
257
274
  utxos.push({
258
275
  output_pointer: `${receipt.hash}:0`,
@@ -278,11 +295,10 @@ class Transmitter {
278
295
  catch (err) {
279
296
  console.error(`${this.constructor.name}: warning: cannot recover output UTXOs from ${hash}: ${err}`);
280
297
  }
281
- // 2. Add blockMiner address to the transaction receipt:
282
- if (receipt?.blockHash && (0, utils_1.isHexString)(receipt.blockHash)) {
298
+ // 2. Add blockMiner address to the transaction receipt:
299
+ if (receipt?.blockHash && isHexString(receipt.blockHash)) {
283
300
  const block = await this.provider.getBlock(receipt.blockHash || "");
284
- rpc_1.JsonRpcProvider.receipts[hash].blockMiner = types_1.PublicKey
285
- .fromProtobuf(block.block_sig.public_key)
301
+ JsonRpcProvider.receipts[hash].blockMiner = PublicKey.fromProtobuf(block.block_sig.public_key)
286
302
  .hash()
287
303
  .toBech32(this.network);
288
304
  }
@@ -291,11 +307,10 @@ class Transmitter {
291
307
  options.onStatusChange(receipt);
292
308
  }
293
309
  catch { }
294
- ;
295
310
  // 3. Return transaction receipt:
296
- return rpc_1.JsonRpcProvider.receipts[hash];
311
+ return JsonRpcProvider.receipts[hash];
297
312
  }
298
- })
313
+ }),
299
314
  ]);
300
315
  }
301
316
  _cleanSignatures(newTarget) {
@@ -316,7 +331,7 @@ class Transmitter {
316
331
  _getInflightReceipt() {
317
332
  const hash = this._payload.hash;
318
333
  if (hash) {
319
- return rpc_1.JsonRpcProvider.receipts[hash];
334
+ return JsonRpcProvider.receipts[hash];
320
335
  }
321
336
  else {
322
337
  return undefined;
@@ -332,7 +347,7 @@ class Transmitter {
332
347
  _recoverInputUtxos() { }
333
348
  _recoverOutputUtxos() { }
334
349
  _upsertTransactionReceipt(hash, target, status) {
335
- rpc_1.JsonRpcProvider.receipts[hash] = {
350
+ JsonRpcProvider.receipts[hash] = {
336
351
  ...this._payload.intoReceipt(target, this.network),
337
352
  hash,
338
353
  change: this._payload.change,
@@ -345,11 +360,10 @@ class Transmitter {
345
360
  value: this._payload.value,
346
361
  weight: this._payload.weight,
347
362
  };
348
- return rpc_1.JsonRpcProvider.receipts[hash];
363
+ return JsonRpcProvider.receipts[hash];
349
364
  }
350
365
  }
351
- exports.Transmitter = Transmitter;
352
- class TransmitterMultiSig extends Transmitter {
366
+ export class TransmitterMultiSig extends Transmitter {
353
367
  constructor(protoTypeName, payload, ledger, changePkh) {
354
368
  super(protoTypeName, payload, ledger, changePkh);
355
369
  this._payload = payload;
@@ -382,7 +396,7 @@ class TransmitterMultiSig extends Transmitter {
382
396
  throw Error(`${this.constructor.name}: internal error: unable to hashify payload: ${this._payload.toJSON(true, this.network)}}.`);
383
397
  }
384
398
  else {
385
- this._payload.inputs.forEach(utxo => {
399
+ this._payload.inputs.forEach((utxo) => {
386
400
  const signer = this.ledger.getSigner(utxo.signer);
387
401
  if (!signer)
388
402
  throw Error(`${this.constructor.name}: internal error: cannot find Signer ${utxo.signer} in ${this.ledger.constructor.name} ${this.ledger.pkh}.`);
@@ -412,5 +426,4 @@ class TransmitterMultiSig extends Transmitter {
412
426
  }
413
427
  }
414
428
  }
415
- exports.TransmitterMultiSig = TransmitterMultiSig;
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNtaXR0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jcnlwdG8vdHJhbnNtaXR0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUV4RCwyQ0FBaUU7QUFDakUsTUFBTSxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQTtBQUdsRixnQ0FBd0M7QUFFeEMsb0NBQXVDO0FBVXZDLG1DQVlnQjtBQUVoQixNQUFzQixXQUFXO0lBVTdCLFlBQWEsYUFBcUIsRUFBRSxPQUFnQixFQUFFLE1BQWUsRUFBRSxTQUErQjtRQUg1RixnQkFBVyxHQUEwQixFQUFFLENBQUE7UUFDdkMsa0JBQWEsR0FBZ0IsRUFBRSxDQUFBO1FBR3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixNQUFNLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSx5Q0FBeUMsQ0FBQyxDQUFBO1FBQ3RGLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFBO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLCtDQUErQyxJQUFJLENBQUMsU0FBUyxH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QUFJLENBQUMsTUFBTTtvQkFBRSxNQUFNLEtBQUssQ0FDcEIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksd0NBQXdDLElBQUksQ0FBQyxNQUFNLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQ3ZJLENBQUM7cUJBQU0sQ0FBQztvQkFDTCxpRUFBaUU7b0JBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQkFDaEQsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFBO1lBQ0YsT0FBTyxJQUFJLENBQUE7UUFDZixDQUFDO0lBQ0wsQ0FBQztJQUVTLE9BQU8sQ0FBQyxRQUFpQjtRQUMvQixPQUFPO1lBQ0gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDL0I7U0FDSixDQUFBO0lBQ0wsQ0FBQztJQUVTLFdBQVc7UUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0IsT0FBTztnQkFDSCxJQUFJO2dCQUNKLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVzthQUMvQixDQUFBO1FBQ0wsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQXJFRCxrREFxRUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBwcm9taXNlUG9sbGVyID0gcmVxdWlyZSgncHJvbWlzZS1wb2xsZXInKS5kZWZhdWx0O1xyXG5cclxuaW1wb3J0IHsgUm9vdCBhcyBQcm90b1Jvb3QsIFR5cGUgYXMgUHJvdG9UeXBlIH0gZnJvbSBcInByb3RvYnVmanNcIlxyXG5jb25zdCBwcm90b1Jvb3QgPSBQcm90b1Jvb3QuZnJvbUpTT04ocmVxdWlyZShcIi4uLy4uLy4uL3dpdG5ldC93aXRuZXQucHJvdG8uanNvblwiKSkgXHJcblxyXG5pbXBvcnQgeyBUcmFuc2FjdGlvblJlcG9ydCwgVXR4b01ldGFkYXRhLCBWYWx1ZVRyYW5zZmVyT3V0cHV0IH0gZnJvbSBcIi4uL3JwYy90eXBlc1wiXHJcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuLi9ycGNcIlxyXG5pbXBvcnQgeyBIYXNoLCBOZXR3b3JrIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuaW1wb3J0IHsgaXNIZXhTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCB7IFxyXG4gICAgSUxlZGdlcixcclxuICAgIElKc29uUnBjUHJvdmlkZXIsIFxyXG4gICAgSVRyYW5zbWl0dGVyLCBcclxuICAgIElUcmFuc2FjdGlvblBheWxvYWQsIFxyXG4gICAgSVRyYW5zYWN0aW9uUGF5bG9hZE11bHRpU2lnLCBcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCJcclxuXHJcbmltcG9ydCB7IFxyXG4gICAgS2V5ZWRTaWduYXR1cmUsIFxyXG4gICAgUHVibGljS2V5LCBcclxuICAgIFB1YmxpY0tleUhhc2hTdHJpbmcsIFxyXG4gICAgTWVtcG9vbEVycm9yLFxyXG4gICAgVHJhbnNhY3Rpb25DYWxsYmFjaywgXHJcbiAgICBUcmFuc2FjdGlvblJlY2VpcHQsIFxyXG4gICAgVHJhbnNhY3Rpb25TdGF0dXMsIFxyXG4gICAgVGltZW91dEVycm9yLFxyXG4gICAgVHJhbnNtaXNzaW9uLFxyXG4gICAgVHJhbnNtaXNzaW9uRXJyb3IsXHJcbiAgICBVdHhvLFxyXG59IGZyb20gXCIuL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc21pdHRlcjxTcGVjcywgUGF5bG9hZCBleHRlbmRzIElUcmFuc2FjdGlvblBheWxvYWQ8U3BlY3M+PiBpbXBsZW1lbnRzIElUcmFuc21pdHRlciB7XHJcbiAgICBcclxuICAgIHB1YmxpYyByZWFkb25seSBsZWRnZXI6IElMZWRnZXI7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlUGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nO1xyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgX3BheWxvYWQ6IFBheWxvYWQ7XHJcbiAgICBwcm90ZWN0ZWQgX3Byb3RvQnVmOiBQcm90b1R5cGU7XHJcbiAgICBwcm90ZWN0ZWQgX3NpZ25hdHVyZXM6IEFycmF5PEtleWVkU2lnbmF0dXJlPiA9IFtdXHJcbiAgICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uczogQXJyYXk8SGFzaD4gPSBbXVxyXG5cclxuICAgIGNvbnN0cnVjdG9yIChwcm90b1R5cGVOYW1lOiBzdHJpbmcsIHBheWxvYWQ6IFBheWxvYWQsIGxlZGdlcjogSUxlZGdlciwgY2hhbmdlUGtoPzogUHVibGljS2V5SGFzaFN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3Byb3RvQnVmID0gcHJvdG9Sb290Lmxvb2t1cFR5cGUocHJvdG9UeXBlTmFtZSlcclxuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcclxuICAgICAgICB0aGlzLmxlZGdlciA9IGxlZGdlclxyXG4gICAgICAgIGlmICghbGVkZ2VyLnByb3ZpZGVyLm5ldHdvcmspIHtcclxuICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGxlZGdlcidzIHByb3ZpZGVyIGlzIG5vdCBpbml0aWFsaXplZC5gKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoYW5nZVBraCA9IGNoYW5nZVBraCB8fCBsZWRnZXIuY2hhbmdlUGtoXHJcbiAgICAgICAgaWYgKCFsZWRnZXIuZ2V0U2lnbmVyKHRoaXMuY2hhbmdlUGtoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogbGVkZ2VyIGhvbGRzIG5vIFNpZ25lciBmb3IgY2hhbmdlIGFkZHJlc3MgJHt0aGlzLmNoYW5nZVBraH0uYClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBwYXlsb2FkKCk6IFBheWxvYWQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkLnByZXBhcmVkID8gdGhpcy5fcGF5bG9hZCA6IHVuZGVmaW5lZFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHJvdmlkZXIoKTogSUpzb25ScGNQcm92aWRlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGVkZ2VyLnByb3ZpZGVyXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBuZXR3b3JrKCk6IE5ldHdvcmsge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLm5ldHdvcmsgfHwgXCJtYWlubmV0XCJcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRyYW5zYWN0aW9ucygpOiBBcnJheTxIYXNoPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uc1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkLmNvbnN0cnVjdG9yLm5hbWUuc3BsaXQoLyhbYS16XSg/PVtBLVpdKSkvZykuc2xpY2UoMCwgLTEpLmpvaW4oXCJcIilcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IF9mcm9tKCk6IEFycmF5PFB1YmxpY0tleUhhc2hTdHJpbmc+IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fc2lnbmF0dXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmVzXHJcbiAgICAgICAgICAgICAgICAubWFwKGtzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwa2ggPSBQdWJsaWNLZXkuZnJvbVByb3RvYnVmKGtzLnB1YmxpY19rZXkpLmhhc2goKS50b0JlY2gzMih0aGlzLm5ldHdvcmspXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVkZ2VyLmdldFNpZ25lcihwa2gpPy5wa2ggfHwgdGhpcy5sZWRnZXIucGtoXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgcmVwZXRpdGlvbnNcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBraCwgaW5kZXgsIGFycmF5KSA9PiBpbmRleCA9PT0gYXJyYXkuaW5kZXhPZihwa2gpKVxyXG4gICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBfcHJlcGFyZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdGhpcy5fcGF5bG9hZC5wcmVwYXJlZFxyXG4gICAgICAgICAgICAgICAgJiYgISF0aGlzLl9zaWduYXR1cmVzXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLl9zaWduYXR1cmVzLmxlbmd0aCA+IDBcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNlbmRUcmFuc2FjdGlvbih0YXJnZXQ/OiBTcGVjcyk6IFByb21pc2U8VHJhbnNhY3Rpb25SZWNlaXB0PiB7XHJcbiAgICAgICAgbGV0IHJlY2VpcHQgPSB0aGlzLl9nZXRJbmZsaWdodFJlY2VpcHQoKVxyXG4gICAgICAgIGlmICghcmVjZWlwdCB8fCB0YXJnZXQpIHtcclxuICAgICAgICAgICAgLy8gaWYgaW5mbGlnaHQgbm90IHlldCBwcmVwYXJlZCwgb3IgcHJlcGFyZWQgYnV0IG5vdCB5ZXQgdHJhbnNtaXR0ZWQsXHJcbiAgICAgICAgICAgIC8vIHByZXBhcmUgYSBuZXcgaW5mbGlnaHQgZWl0aGVyIHdpdGggc3BlY2lmaWVkIHBhcmFtcyAoaWYgYW55KSxcclxuICAgICAgICAgICAgLy8gb3IgcHJldmlvdXNseSBwcmVwYXJlZCBpbmZsaWdodCAoaWYga25vd24pLlxyXG4gICAgICAgICAgICByZWNlaXB0ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odGFyZ2V0IHx8IHJlY2VpcHQgYXMgU3BlY3MpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWNlaXB0Py5zdGF0dXMgJiYgcmVjZWlwdC5zdGF0dXMgIT09IFwic2lnbmVkXCIgJiYgIXJlY2VpcHQ/LmVycm9yKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIGN1cnJlbnQgaW5mbGlnaHQgd2FzIGFscmVhZHkgdHJhbnNtaXR0ZWQgYW5kIGl0J3Mgbm90IHlldCBrbm93biB0byBmYWlsIC4uLlxyXG4gICAgICAgICAgICByZXR1cm4gcmVjZWlwdFxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB3ZSByZWFjaCB0aGlzIHBvaW50IGlzIGJlY2F1c2UgYW4gaW5mbGlnaHQgdHJhbnNhY3Rpb24gaXMgXHJcbiAgICAgICAgLy8gcmVhZHkgdG8gYmUgdHJhbnNtaXR0ZWRcclxuICAgICAgICBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5zdGF0dXMgPSBcInBlbmRpbmdcIlxyXG4gICAgICAgIGRlbGV0ZSBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5lcnJvclxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyXHJcbiAgICAgICAgICAgIC5zZW5kUmF3VHJhbnNhY3Rpb24odGhpcy5fdG9KU09OKGZhbHNlKSlcclxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBUcmFuc21pc3Npb25FcnJvcih0aGlzLl9nZXRJbmZsaWdodFRyYW5zbWlzc2lvbigpLCBlcnIpXHJcbiAgICAgICAgICAgICAgICBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5lcnJvciA9IGVycm9yXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihhY2NlcHRlZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5zdGF0dXMgPSBcInJlbGF5ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBUcmFuc21pc3Npb25FcnJvcih0aGlzLl9nZXRJbmZsaWdodFRyYW5zbWlzc2lvbigpLCBFcnJvcihgUmVqZWN0ZWQgZm9yIHVua25vd24gcmVhc29uc2ApKVxyXG4gICAgICAgICAgICAgICAgICAgIEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1tyZWNlaXB0Lmhhc2hdLmVycm9yID0gZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzaWduVHJhbnNhY3Rpb24odGFyZ2V0PzogU3BlY3MsIHJlbG9hZFV0eG9zID0gZmFsc2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVjZWlwdD4ge1xyXG4gICAgICAgIHRhcmdldCA9IGF3YWl0IHRoaXMuX3BheWxvYWQudmFsaWRhdGVUYXJnZXQodGFyZ2V0KVxyXG4gICAgICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIC8vIGUuZy4gaWYgY2FsbGVkIGZyb20gdGhpcy5zZW5kKCkgd2l0aCBubyBwYXJhbXNcclxuICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGNhbm5vdCBzaWduIGEgdHJhbnNhY3Rpb24gaWYgbm8gcGFyYW1zIHdlcmUgcHJldmlvdXNseSBzcGVjaWZpZWQuYClcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaW5mbGlnaHQgPSB0aGlzLl9nZXRJbmZsaWdodFJlY2VpcHQoKVxyXG4gICAgICAgIGlmIChpbmZsaWdodCkge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNpZ24ucGVuZGluZ1JlY2VpcHQgPT5cIiwgaW5mbGlnaHQpXHJcbiAgICAgICAgICAgIGlmICghaW5mbGlnaHQ/LnN0YXR1cyB8fCBpbmZsaWdodC5zdGF0dXMgPT09IFwic2lnbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgaW5wdXQgdXR4b3MgaWYgcHJldmlvdXNseSBzaWduZWQgcGFyYW1zIHdlcmUgbm90IGV2ZW4gYXR0ZW1wdGVkIHRvIGJlIHNlbnRcclxuICAgICAgICAgICAgICAgIGlmICghcmVsb2FkVXR4b3MpIHRoaXMuX3JlY292ZXJJbnB1dFV0eG9zKClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mbGlnaHQuc3RhdHVzID09PSBcInBlbmRpbmdcIiAmJiAhaW5mbGlnaHQuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBhIGZvcm1lcmx5IHNpZ25lZCB0cmFuc2FjdGlvbiBpcyBzdGlsbCB3YWl0aW5nIHRvIGJlIHJlbGF5ZWQgYnkgYSBwcm92aWRlclxyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogaW4tZmxpZ2h0IHR4IGJlaW5nIHJlbGF5ZWQ6ICR7aW5mbGlnaHQuaGFzaH1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBcclxuICAgICAgICBcclxuICAgICAgICAvLyBjbGVhbiBjdXJyZW50IHNpZ25hdHVyZXMsIHNvIG5ldyBVVFhPcyBjYW4gYmUgY29uc3VtZWQgYW5kIHRoZXJlZm9yZSBhIG5ldyB0cmFuc2FjdGlvbiBoYXNoIGJlIGluY2VwdGVkXHJcbiAgICAgICAgdGhpcy5fY2xlYW5TaWduYXR1cmVzKHRhcmdldClcclxuICAgICAgICBcclxuICAgICAgICAvLyBpZiBub3QgeWV0IHByZXBhcmVkLCB0cnkgdG8gY292ZXIgdHJhbnNhY3Rpb24gZXhwZW5zZXMgd2l0aCBleGlzdGluZyB1dHhvcyBvbiBzaWduZXJzOlxyXG4gICAgICAgIGxldCBjaGFuZ2UgPSAwblxyXG4gICAgICAgIGlmICghdGhpcy5fcGF5bG9hZC5wcmVwYXJlZCkge1xyXG4gICAgICAgICAgICBjaGFuZ2UgPSBhd2FpdCB0aGlzLl9wYXlsb2FkLmNvbnN1bWVVdHhvcyh0aGlzLmxlZGdlciwgcmVsb2FkVXR4b3MpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGNhbm5vdCBjb25zdW1lIFVUWE9zIGZyb20gJHt0aGlzLmxlZGdlci5jb25zdHJ1Y3Rvci5uYW1lfSAke3RoaXMubGVkZ2VyLnBraH06ICR7ZXJyfS5gXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH0pICBcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF0aGlzLl9wYXlsb2FkLnByZXBhcmVkKSB7XHJcbiAgICAgICAgICAgIC8vIHRocm93cyBleGVjZXB0aW9uIGlmIG5vdCBlbm91Z2ggdXR4b3Mgd2VyZSBmb3VuZCB0byBjb3ZlciB0cmFuc2FjdGlvbiBleHBlbnNlczpcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBpbnN1ZmZpY2llbnQgZnVuZHMgb24gJHt0aGlzLmxlZGdlci5jb25zdHJ1Y3Rvci5uYW1lfSAke3RoaXMubGVkZ2VyLnBraH0ke2NoYW5nZSA8IDAgPyBgOiByZXF1aXJlcyBleHRyYSAkey1jaGFuZ2V9ICRuYW5vd2l0cy5gIDogXCIuXCJ9YFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfSBcclxuXHJcbiAgICAgICAgLy8gZG91YmxlLWNoZWNrIHdlaWdodCBkb2VzIG5vdCBleGNlZWRzIGJsb2NrIGxpbWl0Li4uXHJcbiAgICAgICAgaWYgKHRoaXMuX3BheWxvYWQud2VpZ2h0ID4gdGhpcy5fcGF5bG9hZC5tYXhXZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB0cmFuc2FjdGlvbiB3ZWlnaHQgZXhjZWVkZWQgYmxvY2sgbGltaXQ6ICR7dGhpcy5fcGF5bG9hZC53ZWlnaHR9ID4gJHt0aGlzLl9wYXlsb2FkLm1heFdlaWdodH0uYFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzaWduaW5nIHRoZSB0cmFuc2FjdGlvbiBwYXlsb2FkIGdlbmVyYXRlcyB0aGUgdHJhbnNhY3Rpb24gaGFzaCwgYW5kIHRoZSByZWNlaXB0XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vwc2VydFRyYW5zYWN0aW9uUmVjZWlwdCh0aGlzLl9zaWduVHJhbnNhY3Rpb25QYXlsb2FkKCksIHRhcmdldCwgXCJzaWduZWRcIikgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGNvbmZpcm1UcmFuc2FjdGlvbihcclxuICAgICAgICBoYXNoOiBIYXNoLCBcclxuICAgICAgICBvcHRpb25zPzoge1xyXG4gICAgICAgICAgICBjb25maXJtYXRpb25zPzogbnVtYmVyLFxyXG4gICAgICAgICAgICB0aW1lb3V0U2Vjcz86IG51bWJlcixcclxuICAgICAgICAgICAgb25DaGVja3BvaW50PzogVHJhbnNhY3Rpb25DYWxsYmFjayxcclxuICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2U/OiBUcmFuc2FjdGlvbkNhbGxiYWNrLFxyXG4gICAgICAgIH1cclxuICAgICk6IFByb21pc2U8VHJhbnNhY3Rpb25SZWNlaXB0PiB7XHJcblxyXG4gICAgICAgIGxldCByZWNlaXB0ID0gSnNvblJwY1Byb3ZpZGVyLnJlY2VpcHRzW2hhc2hdXHJcbiAgICAgICAgaWYgKCFyZWNlaXB0IHx8IHJlY2VpcHQuaGFzaCAhPT0gaGFzaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogdHJhbnNhY3Rpb24gbm90IGZvdW5kOiAke2hhc2h9YClcclxuICAgICAgICBcclxuICAgICAgICB9IGVsc2UgaWYgKFtcInNpZ25lZFwiLCBcInBlbmRpbmdcIl0uaW5jbHVkZXMocmVjZWlwdC5zdGF0dXMpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB0cmFuc2FjdGlvbiBzdGF0dXMgXCIke3JlY2VpcHQuc3RhdHVzfVwiOiAke2hhc2h9YClcclxuICAgICAgICBcclxuICAgICAgICB9IGVsc2UgaWYgKHJlY2VpcHQuc3RhdHVzID09PSBcInJlbW92ZWRcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWVtcG9vbEVycm9yKHJlY2VpcHQsIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IHRyYW5zYWN0aW9uIHJlbW92ZWQgZnJvbSBtZW1wb29sOiAke2hhc2h9YClcclxuICAgICAgICBcclxuICAgICAgICB9IGVsc2UgaWYgKHJlY2VpcHQuc3RhdHVzID09PSBcInJlbGF5ZWRcIiAmJiBvcHRpb25zPy5vblN0YXR1c0NoYW5nZSkgdHJ5IHtcclxuICAgICAgICAgICAgb3B0aW9ucy5vblN0YXR1c0NoYW5nZShyZWNlaXB0KVxyXG4gICAgICAgIH0gY2F0Y2gge307XHJcblxyXG4gICAgICAgIGNvbnN0IGdsb2JhbFRpbWVyID0gKHN0YXJ0OiBudW1iZXIsIG1zOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IHBvbGxpbmcgdGltZW91dCBhZnRlciAke01hdGguZmxvb3IoKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwKX0gc2VjcykuYCksIFxyXG4gICAgICAgICAgICAgICAgICAgIG1zXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IFtjb25maXJtYXRpb25zLCBpbnRlcnZhbCwgdGltZW91dCwgZ2xvYmFsVGltZW91dF0gPSBbXHJcbiAgICAgICAgICAgIG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMCxcclxuICAgICAgICAgICAgMTAwMDAsXHJcbiAgICAgICAgICAgIDUwMDAsXHJcbiAgICAgICAgICAgIChvcHRpb25zPy50aW1lb3V0U2VjcyB8fCA2MDApICogMTAwMCxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgICAgZ2xvYmFsVGltZXIoRGF0ZS5ub3coKSwgZ2xvYmFsVGltZW91dClcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uOiBhbnkpID0+IHsgdGhyb3cgbmV3IFRpbWVvdXRFcnJvcihnbG9iYWxUaW1lb3V0LCByZWNlaXB0LCByZWFzb24pIH0pLFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcHJvbWlzZVBvbGxlcih7XHJcbiAgICAgICAgICAgICAgICB0YXNrRm46ICgpID0+IHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24oaGFzaCkuY2F0Y2goZXJyID0+IGVyciksXHJcbiAgICAgICAgICAgICAgICBzaG91bGRDb250aW51ZTogKGVycm9yOiBhbnksIHJlcG9ydDogVHJhbnNhY3Rpb25SZXBvcnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZWNlaXB0LnN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY2VpcHQuZXJyb3IgPSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5kZXhPZihcIkl0ZW1Ob3RGb3VuZFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQuc3RhdHVzID0gXCJyZW1vdmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugc3dpdGNoIChyZWNlaXB0LnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmVsYXllZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9ydD8uYmxvY2tIYXNoICYmIGlzSGV4U3RyaW5nKHJlcG9ydC5ibG9ja0hhc2gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWlwdC5jb25maXJtYXRpb25zID0gcmVwb3J0LmNvbmZpcm1hdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXB0LmJsb2NrSGFzaCA9IHJlcG9ydC5ibG9ja0hhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWlwdC5ibG9ja0Vwb2NoID0gcmVwb3J0LmJsb2NrRXBvY2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWlwdC5ibG9ja1RpbWVzdGFtcCA9IHJlcG9ydC5ibG9ja1RpbWVzdGFtcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQuc3RhdHVzID0gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuY29uZmlybWVkIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImZpbmFsaXplZFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocmVwb3J0Py5jb25maXJtYXRpb25zID49IGNvbmZpcm1hdGlvbnMgPyBcImNvbmZpcm1lZFwiIDogXCJtaW5lZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtaW5lZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXBvcnQ/LmJsb2NrSGFzaCB8fCByZXBvcnQuYmxvY2tIYXNoICE9PSByZWNlaXB0LmJsb2NrSGFzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZWNlaXB0LmJsb2NrSGFzaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZWNlaXB0LmJsb2NrRXBvY2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVjZWlwdC5ibG9ja01pbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlY2VpcHQuYmxvY2tUaW1lc3RhbXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXB0LnN0YXR1cyA9IFwicmVsYXllZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWlwdC5zdGF0dXMgPSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5jb25maXJtZWQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiZmluYWxpemVkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChyZXBvcnQ/LmNvbmZpcm1hdGlvbnMgPj0gY29uZmlybWF0aW9ucyA/IFwiY29uZmlybWVkXCIgOiBcIm1pbmVkXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3J0Py5jb25maXJtYXRpb25zICE9PSByZWNlaXB0LmNvbmZpcm1hdGlvbnMpIHsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQuY29uZmlybWF0aW9ucyA9IHJlcG9ydC5jb25maXJtYXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNlaXB0LnN0YXR1cyA9PT0gXCJtaW5lZFwiICYmIG9wdGlvbnM/Lm9uQ2hlY2twb2ludCkgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25DaGVja3BvaW50KHJlY2VpcHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gcmVjZWlwdC5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWlwdC50aW1lc3RhbXAgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFbXCJjb25maXJtZWRcIiwgXCJmaW5hbGl6ZWRcIl0uaW5jbHVkZXMocmVjZWlwdC5zdGF0dXMpICYmIG9wdGlvbnM/Lm9uU3RhdHVzQ2hhbmdlKSB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblN0YXR1c0NoYW5nZShyZWNlaXB0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbaGFzaF0gPSByZWNlaXB0XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcInJlbGF5ZWRcIiwgXCJtaW5lZFwiXS5pbmNsdWRlcyhyZWNlaXB0LnN0YXR1cylcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBpbnRlcnZhbCwgdGltZW91dCwgXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNlaXB0LnN0YXR1cyA9PT0gXCJyZW1vdmVkXCIgJiYgcmVjZWlwdC50eXBlICE9PSBcIlVuc3Rha2VcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUUkFOU0FDVElPTiBSRU1PVkVEIEZST00gTUVNUE9PTCAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBUcnkgdG8gcmVjb3ZlciBpbnB1dCB1dHhvcyBiZWxvbmdpbmcgdG8gbGVkZ2VyJ3MgYWRkcmVzc2VzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRzOiBBcnJheTxVdHhvTWV0YWRhdGE+ID0gcmVjZWlwdC50eFtyZWNlaXB0LnR5cGVdLmJvZHkuaW5wdXRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduYXR1cmVzOiBBcnJheTxLZXllZFNpZ25hdHVyZT4gPSByZWNlaXB0LnR4W3JlY2VpcHQudHlwZV0uc2lnbmF0dXJlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXR4b3M6IEFycmF5PFV0eG8+ID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSBzaWduYXR1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKChtZXRhZGF0YSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1ldGFkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXI6IFB1YmxpY0tleS5mcm9tUHJvdG9idWYoc2lnbmF0dXJlc1tpbmRleF0ucHVibGljX2tleSkuaGFzaCgpLnRvQmVjaDMyKHRoaXMubmV0d29yayksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZGdlci5hZGRVdHhvcyguLi51dHhvcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IHdhcm5pbmc6IGNhbm5vdCByZWNvdmVyIGlucHV0IFVUWE9TIGZyb20gdHggJHtoYXNofTogJHtlcnJ9YClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBUaHJvdyBNZW1wb29sRXJyb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1lbXBvb2xFcnJvcihyZWNlaXB0LCBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB0cmFuc2FjdGlvbiByZW1vdmVkIGZyb20gbWVtcG9vbDogJHtoYXNofWApO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRSQU5TQUNUSU9OIEVJVEhFUiBDT05GSVJNRUQgT1IgRklOQUxJWkVEIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFRyeSB0byBsb2FkIHZhbHVlIHRyYW5zZmVyIG91dHB1dHMgaW50byB0aGUgbGVkZ2VyJ3MgbG9jYWwgY2FjaGU6IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXR4b3M6IEFycmF5PFV0eG8+ID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbXCJTdGFrZVwiLCBcIlVuc3Rha2VcIl0uaW5jbHVkZXMocmVjZWlwdC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2dG86IFZhbHVlVHJhbnNmZXJPdXRwdXQgPSAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQudHlwZSA9PT0gXCJTdGFrZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlY2VpcHQudHhbcmVjZWlwdC50eXBlXS5ib2R5Py5vdXRwdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVjZWlwdC50eFtyZWNlaXB0LnR5cGVdLmJvZHk/LndpdGhkcmF3YWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2dG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXR4b3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcG9pbnRlcjogYCR7cmVjZWlwdC5oYXNofTowYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVsb2NrOiB2dG8udGltZV9sb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXR4b19tYXR1cmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQmlnSW50KHZ0by52YWx1ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXI6IHZ0by5wa2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRzOiBBcnJheTxWYWx1ZVRyYW5zZmVyT3V0cHV0PiA9IHJlY2VpcHQudHhbcmVjZWlwdC50eXBlXS5ib2R5Py5vdXRwdXRzIHx8IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5mb3JFYWNoKCh2dG8sIGluZGV4KSA9PiB1dHhvcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3BvaW50ZXI6IGAke3JlY2VpcHQuaGFzaH06JHtpbmRleH1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lbG9jazogdnRvLnRpbWVfbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXR4b19tYXR1cmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQodnRvLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVyOiB2dG8ucGtoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWRnZXIuYWRkVXR4b3MoLi4udXR4b3MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB3YXJuaW5nOiBjYW5ub3QgcmVjb3ZlciBvdXRwdXQgVVRYT3MgZnJvbSAke2hhc2h9OiAke2Vycn1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEFkZCBibG9ja01pbmVyIGFkZHJlc3MgdG8gdGhlIHRyYW5zYWN0aW9uIHJlY2VpcHQ6IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjZWlwdD8uYmxvY2tIYXNoICYmIGlzSGV4U3RyaW5nKHJlY2VpcHQuYmxvY2tIYXNoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmdldEJsb2NrKHJlY2VpcHQuYmxvY2tIYXNoIHx8IFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbaGFzaF0uYmxvY2tNaW5lciA9IFB1YmxpY0tleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tUHJvdG9idWYoYmxvY2suYmxvY2tfc2lnLnB1YmxpY19rZXkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc2goKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0JlY2gzMih0aGlzLm5ldHdvcmspO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblN0YXR1c0NoYW5nZSkgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25TdGF0dXNDaGFuZ2UocmVjZWlwdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gUmV0dXJuIHRyYW5zYWN0aW9uIHJlY2VpcHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbaGFzaF1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jbGVhblNpZ25hdHVyZXMobmV3VGFyZ2V0OiBTcGVjcyk6IGFueSB7XHJcbiAgICAgICAgdGhpcy5fcGF5bG9hZC5yZXNldFRhcmdldChuZXdUYXJnZXQpXHJcbiAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRJbmZsaWdodEJ5dGVjb2RlKCk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX3RvUHJvdG9idWYoKVxyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuX3Byb3RvQnVmLnZlcmlmeShvYmopXHJcbiAgICAgICAgaWYgKCFlcnIpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3Byb3RvQnVmLmZyb21PYmplY3Qob2JqKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9CdWYuZW5jb2RlKG1lc3NhZ2UpLmZpbmlzaCgpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldEluZmxpZ2h0UmVjZWlwdCgpOiBUcmFuc2FjdGlvblJlY2VpcHQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLl9wYXlsb2FkLmhhc2hcclxuICAgICAgICBpZiAoaGFzaCkge1xyXG4gICAgICAgICAgICByZXR1cm4gSnNvblJwY1Byb3ZpZGVyLnJlY2VpcHRzW2hhc2hdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldEluZmxpZ2h0VHJhbnNtaXNzaW9uKCk6IFRyYW5zbWlzc2lvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYnl0ZWNvZGU6IHRoaXMuX2dldEluZmxpZ2h0Qnl0ZWNvZGUoKSxcclxuICAgICAgICAgICAgaGFzaDogdGhpcy5fcGF5bG9hZC5oYXNoLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLl90b0pTT04odHJ1ZSksXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcmVjb3ZlcklucHV0VXR4b3MoKTogYW55IHt9XHJcbiAgICBwcm90ZWN0ZWQgX3JlY292ZXJPdXRwdXRVdHhvcygpOiBhbnkge31cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Vwc2VydFRyYW5zYWN0aW9uUmVjZWlwdChoYXNoOiBIYXNoLCB0YXJnZXQ6IFNwZWNzLCBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzKTogVHJhbnNhY3Rpb25SZWNlaXB0IHtcclxuICAgICAgICBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbaGFzaF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3BheWxvYWQuaW50b1JlY2VpcHQodGFyZ2V0LCB0aGlzLm5ldHdvcmspLFxyXG4gICAgICAgICAgICBoYXNoLFxyXG4gICAgICAgICAgICBjaGFuZ2U6IHRoaXMuX3BheWxvYWQuY2hhbmdlLFxyXG4gICAgICAgICAgICBmZWVzOiB0aGlzLl9wYXlsb2FkLmZlZXMsXHJcbiAgICAgICAgICAgIGZyb206IHRoaXMuX2Zyb20sXHJcbiAgICAgICAgICAgIHN0YXR1cyxcclxuICAgICAgICAgICAgdGltZXN0YW1wOiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSxcclxuICAgICAgICAgICAgdHg6IHRoaXMuX3RvSlNPTih0cnVlKSxcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fcGF5bG9hZC52YWx1ZSxcclxuICAgICAgICAgICAgd2VpZ2h0OiB0aGlzLl9wYXlsb2FkLndlaWdodCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1toYXNoXVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBfc2lnblRyYW5zYWN0aW9uUGF5bG9hZCgpOiBIYXNoO1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IF90b0pTT04oX2h1bWFuaXplOiBib29sZWFuKTogYW55O1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IF90b1Byb3RvYnVmKCk6IGFueTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc21pdHRlck11bHRpU2lnPFNwZWNzLCBQYXlsb2FkIGV4dGVuZHMgSVRyYW5zYWN0aW9uUGF5bG9hZE11bHRpU2lnPFNwZWNzPj4gXHJcbiAgICBleHRlbmRzIFRyYW5zbWl0dGVyPFNwZWNzLCBQYXlsb2FkPiBcclxue1xyXG4gICAgY29uc3RydWN0b3IgKHByb3RvVHlwZU5hbWU6IHN0cmluZywgcGF5bG9hZDogUGF5bG9hZCwgbGVkZ2VyOiBJTGVkZ2VyLCBjaGFuZ2VQa2g/OiBQdWJsaWNLZXlIYXNoU3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIocHJvdG9UeXBlTmFtZSwgcGF5bG9hZCwgbGVkZ2VyLCBjaGFuZ2VQa2gpXHJcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vIFJlY292ZXIgZm9ybWVybHkgY29uc3VtZWQgVVRYT3MgYnkgYSBmYWlsaW5nIHRyYW5zYWN0aW9uIGJhY2sgdG8gdGhlaXIgcmVzcGVjdGl2ZSBzaWduZXIncyBVVFhPIHBvb2xcclxuICAgIHByb3RlY3RlZCBfcmVjb3ZlcklucHV0VXR4b3MoKTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5fcGF5bG9hZC5pbnB1dHMpIHsgICAgXHJcbiAgICAgICAgICAgIHRoaXMubGVkZ2VyLmFkZFV0eG9zKC4uLnRoaXMuX3BheWxvYWQuaW5wdXRzKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy8gUmVjb3ZlciBzZWxmLXRhcmdldGVkIG91dHB1dHMgYXMgZXhwZW5kYWJsZSB1dHhvcyBvbiB0aGVpciByZXNwZWN0aXZlIHNpZ25lcidzIG1lbW9pemVkIGNhY2hlXHJcbiAgICBwcm90ZWN0ZWQgX3JlY292ZXJPdXRwdXRVdHhvcygpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXlsb2FkLmhhc2ggJiYgdGhpcy5fcGF5bG9hZC5vdXRwdXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHV0eG9zOiBBcnJheTxVdHhvPiA9IFtdXHJcbiAgICAgICAgICAgIHRoaXMuX3BheWxvYWQub3V0cHV0cy5mb3JFYWNoKCh2dG8sIGluZGV4KSA9PiB7ICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGVkZ2VyLmdldFNpZ25lcih2dG8ucGtoKSkgdXR4b3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVyOiB2dG8ucGtoLFxyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dF9wb2ludGVyOiBgJHt0aGlzLl9wYXlsb2FkLmhhc2h9OiR7aW5kZXh9YCxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lbG9jazogdnRvLnRpbWVfbG9jayxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdnRvLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5sZWRnZXIuYWRkVXR4b3MoLi4udXR4b3MpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2lnblRyYW5zYWN0aW9uUGF5bG9hZCgpOiBIYXNoIHtcclxuICAgICAgICBjb25zdCBoYXNoID0gdGhpcy5fcGF5bG9hZC5oYXNoXHJcbiAgICAgICAgaWYgKCFoYXNoKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogaW50ZXJuYWwgZXJyb3I6IHVuYWJsZSB0byBoYXNoaWZ5IHBheWxvYWQ6ICR7dGhpcy5fcGF5bG9hZC50b0pTT04odHJ1ZSwgdGhpcy5uZXR3b3JrKX19LmBcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BheWxvYWQuaW5wdXRzLmZvckVhY2godXR4byA9PiB7IFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVyID0gdGhpcy5sZWRnZXIuZ2V0U2lnbmVyKHV0eG8uc2lnbmVyKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFzaWduZXIpIHRocm93IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGludGVybmFsIGVycm9yOiBjYW5ub3QgZmluZCBTaWduZXIgJHt1dHhvLnNpZ25lcn0gaW4gJHt0aGlzLmxlZGdlci5jb25zdHJ1Y3Rvci5uYW1lfSAke3RoaXMubGVkZ2VyLnBraH0uYCAgICBcclxuICAgICAgICAgICAgICAgICk7IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGAuLi5zaWduZXIgJHtzaWduZXIucGtofSBzaWduaW5nIGhhc2ggJHtoYXNofS4uLmApXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHNpZ25lci5zaWduSGFzaChoYXNoKSkgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHJldHVybiBoYXNoXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdG9KU09OKGh1bWFuaXplOiBib29sZWFuKTogYW55IHtcclxuICAgICAgICByZXR1cm4geyBcclxuICAgICAgICAgICAgW3RoaXMudHlwZV06IHsgXHJcbiAgICAgICAgICAgICAgICBib2R5OiB0aGlzLl9wYXlsb2FkLnRvSlNPTihodW1hbml6ZSwgdGhpcy5uZXR3b3JrKSxcclxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZXM6IHRoaXMuX3NpZ25hdHVyZXMsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdG9Qcm90b2J1ZigpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9wYXlsb2FkLnRvUHJvdG9idWYoKVxyXG4gICAgICAgIGlmIChib2R5ICYmIHRoaXMuX3NpZ25hdHVyZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGJvZHksXHJcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVzOiB0aGlzLl9zaWduYXR1cmVzLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
429
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNtaXR0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jcnlwdG8vdHJhbnNtaXR0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLElBQUksYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztBQUU1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRS9DLE9BQU8sUUFBUSxNQUFNLFlBQVksQ0FBQztBQUVsQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUNyQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUNuQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FDNUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU9sRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVTFDLE9BQU8sRUFFTixZQUFZLEVBQ1osU0FBUyxFQUVULFlBQVksRUFLWixpQkFBaUIsR0FFakIsTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxPQUFnQixXQUFXO0lBS2hCLE1BQU0sQ0FBVTtJQUNoQixTQUFTLENBQXNCO0lBRXJDLFFBQVEsQ0FBVTtJQUNsQixTQUFTLENBQWdCO0lBQ3pCLFdBQVcsR0FBMEIsRUFBRSxDQUFDO0lBQ3hDLGFBQWEsR0FBZ0IsRUFBRSxDQUFDO0lBRTFDLFlBQ0MsYUFBcUIsRUFDckIsT0FBZ0IsRUFDaEIsTUFBZSxFQUNmLFNBQStCO1FBRS9CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FB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RVMsV0FBVztRQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QixPQUFPO2dCQUNOLElBQUk7Z0JBQ0osVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXO2FBQzVCLENBQUM7UUFDSCxDQUFDO0lBQ0YsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmYXVsdCBhcyBQcm9taXNlUG9sbGVyIH0gZnJvbSBcInByb21pc2UtcG9sbGVyXCI7XHJcblxyXG5jb25zdCBwcm9taXNlUG9sbGVyID0gUHJvbWlzZVBvbGxlci5kZWZhdWx0O1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xyXG5cclxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcclxuXHJcbmltcG9ydCBwcm90b2J1ZiBmcm9tIFwicHJvdG9idWZqc1wiO1xyXG5cclxuY29uc3QgeyBSb290OiBQcm90b1Jvb3QgfSA9IHByb3RvYnVmO1xyXG5jb25zdCBwcm90b1Jvb3QgPSBQcm90b1Jvb3QuZnJvbUpTT04oXHJcblx0cmVxdWlyZShcIi4uLy4uLy4uL3dpdG5ldC93aXRuZXQucHJvdG8uanNvblwiKSxcclxuKTtcclxuXHJcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuLi9ycGMvaW5kZXguanNcIjtcclxuaW1wb3J0IHR5cGUge1xyXG5cdFRyYW5zYWN0aW9uUmVwb3J0LFxyXG5cdFV0eG9NZXRhZGF0YSxcclxuXHRWYWx1ZVRyYW5zZmVyT3V0cHV0LFxyXG59IGZyb20gXCIuLi9ycGMvdHlwZXMuanNcIjtcclxuaW1wb3J0IHR5cGUgeyBIYXNoLCBOZXR3b3JrIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XHJcbmltcG9ydCB7IGlzSGV4U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7XHJcblx0SUpzb25ScGNQcm92aWRlcixcclxuXHRJTGVkZ2VyLFxyXG5cdElUcmFuc2FjdGlvblBheWxvYWQsXHJcblx0SVRyYW5zYWN0aW9uUGF5bG9hZE11bHRpU2lnLFxyXG5cdElUcmFuc21pdHRlcixcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzLmpzXCI7XHJcblxyXG5pbXBvcnQge1xyXG5cdHR5cGUgS2V5ZWRTaWduYXR1cmUsXHJcblx0TWVtcG9vbEVycm9yLFxyXG5cdFB1YmxpY0tleSxcclxuXHR0eXBlIFB1YmxpY0tleUhhc2hTdHJpbmcsXHJcblx0VGltZW91dEVycm9yLFxyXG5cdHR5cGUgVHJhbnNhY3Rpb25DYWxsYmFjayxcclxuXHR0eXBlIFRyYW5zYWN0aW9uUmVjZWlwdCxcclxuXHR0eXBlIFRyYW5zYWN0aW9uU3RhdHVzLFxyXG5cdHR5cGUgVHJhbnNtaXNzaW9uLFxyXG5cdFRyYW5zbWlzc2lvbkVycm9yLFxyXG5cdHR5cGUgVXR4byxcclxufSBmcm9tIFwiLi90eXBlcy5qc1wiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zbWl0dGVyPFxyXG5cdFNwZWNzLFxyXG5cdFBheWxvYWQgZXh0ZW5kcyBJVHJhbnNhY3Rpb25QYXlsb2FkPFNwZWNzPixcclxuPiBpbXBsZW1lbnRzIElUcmFuc21pdHRlclxyXG57XHJcblx0cHVibGljIHJlYWRvbmx5IGxlZGdlcjogSUxlZGdlcjtcclxuXHRwdWJsaWMgcmVhZG9ubHkgY2hhbmdlUGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nO1xyXG5cclxuXHRwcm90ZWN0ZWQgX3BheWxvYWQ6IFBheWxvYWQ7XHJcblx0cHJvdGVjdGVkIF9wcm90b0J1ZjogcHJvdG9idWYuVHlwZTtcclxuXHRwcm90ZWN0ZWQgX3NpZ25hdHVyZXM6IEFycmF5PEtleWVkU2lnbmF0dXJlPiA9IFtdO1xyXG5cdHByb3RlY3RlZCBfdHJhbnNhY3Rpb25zOiBBcnJheTxIYXNoPiA9IFtdO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByb3RvVHlwZU5hbWU6IHN0cmluZyxcclxuXHRcdHBheWxvYWQ6IFBheWxvYWQsXHJcblx0XHRsZWRnZXI6IElMZWRnZXIsXHJcblx0XHRjaGFuZ2VQa2g/OiBQdWJsaWNLZXlIYXNoU3RyaW5nLFxyXG5cdCkge1xyXG5cdFx0dGhpcy5fcHJvdG9CdWYgPSBwcm90b1Jvb3QubG9va3VwVHlwZShwcm90b1R5cGVOYW1lKTtcclxuXHRcdHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xyXG5cdFx0dGhpcy5sZWRnZXIgPSBsZWRnZXI7XHJcblx0XHRpZiAoIWxlZGdlci5wcm92aWRlci5uZXR3b3JrKSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBsZWRnZXIncyBwcm92aWRlciBpcyBub3QgaW5pdGlhbGl6ZWQuYCxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHRoaXMuY2hhbmdlUGtoID0gY2hhbmdlUGtoIHx8IGxlZGdlci5jaGFuZ2VQa2g7XHJcblx0XHRpZiAoIWxlZGdlci5nZXRTaWduZXIodGhpcy5jaGFuZ2VQa2gpKSB7XHJcblx0XHRcdHRocm93IFR5cGVFcnJvcihcclxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBsZWRnZXIgaG9sZHMgbm8gU2lnbmVyIGZvciBjaGFuZ2UgYWRkcmVzcyAke3RoaXMuY2hhbmdlUGtofS5gLFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBwYXlsb2FkKCk6IFBheWxvYWQgfCB1bmRlZmluZWQge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3BheWxvYWQucHJlcGFyZWQgPyB0aGlzLl9wYXlsb2FkIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBwcm92aWRlcigpOiBJSnNvblJwY1Byb3ZpZGVyIHtcclxuXHRcdHJldHVybiB0aGlzLmxlZGdlci5wcm92aWRlcjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcclxuXHRcdHJldHVybiB0aGlzLnByb3ZpZGVyLm5ldHdvcmsgfHwgXCJtYWlubmV0XCI7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHRyYW5zYWN0aW9ucygpOiBBcnJheTxIYXNoPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25zO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcGF5bG9hZC5jb25zdHJ1Y3Rvci5uYW1lXHJcblx0XHRcdC5zcGxpdCgvKFthLXpdKD89W0EtWl0pKS9nKVxyXG5cdFx0XHQuc2xpY2UoMCwgLTEpXHJcblx0XHRcdC5qb2luKFwiXCIpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGdldCBfZnJvbSgpOiBBcnJheTxQdWJsaWNLZXlIYXNoU3RyaW5nPiB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAodGhpcy5fc2lnbmF0dXJlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0dGhpcy5fc2lnbmF0dXJlc1xyXG5cdFx0XHRcdFx0Lm1hcCgoa3MpID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcGtoID0gUHVibGljS2V5LmZyb21Qcm90b2J1Zihrcy5wdWJsaWNfa2V5KVxyXG5cdFx0XHRcdFx0XHRcdC5oYXNoKClcclxuXHRcdFx0XHRcdFx0XHQudG9CZWNoMzIodGhpcy5uZXR3b3JrKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubGVkZ2VyLmdldFNpZ25lcihwa2gpPy5wa2ggfHwgdGhpcy5sZWRnZXIucGtoO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdC8vIGF2b2lkIHJlcGV0aXRpb25zXHJcblx0XHRcdFx0XHQuZmlsdGVyKChwa2gsIGluZGV4LCBhcnJheSkgPT4gaW5kZXggPT09IGFycmF5LmluZGV4T2YocGtoKSlcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgZ2V0IF9wcmVwYXJlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdHRoaXMuX3BheWxvYWQucHJlcGFyZWQgJiZcclxuXHRcdFx0ISF0aGlzLl9zaWduYXR1cmVzICYmXHJcblx0XHRcdHRoaXMuX3NpZ25hdHVyZXMubGVuZ3RoID4gMFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBzZW5kVHJhbnNhY3Rpb24odGFyZ2V0PzogU3BlY3MpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVjZWlwdD4ge1xyXG5cdFx0bGV0IHJlY2VpcHQgPSB0aGlzLl9nZXRJbmZsaWdodFJlY2VpcHQoKTtcclxuXHRcdGlmICghcmVjZWlwdCB8fCB0YXJnZXQpIHtcclxuXHRcdFx0Ly8gaWYgaW5mbGlnaHQgbm90IHlldCBwcmVwYXJlZCwgb3IgcHJlcGFyZWQgYnV0IG5vdCB5ZXQgdHJhbnNtaXR0ZWQsXHJcblx0XHRcdC8vIHByZXBhcmUgYSBuZXcgaW5mbGlnaHQgZWl0aGVyIHdpdGggc3BlY2lmaWVkIHBhcmFtcyAoaWYgYW55KSxcclxuXHRcdFx0Ly8gb3IgcHJldmlvdXNseSBwcmVwYXJlZCBpbmZsaWdodCAoaWYga25vd24pLlxyXG5cdFx0XHRyZWNlaXB0ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odGFyZ2V0IHx8IChyZWNlaXB0IGFzIFNwZWNzKSk7XHJcblx0XHR9XHJcblx0XHRpZiAocmVjZWlwdD8uc3RhdHVzICYmIHJlY2VpcHQuc3RhdHVzICE9PSBcInNpZ25lZFwiICYmICFyZWNlaXB0Py5lcnJvcikge1xyXG5cdFx0XHQvLyBpZiBjdXJyZW50IGluZmxpZ2h0IHdhcyBhbHJlYWR5IHRyYW5zbWl0dGVkIGFuZCBpdCdzIG5vdCB5ZXQga25vd24gdG8gZmFpbCAuLi5cclxuXHRcdFx0cmV0dXJuIHJlY2VpcHQ7XHJcblx0XHR9XHJcblx0XHQvLyBpZiB3ZSByZWFjaCB0aGlzIHBvaW50IGlzIGJlY2F1c2UgYW4gaW5mbGlnaHQgdHJhbnNhY3Rpb24gaXNcclxuXHRcdC8vIHJlYWR5IHRvIGJlIHRyYW5zbWl0dGVkXHJcblx0XHRKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5zdGF0dXMgPSBcInBlbmRpbmdcIjtcclxuXHRcdGRlbGV0ZSBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5lcnJvcjtcclxuXHRcdHJldHVybiB0aGlzLnByb3ZpZGVyXHJcblx0XHRcdC5zZW5kUmF3VHJhbnNhY3Rpb24odGhpcy5fdG9KU09OKGZhbHNlKSlcclxuXHRcdFx0LmNhdGNoKChlcnIpID0+IHtcclxuXHRcdFx0XHRjb25zdCBlcnJvciA9IG5ldyBUcmFuc21pc3Npb25FcnJvcihcclxuXHRcdFx0XHRcdHRoaXMuX2dldEluZmxpZ2h0VHJhbnNtaXNzaW9uKCksXHJcblx0XHRcdFx0XHRlcnIsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5lcnJvciA9IGVycm9yO1xyXG5cdFx0XHRcdHRocm93IGVycm9yO1xyXG5cdFx0XHR9KVxyXG5cdFx0XHQudGhlbigoYWNjZXB0ZWQpID0+IHtcclxuXHRcdFx0XHRpZiAoYWNjZXB0ZWQpIHtcclxuXHRcdFx0XHRcdEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1tyZWNlaXB0Lmhhc2hdLnN0YXR1cyA9IFwicmVsYXllZFwiO1xyXG5cdFx0XHRcdFx0cmV0dXJuIEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1tyZWNlaXB0Lmhhc2hdO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zdCBlcnJvciA9IG5ldyBUcmFuc21pc3Npb25FcnJvcihcclxuXHRcdFx0XHRcdFx0dGhpcy5fZ2V0SW5mbGlnaHRUcmFuc21pc3Npb24oKSxcclxuXHRcdFx0XHRcdFx0RXJyb3IoYFJlamVjdGVkIGZvciB1bmtub3duIHJlYXNvbnNgKSxcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbcmVjZWlwdC5oYXNoXS5lcnJvciA9IGVycm9yO1xyXG5cdFx0XHRcdFx0dGhyb3cgZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyBzaWduVHJhbnNhY3Rpb24oXHJcblx0XHR0YXJnZXQ/OiBTcGVjcyxcclxuXHRcdHJlbG9hZFV0eG9zID0gZmFsc2UsXHJcblx0KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlY2VpcHQ+IHtcclxuXHRcdHRhcmdldCA9IGF3YWl0IHRoaXMuX3BheWxvYWQudmFsaWRhdGVUYXJnZXQodGFyZ2V0KTtcclxuXHRcdGlmICghdGFyZ2V0KSB7XHJcblx0XHRcdC8vIGUuZy4gaWYgY2FsbGVkIGZyb20gdGhpcy5zZW5kKCkgd2l0aCBubyBwYXJhbXNcclxuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFxyXG5cdFx0XHRcdGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGNhbm5vdCBzaWduIGEgdHJhbnNhY3Rpb24gaWYgbm8gcGFyYW1zIHdlcmUgcHJldmlvdXNseSBzcGVjaWZpZWQuYCxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpbmZsaWdodCA9IHRoaXMuX2dldEluZmxpZ2h0UmVjZWlwdCgpO1xyXG5cdFx0aWYgKGluZmxpZ2h0KSB7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwic2lnbi5wZW5kaW5nUmVjZWlwdCA9PlwiLCBpbmZsaWdodClcclxuXHRcdFx0aWYgKCFpbmZsaWdodD8uc3RhdHVzIHx8IGluZmxpZ2h0LnN0YXR1cyA9PT0gXCJzaWduZWRcIikge1xyXG5cdFx0XHRcdC8vIHJlY292ZXIgaW5wdXQgdXR4b3MgaWYgcHJldmlvdXNseSBzaWduZWQgcGFyYW1zIHdlcmUgbm90IGV2ZW4gYXR0ZW1wdGVkIHRvIGJlIHNlbnRcclxuXHRcdFx0XHRpZiAoIXJlbG9hZFV0eG9zKSB0aGlzLl9yZWNvdmVySW5wdXRVdHhvcygpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGluZmxpZ2h0LnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIgJiYgIWluZmxpZ2h0LmVycm9yKSB7XHJcblx0XHRcdFx0Ly8gdGhyb3cgZXhjZXB0aW9uIGlmIGEgZm9ybWVybHkgc2lnbmVkIHRyYW5zYWN0aW9uIGlzIHN0aWxsIHdhaXRpbmcgdG8gYmUgcmVsYXllZCBieSBhIHByb3ZpZGVyXHJcblx0XHRcdFx0dGhyb3cgRXJyb3IoXHJcblx0XHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBpbi1mbGlnaHQgdHggYmVpbmcgcmVsYXllZDogJHtpbmZsaWdodC5oYXNofWAsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNsZWFuIGN1cnJlbnQgc2lnbmF0dXJlcywgc28gbmV3IFVUWE9zIGNhbiBiZSBjb25zdW1lZCBhbmQgdGhlcmVmb3JlIGEgbmV3IHRyYW5zYWN0aW9uIGhhc2ggYmUgaW5jZXB0ZWRcclxuXHRcdHRoaXMuX2NsZWFuU2lnbmF0dXJlcyh0YXJnZXQpO1xyXG5cclxuXHRcdC8vIGlmIG5vdCB5ZXQgcHJlcGFyZWQsIHRyeSB0byBjb3ZlciB0cmFuc2FjdGlvbiBleHBlbnNlcyB3aXRoIGV4aXN0aW5nIHV0eG9zIG9uIHNpZ25lcnM6XHJcblx0XHRsZXQgY2hhbmdlID0gMG47XHJcblx0XHRpZiAoIXRoaXMuX3BheWxvYWQucHJlcGFyZWQpIHtcclxuXHRcdFx0Y2hhbmdlID0gYXdhaXQgdGhpcy5fcGF5bG9hZFxyXG5cdFx0XHRcdC5jb25zdW1lVXR4b3ModGhpcy5sZWRnZXIsIHJlbG9hZFV0eG9zKVxyXG5cdFx0XHRcdC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdHRocm93IEVycm9yKFxyXG5cdFx0XHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBjYW5ub3QgY29uc3VtZSBVVFhPcyBmcm9tICR7dGhpcy5sZWRnZXIuY29uc3RydWN0b3IubmFtZX0gJHt0aGlzLmxlZGdlci5wa2h9OiAke2Vycn0uYCxcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCF0aGlzLl9wYXlsb2FkLnByZXBhcmVkKSB7XHJcblx0XHRcdC8vIHRocm93cyBleGVjZXB0aW9uIGlmIG5vdCBlbm91Z2ggdXR4b3Mgd2VyZSBmb3VuZCB0byBjb3ZlciB0cmFuc2FjdGlvbiBleHBlbnNlczpcclxuXHRcdFx0dGhyb3cgRXJyb3IoXHJcblx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogaW5zdWZmaWNpZW50IGZ1bmRzIG9uICR7dGhpcy5sZWRnZXIuY29uc3RydWN0b3IubmFtZX0gJHt0aGlzLmxlZGdlci5wa2h9JHtjaGFuZ2UgPCAwID8gYDogcmVxdWlyZXMgZXh0cmEgJHstY2hhbmdlfSAkbmFub3dpdHMuYCA6IFwiLlwifWAsXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZG91YmxlLWNoZWNrIHdlaWdodCBkb2VzIG5vdCBleGNlZWRzIGJsb2NrIGxpbWl0Li4uXHJcblx0XHRpZiAodGhpcy5fcGF5bG9hZC53ZWlnaHQgPiB0aGlzLl9wYXlsb2FkLm1heFdlaWdodCkge1xyXG5cdFx0XHR0aHJvdyBFcnJvcihcclxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB0cmFuc2FjdGlvbiB3ZWlnaHQgZXhjZWVkZWQgYmxvY2sgbGltaXQ6ICR7dGhpcy5fcGF5bG9hZC53ZWlnaHR9ID4gJHt0aGlzLl9wYXlsb2FkLm1heFdlaWdodH0uYCxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBzaWduaW5nIHRoZSB0cmFuc2FjdGlvbiBwYXlsb2FkIGdlbmVyYXRlcyB0aGUgdHJhbnNhY3Rpb24gaGFzaCwgYW5kIHRoZSByZWNlaXB0XHJcblx0XHRyZXR1cm4gdGhpcy5fdXBzZXJ0VHJhbnNhY3Rpb25SZWNlaXB0KFxyXG5cdFx0XHR0aGlzLl9zaWduVHJhbnNhY3Rpb25QYXlsb2FkKCksXHJcblx0XHRcdHRhcmdldCxcclxuXHRcdFx0XCJzaWduZWRcIixcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgY29uZmlybVRyYW5zYWN0aW9uKFxyXG5cdFx0aGFzaDogSGFzaCxcclxuXHRcdG9wdGlvbnM/OiB7XHJcblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXI7XHJcblx0XHRcdHRpbWVvdXRTZWNzPzogbnVtYmVyO1xyXG5cdFx0XHRvbkNoZWNrcG9pbnQ/OiBUcmFuc2FjdGlvbkNhbGxiYWNrO1xyXG5cdFx0XHRvblN0YXR1c0NoYW5nZT86IFRyYW5zYWN0aW9uQ2FsbGJhY2s7XHJcblx0XHR9LFxyXG5cdCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZWNlaXB0IHwgdW5rbm93bj4ge1xyXG5cdFx0Y29uc3QgcmVjZWlwdCA9IEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1toYXNoXTtcclxuXHRcdGlmICghcmVjZWlwdCB8fCByZWNlaXB0Lmhhc2ggIT09IGhhc2gpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxyXG5cdFx0XHRcdGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IHRyYW5zYWN0aW9uIG5vdCBmb3VuZDogJHtoYXNofWAsXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2UgaWYgKFtcInNpZ25lZFwiLCBcInBlbmRpbmdcIl0uaW5jbHVkZXMocmVjZWlwdC5zdGF0dXMpKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcclxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB0cmFuc2FjdGlvbiBzdGF0dXMgXCIke3JlY2VpcHQuc3RhdHVzfVwiOiAke2hhc2h9YCxcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSBpZiAocmVjZWlwdC5zdGF0dXMgPT09IFwicmVtb3ZlZFwiKSB7XHJcblx0XHRcdHRocm93IG5ldyBNZW1wb29sRXJyb3IoXHJcblx0XHRcdFx0cmVjZWlwdCxcclxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB0cmFuc2FjdGlvbiByZW1vdmVkIGZyb20gbWVtcG9vbDogJHtoYXNofWAsXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2UgaWYgKHJlY2VpcHQuc3RhdHVzID09PSBcInJlbGF5ZWRcIiAmJiBvcHRpb25zPy5vblN0YXR1c0NoYW5nZSlcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRvcHRpb25zLm9uU3RhdHVzQ2hhbmdlKHJlY2VpcHQpO1xyXG5cdFx0XHR9IGNhdGNoIHt9XHJcblxyXG5cdFx0Y29uc3QgZ2xvYmFsVGltZXIgPSAoc3RhcnQ6IG51bWJlciwgbXM6IG51bWJlcikgPT4ge1xyXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoXHJcblx0XHRcdFx0XHQoKSA9PlxyXG5cdFx0XHRcdFx0XHRyZWplY3QoXHJcblx0XHRcdFx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogcG9sbGluZyB0aW1lb3V0IGFmdGVyICR7TWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDApfSBzZWNzKS5gLFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0bXMsXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IFtjb25maXJtYXRpb25zLCBpbnRlcnZhbCwgdGltZW91dCwgZ2xvYmFsVGltZW91dF0gPSBbXHJcblx0XHRcdG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMCxcclxuXHRcdFx0MTAwMDAsXHJcblx0XHRcdDUwMDAsXHJcblx0XHRcdChvcHRpb25zPy50aW1lb3V0U2VjcyB8fCA2MDApICogMTAwMCxcclxuXHRcdF07XHJcblxyXG5cdFx0cmV0dXJuIFByb21pc2UucmFjZShbXHJcblx0XHRcdGdsb2JhbFRpbWVyKERhdGUubm93KCksIGdsb2JhbFRpbWVvdXQpLmNhdGNoKChyZWFzb246IGFueSkgPT4ge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUaW1lb3V0RXJyb3IoZ2xvYmFsVGltZW91dCwgcmVjZWlwdCwgcmVhc29uKTtcclxuXHRcdFx0fSksXHJcblxyXG5cdFx0XHRwcm9taXNlUG9sbGVyKHtcclxuXHRcdFx0XHR0YXNrRm46ICgpID0+IHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24oaGFzaCkuY2F0Y2goKGVycikgPT4gZXJyKSxcclxuXHRcdFx0XHRzaG91bGRDb250aW51ZTogKGVycm9yOiBhbnksIHJlcG9ydDogVHJhbnNhY3Rpb25SZXBvcnQpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHN0YXR1cyA9IHJlY2VpcHQuc3RhdHVzO1xyXG5cdFx0XHRcdFx0cmVjZWlwdC5lcnJvciA9IGVycm9yO1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXHJcblx0XHRcdFx0XHRcdGVycm9yLm1lc3NhZ2UuaW5kZXhPZihcIkl0ZW1Ob3RGb3VuZFwiKSA+PSAwXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0cmVjZWlwdC5zdGF0dXMgPSBcInJlbW92ZWRcIjtcclxuXHRcdFx0XHRcdH0gZWxzZVxyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHJlY2VpcHQuc3RhdHVzKSB7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcInJlbGF5ZWRcIjpcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChyZXBvcnQ/LmJsb2NrSGFzaCAmJiBpc0hleFN0cmluZyhyZXBvcnQuYmxvY2tIYXNoKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZWNlaXB0LmNvbmZpcm1hdGlvbnMgPSByZXBvcnQuY29uZmlybWF0aW9ucztcclxuXHRcdFx0XHRcdFx0XHRcdFx0KHJlY2VpcHQuYmxvY2tIYXNoID0gcmVwb3J0LmJsb2NrSGFzaCksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KHJlY2VpcHQuYmxvY2tFcG9jaCA9IHJlcG9ydC5ibG9ja0Vwb2NoKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQocmVjZWlwdC5ibG9ja1RpbWVzdGFtcCA9IHJlcG9ydC5ibG9ja1RpbWVzdGFtcCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlY2VpcHQuc3RhdHVzID0gcmVwb3J0LmNvbmZpcm1lZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJmaW5hbGl6ZWRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogcmVwb3J0Py5jb25maXJtYXRpb25zID49IGNvbmZpcm1hdGlvbnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gXCJjb25maXJtZWRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBcIm1pbmVkXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIm1pbmVkXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdCFyZXBvcnQ/LmJsb2NrSGFzaCB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXBvcnQuYmxvY2tIYXNoICE9PSByZWNlaXB0LmJsb2NrSGFzaFxyXG5cdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSByZWNlaXB0LmJsb2NrSGFzaDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlY2VpcHQuYmxvY2tFcG9jaDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlY2VpcHQuYmxvY2tNaW5lcjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlY2VpcHQuYmxvY2tUaW1lc3RhbXA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlY2VpcHQuc3RhdHVzID0gXCJyZWxheWVkXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZWNlaXB0LnN0YXR1cyA9IHJlcG9ydC5jb25maXJtZWRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiZmluYWxpemVkXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IHJlcG9ydD8uY29uZmlybWF0aW9ucyA+PSBjb25maXJtYXRpb25zXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IFwiY29uZmlybWVkXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogXCJtaW5lZFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocmVwb3J0Py5jb25maXJtYXRpb25zICE9PSByZWNlaXB0LmNvbmZpcm1hdGlvbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWNlaXB0LmNvbmZpcm1hdGlvbnMgPSByZXBvcnQuY29uZmlybWF0aW9ucztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocmVjZWlwdC5zdGF0dXMgPT09IFwibWluZWRcIiAmJiBvcHRpb25zPy5vbkNoZWNrcG9pbnQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uQ2hlY2twb2ludChyZWNlaXB0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2gge31cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoc3RhdHVzICE9PSByZWNlaXB0LnN0YXR1cykge1xyXG5cdFx0XHRcdFx0XHRyZWNlaXB0LnRpbWVzdGFtcCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0IVtcImNvbmZpcm1lZFwiLCBcImZpbmFsaXplZFwiXS5pbmNsdWRlcyhyZWNlaXB0LnN0YXR1cykgJiZcclxuXHRcdFx0XHRcdFx0XHRvcHRpb25zPy5vblN0YXR1c0NoYW5nZVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25TdGF0dXNDaGFuZ2UocmVjZWlwdCk7XHJcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCB7fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0SnNvblJwY1Byb3ZpZGVyLnJlY2VpcHRzW2hhc2hdID0gcmVjZWlwdDtcclxuXHRcdFx0XHRcdHJldHVybiBbXCJyZWxheWVkXCIsIFwibWluZWRcIl0uaW5jbHVkZXMocmVjZWlwdC5zdGF0dXMpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0aW50ZXJ2YWwsXHJcblx0XHRcdFx0dGltZW91dCxcclxuXHRcdFx0fSkudGhlbihhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKHJlY2VpcHQuc3RhdHVzID09PSBcInJlbW92ZWRcIiAmJiByZWNlaXB0LnR5cGUgIT09IFwiVW5zdGFrZVwiKSB7XHJcblx0XHRcdFx0XHQvLyBUUkFOU0FDVElPTiBSRU1PVkVEIEZST00gTUVNUE9PTCAvL1xyXG5cdFx0XHRcdFx0Ly8gMS4gVHJ5IHRvIHJlY292ZXIgaW5wdXQgdXR4b3MgYmVsb25naW5nIHRvIGxlZGdlcidzIGFkZHJlc3NlczpcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGlucHV0czogQXJyYXk8VXR4b01ldGFkYXRhPiA9XHJcblx0XHRcdFx0XHRcdFx0cmVjZWlwdC50eFtyZWNlaXB0LnR5cGVdLmJvZHkuaW5wdXRzO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzaWduYXR1cmVzOiBBcnJheTxLZXllZFNpZ25hdHVyZT4gPVxyXG5cdFx0XHRcdFx0XHRcdHJlY2VpcHQudHhbcmVjZWlwdC50eXBlXS5zaWduYXR1cmVzO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB1dHhvczogQXJyYXk8VXR4bz4gPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKGlucHV0cy5sZW5ndGggPT09IHNpZ25hdHVyZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0aW5wdXRzLmZvckVhY2goKG1ldGFkYXRhLCBpbmRleCkgPT4gKHtcclxuXHRcdFx0XHRcdFx0XHRcdC4uLm1ldGFkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2lnbmVyOiBQdWJsaWNLZXkuZnJvbVByb3RvYnVmKHNpZ25hdHVyZXNbaW5kZXhdLnB1YmxpY19rZXkpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC5oYXNoKClcclxuXHRcdFx0XHRcdFx0XHRcdFx0LnRvQmVjaDMyKHRoaXMubmV0d29yayksXHJcblx0XHRcdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMubGVkZ2VyLmFkZFV0eG9zKC4uLnV0eG9zKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IHdhcm5pbmc6IGNhbm5vdCByZWNvdmVyIGlucHV0IFVUWE9TIGZyb20gdHggJHtoYXNofTogJHtlcnJ9YCxcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIDIuIFRocm93IE1lbXBvb2xFcnJvclxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IE1lbXBvb2xFcnJvcihcclxuXHRcdFx0XHRcdFx0cmVjZWlwdCxcclxuXHRcdFx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogdHJhbnNhY3Rpb24gcmVtb3ZlZCBmcm9tIG1lbXBvb2w6ICR7aGFzaH1gLFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gVFJBTlNBQ1RJT04gRUlUSEVSIENPTkZJUk1FRCBPUiBGSU5BTElaRUQgLy9cclxuXHRcdFx0XHRcdC8vIDEuIFRyeSB0byBsb2FkIHZhbHVlIHRyYW5zZmVyIG91dHB1dHMgaW50byB0aGUgbGVkZ2VyJ3MgbG9jYWwgY2FjaGU6XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCB1dHhvczogQXJyYXk8VXR4bz4gPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKFtcIlN0YWtlXCIsIFwiVW5zdGFrZVwiXS5pbmNsdWRlcyhyZWNlaXB0LnR5cGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgdnRvOiBWYWx1ZVRyYW5zZmVyT3V0cHV0ID1cclxuXHRcdFx0XHRcdFx0XHRcdHJlY2VpcHQudHlwZSA9PT0gXCJTdGFrZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdD8gcmVjZWlwdC50eFtyZWNlaXB0LnR5cGVdLmJvZHk/Lm91dHB1dFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHJlY2VpcHQudHhbcmVjZWlwdC50eXBlXS5ib2R5Py53aXRoZHJhd2FsO1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2dG8pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHV0eG9zLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRwdXRfcG9pbnRlcjogYCR7cmVjZWlwdC5oYXNofTowYCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGltZWxvY2s6IHZ0by50aW1lX2xvY2ssXHJcblx0XHRcdFx0XHRcdFx0XHRcdHV0eG9fbWF0dXJlOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogQmlnSW50KHZ0by52YWx1ZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNpZ25lcjogdnRvLnBraCxcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBvdXRwdXRzOiBBcnJheTxWYWx1ZVRyYW5zZmVyT3V0cHV0PiA9XHJcblx0XHRcdFx0XHRcdFx0XHRyZWNlaXB0LnR4W3JlY2VpcHQudHlwZV0uYm9keT8ub3V0cHV0cyB8fCBbXTtcclxuXHRcdFx0XHRcdFx0XHRvdXRwdXRzLmZvckVhY2goKHZ0bywgaW5kZXgpID0+XHJcblx0XHRcdFx0XHRcdFx0XHR1dHhvcy5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0b3V0cHV0X3BvaW50ZXI6IGAke3JlY2VpcHQuaGFzaH06JHtpbmRleH1gLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbG9jazogdnRvLnRpbWVfbG9jayxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dXR4b19tYXR1cmU6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBCaWdJbnQodnRvLnZhbHVlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2lnbmVyOiB2dG8ucGtoLFxyXG5cdFx0XHRcdFx0XHRcdFx0fSksXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR0aGlzLmxlZGdlci5hZGRVdHhvcyguLi51dHhvcyk7XHJcblx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiB3YXJuaW5nOiBjYW5ub3QgcmVjb3ZlciBvdXRwdXQgVVRYT3MgZnJvbSAke2hhc2h9OiAke2Vycn1gLFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gMi4gQWRkIGJsb2NrTWluZXIgYWRkcmVzcyB0byB0aGUgdHJhbnNhY3Rpb24gcmVjZWlwdDpcclxuXHRcdFx0XHRcdGlmIChyZWNlaXB0Py5ibG9ja0hhc2ggJiYgaXNIZXhTdHJpbmcocmVjZWlwdC5ibG9ja0hhc2gpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRCbG9jayhyZWNlaXB0LmJsb2NrSGFzaCB8fCBcIlwiKTtcclxuXHRcdFx0XHRcdFx0SnNvblJwY1Byb3ZpZGVyLnJlY2VpcHRzW2hhc2hdLmJsb2NrTWluZXIgPSBQdWJsaWNLZXkuZnJvbVByb3RvYnVmKFxyXG5cdFx0XHRcdFx0XHRcdGJsb2NrLmJsb2NrX3NpZy5wdWJsaWNfa2V5LFxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0Lmhhc2goKVxyXG5cdFx0XHRcdFx0XHRcdC50b0JlY2gzMih0aGlzLm5ldHdvcmspO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uU3RhdHVzQ2hhbmdlKVxyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMub25TdGF0dXNDaGFuZ2UocmVjZWlwdCk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2gge31cclxuXHRcdFx0XHRcdC8vIDMuIFJldHVybiB0cmFuc2FjdGlvbiByZWNlaXB0OlxyXG5cdFx0XHRcdFx0cmV0dXJuIEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1toYXNoXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pLFxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgX2NsZWFuU2lnbmF0dXJlcyhuZXdUYXJnZXQ6IFNwZWNzKTogYW55IHtcclxuXHRcdHRoaXMuX3BheWxvYWQucmVzZXRUYXJnZXQobmV3VGFyZ2V0KTtcclxuXHRcdHRoaXMuX3NpZ25hdHVyZXMgPSBbXTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfZ2V0SW5mbGlnaHRCeXRlY29kZSgpOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcclxuXHRcdGNvbnN0IG9iaiA9IHRoaXMuX3RvUHJvdG9idWYoKTtcclxuXHRcdGNvbnN0IGVyciA9IHRoaXMuX3Byb3RvQnVmLnZlcmlmeShvYmopO1xyXG5cdFx0aWYgKCFlcnIpIHtcclxuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IHRoaXMuX3Byb3RvQnVmLmZyb21PYmplY3Qob2JqKTtcclxuXHRcdFx0cmV0dXJuIHRoaXMuX3Byb3RvQnVmLmVuY29kZShtZXNzYWdlKS5maW5pc2goKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgX2dldEluZmxpZ2h0UmVjZWlwdCgpOiBUcmFuc2FjdGlvblJlY2VpcHQgfCB1bmRlZmluZWQge1xyXG5cdFx0Y29uc3QgaGFzaCA9IHRoaXMuX3BheWxvYWQuaGFzaDtcclxuXHRcdGlmIChoYXNoKSB7XHJcblx0XHRcdHJldHVybiBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbaGFzaF07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIF9nZXRJbmZsaWdodFRyYW5zbWlzc2lvbigpOiBUcmFuc21pc3Npb24ge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0Ynl0ZWNvZGU6IHRoaXMuX2dldEluZmxpZ2h0Qnl0ZWNvZGUoKSxcclxuXHRcdFx0aGFzaDogdGhpcy5fcGF5bG9hZC5oYXNoLFxyXG5cdFx0XHRtZXNzYWdlOiB0aGlzLl90b0pTT04odHJ1ZSksXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIF9yZWNvdmVySW5wdXRVdHhvcygpOiBhbnkge31cclxuXHRwcm90ZWN0ZWQgX3JlY292ZXJPdXRwdXRVdHhvcygpOiBhbnkge31cclxuXHJcblx0cHJvdGVjdGVkIF91cHNlcnRUcmFuc2FjdGlvblJlY2VpcHQoXHJcblx0XHRoYXNoOiBIYXNoLFxyXG5cdFx0dGFyZ2V0OiBTcGVjcyxcclxuXHRcdHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXMsXHJcblx0KTogVHJhbnNhY3Rpb25SZWNlaXB0IHtcclxuXHRcdEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1toYXNoXSA9IHtcclxuXHRcdFx0Li4udGhpcy5fcGF5bG9hZC5pbnRvUmVjZWlwdCh0YXJnZXQsIHRoaXMubmV0d29yayksXHJcblx0XHRcdGhhc2gsXHJcblx0XHRcdGNoYW5nZTogdGhpcy5fcGF5bG9hZC5jaGFuZ2UsXHJcblx0XHRcdGZlZXM6IHRoaXMuX3BheWxvYWQuZmVlcyxcclxuXHRcdFx0ZnJvbTogdGhpcy5fZnJvbSxcclxuXHRcdFx0c3RhdHVzLFxyXG5cdFx0XHR0aW1lc3RhbXA6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLFxyXG5cdFx0XHR0eDogdGhpcy5fdG9KU09OKHRydWUpLFxyXG5cdFx0XHR0eXBlOiB0aGlzLnR5cGUsXHJcblx0XHRcdHZhbHVlOiB0aGlzLl9wYXlsb2FkLnZhbHVlLFxyXG5cdFx0XHR3ZWlnaHQ6IHRoaXMuX3BheWxvYWQud2VpZ2h0LFxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbaGFzaF07XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgX3NpZ25UcmFuc2FjdGlvblBheWxvYWQoKTogSGFzaDtcclxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgX3RvSlNPTihfaHVtYW5pemU6IGJvb2xlYW4pOiBhbnk7XHJcblx0cHJvdGVjdGVkIGFic3RyYWN0IF90b1Byb3RvYnVmKCk6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zbWl0dGVyTXVsdGlTaWc8XHJcblx0U3BlY3MsXHJcblx0UGF5bG9hZCBleHRlbmRzIElUcmFuc2FjdGlvblBheWxvYWRNdWx0aVNpZzxTcGVjcz4sXHJcbj4gZXh0ZW5kcyBUcmFuc21pdHRlcjxTcGVjcywgUGF5bG9hZD4ge1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdG9UeXBlTmFtZTogc3RyaW5nLFxyXG5cdFx0cGF5bG9hZDogUGF5bG9hZCxcclxuXHRcdGxlZGdlcjogSUxlZGdlcixcclxuXHRcdGNoYW5nZVBraD86IFB1YmxpY0tleUhhc2hTdHJpbmcsXHJcblx0KSB7XHJcblx0XHRzdXBlcihwcm90b1R5cGVOYW1lLCBwYXlsb2FkLCBsZWRnZXIsIGNoYW5nZVBraCk7XHJcblx0XHR0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcclxuXHR9XHJcblxyXG5cdC8vLyBSZWNvdmVyIGZvcm1lcmx5IGNvbnN1bWVkIFVUWE9zIGJ5IGEgZmFpbGluZyB0cmFuc2FjdGlvbiBiYWNrIHRvIHRoZWlyIHJlc3BlY3RpdmUgc2lnbmVyJ3MgVVRYTyBwb29sXHJcblx0cHJvdGVjdGVkIF9yZWNvdmVySW5wdXRVdHhvcygpOiBhbnkge1xyXG5cdFx0aWYgKHRoaXMuX3BheWxvYWQuaW5wdXRzKSB7XHJcblx0XHRcdHRoaXMubGVkZ2VyLmFkZFV0eG9zKC4uLnRoaXMuX3BheWxvYWQuaW5wdXRzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vLyBSZWNvdmVyIHNlbGYtdGFyZ2V0ZWQgb3V0cHV0cyBhcyBleHBlbmRhYmxlIHV0eG9zIG9uIHRoZWlyIHJlc3BlY3RpdmUgc2lnbmVyJ3MgbWVtb2l6ZWQgY2FjaGVcclxuXHRwcm90ZWN0ZWQgX3JlY292ZXJPdXRwdXRVdHhvcygpOiBhbnkge1xyXG5cdFx0aWYgKHRoaXMuX3BheWxvYWQuaGFzaCAmJiB0aGlzLl9wYXlsb2FkLm91dHB1dHMpIHtcclxuXHRcdFx0Y29uc3QgdXR4b3M6IEFycmF5PFV0eG8+ID0gW107XHJcblx0XHRcdHRoaXMuX3BheWxvYWQub3V0cHV0cy5mb3JFYWNoKCh2dG8sIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0aWYgKHRoaXMubGVkZ2VyLmdldFNpZ25lcih2dG8ucGtoKSlcclxuXHRcdFx0XHRcdHV0eG9zLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRzaWduZXI6IHZ0by5wa2gsXHJcblx0XHRcdFx0XHRcdG91dHB1dF9wb2ludGVyOiBgJHt0aGlzLl9wYXlsb2FkLmhhc2h9OiR7aW5kZXh9YCxcclxuXHRcdFx0XHRcdFx0dGltZWxvY2s6IHZ0by50aW1lX2xvY2ssXHJcblx0XHRcdFx0XHRcdHZhbHVlOiB2dG8udmFsdWUsXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMubGVkZ2VyLmFkZFV0eG9zKC4uLnV0eG9zKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfc2lnblRyYW5zYWN0aW9uUGF5bG9hZCgpOiBIYXNoIHtcclxuXHRcdGNvbnN0IGhhc2ggPSB0aGlzLl9wYXlsb2FkLmhhc2g7XHJcblx0XHRpZiAoIWhhc2gpIHtcclxuXHRcdFx0dGhyb3cgRXJyb3IoXHJcblx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogaW50ZXJuYWwgZXJyb3I6IHVuYWJsZSB0byBoYXNoaWZ5IHBheWxvYWQ6ICR7dGhpcy5fcGF5bG9hZC50b0pTT04odHJ1ZSwgdGhpcy5uZXR3b3JrKX19LmAsXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLl9wYXlsb2FkLmlucHV0cy5mb3JFYWNoKCh1dHhvKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgc2lnbmVyID0gdGhpcy5sZWRnZXIuZ2V0U2lnbmVyKHV0eG8uc2lnbmVyKTtcclxuXHRcdFx0XHRpZiAoIXNpZ25lcilcclxuXHRcdFx0XHRcdHRocm93IEVycm9yKFxyXG5cdFx0XHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBpbnRlcm5hbCBlcnJvcjogY2Fubm90IGZpbmQgU2lnbmVyICR7dXR4by5zaWduZXJ9IGluICR7dGhpcy5sZWRnZXIuY29uc3RydWN0b3IubmFtZX0gJHt0aGlzLmxlZGdlci5wa2h9LmAsXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coYC4uLnNpZ25lciAke3NpZ25lci5wa2h9IHNpZ25pbmcgaGFzaCAke2hhc2h9Li4uYClcclxuXHRcdFx0XHRcdHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduZXIuc2lnbkhhc2goaGFzaCkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdHJldHVybiBoYXNoO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIF90b0pTT04oaHVtYW5pemU6IGJvb2xlYW4pOiBhbnkge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0W3RoaXMudHlwZV06IHtcclxuXHRcdFx0XHRib2R5OiB0aGlzLl9wYXlsb2FkLnRvSlNPTihodW1hbml6ZSwgdGhpcy5uZXR3b3JrKSxcclxuXHRcdFx0XHRzaWduYXR1cmVzOiB0aGlzLl9zaWduYXR1cmVzLFxyXG5cdFx0XHR9LFxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBfdG9Qcm90b2J1ZigpOiBhbnkge1xyXG5cdFx0Y29uc3QgYm9keSA9IHRoaXMuX3BheWxvYWQudG9Qcm90b2J1ZigpO1xyXG5cdFx0aWYgKGJvZHkgJiYgdGhpcy5fc2lnbmF0dXJlcykge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGJvZHksXHJcblx0XHRcdFx0c2lnbmF0dXJlczogdGhpcy5fc2lnbmF0dXJlcyxcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19