@bitgo-beta/sdk-coin-polyx 1.0.1-beta.69 → 1.0.1-beta.691

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 (150) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/baseBuilder.d.ts +24 -0
  5. package/dist/src/lib/baseBuilder.d.ts.map +1 -0
  6. package/dist/src/lib/baseBuilder.js +31 -0
  7. package/dist/src/lib/batchStakingBuilder.d.ts +79 -0
  8. package/dist/src/lib/batchStakingBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/batchStakingBuilder.js +299 -0
  10. package/dist/src/lib/batchUnstakingBuilder.d.ts +39 -0
  11. package/dist/src/lib/batchUnstakingBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/batchUnstakingBuilder.js +127 -0
  13. package/dist/src/lib/bondExtraBuilder.d.ts +37 -0
  14. package/dist/src/lib/bondExtraBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/bondExtraBuilder.js +101 -0
  16. package/dist/src/lib/constants.d.ts +12 -0
  17. package/dist/src/lib/constants.d.ts.map +1 -0
  18. package/dist/src/lib/constants.js +15 -0
  19. package/dist/src/lib/iface.d.ts +140 -2
  20. package/dist/src/lib/iface.d.ts.map +1 -1
  21. package/dist/src/lib/iface.js +37 -1
  22. package/dist/src/lib/index.d.ts +16 -7
  23. package/dist/src/lib/index.d.ts.map +1 -1
  24. package/dist/src/lib/index.js +44 -36
  25. package/dist/src/lib/preApproveAssetBuilder.d.ts +33 -0
  26. package/dist/src/lib/preApproveAssetBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/preApproveAssetBuilder.js +77 -0
  28. package/dist/src/lib/registerDidWithCDDBuilder.d.ts +34 -0
  29. package/dist/src/lib/registerDidWithCDDBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/registerDidWithCDDBuilder.js +83 -0
  31. package/dist/src/lib/rejectInstructionBuilder.d.ts +29 -0
  32. package/dist/src/lib/rejectInstructionBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/rejectInstructionBuilder.js +89 -0
  34. package/dist/src/lib/tokenTransferBuilder.d.ts +58 -0
  35. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/tokenTransferBuilder.js +158 -0
  37. package/dist/src/lib/transaction.d.ts +26 -4
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +183 -7
  40. package/dist/src/lib/transactionBuilderFactory.d.ts +29 -5
  41. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilderFactory.js +119 -8
  43. package/dist/src/lib/transferBuilder.d.ts +51 -3
  44. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  45. package/dist/src/lib/transferBuilder.js +109 -3
  46. package/dist/src/lib/txnSchema.d.ts +50 -0
  47. package/dist/src/lib/txnSchema.d.ts.map +1 -0
  48. package/dist/src/lib/txnSchema.js +165 -0
  49. package/dist/src/lib/unbondBuilder.d.ts +37 -0
  50. package/dist/src/lib/unbondBuilder.d.ts.map +1 -0
  51. package/dist/src/lib/unbondBuilder.js +98 -0
  52. package/dist/src/lib/utils.d.ts +15 -14
  53. package/dist/src/lib/utils.d.ts.map +1 -1
  54. package/dist/src/lib/utils.js +40 -23
  55. package/dist/src/lib/withdrawUnbondedBuilder.d.ts +35 -0
  56. package/dist/src/lib/withdrawUnbondedBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/withdrawUnbondedBuilder.js +89 -0
  58. package/dist/src/polyx.d.ts +50 -9
  59. package/dist/src/polyx.d.ts.map +1 -1
  60. package/dist/src/polyx.js +269 -15
  61. package/dist/src/polyxToken.d.ts +20 -0
  62. package/dist/src/polyxToken.d.ts.map +1 -0
  63. package/dist/src/polyxToken.js +55 -0
  64. package/dist/src/register.d.ts.map +1 -1
  65. package/dist/src/register.js +5 -1
  66. package/dist/src/resources/index.d.ts +3 -0
  67. package/dist/src/resources/index.d.ts.map +1 -0
  68. package/dist/src/resources/index.js +19 -0
  69. package/dist/src/resources/mainnet.d.ts +13 -0
  70. package/dist/src/resources/mainnet.d.ts.map +1 -0
  71. package/dist/src/resources/mainnet.js +16 -0
  72. package/dist/src/resources/testnet.d.ts +13 -0
  73. package/dist/src/resources/testnet.d.ts.map +1 -0
  74. package/dist/src/resources/testnet.js +16 -0
  75. package/dist/src/tpolyx.d.ts +7 -0
  76. package/dist/src/tpolyx.d.ts.map +1 -1
  77. package/dist/src/tpolyx.js +11 -1
  78. package/dist/test/integration/index.d.ts +1 -0
  79. package/dist/test/integration/index.d.ts.map +1 -0
  80. package/dist/test/integration/index.js +1 -0
  81. package/dist/test/resources/index.d.ts +106 -0
  82. package/dist/test/resources/index.d.ts.map +1 -0
  83. package/dist/test/resources/index.js +112 -0
  84. package/dist/test/resources/mainnet.d.ts +2 -0
  85. package/dist/test/resources/mainnet.d.ts.map +1 -0
  86. package/dist/test/resources/mainnet.js +5 -0
  87. package/dist/test/resources/materialData.json +8 -0
  88. package/dist/test/resources/materialDataModified.json +8 -0
  89. package/dist/test/resources/testnet.d.ts +2 -0
  90. package/dist/test/resources/testnet.d.ts.map +1 -0
  91. package/dist/test/resources/testnet.js +5 -0
  92. package/dist/test/resources/wrwUsers.d.ts +19 -0
  93. package/dist/test/resources/wrwUsers.d.ts.map +1 -0
  94. package/dist/test/resources/wrwUsers.js +60 -0
  95. package/dist/test/unit/polyx.d.ts +2 -0
  96. package/dist/test/unit/polyx.d.ts.map +1 -0
  97. package/dist/test/unit/polyx.js +209 -0
  98. package/dist/test/unit/transactionBuilder/base.d.ts +4 -0
  99. package/dist/test/unit/transactionBuilder/base.d.ts.map +1 -0
  100. package/dist/test/unit/transactionBuilder/base.js +245 -0
  101. package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts +2 -0
  102. package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts.map +1 -0
  103. package/dist/test/unit/transactionBuilder/batchStakingBuilder.js +263 -0
  104. package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts +2 -0
  105. package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts.map +1 -0
  106. package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.js +159 -0
  107. package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts +2 -0
  108. package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts.map +1 -0
  109. package/dist/test/unit/transactionBuilder/bondExtraBuilder.js +158 -0
  110. package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts +2 -0
  111. package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts.map +1 -0
  112. package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.js +115 -0
  113. package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts +2 -0
  114. package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts.map +1 -0
  115. package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.js +302 -0
  116. package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.d.ts +2 -0
  117. package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.d.ts.map +1 -0
  118. package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.js +128 -0
  119. package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts +2 -0
  120. package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts.map +1 -0
  121. package/dist/test/unit/transactionBuilder/singletonRegistry.js +59 -0
  122. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  123. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  124. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +140 -0
  125. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  126. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  127. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +74 -0
  128. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  129. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  130. package/dist/test/unit/transactionBuilder/transferBuilder.js +326 -0
  131. package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts +2 -0
  132. package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts.map +1 -0
  133. package/dist/test/unit/transactionBuilder/unbondBuilder.js +144 -0
  134. package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts +2 -0
  135. package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts.map +1 -0
  136. package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.js +138 -0
  137. package/dist/test/unit/utils.d.ts +2 -0
  138. package/dist/test/unit/utils.d.ts.map +1 -0
  139. package/dist/test/unit/utils.js +143 -0
  140. package/dist/tsconfig.tsbuildinfo +1 -0
  141. package/package.json +19 -10
  142. package/.eslintignore +0 -4
  143. package/.mocharc.yml +0 -8
  144. package/CHANGELOG.md +0 -16
  145. package/dist/src/lib/keyPair.d.ts +0 -12
  146. package/dist/src/lib/keyPair.d.ts.map +0 -1
  147. package/dist/src/lib/keyPair.js +0 -24
  148. package/dist/src/lib/transactionBuilder.d.ts +0 -43
  149. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  150. package/dist/src/lib/transactionBuilder.js +0 -78
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
7
+ const statics_1 = require("@bitgo-beta/statics");
8
+ const should_1 = __importDefault(require("should"));
9
+ const sinon_1 = __importDefault(require("sinon"));
10
+ const lib_1 = require("../../../src/lib");
11
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
12
+ const utils_1 = __importDefault(require("../../../src/lib/utils"));
13
+ const resources_1 = require("../../resources");
14
+ function createMockTransaction(txData) {
15
+ return {
16
+ id: '123',
17
+ type: sdk_core_1.TransactionType.StakingWithdraw,
18
+ toBroadcastFormat: () => txData,
19
+ inputs: [],
20
+ outputs: [],
21
+ signature: ['mock-signature'],
22
+ toJson: () => ({
23
+ id: '123',
24
+ type: 'StakingWithdraw',
25
+ sender: resources_1.accounts.account1.address,
26
+ referenceBlock: '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d',
27
+ blockNumber: 100,
28
+ genesisHash: '0x',
29
+ nonce: 1,
30
+ tip: 0,
31
+ specVersion: 1,
32
+ transactionVersion: 1,
33
+ chainName: 'Polymesh',
34
+ inputs: [],
35
+ outputs: [],
36
+ }),
37
+ };
38
+ }
39
+ describe('Polyx WithdrawUnbonded Builder', function () {
40
+ let builder;
41
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tpolyx'));
42
+ const senderAddress = resources_1.accounts.account1.address;
43
+ const testSlashingSpans = 0;
44
+ beforeEach(() => {
45
+ builder = factory.getWithdrawUnbondedBuilder();
46
+ });
47
+ describe('setter validation', () => {
48
+ it('should validate slashing spans', () => {
49
+ const spy = sinon_1.default.spy(builder, 'validateValue');
50
+ should_1.default.throws(() => builder.slashingSpans(-1), /Value cannot be less than zero/);
51
+ should_1.default.doesNotThrow(() => builder.slashingSpans(0));
52
+ sinon_1.default.assert.calledTwice(spy);
53
+ });
54
+ });
55
+ describe('Build and Sign', function () {
56
+ it('should build a withdraw unbonded transaction', async () => {
57
+ builder
58
+ .slashingSpans(testSlashingSpans)
59
+ .sender({ address: senderAddress })
60
+ .validity({ firstValid: 3933, maxDuration: 64 })
61
+ .referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
62
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 100 });
63
+ const mockTx = createMockTransaction(resources_1.rawTx.withdrawUnbonded.unsigned);
64
+ sinon_1.default.stub(builder, 'build').resolves(mockTx);
65
+ const tx = await builder.build();
66
+ should_1.default.exist(tx);
67
+ should_1.default.equal(builder.getSlashingSpans(), testSlashingSpans);
68
+ });
69
+ });
70
+ describe('Transaction Validation', function () {
71
+ it('should build, decode, and validate a real withdrawUnbonded transaction', () => {
72
+ // Build the transaction with real parameters
73
+ builder
74
+ .slashingSpans(testSlashingSpans)
75
+ .sender({ address: senderAddress })
76
+ .validity({ firstValid: 3933, maxDuration: 64 })
77
+ .referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
78
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 100 });
79
+ // Set up material for decoding
80
+ const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
81
+ builder.material(material);
82
+ // Build the actual unsigned transaction
83
+ const unsignedTx = builder['buildTransaction']();
84
+ const registry = builder['_registry'];
85
+ // Decode the actual built transaction
86
+ const decodedTx = (0, txwrapper_polkadot_1.decode)(unsignedTx, {
87
+ metadataRpc: material.metadata,
88
+ registry: registry,
89
+ });
90
+ // Validate the decoded transaction structure
91
+ should_1.default.equal(decodedTx.method.name, 'withdrawUnbonded');
92
+ should_1.default.equal(decodedTx.method.pallet, 'staking');
93
+ const withdrawArgs = decodedTx.method.args;
94
+ should_1.default.equal(withdrawArgs.numSlashingSpans, testSlashingSpans);
95
+ // Now validate using the builder's validation method
96
+ should_1.default.doesNotThrow(() => {
97
+ builder.validateDecodedTransaction(decodedTx);
98
+ });
99
+ });
100
+ it('should reject invalid transaction types', () => {
101
+ const mockDecodedTx = {
102
+ method: {
103
+ name: 'transfer',
104
+ pallet: 'balances',
105
+ args: {},
106
+ },
107
+ };
108
+ should_1.default.throws(() => {
109
+ builder.validateDecodedTransaction(mockDecodedTx);
110
+ }, /Invalid transaction type/);
111
+ });
112
+ });
113
+ describe('From Raw Transaction', function () {
114
+ it('should rebuild from real withdrawUnbonded transaction', async () => {
115
+ // First build a transaction to get a real raw transaction
116
+ const originalBuilder = factory.getWithdrawUnbondedBuilder();
117
+ originalBuilder
118
+ .slashingSpans(testSlashingSpans)
119
+ .sender({ address: senderAddress })
120
+ .validity({ firstValid: 3933, maxDuration: 64 })
121
+ .referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
122
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 100 });
123
+ // Set up material
124
+ const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
125
+ originalBuilder.material(material);
126
+ // Build the transaction and get the serialized hex
127
+ const tx = await originalBuilder.build();
128
+ const rawTxHex = tx.toBroadcastFormat();
129
+ // Create a new builder and reconstruct from the transaction hex
130
+ const newBuilder = factory.getWithdrawUnbondedBuilder();
131
+ newBuilder.material(material);
132
+ newBuilder.from(rawTxHex);
133
+ // Verify the reconstructed builder has the same parameters
134
+ should_1.default.equal(newBuilder.getSlashingSpans(), testSlashingSpans);
135
+ });
136
+ });
137
+ });
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aGRyYXdVbmJvbmRlZEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dpdGhkcmF3VW5ib25kZWRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esc0VBQXVEO0FBQ3ZELGlEQUE0QztBQUM1QyxvREFBNEI7QUFDNUIsa0RBQTBCO0FBQzFCLDBDQUFtRztBQUNuRyxtREFBdUQ7QUFDdkQsbUVBQTJDO0FBRTNDLCtDQUFrRDtBQUVsRCxTQUFTLHFCQUFxQixDQUFDLE1BQWM7SUFDM0MsT0FBTztRQUNMLEVBQUUsRUFBRSxLQUFLO1FBQ1QsSUFBSSxFQUFFLDBCQUFlLENBQUMsZUFBZTtRQUNyQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQy9CLE1BQU0sRUFBRSxFQUFFO1FBQ1YsT0FBTyxFQUFFLEVBQUU7UUFDWCxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNiLEVBQUUsRUFBRSxLQUFLO1lBQ1QsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixNQUFNLEVBQUUsb0JBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNqQyxjQUFjLEVBQUUsb0VBQW9FO1lBQ3BGLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEtBQUssRUFBRSxDQUFDO1lBQ1IsR0FBRyxFQUFFLENBQUM7WUFDTixXQUFXLEVBQUUsQ0FBQztZQUNkLGtCQUFrQixFQUFFLENBQUM7WUFDckIsU0FBUyxFQUFFLFVBQVU7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRTtJQUN6QyxJQUFJLE9BQWdDLENBQUM7SUFDckMsTUFBTSxP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QzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFMUIsMkRBQTJEO1lBQzNELGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb2RlZFNpZ25pbmdQYXlsb2FkIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZSc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5pbXBvcnQgeyBhY2NvdW50cywgcmF3VHggfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuXG5mdW5jdGlvbiBjcmVhdGVNb2NrVHJhbnNhY3Rpb24odHhEYXRhOiBzdHJpbmcpOiBQYXJ0aWFsPFRyYW5zYWN0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgaWQ6ICcxMjMnLFxuICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcsXG4gICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IHR4RGF0YSxcbiAgICBpbnB1dHM6IFtdLFxuICAgIG91dHB1dHM6IFtdLFxuICAgIHNpZ25hdHVyZTogWydtb2NrLXNpZ25hdHVyZSddLFxuICAgIHRvSnNvbjogKCkgPT4gKHtcbiAgICAgIGlkOiAnMTIzJyxcbiAgICAgIHR5cGU6ICdTdGFraW5nV2l0aGRyYXcnLFxuICAgICAgc2VuZGVyOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgcmVmZXJlbmNlQmxvY2s6ICcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnLFxuICAgICAgYmxvY2tOdW1iZXI6IDEwMCxcbiAgICAgIGdlbmVzaXNIYXNoOiAnMHgnLFxuICAgICAgbm9uY2U6IDEsXG4gICAgICB0aXA6IDAsXG4gICAgICBzcGVjVmVyc2lvbjogMSxcbiAgICAgIHRyYW5zYWN0aW9uVmVyc2lvbjogMSxcbiAgICAgIGNoYWluTmFtZTogJ1BvbHltZXNoJyxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9KSxcbiAgfTtcbn1cblxuZGVzY3JpYmUoJ1BvbHl4IFdpdGhkcmF3VW5ib25kZWQgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJ1aWxkZXI6IFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0cG9seXgnKSk7XG5cbiAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3M7XG4gIGNvbnN0IHRlc3RTbGFzaGluZ1NwYW5zID0gMDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBidWlsZGVyID0gZmFjdG9yeS5nZXRXaXRoZHJhd1VuYm9uZGVkQnVpbGRlcigpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2V0dGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzbGFzaGluZyBzcGFucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweShidWlsZGVyLCAndmFsaWRhdGVWYWx1ZScpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLnNsYXNoaW5nU3BhbnMoLTEpLCAvVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvLyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuc2xhc2hpbmdTcGFucygwKSk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkVHdpY2Uoc3B5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0J1aWxkIGFuZCBTaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyB1bmJvbmRlZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNsYXNoaW5nU3BhbnModGVzdFNsYXNoaW5nU3BhbnMpXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDEwMCB9KTtcblxuICAgICAgY29uc3QgbW9ja1R4ID0gY3JlYXRlTW9ja1RyYW5zYWN0aW9uKHJhd1R4LndpdGhkcmF3VW5ib25kZWQudW5zaWduZWQpO1xuICAgICAgc2lub24uc3R1YihidWlsZGVyLCAnYnVpbGQnKS5yZXNvbHZlcyhtb2NrVHggYXMgVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyLmdldFNsYXNoaW5nU3BhbnMoKSwgdGVzdFNsYXNoaW5nU3BhbnMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkLCBkZWNvZGUsIGFuZCB2YWxpZGF0ZSBhIHJlYWwgd2l0aGRyYXdVbmJvbmRlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiB3aXRoIHJlYWwgcGFyYW1ldGVyc1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2xhc2hpbmdTcGFucyh0ZXN0U2xhc2hpbmdTcGFucylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMTAwIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgbWF0ZXJpYWwgZm9yIGRlY29kaW5nXG4gICAgICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvaW5zLmdldCgndHBvbHl4JykubmV0d29yay50eXBlKTtcbiAgICAgIGJ1aWxkZXIubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICAvLyBCdWlsZCB0aGUgYWN0dWFsIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYnVpbGRlclsnYnVpbGRUcmFuc2FjdGlvbiddKCk7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGJ1aWxkZXJbJ19yZWdpc3RyeSddO1xuXG4gICAgICAvLyBEZWNvZGUgdGhlIGFjdHVhbCBidWlsdCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgZGVjb2RlZFR4ID0gZGVjb2RlKHVuc2lnbmVkVHgsIHtcbiAgICAgICAgbWV0YWRhdGFScGM6IG1hdGVyaWFsLm1ldGFkYXRhLFxuICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFR4Lm1ldGhvZC5uYW1lLCAnd2l0aGRyYXdVbmJvbmRlZCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGRlY29kZWRUeC5tZXRob2QucGFsbGV0LCAnc3Rha2luZycpO1xuXG4gICAgICBjb25zdCB3aXRoZHJhd0FyZ3MgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3MgYXMgeyBudW1TbGFzaGluZ1NwYW5zOiBudW1iZXIgfTtcbiAgICAgIHNob3VsZC5lcXVhbCh3aXRoZHJhd0FyZ3MubnVtU2xhc2hpbmdTcGFucywgdGVzdFNsYXNoaW5nU3BhbnMpO1xuXG4gICAgICAvLyBOb3cgdmFsaWRhdGUgdXNpbmcgdGhlIGJ1aWxkZXIncyB2YWxpZGF0aW9uIG1ldGhvZFxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVEZWNvZGVkVHJhbnNhY3Rpb24oZGVjb2RlZFR4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCB0cmFuc2FjdGlvbiB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tEZWNvZGVkVHg6IERlY29kZWRTaWduaW5nUGF5bG9hZCA9IHtcbiAgICAgICAgbWV0aG9kOiB7XG4gICAgICAgICAgbmFtZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICBwYWxsZXQ6ICdiYWxhbmNlcycsXG4gICAgICAgICAgYXJnczoge30sXG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRGVjb2RlZFNpZ25pbmdQYXlsb2FkO1xuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZURlY29kZWRUcmFuc2FjdGlvbihtb2NrRGVjb2RlZFR4KTtcbiAgICAgIH0sIC9JbnZhbGlkIHRyYW5zYWN0aW9uIHR5cGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Zyb20gUmF3IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVidWlsZCBmcm9tIHJlYWwgd2l0aGRyYXdVbmJvbmRlZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEZpcnN0IGJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmVhbCByYXcgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsQnVpbGRlciA9IGZhY3RvcnkuZ2V0V2l0aGRyYXdVbmJvbmRlZEJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlclxuICAgICAgICAuc2xhc2hpbmdTcGFucyh0ZXN0U2xhc2hpbmdTcGFucylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMTAwIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgbWF0ZXJpYWxcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29pbnMuZ2V0KCd0cG9seXgnKS5uZXR3b3JrLnR5cGUpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgLy8gQnVpbGQgdGhlIHRyYW5zYWN0aW9uIGFuZCBnZXQgdGhlIHNlcmlhbGl6ZWQgaGV4XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IG9yaWdpbmFsQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgYnVpbGRlciBhbmQgcmVjb25zdHJ1Y3QgZnJvbSB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gZmFjdG9yeS5nZXRXaXRoZHJhd1VuYm9uZGVkQnVpbGRlcigpO1xuICAgICAgbmV3QnVpbGRlci5tYXRlcmlhbChtYXRlcmlhbCk7XG4gICAgICBuZXdCdWlsZGVyLmZyb20ocmF3VHhIZXgpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHJlY29uc3RydWN0ZWQgYnVpbGRlciBoYXMgdGhlIHNhbWUgcGFyYW1ldGVyc1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld0J1aWxkZXIuZ2V0U2xhc2hpbmdTcGFucygpLCB0ZXN0U2xhc2hpbmdTcGFucyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const should_1 = __importDefault(require("should"));
7
+ const src_1 = require("../../src");
8
+ const resources_1 = require("../resources");
9
+ const resources_2 = require("../../src/resources");
10
+ describe('Polyx Utils', () => {
11
+ // Create a proper Material object from testnetMaterial
12
+ const material = {
13
+ genesisHash: resources_2.testnetMaterial.genesisHash,
14
+ chainName: resources_2.testnetMaterial.chainName,
15
+ specName: resources_2.testnetMaterial.specName,
16
+ specVersion: resources_2.testnetMaterial.specVersion,
17
+ txVersion: resources_2.testnetMaterial.txVersion,
18
+ metadata: resources_2.testnetMaterial.metadata,
19
+ };
20
+ describe('decodeTransaction', () => {
21
+ it('should decode a signed transfer transaction and identify method name', () => {
22
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.transfer.signed, material);
23
+ should_1.default.exist(decoded);
24
+ decoded.should.have.property('method');
25
+ decoded.method.should.have.property('pallet');
26
+ decoded.method.should.have.property('name');
27
+ // Check that it's a balances transfer
28
+ decoded.method.pallet.should.equal('balances');
29
+ decoded.method.name.should.equal('transferWithMemo');
30
+ });
31
+ it('should decode an unsigned transfer transaction and identify method name', () => {
32
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.transfer.unsigned, material);
33
+ should_1.default.exist(decoded);
34
+ decoded.should.have.property('method');
35
+ decoded.method.should.have.property('pallet');
36
+ decoded.method.should.have.property('name');
37
+ // Check that it's a balances transfer
38
+ decoded.method.pallet.should.equal('balances');
39
+ decoded.method.name.should.equal('transferWithMemo');
40
+ });
41
+ it('should decode a CDD registration transaction and identify method name', () => {
42
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.cddTransaction.signed, material);
43
+ should_1.default.exist(decoded);
44
+ decoded.should.have.property('method');
45
+ decoded.method.should.have.property('pallet');
46
+ decoded.method.should.have.property('name');
47
+ // Check that it's a CDD transaction
48
+ decoded.method.pallet.should.equal('identity');
49
+ decoded.method.name.should.equal('cddRegisterDidWithCdd');
50
+ });
51
+ it('should decode a staking bond transaction and identify method name', () => {
52
+ const decoded = src_1.utils.decodeTransaction(resources_1.stakingTx.bond.signed, material);
53
+ should_1.default.exist(decoded);
54
+ decoded.should.have.property('method');
55
+ decoded.method.should.have.property('pallet');
56
+ decoded.method.should.have.property('name');
57
+ // Check that it's a staking bond
58
+ decoded.method.pallet.should.equal('staking');
59
+ decoded.method.name.should.equal('bond');
60
+ });
61
+ it('should decode a staking unbond transaction and identify method name', () => {
62
+ const decoded = src_1.utils.decodeTransaction(resources_1.stakingTx.unbond.signed, material);
63
+ should_1.default.exist(decoded);
64
+ decoded.should.have.property('method');
65
+ decoded.method.should.have.property('pallet');
66
+ decoded.method.should.have.property('name');
67
+ // Check that it's a staking unbond
68
+ decoded.method.pallet.should.equal('staking');
69
+ decoded.method.name.should.equal('unbond');
70
+ });
71
+ it('should decode a batch transaction and identify method name', () => {
72
+ const decoded = src_1.utils.decodeTransaction(resources_1.stakingTx.batch.bondAndNominate.signed, material);
73
+ should_1.default.exist(decoded);
74
+ decoded.should.have.property('method');
75
+ decoded.method.should.have.property('pallet');
76
+ decoded.method.should.have.property('name');
77
+ // Check that it's a batch transaction
78
+ decoded.method.pallet.should.equal('utility');
79
+ decoded.method.name.should.equal('batchAll');
80
+ // Check the batch calls (handle potential null/undefined)
81
+ decoded.method.should.have.property('args');
82
+ decoded.method.args.should.have.property('calls');
83
+ if (Array.isArray(decoded.method.args.calls)) {
84
+ decoded.method.args.calls.should.be.an.Array();
85
+ decoded.method.args.calls.length.should.equal(2);
86
+ // First call should be bond
87
+ if (decoded.method.args.calls[0]) {
88
+ decoded.method.args.calls[0].should.have.property('callIndex');
89
+ }
90
+ // Second call should be nominate
91
+ if (decoded.method.args.calls[1]) {
92
+ decoded.method.args.calls[1].should.have.property('callIndex');
93
+ }
94
+ }
95
+ });
96
+ it('should decode a preApprove asset transaction and identify method name', () => {
97
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.preApproveAsset.signed, material);
98
+ should_1.default.exist(decoded);
99
+ decoded.should.have.property('method');
100
+ decoded.method.should.have.property('pallet');
101
+ decoded.method.should.have.property('name');
102
+ // Check that it's an asset preApprove
103
+ decoded.method.pallet.should.equal('asset');
104
+ decoded.method.name.should.equal('preApproveAsset');
105
+ });
106
+ it('should decode a token transfer transaction and identify method name', () => {
107
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.tokenTransfer.signed, material);
108
+ should_1.default.exist(decoded);
109
+ decoded.should.have.property('method');
110
+ decoded.method.should.have.property('pallet');
111
+ decoded.method.should.have.property('name');
112
+ // Check that it's a settlement transaction
113
+ decoded.method.pallet.should.equal('settlement');
114
+ decoded.method.name.should.equal('addAndAffirmWithMediators');
115
+ });
116
+ it('should decode unstake transaction and identify method name', () => {
117
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.unstake.signed, material);
118
+ should_1.default.exist(decoded);
119
+ decoded.should.have.property('method');
120
+ decoded.method.should.have.property('pallet');
121
+ decoded.method.should.have.property('name');
122
+ // Check that it's a batch unstaking transaction
123
+ decoded.method.pallet.should.equal('utility');
124
+ decoded.method.name.should.equal('batchAll');
125
+ });
126
+ it('should decode withdraw unbonded transaction and identify method name', () => {
127
+ const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.withdrawUnbonded.signed, material);
128
+ should_1.default.exist(decoded);
129
+ decoded.should.have.property('method');
130
+ decoded.method.should.have.property('pallet');
131
+ decoded.method.should.have.property('name');
132
+ // Check that it's a staking withdraw unbonded
133
+ decoded.method.pallet.should.equal('staking');
134
+ decoded.method.name.should.equal('withdrawUnbonded');
135
+ });
136
+ it('should throw error for invalid transaction hex', () => {
137
+ should_1.default.throws(() => {
138
+ src_1.utils.decodeTransaction('0xinvalid', material);
139
+ }, /Failed to decode transaction/);
140
+ });
141
+ });
142
+ });
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQWtDO0FBQ2xDLDRDQUFnRDtBQUNoRCxtREFBc0Q7QUFLdEQsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsdURBQXVEO0lBQ3ZELE1BQU0sUUFBUSxHQUFhO1FBQ3pCLFdBQVcsRUFBRSwyQkFBZSxDQUFDLFdBQVc7UUFDeEMsU0FBUyxFQUFFLDJCQUFlLENBQUMsU0FBUztRQUNwQyxRQUFRLEVBQUUsMkJBQWUsQ0FBQyxRQUFRO1FBQ2xDLFdBQVcsRUFBRSwyQkFBZSxDQUFDLFdBQVc7UUFDeEMsU0FBUyxFQUFFLDJCQUFlLENBQUMsU0FBUztRQUNwQyxRQUFRLEVBQUUsMkJBQWUsQ0FBQyxRQUF5QjtLQUNwRCxDQUFDO0lBRUYsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsc0VBQXNFLEVBQUUsR0FBRyxFQUFFO1lBQzlFLE1BQU0sT0FBTyxHQUFHLFdBQUssQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFekUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1QyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMs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QUcsRUFBRTtZQUM5RSxNQUFNLE9BQU8sR0FBRyxXQUFLLENBQUMsaUJBQWlCLENBQUMsaUJBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFakYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1Qyw4Q0FBOEM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsV0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRCxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyByYXdUeCwgc3Rha2luZ1R4IH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IHRlc3RuZXRNYXRlcmlhbCB9IGZyb20gJy4uLy4uL3NyYy9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvLWJldGEvYWJzdHJhY3Qtc3Vic3RyYXRlJztcblxudHlwZSBNYXRlcmlhbCA9IEludGVyZmFjZS5NYXRlcmlhbDtcblxuZGVzY3JpYmUoJ1BvbHl4IFV0aWxzJywgKCkgPT4ge1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgTWF0ZXJpYWwgb2JqZWN0IGZyb20gdGVzdG5ldE1hdGVyaWFsXG4gIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHtcbiAgICBnZW5lc2lzSGFzaDogdGVzdG5ldE1hdGVyaWFsLmdlbmVzaXNIYXNoLFxuICAgIGNoYWluTmFtZTogdGVzdG5ldE1hdGVyaWFsLmNoYWluTmFtZSxcbiAgICBzcGVjTmFtZTogdGVzdG5ldE1hdGVyaWFsLnNwZWNOYW1lLFxuICAgIHNwZWNWZXJzaW9uOiB0ZXN0bmV0TWF0ZXJpYWwuc3BlY1ZlcnNpb24sXG4gICAgdHhWZXJzaW9uOiB0ZXN0bmV0TWF0ZXJpYWwudHhWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiB0ZXN0bmV0TWF0ZXJpYWwubWV0YWRhdGEgYXMgYDB4JHtzdHJpbmd9YCxcbiAgfTtcblxuICBkZXNjcmliZSgnZGVjb2RlVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHJhd1R4LnRyYW5zZmVyLnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIGJhbGFuY2VzIHRyYW5zZmVyXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdiYWxhbmNlcycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3RyYW5zZmVyV2l0aE1lbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGFuIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGFuZCBpZGVudGlmeSBtZXRob2QgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSB1dGlscy5kZWNvZGVUcmFuc2FjdGlvbihyYXdUeC50cmFuc2Zlci51bnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIGJhbGFuY2VzIHRyYW5zZmVyXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdiYWxhbmNlcycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3RyYW5zZmVyV2l0aE1lbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgQ0REIHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHguY2RkVHJhbnNhY3Rpb24uc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgQ0REIHRyYW5zYWN0aW9uXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdpZGVudGl0eScpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ2NkZFJlZ2lzdGVyRGlkV2l0aENkZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgYSBzdGFraW5nIGJvbmQgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHN0YWtpbmdUeC5ib25kLnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIHN0YWtpbmcgYm9uZFxuICAgICAgZGVjb2RlZC5tZXRob2QucGFsbGV0LnNob3VsZC5lcXVhbCgnc3Rha2luZycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ2JvbmQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgc3Rha2luZyB1bmJvbmQgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHN0YWtpbmdUeC51bmJvbmQuc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgc3Rha2luZyB1bmJvbmRcbiAgICAgIGRlY29kZWQubWV0aG9kLnBhbGxldC5zaG91bGQuZXF1YWwoJ3N0YWtpbmcnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLm5hbWUuc2hvdWxkLmVxdWFsKCd1bmJvbmQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgYmF0Y2ggdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHN0YWtpbmdUeC5iYXRjaC5ib25kQW5kTm9taW5hdGUuc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgYmF0Y2ggdHJhbnNhY3Rpb25cbiAgICAgIGRlY29kZWQubWV0aG9kLnBhbGxldC5zaG91bGQuZXF1YWwoJ3V0aWxpdHknKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLm5hbWUuc2hvdWxkLmVxdWFsKCdiYXRjaEFsbCcpO1xuXG4gICAgICAvLyBDaGVjayB0aGUgYmF0Y2ggY2FsbHMgKGhhbmRsZSBwb3RlbnRpYWwgbnVsbC91bmRlZmluZWQpXG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYXJncycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QuYXJncy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2FsbHMnKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlY29kZWQubWV0aG9kLmFyZ3MuY2FsbHMpKSB7XG4gICAgICAgIGRlY29kZWQubWV0aG9kLmFyZ3MuY2FsbHMuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICAgIGRlY29kZWQubWV0aG9kLmFyZ3MuY2FsbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgICAvLyBGaXJzdCBjYWxsIHNob3VsZCBiZSBib25kXG4gICAgICAgIGlmIChkZWNvZGVkLm1ldGhvZC5hcmdzLmNhbGxzWzBdKSB7XG4gICAgICAgICAgZGVjb2RlZC5tZXRob2QuYXJncy5jYWxsc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2FsbEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2Vjb25kIGNhbGwgc2hvdWxkIGJlIG5vbWluYXRlXG4gICAgICAgIGlmIChkZWNvZGVkLm1ldGhvZC5hcmdzLmNhbGxzWzFdKSB7XG4gICAgICAgICAgZGVjb2RlZC5tZXRob2QuYXJncy5jYWxsc1sxXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2FsbEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgcHJlQXBwcm92ZSBhc3NldCB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHgucHJlQXBwcm92ZUFzc2V0LnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhbiBhc3NldCBwcmVBcHByb3ZlXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdhc3NldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3ByZUFwcHJvdmVBc3NldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgYSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHgudG9rZW5UcmFuc2Zlci5zaWduZWQsIG1hdGVyaWFsKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWV0aG9kJyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncGFsbGV0Jyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbmFtZScpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IGl0J3MgYSBzZXR0bGVtZW50IHRyYW5zYWN0aW9uXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdzZXR0bGVtZW50Jyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5uYW1lLnNob3VsZC5lcXVhbCgnYWRkQW5kQWZmaXJtV2l0aE1lZGlhdG9ycycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgdW5zdGFrZSB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHgudW5zdGFrZS5zaWduZWQsIG1hdGVyaWFsKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWV0aG9kJyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncGFsbGV0Jyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbmFtZScpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IGl0J3MgYSBiYXRjaCB1bnN0YWtpbmcgdHJhbnNhY3Rpb25cbiAgICAgIGRlY29kZWQubWV0aG9kLnBhbGxldC5zaG91bGQuZXF1YWwoJ3V0aWxpdHknKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLm5hbWUuc2hvdWxkLmVxdWFsKCdiYXRjaEFsbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgd2l0aGRyYXcgdW5ib25kZWQgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHJhd1R4LndpdGhkcmF3VW5ib25kZWQuc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgc3Rha2luZyB3aXRoZHJhdyB1bmJvbmRlZFxuICAgICAgZGVjb2RlZC5tZXRob2QucGFsbGV0LnNob3VsZC5lcXVhbCgnc3Rha2luZycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3dpdGhkcmF3VW5ib25kZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24gaGV4JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB7XG4gICAgICAgIHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKCcweGludmFsaWQnLCBtYXRlcmlhbCk7XG4gICAgICB9LCAvRmFpbGVkIHRvIGRlY29kZSB0cmFuc2FjdGlvbi8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19