@rosen-bridge/minimum-fee 1.0.1 → 2.0.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.
@@ -7,20 +7,19 @@ import { MinimumFeeBoxBuilder } from './MinimumFeeBoxBuilder';
7
7
  export declare class MinimumFeeBox {
8
8
  protected readonly BOX_FETCHING_PAGE_SIZE = 50;
9
9
  protected logger: AbstractLogger;
10
- protected box: ErgoBox;
10
+ protected box: ErgoBox | undefined;
11
11
  protected tokenId: string;
12
12
  protected minimumFeeNFT: string;
13
- protected address: string;
14
- protected ergoTree: string;
15
13
  protected explorerClient: ReturnType<typeof ergoExplorerClientFactory>;
16
14
  protected nodeClient: ReturnType<typeof ergoNodeClientFactory>;
17
- constructor(tokenId: string, minimumFeeNFT: string, address: string, networkType: ErgoNetworkType, networkUrl: string, logger?: AbstractLogger);
15
+ constructor(tokenId: string, minimumFeeNFT: string, networkType: ErgoNetworkType, networkUrl: string, logger?: AbstractLogger);
18
16
  /**
19
17
  * fetches the box from the blockchain
18
+ * @returns true if action was successful, otherwise false
20
19
  */
21
- fetchBox: () => Promise<void>;
20
+ fetchBox: () => Promise<boolean>;
22
21
  /**
23
- * returns fetched box or throws approprite error if found more or none
22
+ * returns fetched box or throws appropriate error if found more or none
24
23
  * @param eligibleBoxes
25
24
  */
26
25
  protected selectEligibleBox: (eligibleBoxes: Array<ErgoBox>) => ErgoBox;
@@ -35,7 +34,7 @@ export declare class MinimumFeeBox {
35
34
  /**
36
35
  * returns fetched config box
37
36
  */
38
- getBox: () => ErgoBox;
37
+ getBox: () => ErgoBox | undefined;
39
38
  /**
40
39
  * gets corresponding config for two chains and height
41
40
  * @param fromChain
@@ -45,8 +44,9 @@ export declare class MinimumFeeBox {
45
44
  getFee: (fromChain: string, height: number, toChain: string) => ChainMinimumFee;
46
45
  /**
47
46
  * extracts Fee config from box registers
47
+ * @param box
48
48
  */
49
- protected extractFeeFromBox: () => Array<Fee>;
49
+ protected extractFeeFromBox: (box: ErgoBox) => Array<Fee>;
50
50
  /**
51
51
  * generates a MinimumFeeBoxBuilder using current box
52
52
  * note that 'height' parameter of builder won't be set
@@ -1 +1 @@
1
- {"version":3,"file":"MinimumFeeBox.d.ts","sourceRoot":"","sources":["../../lib/MinimumFeeBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAEhE,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAI9D,qBAAa,aAAa;IACxB,SAAS,CAAC,QAAQ,CAAC,sBAAsB,MAAM;IAC/C,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACvE,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;gBAG7D,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,cAAc;IAczB;;OAEG;IACH,QAAQ,QAAa,QAAQ,IAAI,CAAC,CA2BhC;IAEF;;;OAGG;IACH,SAAS,CAAC,iBAAiB,kBAAmB,MAAM,OAAO,CAAC,KAAG,OAAO,CAyBpE;IAEF;;OAEG;IACH,SAAS,CAAC,uBAAuB,QAAa,QAAQ,MAAM,OAAO,CAAC,CAAC,CA8CnE;IAEF;;OAEG;IACH,SAAS,CAAC,mBAAmB,QAAa,QAAQ,MAAM,OAAO,CAAC,CAAC,CAiD/D;IAEF;;OAEG;IACH,MAAM,QAAO,OAAO,CAAa;IAEjC;;;;;OAKG;IACH,MAAM,cACO,MAAM,UACT,MAAM,WACL,MAAM,KACd,eAAe,CA4BhB;IAEF;;OAEG;IACH,SAAS,CAAC,iBAAiB,QAAO,MAAM,GAAG,CAAC,CAuD1C;IAEF;;;OAGG;IACH,SAAS,QAAO,oBAAoB,CAmBlC;CACH"}
1
+ {"version":3,"file":"MinimumFeeBox.d.ts","sourceRoot":"","sources":["../../lib/MinimumFeeBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAiB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAEhE,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAI9D,qBAAa,aAAa;IACxB,SAAS,CAAC,QAAQ,CAAC,sBAAsB,MAAM;IAC/C,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACvE,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;gBAG7D,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,cAAc;IAUzB;;;OAGG;IACH,QAAQ,QAAa,QAAQ,OAAO,CAAC,CAoCnC;IAEF;;;OAGG;IACH,SAAS,CAAC,iBAAiB,kBAAmB,MAAM,OAAO,CAAC,KAAG,OAAO,CAyBpE;IAEF;;OAEG;IACH,SAAS,CAAC,uBAAuB,QAAa,QAAQ,MAAM,OAAO,CAAC,CAAC,CA8CnE;IAEF;;OAEG;IACH,SAAS,CAAC,mBAAmB,QAAa,QAAQ,MAAM,OAAO,CAAC,CAAC,CAiD/D;IAEF;;OAEG;IACH,MAAM,QAAO,OAAO,GAAG,SAAS,CAAa;IAE7C;;;;;OAKG;IACH,MAAM,cACO,MAAM,UACT,MAAM,WACL,MAAM,KACd,eAAe,CA4BhB;IAEF;;;OAGG;IACH,SAAS,CAAC,iBAAiB,QAAS,OAAO,KAAG,MAAM,GAAG,CAAC,CAuDtD;IAEF;;;OAGG;IACH,SAAS,QAAO,oBAAoB,CA0BlC;CACH"}
@@ -1,4 +1,4 @@
1
- import { Address, ErgoBox } from 'ergo-lib-wasm-nodejs';
1
+ import { Address, ErgoBox, NetworkPrefix } from 'ergo-lib-wasm-nodejs';
2
2
  import { ChainMinimumFee, ErgoNetworkType } from './types';
3
3
  import { FailedError, NotFoundError } from './errors';
4
4
  import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
@@ -15,17 +15,11 @@ export class MinimumFeeBox {
15
15
  box;
16
16
  tokenId;
17
17
  minimumFeeNFT;
18
- address;
19
- ergoTree;
20
18
  explorerClient;
21
19
  nodeClient;
22
- constructor(tokenId, minimumFeeNFT, address, networkType, networkUrl, logger) {
20
+ constructor(tokenId, minimumFeeNFT, networkType, networkUrl, logger) {
23
21
  this.tokenId = tokenId;
24
22
  this.minimumFeeNFT = minimumFeeNFT;
25
- this.address = address;
26
- this.ergoTree = Address.from_base58(this.address)
27
- .to_ergo_tree()
28
- .to_base16_bytes();
29
23
  if (networkType === ErgoNetworkType.explorer)
30
24
  this.explorerClient = ergoExplorerClientFactory(networkUrl);
31
25
  else
@@ -34,12 +28,9 @@ export class MinimumFeeBox {
34
28
  }
35
29
  /**
36
30
  * fetches the box from the blockchain
31
+ * @returns true if action was successful, otherwise false
37
32
  */
38
33
  fetchBox = async () => {
39
- const boxes = this.explorerClient
40
- ? await this.fetchBoxesUsingExplorer()
41
- : await this.fetchBoxesUsingNode();
42
- const boxHasCorrectAddress = (box) => box.ergo_tree().to_base16_bytes() === this.ergoTree;
43
34
  const boxHasAppropriateTokens = (box) => {
44
35
  const tokenLen = box.tokens().len();
45
36
  let hasMinimumFeeNFT = false;
@@ -54,22 +45,42 @@ export class MinimumFeeBox {
54
45
  }
55
46
  return hasCorrectTokens && hasMinimumFeeNFT && hasTargetToken;
56
47
  };
57
- this.box = this.selectEligibleBox(boxes.filter((box) => boxHasCorrectAddress(box) && boxHasAppropriateTokens(box)));
48
+ try {
49
+ const boxes = this.explorerClient
50
+ ? await this.fetchBoxesUsingExplorer()
51
+ : await this.fetchBoxesUsingNode();
52
+ this.box = this.selectEligibleBox(boxes.filter((box) => boxHasAppropriateTokens(box)));
53
+ return true;
54
+ }
55
+ catch (e) {
56
+ if (e instanceof NotFoundError || e instanceof FailedError) {
57
+ this.logger.warn(`No valid minimum-fee box. reason: ${e}`);
58
+ this.box = undefined;
59
+ }
60
+ else {
61
+ this.logger.warn(`An error occurred while updating minimum-fee box: ${e}`);
62
+ if (e instanceof Error && e.stack)
63
+ this.logger.warn(e.stack);
64
+ }
65
+ return false;
66
+ }
58
67
  };
59
68
  /**
60
- * returns fetched box or throws approprite error if found more or none
69
+ * returns fetched box or throws appropriate error if found more or none
61
70
  * @param eligibleBoxes
62
71
  */
63
72
  selectEligibleBox = (eligibleBoxes) => {
64
73
  this.logger.debug(`Found [${eligibleBoxes.length}] minimum-fee boxes: ${JsonBigInt.stringify(eligibleBoxes.map((box) => box.to_json()))}`);
65
- if (eligibleBoxes.length === 0)
66
- throw new NotFoundError(`Found no minimum-fee box for token [${this.tokenId}] and address [${this.address}]`);
67
- else if (eligibleBoxes.length > 1)
68
- throw new FailedError(`Found [${eligibleBoxes.length}] minimum-fee boxes for token [${this.tokenId}] and address [${this.address}]`);
74
+ if (eligibleBoxes.length === 0) {
75
+ throw new NotFoundError(`Found no minimum-fee box for token [${this.tokenId}]`);
76
+ }
77
+ else if (eligibleBoxes.length > 1) {
78
+ throw new FailedError(`Found [${eligibleBoxes.length}] minimum-fee boxes for token [${this.tokenId}]`);
79
+ }
69
80
  else {
70
81
  this.logger.debug(`Found minimum-fee box [${eligibleBoxes[0]
71
82
  .box_id()
72
- .to_str()}] for token [${this.tokenId}] and address [${this.address}]`);
83
+ .to_str()}] for token [${this.tokenId}]`);
73
84
  return eligibleBoxes[0];
74
85
  }
75
86
  };
@@ -80,20 +91,20 @@ export class MinimumFeeBox {
80
91
  const boxes = [];
81
92
  try {
82
93
  let currentPage = 0;
83
- let boxesPage = await this.explorerClient.v1.getApiV1BoxesUnspentByaddressP1(this.address, {
94
+ let boxesPage = await this.explorerClient.v1.getApiV1BoxesUnspentBytokenidP1(this.tokenId, {
84
95
  offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
85
96
  limit: this.BOX_FETCHING_PAGE_SIZE,
86
97
  });
87
- this.logger.debug(`requested 'explorerClient.getApiV1BoxesUnspentByaddressP1' for address [${this.address}]. res: ${JsonBigInt.stringify(boxesPage)}`);
98
+ this.logger.debug(`requested 'explorerClient.getApiV1BoxesUnspentBytokenidP1' for token [${this.tokenId}]. res: ${JsonBigInt.stringify(boxesPage)}`);
88
99
  while (boxesPage.items?.length) {
89
100
  boxes.push(...boxesPage.items.map((box) => ErgoBox.from_json(JsonBigInt.stringify(box))));
90
101
  currentPage++;
91
102
  boxesPage =
92
- await this.explorerClient.v1.getApiV1BoxesUnspentByaddressP1(this.address, {
103
+ await this.explorerClient.v1.getApiV1BoxesUnspentBytokenidP1(this.tokenId, {
93
104
  offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
94
105
  limit: this.BOX_FETCHING_PAGE_SIZE,
95
106
  });
96
- this.logger.debug(`requested 'explorerClient.getApiV1BoxesUnspentByaddressP1' for address [${this.address}]. res: ${JsonBigInt.stringify(boxesPage)}`);
107
+ this.logger.debug(`requested 'explorerClient.getApiV1BoxesUnspentBytokenidP1' for token [${this.tokenId}]. res: ${JsonBigInt.stringify(boxesPage)}`);
97
108
  }
98
109
  }
99
110
  catch (error) {
@@ -108,19 +119,19 @@ export class MinimumFeeBox {
108
119
  const boxes = [];
109
120
  try {
110
121
  let currentPage = 0;
111
- let boxesPage = await this.nodeClient.getBoxesByAddressUnspent(this.address, {
122
+ let boxesPage = await this.nodeClient.getBoxesByTokenIdUnspent(this.tokenId, {
112
123
  offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
113
124
  limit: this.BOX_FETCHING_PAGE_SIZE,
114
125
  });
115
- this.logger.debug(`requested 'nodeClient.getBoxesByAddressUnspent' for address [${this.address}]. res: ${JsonBigInt.stringify(boxesPage)}`);
126
+ this.logger.debug(`requested 'nodeClient.getBoxesByTokenIdUnspent' for token [${this.tokenId}]. res: ${JsonBigInt.stringify(boxesPage)}`);
116
127
  while (boxesPage.length !== 0) {
117
128
  boxes.push(...boxesPage.map((box) => ErgoBox.from_json(JsonBigInt.stringify(box))));
118
129
  currentPage++;
119
- boxesPage = await this.nodeClient.getBoxesByAddressUnspent(this.address, {
130
+ boxesPage = await this.nodeClient.getBoxesByTokenIdUnspent(this.tokenId, {
120
131
  offset: currentPage * this.BOX_FETCHING_PAGE_SIZE,
121
132
  limit: this.BOX_FETCHING_PAGE_SIZE,
122
133
  });
123
- this.logger.debug(`requested 'nodeClient.getBoxesByAddressUnspent' for address [${this.address}]. res: ${JsonBigInt.stringify(boxesPage)}`);
134
+ this.logger.debug(`requested 'nodeClient.getBoxesByTokenIdUnspent' for token [${this.tokenId}]. res: ${JsonBigInt.stringify(boxesPage)}`);
124
135
  }
125
136
  }
126
137
  catch (error) {
@@ -148,7 +159,7 @@ export class MinimumFeeBox {
148
159
  getFee = (fromChain, height, toChain) => {
149
160
  if (!this.box)
150
161
  throw Error(`Box is not fetched yet`);
151
- const fees = this.extractFeeFromBox().reverse();
162
+ const fees = this.extractFeeFromBox(this.box).reverse();
152
163
  for (const fee of fees) {
153
164
  if (!Object.hasOwn(fee.heights, fromChain))
154
165
  throw new NotFoundError(`No fee found for chain [${fromChain}] in box [${this.box
@@ -170,16 +181,17 @@ export class MinimumFeeBox {
170
181
  };
171
182
  /**
172
183
  * extracts Fee config from box registers
184
+ * @param box
173
185
  */
174
- extractFeeFromBox = () => {
175
- const R4 = this.box.register_value(4);
176
- const R5 = this.box.register_value(5);
177
- const R6 = this.box.register_value(6);
178
- const R7 = this.box.register_value(7);
179
- const R8 = this.box.register_value(8);
180
- const R9 = this.box.register_value(9);
186
+ extractFeeFromBox = (box) => {
187
+ const R4 = box.register_value(4);
188
+ const R5 = box.register_value(5);
189
+ const R6 = box.register_value(6);
190
+ const R7 = box.register_value(7);
191
+ const R8 = box.register_value(8);
192
+ const R9 = box.register_value(9);
181
193
  if (!R4 || !R5 || !R6 || !R7 || !R8 || !R9)
182
- throw Error(`Incomplete register data for minimum-fee config box [${this.box
194
+ throw Error(`Incomplete register data for minimum-fee config box [${box
183
195
  .box_id()
184
196
  .to_str()}]`);
185
197
  const fees = [];
@@ -211,7 +223,7 @@ export class MinimumFeeBox {
211
223
  }
212
224
  fees.push(fee);
213
225
  }
214
- this.logger.debug(`Extracted fee config from box [${this.box
226
+ this.logger.debug(`Extracted fee config from box [${box
215
227
  .box_id()
216
228
  .to_str()}]: ${JsonBigInt.stringify(fees)}`);
217
229
  return fees;
@@ -221,10 +233,12 @@ export class MinimumFeeBox {
221
233
  * note that 'height' parameter of builder won't be set
222
234
  */
223
235
  toBuilder = () => {
224
- const builder = new MinimumFeeBoxBuilder(this.minimumFeeNFT, this.address)
236
+ if (!this.box)
237
+ throw Error(`Box is not fetched yet`);
238
+ const builder = new MinimumFeeBoxBuilder(this.minimumFeeNFT, Address.recreate_from_ergo_tree(this.box.ergo_tree()).to_base58(NetworkPrefix.Mainnet))
225
239
  .setValue(BigInt(this.box.value().as_i64().to_str()))
226
240
  .setToken(this.tokenId);
227
- this.extractFeeFromBox().forEach((fee) => {
241
+ this.extractFeeFromBox(this.box).forEach((fee) => {
228
242
  const chainFee = new MinimumFeeConfig();
229
243
  Object.keys(fee.heights).forEach((chain) => {
230
244
  if (Object.hasOwn(fee.configs, chain))
@@ -237,4 +251,4 @@ export class MinimumFeeBox {
237
251
  return builder;
238
252
  };
239
253
  }
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9NaW5pbXVtRmVlQm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQU8sTUFBTSxTQUFTLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEQsT0FBTyx5QkFBeUIsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLHFCQUFxQixNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWhELE1BQU0sT0FBTyxhQUFhO0lBQ0wsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sQ0FBaUI7SUFDdkIsR0FBRyxDQUFVO0lBQ2IsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixPQUFPLENBQVM7SUFDaEIsUUFBUSxDQUFTO0lBQ2pCLGNBQWMsQ0FBK0M7SUFDN0QsVUFBVSxDQUEyQztJQUUvRCxZQUNFLE9BQWUsRUFDZixhQUFxQixFQUNyQixPQUFlLEVBQ2YsV0FBNEIsRUFDNUIsVUFBa0IsRUFDbEIsTUFBdUI7UUFFdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxh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QUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztvQkFDbkMsUUFBUSxDQUFDLGNBQWMsQ0FDckIsS0FBSyxFQUNMLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ2xCLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQ25CLENBQUM7O29CQUNDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzLCBFcmdvQm94IH0gZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0IHsgQ2hhaW5NaW5pbXVtRmVlLCBFcmdvTmV0d29ya1R5cGUsIEZlZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgRmFpbGVkRXJyb3IsIE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgZXJnb0V4cGxvcmVyQ2xpZW50RmFjdG9yeSBmcm9tICdAcm9zZW4tY2xpZW50cy9lcmdvLWV4cGxvcmVyJztcbmltcG9ydCBlcmdvTm9kZUNsaWVudEZhY3RvcnkgZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1ub2RlJztcbmltcG9ydCBKc29uQmlnSW50IGZyb20gJ0Byb3Nlbi1icmlkZ2UvanNvbi1iaWdpbnQnO1xuaW1wb3J0IGhhbmRsZUFwaUVycm9yIGZyb20gJy4vaGFuZGxlQXBpRXJyb3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgTWluaW11bUZlZUJveEJ1aWxkZXIgfSBmcm9tICcuL01pbmltdW1GZWVCb3hCdWlsZGVyJztcbmltcG9ydCB7IE1pbmltdW1GZWVDb25maWcgfSBmcm9tICcuL01pbmltdW1GZWVDb25maWcnO1xuaW1wb3J0IHsgRVJHT19OQVRJVkVfVE9LRU4gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBNaW5pbXVtRmVlQm94IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEJPWF9GRVRDSElOR19QQUdFX1NJWkUgPSA1MDtcbiAgcHJvdGVjdGVkIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIHByb3RlY3RlZCBib3g6IEVyZ29Cb3g7XG4gIHByb3RlY3RlZCB0b2tlbklkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtaW5pbXVtRmVlTkZUOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhZGRyZXNzOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBlcmdvVHJlZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZXhwbG9yZXJDbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGVyZ29FeHBsb3JlckNsaWVudEZhY3Rvcnk+O1xuICBwcm90ZWN0ZWQgbm9kZUNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgZXJnb05vZGVDbGllbnRGYWN0b3J5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0b2tlbklkOiBzdHJpbmcsXG4gICAgbWluaW11bUZlZU5GVDogc3RyaW5nLFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBuZXR3b3JrVHlwZTogRXJnb05ldHdvcmtUeXBlLFxuICAgIG5ldHdvcmtVcmw6IHN0cmluZyxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlclxuICApIHtcbiAgICB0aGlzLnRva2VuSWQgPSB0b2tlbklkO1xuICAgIHRoaXMubWluaW11bUZlZU5GVCA9IG1pbmltdW1GZWVORlQ7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICB0aGlzLmVyZ29UcmVlID0gQWRkcmVzcy5mcm9tX2Jhc2U1OCh0aGlzLmFkZHJlc3MpXG4gICAgICAudG9fZXJnb190cmVlKClcbiAgICAgIC50b19iYXNlMTZfYnl0ZXMoKTtcbiAgICBpZiAobmV0d29ya1R5cGUgPT09IEVyZ29OZXR3b3JrVHlwZS5leHBsb3JlcilcbiAgICAgIHRoaXMuZXhwbG9yZXJDbGllbnQgPSBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5KG5ldHdvcmtVcmwpO1xuICAgIGVsc2UgdGhpcy5ub2RlQ2xpZW50ID0gZXJnb05vZGVDbGllbnRGYWN0b3J5KG5ldHdvcmtVcmwpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogZmV0Y2hlcyB0aGUgYm94IGZyb20gdGhlIGJsb2NrY2hhaW5cbiAgICovXG4gIGZldGNoQm94ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGJveGVzID0gdGhpcy5leHBsb3JlckNsaWVudFxuICAgICAgPyBhd2FpdCB0aGlzLmZldGNoQm94ZXNVc2luZ0V4cGxvcmVyKClcbiAgICAgIDogYXdhaXQgdGhpcy5mZXRjaEJveGVzVXNpbmdOb2RlKCk7XG5cbiAgICBjb25zdCBib3hIYXNDb3JyZWN0QWRkcmVzcyA9IChib3g6IEVyZ29Cb3gpID0+XG4gICAgICBib3guZXJnb190cmVlKCkudG9fYmFzZTE2X2J5dGVzKCkgPT09IHRoaXMuZXJnb1RyZWU7XG4gICAgY29uc3QgYm94SGFzQXBwcm9wcmlhdGVUb2tlbnMgPSAoYm94OiBFcmdvQm94KSA9PiB7XG4gICAgICBjb25zdCB0b2tlbkxlbiA9IGJveC50b2tlbnMoKS5sZW4oKTtcbiAgICAgIGxldCBoYXNNaW5pbXVtRmVlTkZUID0gZmFsc2U7XG4gICAgICBsZXQgaGFzVGFyZ2V0VG9rZW4gPSB0aGlzLnRva2VuSWQgPT09IEVSR09fTkFUSVZFX1RPS0VOID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgY29uc3QgaGFzQ29ycmVjdFRva2VucyA9XG4gICAgICAgIHRoaXMudG9rZW5JZCA9PT0gRVJHT19OQVRJVkVfVE9LRU4gPyB0b2tlbkxlbiA9PT0gMSA6IHRva2VuTGVuID09PSAyO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbkxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYm94LnRva2VucygpLmdldChpKS5pZCgpLnRvX3N0cigpO1xuICAgICAgICBpZiAoaWQgPT09IHRoaXMubWluaW11bUZlZU5GVCkgaGFzTWluaW11bUZlZU5GVCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGlkID09PSB0aGlzLnRva2VuSWQpIGhhc1RhcmdldFRva2VuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNDb3JyZWN0VG9rZW5zICYmIGhhc01pbmltdW1GZWVORlQgJiYgaGFzVGFyZ2V0VG9rZW47XG4gICAgfTtcblxuICAgIHRoaXMuYm94ID0gdGhpcy5zZWxlY3RFbGlnaWJsZUJveChcbiAgICAgIGJveGVzLmZpbHRlcihcbiAgICAgICAgKGJveDogRXJnb0JveCkgPT5cbiAgICAgICAgICBib3hIYXNDb3JyZWN0QWRkcmVzcyhib3gpICYmIGJveEhhc0FwcHJvcHJpYXRlVG9rZW5zKGJveClcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGZldGNoZWQgYm94IG9yIHRocm93cyBhcHByb3ByaXRlIGVycm9yIGlmIGZvdW5kIG1vcmUgb3Igbm9uZVxuICAgKiBAcGFyYW0gZWxpZ2libGVCb3hlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNlbGVjdEVsaWdpYmxlQm94ID0gKGVsaWdpYmxlQm94ZXM6IEFycmF5PEVyZ29Cb3g+KTogRXJnb0JveCA9PiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgRm91bmQgWyR7XG4gICAgICAgIGVsaWdpYmxlQm94ZXMubGVuZ3RoXG4gICAgICB9XSBtaW5pbXVtLWZlZSBib3hlczogJHtKc29uQmlnSW50LnN0cmluZ2lmeShcbiAgICAgICAgZWxpZ2libGVCb3hlcy5tYXAoKGJveCkgPT4gYm94LnRvX2pzb24oKSlcbiAgICAgICl9YFxuICAgICk7XG5cbiAgICBpZiAoZWxpZ2libGVCb3hlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYEZvdW5kIG5vIG1pbmltdW0tZmVlIGJveCBmb3IgdG9rZW4gWyR7dGhpcy50b2tlbklkfV0gYW5kIGFkZHJlc3MgWyR7dGhpcy5hZGRyZXNzfV1gXG4gICAgICApO1xuICAgIGVsc2UgaWYgKGVsaWdpYmxlQm94ZXMubGVuZ3RoID4gMSlcbiAgICAgIHRocm93IG5ldyBGYWlsZWRFcnJvcihcbiAgICAgICAgYEZvdW5kIFske2VsaWdpYmxlQm94ZXMubGVuZ3RofV0gbWluaW11bS1mZWUgYm94ZXMgZm9yIHRva2VuIFske3RoaXMudG9rZW5JZH1dIGFuZCBhZGRyZXNzIFske3RoaXMuYWRkcmVzc31dYFxuICAgICAgKTtcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRm91bmQgbWluaW11bS1mZWUgYm94IFske2VsaWdpYmxlQm94ZXNbMF1cbiAgICAgICAgICAuYm94X2lkKClcbiAgICAgICAgICAudG9fc3RyKCl9XSBmb3IgdG9rZW4gWyR7dGhpcy50b2tlbklkfV0gYW5kIGFkZHJlc3MgWyR7dGhpcy5hZGRyZXNzfV1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVsaWdpYmxlQm94ZXNbMF07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBmZXRjaGVzIGJveCBmcm9tIHRoZSBibG9ja2NoYWluIHVzaW5nIGV4cGxvcmVyIGNsaWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGZldGNoQm94ZXNVc2luZ0V4cGxvcmVyID0gYXN5bmMgKCk6IFByb21pc2U8QXJyYXk8RXJnb0JveD4+ID0+IHtcbiAgICBjb25zdCBib3hlczogQXJyYXk8RXJnb0JveD4gPSBbXTtcbiAgICB0cnkge1xuICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMDtcbiAgICAgIGxldCBib3hlc1BhZ2UgPVxuICAgICAgICBhd2FpdCB0aGlzLmV4cGxvcmVyQ2xpZW50LnYxLmdldEFwaVYxQm94ZXNVbnNwZW50QnlhZGRyZXNzUDEoXG4gICAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9mZnNldDogY3VycmVudFBhZ2UgKiB0aGlzLkJPWF9GRVRDSElOR19QQUdFX1NJWkUsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgcmVxdWVzdGVkICdleHBsb3JlckNsaWVudC5nZXRBcGlWMUJveGVzVW5zcGVudEJ5YWRkcmVzc1AxJyBmb3IgYWRkcmVzcyBbJHtcbiAgICAgICAgICB0aGlzLmFkZHJlc3NcbiAgICAgICAgfV0uIHJlczogJHtKc29uQmlnSW50LnN0cmluZ2lmeShib3hlc1BhZ2UpfWBcbiAgICAgICk7XG4gICAgICB3aGlsZSAoYm94ZXNQYWdlLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgYm94ZXMucHVzaChcbiAgICAgICAgICAuLi5ib3hlc1BhZ2UuaXRlbXMubWFwKChib3gpID0+XG4gICAgICAgICAgICBFcmdvQm94LmZyb21fanNvbihKc29uQmlnSW50LnN0cmluZ2lmeShib3gpKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudFBhZ2UrKztcbiAgICAgICAgYm94ZXNQYWdlID1cbiAgICAgICAgICBhd2FpdCB0aGlzLmV4cGxvcmVyQ2xpZW50LnYxLmdldEFwaVYxQm94ZXNVbnNwZW50QnlhZGRyZXNzUDEoXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9mZnNldDogY3VycmVudFBhZ2UgKiB0aGlzLkJPWF9GRVRDSElOR19QQUdFX1NJWkUsXG4gICAgICAgICAgICAgIGxpbWl0OiB0aGlzLkJPWF9GRVRDSElOR19QQUdFX1NJWkUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYHJlcXVlc3RlZCAnZXhwbG9yZXJDbGllbnQuZ2V0QXBpVjFCb3hlc1Vuc3BlbnRCeWFkZHJlc3NQMScgZm9yIGFkZHJlc3MgWyR7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NcbiAgICAgICAgICB9XS4gcmVzOiAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGJveGVzUGFnZSl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gaGFuZGxlQXBpRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICAnRmFpbGVkIHRvIGdldCBib3hlcyBieSB0b2tlbiBpZCBmcm9tIEVyZ28gRXhwbG9yZXI6J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm94ZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGZldGNoZXMgdGhlIGJveCBmcm9tIHRoZSBibG9ja2NoYWluIHVzaW5nIG5vZGUgY2xpZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgZmV0Y2hCb3hlc1VzaW5nTm9kZSA9IGFzeW5jICgpOiBQcm9taXNlPEFycmF5PEVyZ29Cb3g+PiA9PiB7XG4gICAgY29uc3QgYm94ZXM6IEFycmF5PEVyZ29Cb3g+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjdXJyZW50UGFnZSA9IDA7XG4gICAgICBsZXQgYm94ZXNQYWdlID0gYXdhaXQgdGhpcy5ub2RlQ2xpZW50LmdldEJveGVzQnlBZGRyZXNzVW5zcGVudChcbiAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICB7XG4gICAgICAgICAgb2Zmc2V0OiBjdXJyZW50UGFnZSAqIHRoaXMuQk9YX0ZFVENISU5HX1BBR0VfU0laRSxcbiAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGByZXF1ZXN0ZWQgJ25vZGVDbGllbnQuZ2V0Qm94ZXNCeUFkZHJlc3NVbnNwZW50JyBmb3IgYWRkcmVzcyBbJHtcbiAgICAgICAgICB0aGlzLmFkZHJlc3NcbiAgICAgICAgfV0uIHJlczogJHtKc29uQmlnSW50LnN0cmluZ2lmeShib3hlc1BhZ2UpfWBcbiAgICAgICk7XG4gICAgICB3aGlsZSAoYm94ZXNQYWdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBib3hlcy5wdXNoKFxuICAgICAgICAgIC4uLmJveGVzUGFnZS5tYXAoKGJveCkgPT5cbiAgICAgICAgICAgIEVyZ29Cb3guZnJvbV9qc29uKEpzb25CaWdJbnQuc3RyaW5naWZ5KGJveCkpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBjdXJyZW50UGFnZSsrO1xuICAgICAgICBib3hlc1BhZ2UgPSBhd2FpdCB0aGlzLm5vZGVDbGllbnQuZ2V0Qm94ZXNCeUFkZHJlc3NVbnNwZW50KFxuICAgICAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQYWdlICogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMuQk9YX0ZFVENISU5HX1BBR0VfU0laRSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGByZXF1ZXN0ZWQgJ25vZGVDbGllbnQuZ2V0Qm94ZXNCeUFkZHJlc3NVbnNwZW50JyBmb3IgYWRkcmVzcyBbJHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc1xuICAgICAgICAgIH1dLiByZXM6ICR7SnNvbkJpZ0ludC5zdHJpbmdpZnkoYm94ZXNQYWdlKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGJhc2VFcnJvciA9ICdGYWlsZWQgdG8gZ2V0IGJveGVzIGJ5IHRva2VuIGlkIGZyb20gRXJnbyBOb2RlOic7XG4gICAgICBoYW5kbGVBcGlFcnJvcihlcnJvciwgYmFzZUVycm9yLCB7XG4gICAgICAgIGhhbmRsZVJlc3BvbmRlZFN0YXRlOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDApIHJldHVybjtcbiAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkRXJyb3IoXG4gICAgICAgICAgICBgJHtiYXNlRXJyb3J9IFske2Vycm9yLnJlc3BvbnNlLnN0YXR1c31dICR7ZXJyb3IucmVzcG9uc2UuZGF0YS5yZWFzb259YFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm94ZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgZmV0Y2hlZCBjb25maWcgYm94XG4gICAqL1xuICBnZXRCb3ggPSAoKTogRXJnb0JveCA9PiB0aGlzLmJveDtcblxuICAvKipcbiAgICogZ2V0cyBjb3JyZXNwb25kaW5nIGNvbmZpZyBmb3IgdHdvIGNoYWlucyBhbmQgaGVpZ2h0XG4gICAqIEBwYXJhbSBmcm9tQ2hhaW5cbiAgICogQHBhcmFtIGhlaWdodCBibG9ja2NoYWluIGhlaWdodCBmb3IgZnJvbUNoYWluXG4gICAqIEBwYXJhbSB0b0NoYWluXG4gICAqL1xuICBnZXRGZWUgPSAoXG4gICAgZnJvbUNoYWluOiBzdHJpbmcsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdG9DaGFpbjogc3RyaW5nXG4gICk6IENoYWluTWluaW11bUZlZSA9PiB7XG4gICAgaWYgKCF0aGlzLmJveCkgdGhyb3cgRXJyb3IoYEJveCBpcyBub3QgZmV0Y2hlZCB5ZXRgKTtcblxuICAgIGNvbnN0IGZlZXMgPSB0aGlzLmV4dHJhY3RGZWVGcm9tQm94KCkucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3QgZmVlIG9mIGZlZXMpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihmZWUuaGVpZ2h0cywgZnJvbUNoYWluKSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgICAgYE5vIGZlZSBmb3VuZCBmb3IgY2hhaW4gWyR7ZnJvbUNoYWlufV0gaW4gYm94IFske3RoaXMuYm94XG4gICAgICAgICAgICAuYm94X2lkKClcbiAgICAgICAgICAgIC50b19zdHIoKX1dYFxuICAgICAgICApO1xuICAgICAgaWYgKGZlZS5oZWlnaHRzW2Zyb21DaGFpbl0gPCBoZWlnaHQpIHtcbiAgICAgICAgY29uc3QgY2hhaW5GZWUgPSBmZWUuY29uZmlnc1t0b0NoYWluXTtcbiAgICAgICAgaWYgKGNoYWluRmVlKSByZXR1cm4gbmV3IENoYWluTWluaW11bUZlZShjaGFpbkZlZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2hhaW4gWyR7dG9DaGFpbn1dIGlzIG5vdCBzdXBwb3J0ZWQgYXQgZ2l2ZW4gaGVpZ2h0IG9mIGZyb21DaGFpbiBbJHtoZWlnaHR9IG9mICR7ZnJvbUNoYWlufV0gaW4gYm94IFske3RoaXMuYm94XG4gICAgICAgICAgICAgIC5ib3hfaWQoKVxuICAgICAgICAgICAgICAudG9fc3RyKCl9XWBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgYENvbmZpZyBkb2VzIG5vdCBzdXBwb3J0IGhlaWdodCBbJHtoZWlnaHR9XSBmb3IgY2hhaW4gWyR7ZnJvbUNoYWlufV0gaW4gYm94IFske3RoaXMuYm94XG4gICAgICAgIC5ib3hfaWQoKVxuICAgICAgICAudG9fc3RyKCl9XWBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBGZWUgY29uZmlnIGZyb20gYm94IHJlZ2lzdGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIGV4dHJhY3RGZWVGcm9tQm94ID0gKCk6IEFycmF5PEZlZT4gPT4ge1xuICAgIGNvbnN0IFI0ID0gdGhpcy5ib3gucmVnaXN0ZXJfdmFsdWUoNCk7XG4gICAgY29uc3QgUjUgPSB0aGlzLmJveC5yZWdpc3Rlcl92YWx1ZSg1KTtcbiAgICBjb25zdCBSNiA9IHRoaXMuYm94LnJlZ2lzdGVyX3ZhbHVlKDYpO1xuICAgIGNvbnN0IFI3ID0gdGhpcy5ib3gucmVnaXN0ZXJfdmFsdWUoNyk7XG4gICAgY29uc3QgUjggPSB0aGlzLmJveC5yZWdpc3Rlcl92YWx1ZSg4KTtcbiAgICBjb25zdCBSOSA9IHRoaXMuYm94LnJlZ2lzdGVyX3ZhbHVlKDkpO1xuXG4gICAgaWYgKCFSNCB8fCAhUjUgfHwgIVI2IHx8ICFSNyB8fCAhUjggfHwgIVI5KVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbmNvbXBsZXRlIHJlZ2lzdGVyIGRhdGEgZm9yIG1pbmltdW0tZmVlIGNvbmZpZyBib3ggWyR7dGhpcy5ib3hcbiAgICAgICAgICAuYm94X2lkKClcbiAgICAgICAgICAudG9fc3RyKCl9XWBcbiAgICAgICk7XG5cbiAgICBjb25zdCBmZWVzOiBBcnJheTxGZWU+ID0gW107XG4gICAgY29uc3QgY2hhaW5zID0gUjQudG9fY29sbF9jb2xsX2J5dGUoKS5tYXAoKGVsZW1lbnQpID0+XG4gICAgICBCdWZmZXIuZnJvbShlbGVtZW50KS50b1N0cmluZygpXG4gICAgKTtcbiAgICBjb25zdCBoZWlnaHRzID0gUjUudG9fanMoKSBhcyBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBjb25zdCBicmlkZ2VGZWVzID0gUjYudG9fanMoKSBhcyBBcnJheTxBcnJheTxzdHJpbmc+PjtcbiAgICBjb25zdCBuZXR3b3JrRmVlcyA9IFI3LnRvX2pzKCkgYXMgQXJyYXk8QXJyYXk8c3RyaW5nPj47XG4gICAgY29uc3QgcnNuUmF0aW9zID0gUjgudG9fanMoKSBhcyBBcnJheTxBcnJheTxBcnJheTxzdHJpbmc+Pj47XG4gICAgY29uc3QgZmVlUmF0aW9zID0gUjkudG9fanMoKSBhcyBBcnJheTxBcnJheTxzdHJpbmc+PjtcblxuICAgIGZvciAobGV0IGZlZUlkeCA9IDA7IGZlZUlkeCA8IGhlaWdodHMubGVuZ3RoOyBmZWVJZHgrKykge1xuICAgICAgY29uc3QgZmVlOiBGZWUgPSB7XG4gICAgICAgIGhlaWdodHM6IHt9LFxuICAgICAgICBjb25maWdzOiB7fSxcbiAgICAgIH07XG4gICAgICBmb3IgKGxldCBjaGFpbklkeCA9IDA7IGNoYWluSWR4IDwgY2hhaW5zLmxlbmd0aDsgY2hhaW5JZHgrKykge1xuICAgICAgICBjb25zdCBjaGFpbiA9IGNoYWluc1tjaGFpbklkeF07XG5cbiAgICAgICAgaWYgKGhlaWdodHNbZmVlSWR4XVtjaGFpbklkeF0gPT09IC0xKSBjb250aW51ZTtcbiAgICAgICAgZmVlLmhlaWdodHNbY2hhaW5dID0gaGVpZ2h0c1tmZWVJZHhdW2NoYWluSWR4XTtcblxuICAgICAgICBpZiAoYnJpZGdlRmVlc1tmZWVJZHhdW2NoYWluSWR4XSA9PT0gJy0xJykgY29udGludWU7XG4gICAgICAgIGZlZS5jb25maWdzW2NoYWluXSA9IHtcbiAgICAgICAgICBicmlkZ2VGZWU6IEJpZ0ludChicmlkZ2VGZWVzW2ZlZUlkeF1bY2hhaW5JZHhdKSxcbiAgICAgICAgICBuZXR3b3JrRmVlOiBCaWdJbnQobmV0d29ya0ZlZXNbZmVlSWR4XVtjaGFpbklkeF0pLFxuICAgICAgICAgIHJzblJhdGlvOiBCaWdJbnQocnNuUmF0aW9zW2ZlZUlkeF1bY2hhaW5JZHhdWzBdKSxcbiAgICAgICAgICByc25SYXRpb0Rpdmlzb3I6IEJpZ0ludChyc25SYXRpb3NbZmVlSWR4XVtjaGFpbklkeF1bMV0pLFxuICAgICAgICAgIGZlZVJhdGlvOiBCaWdJbnQoZmVlUmF0aW9zW2ZlZUlkeF1bY2hhaW5JZHhdKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZlZXMucHVzaChmZWUpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEV4dHJhY3RlZCBmZWUgY29uZmlnIGZyb20gYm94IFske3RoaXMuYm94XG4gICAgICAgIC5ib3hfaWQoKVxuICAgICAgICAudG9fc3RyKCl9XTogJHtKc29uQmlnSW50LnN0cmluZ2lmeShmZWVzKX1gXG4gICAgKTtcblxuICAgIHJldHVybiBmZWVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZXMgYSBNaW5pbXVtRmVlQm94QnVpbGRlciB1c2luZyBjdXJyZW50IGJveFxuICAgKiAgbm90ZSB0aGF0ICdoZWlnaHQnIHBhcmFtZXRlciBvZiBidWlsZGVyIHdvbid0IGJlIHNldFxuICAgKi9cbiAgdG9CdWlsZGVyID0gKCk6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IE1pbmltdW1GZWVCb3hCdWlsZGVyKHRoaXMubWluaW11bUZlZU5GVCwgdGhpcy5hZGRyZXNzKVxuICAgICAgLnNldFZhbHVlKEJpZ0ludCh0aGlzLmJveC52YWx1ZSgpLmFzX2k2NCgpLnRvX3N0cigpKSlcbiAgICAgIC5zZXRUb2tlbih0aGlzLnRva2VuSWQpO1xuXG4gICAgdGhpcy5leHRyYWN0RmVlRnJvbUJveCgpLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgY29uc3QgY2hhaW5GZWUgPSBuZXcgTWluaW11bUZlZUNvbmZpZygpO1xuICAgICAgT2JqZWN0LmtleXMoZmVlLmhlaWdodHMpLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duKGZlZS5jb25maWdzLCBjaGFpbikpXG4gICAgICAgICAgY2hhaW5GZWUuc2V0Q2hhaW5Db25maWcoXG4gICAgICAgICAgICBjaGFpbixcbiAgICAgICAgICAgIGZlZS5oZWlnaHRzW2NoYWluXSxcbiAgICAgICAgICAgIGZlZS5jb25maWdzW2NoYWluXVxuICAgICAgICAgICk7XG4gICAgICAgIGVsc2UgY2hhaW5GZWUuc2V0Q2hhaW5Db25maWcoY2hhaW4sIGZlZS5oZWlnaHRzW2NoYWluXSwgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlci5hZGRDb25maWcoY2hhaW5GZWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xufVxuIl19
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9NaW5pbXVtRmVlQm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8seUJBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxxQkFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLE9BQU8sYUFBYTtJQUNMLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztJQUNyQyxNQUFNLENBQWlCO0lBQ3ZCLEdBQUcsQ0FBc0I7SUFDekIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixjQUFjLENBQStDO0lBQzdELFVBQVUsQ0FBMkM7SUFFL0QsWUFDRSxPQUFlLEVBQ2YsYUFBcUIsRUFDckIsV0FBNEIsRUFDNUIsVUFBa0IsRUFDbEIsTUFBdUI7UUFFdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxXQUFXLEtBQUss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LENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN6QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7b0JBQ25DLFFBQVEsQ0FBQyxjQUFjLENBQ3JCLEtBQUssRUFDTCxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUNsQixHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUNuQixDQUFDOztvQkFDQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWRkcmVzcywgRXJnb0JveCwgTmV0d29ya1ByZWZpeCB9IGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCB7IENoYWluTWluaW11bUZlZSwgRXJnb05ldHdvcmtUeXBlLCBGZWUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEZhaWxlZEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IGVyZ29FeHBsb3JlckNsaWVudEZhY3RvcnkgZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1leHBsb3Jlcic7XG5pbXBvcnQgZXJnb05vZGVDbGllbnRGYWN0b3J5IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tbm9kZSc7XG5pbXBvcnQgSnNvbkJpZ0ludCBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcbmltcG9ydCBoYW5kbGVBcGlFcnJvciBmcm9tICcuL2hhbmRsZUFwaUVycm9yJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IE1pbmltdW1GZWVCb3hCdWlsZGVyIH0gZnJvbSAnLi9NaW5pbXVtRmVlQm94QnVpbGRlcic7XG5pbXBvcnQgeyBNaW5pbXVtRmVlQ29uZmlnIH0gZnJvbSAnLi9NaW5pbXVtRmVlQ29uZmlnJztcbmltcG9ydCB7IEVSR09fTkFUSVZFX1RPS0VOIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgTWluaW11bUZlZUJveCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBCT1hfRkVUQ0hJTkdfUEFHRV9TSVpFID0gNTA7XG4gIHByb3RlY3RlZCBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICBwcm90ZWN0ZWQgYm94OiBFcmdvQm94IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgdG9rZW5JZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbWluaW11bUZlZU5GVDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZXhwbG9yZXJDbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGVyZ29FeHBsb3JlckNsaWVudEZhY3Rvcnk+O1xuICBwcm90ZWN0ZWQgbm9kZUNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgZXJnb05vZGVDbGllbnRGYWN0b3J5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0b2tlbklkOiBzdHJpbmcsXG4gICAgbWluaW11bUZlZU5GVDogc3RyaW5nLFxuICAgIG5ldHdvcmtUeXBlOiBFcmdvTmV0d29ya1R5cGUsXG4gICAgbmV0d29ya1VybDogc3RyaW5nLFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyXG4gICkge1xuICAgIHRoaXMudG9rZW5JZCA9IHRva2VuSWQ7XG4gICAgdGhpcy5taW5pbXVtRmVlTkZUID0gbWluaW11bUZlZU5GVDtcbiAgICBpZiAobmV0d29ya1R5cGUgPT09IEVyZ29OZXR3b3JrVHlwZS5leHBsb3JlcilcbiAgICAgIHRoaXMuZXhwbG9yZXJDbGllbnQgPSBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5KG5ldHdvcmtVcmwpO1xuICAgIGVsc2UgdGhpcy5ub2RlQ2xpZW50ID0gZXJnb05vZGVDbGllbnRGYWN0b3J5KG5ldHdvcmtVcmwpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogZmV0Y2hlcyB0aGUgYm94IGZyb20gdGhlIGJsb2NrY2hhaW5cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZVxuICAgKi9cbiAgZmV0Y2hCb3ggPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgYm94SGFzQXBwcm9wcmlhdGVUb2tlbnMgPSAoYm94OiBFcmdvQm94KSA9PiB7XG4gICAgICBjb25zdCB0b2tlbkxlbiA9IGJveC50b2tlbnMoKS5sZW4oKTtcbiAgICAgIGxldCBoYXNNaW5pbXVtRmVlTkZUID0gZmFsc2U7XG4gICAgICBsZXQgaGFzVGFyZ2V0VG9rZW4gPSB0aGlzLnRva2VuSWQgPT09IEVSR09fTkFUSVZFX1RPS0VOID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgY29uc3QgaGFzQ29ycmVjdFRva2VucyA9XG4gICAgICAgIHRoaXMudG9rZW5JZCA9PT0gRVJHT19OQVRJVkVfVE9LRU4gPyB0b2tlbkxlbiA9PT0gMSA6IHRva2VuTGVuID09PSAyO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbkxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYm94LnRva2VucygpLmdldChpKS5pZCgpLnRvX3N0cigpO1xuICAgICAgICBpZiAoaWQgPT09IHRoaXMubWluaW11bUZlZU5GVCkgaGFzTWluaW11bUZlZU5GVCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGlkID09PSB0aGlzLnRva2VuSWQpIGhhc1RhcmdldFRva2VuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNDb3JyZWN0VG9rZW5zICYmIGhhc01pbmltdW1GZWVORlQgJiYgaGFzVGFyZ2V0VG9rZW47XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3hlcyA9IHRoaXMuZXhwbG9yZXJDbGllbnRcbiAgICAgICAgPyBhd2FpdCB0aGlzLmZldGNoQm94ZXNVc2luZ0V4cGxvcmVyKClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmZldGNoQm94ZXNVc2luZ05vZGUoKTtcblxuICAgICAgdGhpcy5ib3ggPSB0aGlzLnNlbGVjdEVsaWdpYmxlQm94KFxuICAgICAgICBib3hlcy5maWx0ZXIoKGJveDogRXJnb0JveCkgPT4gYm94SGFzQXBwcm9wcmlhdGVUb2tlbnMoYm94KSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IgfHwgZSBpbnN0YW5jZW9mIEZhaWxlZEVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYE5vIHZhbGlkIG1pbmltdW0tZmVlIGJveC4gcmVhc29uOiAke2V9YCk7XG4gICAgICAgIHRoaXMuYm94ID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgbWluaW11bS1mZWUgYm94OiAke2V9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGZldGNoZWQgYm94IG9yIHRocm93cyBhcHByb3ByaWF0ZSBlcnJvciBpZiBmb3VuZCBtb3JlIG9yIG5vbmVcbiAgICogQHBhcmFtIGVsaWdpYmxlQm94ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzZWxlY3RFbGlnaWJsZUJveCA9IChlbGlnaWJsZUJveGVzOiBBcnJheTxFcmdvQm94Pik6IEVyZ29Cb3ggPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEZvdW5kIFske1xuICAgICAgICBlbGlnaWJsZUJveGVzLmxlbmd0aFxuICAgICAgfV0gbWluaW11bS1mZWUgYm94ZXM6ICR7SnNvbkJpZ0ludC5zdHJpbmdpZnkoXG4gICAgICAgIGVsaWdpYmxlQm94ZXMubWFwKChib3gpID0+IGJveC50b19qc29uKCkpXG4gICAgICApfWBcbiAgICApO1xuXG4gICAgaWYgKGVsaWdpYmxlQm94ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYEZvdW5kIG5vIG1pbmltdW0tZmVlIGJveCBmb3IgdG9rZW4gWyR7dGhpcy50b2tlbklkfV1gXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZWxpZ2libGVCb3hlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRmFpbGVkRXJyb3IoXG4gICAgICAgIGBGb3VuZCBbJHtlbGlnaWJsZUJveGVzLmxlbmd0aH1dIG1pbmltdW0tZmVlIGJveGVzIGZvciB0b2tlbiBbJHt0aGlzLnRva2VuSWR9XWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgRm91bmQgbWluaW11bS1mZWUgYm94IFske2VsaWdpYmxlQm94ZXNbMF1cbiAgICAgICAgICAuYm94X2lkKClcbiAgICAgICAgICAudG9fc3RyKCl9XSBmb3IgdG9rZW4gWyR7dGhpcy50b2tlbklkfV1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVsaWdpYmxlQm94ZXNbMF07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBmZXRjaGVzIGJveCBmcm9tIHRoZSBibG9ja2NoYWluIHVzaW5nIGV4cGxvcmVyIGNsaWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGZldGNoQm94ZXNVc2luZ0V4cGxvcmVyID0gYXN5bmMgKCk6IFByb21pc2U8QXJyYXk8RXJnb0JveD4+ID0+IHtcbiAgICBjb25zdCBib3hlczogQXJyYXk8RXJnb0JveD4gPSBbXTtcbiAgICB0cnkge1xuICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMDtcbiAgICAgIGxldCBib3hlc1BhZ2UgPVxuICAgICAgICBhd2FpdCB0aGlzLmV4cGxvcmVyQ2xpZW50LnYxLmdldEFwaVYxQm94ZXNVbnNwZW50Qnl0b2tlbmlkUDEoXG4gICAgICAgICAgdGhpcy50b2tlbklkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9mZnNldDogY3VycmVudFBhZ2UgKiB0aGlzLkJPWF9GRVRDSElOR19QQUdFX1NJWkUsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgcmVxdWVzdGVkICdleHBsb3JlckNsaWVudC5nZXRBcGlWMUJveGVzVW5zcGVudEJ5dG9rZW5pZFAxJyBmb3IgdG9rZW4gWyR7XG4gICAgICAgICAgdGhpcy50b2tlbklkXG4gICAgICAgIH1dLiByZXM6ICR7SnNvbkJpZ0ludC5zdHJpbmdpZnkoYm94ZXNQYWdlKX1gXG4gICAgICApO1xuICAgICAgd2hpbGUgKGJveGVzUGFnZS5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgIGJveGVzLnB1c2goXG4gICAgICAgICAgLi4uYm94ZXNQYWdlLml0ZW1zLm1hcCgoYm94KSA9PlxuICAgICAgICAgICAgRXJnb0JveC5mcm9tX2pzb24oSnNvbkJpZ0ludC5zdHJpbmdpZnkoYm94KSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRQYWdlKys7XG4gICAgICAgIGJveGVzUGFnZSA9XG4gICAgICAgICAgYXdhaXQgdGhpcy5leHBsb3JlckNsaWVudC52MS5nZXRBcGlWMUJveGVzVW5zcGVudEJ5dG9rZW5pZFAxKFxuICAgICAgICAgICAgdGhpcy50b2tlbklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQYWdlICogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgICBsaW1pdDogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGByZXF1ZXN0ZWQgJ2V4cGxvcmVyQ2xpZW50LmdldEFwaVYxQm94ZXNVbnNwZW50Qnl0b2tlbmlkUDEnIGZvciB0b2tlbiBbJHtcbiAgICAgICAgICAgIHRoaXMudG9rZW5JZFxuICAgICAgICAgIH1dLiByZXM6ICR7SnNvbkJpZ0ludC5zdHJpbmdpZnkoYm94ZXNQYWdlKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBoYW5kbGVBcGlFcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgICdGYWlsZWQgdG8gZ2V0IGJveGVzIGJ5IHRva2VuIGlkIGZyb20gRXJnbyBFeHBsb3JlcjonXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBib3hlcztcbiAgfTtcblxuICAvKipcbiAgICogZmV0Y2hlcyB0aGUgYm94IGZyb20gdGhlIGJsb2NrY2hhaW4gdXNpbmcgbm9kZSBjbGllbnRcbiAgICovXG4gIHByb3RlY3RlZCBmZXRjaEJveGVzVXNpbmdOb2RlID0gYXN5bmMgKCk6IFByb21pc2U8QXJyYXk8RXJnb0JveD4+ID0+IHtcbiAgICBjb25zdCBib3hlczogQXJyYXk8RXJnb0JveD4gPSBbXTtcbiAgICB0cnkge1xuICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMDtcbiAgICAgIGxldCBib3hlc1BhZ2UgPSBhd2FpdCB0aGlzLm5vZGVDbGllbnQuZ2V0Qm94ZXNCeVRva2VuSWRVbnNwZW50KFxuICAgICAgICB0aGlzLnRva2VuSWQsXG4gICAgICAgIHtcbiAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQYWdlICogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgIGxpbWl0OiB0aGlzLkJPWF9GRVRDSElOR19QQUdFX1NJWkUsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYHJlcXVlc3RlZCAnbm9kZUNsaWVudC5nZXRCb3hlc0J5VG9rZW5JZFVuc3BlbnQnIGZvciB0b2tlbiBbJHtcbiAgICAgICAgICB0aGlzLnRva2VuSWRcbiAgICAgICAgfV0uIHJlczogJHtKc29uQmlnSW50LnN0cmluZ2lmeShib3hlc1BhZ2UpfWBcbiAgICAgICk7XG4gICAgICB3aGlsZSAoYm94ZXNQYWdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBib3hlcy5wdXNoKFxuICAgICAgICAgIC4uLmJveGVzUGFnZS5tYXAoKGJveCkgPT5cbiAgICAgICAgICAgIEVyZ29Cb3guZnJvbV9qc29uKEpzb25CaWdJbnQuc3RyaW5naWZ5KGJveCkpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBjdXJyZW50UGFnZSsrO1xuICAgICAgICBib3hlc1BhZ2UgPSBhd2FpdCB0aGlzLm5vZGVDbGllbnQuZ2V0Qm94ZXNCeVRva2VuSWRVbnNwZW50KFxuICAgICAgICAgIHRoaXMudG9rZW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvZmZzZXQ6IGN1cnJlbnRQYWdlICogdGhpcy5CT1hfRkVUQ0hJTkdfUEFHRV9TSVpFLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMuQk9YX0ZFVENISU5HX1BBR0VfU0laRSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGByZXF1ZXN0ZWQgJ25vZGVDbGllbnQuZ2V0Qm94ZXNCeVRva2VuSWRVbnNwZW50JyBmb3IgdG9rZW4gWyR7XG4gICAgICAgICAgICB0aGlzLnRva2VuSWRcbiAgICAgICAgICB9XS4gcmVzOiAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGJveGVzUGFnZSl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBiYXNlRXJyb3IgPSAnRmFpbGVkIHRvIGdldCBib3hlcyBieSB0b2tlbiBpZCBmcm9tIEVyZ28gTm9kZTonO1xuICAgICAgaGFuZGxlQXBpRXJyb3IoZXJyb3IsIGJhc2VFcnJvciwge1xuICAgICAgICBoYW5kbGVSZXNwb25kZWRTdGF0ZTogKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwKSByZXR1cm47XG4gICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZEVycm9yKFxuICAgICAgICAgICAgYCR7YmFzZUVycm9yfSBbJHtlcnJvci5yZXNwb25zZS5zdGF0dXN9XSAke2Vycm9yLnJlc3BvbnNlLmRhdGEucmVhc29ufWBcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJveGVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGZldGNoZWQgY29uZmlnIGJveFxuICAgKi9cbiAgZ2V0Qm94ID0gKCk6IEVyZ29Cb3ggfCB1bmRlZmluZWQgPT4gdGhpcy5ib3g7XG5cbiAgLyoqXG4gICAqIGdldHMgY29ycmVzcG9uZGluZyBjb25maWcgZm9yIHR3byBjaGFpbnMgYW5kIGhlaWdodFxuICAgKiBAcGFyYW0gZnJvbUNoYWluXG4gICAqIEBwYXJhbSBoZWlnaHQgYmxvY2tjaGFpbiBoZWlnaHQgZm9yIGZyb21DaGFpblxuICAgKiBAcGFyYW0gdG9DaGFpblxuICAgKi9cbiAgZ2V0RmVlID0gKFxuICAgIGZyb21DaGFpbjogc3RyaW5nLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIHRvQ2hhaW46IHN0cmluZ1xuICApOiBDaGFpbk1pbmltdW1GZWUgPT4ge1xuICAgIGlmICghdGhpcy5ib3gpIHRocm93IEVycm9yKGBCb3ggaXMgbm90IGZldGNoZWQgeWV0YCk7XG5cbiAgICBjb25zdCBmZWVzID0gdGhpcy5leHRyYWN0RmVlRnJvbUJveCh0aGlzLmJveCkucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3QgZmVlIG9mIGZlZXMpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihmZWUuaGVpZ2h0cywgZnJvbUNoYWluKSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgICAgYE5vIGZlZSBmb3VuZCBmb3IgY2hhaW4gWyR7ZnJvbUNoYWlufV0gaW4gYm94IFske3RoaXMuYm94XG4gICAgICAgICAgICAuYm94X2lkKClcbiAgICAgICAgICAgIC50b19zdHIoKX1dYFxuICAgICAgICApO1xuICAgICAgaWYgKGZlZS5oZWlnaHRzW2Zyb21DaGFpbl0gPCBoZWlnaHQpIHtcbiAgICAgICAgY29uc3QgY2hhaW5GZWUgPSBmZWUuY29uZmlnc1t0b0NoYWluXTtcbiAgICAgICAgaWYgKGNoYWluRmVlKSByZXR1cm4gbmV3IENoYWluTWluaW11bUZlZShjaGFpbkZlZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2hhaW4gWyR7dG9DaGFpbn1dIGlzIG5vdCBzdXBwb3J0ZWQgYXQgZ2l2ZW4gaGVpZ2h0IG9mIGZyb21DaGFpbiBbJHtoZWlnaHR9IG9mICR7ZnJvbUNoYWlufV0gaW4gYm94IFske3RoaXMuYm94XG4gICAgICAgICAgICAgIC5ib3hfaWQoKVxuICAgICAgICAgICAgICAudG9fc3RyKCl9XWBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgYENvbmZpZyBkb2VzIG5vdCBzdXBwb3J0IGhlaWdodCBbJHtoZWlnaHR9XSBmb3IgY2hhaW4gWyR7ZnJvbUNoYWlufV0gaW4gYm94IFske3RoaXMuYm94XG4gICAgICAgIC5ib3hfaWQoKVxuICAgICAgICAudG9fc3RyKCl9XWBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBGZWUgY29uZmlnIGZyb20gYm94IHJlZ2lzdGVyc1xuICAgKiBAcGFyYW0gYm94XG4gICAqL1xuICBwcm90ZWN0ZWQgZXh0cmFjdEZlZUZyb21Cb3ggPSAoYm94OiBFcmdvQm94KTogQXJyYXk8RmVlPiA9PiB7XG4gICAgY29uc3QgUjQgPSBib3gucmVnaXN0ZXJfdmFsdWUoNCk7XG4gICAgY29uc3QgUjUgPSBib3gucmVnaXN0ZXJfdmFsdWUoNSk7XG4gICAgY29uc3QgUjYgPSBib3gucmVnaXN0ZXJfdmFsdWUoNik7XG4gICAgY29uc3QgUjcgPSBib3gucmVnaXN0ZXJfdmFsdWUoNyk7XG4gICAgY29uc3QgUjggPSBib3gucmVnaXN0ZXJfdmFsdWUoOCk7XG4gICAgY29uc3QgUjkgPSBib3gucmVnaXN0ZXJfdmFsdWUoOSk7XG5cbiAgICBpZiAoIVI0IHx8ICFSNSB8fCAhUjYgfHwgIVI3IHx8ICFSOCB8fCAhUjkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEluY29tcGxldGUgcmVnaXN0ZXIgZGF0YSBmb3IgbWluaW11bS1mZWUgY29uZmlnIGJveCBbJHtib3hcbiAgICAgICAgICAuYm94X2lkKClcbiAgICAgICAgICAudG9fc3RyKCl9XWBcbiAgICAgICk7XG5cbiAgICBjb25zdCBmZWVzOiBBcnJheTxGZWU+ID0gW107XG4gICAgY29uc3QgY2hhaW5zID0gUjQudG9fY29sbF9jb2xsX2J5dGUoKS5tYXAoKGVsZW1lbnQpID0+XG4gICAgICBCdWZmZXIuZnJvbShlbGVtZW50KS50b1N0cmluZygpXG4gICAgKTtcbiAgICBjb25zdCBoZWlnaHRzID0gUjUudG9fanMoKSBhcyBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBjb25zdCBicmlkZ2VGZWVzID0gUjYudG9fanMoKSBhcyBBcnJheTxBcnJheTxzdHJpbmc+PjtcbiAgICBjb25zdCBuZXR3b3JrRmVlcyA9IFI3LnRvX2pzKCkgYXMgQXJyYXk8QXJyYXk8c3RyaW5nPj47XG4gICAgY29uc3QgcnNuUmF0aW9zID0gUjgudG9fanMoKSBhcyBBcnJheTxBcnJheTxBcnJheTxzdHJpbmc+Pj47XG4gICAgY29uc3QgZmVlUmF0aW9zID0gUjkudG9fanMoKSBhcyBBcnJheTxBcnJheTxzdHJpbmc+PjtcblxuICAgIGZvciAobGV0IGZlZUlkeCA9IDA7IGZlZUlkeCA8IGhlaWdodHMubGVuZ3RoOyBmZWVJZHgrKykge1xuICAgICAgY29uc3QgZmVlOiBGZWUgPSB7XG4gICAgICAgIGhlaWdodHM6IHt9LFxuICAgICAgICBjb25maWdzOiB7fSxcbiAgICAgIH07XG4gICAgICBmb3IgKGxldCBjaGFpbklkeCA9IDA7IGNoYWluSWR4IDwgY2hhaW5zLmxlbmd0aDsgY2hhaW5JZHgrKykge1xuICAgICAgICBjb25zdCBjaGFpbiA9IGNoYWluc1tjaGFpbklkeF07XG5cbiAgICAgICAgaWYgKGhlaWdodHNbZmVlSWR4XVtjaGFpbklkeF0gPT09IC0xKSBjb250aW51ZTtcbiAgICAgICAgZmVlLmhlaWdodHNbY2hhaW5dID0gaGVpZ2h0c1tmZWVJZHhdW2NoYWluSWR4XTtcblxuICAgICAgICBpZiAoYnJpZGdlRmVlc1tmZWVJZHhdW2NoYWluSWR4XSA9PT0gJy0xJykgY29udGludWU7XG4gICAgICAgIGZlZS5jb25maWdzW2NoYWluXSA9IHtcbiAgICAgICAgICBicmlkZ2VGZWU6IEJpZ0ludChicmlkZ2VGZWVzW2ZlZUlkeF1bY2hhaW5JZHhdKSxcbiAgICAgICAgICBuZXR3b3JrRmVlOiBCaWdJbnQobmV0d29ya0ZlZXNbZmVlSWR4XVtjaGFpbklkeF0pLFxuICAgICAgICAgIHJzblJhdGlvOiBCaWdJbnQocnNuUmF0aW9zW2ZlZUlkeF1bY2hhaW5JZHhdWzBdKSxcbiAgICAgICAgICByc25SYXRpb0Rpdmlzb3I6IEJpZ0ludChyc25SYXRpb3NbZmVlSWR4XVtjaGFpbklkeF1bMV0pLFxuICAgICAgICAgIGZlZVJhdGlvOiBCaWdJbnQoZmVlUmF0aW9zW2ZlZUlkeF1bY2hhaW5JZHhdKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZlZXMucHVzaChmZWUpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEV4dHJhY3RlZCBmZWUgY29uZmlnIGZyb20gYm94IFske2JveFxuICAgICAgICAuYm94X2lkKClcbiAgICAgICAgLnRvX3N0cigpfV06ICR7SnNvbkJpZ0ludC5zdHJpbmdpZnkoZmVlcyl9YFxuICAgICk7XG5cbiAgICByZXR1cm4gZmVlcztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGEgTWluaW11bUZlZUJveEJ1aWxkZXIgdXNpbmcgY3VycmVudCBib3hcbiAgICogIG5vdGUgdGhhdCAnaGVpZ2h0JyBwYXJhbWV0ZXIgb2YgYnVpbGRlciB3b24ndCBiZSBzZXRcbiAgICovXG4gIHRvQnVpbGRlciA9ICgpOiBNaW5pbXVtRmVlQm94QnVpbGRlciA9PiB7XG4gICAgaWYgKCF0aGlzLmJveCkgdGhyb3cgRXJyb3IoYEJveCBpcyBub3QgZmV0Y2hlZCB5ZXRgKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgTWluaW11bUZlZUJveEJ1aWxkZXIoXG4gICAgICB0aGlzLm1pbmltdW1GZWVORlQsXG4gICAgICBBZGRyZXNzLnJlY3JlYXRlX2Zyb21fZXJnb190cmVlKHRoaXMuYm94LmVyZ29fdHJlZSgpKS50b19iYXNlNTgoXG4gICAgICAgIE5ldHdvcmtQcmVmaXguTWFpbm5ldFxuICAgICAgKVxuICAgIClcbiAgICAgIC5zZXRWYWx1ZShCaWdJbnQodGhpcy5ib3gudmFsdWUoKS5hc19pNjQoKS50b19zdHIoKSkpXG4gICAgICAuc2V0VG9rZW4odGhpcy50b2tlbklkKTtcblxuICAgIHRoaXMuZXh0cmFjdEZlZUZyb21Cb3godGhpcy5ib3gpLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgY29uc3QgY2hhaW5GZWUgPSBuZXcgTWluaW11bUZlZUNvbmZpZygpO1xuICAgICAgT2JqZWN0LmtleXMoZmVlLmhlaWdodHMpLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duKGZlZS5jb25maWdzLCBjaGFpbikpXG4gICAgICAgICAgY2hhaW5GZWUuc2V0Q2hhaW5Db25maWcoXG4gICAgICAgICAgICBjaGFpbixcbiAgICAgICAgICAgIGZlZS5oZWlnaHRzW2NoYWluXSxcbiAgICAgICAgICAgIGZlZS5jb25maWdzW2NoYWluXVxuICAgICAgICAgICk7XG4gICAgICAgIGVsc2UgY2hhaW5GZWUuc2V0Q2hhaW5Db25maWcoY2hhaW4sIGZlZS5oZWlnaHRzW2NoYWluXSwgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlci5hZGRDb25maWcoY2hhaW5GZWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xufVxuIl19
@@ -4,7 +4,7 @@ import { Fee } from './types';
4
4
  export declare class MinimumFeeBoxBuilder {
5
5
  protected fees: Array<Fee>;
6
6
  protected boxValue: BoxValue;
7
- protected boxheight: number;
7
+ protected boxHeight: number;
8
8
  protected tokenId: string;
9
9
  protected minimumFeeNFT: string;
10
10
  protected address: string;
@@ -4,7 +4,7 @@ import { ERGO_NATIVE_TOKEN } from './constants';
4
4
  export class MinimumFeeBoxBuilder {
5
5
  fees;
6
6
  boxValue;
7
- boxheight;
7
+ boxHeight;
8
8
  tokenId;
9
9
  minimumFeeNFT;
10
10
  address;
@@ -43,7 +43,7 @@ export class MinimumFeeBoxBuilder {
43
43
  * @param currentHeight
44
44
  */
45
45
  setHeight = (currentHeight) => {
46
- this.boxheight = currentHeight;
46
+ this.boxHeight = currentHeight;
47
47
  return this;
48
48
  };
49
49
  /**
@@ -60,7 +60,7 @@ export class MinimumFeeBoxBuilder {
60
60
  validate = () => {
61
61
  if (!this.boxValue)
62
62
  throw new InvalidConfig(`Box value argument is not defined`);
63
- if (!this.boxheight)
63
+ if (!this.boxHeight)
64
64
  throw new InvalidConfig(`Box creation height argument is not defined`);
65
65
  if (!this.tokenId)
66
66
  throw new InvalidConfig(`Config token id is not defined`);
@@ -82,7 +82,7 @@ export class MinimumFeeBoxBuilder {
82
82
  build = () => {
83
83
  this.validate();
84
84
  // add box value, address and creation height
85
- const boxBuilder = new ErgoBoxCandidateBuilder(this.boxValue, Contract.new(Address.from_base58(this.address).to_ergo_tree()), this.boxheight);
85
+ const boxBuilder = new ErgoBoxCandidateBuilder(this.boxValue, Contract.new(Address.from_base58(this.address).to_ergo_tree()), this.boxHeight);
86
86
  // add box tokens
87
87
  boxBuilder.add_token(TokenId.from_str(this.minimumFeeNFT), TokenAmount.from_i64(I64.from_str('1')));
88
88
  if (this.tokenId !== ERGO_NATIVE_TOKEN)
@@ -99,13 +99,13 @@ export class MinimumFeeBoxBuilder {
99
99
  chains.sort();
100
100
  // extract configs
101
101
  const heights = [];
102
- const brdigeFees = [];
102
+ const bridgeFees = [];
103
103
  const networkFees = [];
104
104
  const rsnRatios = [];
105
105
  const feeRatios = [];
106
106
  this.fees.forEach((fee) => {
107
107
  const heightsConfigs = [];
108
- const brdigeFeesConfigs = [];
108
+ const bridgeFeesConfigs = [];
109
109
  const networkFeesConfigs = [];
110
110
  const rsnRatiosConfigs = [];
111
111
  const feeRatiosConfigs = [];
@@ -115,7 +115,7 @@ export class MinimumFeeBoxBuilder {
115
115
  else
116
116
  heightsConfigs.push(-1);
117
117
  if (Object.hasOwn(fee.configs, chain)) {
118
- brdigeFeesConfigs.push(fee.configs[chain].bridgeFee.toString());
118
+ bridgeFeesConfigs.push(fee.configs[chain].bridgeFee.toString());
119
119
  networkFeesConfigs.push(fee.configs[chain].networkFee.toString());
120
120
  rsnRatiosConfigs.push([
121
121
  fee.configs[chain].rsnRatio.toString(),
@@ -124,14 +124,14 @@ export class MinimumFeeBoxBuilder {
124
124
  feeRatiosConfigs.push(fee.configs[chain].feeRatio.toString());
125
125
  }
126
126
  else {
127
- brdigeFeesConfigs.push('-1');
127
+ bridgeFeesConfigs.push('-1');
128
128
  networkFeesConfigs.push('-1');
129
129
  rsnRatiosConfigs.push(['-1', '-1']);
130
130
  feeRatiosConfigs.push('-1');
131
131
  }
132
132
  });
133
133
  heights.push(heightsConfigs);
134
- brdigeFees.push(brdigeFeesConfigs);
134
+ bridgeFees.push(bridgeFeesConfigs);
135
135
  networkFees.push(networkFeesConfigs);
136
136
  rsnRatios.push(rsnRatiosConfigs);
137
137
  feeRatios.push(feeRatiosConfigs);
@@ -139,11 +139,11 @@ export class MinimumFeeBoxBuilder {
139
139
  // add box registers
140
140
  boxBuilder.set_register_value(4, Constant.from_coll_coll_byte(chains.map((chain) => Buffer.from(chain))));
141
141
  boxBuilder.set_register_value(5, Constant.from_js(heights));
142
- boxBuilder.set_register_value(6, Constant.from_js(brdigeFees));
142
+ boxBuilder.set_register_value(6, Constant.from_js(bridgeFees));
143
143
  boxBuilder.set_register_value(7, Constant.from_js(networkFees));
144
144
  boxBuilder.set_register_value(8, Constant.from_js(rsnRatios));
145
145
  boxBuilder.set_register_value(9, Constant.from_js(feeRatios));
146
146
  return boxBuilder.build();
147
147
  };
148
148
  }
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUJveEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvTWluaW11bUZlZUJveEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLEdBRVQsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3JCLElBQUksQ0FBYTtJQUNqQixRQUFRLENBQVc7SUFDbkIsU0FBUyxDQUFTO0lBQ2xCLE9BQU8sQ0FBUztJQUNoQixhQUFhLENBQVM7SUFDdEIsT0FBTyxDQUFTO0lBRTFCLFlBQVksYUFBcUIsRUFBRSxPQUFlO1FBQ2hELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsR0FBRyxDQUFDLFNBQTJCLEVBQXdCLEVBQUU7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQXdCLEVBQUU7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUY7Ozs7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Q2hFLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWRkcmVzcyxcbiAgQm94VmFsdWUsXG4gIENvbnRyYWN0LFxuICBFcmdvQm94Q2FuZGlkYXRlQnVpbGRlcixcbiAgSTY0LFxuICBUb2tlbkFtb3VudCxcbiAgVG9rZW5JZCxcbiAgQ29uc3RhbnQsXG4gIEVyZ29Cb3hDYW5kaWRhdGUsXG59IGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCB7IE1pbmltdW1GZWVDb25maWcgfSBmcm9tICcuL01pbmltdW1GZWVDb25maWcnO1xuaW1wb3J0IHsgRmVlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBJbnZhbGlkQ29uZmlnIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgRVJHT19OQVRJVkVfVE9LRU4gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBNaW5pbXVtRmVlQm94QnVpbGRlciB7XG4gIHByb3RlY3RlZCBmZWVzOiBBcnJheTxGZWU+O1xuICBwcm90ZWN0ZWQgYm94VmFsdWU6IEJveFZhbHVlO1xuICBwcm90ZWN0ZWQgYm94aGVpZ2h0OiBudW1iZXI7XG4gIHByb3RlY3RlZCB0b2tlbklkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtaW5pbXVtRmVlTkZUOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWluaW11bUZlZU5GVDogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZlZXMgPSBbXTtcbiAgICB0aGlzLm1pbmltdW1GZWVORlQgPSBtaW5pbXVtRmVlTkZUO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogYWRkcyBhIGZlZUNvbmZpZ1xuICAgKiBAcGFyYW0gZmVlQ29uZmlnXG4gICAqL1xuICBhZGRDb25maWcgPSAoZmVlQ29uZmlnOiBNaW5pbXVtRmVlQ29uZmlnKTogTWluaW11bUZlZUJveEJ1aWxkZXIgPT4ge1xuICAgIHRoaXMuZmVlcy5wdXNoKGZlZUNvbmZpZy5nZXRDb25maWcoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZXMgYSBjb25maWcgYnkgaW5kZXhcbiAgICogQHBhcmFtIGluZGV4XG4gICAqL1xuICByZW1vdmVDb25maWcgPSAoaW5kZXg6IG51bWJlcik6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICB0aGlzLmZlZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogc2V0cyBFcmdvQm94IEVyZyB2YWx1ZVxuICAgKiBAcGFyYW0gbmFub0VyZ1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc2V0VmFsdWUgPSAobmFub0VyZzogYmlnaW50KTogTWluaW11bUZlZUJveEJ1aWxkZXIgPT4ge1xuICAgIHRoaXMuYm94VmFsdWUgPSBCb3hWYWx1ZS5mcm9tX2k2NChJNjQuZnJvbV9zdHIobmFub0VyZy50b1N0cmluZygpKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgRXJnb0JveCBjcmVhdGlvbmhlaWdodFxuICAgKiBAcGFyYW0gY3VycmVudEhlaWdodFxuICAgKi9cbiAgc2V0SGVpZ2h0ID0gKGN1cnJlbnRIZWlnaHQ6IG51bWJlcik6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICB0aGlzLmJveGhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgY29uZmlnIHRva2VuIGlkXG4gICAqIEBwYXJhbSB0b2tlbklkXG4gICAqL1xuICBzZXRUb2tlbiA9ICh0b2tlbklkOiBzdHJpbmcpOiBNaW5pbXVtRmVlQm94QnVpbGRlciA9PiB7XG4gICAgdGhpcy50b2tlbklkID0gdG9rZW5JZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHNvbWUgb2Ygc3BlY2lmaWVkIGNvbmZpZ3NcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuYm94VmFsdWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhgQm94IHZhbHVlIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKCF0aGlzLmJveGhlaWdodClcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnKGBCb3ggY3JlYXRpb24gaGVpZ2h0IGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKCF0aGlzLnRva2VuSWQpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhgQ29uZmlnIHRva2VuIGlkIGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKHRoaXMuZmVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhcbiAgICAgICAgYE5vIGNvbmZpZyBhZGRlZC4gUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgY29uZmlnYFxuICAgICAgKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mZWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgY2hhaW5zID0gT2JqZWN0LmtleXModGhpcy5mZWVzWzBdLmhlaWdodHMpO1xuICAgICAgY2hhaW5zLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mZWVzW2kgKyAxXS5oZWlnaHRzW2NoYWluXSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhcbiAgICAgICAgICAgIGBFeHBlY3RlZCBjaGFpbiBbJHtjaGFpbn1dIGF0IGluZGV4IFske2kgKyAxfV1gXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuZmVlc1tpICsgMV0uaGVpZ2h0c1tjaGFpbl0gPCB0aGlzLmZlZXNbaV0uaGVpZ2h0c1tjaGFpbl0pXG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWcoXG4gICAgICAgICAgICBgQWxsIGhlaWdodHMgZm9yIGEgY2hhaW4gc2hvdWxkIGJlIGFzY2VuZGluZy4gSGVpZ2h0cyBvZiBjaGFpbiBbJHtjaGFpbn1dIGF0IGluZGV4ZXMgWyR7aX0sJHtcbiAgICAgICAgICAgICAgaSArIDFcbiAgICAgICAgICAgIH1dIGFyZSBpbnZhbGlkIFske3RoaXMuZmVlc1tpICsgMV0uaGVpZ2h0c1tjaGFpbl19IDwgJHtcbiAgICAgICAgICAgICAgdGhpcy5mZWVzW2ldLmhlaWdodHNbY2hhaW5dXG4gICAgICAgICAgICB9XWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgc3BlY2lmaWVkIGNvbmZpZ3MgYW5kIGJ1aWxkcyBFcmdvQm94Q2FuZGlkYXRlIG9mIGNvbmZpZyBib3ggdXNpbmcgdGhlbVxuICAgKi9cbiAgYnVpbGQgPSAoKTogRXJnb0JveENhbmRpZGF0ZSA9PiB7XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuXG4gICAgLy8gYWRkIGJveCB2YWx1ZSwgYWRkcmVzcyBhbmQgY3JlYXRpb24gaGVpZ2h0XG4gICAgY29uc3QgYm94QnVpbGRlciA9IG5ldyBFcmdvQm94Q2FuZGlkYXRlQnVpbGRlcihcbiAgICAgIHRoaXMuYm94VmFsdWUsXG4gICAgICBDb250cmFjdC5uZXcoQWRkcmVzcy5mcm9tX2Jhc2U1OCh0aGlzLmFkZHJlc3MpLnRvX2VyZ29fdHJlZSgpKSxcbiAgICAgIHRoaXMuYm94aGVpZ2h0XG4gICAgKTtcblxuICAgIC8vIGFkZCBib3ggdG9rZW5zXG4gICAgYm94QnVpbGRlci5hZGRfdG9rZW4oXG4gICAgICBUb2tlbklkLmZyb21fc3RyKHRoaXMubWluaW11bUZlZU5GVCksXG4gICAgICBUb2tlbkFtb3VudC5mcm9tX2k2NChJNjQuZnJvbV9zdHIoJzEnKSlcbiAgICApO1xuICAgIGlmICh0aGlzLnRva2VuSWQgIT09IEVSR09fTkFUSVZFX1RPS0VOKVxuICAgICAgYm94QnVpbGRlci5hZGRfdG9rZW4oXG4gICAgICAgIFRva2VuSWQuZnJvbV9zdHIodGhpcy50b2tlbklkKSxcbiAgICAgICAgVG9rZW5BbW91bnQuZnJvbV9pNjQoSTY0LmZyb21fc3RyKCcxJykpXG4gICAgICApO1xuXG4gICAgLy8gZ2VuZXJhdGUgcmVnaXN0ZXIgdmFsdWVzXG4gICAgLy8gIGV4dHJhY3QgY2hhaW5zXG4gICAgY29uc3QgY2hhaW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdGhpcy5mZWVzLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgT2JqZWN0LmtleXMoZmVlLmhlaWdodHMpLmZvckVhY2goKGZlZUNoYWluKSA9PiB7XG4gICAgICAgIGlmICghY2hhaW5zLmluY2x1ZGVzKGZlZUNoYWluKSkgY2hhaW5zLnB1c2goZmVlQ2hhaW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2hhaW5zLnNvcnQoKTtcbiAgICAvLyAgZXh0cmFjdCBjb25maWdzXG4gICAgY29uc3QgaGVpZ2h0czogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICBjb25zdCBicmRpZ2VGZWVzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgIGNvbnN0IG5ldHdvcmtGZWVzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgIGNvbnN0IHJzblJhdGlvczogQXJyYXk8QXJyYXk8QXJyYXk8c3RyaW5nPj4+ID0gW107XG4gICAgY29uc3QgZmVlUmF0aW9zOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgIHRoaXMuZmVlcy5mb3JFYWNoKChmZWUpID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodHNDb25maWdzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBjb25zdCBicmRpZ2VGZWVzQ29uZmlnczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgY29uc3QgbmV0d29ya0ZlZXNDb25maWdzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICBjb25zdCByc25SYXRpb3NDb25maWdzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgICAgY29uc3QgZmVlUmF0aW9zQ29uZmlnczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgICBjaGFpbnMuZm9yRWFjaCgoY2hhaW4pID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmVlLmhlaWdodHMsIGNoYWluKSlcbiAgICAgICAgICBoZWlnaHRzQ29uZmlncy5wdXNoKGZlZS5oZWlnaHRzW2NoYWluXSk7XG4gICAgICAgIGVsc2UgaGVpZ2h0c0NvbmZpZ3MucHVzaCgtMSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmVlLmNvbmZpZ3MsIGNoYWluKSkge1xuICAgICAgICAgIGJyZGlnZUZlZXNDb25maWdzLnB1c2goZmVlLmNvbmZpZ3NbY2hhaW5dLmJyaWRnZUZlZS50b1N0cmluZygpKTtcbiAgICAgICAgICBuZXR3b3JrRmVlc0NvbmZpZ3MucHVzaChmZWUuY29uZmlnc1tjaGFpbl0ubmV0d29ya0ZlZS50b1N0cmluZygpKTtcbiAgICAgICAgICByc25SYXRpb3NDb25maWdzLnB1c2goW1xuICAgICAgICAgICAgZmVlLmNvbmZpZ3NbY2hhaW5dLnJzblJhdGlvLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBmZWUuY29uZmlnc1tjaGFpbl0ucnNuUmF0aW9EaXZpc29yLnRvU3RyaW5nKCksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgZmVlUmF0aW9zQ29uZmlncy5wdXNoKGZlZS5jb25maWdzW2NoYWluXS5mZWVSYXRpby50b1N0cmluZygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmRpZ2VGZWVzQ29uZmlncy5wdXNoKCctMScpO1xuICAgICAgICAgIG5ldHdvcmtGZWVzQ29uZmlncy5wdXNoKCctMScpO1xuICAgICAgICAgIHJzblJhdGlvc0NvbmZpZ3MucHVzaChbJy0xJywgJy0xJ10pO1xuICAgICAgICAgIGZlZVJhdGlvc0NvbmZpZ3MucHVzaCgnLTEnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGhlaWdodHMucHVzaChoZWlnaHRzQ29uZmlncyk7XG4gICAgICBicmRpZ2VGZWVzLnB1c2goYnJkaWdlRmVlc0NvbmZpZ3MpO1xuICAgICAgbmV0d29ya0ZlZXMucHVzaChuZXR3b3JrRmVlc0NvbmZpZ3MpO1xuICAgICAgcnNuUmF0aW9zLnB1c2gocnNuUmF0aW9zQ29uZmlncyk7XG4gICAgICBmZWVSYXRpb3MucHVzaChmZWVSYXRpb3NDb25maWdzKTtcbiAgICB9KTtcblxuICAgIC8vIGFkZCBib3ggcmVnaXN0ZXJzXG4gICAgYm94QnVpbGRlci5zZXRfcmVnaXN0ZXJfdmFsdWUoXG4gICAgICA0LFxuICAgICAgQ29uc3RhbnQuZnJvbV9jb2xsX2NvbGxfYnl0ZShjaGFpbnMubWFwKChjaGFpbikgPT4gQnVmZmVyLmZyb20oY2hhaW4pKSlcbiAgICApO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDUsIENvbnN0YW50LmZyb21fanMoaGVpZ2h0cykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDYsIENvbnN0YW50LmZyb21fanMoYnJkaWdlRmVlcykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDcsIENvbnN0YW50LmZyb21fanMobmV0d29ya0ZlZXMpKTtcbiAgICBib3hCdWlsZGVyLnNldF9yZWdpc3Rlcl92YWx1ZSg4LCBDb25zdGFudC5mcm9tX2pzKHJzblJhdGlvcykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDksIENvbnN0YW50LmZyb21fanMoZmVlUmF0aW9zKSk7XG5cbiAgICByZXR1cm4gYm94QnVpbGRlci5idWlsZCgpO1xuICB9O1xufVxuIl19
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bUZlZUJveEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvTWluaW11bUZlZUJveEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLEdBRVQsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3JCLElBQUksQ0FBYTtJQUNqQixRQUFRLENBQVc7SUFDbkIsU0FBUyxDQUFTO0lBQ2xCLE9BQU8sQ0FBUztJQUNoQixhQUFhLENBQVM7SUFDdEIsT0FBTyxDQUFTO0lBRTFCLFlBQVksYUFBcUIsRUFBRSxPQUFlO1FBQ2hELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsR0FBRyxDQUFDLFNBQTJCLEVBQXdCLEVBQUU7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQXdCLEVBQUU7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUY7Ozs7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Q2hFLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWRkcmVzcyxcbiAgQm94VmFsdWUsXG4gIENvbnRyYWN0LFxuICBFcmdvQm94Q2FuZGlkYXRlQnVpbGRlcixcbiAgSTY0LFxuICBUb2tlbkFtb3VudCxcbiAgVG9rZW5JZCxcbiAgQ29uc3RhbnQsXG4gIEVyZ29Cb3hDYW5kaWRhdGUsXG59IGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCB7IE1pbmltdW1GZWVDb25maWcgfSBmcm9tICcuL01pbmltdW1GZWVDb25maWcnO1xuaW1wb3J0IHsgRmVlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBJbnZhbGlkQ29uZmlnIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgRVJHT19OQVRJVkVfVE9LRU4gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBNaW5pbXVtRmVlQm94QnVpbGRlciB7XG4gIHByb3RlY3RlZCBmZWVzOiBBcnJheTxGZWU+O1xuICBwcm90ZWN0ZWQgYm94VmFsdWU6IEJveFZhbHVlO1xuICBwcm90ZWN0ZWQgYm94SGVpZ2h0OiBudW1iZXI7XG4gIHByb3RlY3RlZCB0b2tlbklkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtaW5pbXVtRmVlTkZUOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWluaW11bUZlZU5GVDogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZlZXMgPSBbXTtcbiAgICB0aGlzLm1pbmltdW1GZWVORlQgPSBtaW5pbXVtRmVlTkZUO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogYWRkcyBhIGZlZUNvbmZpZ1xuICAgKiBAcGFyYW0gZmVlQ29uZmlnXG4gICAqL1xuICBhZGRDb25maWcgPSAoZmVlQ29uZmlnOiBNaW5pbXVtRmVlQ29uZmlnKTogTWluaW11bUZlZUJveEJ1aWxkZXIgPT4ge1xuICAgIHRoaXMuZmVlcy5wdXNoKGZlZUNvbmZpZy5nZXRDb25maWcoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZXMgYSBjb25maWcgYnkgaW5kZXhcbiAgICogQHBhcmFtIGluZGV4XG4gICAqL1xuICByZW1vdmVDb25maWcgPSAoaW5kZXg6IG51bWJlcik6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICB0aGlzLmZlZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogc2V0cyBFcmdvQm94IEVyZyB2YWx1ZVxuICAgKiBAcGFyYW0gbmFub0VyZ1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc2V0VmFsdWUgPSAobmFub0VyZzogYmlnaW50KTogTWluaW11bUZlZUJveEJ1aWxkZXIgPT4ge1xuICAgIHRoaXMuYm94VmFsdWUgPSBCb3hWYWx1ZS5mcm9tX2k2NChJNjQuZnJvbV9zdHIobmFub0VyZy50b1N0cmluZygpKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgRXJnb0JveCBjcmVhdGlvbmhlaWdodFxuICAgKiBAcGFyYW0gY3VycmVudEhlaWdodFxuICAgKi9cbiAgc2V0SGVpZ2h0ID0gKGN1cnJlbnRIZWlnaHQ6IG51bWJlcik6IE1pbmltdW1GZWVCb3hCdWlsZGVyID0+IHtcbiAgICB0aGlzLmJveEhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgY29uZmlnIHRva2VuIGlkXG4gICAqIEBwYXJhbSB0b2tlbklkXG4gICAqL1xuICBzZXRUb2tlbiA9ICh0b2tlbklkOiBzdHJpbmcpOiBNaW5pbXVtRmVlQm94QnVpbGRlciA9PiB7XG4gICAgdGhpcy50b2tlbklkID0gdG9rZW5JZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHNvbWUgb2Ygc3BlY2lmaWVkIGNvbmZpZ3NcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuYm94VmFsdWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhgQm94IHZhbHVlIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKCF0aGlzLmJveEhlaWdodClcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnKGBCb3ggY3JlYXRpb24gaGVpZ2h0IGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKCF0aGlzLnRva2VuSWQpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhgQ29uZmlnIHRva2VuIGlkIGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgaWYgKHRoaXMuZmVlcy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhcbiAgICAgICAgYE5vIGNvbmZpZyBhZGRlZC4gUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgY29uZmlnYFxuICAgICAgKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mZWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgY2hhaW5zID0gT2JqZWN0LmtleXModGhpcy5mZWVzWzBdLmhlaWdodHMpO1xuICAgICAgY2hhaW5zLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mZWVzW2kgKyAxXS5oZWlnaHRzW2NoYWluXSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZyhcbiAgICAgICAgICAgIGBFeHBlY3RlZCBjaGFpbiBbJHtjaGFpbn1dIGF0IGluZGV4IFske2kgKyAxfV1gXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuZmVlc1tpICsgMV0uaGVpZ2h0c1tjaGFpbl0gPCB0aGlzLmZlZXNbaV0uaGVpZ2h0c1tjaGFpbl0pXG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWcoXG4gICAgICAgICAgICBgQWxsIGhlaWdodHMgZm9yIGEgY2hhaW4gc2hvdWxkIGJlIGFzY2VuZGluZy4gSGVpZ2h0cyBvZiBjaGFpbiBbJHtjaGFpbn1dIGF0IGluZGV4ZXMgWyR7aX0sJHtcbiAgICAgICAgICAgICAgaSArIDFcbiAgICAgICAgICAgIH1dIGFyZSBpbnZhbGlkIFske3RoaXMuZmVlc1tpICsgMV0uaGVpZ2h0c1tjaGFpbl19IDwgJHtcbiAgICAgICAgICAgICAgdGhpcy5mZWVzW2ldLmhlaWdodHNbY2hhaW5dXG4gICAgICAgICAgICB9XWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgc3BlY2lmaWVkIGNvbmZpZ3MgYW5kIGJ1aWxkcyBFcmdvQm94Q2FuZGlkYXRlIG9mIGNvbmZpZyBib3ggdXNpbmcgdGhlbVxuICAgKi9cbiAgYnVpbGQgPSAoKTogRXJnb0JveENhbmRpZGF0ZSA9PiB7XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuXG4gICAgLy8gYWRkIGJveCB2YWx1ZSwgYWRkcmVzcyBhbmQgY3JlYXRpb24gaGVpZ2h0XG4gICAgY29uc3QgYm94QnVpbGRlciA9IG5ldyBFcmdvQm94Q2FuZGlkYXRlQnVpbGRlcihcbiAgICAgIHRoaXMuYm94VmFsdWUsXG4gICAgICBDb250cmFjdC5uZXcoQWRkcmVzcy5mcm9tX2Jhc2U1OCh0aGlzLmFkZHJlc3MpLnRvX2VyZ29fdHJlZSgpKSxcbiAgICAgIHRoaXMuYm94SGVpZ2h0XG4gICAgKTtcblxuICAgIC8vIGFkZCBib3ggdG9rZW5zXG4gICAgYm94QnVpbGRlci5hZGRfdG9rZW4oXG4gICAgICBUb2tlbklkLmZyb21fc3RyKHRoaXMubWluaW11bUZlZU5GVCksXG4gICAgICBUb2tlbkFtb3VudC5mcm9tX2k2NChJNjQuZnJvbV9zdHIoJzEnKSlcbiAgICApO1xuICAgIGlmICh0aGlzLnRva2VuSWQgIT09IEVSR09fTkFUSVZFX1RPS0VOKVxuICAgICAgYm94QnVpbGRlci5hZGRfdG9rZW4oXG4gICAgICAgIFRva2VuSWQuZnJvbV9zdHIodGhpcy50b2tlbklkKSxcbiAgICAgICAgVG9rZW5BbW91bnQuZnJvbV9pNjQoSTY0LmZyb21fc3RyKCcxJykpXG4gICAgICApO1xuXG4gICAgLy8gZ2VuZXJhdGUgcmVnaXN0ZXIgdmFsdWVzXG4gICAgLy8gIGV4dHJhY3QgY2hhaW5zXG4gICAgY29uc3QgY2hhaW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdGhpcy5mZWVzLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgT2JqZWN0LmtleXMoZmVlLmhlaWdodHMpLmZvckVhY2goKGZlZUNoYWluKSA9PiB7XG4gICAgICAgIGlmICghY2hhaW5zLmluY2x1ZGVzKGZlZUNoYWluKSkgY2hhaW5zLnB1c2goZmVlQ2hhaW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY2hhaW5zLnNvcnQoKTtcbiAgICAvLyAgZXh0cmFjdCBjb25maWdzXG4gICAgY29uc3QgaGVpZ2h0czogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgICBjb25zdCBicmlkZ2VGZWVzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgIGNvbnN0IG5ldHdvcmtGZWVzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgIGNvbnN0IHJzblJhdGlvczogQXJyYXk8QXJyYXk8QXJyYXk8c3RyaW5nPj4+ID0gW107XG4gICAgY29uc3QgZmVlUmF0aW9zOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgIHRoaXMuZmVlcy5mb3JFYWNoKChmZWUpID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodHNDb25maWdzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBjb25zdCBicmlkZ2VGZWVzQ29uZmlnczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgY29uc3QgbmV0d29ya0ZlZXNDb25maWdzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICBjb25zdCByc25SYXRpb3NDb25maWdzOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IFtdO1xuICAgICAgY29uc3QgZmVlUmF0aW9zQ29uZmlnczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgICBjaGFpbnMuZm9yRWFjaCgoY2hhaW4pID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmVlLmhlaWdodHMsIGNoYWluKSlcbiAgICAgICAgICBoZWlnaHRzQ29uZmlncy5wdXNoKGZlZS5oZWlnaHRzW2NoYWluXSk7XG4gICAgICAgIGVsc2UgaGVpZ2h0c0NvbmZpZ3MucHVzaCgtMSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZmVlLmNvbmZpZ3MsIGNoYWluKSkge1xuICAgICAgICAgIGJyaWRnZUZlZXNDb25maWdzLnB1c2goZmVlLmNvbmZpZ3NbY2hhaW5dLmJyaWRnZUZlZS50b1N0cmluZygpKTtcbiAgICAgICAgICBuZXR3b3JrRmVlc0NvbmZpZ3MucHVzaChmZWUuY29uZmlnc1tjaGFpbl0ubmV0d29ya0ZlZS50b1N0cmluZygpKTtcbiAgICAgICAgICByc25SYXRpb3NDb25maWdzLnB1c2goW1xuICAgICAgICAgICAgZmVlLmNvbmZpZ3NbY2hhaW5dLnJzblJhdGlvLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBmZWUuY29uZmlnc1tjaGFpbl0ucnNuUmF0aW9EaXZpc29yLnRvU3RyaW5nKCksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgZmVlUmF0aW9zQ29uZmlncy5wdXNoKGZlZS5jb25maWdzW2NoYWluXS5mZWVSYXRpby50b1N0cmluZygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmlkZ2VGZWVzQ29uZmlncy5wdXNoKCctMScpO1xuICAgICAgICAgIG5ldHdvcmtGZWVzQ29uZmlncy5wdXNoKCctMScpO1xuICAgICAgICAgIHJzblJhdGlvc0NvbmZpZ3MucHVzaChbJy0xJywgJy0xJ10pO1xuICAgICAgICAgIGZlZVJhdGlvc0NvbmZpZ3MucHVzaCgnLTEnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGhlaWdodHMucHVzaChoZWlnaHRzQ29uZmlncyk7XG4gICAgICBicmlkZ2VGZWVzLnB1c2goYnJpZGdlRmVlc0NvbmZpZ3MpO1xuICAgICAgbmV0d29ya0ZlZXMucHVzaChuZXR3b3JrRmVlc0NvbmZpZ3MpO1xuICAgICAgcnNuUmF0aW9zLnB1c2gocnNuUmF0aW9zQ29uZmlncyk7XG4gICAgICBmZWVSYXRpb3MucHVzaChmZWVSYXRpb3NDb25maWdzKTtcbiAgICB9KTtcblxuICAgIC8vIGFkZCBib3ggcmVnaXN0ZXJzXG4gICAgYm94QnVpbGRlci5zZXRfcmVnaXN0ZXJfdmFsdWUoXG4gICAgICA0LFxuICAgICAgQ29uc3RhbnQuZnJvbV9jb2xsX2NvbGxfYnl0ZShjaGFpbnMubWFwKChjaGFpbikgPT4gQnVmZmVyLmZyb20oY2hhaW4pKSlcbiAgICApO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDUsIENvbnN0YW50LmZyb21fanMoaGVpZ2h0cykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDYsIENvbnN0YW50LmZyb21fanMoYnJpZGdlRmVlcykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDcsIENvbnN0YW50LmZyb21fanMobmV0d29ya0ZlZXMpKTtcbiAgICBib3hCdWlsZGVyLnNldF9yZWdpc3Rlcl92YWx1ZSg4LCBDb25zdGFudC5mcm9tX2pzKHJzblJhdGlvcykpO1xuICAgIGJveEJ1aWxkZXIuc2V0X3JlZ2lzdGVyX3ZhbHVlKDksIENvbnN0YW50LmZyb21fanMoZmVlUmF0aW9zKSk7XG5cbiAgICByZXR1cm4gYm94QnVpbGRlci5idWlsZCgpO1xuICB9O1xufVxuIl19