@bitgo-beta/sdk-coin-trx 1.2.3-alpha.402 → 1.2.3-alpha.403

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 (143) hide show
  1. package/dist/src/index.d.ts +6 -0
  2. package/dist/src/index.d.ts.map +1 -0
  3. package/dist/src/index.js +22 -0
  4. package/dist/src/lib/address.d.ts +11 -0
  5. package/dist/src/lib/address.d.ts.map +1 -0
  6. package/dist/src/lib/address.js +13 -0
  7. package/dist/src/lib/builder.d.ts +3 -0
  8. package/dist/src/lib/builder.d.ts.map +1 -0
  9. package/dist/src/lib/builder.js +10 -0
  10. package/dist/src/lib/constants.d.ts +3 -0
  11. package/dist/src/lib/constants.d.ts.map +1 -0
  12. package/dist/src/lib/constants.js +6 -0
  13. package/dist/src/lib/contractCallBuilder.d.ts +62 -0
  14. package/dist/src/lib/contractCallBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/contractCallBuilder.js +218 -0
  16. package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
  17. package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/delegateResourceTxBuilder.js +98 -0
  19. package/dist/src/lib/enum.d.ts +58 -0
  20. package/dist/src/lib/enum.d.ts.map +1 -0
  21. package/dist/src/lib/enum.js +64 -0
  22. package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
  23. package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/freezeBalanceTxBuilder.js +211 -0
  25. package/dist/src/lib/iface.d.ts +321 -0
  26. package/dist/src/lib/iface.d.ts.map +1 -0
  27. package/dist/src/lib/iface.js +3 -0
  28. package/dist/src/lib/index.d.ts +12 -0
  29. package/dist/src/lib/index.d.ts.map +1 -0
  30. package/dist/src/lib/index.js +53 -0
  31. package/dist/src/lib/keyPair.d.ts +43 -0
  32. package/dist/src/lib/keyPair.d.ts.map +1 -0
  33. package/dist/src/lib/keyPair.js +134 -0
  34. package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
  35. package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
  37. package/dist/src/lib/tokenTransferBuilder.d.ts +23 -0
  38. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  39. package/dist/src/lib/tokenTransferBuilder.js +42 -0
  40. package/dist/src/lib/transaction.d.ts +74 -0
  41. package/dist/src/lib/transaction.d.ts.map +1 -0
  42. package/dist/src/lib/transaction.js +312 -0
  43. package/dist/src/lib/transactionBuilder.d.ts +110 -0
  44. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/transactionBuilder.js +304 -0
  46. package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
  47. package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/undelegateResourceTxBuilder.js +98 -0
  49. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
  50. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  51. package/dist/src/lib/unfreezeBalanceTxBuilder.js +204 -0
  52. package/dist/src/lib/utils.d.ts +197 -0
  53. package/dist/src/lib/utils.d.ts.map +1 -0
  54. package/dist/src/lib/utils.js +745 -0
  55. package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
  56. package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
  58. package/dist/src/lib/withdrawBuilder.d.ts +49 -0
  59. package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/withdrawBuilder.js +167 -0
  61. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
  62. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
  64. package/dist/src/lib/wrappedBuilder.d.ts +110 -0
  65. package/dist/src/lib/wrappedBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/wrappedBuilder.js +192 -0
  67. package/dist/src/register.d.ts +3 -0
  68. package/dist/src/register.d.ts.map +1 -0
  69. package/dist/src/register.js +15 -0
  70. package/dist/src/trx.d.ts +262 -0
  71. package/dist/src/trx.d.ts.map +1 -0
  72. package/dist/src/trx.js +737 -0
  73. package/dist/src/trxToken.d.ts +38 -0
  74. package/dist/src/trxToken.d.ts.map +1 -0
  75. package/dist/src/trxToken.js +91 -0
  76. package/dist/src/ttrx.d.ts +13 -0
  77. package/dist/src/ttrx.d.ts.map +1 -0
  78. package/dist/src/ttrx.js +14 -0
  79. package/dist/test/fixtures.d.ts +40 -0
  80. package/dist/test/fixtures.d.ts.map +1 -0
  81. package/dist/test/fixtures.js +46 -0
  82. package/dist/test/resources.d.ts +586 -0
  83. package/dist/test/resources.d.ts.map +1 -0
  84. package/dist/test/resources.js +746 -0
  85. package/dist/test/unit/index.d.ts +2 -0
  86. package/dist/test/unit/index.d.ts.map +1 -0
  87. package/dist/test/unit/index.js +19 -0
  88. package/dist/test/unit/keyPair.d.ts +2 -0
  89. package/dist/test/unit/keyPair.d.ts.map +1 -0
  90. package/dist/test/unit/keyPair.js +163 -0
  91. package/dist/test/unit/transaction.d.ts +2 -0
  92. package/dist/test/unit/transaction.d.ts.map +1 -0
  93. package/dist/test/unit/transaction.js +38 -0
  94. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
  95. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
  96. package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
  97. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
  98. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
  99. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +255 -0
  100. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
  101. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
  102. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +256 -0
  103. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  104. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  105. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +42 -0
  106. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
  107. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
  108. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +255 -0
  109. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
  110. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  111. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +256 -0
  112. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
  113. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
  114. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
  115. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
  116. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
  117. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
  118. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
  119. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  120. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
  121. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
  122. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
  123. package/dist/test/unit/transactionBuilder/wrappedBuilder.js +50 -0
  124. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  125. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  126. package/dist/test/unit/transactionBuilder.js +178 -0
  127. package/dist/test/unit/trx.d.ts +2 -0
  128. package/dist/test/unit/trx.d.ts.map +1 -0
  129. package/dist/test/unit/trx.js +532 -0
  130. package/dist/test/unit/util.d.ts +2 -0
  131. package/dist/test/unit/util.d.ts.map +1 -0
  132. package/dist/test/unit/util.js +141 -0
  133. package/dist/tsconfig.tsbuildinfo +1 -0
  134. package/package.json +9 -6
  135. package/.eslintignore +0 -5
  136. package/.mocharc.yml +0 -8
  137. package/CHANGELOG.md +0 -1092
  138. package/resources/README.md +0 -31
  139. package/resources/protobuf/Contract.proto +0 -288
  140. package/resources/protobuf/Discover.proto +0 -44
  141. package/resources/protobuf/tron.d.ts +0 -12469
  142. package/resources/protobuf/tron.js +0 -37192
  143. package/resources/protobuf/tron.proto +0 -683
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
@@ -0,0 +1,141 @@
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 node_test_1 = require("node:test");
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const src_1 = require("../../src");
9
+ const resources_1 = require("../resources");
10
+ const utils_1 = require("../../src/lib/utils");
11
+ (0, node_test_1.describe)('Util library should', function () {
12
+ // arbitrary text
13
+ const arr = [127, 255, 31, 192, 3, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
14
+ const hex = '7FFF1FC0037E0000000000000000000000000000000000000000000000000000';
15
+ const txt = 'arbitrary string to sign';
16
+ const signedString = '0x9424113f32c17b6ffbeee024e1a54b6991d756e82f66cca16a41231fdfa270d03b08e833f5dbbd5cc86896c2e5ea6c74d2e292cda21f717164f994fcdf28486d1b';
17
+ // prv-pub-address hex
18
+ const prv = 'FB3AA887E0BE3FAC9D75E661DAFF4A7FE0E91AAB13DA9775CD8586D7CB9B7640';
19
+ const pub = '046EBFB90C396B4A3B992B727CB4714A32E2A6DE43FDB3EC266286AC2246D8FD1E23E12C0DEB752C631A9011BBF8B56E2FBAA20E99D3952F0A558D11F96E7C1C5D';
20
+ const addressHex = '412C2BA4A9FF6C53207DC5B686BFECF75EA7B80577';
21
+ const base58 = 'TDzm1tCXM2YS1PDa3GoXSvxdy4AgwVbBPE';
22
+ const addrBytes = [65, 44, 43, 164, 169, 255, 108, 83, 32, 125, 197, 182, 134, 191, 236, 247, 94, 167, 184, 5, 119];
23
+ // tx information
24
+ (0, node_test_1.it)('be able to convert hex to bytes', () => {
25
+ const ba = src_1.Utils.getByteArrayFromHexAddress(hex);
26
+ assert_1.default.deepStrictEqual(ba, arr);
27
+ });
28
+ (0, node_test_1.it)('be able to convert hex with 0x to bytes ', () => {
29
+ const ba = src_1.Utils.getByteArrayFromHexAddress('0x' + hex);
30
+ assert_1.default.deepStrictEqual(ba, arr);
31
+ });
32
+ (0, node_test_1.it)('be able to convert hex to bytes', () => {
33
+ const hs = src_1.Utils.getHexAddressFromByteArray(arr);
34
+ assert_1.default.equal(hs, hex);
35
+ });
36
+ (0, node_test_1.it)('get a pub from a prv', () => {
37
+ const derivedPub = src_1.Utils.getPubKeyFromPriKey(Buffer.from(prv, 'hex'));
38
+ const derivedPubHex = src_1.Utils.getHexAddressFromByteArray(derivedPub);
39
+ assert_1.default.equal(derivedPubHex, pub);
40
+ });
41
+ (0, node_test_1.it)('get an hex address from a prv', () => {
42
+ const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
43
+ const hexAddr = src_1.Utils.getHexAddressFromByteArray(addr);
44
+ assert_1.default.equal(hexAddr, addressHex);
45
+ });
46
+ (0, node_test_1.it)('get an base58 address', () => {
47
+ const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
48
+ const addr58 = src_1.Utils.getBase58AddressFromByteArray(addr);
49
+ assert_1.default.equal(addr58, base58);
50
+ });
51
+ (0, node_test_1.it)('get an base58 address from hex', () => {
52
+ const addr58 = src_1.Utils.getBase58AddressFromHex(addressHex);
53
+ assert_1.default.equal(addr58, base58);
54
+ });
55
+ (0, node_test_1.it)('get hex from base58 address', () => {
56
+ const hexAddr = src_1.Utils.getHexAddressFromBase58Address(base58);
57
+ assert_1.default.equal(hexAddr, addressHex);
58
+ });
59
+ (0, node_test_1.it)('validate a hex string', () => {
60
+ const hex = ['0xaffd', '0x11'];
61
+ hex.map((hex) => {
62
+ assert_1.default.ok(src_1.Utils.isValidHex(hex));
63
+ });
64
+ const invalidHex = ['0xa11', '0xFFdYYY', '0x', ''];
65
+ invalidHex.map((hex) => {
66
+ assert_1.default.strictEqual(src_1.Utils.isValidHex(hex), false);
67
+ });
68
+ });
69
+ (0, node_test_1.it)('sign a string', () => {
70
+ const hexText = Buffer.from(txt).toString('hex');
71
+ const signed = src_1.Utils.signString(hexText, prv);
72
+ assert_1.default.equal(signedString, signed);
73
+ });
74
+ (0, node_test_1.it)('should calculate an address from a pub', () => {
75
+ const pubBytes = src_1.Utils.getByteArrayFromHexAddress(pub);
76
+ const bytes = src_1.Utils.getRawAddressFromPubKey(pubBytes);
77
+ assert_1.default.deepStrictEqual(bytes, addrBytes);
78
+ });
79
+ (0, node_test_1.it)('should verify a signed message', () => {
80
+ const hexEncodedMessage = Buffer.from(txt).toString('hex');
81
+ assert_1.default.strictEqual(src_1.Utils.verifySignature(hexEncodedMessage, base58, signedString, true), true);
82
+ });
83
+ (0, node_test_1.it)('should fail to verify a signed message if the message is not in hex', () => {
84
+ assert_1.default.throws(() => src_1.Utils.verifySignature(txt, base58, signedString, true));
85
+ });
86
+ (0, node_test_1.it)('should fail to verify a signed message if the address is not in base58', () => {
87
+ const hexEncodedString = Buffer.from(txt).toString('hex');
88
+ assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, addressHex, signedString, true));
89
+ });
90
+ (0, node_test_1.it)('should fail to verify a signed message if the signature is not in hex', () => {
91
+ const hexEncodedString = Buffer.from(txt).toString('hex');
92
+ assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, base58, 'abc', true));
93
+ });
94
+ (0, node_test_1.it)('should return transaction data', () => {
95
+ const data = src_1.Utils.decodeRawTransaction(resources_1.UnsignedTransferContractTx.tx.raw_data_hex);
96
+ assert_1.default.equal(data.timestamp, resources_1.UnsignedTransferContractTx.tx.raw_data.timestamp);
97
+ assert_1.default.equal(data.expiration, resources_1.UnsignedTransferContractTx.tx.raw_data.expiration);
98
+ assert_1.default.ok(data.contracts);
99
+ });
100
+ (0, node_test_1.it)('should decode a transfer contract', () => {
101
+ const tx = resources_1.UnsignedTransferContractTx.tx;
102
+ const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
103
+ const value = resources_1.UnsignedTransferContractTx.tx.raw_data.contract[0].parameter.value;
104
+ const parsedContract = src_1.Utils.decodeTransferContract(rawTx.contracts[0].parameter.value);
105
+ const toAddress = src_1.Utils.getBase58AddressFromHex(value.to_address);
106
+ const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
107
+ const amount = value.amount;
108
+ assert_1.default.equal(parsedContract[0].parameter.value.to_address, toAddress);
109
+ assert_1.default.equal(parsedContract[0].parameter.value.owner_address, ownerAddress);
110
+ assert_1.default.equal(parsedContract[0].parameter.value.amount, amount);
111
+ });
112
+ (0, node_test_1.it)('should decode an AccountPermissionUpdate Contract', () => {
113
+ const tx = resources_1.SignedAccountPermissionUpdateContractTx;
114
+ const value = tx.raw_data.contract[0].parameter.value;
115
+ const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
116
+ const parsedTx = src_1.Utils.decodeAccountPermissionUpdateContract(rawTx.contracts[0].parameter.value);
117
+ const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
118
+ assert_1.default.equal(parsedTx.ownerAddress, ownerAddress);
119
+ assert_1.default.equal(parsedTx.owner.type, 0);
120
+ assert_1.default.equal(parsedTx.owner.threshold, 2);
121
+ assert_1.default.equal(parsedTx.actives.length, 1);
122
+ assert_1.default.equal(parsedTx.actives[0].type, 2);
123
+ assert_1.default.equal(parsedTx.actives[0].threshold, 2);
124
+ });
125
+ (0, node_test_1.it)('should encode and decode data parameters for transfer', () => {
126
+ const types = ['address', 'uint256'];
127
+ const amount = '2000000000000000000000';
128
+ const values = [addressHex, amount];
129
+ const methodId = '0xa9059cbb';
130
+ const data = src_1.Utils.encodeDataParams(types, values, methodId);
131
+ assert_1.default.equal(data, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
132
+ const decodedData = src_1.Utils.decodeDataParams(types, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
133
+ assert_1.default.equal(decodedData[0], addressHex.toLocaleLowerCase());
134
+ assert_1.default.equal(decodedData[1].toString(), amount);
135
+ });
136
+ (0, node_test_1.it)('should correctly map testnet and mainnet tokens', () => {
137
+ assert_1.default.strictEqual(utils_1.tokenMainnetContractAddresses.includes('TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S'), true);
138
+ assert_1.default.strictEqual(utils_1.tokenTestnetContractAddresses.includes('TGkfUshdbAiNj5G1mynp2meq2BfF6XSGPf'), true);
139
+ });
140
+ });
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBNkM7QUFFN0MsNENBQW1HO0FBQ25HLCtDQUFtRztBQUVuRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLEVBQUU7SUFDOUIsaUJBQWlCO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUNoQixzSUFBc0ksQ0FBQztJQUV6SSxzQkFBc0I7SUFDdEIsTUFBTSxHQUFHLEdBQUcsa0VBQWtFLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQ1Asb0lBQW9JLENBQUM7SUFDdkksTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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Q0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgsIFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyB0b2tlbk1haW5uZXRDb250cmFjdEFkZHJlc3NlcywgdG9rZW5UZXN0bmV0Q29udHJhY3RBZGRyZXNzZXMgfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ1V0aWwgbGlicmFyeSBzaG91bGQnLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGFyYml0cmFyeSB0ZXh0XG4gIGNvbnN0IGFyciA9IFsxMjcsIDI1NSwgMzEsIDE5MiwgMywgMTI2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgY29uc3QgaGV4ID0gJzdGRkYxRkMwMDM3RTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICBjb25zdCB0eHQgPSAnYXJiaXRyYXJ5IHN0cmluZyB0byBzaWduJztcbiAgY29uc3Qgc2lnbmVkU3RyaW5nID1cbiAgICAnMHg5NDI0MTEzZjMyYzE3YjZmZmJlZWUwMjRlMWE1NGI2OTkxZDc1NmU4MmY2NmNjYTE2YTQxMjMxZmRmYTI3MGQwM2IwOGU4MzNmNWRiYmQ1Y2M4Njg5NmMyZTVlYTZjNzRkMmUyOTJjZGEyMWY3MTcxNjRmOTk0ZmNkZjI4NDg2ZDFiJztcblxuICAvLyBwcnYtcHViLWFkZHJlc3MgaGV4XG4gIGNvbnN0IHBydiA9ICdGQjNBQTg4N0UwQkUzRkFDOUQ3NUU2NjFEQUZGNEE3RkUwRTkxQUFCMTNEQTk3NzVDRDg1ODZEN0NCOUI3NjQwJztcbiAgY29uc3QgcHViID1cbiAgICAnMDQ2RUJGQjkwQzM5NkI0QTNCOTkyQjcyN0NCNDcxNEEzMkUyQTZERTQzRkRCM0VDMjY2Mjg2QUMyMjQ2RDhGRDFFMjNFMTJDMERFQjc1MkM2MzFBOTAxMUJCRjhCNTZFMkZCQUEyMEU5OUQzOTUyRjBBNTU4RDExRjk2RTdDMUM1RCc7XG4gIGNvbnN0IGFkZHJlc3NIZXggPSAnNDEyQzJCQTRBOUZGNkM1MzIwN0RDNUI2ODZCRkVDRjc1RUE3QjgwNTc3JztcbiAgY29uc3QgYmFzZTU4ID0gJ1REem0xdENYTTJZUzFQRGEzR29YU3Z4ZHk0QWd3VmJCUEUnO1xuICBjb25zdCBhZGRyQnl0ZXMgPSBbNjUsIDQ0LCA0MywgMTY0LCAxNjksIDI1NSwgMTA4LCA4MywgMzIsIDEyNSwgMTk3LCAxODIsIDEzNCwgMTkxLCAyMzYsIDI0NywgOTQsIDE2NywgMTg0LCA1LCAxMTldO1xuXG4gIC8vIHR4IGluZm9ybWF0aW9uXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJhID0gVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3MoaGV4KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJhLCBhcnIpO1xuICB9KTtcblxuICBpdCgnYmUgYWJsZSB0byBjb252ZXJ0IGhleCB3aXRoIDB4IHRvIGJ5dGVzICcsICgpID0+IHtcbiAgICBjb25zdCBiYSA9IFV0aWxzLmdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzKCcweCcgKyBoZXgpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmEsIGFycik7XG4gIH0pO1xuXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhzID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYXJyKTtcbiAgICBhc3NlcnQuZXF1YWwoaHMsIGhleCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYSBwdWIgZnJvbSBhIHBydicsICgpID0+IHtcbiAgICBjb25zdCBkZXJpdmVkUHViID0gVXRpbHMuZ2V0UHViS2V5RnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgZGVyaXZlZFB1YkhleCA9IFV0aWxzLmdldEhleEFkZHJlc3NGcm9tQnl0ZUFycmF5KGRlcml2ZWRQdWIpO1xuICAgIGFzc2VydC5lcXVhbChkZXJpdmVkUHViSGV4LCBwdWIpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGhleCBhZGRyZXNzIGZyb20gYSBwcnYnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkciA9IFV0aWxzLmdldEFkZHJlc3NGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBoZXhBZGRyID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGhleEFkZHIsIGFkZHJlc3NIZXgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHIgPSBVdGlscy5nZXRBZGRyZXNzRnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgYWRkcjU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGFkZHI1OCwgYmFzZTU4KTtcbiAgfSk7XG5cbiAgaXQoJ2dldCBhbiBiYXNlNTggYWRkcmVzcyBmcm9tIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBhZGRyNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChhZGRyZXNzSGV4KTtcbiAgICBhc3NlcnQuZXF1YWwoYWRkcjU4LCBiYXNlNTgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGhleCBmcm9tIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEFkZHIgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJhc2U1OEFkZHJlc3MoYmFzZTU4KTtcbiAgICBhc3NlcnQuZXF1YWwoaGV4QWRkciwgYWRkcmVzc0hleCk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZSBhIGhleCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4ID0gWycweGFmZmQnLCAnMHgxMSddO1xuICAgIGhleC5tYXAoKGhleCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKFV0aWxzLmlzVmFsaWRIZXgoaGV4KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkSGV4ID0gWycweGExMScsICcweEZGZFlZWScsICcweCcsICcnXTtcbiAgICBpbnZhbGlkSGV4Lm1hcCgoaGV4KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMuaXNWYWxpZEhleChoZXgpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaWduIGEgc3RyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleFRleHQgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzaWduZWQgPSBVdGlscy5zaWduU3RyaW5nKGhleFRleHQsIHBydik7XG5cbiAgICBhc3NlcnQuZXF1YWwoc2lnbmVkU3RyaW5nLCBzaWduZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBhbiBhZGRyZXNzIGZyb20gYSBwdWInLCAoKSA9PiB7XG4gICAgY29uc3QgcHViQnl0ZXMgPSBVdGlscy5nZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyhwdWIpO1xuICAgIGNvbnN0IGJ5dGVzID0gVXRpbHMuZ2V0UmF3QWRkcmVzc0Zyb21QdWJLZXkocHViQnl0ZXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYnl0ZXMsIGFkZHJCeXRlcyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4RW5jb2RlZE1lc3NhZ2UgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMudmVyaWZ5U2lnbmF0dXJlKGhleEVuY29kZWRNZXNzYWdlLCBiYXNlNTgsIHNpZ25lZFN0cmluZywgdHJ1ZSksIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0eHQsIGJhc2U1OCwgc2lnbmVkU3RyaW5nLCB0cnVlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgaW4gYmFzZTU4JywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZShoZXhFbmNvZGVkU3RyaW5nLCBhZGRyZXNzSGV4LCBzaWduZWRTdHJpbmcsIHRydWUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25lZCBtZXNzYWdlIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBoZXhFbmNvZGVkU3RyaW5nID0gQnVmZmVyLmZyb20odHh0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoaGV4RW5jb2RlZFN0cmluZywgYmFzZTU4LCAnYWJjJywgdHJ1ZSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cmFuc2FjdGlvbiBkYXRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbihVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YV9oZXgpO1xuICAgIGFzc2VydC5lcXVhbChkYXRhLnRpbWVzdGFtcCwgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEudGltZXN0YW1wKTtcbiAgICBhc3NlcnQuZXF1YWwoZGF0YS5leHBpcmF0aW9uLCBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS5leHBpcmF0aW9uKTtcbiAgICBhc3NlcnQub2soZGF0YS5jb250cmFjdHMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhIHRyYW5zZmVyIGNvbnRyYWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4ID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHg7XG4gICAgY29uc3QgcmF3VHggPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbih0eC5yYXdfZGF0YV9oZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlO1xuICAgIGNvbnN0IHBhcnNlZENvbnRyYWN0ID0gVXRpbHMuZGVjb2RlVHJhbnNmZXJDb250cmFjdChcbiAgICAgIHJhd1R4LmNvbnRyYWN0c1swXS5wYXJhbWV0ZXIudmFsdWVcbiAgICApIGFzIEludGVyZmFjZS5UcmFuc2ZlckNvbnRyYWN0W107XG5cbiAgICBjb25zdCB0b0FkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS50b19hZGRyZXNzKTtcbiAgICBjb25zdCBvd25lckFkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS5vd25lcl9hZGRyZXNzKTtcbiAgICBjb25zdCBhbW91bnQgPSB2YWx1ZS5hbW91bnQ7XG5cbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkQ29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnRvX2FkZHJlc3MsIHRvQWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZENvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5vd25lcl9hZGRyZXNzLCBvd25lckFkZHJlc3MpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRDb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUuYW1vdW50LCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhbiBBY2NvdW50UGVybWlzc2lvblVwZGF0ZSBDb250cmFjdCcsICgpID0+IHtcbiAgICBjb25zdCB0eCA9IFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeDtcbiAgICBjb25zdCB2YWx1ZSA9IHR4LnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZTtcbiAgICBjb25zdCByYXdUeCA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKHR4LnJhd19kYXRhX2hleCk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBVdGlscy5kZWNvZGVBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0KFxuICAgICAgcmF3VHguY29udHJhY3RzWzBdLnBhcmFtZXRlci52YWx1ZVxuICAgICkgYXMgSW50ZXJmYWNlLkFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3Q7XG4gICAgY29uc3Qgb3duZXJBZGRyZXNzID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodmFsdWUub3duZXJfYWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyQWRkcmVzcywgb3duZXJBZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXIudHlwZSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyLnRocmVzaG9sZCwgMik7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4LmFjdGl2ZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50eXBlLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50aHJlc2hvbGQsIDIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEgcGFyYW1ldGVycyBmb3IgdHJhbnNmZXInLCAoKSA9PiB7XG4gICAgY29uc3QgdHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddO1xuICAgIGNvbnN0IGFtb3VudCA9ICcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICBjb25zdCB2YWx1ZXMgPSBbYWRkcmVzc0hleCwgYW1vdW50XTtcbiAgICBjb25zdCBtZXRob2RJZCA9ICcweGE5MDU5Y2JiJztcbiAgICBjb25zdCBkYXRhID0gVXRpbHMuZW5jb2RlRGF0YVBhcmFtcyh0eXBlcywgdmFsdWVzLCBtZXRob2RJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgZGF0YSxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IFV0aWxzLmRlY29kZURhdGFQYXJhbXMoXG4gICAgICB0eXBlcyxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKGRlY29kZWREYXRhWzBdLCBhZGRyZXNzSGV4LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIGFzc2VydC5lcXVhbChkZWNvZGVkRGF0YVsxXS50b1N0cmluZygpLCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBtYXAgdGVzdG5ldCBhbmQgbWFpbm5ldCB0b2tlbnMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKCdUU1NNSFllVjJ1RTlxWUg5NURxeW9DdU5DekVMMU52VTNTJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3Nlcy5pbmNsdWRlcygnVEdrZlVzaGRiQWlOajVHMW15bnAybWVxMkJmRjZYU0dQZicpLCB0cnVlKTtcbiAgfSk7XG59KTtcbiJdfQ==