@rosen-bridge/abstract-extractor 2.1.1 → 2.1.2

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 (40) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/ergo/{AbstractErgoExtractor.d.ts → abstractErgoExtractor.d.ts} +3 -3
  3. package/dist/ergo/abstractErgoExtractor.d.ts.map +1 -0
  4. package/dist/ergo/{AbstractErgoExtractor.js → abstractErgoExtractor.js} +3 -3
  5. package/dist/ergo/{AbstractErgoExtractorAction.d.ts → abstractErgoExtractorAction.d.ts} +6 -4
  6. package/dist/ergo/abstractErgoExtractorAction.d.ts.map +1 -0
  7. package/dist/ergo/abstractErgoExtractorAction.js +219 -0
  8. package/dist/ergo/{AbstractErgoExtractorEntity.d.ts → abstractErgoExtractorEntity.d.ts} +1 -1
  9. package/dist/ergo/{AbstractErgoExtractorEntity.d.ts.map → abstractErgoExtractorEntity.d.ts.map} +1 -1
  10. package/dist/ergo/{AbstractErgoExtractorEntity.js → abstractErgoExtractorEntity.js} +1 -1
  11. package/dist/ergo/index.d.ts +6 -6
  12. package/dist/ergo/index.js +7 -7
  13. package/dist/ergo/initializable/{AbstractInitializable.d.ts → abstractInitializable.d.ts} +4 -4
  14. package/dist/ergo/initializable/{AbstractInitializable.d.ts.map → abstractInitializable.d.ts.map} +1 -1
  15. package/dist/ergo/initializable/abstractInitializable.js +162 -0
  16. package/dist/ergo/initializable/{AbstractInitializableAction.d.ts → abstractInitializableAction.d.ts} +4 -4
  17. package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +1 -0
  18. package/dist/ergo/initializable/{AbstractInitializableAction.js → abstractInitializableAction.js} +2 -2
  19. package/dist/ergo/initializable/index.d.ts +2 -2
  20. package/dist/ergo/initializable/index.js +3 -3
  21. package/dist/ergo/network/{AbstractNetwork.d.ts → abstractNetwork.d.ts} +1 -1
  22. package/dist/ergo/network/{AbstractNetwork.d.ts.map → abstractNetwork.d.ts.map} +1 -1
  23. package/dist/ergo/network/{AbstractNetwork.js → abstractNetwork.js} +1 -1
  24. package/dist/ergo/network/{ExplorerNetwork.d.ts → explorerNetwork.d.ts} +2 -2
  25. package/dist/ergo/network/explorerNetwork.d.ts.map +1 -0
  26. package/dist/ergo/network/{ExplorerNetwork.js → explorerNetwork.js} +3 -3
  27. package/dist/ergo/network/{NodeNetwork.d.ts → nodeNetwork.d.ts} +2 -2
  28. package/dist/ergo/network/nodeNetwork.d.ts.map +1 -0
  29. package/dist/ergo/network/nodeNetwork.js +131 -0
  30. package/dist/ergo/utils.d.ts.map +1 -1
  31. package/dist/ergo/utils.js +1 -1
  32. package/package.json +16 -15
  33. package/dist/ergo/AbstractErgoExtractor.d.ts.map +0 -1
  34. package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
  35. package/dist/ergo/AbstractErgoExtractorAction.js +0 -222
  36. package/dist/ergo/initializable/AbstractInitializable.js +0 -163
  37. package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
  38. package/dist/ergo/network/ExplorerNetwork.d.ts.map +0 -1
  39. package/dist/ergo/network/NodeNetwork.d.ts.map +0 -1
  40. package/dist/ergo/network/NodeNetwork.js +0 -131
@@ -1,131 +0,0 @@
1
- import ergoNodeClientFactory from '@rosen-clients/ergo-node';
2
- import { AbstractNetwork } from './AbstractNetwork';
3
- export class NodeNetwork extends AbstractNetwork {
4
- api;
5
- constructor(url) {
6
- super();
7
- this.api = ergoNodeClientFactory(url);
8
- }
9
- /**
10
- * convert node api boxes to ErgoBox interface
11
- * @param box
12
- * @returns ErgoBox
13
- */
14
- convertBox = async (box) => {
15
- const tx = await await this.api.getTxById(box.transactionId);
16
- const spendInfo = box.spentTransactionId
17
- ? await this.getSpendingInfo(box.boxId, box.spentTransactionId)
18
- : undefined;
19
- return {
20
- transactionId: box.transactionId || '',
21
- index: box.index || 0,
22
- value: box.value || 0n,
23
- ergoTree: box.ergoTree || '',
24
- creationHeight: box.creationHeight || 0,
25
- inclusionHeight: tx.inclusionHeight,
26
- assets: box.assets || [],
27
- additionalRegisters: box.additionalRegisters,
28
- boxId: box.boxId || '',
29
- blockId: tx.blockId,
30
- spentBlockId: spendInfo?.hash,
31
- spentHeight: spendInfo?.height,
32
- spentTransactionId: box.spentTransactionId,
33
- spentIndex: spendInfo?.spendIndex,
34
- };
35
- };
36
- /**
37
- * convert Node transaction to extractor transaction type
38
- * @param tx
39
- */
40
- convertTransaction = (tx) => {
41
- return {
42
- id: tx.id || '',
43
- inclusionHeight: tx.inclusionHeight,
44
- blockId: tx.blockId,
45
- outputs: tx.outputs.map((output) => ({
46
- transactionId: output.transactionId || '',
47
- index: output.index || 0,
48
- value: output.value || 0n,
49
- ergoTree: output.ergoTree || '',
50
- creationHeight: output.creationHeight || 0,
51
- assets: output.assets || [],
52
- additionalRegisters: output.additionalRegisters,
53
- boxId: output.boxId || '',
54
- })),
55
- // TODO: Add input extension local/ergo/rosen-bridge/scanner/-/issues/156
56
- inputs: tx.inputs.map((input) => ({ boxId: input.boxId })) ?? [],
57
- dataInputs: tx.dataInputs,
58
- };
59
- };
60
- /**
61
- * return spending information of a specified box by having spendTxId
62
- * @param boxId
63
- * @param spendTxId
64
- */
65
- getSpendingInfo = async (boxId, spendTxId) => {
66
- const tx = await this.api.getTxById(spendTxId);
67
- const spendIndex = tx.inputs?.findIndex((box) => box.boxId == boxId);
68
- if (spendIndex == undefined)
69
- throw Error(`Impossible behavior, the box [${boxId}] should have been spent in tx [${spendTxId}]`);
70
- return {
71
- hash: tx.blockId,
72
- height: tx.inclusionHeight,
73
- spendIndex,
74
- };
75
- };
76
- /**
77
- * use node api to return related boxes by specified address
78
- * @param address
79
- * @param offset
80
- * @param limit
81
- * @returns related boxes
82
- */
83
- getBoxesByAddress = async (address, offset, limit) => {
84
- const boxes = await this.api.getBoxesByAddressUnspent(address, {
85
- offset: offset,
86
- limit: limit,
87
- sortDirection: 'desc',
88
- });
89
- if (!boxes)
90
- throw new Error('Ergo node BoxesByAddress api expected to have items');
91
- const ergoBoxes = await Promise.all(boxes.map(async (box) => await this.convertBox(box)));
92
- return { boxes: ergoBoxes, hasNextBatch: boxes.length > 0 };
93
- };
94
- /**
95
- * use node api to return related boxes by specified token id
96
- * @param tokenId
97
- * @param offset
98
- * @param limit
99
- * @returns related boxes
100
- */
101
- getBoxesByTokenId = async (tokenId, offset, limit) => {
102
- const boxes = await this.api.getBoxesByTokenId(tokenId, {
103
- offset: offset,
104
- limit: limit,
105
- });
106
- if (!boxes.items)
107
- throw new Error('Ergo node BoxesByTokenId api expected to have items');
108
- const ergoBoxes = await Promise.all(boxes.items.map(async (box) => await this.convertBox(box)));
109
- return { boxes: ergoBoxes, hasNextBatch: boxes.items.length > 0 };
110
- };
111
- /**
112
- * use node api to return related transactions of the specified address with limit offset
113
- * @param tokenId
114
- * @param offset
115
- * @param limit
116
- * @returns related transactions
117
- */
118
- getAddressTransactionsWithOffsetLimit = async (address, offset, limit) => {
119
- const txs = await this.api.getTxsByAddress(address, {
120
- offset,
121
- limit,
122
- });
123
- if (!txs.items)
124
- throw new Error('Explorer AddressTransactions api expected to have items');
125
- return {
126
- items: txs.items.map((tx) => this.convertTransaction(tx)),
127
- total: txs.total,
128
- };
129
- };
130
- }
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZU5ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9uZXR3b3JrL05vZGVOZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8scUJBR04sTUFBTSwwQkFBMEIsQ0FBQztBQUlsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLFdBQVksU0FBUSxlQUFlO0lBQ3RDLEdBQUcsQ0FBQztJQUVaLFlBQVksR0FBVztRQUNyQixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxVQUFVLEdBQUcsS0FBSyxFQUFFLEdBQW1CLEVBQW9CLEVBQUU7UUFDbkUsTUFBTSxFQUFFLEdBQUcsTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFjLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsa0JBQWtCO1lBQ3RDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQU0sRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUM7WUFDaEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE9BQU87WUFDTCxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFO1lBQ3RDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUM7WUFDckIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN0QixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQzVCLGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYyxJQUFJLENBQUM7WUFDdkMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxlQUFlO1lBQ25DLE1BQU0sRUFB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QUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsRCxNQUFNO1lBQ04sS0FBSztTQUNOLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELENBQzFELENBQUM7UUFDSixPQUFPO1lBQ0wsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFNO1NBQ2xCLENBQUM7SUFDSixDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcmdvTm9kZUNsaWVudEZhY3RvcnksIHtcbiAgSW5kZXhlZEVyZ29Cb3gsXG4gIEluZGV4ZWRFcmdvVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tbm9kZSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEVyZ29Cb3gsIEV4dGVuZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFic3RyYWN0TmV0d29yayB9IGZyb20gJy4vQWJzdHJhY3ROZXR3b3JrJztcblxuZXhwb3J0IGNsYXNzIE5vZGVOZXR3b3JrIGV4dGVuZHMgQWJzdHJhY3ROZXR3b3JrIHtcbiAgcHJpdmF0ZSBhcGk7XG5cbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBpID0gZXJnb05vZGVDbGllbnRGYWN0b3J5KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogY29udmVydCBub2RlIGFwaSBib3hlcyB0byBFcmdvQm94IGludGVyZmFjZVxuICAgKiBAcGFyYW0gYm94XG4gICAqIEByZXR1cm5zIEVyZ29Cb3hcbiAgICovXG4gIHByaXZhdGUgY29udmVydEJveCA9IGFzeW5jIChib3g6IEluZGV4ZWRFcmdvQm94KTogUHJvbWlzZTxFcmdvQm94PiA9PiB7XG4gICAgY29uc3QgdHggPSBhd2FpdCBhd2FpdCB0aGlzLmFwaS5nZXRUeEJ5SWQoYm94LnRyYW5zYWN0aW9uSWQhKTtcbiAgICBjb25zdCBzcGVuZEluZm8gPSBib3guc3BlbnRUcmFuc2FjdGlvbklkXG4gICAgICA/IGF3YWl0IHRoaXMuZ2V0U3BlbmRpbmdJbmZvKGJveC5ib3hJZCEsIGJveC5zcGVudFRyYW5zYWN0aW9uSWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25JZDogYm94LnRyYW5zYWN0aW9uSWQgfHwgJycsXG4gICAgICBpbmRleDogYm94LmluZGV4IHx8IDAsXG4gICAgICB2YWx1ZTogYm94LnZhbHVlIHx8IDBuLFxuICAgICAgZXJnb1RyZWU6IGJveC5lcmdvVHJlZSB8fCAnJyxcbiAgICAgIGNyZWF0aW9uSGVpZ2h0OiBib3guY3JlYXRpb25IZWlnaHQgfHwgMCxcbiAgICAgIGluY2x1c2lvbkhlaWdodDogdHguaW5jbHVzaW9uSGVpZ2h0LFxuICAgICAgYXNzZXRzOiBib3guYXNzZXRzIHx8IFtdLFxuICAgICAgYWRkaXRpb25hbFJlZ2lzdGVyczogYm94LmFkZGl0aW9uYWxSZWdpc3RlcnMsXG4gICAgICBib3hJZDogYm94LmJveElkIHx8ICcnLFxuICAgICAgYmxvY2tJZDogdHguYmxvY2tJZCxcbiAgICAgIHNwZW50QmxvY2tJZDogc3BlbmRJbmZvPy5oYXNoLFxuICAgICAgc3BlbnRIZWlnaHQ6IHNwZW5kSW5mbz8uaGVpZ2h0LFxuICAgICAgc3BlbnRUcmFuc2FjdGlvbklkOiBib3guc3BlbnRUcmFuc2FjdGlvbklkLFxuICAgICAgc3BlbnRJbmRleDogc3BlbmRJbmZvPy5zcGVuZEluZGV4LFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgTm9kZSB0cmFuc2FjdGlvbiB0byBleHRyYWN0b3IgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0gdHhcbiAgICovXG4gIHByaXZhdGUgY29udmVydFRyYW5zYWN0aW9uID0gKFxuICAgIHR4OiBJbmRleGVkRXJnb1RyYW5zYWN0aW9uLFxuICApOiBFeHRlbmRlZFRyYW5zYWN0aW9uID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHR4LmlkIHx8ICcnLFxuICAgICAgaW5jbHVzaW9uSGVpZ2h0OiB0eC5pbmNsdXNpb25IZWlnaHQsXG4gICAgICBibG9ja0lkOiB0eC5ibG9ja0lkLFxuICAgICAgb3V0cHV0czogdHgub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogb3V0cHV0LnRyYW5zYWN0aW9uSWQgfHwgJycsXG4gICAgICAgIGluZGV4OiBvdXRwdXQuaW5kZXggfHwgMCxcbiAgICAgICAgdmFsdWU6IG91dHB1dC52YWx1ZSB8fCAwbixcbiAgICAgICAgZXJnb1RyZWU6IG91dHB1dC5lcmdvVHJlZSB8fCAnJyxcbiAgICAgICAgY3JlYXRpb25IZWlnaHQ6IG91dHB1dC5jcmVhdGlvbkhlaWdodCB8fCAwLFxuICAgICAgICBhc3NldHM6IG91dHB1dC5hc3NldHMgfHwgW10sXG4gICAgICAgIGFkZGl0aW9uYWxSZWdpc3RlcnM6IG91dHB1dC5hZGRpdGlvbmFsUmVnaXN0ZXJzLFxuICAgICAgICBib3hJZDogb3V0cHV0LmJveElkIHx8ICcnLFxuICAgICAgfSkpLFxuICAgICAgLy8gVE9ETzogQWRkIGlucHV0IGV4dGVuc2lvbiBsb2NhbC9lcmdvL3Jvc2VuLWJyaWRnZS9zY2FubmVyLy0vaXNzdWVzLzE1NlxuICAgICAgaW5wdXRzOiB0eC5pbnB1dHMubWFwKChpbnB1dCkgPT4gKHsgYm94SWQ6IGlucHV0LmJveElkISB9KSkgPz8gW10sXG4gICAgICBkYXRhSW5wdXRzOiB0eC5kYXRhSW5wdXRzLFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybiBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiBhIHNwZWNpZmllZCBib3ggYnkgaGF2aW5nIHNwZW5kVHhJZFxuICAgKiBAcGFyYW0gYm94SWRcbiAgICogQHBhcmFtIHNwZW5kVHhJZFxuICAgKi9cbiAgZ2V0U3BlbmRpbmdJbmZvID0gYXN5bmMgKFxuICAgIGJveElkOiBzdHJpbmcsXG4gICAgc3BlbmRUeElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8QmxvY2tJbmZvICYgeyBzcGVuZEluZGV4OiBudW1iZXIgfT4gPT4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5hcGkuZ2V0VHhCeUlkKHNwZW5kVHhJZCk7XG4gICAgY29uc3Qgc3BlbmRJbmRleCA9IHR4LmlucHV0cz8uZmluZEluZGV4KChib3gpID0+IGJveC5ib3hJZCA9PSBib3hJZCk7XG4gICAgaWYgKHNwZW5kSW5kZXggPT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbXBvc3NpYmxlIGJlaGF2aW9yLCB0aGUgYm94IFske2JveElkfV0gc2hvdWxkIGhhdmUgYmVlbiBzcGVudCBpbiB0eCBbJHtzcGVuZFR4SWR9XWAsXG4gICAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNoOiB0eC5ibG9ja0lkLFxuICAgICAgaGVpZ2h0OiB0eC5pbmNsdXNpb25IZWlnaHQsXG4gICAgICBzcGVuZEluZGV4LFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHVzZSBub2RlIGFwaSB0byByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgYWRkcmVzc1xuICAgKiBAcGFyYW0gYWRkcmVzc1xuICAgKiBAcGFyYW0gb2Zmc2V0XG4gICAqIEBwYXJhbSBsaW1pdFxuICAgKiBAcmV0dXJucyByZWxhdGVkIGJveGVzXG4gICAqL1xuICBnZXRCb3hlc0J5QWRkcmVzcyA9IGFzeW5jIChcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGJveGVzOiBFcmdvQm94W107IGhhc05leHRCYXRjaDogYm9vbGVhbiB9PiA9PiB7XG4gICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmFwaS5nZXRCb3hlc0J5QWRkcmVzc1Vuc3BlbnQoYWRkcmVzcywge1xuICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICBzb3J0RGlyZWN0aW9uOiAnZGVzYycsXG4gICAgfSk7XG4gICAgaWYgKCFib3hlcylcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJnbyBub2RlIEJveGVzQnlBZGRyZXNzIGFwaSBleHBlY3RlZCB0byBoYXZlIGl0ZW1zJyk7XG4gICAgY29uc3QgZXJnb0JveGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBib3hlcy5tYXAoYXN5bmMgKGJveCkgPT4gYXdhaXQgdGhpcy5jb252ZXJ0Qm94KGJveCkpLFxuICAgICk7XG4gICAgcmV0dXJuIHsgYm94ZXM6IGVyZ29Cb3hlcywgaGFzTmV4dEJhdGNoOiBib3hlcy5sZW5ndGggPiAwIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHVzZSBub2RlIGFwaSB0byByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgdG9rZW4gaWRcbiAgICogQHBhcmFtIHRva2VuSWRcbiAgICogQHBhcmFtIG9mZnNldFxuICAgKiBAcGFyYW0gbGltaXRcbiAgICogQHJldHVybnMgcmVsYXRlZCBib3hlc1xuICAgKi9cbiAgZ2V0Qm94ZXNCeVRva2VuSWQgPSBhc3luYyAoXG4gICAgdG9rZW5JZDogc3RyaW5nLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBib3hlczogRXJnb0JveFtdOyBoYXNOZXh0QmF0Y2g6IGJvb2xlYW4gfT4gPT4ge1xuICAgIGNvbnN0IGJveGVzID0gYXdhaXQgdGhpcy5hcGkuZ2V0Qm94ZXNCeVRva2VuSWQodG9rZW5JZCwge1xuICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgfSk7XG4gICAgaWYgKCFib3hlcy5pdGVtcylcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJnbyBub2RlIEJveGVzQnlUb2tlbklkIGFwaSBleHBlY3RlZCB0byBoYXZlIGl0ZW1zJyk7XG4gICAgY29uc3QgZXJnb0JveGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBib3hlcy5pdGVtcy5tYXAoYXN5bmMgKGJveCkgPT4gYXdhaXQgdGhpcy5jb252ZXJ0Qm94KGJveCkpLFxuICAgICk7XG4gICAgcmV0dXJuIHsgYm94ZXM6IGVyZ29Cb3hlcywgaGFzTmV4dEJhdGNoOiBib3hlcy5pdGVtcy5sZW5ndGggPiAwIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHVzZSBub2RlIGFwaSB0byByZXR1cm4gcmVsYXRlZCB0cmFuc2FjdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGggbGltaXQgb2Zmc2V0XG4gICAqIEBwYXJhbSB0b2tlbklkXG4gICAqIEBwYXJhbSBvZmZzZXRcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqIEByZXR1cm5zIHJlbGF0ZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0ID0gYXN5bmMgKFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBsaW1pdDogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgaXRlbXM6IEFycmF5PEV4dGVuZGVkVHJhbnNhY3Rpb24+OyB0b3RhbDogbnVtYmVyIH0+ID0+IHtcbiAgICBjb25zdCB0eHMgPSBhd2FpdCB0aGlzLmFwaS5nZXRUeHNCeUFkZHJlc3MoYWRkcmVzcywge1xuICAgICAgb2Zmc2V0LFxuICAgICAgbGltaXQsXG4gICAgfSk7XG4gICAgaWYgKCF0eHMuaXRlbXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFeHBsb3JlciBBZGRyZXNzVHJhbnNhY3Rpb25zIGFwaSBleHBlY3RlZCB0byBoYXZlIGl0ZW1zJyxcbiAgICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiB0eHMuaXRlbXMubWFwKCh0eCkgPT4gdGhpcy5jb252ZXJ0VHJhbnNhY3Rpb24odHgpKSxcbiAgICAgIHRvdGFsOiB0eHMudG90YWwhLFxuICAgIH07XG4gIH07XG59XG4iXX0=