@hsuite/native-connect-angular 1.0.0 → 2.1.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.
- package/coverage/coverage-summary.json +49 -49
- package/coverage/index.html +122 -122
- package/coverage/lcov-report/index.html +122 -122
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/index.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
- package/coverage/lcov-report/lib/index.html +1 -1
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
- package/coverage/lcov-report/lib/models/index.html +1 -1
- package/coverage/lcov-report/lib/models/provider-types.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/index.html +18 -18
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +20 -20
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
- package/coverage/lcov-report/lib/services/index.html +31 -31
- package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +43 -43
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -7
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +7 -10
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
- package/coverage/lcov-report/lib/transports/index.html +1 -1
- package/coverage/lcov-report/lib/utils/index.html +1 -1
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +1 -1
- package/coverage/lcov.info +14420 -14977
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-list/index.html +1 -1
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/index.html +1 -1
- package/coverage/lib/components/wallet-account-display/index.html +1 -1
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connect-button/index.html +21 -21
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
- package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
- package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
- package/coverage/lib/components/wallet-session-display/index.html +1 -1
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
- package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
- package/coverage/lib/directives/index.html +1 -1
- package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
- package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
- package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
- package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
- package/coverage/lib/index.html +1 -1
- package/coverage/lib/models/connection-config.model.ts.html +1 -1
- package/coverage/lib/models/index.html +1 -1
- package/coverage/lib/models/provider-types.ts.html +1 -1
- package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
- package/coverage/lib/providers/hsuite-native/index.html +19 -19
- package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
- package/coverage/lib/providers/index.html +18 -18
- package/coverage/lib/providers/p2p-native/index.html +20 -20
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
- package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
- package/coverage/lib/providers/walletconnect/core/index.html +65 -65
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
- package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
- package/coverage/lib/services/index.html +31 -31
- package/coverage/lib/services/logger.service.ts.html +4 -4
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
- package/coverage/lib/services/transaction-builders/index.html +43 -43
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
- package/coverage/lib/services/transaction.service.ts.html +4 -7
- package/coverage/lib/services/unified-wallet.service.ts.html +7 -10
- package/coverage/lib/services/wallet-context.service.ts.html +1 -1
- package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
- package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
- package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
- package/coverage/lib/transports/index.html +1 -1
- package/coverage/lib/utils/index.html +1 -1
- package/coverage/lib/utils/ledger-icons.util.ts.html +1 -1
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +85 -20
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
- package/dist/index.d.ts +33 -3
- package/package.json +4 -4
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +84 -19
- package/src/lib/services/transaction.service.ts +0 -1
- package/src/lib/services/unified-wallet.service.ts +0 -1
- package/src/lib/services/wallet-providers.service.ts +0 -1
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>0/1285</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>0/1</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>0/1</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>0/1285</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -1348,876 +1348,8 @@
|
|
|
1348
1348
|
<a name='L1283'></a><a href='#L1283'>1283</a>
|
|
1349
1349
|
<a name='L1284'></a><a href='#L1284'>1284</a>
|
|
1350
1350
|
<a name='L1285'></a><a href='#L1285'>1285</a>
|
|
1351
|
-
<a name='L1286'></a><a href='#L1286'>1286</a></td><td class="line-coverage quiet"><span class="cline-any cline-
|
|
1352
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1353
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1354
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1355
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1356
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1357
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1358
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1359
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1360
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1361
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1362
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1363
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1364
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1365
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1366
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1367
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1368
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1369
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1370
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1371
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1372
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1373
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1374
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1375
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1376
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1377
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1378
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1379
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1380
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1381
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1382
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1383
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1384
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1385
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1386
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1387
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1388
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1389
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1390
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1391
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1392
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1393
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1394
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1395
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1396
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1397
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1398
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1399
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1400
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1401
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1402
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1403
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1404
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1405
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1406
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1407
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1408
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1409
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1410
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1411
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1412
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1413
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1414
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1415
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1416
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1417
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1418
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1419
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1420
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1421
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1422
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1423
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1424
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1425
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1426
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1427
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1428
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1429
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1430
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1431
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1432
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1433
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1434
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1435
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1436
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1437
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1438
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1439
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1440
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1441
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1442
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1443
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1444
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1445
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1446
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1447
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1448
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1449
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1450
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1451
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1452
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1453
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1454
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1455
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1456
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1457
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1458
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1459
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1460
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1461
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1462
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1463
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1464
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1465
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1466
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1467
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1468
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1469
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1470
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1471
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1472
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1473
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1474
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1475
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1476
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1477
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1478
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1479
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1480
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1481
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1482
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1483
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1484
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1485
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1486
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1487
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1488
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1489
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1490
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1491
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1492
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1493
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1494
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1495
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1496
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1497
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1498
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1499
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1500
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1501
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1502
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1503
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1504
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1505
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1506
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1507
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1508
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1509
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1510
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1511
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1512
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1513
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1514
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1515
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1516
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1517
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1518
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1519
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1520
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1521
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1522
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1523
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1524
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1525
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1526
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1527
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1528
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1529
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1530
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1531
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1532
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1533
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1534
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1535
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1536
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1537
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1538
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1539
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1540
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1541
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1542
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1543
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1544
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1545
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1546
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1547
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1548
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1549
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1550
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1551
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1552
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1553
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1554
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1555
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1556
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1557
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1558
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1559
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1560
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1561
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1562
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1563
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1564
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1565
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1566
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1567
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1568
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1569
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1570
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1571
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1572
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1573
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1574
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1575
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1576
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1577
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1578
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1579
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1580
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1581
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1582
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1583
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1584
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1585
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1586
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1587
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1588
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1589
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1590
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1591
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1592
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1593
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1594
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1595
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1596
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1597
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1598
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1599
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1600
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1601
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1602
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1603
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1604
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1605
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1606
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1607
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1608
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1609
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1610
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1611
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1612
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1613
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1614
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1615
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1616
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1617
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1618
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1619
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1620
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1621
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1622
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1623
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1624
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1625
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1626
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1627
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1628
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1629
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1630
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1631
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1632
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1633
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1634
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1635
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1636
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1637
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1638
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1639
|
-
<span class="cline-any cline-yes">42x</span>
|
|
1640
|
-
<span class="cline-any cline-yes">42x</span>
|
|
1641
|
-
<span class="cline-any cline-yes">42x</span>
|
|
1642
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1643
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1644
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1645
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1646
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1647
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1648
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1649
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1650
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1651
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1652
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1653
|
-
<span class="cline-any cline-yes">67x</span>
|
|
1654
|
-
<span class="cline-any cline-yes">40x</span>
|
|
1655
|
-
<span class="cline-any cline-yes">40x</span>
|
|
1656
|
-
<span class="cline-any cline-yes">27x</span>
|
|
1657
|
-
<span class="cline-any cline-yes">27x</span>
|
|
1658
|
-
<span class="cline-any cline-yes">67x</span>
|
|
1659
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1660
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1661
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1662
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1663
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1664
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1665
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1666
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1667
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1668
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1669
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1670
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1671
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1672
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1673
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1674
|
-
<span class="cline-any cline-no"> </span>
|
|
1675
|
-
<span class="cline-any cline-no"> </span>
|
|
1676
|
-
<span class="cline-any cline-yes">67x</span>
|
|
1677
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1678
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1679
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1680
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1681
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1682
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1683
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1684
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1685
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1686
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1687
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1688
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1689
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1690
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1691
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1692
|
-
<span class="cline-any cline-no"> </span>
|
|
1693
|
-
<span class="cline-any cline-no"> </span>
|
|
1694
|
-
<span class="cline-any cline-no"> </span>
|
|
1695
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1696
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1697
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1698
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1699
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1700
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1701
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1702
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1703
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1704
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1705
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1706
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1707
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1708
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1709
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1710
|
-
<span class="cline-any cline-no"> </span>
|
|
1711
|
-
<span class="cline-any cline-no"> </span>
|
|
1712
|
-
<span class="cline-any cline-no"> </span>
|
|
1713
|
-
<span class="cline-any cline-no"> </span>
|
|
1714
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1715
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1716
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1717
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1718
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1719
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1720
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1721
|
-
<span class="cline-any cline-no"> </span>
|
|
1722
|
-
<span class="cline-any cline-no"> </span>
|
|
1723
|
-
<span class="cline-any cline-no"> </span>
|
|
1724
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1725
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1726
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1727
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1728
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1729
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1730
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1731
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1732
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1733
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1734
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1735
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1736
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1737
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1738
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1739
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1740
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1741
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1742
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1743
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1744
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1745
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1746
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1747
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1748
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1749
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1750
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1751
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1752
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1753
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1754
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1755
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1756
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1757
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1758
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1759
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1760
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1761
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1762
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1763
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1764
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1765
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1766
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1767
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1768
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1769
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1770
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1771
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1772
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1773
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1774
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1775
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1776
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1777
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1778
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1779
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1780
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1781
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1782
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1783
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1784
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1785
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1786
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1787
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1788
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1789
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1790
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1791
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1792
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1793
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1794
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1795
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1796
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1797
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1798
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1799
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1800
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1801
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1802
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1803
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1804
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1805
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1806
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1807
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1808
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1809
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1810
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1811
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1812
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1813
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1814
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1815
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1816
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1817
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1818
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1819
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1820
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1821
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1822
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1823
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1824
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1825
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1826
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1827
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1828
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1829
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1830
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1831
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1832
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1833
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1834
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1835
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1836
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1837
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1838
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1839
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1840
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1841
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1842
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1843
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1844
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1845
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1846
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1847
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1848
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1849
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1850
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1851
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1852
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1853
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1854
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1855
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1856
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1857
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1858
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1859
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1860
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1861
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1862
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1863
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1864
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1865
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1866
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1867
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1868
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1869
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1870
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1871
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1872
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1873
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1874
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1875
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1876
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1877
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1878
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1879
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1880
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1881
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1882
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1883
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1884
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1885
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1886
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1887
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1888
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1889
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1890
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1891
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1892
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1893
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1894
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1895
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1896
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1897
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1898
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1899
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1900
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1901
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1902
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1903
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1904
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1905
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1906
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1907
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1908
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1909
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1910
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1911
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1912
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1913
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1914
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1915
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1916
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1917
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1918
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1919
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1920
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1921
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1922
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1923
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1924
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1925
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1926
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1927
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1928
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1929
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1930
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1931
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1932
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1933
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1934
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1935
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1936
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1937
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1938
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1939
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1940
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1941
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1942
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1943
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1944
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1945
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1946
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1947
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1948
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1949
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1950
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1951
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1952
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1953
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1954
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1955
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1956
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1957
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1958
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1959
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1960
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1961
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1962
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1963
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1964
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1965
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1966
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1967
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1968
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1969
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1970
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1971
|
-
<span class="cline-any cline-yes">45x</span>
|
|
1972
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1973
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1974
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1975
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1976
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1977
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1978
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1979
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1980
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1981
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1982
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1983
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1984
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1985
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1986
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1987
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1988
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1989
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1990
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1991
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1992
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1993
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1994
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1995
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1996
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1997
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1998
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1999
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2000
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2001
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2002
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2003
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2004
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2005
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2006
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2007
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2008
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2009
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2010
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2011
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2012
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2013
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2014
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2015
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2016
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2017
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2018
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2019
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2020
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2021
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2022
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2023
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2024
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2025
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2026
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2027
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2028
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2029
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2030
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2031
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2032
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2033
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2034
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2035
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2036
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2037
|
-
<span class="cline-any cline-no"> </span>
|
|
2038
|
-
<span class="cline-any cline-no"> </span>
|
|
2039
|
-
<span class="cline-any cline-no"> </span>
|
|
2040
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2041
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2042
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2043
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2044
|
-
<span class="cline-any cline-no"> </span>
|
|
2045
|
-
<span class="cline-any cline-no"> </span>
|
|
2046
|
-
<span class="cline-any cline-no"> </span>
|
|
2047
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2048
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2049
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2050
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2051
|
-
<span class="cline-any cline-no"> </span>
|
|
2052
|
-
<span class="cline-any cline-no"> </span>
|
|
2053
|
-
<span class="cline-any cline-no"> </span>
|
|
2054
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2055
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2056
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2057
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2058
|
-
<span class="cline-any cline-no"> </span>
|
|
2059
|
-
<span class="cline-any cline-no"> </span>
|
|
2060
|
-
<span class="cline-any cline-no"> </span>
|
|
2061
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2062
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2063
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2064
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2065
|
-
<span class="cline-any cline-no"> </span>
|
|
2066
|
-
<span class="cline-any cline-no"> </span>
|
|
2067
|
-
<span class="cline-any cline-no"> </span>
|
|
2068
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2069
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2070
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2071
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2072
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2073
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2074
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2075
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2076
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2077
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2078
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2079
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2080
|
-
<span class="cline-any cline-no"> </span>
|
|
2081
|
-
<span class="cline-any cline-no"> </span>
|
|
2082
|
-
<span class="cline-any cline-no"> </span>
|
|
2083
|
-
<span class="cline-any cline-no"> </span>
|
|
2084
|
-
<span class="cline-any cline-no"> </span>
|
|
2085
|
-
<span class="cline-any cline-no"> </span>
|
|
2086
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2087
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2088
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2089
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2090
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2091
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2092
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2093
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2094
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2095
|
-
<span class="cline-any cline-no"> </span>
|
|
2096
|
-
<span class="cline-any cline-no"> </span>
|
|
2097
|
-
<span class="cline-any cline-no"> </span>
|
|
2098
|
-
<span class="cline-any cline-no"> </span>
|
|
2099
|
-
<span class="cline-any cline-no"> </span>
|
|
2100
|
-
<span class="cline-any cline-no"> </span>
|
|
2101
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2102
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2103
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2104
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2105
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2106
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2107
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2108
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2109
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2110
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2111
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2112
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2113
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2114
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2115
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2116
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2117
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2118
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2119
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2120
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2121
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2122
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2123
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2124
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2125
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2126
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2127
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2128
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2129
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2130
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2131
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2132
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2133
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2134
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2135
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2136
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2137
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2138
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2139
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2140
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2141
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2142
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2143
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2144
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2145
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2146
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2147
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2148
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2149
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2150
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2151
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2152
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2153
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2154
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2155
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2156
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2157
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2158
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2159
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2160
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2161
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2162
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2163
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2164
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2165
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2166
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2167
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2168
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2169
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2170
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2171
|
-
<span class="cline-any cline-no"> </span>
|
|
2172
|
-
<span class="cline-any cline-no"> </span>
|
|
2173
|
-
<span class="cline-any cline-no"> </span>
|
|
2174
|
-
<span class="cline-any cline-no"> </span>
|
|
2175
|
-
<span class="cline-any cline-no"> </span>
|
|
2176
|
-
<span class="cline-any cline-no"> </span>
|
|
2177
|
-
<span class="cline-any cline-no"> </span>
|
|
2178
|
-
<span class="cline-any cline-no"> </span>
|
|
2179
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2180
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2181
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2182
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2183
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2184
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2185
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2186
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2187
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2188
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2189
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2190
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2191
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2192
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2193
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2194
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2195
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2196
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2197
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2198
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2199
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1351
|
+
<a name='L1286'></a><a href='#L1286'>1286</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
2200
1352
|
<span class="cline-any cline-no"> </span>
|
|
2201
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2202
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2203
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2204
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2205
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2206
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2207
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2208
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2209
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2210
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2211
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2212
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2213
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2214
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2215
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2216
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2217
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2218
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2219
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2220
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2221
1353
|
<span class="cline-any cline-no"> </span>
|
|
2222
1354
|
<span class="cline-any cline-no"> </span>
|
|
2223
1355
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2225,46 +1357,6 @@
|
|
|
2225
1357
|
<span class="cline-any cline-no"> </span>
|
|
2226
1358
|
<span class="cline-any cline-no"> </span>
|
|
2227
1359
|
<span class="cline-any cline-no"> </span>
|
|
2228
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2229
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2230
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2231
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2232
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2233
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2234
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2235
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2236
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2237
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2238
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2239
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2240
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2241
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2242
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2243
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2244
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2245
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2246
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2247
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2248
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2249
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2250
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2251
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2252
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2253
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2254
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2255
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2256
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2257
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2258
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2259
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2260
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2261
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2262
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2263
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2264
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2265
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2266
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2267
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2268
1360
|
<span class="cline-any cline-no"> </span>
|
|
2269
1361
|
<span class="cline-any cline-no"> </span>
|
|
2270
1362
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2344,63 +1436,8 @@
|
|
|
2344
1436
|
<span class="cline-any cline-no"> </span>
|
|
2345
1437
|
<span class="cline-any cline-no"> </span>
|
|
2346
1438
|
<span class="cline-any cline-no"> </span>
|
|
2347
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2348
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2349
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2350
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2351
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2352
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2353
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2354
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2355
|
-
<span class="cline-any cline-yes">45x</span>
|
|
2356
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2357
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2358
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2359
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2360
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2361
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2362
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2363
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2364
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2365
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2366
1439
|
<span class="cline-any cline-no"> </span>
|
|
2367
1440
|
<span class="cline-any cline-no"> </span>
|
|
2368
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2369
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2370
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2371
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2372
|
-
<span class="cline-any cline-yes">7x</span>
|
|
2373
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2374
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2375
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2376
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2377
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2378
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2379
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2380
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2381
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2382
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2383
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2384
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2385
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2386
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2387
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2388
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2389
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2390
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2391
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2392
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2393
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2394
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2395
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2396
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2397
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2398
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2399
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2400
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2401
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2402
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2403
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2404
1441
|
<span class="cline-any cline-no"> </span>
|
|
2405
1442
|
<span class="cline-any cline-no"> </span>
|
|
2406
1443
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2411,17 +1448,6 @@
|
|
|
2411
1448
|
<span class="cline-any cline-no"> </span>
|
|
2412
1449
|
<span class="cline-any cline-no"> </span>
|
|
2413
1450
|
<span class="cline-any cline-no"> </span>
|
|
2414
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2415
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2416
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2417
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2418
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2419
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2420
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2421
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2422
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2423
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2424
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2425
1451
|
<span class="cline-any cline-no"> </span>
|
|
2426
1452
|
<span class="cline-any cline-no"> </span>
|
|
2427
1453
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2429,8 +1455,6 @@
|
|
|
2429
1455
|
<span class="cline-any cline-no"> </span>
|
|
2430
1456
|
<span class="cline-any cline-no"> </span>
|
|
2431
1457
|
<span class="cline-any cline-no"> </span>
|
|
2432
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2433
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2434
1458
|
<span class="cline-any cline-no"> </span>
|
|
2435
1459
|
<span class="cline-any cline-no"> </span>
|
|
2436
1460
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2452,31 +1476,7 @@
|
|
|
2452
1476
|
<span class="cline-any cline-no"> </span>
|
|
2453
1477
|
<span class="cline-any cline-no"> </span>
|
|
2454
1478
|
<span class="cline-any cline-no"> </span>
|
|
2455
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2456
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2457
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2458
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2459
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2460
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2461
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2462
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2463
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2464
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2465
1479
|
<span class="cline-any cline-no"> </span>
|
|
2466
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2467
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2468
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2469
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2470
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2471
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2472
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2473
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2474
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2475
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2476
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2477
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2478
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2479
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2480
1480
|
<span class="cline-any cline-no"> </span>
|
|
2481
1481
|
<span class="cline-any cline-no"> </span>
|
|
2482
1482
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2492,8 +1492,6 @@
|
|
|
2492
1492
|
<span class="cline-any cline-no"> </span>
|
|
2493
1493
|
<span class="cline-any cline-no"> </span>
|
|
2494
1494
|
<span class="cline-any cline-no"> </span>
|
|
2495
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2496
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2497
1495
|
<span class="cline-any cline-no"> </span>
|
|
2498
1496
|
<span class="cline-any cline-no"> </span>
|
|
2499
1497
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2504,8 +1502,6 @@
|
|
|
2504
1502
|
<span class="cline-any cline-no"> </span>
|
|
2505
1503
|
<span class="cline-any cline-no"> </span>
|
|
2506
1504
|
<span class="cline-any cline-no"> </span>
|
|
2507
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2508
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2509
1505
|
<span class="cline-any cline-no"> </span>
|
|
2510
1506
|
<span class="cline-any cline-no"> </span>
|
|
2511
1507
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2513,8 +1509,6 @@
|
|
|
2513
1509
|
<span class="cline-any cline-no"> </span>
|
|
2514
1510
|
<span class="cline-any cline-no"> </span>
|
|
2515
1511
|
<span class="cline-any cline-no"> </span>
|
|
2516
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2517
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2518
1512
|
<span class="cline-any cline-no"> </span>
|
|
2519
1513
|
<span class="cline-any cline-no"> </span>
|
|
2520
1514
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2526,8 +1520,6 @@
|
|
|
2526
1520
|
<span class="cline-any cline-no"> </span>
|
|
2527
1521
|
<span class="cline-any cline-no"> </span>
|
|
2528
1522
|
<span class="cline-any cline-no"> </span>
|
|
2529
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2530
|
-
<span class="cline-any cline-yes">9x</span>
|
|
2531
1523
|
<span class="cline-any cline-no"> </span>
|
|
2532
1524
|
<span class="cline-any cline-no"> </span>
|
|
2533
1525
|
<span class="cline-any cline-no"> </span>
|
|
@@ -2542,917 +1534,1925 @@
|
|
|
2542
1534
|
<span class="cline-any cline-no"> </span>
|
|
2543
1535
|
<span class="cline-any cline-no"> </span>
|
|
2544
1536
|
<span class="cline-any cline-no"> </span>
|
|
2545
|
-
<span class="cline-any cline-
|
|
2546
|
-
<span class="cline-any cline-
|
|
2547
|
-
<span class="cline-any cline-
|
|
2548
|
-
<span class="cline-any cline-
|
|
2549
|
-
<span class="cline-any cline-
|
|
2550
|
-
<span class="cline-any cline-
|
|
2551
|
-
<span class="cline-any cline-
|
|
2552
|
-
<span class="cline-any cline-
|
|
2553
|
-
<span class="cline-any cline-
|
|
2554
|
-
<span class="cline-any cline-
|
|
2555
|
-
<span class="cline-any cline-
|
|
2556
|
-
<span class="cline-any cline-
|
|
2557
|
-
<span class="cline-any cline-
|
|
2558
|
-
<span class="cline-any cline-
|
|
2559
|
-
<span class="cline-any cline-
|
|
2560
|
-
<span class="cline-any cline-
|
|
2561
|
-
<span class="cline-any cline-
|
|
2562
|
-
<span class="cline-any cline-
|
|
2563
|
-
<span class="cline-any cline-
|
|
2564
|
-
<span class="cline-any cline-
|
|
2565
|
-
<span class="cline-any cline-
|
|
2566
|
-
<span class="cline-any cline-
|
|
2567
|
-
<span class="cline-any cline-
|
|
2568
|
-
<span class="cline-any cline-
|
|
2569
|
-
<span class="cline-any cline-
|
|
2570
|
-
<span class="cline-any cline-
|
|
2571
|
-
<span class="cline-any cline-
|
|
2572
|
-
<span class="cline-any cline-
|
|
2573
|
-
<span class="cline-any cline-
|
|
2574
|
-
<span class="cline-any cline-
|
|
2575
|
-
<span class="cline-any cline-
|
|
2576
|
-
<span class="cline-any cline-
|
|
2577
|
-
<span class="cline-any cline-
|
|
2578
|
-
<span class="cline-any cline-
|
|
2579
|
-
<span class="cline-any cline-
|
|
2580
|
-
<span class="cline-any cline-
|
|
2581
|
-
<span class="cline-any cline-
|
|
2582
|
-
<span class="cline-any cline-
|
|
2583
|
-
<span class="cline-any cline-
|
|
2584
|
-
<span class="cline-any cline-
|
|
2585
|
-
<span class="cline-any cline-
|
|
2586
|
-
<span class="cline-any cline-
|
|
2587
|
-
<span class="cline-any cline-
|
|
2588
|
-
<span class="cline-any cline-
|
|
2589
|
-
<span class="cline-any cline-
|
|
2590
|
-
<span class="cline-any cline-
|
|
2591
|
-
<span class="cline-any cline-
|
|
2592
|
-
<span class="cline-any cline-
|
|
2593
|
-
<span class="cline-any cline-
|
|
2594
|
-
<span class="cline-any cline-
|
|
2595
|
-
<span class="cline-any cline-
|
|
2596
|
-
<span class="cline-any cline-
|
|
2597
|
-
<span class="cline-any cline-
|
|
2598
|
-
<span class="cline-any cline-
|
|
2599
|
-
<span class="cline-any cline-
|
|
2600
|
-
<span class="cline-any cline-
|
|
2601
|
-
<span class="cline-any cline-
|
|
2602
|
-
<span class="cline-any cline-
|
|
2603
|
-
<span class="cline-any cline-
|
|
2604
|
-
<span class="cline-any cline-
|
|
2605
|
-
<span class="cline-any cline-
|
|
2606
|
-
<span class="cline-any cline-
|
|
2607
|
-
<span class="cline-any cline-
|
|
2608
|
-
<span class="cline-any cline-
|
|
2609
|
-
<span class="cline-any cline-
|
|
2610
|
-
<span class="cline-any cline-
|
|
2611
|
-
<span class="cline-any cline-
|
|
2612
|
-
<span class="cline-any cline-
|
|
2613
|
-
<span class="cline-any cline-
|
|
2614
|
-
<span class="cline-any cline-
|
|
2615
|
-
<span class="cline-any cline-
|
|
2616
|
-
<span class="cline-any cline-
|
|
2617
|
-
<span class="cline-any cline-
|
|
2618
|
-
<span class="cline-any cline-
|
|
2619
|
-
<span class="cline-any cline-
|
|
2620
|
-
<span class="cline-any cline-
|
|
2621
|
-
<span class="cline-any cline-
|
|
2622
|
-
<span class="cline-any cline-
|
|
2623
|
-
<span class="cline-any cline-
|
|
2624
|
-
<span class="cline-any cline-
|
|
2625
|
-
<span class="cline-any cline-
|
|
2626
|
-
<span class="cline-any cline-
|
|
2627
|
-
<span class="cline-any cline-
|
|
2628
|
-
<span class="cline-any cline-no"> </span>
|
|
2629
|
-
<span class="cline-any cline-no"> </span>
|
|
2630
|
-
<span class="cline-any cline-no"> </span>
|
|
2631
|
-
<span class="cline-any cline-no"> </span>
|
|
2632
|
-
<span class="cline-any cline-no"> </span>
|
|
2633
|
-
<span class="cline-any cline-no"> </span>
|
|
2634
|
-
<span class="cline-any cline-no"> </span>
|
|
2635
|
-
<span class="cline-any cline-
|
|
2636
|
-
<span class="cline-any cline-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
|
|
2790
|
-
|
|
2791
|
-
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
<span class="
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-no"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-no"> </span>
|
|
1555
|
+
<span class="cline-any cline-no"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-no"> </span>
|
|
1558
|
+
<span class="cline-any cline-no"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-no"> </span>
|
|
1567
|
+
<span class="cline-any cline-no"> </span>
|
|
1568
|
+
<span class="cline-any cline-no"> </span>
|
|
1569
|
+
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-no"> </span>
|
|
1575
|
+
<span class="cline-any cline-no"> </span>
|
|
1576
|
+
<span class="cline-any cline-no"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-no"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
1585
|
+
<span class="cline-any cline-no"> </span>
|
|
1586
|
+
<span class="cline-any cline-no"> </span>
|
|
1587
|
+
<span class="cline-any cline-no"> </span>
|
|
1588
|
+
<span class="cline-any cline-no"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-no"> </span>
|
|
1594
|
+
<span class="cline-any cline-no"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-no"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
1602
|
+
<span class="cline-any cline-no"> </span>
|
|
1603
|
+
<span class="cline-any cline-no"> </span>
|
|
1604
|
+
<span class="cline-any cline-no"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-no"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-no"> </span>
|
|
1613
|
+
<span class="cline-any cline-no"> </span>
|
|
1614
|
+
<span class="cline-any cline-no"> </span>
|
|
1615
|
+
<span class="cline-any cline-no"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-no"> </span>
|
|
1618
|
+
<span class="cline-any cline-no"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </span>
|
|
1620
|
+
<span class="cline-any cline-no"> </span>
|
|
1621
|
+
<span class="cline-any cline-no"> </span>
|
|
1622
|
+
<span class="cline-any cline-no"> </span>
|
|
1623
|
+
<span class="cline-any cline-no"> </span>
|
|
1624
|
+
<span class="cline-any cline-no"> </span>
|
|
1625
|
+
<span class="cline-any cline-no"> </span>
|
|
1626
|
+
<span class="cline-any cline-no"> </span>
|
|
1627
|
+
<span class="cline-any cline-no"> </span>
|
|
1628
|
+
<span class="cline-any cline-no"> </span>
|
|
1629
|
+
<span class="cline-any cline-no"> </span>
|
|
1630
|
+
<span class="cline-any cline-no"> </span>
|
|
1631
|
+
<span class="cline-any cline-no"> </span>
|
|
1632
|
+
<span class="cline-any cline-no"> </span>
|
|
1633
|
+
<span class="cline-any cline-no"> </span>
|
|
1634
|
+
<span class="cline-any cline-no"> </span>
|
|
1635
|
+
<span class="cline-any cline-no"> </span>
|
|
1636
|
+
<span class="cline-any cline-no"> </span>
|
|
1637
|
+
<span class="cline-any cline-no"> </span>
|
|
1638
|
+
<span class="cline-any cline-no"> </span>
|
|
1639
|
+
<span class="cline-any cline-no"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-no"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </span>
|
|
1644
|
+
<span class="cline-any cline-no"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-no"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-no"> </span>
|
|
1649
|
+
<span class="cline-any cline-no"> </span>
|
|
1650
|
+
<span class="cline-any cline-no"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-no"> </span>
|
|
1653
|
+
<span class="cline-any cline-no"> </span>
|
|
1654
|
+
<span class="cline-any cline-no"> </span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-no"> </span>
|
|
1658
|
+
<span class="cline-any cline-no"> </span>
|
|
1659
|
+
<span class="cline-any cline-no"> </span>
|
|
1660
|
+
<span class="cline-any cline-no"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-no"> </span>
|
|
1663
|
+
<span class="cline-any cline-no"> </span>
|
|
1664
|
+
<span class="cline-any cline-no"> </span>
|
|
1665
|
+
<span class="cline-any cline-no"> </span>
|
|
1666
|
+
<span class="cline-any cline-no"> </span>
|
|
1667
|
+
<span class="cline-any cline-no"> </span>
|
|
1668
|
+
<span class="cline-any cline-no"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-no"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-no"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-no"> </span>
|
|
1676
|
+
<span class="cline-any cline-no"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-no"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-no"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-no"> </span>
|
|
1683
|
+
<span class="cline-any cline-no"> </span>
|
|
1684
|
+
<span class="cline-any cline-no"> </span>
|
|
1685
|
+
<span class="cline-any cline-no"> </span>
|
|
1686
|
+
<span class="cline-any cline-no"> </span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-no"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-no"> </span>
|
|
1691
|
+
<span class="cline-any cline-no"> </span>
|
|
1692
|
+
<span class="cline-any cline-no"> </span>
|
|
1693
|
+
<span class="cline-any cline-no"> </span>
|
|
1694
|
+
<span class="cline-any cline-no"> </span>
|
|
1695
|
+
<span class="cline-any cline-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-no"> </span>
|
|
1697
|
+
<span class="cline-any cline-no"> </span>
|
|
1698
|
+
<span class="cline-any cline-no"> </span>
|
|
1699
|
+
<span class="cline-any cline-no"> </span>
|
|
1700
|
+
<span class="cline-any cline-no"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-no"> </span>
|
|
1703
|
+
<span class="cline-any cline-no"> </span>
|
|
1704
|
+
<span class="cline-any cline-no"> </span>
|
|
1705
|
+
<span class="cline-any cline-no"> </span>
|
|
1706
|
+
<span class="cline-any cline-no"> </span>
|
|
1707
|
+
<span class="cline-any cline-no"> </span>
|
|
1708
|
+
<span class="cline-any cline-no"> </span>
|
|
1709
|
+
<span class="cline-any cline-no"> </span>
|
|
1710
|
+
<span class="cline-any cline-no"> </span>
|
|
1711
|
+
<span class="cline-any cline-no"> </span>
|
|
1712
|
+
<span class="cline-any cline-no"> </span>
|
|
1713
|
+
<span class="cline-any cline-no"> </span>
|
|
1714
|
+
<span class="cline-any cline-no"> </span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-no"> </span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-no"> </span>
|
|
1724
|
+
<span class="cline-any cline-no"> </span>
|
|
1725
|
+
<span class="cline-any cline-no"> </span>
|
|
1726
|
+
<span class="cline-any cline-no"> </span>
|
|
1727
|
+
<span class="cline-any cline-no"> </span>
|
|
1728
|
+
<span class="cline-any cline-no"> </span>
|
|
1729
|
+
<span class="cline-any cline-no"> </span>
|
|
1730
|
+
<span class="cline-any cline-no"> </span>
|
|
1731
|
+
<span class="cline-any cline-no"> </span>
|
|
1732
|
+
<span class="cline-any cline-no"> </span>
|
|
1733
|
+
<span class="cline-any cline-no"> </span>
|
|
1734
|
+
<span class="cline-any cline-no"> </span>
|
|
1735
|
+
<span class="cline-any cline-no"> </span>
|
|
1736
|
+
<span class="cline-any cline-no"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-no"> </span>
|
|
1739
|
+
<span class="cline-any cline-no"> </span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-no"> </span>
|
|
1744
|
+
<span class="cline-any cline-no"> </span>
|
|
1745
|
+
<span class="cline-any cline-no"> </span>
|
|
1746
|
+
<span class="cline-any cline-no"> </span>
|
|
1747
|
+
<span class="cline-any cline-no"> </span>
|
|
1748
|
+
<span class="cline-any cline-no"> </span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-no"> </span>
|
|
1751
|
+
<span class="cline-any cline-no"> </span>
|
|
1752
|
+
<span class="cline-any cline-no"> </span>
|
|
1753
|
+
<span class="cline-any cline-no"> </span>
|
|
1754
|
+
<span class="cline-any cline-no"> </span>
|
|
1755
|
+
<span class="cline-any cline-no"> </span>
|
|
1756
|
+
<span class="cline-any cline-no"> </span>
|
|
1757
|
+
<span class="cline-any cline-no"> </span>
|
|
1758
|
+
<span class="cline-any cline-no"> </span>
|
|
1759
|
+
<span class="cline-any cline-no"> </span>
|
|
1760
|
+
<span class="cline-any cline-no"> </span>
|
|
1761
|
+
<span class="cline-any cline-no"> </span>
|
|
1762
|
+
<span class="cline-any cline-no"> </span>
|
|
1763
|
+
<span class="cline-any cline-no"> </span>
|
|
1764
|
+
<span class="cline-any cline-no"> </span>
|
|
1765
|
+
<span class="cline-any cline-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-no"> </span>
|
|
1767
|
+
<span class="cline-any cline-no"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-no"> </span>
|
|
1770
|
+
<span class="cline-any cline-no"> </span>
|
|
1771
|
+
<span class="cline-any cline-no"> </span>
|
|
1772
|
+
<span class="cline-any cline-no"> </span>
|
|
1773
|
+
<span class="cline-any cline-no"> </span>
|
|
1774
|
+
<span class="cline-any cline-no"> </span>
|
|
1775
|
+
<span class="cline-any cline-no"> </span>
|
|
1776
|
+
<span class="cline-any cline-no"> </span>
|
|
1777
|
+
<span class="cline-any cline-no"> </span>
|
|
1778
|
+
<span class="cline-any cline-no"> </span>
|
|
1779
|
+
<span class="cline-any cline-no"> </span>
|
|
1780
|
+
<span class="cline-any cline-no"> </span>
|
|
1781
|
+
<span class="cline-any cline-no"> </span>
|
|
1782
|
+
<span class="cline-any cline-no"> </span>
|
|
1783
|
+
<span class="cline-any cline-no"> </span>
|
|
1784
|
+
<span class="cline-any cline-no"> </span>
|
|
1785
|
+
<span class="cline-any cline-no"> </span>
|
|
1786
|
+
<span class="cline-any cline-no"> </span>
|
|
1787
|
+
<span class="cline-any cline-no"> </span>
|
|
1788
|
+
<span class="cline-any cline-no"> </span>
|
|
1789
|
+
<span class="cline-any cline-no"> </span>
|
|
1790
|
+
<span class="cline-any cline-no"> </span>
|
|
1791
|
+
<span class="cline-any cline-no"> </span>
|
|
1792
|
+
<span class="cline-any cline-no"> </span>
|
|
1793
|
+
<span class="cline-any cline-no"> </span>
|
|
1794
|
+
<span class="cline-any cline-no"> </span>
|
|
1795
|
+
<span class="cline-any cline-no"> </span>
|
|
1796
|
+
<span class="cline-any cline-no"> </span>
|
|
1797
|
+
<span class="cline-any cline-no"> </span>
|
|
1798
|
+
<span class="cline-any cline-no"> </span>
|
|
1799
|
+
<span class="cline-any cline-no"> </span>
|
|
1800
|
+
<span class="cline-any cline-no"> </span>
|
|
1801
|
+
<span class="cline-any cline-no"> </span>
|
|
1802
|
+
<span class="cline-any cline-no"> </span>
|
|
1803
|
+
<span class="cline-any cline-no"> </span>
|
|
1804
|
+
<span class="cline-any cline-no"> </span>
|
|
1805
|
+
<span class="cline-any cline-no"> </span>
|
|
1806
|
+
<span class="cline-any cline-no"> </span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-no"> </span>
|
|
1809
|
+
<span class="cline-any cline-no"> </span>
|
|
1810
|
+
<span class="cline-any cline-no"> </span>
|
|
1811
|
+
<span class="cline-any cline-no"> </span>
|
|
1812
|
+
<span class="cline-any cline-no"> </span>
|
|
1813
|
+
<span class="cline-any cline-no"> </span>
|
|
1814
|
+
<span class="cline-any cline-no"> </span>
|
|
1815
|
+
<span class="cline-any cline-no"> </span>
|
|
1816
|
+
<span class="cline-any cline-no"> </span>
|
|
1817
|
+
<span class="cline-any cline-no"> </span>
|
|
1818
|
+
<span class="cline-any cline-no"> </span>
|
|
1819
|
+
<span class="cline-any cline-no"> </span>
|
|
1820
|
+
<span class="cline-any cline-no"> </span>
|
|
1821
|
+
<span class="cline-any cline-no"> </span>
|
|
1822
|
+
<span class="cline-any cline-no"> </span>
|
|
1823
|
+
<span class="cline-any cline-no"> </span>
|
|
1824
|
+
<span class="cline-any cline-no"> </span>
|
|
1825
|
+
<span class="cline-any cline-no"> </span>
|
|
1826
|
+
<span class="cline-any cline-no"> </span>
|
|
1827
|
+
<span class="cline-any cline-no"> </span>
|
|
1828
|
+
<span class="cline-any cline-no"> </span>
|
|
1829
|
+
<span class="cline-any cline-no"> </span>
|
|
1830
|
+
<span class="cline-any cline-no"> </span>
|
|
1831
|
+
<span class="cline-any cline-no"> </span>
|
|
1832
|
+
<span class="cline-any cline-no"> </span>
|
|
1833
|
+
<span class="cline-any cline-no"> </span>
|
|
1834
|
+
<span class="cline-any cline-no"> </span>
|
|
1835
|
+
<span class="cline-any cline-no"> </span>
|
|
1836
|
+
<span class="cline-any cline-no"> </span>
|
|
1837
|
+
<span class="cline-any cline-no"> </span>
|
|
1838
|
+
<span class="cline-any cline-no"> </span>
|
|
1839
|
+
<span class="cline-any cline-no"> </span>
|
|
1840
|
+
<span class="cline-any cline-no"> </span>
|
|
1841
|
+
<span class="cline-any cline-no"> </span>
|
|
1842
|
+
<span class="cline-any cline-no"> </span>
|
|
1843
|
+
<span class="cline-any cline-no"> </span>
|
|
1844
|
+
<span class="cline-any cline-no"> </span>
|
|
1845
|
+
<span class="cline-any cline-no"> </span>
|
|
1846
|
+
<span class="cline-any cline-no"> </span>
|
|
1847
|
+
<span class="cline-any cline-no"> </span>
|
|
1848
|
+
<span class="cline-any cline-no"> </span>
|
|
1849
|
+
<span class="cline-any cline-no"> </span>
|
|
1850
|
+
<span class="cline-any cline-no"> </span>
|
|
1851
|
+
<span class="cline-any cline-no"> </span>
|
|
1852
|
+
<span class="cline-any cline-no"> </span>
|
|
1853
|
+
<span class="cline-any cline-no"> </span>
|
|
1854
|
+
<span class="cline-any cline-no"> </span>
|
|
1855
|
+
<span class="cline-any cline-no"> </span>
|
|
1856
|
+
<span class="cline-any cline-no"> </span>
|
|
1857
|
+
<span class="cline-any cline-no"> </span>
|
|
1858
|
+
<span class="cline-any cline-no"> </span>
|
|
1859
|
+
<span class="cline-any cline-no"> </span>
|
|
1860
|
+
<span class="cline-any cline-no"> </span>
|
|
1861
|
+
<span class="cline-any cline-no"> </span>
|
|
1862
|
+
<span class="cline-any cline-no"> </span>
|
|
1863
|
+
<span class="cline-any cline-no"> </span>
|
|
1864
|
+
<span class="cline-any cline-no"> </span>
|
|
1865
|
+
<span class="cline-any cline-no"> </span>
|
|
1866
|
+
<span class="cline-any cline-no"> </span>
|
|
1867
|
+
<span class="cline-any cline-no"> </span>
|
|
1868
|
+
<span class="cline-any cline-no"> </span>
|
|
1869
|
+
<span class="cline-any cline-no"> </span>
|
|
1870
|
+
<span class="cline-any cline-no"> </span>
|
|
1871
|
+
<span class="cline-any cline-no"> </span>
|
|
1872
|
+
<span class="cline-any cline-no"> </span>
|
|
1873
|
+
<span class="cline-any cline-no"> </span>
|
|
1874
|
+
<span class="cline-any cline-no"> </span>
|
|
1875
|
+
<span class="cline-any cline-no"> </span>
|
|
1876
|
+
<span class="cline-any cline-no"> </span>
|
|
1877
|
+
<span class="cline-any cline-no"> </span>
|
|
1878
|
+
<span class="cline-any cline-no"> </span>
|
|
1879
|
+
<span class="cline-any cline-no"> </span>
|
|
1880
|
+
<span class="cline-any cline-no"> </span>
|
|
1881
|
+
<span class="cline-any cline-no"> </span>
|
|
1882
|
+
<span class="cline-any cline-no"> </span>
|
|
1883
|
+
<span class="cline-any cline-no"> </span>
|
|
1884
|
+
<span class="cline-any cline-no"> </span>
|
|
1885
|
+
<span class="cline-any cline-no"> </span>
|
|
1886
|
+
<span class="cline-any cline-no"> </span>
|
|
1887
|
+
<span class="cline-any cline-no"> </span>
|
|
1888
|
+
<span class="cline-any cline-no"> </span>
|
|
1889
|
+
<span class="cline-any cline-no"> </span>
|
|
1890
|
+
<span class="cline-any cline-no"> </span>
|
|
1891
|
+
<span class="cline-any cline-no"> </span>
|
|
1892
|
+
<span class="cline-any cline-no"> </span>
|
|
1893
|
+
<span class="cline-any cline-no"> </span>
|
|
1894
|
+
<span class="cline-any cline-no"> </span>
|
|
1895
|
+
<span class="cline-any cline-no"> </span>
|
|
1896
|
+
<span class="cline-any cline-no"> </span>
|
|
1897
|
+
<span class="cline-any cline-no"> </span>
|
|
1898
|
+
<span class="cline-any cline-no"> </span>
|
|
1899
|
+
<span class="cline-any cline-no"> </span>
|
|
1900
|
+
<span class="cline-any cline-no"> </span>
|
|
1901
|
+
<span class="cline-any cline-no"> </span>
|
|
1902
|
+
<span class="cline-any cline-no"> </span>
|
|
1903
|
+
<span class="cline-any cline-no"> </span>
|
|
1904
|
+
<span class="cline-any cline-no"> </span>
|
|
1905
|
+
<span class="cline-any cline-no"> </span>
|
|
1906
|
+
<span class="cline-any cline-no"> </span>
|
|
1907
|
+
<span class="cline-any cline-no"> </span>
|
|
1908
|
+
<span class="cline-any cline-no"> </span>
|
|
1909
|
+
<span class="cline-any cline-no"> </span>
|
|
1910
|
+
<span class="cline-any cline-no"> </span>
|
|
1911
|
+
<span class="cline-any cline-no"> </span>
|
|
1912
|
+
<span class="cline-any cline-no"> </span>
|
|
1913
|
+
<span class="cline-any cline-no"> </span>
|
|
1914
|
+
<span class="cline-any cline-no"> </span>
|
|
1915
|
+
<span class="cline-any cline-no"> </span>
|
|
1916
|
+
<span class="cline-any cline-no"> </span>
|
|
1917
|
+
<span class="cline-any cline-no"> </span>
|
|
1918
|
+
<span class="cline-any cline-no"> </span>
|
|
1919
|
+
<span class="cline-any cline-no"> </span>
|
|
1920
|
+
<span class="cline-any cline-no"> </span>
|
|
1921
|
+
<span class="cline-any cline-no"> </span>
|
|
1922
|
+
<span class="cline-any cline-no"> </span>
|
|
1923
|
+
<span class="cline-any cline-no"> </span>
|
|
1924
|
+
<span class="cline-any cline-no"> </span>
|
|
1925
|
+
<span class="cline-any cline-no"> </span>
|
|
1926
|
+
<span class="cline-any cline-no"> </span>
|
|
1927
|
+
<span class="cline-any cline-no"> </span>
|
|
1928
|
+
<span class="cline-any cline-no"> </span>
|
|
1929
|
+
<span class="cline-any cline-no"> </span>
|
|
1930
|
+
<span class="cline-any cline-no"> </span>
|
|
1931
|
+
<span class="cline-any cline-no"> </span>
|
|
1932
|
+
<span class="cline-any cline-no"> </span>
|
|
1933
|
+
<span class="cline-any cline-no"> </span>
|
|
1934
|
+
<span class="cline-any cline-no"> </span>
|
|
1935
|
+
<span class="cline-any cline-no"> </span>
|
|
1936
|
+
<span class="cline-any cline-no"> </span>
|
|
1937
|
+
<span class="cline-any cline-no"> </span>
|
|
1938
|
+
<span class="cline-any cline-no"> </span>
|
|
1939
|
+
<span class="cline-any cline-no"> </span>
|
|
1940
|
+
<span class="cline-any cline-no"> </span>
|
|
1941
|
+
<span class="cline-any cline-no"> </span>
|
|
1942
|
+
<span class="cline-any cline-no"> </span>
|
|
1943
|
+
<span class="cline-any cline-no"> </span>
|
|
1944
|
+
<span class="cline-any cline-no"> </span>
|
|
1945
|
+
<span class="cline-any cline-no"> </span>
|
|
1946
|
+
<span class="cline-any cline-no"> </span>
|
|
1947
|
+
<span class="cline-any cline-no"> </span>
|
|
1948
|
+
<span class="cline-any cline-no"> </span>
|
|
1949
|
+
<span class="cline-any cline-no"> </span>
|
|
1950
|
+
<span class="cline-any cline-no"> </span>
|
|
1951
|
+
<span class="cline-any cline-no"> </span>
|
|
1952
|
+
<span class="cline-any cline-no"> </span>
|
|
1953
|
+
<span class="cline-any cline-no"> </span>
|
|
1954
|
+
<span class="cline-any cline-no"> </span>
|
|
1955
|
+
<span class="cline-any cline-no"> </span>
|
|
1956
|
+
<span class="cline-any cline-no"> </span>
|
|
1957
|
+
<span class="cline-any cline-no"> </span>
|
|
1958
|
+
<span class="cline-any cline-no"> </span>
|
|
1959
|
+
<span class="cline-any cline-no"> </span>
|
|
1960
|
+
<span class="cline-any cline-no"> </span>
|
|
1961
|
+
<span class="cline-any cline-no"> </span>
|
|
1962
|
+
<span class="cline-any cline-no"> </span>
|
|
1963
|
+
<span class="cline-any cline-no"> </span>
|
|
1964
|
+
<span class="cline-any cline-no"> </span>
|
|
1965
|
+
<span class="cline-any cline-no"> </span>
|
|
1966
|
+
<span class="cline-any cline-no"> </span>
|
|
1967
|
+
<span class="cline-any cline-no"> </span>
|
|
1968
|
+
<span class="cline-any cline-no"> </span>
|
|
1969
|
+
<span class="cline-any cline-no"> </span>
|
|
1970
|
+
<span class="cline-any cline-no"> </span>
|
|
1971
|
+
<span class="cline-any cline-no"> </span>
|
|
1972
|
+
<span class="cline-any cline-no"> </span>
|
|
1973
|
+
<span class="cline-any cline-no"> </span>
|
|
1974
|
+
<span class="cline-any cline-no"> </span>
|
|
1975
|
+
<span class="cline-any cline-no"> </span>
|
|
1976
|
+
<span class="cline-any cline-no"> </span>
|
|
1977
|
+
<span class="cline-any cline-no"> </span>
|
|
1978
|
+
<span class="cline-any cline-no"> </span>
|
|
1979
|
+
<span class="cline-any cline-no"> </span>
|
|
1980
|
+
<span class="cline-any cline-no"> </span>
|
|
1981
|
+
<span class="cline-any cline-no"> </span>
|
|
1982
|
+
<span class="cline-any cline-no"> </span>
|
|
1983
|
+
<span class="cline-any cline-no"> </span>
|
|
1984
|
+
<span class="cline-any cline-no"> </span>
|
|
1985
|
+
<span class="cline-any cline-no"> </span>
|
|
1986
|
+
<span class="cline-any cline-no"> </span>
|
|
1987
|
+
<span class="cline-any cline-no"> </span>
|
|
1988
|
+
<span class="cline-any cline-no"> </span>
|
|
1989
|
+
<span class="cline-any cline-no"> </span>
|
|
1990
|
+
<span class="cline-any cline-no"> </span>
|
|
1991
|
+
<span class="cline-any cline-no"> </span>
|
|
1992
|
+
<span class="cline-any cline-no"> </span>
|
|
1993
|
+
<span class="cline-any cline-no"> </span>
|
|
1994
|
+
<span class="cline-any cline-no"> </span>
|
|
1995
|
+
<span class="cline-any cline-no"> </span>
|
|
1996
|
+
<span class="cline-any cline-no"> </span>
|
|
1997
|
+
<span class="cline-any cline-no"> </span>
|
|
1998
|
+
<span class="cline-any cline-no"> </span>
|
|
1999
|
+
<span class="cline-any cline-no"> </span>
|
|
2000
|
+
<span class="cline-any cline-no"> </span>
|
|
2001
|
+
<span class="cline-any cline-no"> </span>
|
|
2002
|
+
<span class="cline-any cline-no"> </span>
|
|
2003
|
+
<span class="cline-any cline-no"> </span>
|
|
2004
|
+
<span class="cline-any cline-no"> </span>
|
|
2005
|
+
<span class="cline-any cline-no"> </span>
|
|
2006
|
+
<span class="cline-any cline-no"> </span>
|
|
2007
|
+
<span class="cline-any cline-no"> </span>
|
|
2008
|
+
<span class="cline-any cline-no"> </span>
|
|
2009
|
+
<span class="cline-any cline-no"> </span>
|
|
2010
|
+
<span class="cline-any cline-no"> </span>
|
|
2011
|
+
<span class="cline-any cline-no"> </span>
|
|
2012
|
+
<span class="cline-any cline-no"> </span>
|
|
2013
|
+
<span class="cline-any cline-no"> </span>
|
|
2014
|
+
<span class="cline-any cline-no"> </span>
|
|
2015
|
+
<span class="cline-any cline-no"> </span>
|
|
2016
|
+
<span class="cline-any cline-no"> </span>
|
|
2017
|
+
<span class="cline-any cline-no"> </span>
|
|
2018
|
+
<span class="cline-any cline-no"> </span>
|
|
2019
|
+
<span class="cline-any cline-no"> </span>
|
|
2020
|
+
<span class="cline-any cline-no"> </span>
|
|
2021
|
+
<span class="cline-any cline-no"> </span>
|
|
2022
|
+
<span class="cline-any cline-no"> </span>
|
|
2023
|
+
<span class="cline-any cline-no"> </span>
|
|
2024
|
+
<span class="cline-any cline-no"> </span>
|
|
2025
|
+
<span class="cline-any cline-no"> </span>
|
|
2026
|
+
<span class="cline-any cline-no"> </span>
|
|
2027
|
+
<span class="cline-any cline-no"> </span>
|
|
2028
|
+
<span class="cline-any cline-no"> </span>
|
|
2029
|
+
<span class="cline-any cline-no"> </span>
|
|
2030
|
+
<span class="cline-any cline-no"> </span>
|
|
2031
|
+
<span class="cline-any cline-no"> </span>
|
|
2032
|
+
<span class="cline-any cline-no"> </span>
|
|
2033
|
+
<span class="cline-any cline-no"> </span>
|
|
2034
|
+
<span class="cline-any cline-no"> </span>
|
|
2035
|
+
<span class="cline-any cline-no"> </span>
|
|
2036
|
+
<span class="cline-any cline-no"> </span>
|
|
2037
|
+
<span class="cline-any cline-no"> </span>
|
|
2038
|
+
<span class="cline-any cline-no"> </span>
|
|
2039
|
+
<span class="cline-any cline-no"> </span>
|
|
2040
|
+
<span class="cline-any cline-no"> </span>
|
|
2041
|
+
<span class="cline-any cline-no"> </span>
|
|
2042
|
+
<span class="cline-any cline-no"> </span>
|
|
2043
|
+
<span class="cline-any cline-no"> </span>
|
|
2044
|
+
<span class="cline-any cline-no"> </span>
|
|
2045
|
+
<span class="cline-any cline-no"> </span>
|
|
2046
|
+
<span class="cline-any cline-no"> </span>
|
|
2047
|
+
<span class="cline-any cline-no"> </span>
|
|
2048
|
+
<span class="cline-any cline-no"> </span>
|
|
2049
|
+
<span class="cline-any cline-no"> </span>
|
|
2050
|
+
<span class="cline-any cline-no"> </span>
|
|
2051
|
+
<span class="cline-any cline-no"> </span>
|
|
2052
|
+
<span class="cline-any cline-no"> </span>
|
|
2053
|
+
<span class="cline-any cline-no"> </span>
|
|
2054
|
+
<span class="cline-any cline-no"> </span>
|
|
2055
|
+
<span class="cline-any cline-no"> </span>
|
|
2056
|
+
<span class="cline-any cline-no"> </span>
|
|
2057
|
+
<span class="cline-any cline-no"> </span>
|
|
2058
|
+
<span class="cline-any cline-no"> </span>
|
|
2059
|
+
<span class="cline-any cline-no"> </span>
|
|
2060
|
+
<span class="cline-any cline-no"> </span>
|
|
2061
|
+
<span class="cline-any cline-no"> </span>
|
|
2062
|
+
<span class="cline-any cline-no"> </span>
|
|
2063
|
+
<span class="cline-any cline-no"> </span>
|
|
2064
|
+
<span class="cline-any cline-no"> </span>
|
|
2065
|
+
<span class="cline-any cline-no"> </span>
|
|
2066
|
+
<span class="cline-any cline-no"> </span>
|
|
2067
|
+
<span class="cline-any cline-no"> </span>
|
|
2068
|
+
<span class="cline-any cline-no"> </span>
|
|
2069
|
+
<span class="cline-any cline-no"> </span>
|
|
2070
|
+
<span class="cline-any cline-no"> </span>
|
|
2071
|
+
<span class="cline-any cline-no"> </span>
|
|
2072
|
+
<span class="cline-any cline-no"> </span>
|
|
2073
|
+
<span class="cline-any cline-no"> </span>
|
|
2074
|
+
<span class="cline-any cline-no"> </span>
|
|
2075
|
+
<span class="cline-any cline-no"> </span>
|
|
2076
|
+
<span class="cline-any cline-no"> </span>
|
|
2077
|
+
<span class="cline-any cline-no"> </span>
|
|
2078
|
+
<span class="cline-any cline-no"> </span>
|
|
2079
|
+
<span class="cline-any cline-no"> </span>
|
|
2080
|
+
<span class="cline-any cline-no"> </span>
|
|
2081
|
+
<span class="cline-any cline-no"> </span>
|
|
2082
|
+
<span class="cline-any cline-no"> </span>
|
|
2083
|
+
<span class="cline-any cline-no"> </span>
|
|
2084
|
+
<span class="cline-any cline-no"> </span>
|
|
2085
|
+
<span class="cline-any cline-no"> </span>
|
|
2086
|
+
<span class="cline-any cline-no"> </span>
|
|
2087
|
+
<span class="cline-any cline-no"> </span>
|
|
2088
|
+
<span class="cline-any cline-no"> </span>
|
|
2089
|
+
<span class="cline-any cline-no"> </span>
|
|
2090
|
+
<span class="cline-any cline-no"> </span>
|
|
2091
|
+
<span class="cline-any cline-no"> </span>
|
|
2092
|
+
<span class="cline-any cline-no"> </span>
|
|
2093
|
+
<span class="cline-any cline-no"> </span>
|
|
2094
|
+
<span class="cline-any cline-no"> </span>
|
|
2095
|
+
<span class="cline-any cline-no"> </span>
|
|
2096
|
+
<span class="cline-any cline-no"> </span>
|
|
2097
|
+
<span class="cline-any cline-no"> </span>
|
|
2098
|
+
<span class="cline-any cline-no"> </span>
|
|
2099
|
+
<span class="cline-any cline-no"> </span>
|
|
2100
|
+
<span class="cline-any cline-no"> </span>
|
|
2101
|
+
<span class="cline-any cline-no"> </span>
|
|
2102
|
+
<span class="cline-any cline-no"> </span>
|
|
2103
|
+
<span class="cline-any cline-no"> </span>
|
|
2104
|
+
<span class="cline-any cline-no"> </span>
|
|
2105
|
+
<span class="cline-any cline-no"> </span>
|
|
2106
|
+
<span class="cline-any cline-no"> </span>
|
|
2107
|
+
<span class="cline-any cline-no"> </span>
|
|
2108
|
+
<span class="cline-any cline-no"> </span>
|
|
2109
|
+
<span class="cline-any cline-no"> </span>
|
|
2110
|
+
<span class="cline-any cline-no"> </span>
|
|
2111
|
+
<span class="cline-any cline-no"> </span>
|
|
2112
|
+
<span class="cline-any cline-no"> </span>
|
|
2113
|
+
<span class="cline-any cline-no"> </span>
|
|
2114
|
+
<span class="cline-any cline-no"> </span>
|
|
2115
|
+
<span class="cline-any cline-no"> </span>
|
|
2116
|
+
<span class="cline-any cline-no"> </span>
|
|
2117
|
+
<span class="cline-any cline-no"> </span>
|
|
2118
|
+
<span class="cline-any cline-no"> </span>
|
|
2119
|
+
<span class="cline-any cline-no"> </span>
|
|
2120
|
+
<span class="cline-any cline-no"> </span>
|
|
2121
|
+
<span class="cline-any cline-no"> </span>
|
|
2122
|
+
<span class="cline-any cline-no"> </span>
|
|
2123
|
+
<span class="cline-any cline-no"> </span>
|
|
2124
|
+
<span class="cline-any cline-no"> </span>
|
|
2125
|
+
<span class="cline-any cline-no"> </span>
|
|
2126
|
+
<span class="cline-any cline-no"> </span>
|
|
2127
|
+
<span class="cline-any cline-no"> </span>
|
|
2128
|
+
<span class="cline-any cline-no"> </span>
|
|
2129
|
+
<span class="cline-any cline-no"> </span>
|
|
2130
|
+
<span class="cline-any cline-no"> </span>
|
|
2131
|
+
<span class="cline-any cline-no"> </span>
|
|
2132
|
+
<span class="cline-any cline-no"> </span>
|
|
2133
|
+
<span class="cline-any cline-no"> </span>
|
|
2134
|
+
<span class="cline-any cline-no"> </span>
|
|
2135
|
+
<span class="cline-any cline-no"> </span>
|
|
2136
|
+
<span class="cline-any cline-no"> </span>
|
|
2137
|
+
<span class="cline-any cline-no"> </span>
|
|
2138
|
+
<span class="cline-any cline-no"> </span>
|
|
2139
|
+
<span class="cline-any cline-no"> </span>
|
|
2140
|
+
<span class="cline-any cline-no"> </span>
|
|
2141
|
+
<span class="cline-any cline-no"> </span>
|
|
2142
|
+
<span class="cline-any cline-no"> </span>
|
|
2143
|
+
<span class="cline-any cline-no"> </span>
|
|
2144
|
+
<span class="cline-any cline-no"> </span>
|
|
2145
|
+
<span class="cline-any cline-no"> </span>
|
|
2146
|
+
<span class="cline-any cline-no"> </span>
|
|
2147
|
+
<span class="cline-any cline-no"> </span>
|
|
2148
|
+
<span class="cline-any cline-no"> </span>
|
|
2149
|
+
<span class="cline-any cline-no"> </span>
|
|
2150
|
+
<span class="cline-any cline-no"> </span>
|
|
2151
|
+
<span class="cline-any cline-no"> </span>
|
|
2152
|
+
<span class="cline-any cline-no"> </span>
|
|
2153
|
+
<span class="cline-any cline-no"> </span>
|
|
2154
|
+
<span class="cline-any cline-no"> </span>
|
|
2155
|
+
<span class="cline-any cline-no"> </span>
|
|
2156
|
+
<span class="cline-any cline-no"> </span>
|
|
2157
|
+
<span class="cline-any cline-no"> </span>
|
|
2158
|
+
<span class="cline-any cline-no"> </span>
|
|
2159
|
+
<span class="cline-any cline-no"> </span>
|
|
2160
|
+
<span class="cline-any cline-no"> </span>
|
|
2161
|
+
<span class="cline-any cline-no"> </span>
|
|
2162
|
+
<span class="cline-any cline-no"> </span>
|
|
2163
|
+
<span class="cline-any cline-no"> </span>
|
|
2164
|
+
<span class="cline-any cline-no"> </span>
|
|
2165
|
+
<span class="cline-any cline-no"> </span>
|
|
2166
|
+
<span class="cline-any cline-no"> </span>
|
|
2167
|
+
<span class="cline-any cline-no"> </span>
|
|
2168
|
+
<span class="cline-any cline-no"> </span>
|
|
2169
|
+
<span class="cline-any cline-no"> </span>
|
|
2170
|
+
<span class="cline-any cline-no"> </span>
|
|
2171
|
+
<span class="cline-any cline-no"> </span>
|
|
2172
|
+
<span class="cline-any cline-no"> </span>
|
|
2173
|
+
<span class="cline-any cline-no"> </span>
|
|
2174
|
+
<span class="cline-any cline-no"> </span>
|
|
2175
|
+
<span class="cline-any cline-no"> </span>
|
|
2176
|
+
<span class="cline-any cline-no"> </span>
|
|
2177
|
+
<span class="cline-any cline-no"> </span>
|
|
2178
|
+
<span class="cline-any cline-no"> </span>
|
|
2179
|
+
<span class="cline-any cline-no"> </span>
|
|
2180
|
+
<span class="cline-any cline-no"> </span>
|
|
2181
|
+
<span class="cline-any cline-no"> </span>
|
|
2182
|
+
<span class="cline-any cline-no"> </span>
|
|
2183
|
+
<span class="cline-any cline-no"> </span>
|
|
2184
|
+
<span class="cline-any cline-no"> </span>
|
|
2185
|
+
<span class="cline-any cline-no"> </span>
|
|
2186
|
+
<span class="cline-any cline-no"> </span>
|
|
2187
|
+
<span class="cline-any cline-no"> </span>
|
|
2188
|
+
<span class="cline-any cline-no"> </span>
|
|
2189
|
+
<span class="cline-any cline-no"> </span>
|
|
2190
|
+
<span class="cline-any cline-no"> </span>
|
|
2191
|
+
<span class="cline-any cline-no"> </span>
|
|
2192
|
+
<span class="cline-any cline-no"> </span>
|
|
2193
|
+
<span class="cline-any cline-no"> </span>
|
|
2194
|
+
<span class="cline-any cline-no"> </span>
|
|
2195
|
+
<span class="cline-any cline-no"> </span>
|
|
2196
|
+
<span class="cline-any cline-no"> </span>
|
|
2197
|
+
<span class="cline-any cline-no"> </span>
|
|
2198
|
+
<span class="cline-any cline-no"> </span>
|
|
2199
|
+
<span class="cline-any cline-no"> </span>
|
|
2200
|
+
<span class="cline-any cline-no"> </span>
|
|
2201
|
+
<span class="cline-any cline-no"> </span>
|
|
2202
|
+
<span class="cline-any cline-no"> </span>
|
|
2203
|
+
<span class="cline-any cline-no"> </span>
|
|
2204
|
+
<span class="cline-any cline-no"> </span>
|
|
2205
|
+
<span class="cline-any cline-no"> </span>
|
|
2206
|
+
<span class="cline-any cline-no"> </span>
|
|
2207
|
+
<span class="cline-any cline-no"> </span>
|
|
2208
|
+
<span class="cline-any cline-no"> </span>
|
|
2209
|
+
<span class="cline-any cline-no"> </span>
|
|
2210
|
+
<span class="cline-any cline-no"> </span>
|
|
2211
|
+
<span class="cline-any cline-no"> </span>
|
|
2212
|
+
<span class="cline-any cline-no"> </span>
|
|
2213
|
+
<span class="cline-any cline-no"> </span>
|
|
2214
|
+
<span class="cline-any cline-no"> </span>
|
|
2215
|
+
<span class="cline-any cline-no"> </span>
|
|
2216
|
+
<span class="cline-any cline-no"> </span>
|
|
2217
|
+
<span class="cline-any cline-no"> </span>
|
|
2218
|
+
<span class="cline-any cline-no"> </span>
|
|
2219
|
+
<span class="cline-any cline-no"> </span>
|
|
2220
|
+
<span class="cline-any cline-no"> </span>
|
|
2221
|
+
<span class="cline-any cline-no"> </span>
|
|
2222
|
+
<span class="cline-any cline-no"> </span>
|
|
2223
|
+
<span class="cline-any cline-no"> </span>
|
|
2224
|
+
<span class="cline-any cline-no"> </span>
|
|
2225
|
+
<span class="cline-any cline-no"> </span>
|
|
2226
|
+
<span class="cline-any cline-no"> </span>
|
|
2227
|
+
<span class="cline-any cline-no"> </span>
|
|
2228
|
+
<span class="cline-any cline-no"> </span>
|
|
2229
|
+
<span class="cline-any cline-no"> </span>
|
|
2230
|
+
<span class="cline-any cline-no"> </span>
|
|
2231
|
+
<span class="cline-any cline-no"> </span>
|
|
2232
|
+
<span class="cline-any cline-no"> </span>
|
|
2233
|
+
<span class="cline-any cline-no"> </span>
|
|
2234
|
+
<span class="cline-any cline-no"> </span>
|
|
2235
|
+
<span class="cline-any cline-no"> </span>
|
|
2236
|
+
<span class="cline-any cline-no"> </span>
|
|
2237
|
+
<span class="cline-any cline-no"> </span>
|
|
2238
|
+
<span class="cline-any cline-no"> </span>
|
|
2239
|
+
<span class="cline-any cline-no"> </span>
|
|
2240
|
+
<span class="cline-any cline-no"> </span>
|
|
2241
|
+
<span class="cline-any cline-no"> </span>
|
|
2242
|
+
<span class="cline-any cline-no"> </span>
|
|
2243
|
+
<span class="cline-any cline-no"> </span>
|
|
2244
|
+
<span class="cline-any cline-no"> </span>
|
|
2245
|
+
<span class="cline-any cline-no"> </span>
|
|
2246
|
+
<span class="cline-any cline-no"> </span>
|
|
2247
|
+
<span class="cline-any cline-no"> </span>
|
|
2248
|
+
<span class="cline-any cline-no"> </span>
|
|
2249
|
+
<span class="cline-any cline-no"> </span>
|
|
2250
|
+
<span class="cline-any cline-no"> </span>
|
|
2251
|
+
<span class="cline-any cline-no"> </span>
|
|
2252
|
+
<span class="cline-any cline-no"> </span>
|
|
2253
|
+
<span class="cline-any cline-no"> </span>
|
|
2254
|
+
<span class="cline-any cline-no"> </span>
|
|
2255
|
+
<span class="cline-any cline-no"> </span>
|
|
2256
|
+
<span class="cline-any cline-no"> </span>
|
|
2257
|
+
<span class="cline-any cline-no"> </span>
|
|
2258
|
+
<span class="cline-any cline-no"> </span>
|
|
2259
|
+
<span class="cline-any cline-no"> </span>
|
|
2260
|
+
<span class="cline-any cline-no"> </span>
|
|
2261
|
+
<span class="cline-any cline-no"> </span>
|
|
2262
|
+
<span class="cline-any cline-no"> </span>
|
|
2263
|
+
<span class="cline-any cline-no"> </span>
|
|
2264
|
+
<span class="cline-any cline-no"> </span>
|
|
2265
|
+
<span class="cline-any cline-no"> </span>
|
|
2266
|
+
<span class="cline-any cline-no"> </span>
|
|
2267
|
+
<span class="cline-any cline-no"> </span>
|
|
2268
|
+
<span class="cline-any cline-no"> </span>
|
|
2269
|
+
<span class="cline-any cline-no"> </span>
|
|
2270
|
+
<span class="cline-any cline-no"> </span>
|
|
2271
|
+
<span class="cline-any cline-no"> </span>
|
|
2272
|
+
<span class="cline-any cline-no"> </span>
|
|
2273
|
+
<span class="cline-any cline-no"> </span>
|
|
2274
|
+
<span class="cline-any cline-no"> </span>
|
|
2275
|
+
<span class="cline-any cline-no"> </span>
|
|
2276
|
+
<span class="cline-any cline-no"> </span>
|
|
2277
|
+
<span class="cline-any cline-no"> </span>
|
|
2278
|
+
<span class="cline-any cline-no"> </span>
|
|
2279
|
+
<span class="cline-any cline-no"> </span>
|
|
2280
|
+
<span class="cline-any cline-no"> </span>
|
|
2281
|
+
<span class="cline-any cline-no"> </span>
|
|
2282
|
+
<span class="cline-any cline-no"> </span>
|
|
2283
|
+
<span class="cline-any cline-no"> </span>
|
|
2284
|
+
<span class="cline-any cline-no"> </span>
|
|
2285
|
+
<span class="cline-any cline-no"> </span>
|
|
2286
|
+
<span class="cline-any cline-no"> </span>
|
|
2287
|
+
<span class="cline-any cline-no"> </span>
|
|
2288
|
+
<span class="cline-any cline-no"> </span>
|
|
2289
|
+
<span class="cline-any cline-no"> </span>
|
|
2290
|
+
<span class="cline-any cline-no"> </span>
|
|
2291
|
+
<span class="cline-any cline-no"> </span>
|
|
2292
|
+
<span class="cline-any cline-no"> </span>
|
|
2293
|
+
<span class="cline-any cline-no"> </span>
|
|
2294
|
+
<span class="cline-any cline-no"> </span>
|
|
2295
|
+
<span class="cline-any cline-no"> </span>
|
|
2296
|
+
<span class="cline-any cline-no"> </span>
|
|
2297
|
+
<span class="cline-any cline-no"> </span>
|
|
2298
|
+
<span class="cline-any cline-no"> </span>
|
|
2299
|
+
<span class="cline-any cline-no"> </span>
|
|
2300
|
+
<span class="cline-any cline-no"> </span>
|
|
2301
|
+
<span class="cline-any cline-no"> </span>
|
|
2302
|
+
<span class="cline-any cline-no"> </span>
|
|
2303
|
+
<span class="cline-any cline-no"> </span>
|
|
2304
|
+
<span class="cline-any cline-no"> </span>
|
|
2305
|
+
<span class="cline-any cline-no"> </span>
|
|
2306
|
+
<span class="cline-any cline-no"> </span>
|
|
2307
|
+
<span class="cline-any cline-no"> </span>
|
|
2308
|
+
<span class="cline-any cline-no"> </span>
|
|
2309
|
+
<span class="cline-any cline-no"> </span>
|
|
2310
|
+
<span class="cline-any cline-no"> </span>
|
|
2311
|
+
<span class="cline-any cline-no"> </span>
|
|
2312
|
+
<span class="cline-any cline-no"> </span>
|
|
2313
|
+
<span class="cline-any cline-no"> </span>
|
|
2314
|
+
<span class="cline-any cline-no"> </span>
|
|
2315
|
+
<span class="cline-any cline-no"> </span>
|
|
2316
|
+
<span class="cline-any cline-no"> </span>
|
|
2317
|
+
<span class="cline-any cline-no"> </span>
|
|
2318
|
+
<span class="cline-any cline-no"> </span>
|
|
2319
|
+
<span class="cline-any cline-no"> </span>
|
|
2320
|
+
<span class="cline-any cline-no"> </span>
|
|
2321
|
+
<span class="cline-any cline-no"> </span>
|
|
2322
|
+
<span class="cline-any cline-no"> </span>
|
|
2323
|
+
<span class="cline-any cline-no"> </span>
|
|
2324
|
+
<span class="cline-any cline-no"> </span>
|
|
2325
|
+
<span class="cline-any cline-no"> </span>
|
|
2326
|
+
<span class="cline-any cline-no"> </span>
|
|
2327
|
+
<span class="cline-any cline-no"> </span>
|
|
2328
|
+
<span class="cline-any cline-no"> </span>
|
|
2329
|
+
<span class="cline-any cline-no"> </span>
|
|
2330
|
+
<span class="cline-any cline-no"> </span>
|
|
2331
|
+
<span class="cline-any cline-no"> </span>
|
|
2332
|
+
<span class="cline-any cline-no"> </span>
|
|
2333
|
+
<span class="cline-any cline-no"> </span>
|
|
2334
|
+
<span class="cline-any cline-no"> </span>
|
|
2335
|
+
<span class="cline-any cline-no"> </span>
|
|
2336
|
+
<span class="cline-any cline-no"> </span>
|
|
2337
|
+
<span class="cline-any cline-no"> </span>
|
|
2338
|
+
<span class="cline-any cline-no"> </span>
|
|
2339
|
+
<span class="cline-any cline-no"> </span>
|
|
2340
|
+
<span class="cline-any cline-no"> </span>
|
|
2341
|
+
<span class="cline-any cline-no"> </span>
|
|
2342
|
+
<span class="cline-any cline-no"> </span>
|
|
2343
|
+
<span class="cline-any cline-no"> </span>
|
|
2344
|
+
<span class="cline-any cline-no"> </span>
|
|
2345
|
+
<span class="cline-any cline-no"> </span>
|
|
2346
|
+
<span class="cline-any cline-no"> </span>
|
|
2347
|
+
<span class="cline-any cline-no"> </span>
|
|
2348
|
+
<span class="cline-any cline-no"> </span>
|
|
2349
|
+
<span class="cline-any cline-no"> </span>
|
|
2350
|
+
<span class="cline-any cline-no"> </span>
|
|
2351
|
+
<span class="cline-any cline-no"> </span>
|
|
2352
|
+
<span class="cline-any cline-no"> </span>
|
|
2353
|
+
<span class="cline-any cline-no"> </span>
|
|
2354
|
+
<span class="cline-any cline-no"> </span>
|
|
2355
|
+
<span class="cline-any cline-no"> </span>
|
|
2356
|
+
<span class="cline-any cline-no"> </span>
|
|
2357
|
+
<span class="cline-any cline-no"> </span>
|
|
2358
|
+
<span class="cline-any cline-no"> </span>
|
|
2359
|
+
<span class="cline-any cline-no"> </span>
|
|
2360
|
+
<span class="cline-any cline-no"> </span>
|
|
2361
|
+
<span class="cline-any cline-no"> </span>
|
|
2362
|
+
<span class="cline-any cline-no"> </span>
|
|
2363
|
+
<span class="cline-any cline-no"> </span>
|
|
2364
|
+
<span class="cline-any cline-no"> </span>
|
|
2365
|
+
<span class="cline-any cline-no"> </span>
|
|
2366
|
+
<span class="cline-any cline-no"> </span>
|
|
2367
|
+
<span class="cline-any cline-no"> </span>
|
|
2368
|
+
<span class="cline-any cline-no"> </span>
|
|
2369
|
+
<span class="cline-any cline-no"> </span>
|
|
2370
|
+
<span class="cline-any cline-no"> </span>
|
|
2371
|
+
<span class="cline-any cline-no"> </span>
|
|
2372
|
+
<span class="cline-any cline-no"> </span>
|
|
2373
|
+
<span class="cline-any cline-no"> </span>
|
|
2374
|
+
<span class="cline-any cline-no"> </span>
|
|
2375
|
+
<span class="cline-any cline-no"> </span>
|
|
2376
|
+
<span class="cline-any cline-no"> </span>
|
|
2377
|
+
<span class="cline-any cline-no"> </span>
|
|
2378
|
+
<span class="cline-any cline-no"> </span>
|
|
2379
|
+
<span class="cline-any cline-no"> </span>
|
|
2380
|
+
<span class="cline-any cline-no"> </span>
|
|
2381
|
+
<span class="cline-any cline-no"> </span>
|
|
2382
|
+
<span class="cline-any cline-no"> </span>
|
|
2383
|
+
<span class="cline-any cline-no"> </span>
|
|
2384
|
+
<span class="cline-any cline-no"> </span>
|
|
2385
|
+
<span class="cline-any cline-no"> </span>
|
|
2386
|
+
<span class="cline-any cline-no"> </span>
|
|
2387
|
+
<span class="cline-any cline-no"> </span>
|
|
2388
|
+
<span class="cline-any cline-no"> </span>
|
|
2389
|
+
<span class="cline-any cline-no"> </span>
|
|
2390
|
+
<span class="cline-any cline-no"> </span>
|
|
2391
|
+
<span class="cline-any cline-no"> </span>
|
|
2392
|
+
<span class="cline-any cline-no"> </span>
|
|
2393
|
+
<span class="cline-any cline-no"> </span>
|
|
2394
|
+
<span class="cline-any cline-no"> </span>
|
|
2395
|
+
<span class="cline-any cline-no"> </span>
|
|
2396
|
+
<span class="cline-any cline-no"> </span>
|
|
2397
|
+
<span class="cline-any cline-no"> </span>
|
|
2398
|
+
<span class="cline-any cline-no"> </span>
|
|
2399
|
+
<span class="cline-any cline-no"> </span>
|
|
2400
|
+
<span class="cline-any cline-no"> </span>
|
|
2401
|
+
<span class="cline-any cline-no"> </span>
|
|
2402
|
+
<span class="cline-any cline-no"> </span>
|
|
2403
|
+
<span class="cline-any cline-no"> </span>
|
|
2404
|
+
<span class="cline-any cline-no"> </span>
|
|
2405
|
+
<span class="cline-any cline-no"> </span>
|
|
2406
|
+
<span class="cline-any cline-no"> </span>
|
|
2407
|
+
<span class="cline-any cline-no"> </span>
|
|
2408
|
+
<span class="cline-any cline-no"> </span>
|
|
2409
|
+
<span class="cline-any cline-no"> </span>
|
|
2410
|
+
<span class="cline-any cline-no"> </span>
|
|
2411
|
+
<span class="cline-any cline-no"> </span>
|
|
2412
|
+
<span class="cline-any cline-no"> </span>
|
|
2413
|
+
<span class="cline-any cline-no"> </span>
|
|
2414
|
+
<span class="cline-any cline-no"> </span>
|
|
2415
|
+
<span class="cline-any cline-no"> </span>
|
|
2416
|
+
<span class="cline-any cline-no"> </span>
|
|
2417
|
+
<span class="cline-any cline-no"> </span>
|
|
2418
|
+
<span class="cline-any cline-no"> </span>
|
|
2419
|
+
<span class="cline-any cline-no"> </span>
|
|
2420
|
+
<span class="cline-any cline-no"> </span>
|
|
2421
|
+
<span class="cline-any cline-no"> </span>
|
|
2422
|
+
<span class="cline-any cline-no"> </span>
|
|
2423
|
+
<span class="cline-any cline-no"> </span>
|
|
2424
|
+
<span class="cline-any cline-no"> </span>
|
|
2425
|
+
<span class="cline-any cline-no"> </span>
|
|
2426
|
+
<span class="cline-any cline-no"> </span>
|
|
2427
|
+
<span class="cline-any cline-no"> </span>
|
|
2428
|
+
<span class="cline-any cline-no"> </span>
|
|
2429
|
+
<span class="cline-any cline-no"> </span>
|
|
2430
|
+
<span class="cline-any cline-no"> </span>
|
|
2431
|
+
<span class="cline-any cline-no"> </span>
|
|
2432
|
+
<span class="cline-any cline-no"> </span>
|
|
2433
|
+
<span class="cline-any cline-no"> </span>
|
|
2434
|
+
<span class="cline-any cline-no"> </span>
|
|
2435
|
+
<span class="cline-any cline-no"> </span>
|
|
2436
|
+
<span class="cline-any cline-no"> </span>
|
|
2437
|
+
<span class="cline-any cline-no"> </span>
|
|
2438
|
+
<span class="cline-any cline-no"> </span>
|
|
2439
|
+
<span class="cline-any cline-no"> </span>
|
|
2440
|
+
<span class="cline-any cline-no"> </span>
|
|
2441
|
+
<span class="cline-any cline-no"> </span>
|
|
2442
|
+
<span class="cline-any cline-no"> </span>
|
|
2443
|
+
<span class="cline-any cline-no"> </span>
|
|
2444
|
+
<span class="cline-any cline-no"> </span>
|
|
2445
|
+
<span class="cline-any cline-no"> </span>
|
|
2446
|
+
<span class="cline-any cline-no"> </span>
|
|
2447
|
+
<span class="cline-any cline-no"> </span>
|
|
2448
|
+
<span class="cline-any cline-no"> </span>
|
|
2449
|
+
<span class="cline-any cline-no"> </span>
|
|
2450
|
+
<span class="cline-any cline-no"> </span>
|
|
2451
|
+
<span class="cline-any cline-no"> </span>
|
|
2452
|
+
<span class="cline-any cline-no"> </span>
|
|
2453
|
+
<span class="cline-any cline-no"> </span>
|
|
2454
|
+
<span class="cline-any cline-no"> </span>
|
|
2455
|
+
<span class="cline-any cline-no"> </span>
|
|
2456
|
+
<span class="cline-any cline-no"> </span>
|
|
2457
|
+
<span class="cline-any cline-no"> </span>
|
|
2458
|
+
<span class="cline-any cline-no"> </span>
|
|
2459
|
+
<span class="cline-any cline-no"> </span>
|
|
2460
|
+
<span class="cline-any cline-no"> </span>
|
|
2461
|
+
<span class="cline-any cline-no"> </span>
|
|
2462
|
+
<span class="cline-any cline-no"> </span>
|
|
2463
|
+
<span class="cline-any cline-no"> </span>
|
|
2464
|
+
<span class="cline-any cline-no"> </span>
|
|
2465
|
+
<span class="cline-any cline-no"> </span>
|
|
2466
|
+
<span class="cline-any cline-no"> </span>
|
|
2467
|
+
<span class="cline-any cline-no"> </span>
|
|
2468
|
+
<span class="cline-any cline-no"> </span>
|
|
2469
|
+
<span class="cline-any cline-no"> </span>
|
|
2470
|
+
<span class="cline-any cline-no"> </span>
|
|
2471
|
+
<span class="cline-any cline-no"> </span>
|
|
2472
|
+
<span class="cline-any cline-no"> </span>
|
|
2473
|
+
<span class="cline-any cline-no"> </span>
|
|
2474
|
+
<span class="cline-any cline-no"> </span>
|
|
2475
|
+
<span class="cline-any cline-no"> </span>
|
|
2476
|
+
<span class="cline-any cline-no"> </span>
|
|
2477
|
+
<span class="cline-any cline-no"> </span>
|
|
2478
|
+
<span class="cline-any cline-no"> </span>
|
|
2479
|
+
<span class="cline-any cline-no"> </span>
|
|
2480
|
+
<span class="cline-any cline-no"> </span>
|
|
2481
|
+
<span class="cline-any cline-no"> </span>
|
|
2482
|
+
<span class="cline-any cline-no"> </span>
|
|
2483
|
+
<span class="cline-any cline-no"> </span>
|
|
2484
|
+
<span class="cline-any cline-no"> </span>
|
|
2485
|
+
<span class="cline-any cline-no"> </span>
|
|
2486
|
+
<span class="cline-any cline-no"> </span>
|
|
2487
|
+
<span class="cline-any cline-no"> </span>
|
|
2488
|
+
<span class="cline-any cline-no"> </span>
|
|
2489
|
+
<span class="cline-any cline-no"> </span>
|
|
2490
|
+
<span class="cline-any cline-no"> </span>
|
|
2491
|
+
<span class="cline-any cline-no"> </span>
|
|
2492
|
+
<span class="cline-any cline-no"> </span>
|
|
2493
|
+
<span class="cline-any cline-no"> </span>
|
|
2494
|
+
<span class="cline-any cline-no"> </span>
|
|
2495
|
+
<span class="cline-any cline-no"> </span>
|
|
2496
|
+
<span class="cline-any cline-no"> </span>
|
|
2497
|
+
<span class="cline-any cline-no"> </span>
|
|
2498
|
+
<span class="cline-any cline-no"> </span>
|
|
2499
|
+
<span class="cline-any cline-no"> </span>
|
|
2500
|
+
<span class="cline-any cline-no"> </span>
|
|
2501
|
+
<span class="cline-any cline-no"> </span>
|
|
2502
|
+
<span class="cline-any cline-no"> </span>
|
|
2503
|
+
<span class="cline-any cline-no"> </span>
|
|
2504
|
+
<span class="cline-any cline-no"> </span>
|
|
2505
|
+
<span class="cline-any cline-no"> </span>
|
|
2506
|
+
<span class="cline-any cline-no"> </span>
|
|
2507
|
+
<span class="cline-any cline-no"> </span>
|
|
2508
|
+
<span class="cline-any cline-no"> </span>
|
|
2509
|
+
<span class="cline-any cline-no"> </span>
|
|
2510
|
+
<span class="cline-any cline-no"> </span>
|
|
2511
|
+
<span class="cline-any cline-no"> </span>
|
|
2512
|
+
<span class="cline-any cline-no"> </span>
|
|
2513
|
+
<span class="cline-any cline-no"> </span>
|
|
2514
|
+
<span class="cline-any cline-no"> </span>
|
|
2515
|
+
<span class="cline-any cline-no"> </span>
|
|
2516
|
+
<span class="cline-any cline-no"> </span>
|
|
2517
|
+
<span class="cline-any cline-no"> </span>
|
|
2518
|
+
<span class="cline-any cline-no"> </span>
|
|
2519
|
+
<span class="cline-any cline-no"> </span>
|
|
2520
|
+
<span class="cline-any cline-no"> </span>
|
|
2521
|
+
<span class="cline-any cline-no"> </span>
|
|
2522
|
+
<span class="cline-any cline-no"> </span>
|
|
2523
|
+
<span class="cline-any cline-no"> </span>
|
|
2524
|
+
<span class="cline-any cline-no"> </span>
|
|
2525
|
+
<span class="cline-any cline-no"> </span>
|
|
2526
|
+
<span class="cline-any cline-no"> </span>
|
|
2527
|
+
<span class="cline-any cline-no"> </span>
|
|
2528
|
+
<span class="cline-any cline-no"> </span>
|
|
2529
|
+
<span class="cline-any cline-no"> </span>
|
|
2530
|
+
<span class="cline-any cline-no"> </span>
|
|
2531
|
+
<span class="cline-any cline-no"> </span>
|
|
2532
|
+
<span class="cline-any cline-no"> </span>
|
|
2533
|
+
<span class="cline-any cline-no"> </span>
|
|
2534
|
+
<span class="cline-any cline-no"> </span>
|
|
2535
|
+
<span class="cline-any cline-no"> </span>
|
|
2536
|
+
<span class="cline-any cline-no"> </span>
|
|
2537
|
+
<span class="cline-any cline-no"> </span>
|
|
2538
|
+
<span class="cline-any cline-no"> </span>
|
|
2539
|
+
<span class="cline-any cline-no"> </span>
|
|
2540
|
+
<span class="cline-any cline-no"> </span>
|
|
2541
|
+
<span class="cline-any cline-no"> </span>
|
|
2542
|
+
<span class="cline-any cline-no"> </span>
|
|
2543
|
+
<span class="cline-any cline-no"> </span>
|
|
2544
|
+
<span class="cline-any cline-no"> </span>
|
|
2545
|
+
<span class="cline-any cline-no"> </span>
|
|
2546
|
+
<span class="cline-any cline-no"> </span>
|
|
2547
|
+
<span class="cline-any cline-no"> </span>
|
|
2548
|
+
<span class="cline-any cline-no"> </span>
|
|
2549
|
+
<span class="cline-any cline-no"> </span>
|
|
2550
|
+
<span class="cline-any cline-no"> </span>
|
|
2551
|
+
<span class="cline-any cline-no"> </span>
|
|
2552
|
+
<span class="cline-any cline-no"> </span>
|
|
2553
|
+
<span class="cline-any cline-no"> </span>
|
|
2554
|
+
<span class="cline-any cline-no"> </span>
|
|
2555
|
+
<span class="cline-any cline-no"> </span>
|
|
2556
|
+
<span class="cline-any cline-no"> </span>
|
|
2557
|
+
<span class="cline-any cline-no"> </span>
|
|
2558
|
+
<span class="cline-any cline-no"> </span>
|
|
2559
|
+
<span class="cline-any cline-no"> </span>
|
|
2560
|
+
<span class="cline-any cline-no"> </span>
|
|
2561
|
+
<span class="cline-any cline-no"> </span>
|
|
2562
|
+
<span class="cline-any cline-no"> </span>
|
|
2563
|
+
<span class="cline-any cline-no"> </span>
|
|
2564
|
+
<span class="cline-any cline-no"> </span>
|
|
2565
|
+
<span class="cline-any cline-no"> </span>
|
|
2566
|
+
<span class="cline-any cline-no"> </span>
|
|
2567
|
+
<span class="cline-any cline-no"> </span>
|
|
2568
|
+
<span class="cline-any cline-no"> </span>
|
|
2569
|
+
<span class="cline-any cline-no"> </span>
|
|
2570
|
+
<span class="cline-any cline-no"> </span>
|
|
2571
|
+
<span class="cline-any cline-no"> </span>
|
|
2572
|
+
<span class="cline-any cline-no"> </span>
|
|
2573
|
+
<span class="cline-any cline-no"> </span>
|
|
2574
|
+
<span class="cline-any cline-no"> </span>
|
|
2575
|
+
<span class="cline-any cline-no"> </span>
|
|
2576
|
+
<span class="cline-any cline-no"> </span>
|
|
2577
|
+
<span class="cline-any cline-no"> </span>
|
|
2578
|
+
<span class="cline-any cline-no"> </span>
|
|
2579
|
+
<span class="cline-any cline-no"> </span>
|
|
2580
|
+
<span class="cline-any cline-no"> </span>
|
|
2581
|
+
<span class="cline-any cline-no"> </span>
|
|
2582
|
+
<span class="cline-any cline-no"> </span>
|
|
2583
|
+
<span class="cline-any cline-no"> </span>
|
|
2584
|
+
<span class="cline-any cline-no"> </span>
|
|
2585
|
+
<span class="cline-any cline-no"> </span>
|
|
2586
|
+
<span class="cline-any cline-no"> </span>
|
|
2587
|
+
<span class="cline-any cline-no"> </span>
|
|
2588
|
+
<span class="cline-any cline-no"> </span>
|
|
2589
|
+
<span class="cline-any cline-no"> </span>
|
|
2590
|
+
<span class="cline-any cline-no"> </span>
|
|
2591
|
+
<span class="cline-any cline-no"> </span>
|
|
2592
|
+
<span class="cline-any cline-no"> </span>
|
|
2593
|
+
<span class="cline-any cline-no"> </span>
|
|
2594
|
+
<span class="cline-any cline-no"> </span>
|
|
2595
|
+
<span class="cline-any cline-no"> </span>
|
|
2596
|
+
<span class="cline-any cline-no"> </span>
|
|
2597
|
+
<span class="cline-any cline-no"> </span>
|
|
2598
|
+
<span class="cline-any cline-no"> </span>
|
|
2599
|
+
<span class="cline-any cline-no"> </span>
|
|
2600
|
+
<span class="cline-any cline-no"> </span>
|
|
2601
|
+
<span class="cline-any cline-no"> </span>
|
|
2602
|
+
<span class="cline-any cline-no"> </span>
|
|
2603
|
+
<span class="cline-any cline-no"> </span>
|
|
2604
|
+
<span class="cline-any cline-no"> </span>
|
|
2605
|
+
<span class="cline-any cline-no"> </span>
|
|
2606
|
+
<span class="cline-any cline-no"> </span>
|
|
2607
|
+
<span class="cline-any cline-no"> </span>
|
|
2608
|
+
<span class="cline-any cline-no"> </span>
|
|
2609
|
+
<span class="cline-any cline-no"> </span>
|
|
2610
|
+
<span class="cline-any cline-no"> </span>
|
|
2611
|
+
<span class="cline-any cline-no"> </span>
|
|
2612
|
+
<span class="cline-any cline-no"> </span>
|
|
2613
|
+
<span class="cline-any cline-no"> </span>
|
|
2614
|
+
<span class="cline-any cline-no"> </span>
|
|
2615
|
+
<span class="cline-any cline-no"> </span>
|
|
2616
|
+
<span class="cline-any cline-no"> </span>
|
|
2617
|
+
<span class="cline-any cline-no"> </span>
|
|
2618
|
+
<span class="cline-any cline-no"> </span>
|
|
2619
|
+
<span class="cline-any cline-no"> </span>
|
|
2620
|
+
<span class="cline-any cline-no"> </span>
|
|
2621
|
+
<span class="cline-any cline-no"> </span>
|
|
2622
|
+
<span class="cline-any cline-no"> </span>
|
|
2623
|
+
<span class="cline-any cline-no"> </span>
|
|
2624
|
+
<span class="cline-any cline-no"> </span>
|
|
2625
|
+
<span class="cline-any cline-no"> </span>
|
|
2626
|
+
<span class="cline-any cline-no"> </span>
|
|
2627
|
+
<span class="cline-any cline-no"> </span>
|
|
2628
|
+
<span class="cline-any cline-no"> </span>
|
|
2629
|
+
<span class="cline-any cline-no"> </span>
|
|
2630
|
+
<span class="cline-any cline-no"> </span>
|
|
2631
|
+
<span class="cline-any cline-no"> </span>
|
|
2632
|
+
<span class="cline-any cline-no"> </span>
|
|
2633
|
+
<span class="cline-any cline-no"> </span>
|
|
2634
|
+
<span class="cline-any cline-no"> </span>
|
|
2635
|
+
<span class="cline-any cline-no"> </span>
|
|
2636
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
|
|
2637
|
+
<span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
|
|
2638
|
+
<span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
|
|
2639
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2640
|
+
<span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
|
|
2641
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2642
|
+
<span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
|
|
2643
|
+
<span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
|
|
2644
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2645
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2646
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2647
|
+
<span class="cstat-no" title="statement not covered" > * @file Service for building Hedera transactions using the Hashgraph SDK.</span>
|
|
2648
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2649
|
+
<span class="cstat-no" title="statement not covered" > * @module services/transaction-builders/hedera</span>
|
|
2650
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2651
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2652
|
+
<span class="cstat-no" title="statement not covered" > * HederaTransactionBuilderService provides methods to construct various Hedera transaction</span>
|
|
2653
|
+
<span class="cstat-no" title="statement not covered" > * types and serialize them to base64 payloads ready for signing. It uses the @hashgraph/sdk</span>
|
|
2654
|
+
<span class="cstat-no" title="statement not covered" > * library for proper transaction construction and automatically freezes transactions with</span>
|
|
2655
|
+
<span class="cstat-no" title="statement not covered" > * the correct network client.</span>
|
|
2656
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2657
|
+
<span class="cstat-no" title="statement not covered" > * **Supported Transaction Types:**</span>
|
|
2658
|
+
<span class="cstat-no" title="statement not covered" > * - HBAR transfers (single and atomic multi-transfer)</span>
|
|
2659
|
+
<span class="cstat-no" title="statement not covered" > * - Fungible token transfers</span>
|
|
2660
|
+
<span class="cstat-no" title="statement not covered" > * - NFT transfers</span>
|
|
2661
|
+
<span class="cstat-no" title="statement not covered" > * - Token association/dissociation</span>
|
|
2662
|
+
<span class="cstat-no" title="statement not covered" > * - Token creation (with auto key configuration)</span>
|
|
2663
|
+
<span class="cstat-no" title="statement not covered" > * - Token minting/burning</span>
|
|
2664
|
+
<span class="cstat-no" title="statement not covered" > * - Topic creation (with auto key configuration)</span>
|
|
2665
|
+
<span class="cstat-no" title="statement not covered" > * - Topic message submission</span>
|
|
2666
|
+
<span class="cstat-no" title="statement not covered" > * - Account creation (with multisig support)</span>
|
|
2667
|
+
<span class="cstat-no" title="statement not covered" > * - Account updates</span>
|
|
2668
|
+
<span class="cstat-no" title="statement not covered" > * - Batch transactions</span>
|
|
2669
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2670
|
+
<span class="cstat-no" title="statement not covered" > * **Auto-Key Configuration:**</span>
|
|
2671
|
+
<span class="cstat-no" title="statement not covered" > * When creating entities (topics, tokens, accounts), the builder automatically</span>
|
|
2672
|
+
<span class="cstat-no" title="statement not covered" > * inherits the key structure from the active account:</span>
|
|
2673
|
+
<span class="cstat-no" title="statement not covered" > * - Single-sig accounts -> entity uses account's public key</span>
|
|
2674
|
+
<span class="cstat-no" title="statement not covered" > * - Multisig accounts -> entity uses threshold key with all signers</span>
|
|
2675
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2676
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2677
|
+
<span class="cstat-no" title="statement not covered" >import { Injectable, inject } from '@angular/core';</span>
|
|
2678
|
+
<span class="cstat-no" title="statement not covered" >import {</span>
|
|
2679
|
+
<span class="cstat-no" title="statement not covered" > TransferTransaction,</span>
|
|
2680
|
+
<span class="cstat-no" title="statement not covered" > TokenAssociateTransaction,</span>
|
|
2681
|
+
<span class="cstat-no" title="statement not covered" > TokenDissociateTransaction,</span>
|
|
2682
|
+
<span class="cstat-no" title="statement not covered" > TokenCreateTransaction,</span>
|
|
2683
|
+
<span class="cstat-no" title="statement not covered" > TokenMintTransaction,</span>
|
|
2684
|
+
<span class="cstat-no" title="statement not covered" > TokenBurnTransaction,</span>
|
|
2685
|
+
<span class="cstat-no" title="statement not covered" > TopicCreateTransaction,</span>
|
|
2686
|
+
<span class="cstat-no" title="statement not covered" > TopicMessageSubmitTransaction,</span>
|
|
2687
|
+
<span class="cstat-no" title="statement not covered" > AccountCreateTransaction,</span>
|
|
2688
|
+
<span class="cstat-no" title="statement not covered" > AccountUpdateTransaction,</span>
|
|
2689
|
+
<span class="cstat-no" title="statement not covered" > ScheduleCreateTransaction,</span>
|
|
2690
|
+
<span class="cstat-no" title="statement not covered" > BatchTransaction,</span>
|
|
2691
|
+
<span class="cstat-no" title="statement not covered" > Transaction,</span>
|
|
2692
|
+
<span class="cstat-no" title="statement not covered" > Hbar,</span>
|
|
2693
|
+
<span class="cstat-no" title="statement not covered" > AccountId,</span>
|
|
2694
|
+
<span class="cstat-no" title="statement not covered" > TokenId,</span>
|
|
2695
|
+
<span class="cstat-no" title="statement not covered" > NftId,</span>
|
|
2696
|
+
<span class="cstat-no" title="statement not covered" > TransactionId,</span>
|
|
2697
|
+
<span class="cstat-no" title="statement not covered" > Client,</span>
|
|
2698
|
+
<span class="cstat-no" title="statement not covered" > PrivateKey,</span>
|
|
2699
|
+
<span class="cstat-no" title="statement not covered" > PublicKey,</span>
|
|
2700
|
+
<span class="cstat-no" title="statement not covered" > TokenType,</span>
|
|
2701
|
+
<span class="cstat-no" title="statement not covered" > TokenSupplyType,</span>
|
|
2702
|
+
<span class="cstat-no" title="statement not covered" > KeyList,</span>
|
|
2703
|
+
<span class="cstat-no" title="statement not covered" > Key,</span>
|
|
2704
|
+
<span class="cstat-no" title="statement not covered" >} from '@hashgraph/sdk';</span>
|
|
2705
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2706
|
+
<span class="cstat-no" title="statement not covered" >import { LoggerService } from '../logger.service';</span>
|
|
2707
|
+
<span class="cstat-no" title="statement not covered" >import { UnifiedWalletService } from '../unified-wallet.service';</span>
|
|
2708
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2709
|
+
<span class="cstat-no" title="statement not covered" >import { scaleHederaAmountToBaseUnits, assertSafeInteger } from './hedera-amount-utils';</span>
|
|
2710
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2711
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2712
|
+
<span class="cstat-no" title="statement not covered" > * Supported inner transaction types for batch transactions.</span>
|
|
2713
|
+
<span class="cstat-no" title="statement not covered" > * Excludes 'batch-transaction' since batches cannot be nested.</span>
|
|
2714
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2715
|
+
<span class="cstat-no" title="statement not covered" >export type BatchInnerTransactionType =</span>
|
|
2716
|
+
<span class="cstat-no" title="statement not covered" > | 'send-hbar'</span>
|
|
2717
|
+
<span class="cstat-no" title="statement not covered" > | 'send-token'</span>
|
|
2718
|
+
<span class="cstat-no" title="statement not covered" > | 'send-nft'</span>
|
|
2719
|
+
<span class="cstat-no" title="statement not covered" > | 'token-associate'</span>
|
|
2720
|
+
<span class="cstat-no" title="statement not covered" > | 'token-dissociate'</span>
|
|
2721
|
+
<span class="cstat-no" title="statement not covered" > | 'token-create'</span>
|
|
2722
|
+
<span class="cstat-no" title="statement not covered" > | 'token-mint'</span>
|
|
2723
|
+
<span class="cstat-no" title="statement not covered" > | 'token-burn'</span>
|
|
2724
|
+
<span class="cstat-no" title="statement not covered" > | 'topic-create'</span>
|
|
2725
|
+
<span class="cstat-no" title="statement not covered" > | 'topic-message'</span>
|
|
2726
|
+
<span class="cstat-no" title="statement not covered" > | 'account-create'</span>
|
|
2727
|
+
<span class="cstat-no" title="statement not covered" > | 'account-update';</span>
|
|
2728
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2729
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2730
|
+
<span class="cstat-no" title="statement not covered" > * Inner transaction descriptor for batch transactions.</span>
|
|
2731
|
+
<span class="cstat-no" title="statement not covered" > * Contains all possible fields for different transaction types.</span>
|
|
2732
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2733
|
+
<span class="cstat-no" title="statement not covered" >export interface BatchInnerTransaction {</span>
|
|
2734
|
+
<span class="cstat-no" title="statement not covered" > /** Type of transaction */</span>
|
|
2735
|
+
<span class="cstat-no" title="statement not covered" > type: BatchInnerTransactionType;</span>
|
|
2736
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2737
|
+
<span class="cstat-no" title="statement not covered" > // Transfer fields (send-hbar, send-token, send-nft)</span>
|
|
2738
|
+
<span class="cstat-no" title="statement not covered" > /** Recipient account */</span>
|
|
2739
|
+
<span class="cstat-no" title="statement not covered" > toAccount?: string;</span>
|
|
2740
|
+
<span class="cstat-no" title="statement not covered" > /** Amount for HBAR (tinybars) or token transfers */</span>
|
|
2741
|
+
<span class="cstat-no" title="statement not covered" > amount?: number;</span>
|
|
2742
|
+
<span class="cstat-no" title="statement not covered" > /** Token ID for token operations */</span>
|
|
2743
|
+
<span class="cstat-no" title="statement not covered" > tokenId?: string;</span>
|
|
2744
|
+
<span class="cstat-no" title="statement not covered" > /** Serial number for NFT transfers */</span>
|
|
2745
|
+
<span class="cstat-no" title="statement not covered" > serialNumber?: number;</span>
|
|
2746
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2747
|
+
<span class="cstat-no" title="statement not covered" > // Token create fields</span>
|
|
2748
|
+
<span class="cstat-no" title="statement not covered" > /** Token name for creation */</span>
|
|
2749
|
+
<span class="cstat-no" title="statement not covered" > tokenName?: string;</span>
|
|
2750
|
+
<span class="cstat-no" title="statement not covered" > /** Token symbol for creation */</span>
|
|
2751
|
+
<span class="cstat-no" title="statement not covered" > tokenSymbol?: string;</span>
|
|
2752
|
+
<span class="cstat-no" title="statement not covered" > /** Token decimals for creation */</span>
|
|
2753
|
+
<span class="cstat-no" title="statement not covered" > decimals?: number;</span>
|
|
2754
|
+
<span class="cstat-no" title="statement not covered" > /** Initial supply for fungible tokens */</span>
|
|
2755
|
+
<span class="cstat-no" title="statement not covered" > initialSupply?: number;</span>
|
|
2756
|
+
<span class="cstat-no" title="statement not covered" > /** Max supply (0 = infinite) */</span>
|
|
2757
|
+
<span class="cstat-no" title="statement not covered" > maxSupply?: number;</span>
|
|
2758
|
+
<span class="cstat-no" title="statement not covered" > /** Whether supply is finite or infinite */</span>
|
|
2759
|
+
<span class="cstat-no" title="statement not covered" > supplyType?: 'finite' | 'infinite';</span>
|
|
2760
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2761
|
+
<span class="cstat-no" title="statement not covered" > // Token mint/burn fields</span>
|
|
2762
|
+
<span class="cstat-no" title="statement not covered" > /** Metadata for NFT minting (array for multiple NFTs) */</span>
|
|
2763
|
+
<span class="cstat-no" title="statement not covered" > metadata?: string | string[];</span>
|
|
2764
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2765
|
+
<span class="cstat-no" title="statement not covered" > // Topic fields</span>
|
|
2766
|
+
<span class="cstat-no" title="statement not covered" > /** Topic ID for message submission */</span>
|
|
2767
|
+
<span class="cstat-no" title="statement not covered" > topicId?: string;</span>
|
|
2768
|
+
<span class="cstat-no" title="statement not covered" > /** Message content for topic submission */</span>
|
|
2769
|
+
<span class="cstat-no" title="statement not covered" > message?: string;</span>
|
|
2770
|
+
<span class="cstat-no" title="statement not covered" > /** Topic memo for creation */</span>
|
|
2771
|
+
<span class="cstat-no" title="statement not covered" > topicMemo?: string;</span>
|
|
2772
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2773
|
+
<span class="cstat-no" title="statement not covered" > // Account fields</span>
|
|
2774
|
+
<span class="cstat-no" title="statement not covered" > /** Initial balance for account creation (tinybars) */</span>
|
|
2775
|
+
<span class="cstat-no" title="statement not covered" > initialBalance?: number;</span>
|
|
2776
|
+
<span class="cstat-no" title="statement not covered" > /** Memo for account update */</span>
|
|
2777
|
+
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2778
|
+
<span class="cstat-no" title="statement not covered" > /** Max auto associations for account */</span>
|
|
2779
|
+
<span class="cstat-no" title="statement not covered" > maxAutoAssociations?: number;</span>
|
|
2780
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2781
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2782
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2783
|
+
<span class="cstat-no" title="statement not covered" > * Key configuration for entity creation transactions.</span>
|
|
2784
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2785
|
+
<span class="cstat-no" title="statement not covered" > * For single-sig accounts: provide a single publicKey string</span>
|
|
2786
|
+
<span class="cstat-no" title="statement not covered" > * For multisig accounts: provide signerPublicKeys array + threshold</span>
|
|
2787
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2788
|
+
<span class="cstat-no" title="statement not covered" >export interface HederaKeyConfig {</span>
|
|
2789
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2790
|
+
<span class="cstat-no" title="statement not covered" > * Single public key (hex/DER encoded) for single-sig accounts.</span>
|
|
2791
|
+
<span class="cstat-no" title="statement not covered" > * If provided alone, this key is used directly.</span>
|
|
2792
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2793
|
+
<span class="cstat-no" title="statement not covered" > publicKey?: string;</span>
|
|
2794
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2795
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2796
|
+
<span class="cstat-no" title="statement not covered" > * Array of public keys for multisig (threshold key) configuration.</span>
|
|
2797
|
+
<span class="cstat-no" title="statement not covered" > * Requires threshold to be set.</span>
|
|
2798
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2799
|
+
<span class="cstat-no" title="statement not covered" > signerPublicKeys?: string[];</span>
|
|
2800
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2801
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2802
|
+
<span class="cstat-no" title="statement not covered" > * Threshold for multisig - number of signatures required.</span>
|
|
2803
|
+
<span class="cstat-no" title="statement not covered" > * Only used when signerPublicKeys is provided.</span>
|
|
2804
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2805
|
+
<span class="cstat-no" title="statement not covered" > threshold?: number;</span>
|
|
2806
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2807
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2808
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2809
|
+
<span class="cstat-no" title="statement not covered" > * Extended options for topic creation with key configuration.</span>
|
|
2810
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2811
|
+
<span class="cstat-no" title="statement not covered" >export interface TopicCreateOptions {</span>
|
|
2812
|
+
<span class="cstat-no" title="statement not covered" > /** Topic memo/description */</span>
|
|
2813
|
+
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2814
|
+
<span class="cstat-no" title="statement not covered" > /** Admin key - can update/delete the topic. Uses creator's key if not specified. */</span>
|
|
2815
|
+
<span class="cstat-no" title="statement not covered" > adminKey?: HederaKeyConfig;</span>
|
|
2816
|
+
<span class="cstat-no" title="statement not covered" > /** Submit key - required to submit messages. If not set, anyone can submit. */</span>
|
|
2817
|
+
<span class="cstat-no" title="statement not covered" > submitKey?: HederaKeyConfig;</span>
|
|
2818
|
+
<span class="cstat-no" title="statement not covered" > /** Auto-renew account for fees */</span>
|
|
2819
|
+
<span class="cstat-no" title="statement not covered" > autoRenewAccountId?: string;</span>
|
|
2820
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2821
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2822
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2823
|
+
<span class="cstat-no" title="statement not covered" > * Extended options for token creation with key configuration.</span>
|
|
2824
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2825
|
+
<span class="cstat-no" title="statement not covered" >export interface TokenCreateOptions {</span>
|
|
2826
|
+
<span class="cstat-no" title="statement not covered" > /** Token name */</span>
|
|
2827
|
+
<span class="cstat-no" title="statement not covered" > name: string;</span>
|
|
2828
|
+
<span class="cstat-no" title="statement not covered" > /** Token symbol */</span>
|
|
2829
|
+
<span class="cstat-no" title="statement not covered" > symbol: string;</span>
|
|
2830
|
+
<span class="cstat-no" title="statement not covered" > /** Decimal places (0 for NFTs) */</span>
|
|
2831
|
+
<span class="cstat-no" title="statement not covered" > decimals: number;</span>
|
|
2832
|
+
<span class="cstat-no" title="statement not covered" > /** Initial supply (0 for NFTs) */</span>
|
|
2833
|
+
<span class="cstat-no" title="statement not covered" > initialSupply: number;</span>
|
|
2834
|
+
<span class="cstat-no" title="statement not covered" > /** Token type: FUNGIBLE or NFT */</span>
|
|
2835
|
+
<span class="cstat-no" title="statement not covered" > tokenType?: 'FUNGIBLE' | 'NFT';</span>
|
|
2836
|
+
<span class="cstat-no" title="statement not covered" > /** Admin key - can update/delete token */</span>
|
|
2837
|
+
<span class="cstat-no" title="statement not covered" > adminKey?: HederaKeyConfig;</span>
|
|
2838
|
+
<span class="cstat-no" title="statement not covered" > /** Supply key - can mint/burn tokens */</span>
|
|
2839
|
+
<span class="cstat-no" title="statement not covered" > supplyKey?: HederaKeyConfig;</span>
|
|
2840
|
+
<span class="cstat-no" title="statement not covered" > /** Freeze key - can freeze/unfreeze accounts */</span>
|
|
2841
|
+
<span class="cstat-no" title="statement not covered" > freezeKey?: HederaKeyConfig;</span>
|
|
2842
|
+
<span class="cstat-no" title="statement not covered" > /** Wipe key - can wipe token balance from accounts */</span>
|
|
2843
|
+
<span class="cstat-no" title="statement not covered" > wipeKey?: HederaKeyConfig;</span>
|
|
2844
|
+
<span class="cstat-no" title="statement not covered" > /** Pause key - can pause/unpause token operations */</span>
|
|
2845
|
+
<span class="cstat-no" title="statement not covered" > pauseKey?: HederaKeyConfig;</span>
|
|
2846
|
+
<span class="cstat-no" title="statement not covered" > /** KYC key - can grant/revoke KYC */</span>
|
|
2847
|
+
<span class="cstat-no" title="statement not covered" > kycKey?: HederaKeyConfig;</span>
|
|
2848
|
+
<span class="cstat-no" title="statement not covered" > /** Fee schedule key - can update custom fees */</span>
|
|
2849
|
+
<span class="cstat-no" title="statement not covered" > feeScheduleKey?: HederaKeyConfig;</span>
|
|
2850
|
+
<span class="cstat-no" title="statement not covered" > /** Token memo */</span>
|
|
2851
|
+
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2852
|
+
<span class="cstat-no" title="statement not covered" > /** Max supply (for finite tokens) */</span>
|
|
2853
|
+
<span class="cstat-no" title="statement not covered" > maxSupply?: number;</span>
|
|
2854
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2855
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2856
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2857
|
+
<span class="cstat-no" title="statement not covered" > * Extended options for account creation with key configuration.</span>
|
|
2858
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2859
|
+
<span class="cstat-no" title="statement not covered" >export interface AccountCreateOptions {</span>
|
|
2860
|
+
<span class="cstat-no" title="statement not covered" > /** Initial HBAR balance */</span>
|
|
2861
|
+
<span class="cstat-no" title="statement not covered" > initialBalance: number;</span>
|
|
2862
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2863
|
+
<span class="cstat-no" title="statement not covered" > * Key configuration for the new account.</span>
|
|
2864
|
+
<span class="cstat-no" title="statement not covered" > * For single-sig: provide publicKey</span>
|
|
2865
|
+
<span class="cstat-no" title="statement not covered" > * For multisig: provide signerPublicKeys + threshold</span>
|
|
2866
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2867
|
+
<span class="cstat-no" title="statement not covered" > key?: HederaKeyConfig;</span>
|
|
2868
|
+
<span class="cstat-no" title="statement not covered" > /** Account memo */</span>
|
|
2869
|
+
<span class="cstat-no" title="statement not covered" > memo?: string;</span>
|
|
2870
|
+
<span class="cstat-no" title="statement not covered" > /** Max automatic token associations */</span>
|
|
2871
|
+
<span class="cstat-no" title="statement not covered" > maxAutomaticTokenAssociations?: number;</span>
|
|
2872
|
+
<span class="cstat-no" title="statement not covered" > /** Receiver signature required */</span>
|
|
2873
|
+
<span class="cstat-no" title="statement not covered" > receiverSignatureRequired?: boolean;</span>
|
|
2874
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2875
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2876
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2877
|
+
<span class="cstat-no" title="statement not covered" > * Service for building Hedera transactions using the Hashgraph SDK.</span>
|
|
2878
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2879
|
+
<span class="cstat-no" title="statement not covered" > * @service HederaTransactionBuilderService</span>
|
|
2880
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2881
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2882
|
+
<span class="cstat-no" title="statement not covered" > * Provides methods to construct various Hedera transaction types and serialize them</span>
|
|
2883
|
+
<span class="cstat-no" title="statement not covered" > * to base64 payloads ready for signing. Transactions are automatically frozen with</span>
|
|
2884
|
+
<span class="cstat-no" title="statement not covered" > * the correct network client (mainnet/testnet) based on the active wallet session.</span>
|
|
2885
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2886
|
+
<span class="cstat-no" title="statement not covered" > * All build methods return a base64-encoded string that can be passed to</span>
|
|
2887
|
+
<span class="cstat-no" title="statement not covered" > * UnifiedWalletService.signTransaction() or submitTransaction().</span>
|
|
2888
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2889
|
+
<span class="cstat-no" title="statement not covered" > * @providedIn root</span>
|
|
2890
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2891
|
+
<span class="cstat-no" title="statement not covered" > * @Component({ ... })</span>
|
|
2892
|
+
<span class="cstat-no" title="statement not covered" > * export class SendPage {</span>
|
|
2893
|
+
<span class="cstat-no" title="statement not covered" > * private builder = inject(HederaTransactionBuilderService);</span>
|
|
2894
|
+
<span class="cstat-no" title="statement not covered" > * private wallet = inject(UnifiedWalletService);</span>
|
|
2895
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2896
|
+
<span class="cstat-no" title="statement not covered" > * async sendHbar(to: string, amount: number) {</span>
|
|
2897
|
+
<span class="cstat-no" title="statement not covered" > * const from = this.wallet.activeAccount()?.address;</span>
|
|
2898
|
+
<span class="cstat-no" title="statement not covered" > * const payload = await this.builder.buildSendHbar(from!, to, amount);</span>
|
|
2899
|
+
<span class="cstat-no" title="statement not covered" > * return this.wallet.submitTransaction({ payload });</span>
|
|
2900
|
+
<span class="cstat-no" title="statement not covered" > * }</span>
|
|
2901
|
+
<span class="cstat-no" title="statement not covered" > * }</span>
|
|
2902
|
+
<span class="cstat-no" title="statement not covered" > * ```</span>
|
|
2903
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2904
|
+
<span class="cstat-no" title="statement not covered" >@Injectable({</span>
|
|
2905
|
+
<span class="cstat-no" title="statement not covered" > providedIn: 'root',</span>
|
|
2906
|
+
<span class="cstat-no" title="statement not covered" >})</span>
|
|
2907
|
+
<span class="cstat-no" title="statement not covered" >export class HederaTransactionBuilderService {</span>
|
|
2908
|
+
<span class="cstat-no" title="statement not covered" > private readonly wallet = inject(UnifiedWalletService);</span>
|
|
2909
|
+
<span class="cstat-no" title="statement not covered" > private readonly logger = inject(LoggerService).scoped('HederaTransactionBuilder');</span>
|
|
2910
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2911
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2912
|
+
<span class="cstat-no" title="statement not covered" > * Gets the network ID from the active wallet account.</span>
|
|
2913
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2914
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
2915
|
+
<span class="cstat-no" title="statement not covered" > * Extracts the network identifier (e.g., 'hedera:mainnet', 'hedera:testnet')</span>
|
|
2916
|
+
<span class="cstat-no" title="statement not covered" > * from the currently active account. Used to create the appropriate Hedera</span>
|
|
2917
|
+
<span class="cstat-no" title="statement not covered" > * client for transaction freezing.</span>
|
|
2918
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2919
|
+
<span class="cstat-no" title="statement not covered" > * @returns Network ID string, or undefined if no active account</span>
|
|
2920
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2921
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} When used in methods that require a network, if no account is active</span>
|
|
2922
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2923
|
+
<span class="cstat-no" title="statement not covered" > private getNetworkId(): string | undefined {</span>
|
|
2924
|
+
<span class="cstat-no" title="statement not covered" > const activeAccount = this.wallet.activeAccount();</span>
|
|
2925
|
+
<span class="cstat-no" title="statement not covered" > return activeAccount?.networkId;</span>
|
|
2926
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2927
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2928
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2929
|
+
<span class="cstat-no" title="statement not covered" > * Build a Hedera Key from configuration.</span>
|
|
2930
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2931
|
+
<span class="cstat-no" title="statement not covered" > * For single-sig: returns PublicKey directly</span>
|
|
2932
|
+
<span class="cstat-no" title="statement not covered" > * For multisig: returns KeyList (threshold key) with all signer public keys</span>
|
|
2933
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2934
|
+
<span class="cstat-no" title="statement not covered" > * @param config - Key configuration (single key or threshold key)</span>
|
|
2935
|
+
<span class="cstat-no" title="statement not covered" > * @returns Hedera Key object or undefined if config is empty</span>
|
|
2936
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2937
|
+
<span class="cstat-no" title="statement not covered" > private buildKeyFromConfig(config?: HederaKeyConfig): Key | undefined {</span>
|
|
2938
|
+
<span class="cstat-no" title="statement not covered" > if (!config) {</span>
|
|
2939
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2940
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2941
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2942
|
+
<span class="cstat-no" title="statement not covered" > // Multisig: threshold key with multiple signers</span>
|
|
2943
|
+
<span class="cstat-no" title="statement not covered" > if (config.signerPublicKeys && config.signerPublicKeys.length > 0 && config.threshold) {</span>
|
|
2944
|
+
<span class="cstat-no" title="statement not covered" > const publicKeys = config.signerPublicKeys.map((pk) => PublicKey.fromString(pk));</span>
|
|
2945
|
+
<span class="cstat-no" title="statement not covered" > const keyList = new KeyList(publicKeys, config.threshold);</span>
|
|
2946
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Built threshold key', {</span>
|
|
2947
|
+
<span class="cstat-no" title="statement not covered" > signerCount: publicKeys.length,</span>
|
|
2948
|
+
<span class="cstat-no" title="statement not covered" > threshold: config.threshold,</span>
|
|
2949
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2950
|
+
<span class="cstat-no" title="statement not covered" > return keyList;</span>
|
|
2951
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2952
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2953
|
+
<span class="cstat-no" title="statement not covered" > // Single-sig: direct public key</span>
|
|
2954
|
+
<span class="cstat-no" title="statement not covered" > if (config.publicKey) {</span>
|
|
2955
|
+
<span class="cstat-no" title="statement not covered" > const key = PublicKey.fromString(config.publicKey);</span>
|
|
2956
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Built single public key');</span>
|
|
2957
|
+
<span class="cstat-no" title="statement not covered" > return key;</span>
|
|
2958
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2959
2959
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
2960
2960
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2961
|
-
}
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
* Get the key configuration for the active account
|
|
2965
|
-
|
|
2966
|
-
* For single-sig: returns { publicKey: '...' }
|
|
2967
|
-
* For multisig: returns { signerPublicKeys: [...], threshold: N }
|
|
2968
|
-
|
|
2969
|
-
* This allows automatic key configuration for entity creation (topics, tokens, etc.)
|
|
2970
|
-
* so that entities inherit the same key structure as the creating account
|
|
2971
|
-
|
|
2972
|
-
* @returns Key configuration or undefined if no active account
|
|
2973
|
-
|
|
2974
|
-
private getActiveAccountKeyConfig(): HederaKeyConfig | undefined {
|
|
2975
|
-
const activeAccount = this.wallet.activeAccount()
|
|
2976
|
-
|
|
2961
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2962
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2963
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2964
|
+
<span class="cstat-no" title="statement not covered" > * Get the key configuration for the active account.</span>
|
|
2965
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2966
|
+
<span class="cstat-no" title="statement not covered" > * For single-sig: returns { publicKey: '...' }</span>
|
|
2967
|
+
<span class="cstat-no" title="statement not covered" > * For multisig: returns { signerPublicKeys: [...], threshold: N }</span>
|
|
2968
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2969
|
+
<span class="cstat-no" title="statement not covered" > * This allows automatic key configuration for entity creation (topics, tokens, etc.)</span>
|
|
2970
|
+
<span class="cstat-no" title="statement not covered" > * so that entities inherit the same key structure as the creating account.</span>
|
|
2971
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2972
|
+
<span class="cstat-no" title="statement not covered" > * @returns Key configuration or undefined if no active account</span>
|
|
2973
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2974
|
+
<span class="cstat-no" title="statement not covered" > private getActiveAccountKeyConfig(): HederaKeyConfig | undefined {</span>
|
|
2975
|
+
<span class="cstat-no" title="statement not covered" > const activeAccount = this.wallet.activeAccount();</span>
|
|
2976
|
+
<span class="cstat-no" title="statement not covered" > if (!activeAccount) {</span>
|
|
2977
2977
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('No active account for key config');</span>
|
|
2978
2978
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2979
2979
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2980
|
-
|
|
2981
|
-
const metadata = activeAccount.metadata
|
|
2982
|
-
|
|
2983
|
-
// Check if this is a multisig account
|
|
2984
|
-
if (metadata?.['isMultisig'] === true) {
|
|
2985
|
-
const signerPublicKeys = metadata['signerPublicKeys'] as string[] | undefined
|
|
2986
|
-
const threshold = metadata['threshold'] as number | undefined
|
|
2987
|
-
|
|
2988
|
-
if (signerPublicKeys && signerPublicKeys.length > 0 && threshold) {
|
|
2989
|
-
this.logger.debug('Active account is multisig', {
|
|
2990
|
-
threshold
|
|
2991
|
-
signerCount: signerPublicKeys.length
|
|
2992
|
-
})
|
|
2993
|
-
return { signerPublicKeys, threshold }
|
|
2994
|
-
<span class="
|
|
2980
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2981
|
+
<span class="cstat-no" title="statement not covered" > const metadata = activeAccount.metadata;</span>
|
|
2982
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2983
|
+
<span class="cstat-no" title="statement not covered" > // Check if this is a multisig account</span>
|
|
2984
|
+
<span class="cstat-no" title="statement not covered" > if (metadata?.['isMultisig'] === true) {</span>
|
|
2985
|
+
<span class="cstat-no" title="statement not covered" > const signerPublicKeys = metadata['signerPublicKeys'] as string[] | undefined;</span>
|
|
2986
|
+
<span class="cstat-no" title="statement not covered" > const threshold = metadata['threshold'] as number | undefined;</span>
|
|
2987
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2988
|
+
<span class="cstat-no" title="statement not covered" > if (signerPublicKeys && signerPublicKeys.length > 0 && threshold) {</span>
|
|
2989
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Active account is multisig', {</span>
|
|
2990
|
+
<span class="cstat-no" title="statement not covered" > threshold,</span>
|
|
2991
|
+
<span class="cstat-no" title="statement not covered" > signerCount: signerPublicKeys.length,</span>
|
|
2992
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2993
|
+
<span class="cstat-no" title="statement not covered" > return { signerPublicKeys, threshold };</span>
|
|
2994
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2995
2995
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
2996
2996
|
<span class="cstat-no" title="statement not covered" > this.logger.warn('Multisig account missing signer keys or threshold in metadata');</span>
|
|
2997
2997
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2998
2998
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2999
|
-
|
|
3000
|
-
// Single-sig account - get public key from metadata
|
|
3001
|
-
const publicKey = metadata?.['publicKey'] as string | undefined
|
|
3002
|
-
if (publicKey) {
|
|
3003
|
-
this.logger.debug('Active account is single-sig')
|
|
3004
|
-
return { publicKey }
|
|
3005
|
-
<span class="
|
|
2999
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3000
|
+
<span class="cstat-no" title="statement not covered" > // Single-sig account - get public key from metadata</span>
|
|
3001
|
+
<span class="cstat-no" title="statement not covered" > const publicKey = metadata?.['publicKey'] as string | undefined;</span>
|
|
3002
|
+
<span class="cstat-no" title="statement not covered" > if (publicKey) {</span>
|
|
3003
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Active account is single-sig');</span>
|
|
3004
|
+
<span class="cstat-no" title="statement not covered" > return { publicKey };</span>
|
|
3005
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3006
3006
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3007
3007
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('No public key in active account metadata');</span>
|
|
3008
3008
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
3009
|
-
}
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
* Builds a simple HBAR transfer transaction
|
|
3013
|
-
|
|
3014
|
-
* @description
|
|
3015
|
-
* Creates a TransferTransaction that moves HBAR from one account to another
|
|
3016
|
-
* The transaction is automatically frozen with the appropriate network client
|
|
3017
|
-
|
|
3018
|
-
* @param fromAccount - Sender account ID (e.g., "0.0.12345")
|
|
3019
|
-
* @param toAccount - Recipient account ID
|
|
3020
|
-
* @param amount - Amount in HBAR (e.g., 1.5 for 1.5 HBAR)
|
|
3021
|
-
|
|
3022
|
-
* @returns Base64 encoded transaction bytes
|
|
3023
|
-
|
|
3024
|
-
* @throws {Error} If no active wallet session
|
|
3025
|
-
|
|
3026
|
-
async buildSendHbar(fromAccount: string, toAccount: string, amount: number): Promise<string> {
|
|
3027
|
-
const transaction = new TransferTransaction()
|
|
3028
|
-
.addHbarTransfer(AccountId.fromString(fromAccount), new Hbar(-amount))
|
|
3029
|
-
.addHbarTransfer(AccountId.fromString(toAccount), new Hbar(amount))
|
|
3030
|
-
|
|
3031
|
-
return this.serializeTransaction(transaction, fromAccount)
|
|
3032
|
-
}
|
|
3033
|
-
|
|
3034
|
-
|
|
3035
|
-
* Builds a fungible token transfer transaction
|
|
3036
|
-
|
|
3037
|
-
* @description
|
|
3038
|
-
* Creates a TransferTransaction that moves fungible tokens between accounts
|
|
3039
|
-
* The amount is automatically converted to the smallest unit based on decimals
|
|
3040
|
-
|
|
3041
|
-
* @param fromAccount - Sender account ID
|
|
3042
|
-
* @param toAccount - Recipient account ID
|
|
3043
|
-
* @param tokenId - Token ID (e.g., "0.0.98765")
|
|
3044
|
-
* @param amount - Token amount in display units (e.g., 100 tokens)
|
|
3045
|
-
* @param decimals - Token decimals for conversion (default 0)
|
|
3046
|
-
|
|
3047
|
-
* @returns Base64 encoded transaction bytes
|
|
3048
|
-
|
|
3049
|
-
* @throws {Error} If no active wallet session
|
|
3050
|
-
|
|
3051
|
-
async buildSendToken(
|
|
3052
|
-
fromAccount: string
|
|
3053
|
-
toAccount: string
|
|
3054
|
-
tokenId: string
|
|
3055
|
-
amount: number
|
|
3056
|
-
decimals = 0
|
|
3057
|
-
): Promise<string> {
|
|
3058
|
-
const token = TokenId.fromString(tokenId)
|
|
3059
|
-
// bigint scaling avoids the silent precision loss that
|
|
3060
|
-
// `amount * Math.pow(10, decimals)` exhibits past Number.MAX_SAFE_INTEGER
|
|
3061
|
-
// (Hedera supports up to 18 decimals). Narrow once at the SDK boundary
|
|
3062
|
-
// with an explicit overflow assertion
|
|
3063
|
-
const scaled = scaleHederaAmountToBaseUnits(amount, decimals)
|
|
3064
|
-
const actualAmount = assertSafeInteger(scaled, `buildSendToken tokenId=${tokenId}`)
|
|
3065
|
-
|
|
3066
|
-
const transaction = new TransferTransaction()
|
|
3067
|
-
.addTokenTransfer(token, AccountId.fromString(fromAccount), -actualAmount)
|
|
3068
|
-
.addTokenTransfer(token, AccountId.fromString(toAccount), actualAmount)
|
|
3069
|
-
|
|
3070
|
-
return this.serializeTransaction(transaction, fromAccount)
|
|
3071
|
-
}
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
* Builds an NFT transfer transaction
|
|
3075
|
-
|
|
3076
|
-
* @description
|
|
3077
|
-
* Creates a TransferTransaction that moves an NFT (identified by token ID
|
|
3078
|
-
* and serial number) from one account to another
|
|
3079
|
-
|
|
3080
|
-
* @param fromAccount - Sender account ID
|
|
3081
|
-
* @param toAccount - Recipient account ID
|
|
3082
|
-
* @param tokenId - NFT token ID (e.g., "0.0.98765")
|
|
3083
|
-
* @param serialNumber - NFT serial number (e.g., 1, 2, 3)
|
|
3084
|
-
|
|
3085
|
-
* @returns Base64 encoded transaction bytes
|
|
3086
|
-
|
|
3087
|
-
* @throws {Error} If no active wallet session
|
|
3088
|
-
|
|
3089
|
-
async buildSendNft(
|
|
3090
|
-
fromAccount: string
|
|
3091
|
-
toAccount: string
|
|
3092
|
-
tokenId: string
|
|
3093
|
-
serialNumber: number
|
|
3094
|
-
): Promise<string> {
|
|
3095
|
-
const nftId = new NftId(TokenId.fromString(tokenId), serialNumber)
|
|
3096
|
-
|
|
3097
|
-
const transaction = new TransferTransaction().addNftTransfer(
|
|
3098
|
-
nftId
|
|
3099
|
-
AccountId.fromString(fromAccount)
|
|
3100
|
-
AccountId.fromString(toAccount)
|
|
3101
|
-
)
|
|
3102
|
-
|
|
3103
|
-
return this.serializeTransaction(transaction, fromAccount)
|
|
3104
|
-
}
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
* Builds a token association transaction
|
|
3108
|
-
|
|
3109
|
-
* @description
|
|
3110
|
-
* Creates a TokenAssociateTransaction that associates one or more tokens
|
|
3111
|
-
* with an account. This is required before an account can receive tokens
|
|
3112
|
-
* on Hedera
|
|
3113
|
-
|
|
3114
|
-
* @param account - Account to associate tokens with
|
|
3115
|
-
* @param tokenIds - Array of token IDs to associate
|
|
3116
|
-
|
|
3117
|
-
* @returns Base64 encoded transaction bytes
|
|
3118
|
-
|
|
3119
|
-
* @throws {Error} If no active wallet session
|
|
3120
|
-
|
|
3121
|
-
async buildAssociateToken(account: string, tokenIds: string[]): Promise<string> {
|
|
3122
|
-
const tokens = tokenIds.map((id) => TokenId.fromString(id))
|
|
3123
|
-
|
|
3124
|
-
const transaction = new TokenAssociateTransaction()
|
|
3125
|
-
.setAccountId(AccountId.fromString(account))
|
|
3126
|
-
.setTokenIds(tokens)
|
|
3127
|
-
|
|
3128
|
-
return this.serializeTransaction(transaction, account)
|
|
3129
|
-
}
|
|
3130
|
-
|
|
3131
|
-
|
|
3132
|
-
* Builds a token dissociation transaction
|
|
3133
|
-
|
|
3134
|
-
* @description
|
|
3135
|
-
* Creates a TokenDissociateTransaction that removes the association between
|
|
3136
|
-
* an account and one or more tokens. The account must have zero balance of
|
|
3137
|
-
* each token before dissociating
|
|
3138
|
-
|
|
3139
|
-
* @param account - Account to dissociate tokens from
|
|
3140
|
-
* @param tokenIds - Array of token IDs to dissociate
|
|
3141
|
-
|
|
3142
|
-
* @returns Base64 encoded transaction bytes
|
|
3143
|
-
|
|
3144
|
-
* @throws {Error} If no active wallet session
|
|
3145
|
-
|
|
3146
|
-
async buildDissociateToken(account: string, tokenIds: string[]): Promise<string> {
|
|
3147
|
-
const tokens = tokenIds.map((id) => TokenId.fromString(id))
|
|
3148
|
-
|
|
3149
|
-
const transaction = new TokenDissociateTransaction()
|
|
3150
|
-
.setAccountId(AccountId.fromString(account))
|
|
3151
|
-
.setTokenIds(tokens)
|
|
3152
|
-
|
|
3153
|
-
return this.serializeTransaction(transaction, account)
|
|
3154
|
-
}
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
* Build a scheduled transaction
|
|
3158
|
-
* @param innerTransactionBytes - Base64 encoded inner transaction
|
|
3159
|
-
* @param payerAccount - Payer account for the scheduled transaction (required)
|
|
3160
|
-
* @param memo - Optional memo
|
|
3161
|
-
* @returns Base64 encoded scheduled transaction bytes
|
|
3162
|
-
|
|
3163
|
-
async buildScheduledTransaction(
|
|
3164
|
-
innerTransactionBytes: string
|
|
3165
|
-
payerAccount: string
|
|
3166
|
-
memo?: string
|
|
3167
|
-
): Promise<string> {
|
|
3168
|
-
const exampleInnerTx = new TransferTransaction()
|
|
3169
|
-
.addHbarTransfer(AccountId.fromString(payerAccount), new Hbar(-1))
|
|
3170
|
-
.addHbarTransfer(AccountId.fromString('0.0.3'), new Hbar(1))
|
|
3171
|
-
|
|
3172
|
-
const transaction = new ScheduleCreateTransaction()
|
|
3173
|
-
.setScheduledTransaction(exampleInnerTx)
|
|
3174
|
-
.setPayerAccountId(AccountId.fromString(payerAccount))
|
|
3175
|
-
|
|
3176
|
-
if (memo) {
|
|
3177
|
-
transaction.setScheduleMemo(memo)
|
|
3178
|
-
}
|
|
3179
|
-
|
|
3180
|
-
return this.serializeTransaction(transaction, payerAccount)
|
|
3181
|
-
}
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
* Build a batch of transactions with the same payer
|
|
3185
|
-
* @param transactions - Array of base64 encoded transactions
|
|
3186
|
-
* @returns Array of base64 encoded transactions (ready for batch submission)
|
|
3187
|
-
|
|
3188
|
-
async buildBatchTransactions(transactions: string[]): Promise<string[]> {
|
|
3189
|
-
return transactions
|
|
3190
|
-
}
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
* Build a complex atomic transaction (multiple transfers in one transaction)
|
|
3194
|
-
* @param transfers - Array of transfer operations
|
|
3195
|
-
* @returns Base64 encoded transaction bytes
|
|
3196
|
-
|
|
3197
|
-
async buildAtomicTransaction(
|
|
3198
|
-
transfers: Array<{
|
|
3199
|
-
type: 'hbar' | 'token'
|
|
3200
|
-
fromAccount: string
|
|
3201
|
-
toAccount: string
|
|
3202
|
-
amount: number
|
|
3203
|
-
tokenId?: string
|
|
3204
|
-
decimals?: number
|
|
3205
|
-
}>
|
|
3206
|
-
): Promise<string> {
|
|
3207
|
-
if (transfers.length === 0) {
|
|
3208
|
-
throw new Error('At least one transfer is required for an atomic transaction')
|
|
3209
|
-
}
|
|
3210
|
-
|
|
3211
|
-
const transaction = new TransferTransaction()
|
|
3212
|
-
const payerAccount = transfers[0].fromAccount
|
|
3213
|
-
|
|
3214
|
-
for (const transfer of transfers) {
|
|
3215
|
-
if (transfer.type === 'hbar') {
|
|
3216
|
-
transaction
|
|
3217
|
-
.addHbarTransfer(AccountId.fromString(transfer.fromAccount), new Hbar(-transfer.amount))
|
|
3218
|
-
.addHbarTransfer(AccountId.fromString(transfer.toAccount), new Hbar(transfer.amount))
|
|
3219
|
-
} else if (transfer.type === 'token' && transfer.tokenId) {
|
|
3220
|
-
const token = TokenId.fromString(transfer.tokenId)
|
|
3221
|
-
const decimals = transfer.decimals || 0
|
|
3222
|
-
const scaled = scaleHederaAmountToBaseUnits(transfer.amount, decimals)
|
|
3223
|
-
const actualAmount = assertSafeInteger(
|
|
3224
|
-
scaled
|
|
3225
|
-
`atomicTransaction token=${transfer.tokenId}
|
|
3226
|
-
)
|
|
3227
|
-
|
|
3228
|
-
transaction
|
|
3229
|
-
.addTokenTransfer(token, AccountId.fromString(transfer.fromAccount), -actualAmount)
|
|
3230
|
-
.addTokenTransfer(token, AccountId.fromString(transfer.toAccount), actualAmount)
|
|
3231
|
-
}
|
|
3232
|
-
}
|
|
3233
|
-
|
|
3234
|
-
return this.serializeTransaction(transaction, payerAccount)
|
|
3235
|
-
}
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
* Build a token creation transaction with automatic key configuration
|
|
3239
|
-
|
|
3240
|
-
* **Auto-key behavior**: If no adminKey/supplyKey is provided, the token will automatically
|
|
3241
|
-
* inherit the creating account's key structure
|
|
3242
|
-
* - Single-sig account → token keys = account's public key
|
|
3243
|
-
* - Multisig account → token keys = threshold key with all signers
|
|
3244
|
-
|
|
3245
|
-
* This ensures tokens created from multisig accounts are also controlled by the multisig
|
|
3246
|
-
|
|
3247
|
-
* @param treasuryAccount - Account that will hold the tokens
|
|
3248
|
-
* @param options - Token creation options (keys auto-detected if not provided)
|
|
3249
|
-
* @param optionsOrName
|
|
3250
|
-
* @param symbol
|
|
3251
|
-
* @param decimals
|
|
3252
|
-
* @param initialSupply
|
|
3253
|
-
* @param tokenType
|
|
3254
|
-
* @returns Base64 encoded transaction bytes
|
|
3255
|
-
|
|
3256
|
-
async buildTokenCreate(
|
|
3257
|
-
treasuryAccount: string
|
|
3258
|
-
optionsOrName: TokenCreateOptions | string
|
|
3259
|
-
symbol?: string
|
|
3260
|
-
decimals?: number
|
|
3261
|
-
initialSupply?: number
|
|
3262
|
-
tokenType: 'FUNGIBLE' | 'NFT' = 'FUNGIBLE'
|
|
3263
|
-
): Promise<string> {
|
|
3264
|
-
// Support both object and positional arguments
|
|
3265
|
-
const opts: TokenCreateOptions
|
|
3266
|
-
typeof optionsOrName === 'string'
|
|
3267
|
-
? {
|
|
3268
|
-
name: optionsOrName
|
|
3269
|
-
symbol: symbol
|
|
3270
|
-
decimals: decimals
|
|
3271
|
-
initialSupply: initialSupply
|
|
3272
|
-
tokenType
|
|
3273
|
-
}
|
|
3274
|
-
: optionsOrName
|
|
3275
|
-
|
|
3276
|
-
const transaction = new TokenCreateTransaction()
|
|
3277
|
-
.setTokenName(opts.name)
|
|
3278
|
-
.setTokenSymbol(opts.symbol)
|
|
3279
|
-
.setDecimals(opts.decimals)
|
|
3280
|
-
.setInitialSupply(opts.initialSupply)
|
|
3281
|
-
.setTreasuryAccountId(AccountId.fromString(treasuryAccount))
|
|
3282
|
-
.setTokenType(
|
|
3283
|
-
opts.tokenType === 'NFT' ? TokenType.NonFungibleUnique : TokenType.FungibleCommon
|
|
3284
|
-
)
|
|
3285
|
-
.setSupplyType(opts.maxSupply ? TokenSupplyType.Finite : TokenSupplyType.Infinite)
|
|
3286
|
-
|
|
3287
|
-
// Set max supply if finite
|
|
3288
|
-
if (opts.maxSupply) {
|
|
3289
|
-
transaction.setMaxSupply(opts.maxSupply)
|
|
3290
|
-
}
|
|
3291
|
-
|
|
3292
|
-
// Set memo if provided
|
|
3293
|
-
if (opts.memo) {
|
|
3294
|
-
transaction.setTokenMemo(opts.memo)
|
|
3295
|
-
}
|
|
3296
|
-
|
|
3297
|
-
// Auto-detect key config from active account if not explicitly provided
|
|
3298
|
-
const autoKeyConfig = this.getActiveAccountKeyConfig()
|
|
3299
|
-
const isAutoDetected = !!autoKeyConfig
|
|
3300
|
-
|
|
3301
|
-
// Set admin key - use provided or auto-detected
|
|
3302
|
-
const adminKeyConfig = opts.adminKey ?? autoKeyConfig
|
|
3303
|
-
const adminKey = this.buildKeyFromConfig(adminKeyConfig)
|
|
3304
|
-
if (adminKey) {
|
|
3305
|
-
transaction.setAdminKey(adminKey)
|
|
3306
|
-
this.logger.debug('Token admin key set', { autoDetected: !opts.adminKey && isAutoDetected })
|
|
3307
|
-
}
|
|
3308
|
-
|
|
3309
|
-
// Set supply key - use provided or auto-detected
|
|
3310
|
-
const supplyKeyConfig = opts.supplyKey ?? autoKeyConfig
|
|
3311
|
-
const supplyKey = this.buildKeyFromConfig(supplyKeyConfig)
|
|
3312
|
-
if (supplyKey) {
|
|
3313
|
-
transaction.setSupplyKey(supplyKey)
|
|
3314
|
-
this.logger.debug('Token supply key set', {
|
|
3315
|
-
autoDetected: !opts.supplyKey && isAutoDetected
|
|
3316
|
-
})
|
|
3317
|
-
}
|
|
3318
|
-
|
|
3319
|
-
// Set freeze key - only if explicitly provided (not auto-set)
|
|
3320
|
-
const freezeKey = this.buildKeyFromConfig(opts.freezeKey)
|
|
3321
|
-
|
|
3009
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3010
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3011
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3012
|
+
<span class="cstat-no" title="statement not covered" > * Builds a simple HBAR transfer transaction.</span>
|
|
3013
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3014
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
3015
|
+
<span class="cstat-no" title="statement not covered" > * Creates a TransferTransaction that moves HBAR from one account to another.</span>
|
|
3016
|
+
<span class="cstat-no" title="statement not covered" > * The transaction is automatically frozen with the appropriate network client.</span>
|
|
3017
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3018
|
+
<span class="cstat-no" title="statement not covered" > * @param fromAccount - Sender account ID (e.g., "0.0.12345")</span>
|
|
3019
|
+
<span class="cstat-no" title="statement not covered" > * @param toAccount - Recipient account ID</span>
|
|
3020
|
+
<span class="cstat-no" title="statement not covered" > * @param amount - Amount in HBAR (e.g., 1.5 for 1.5 HBAR)</span>
|
|
3021
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3022
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3023
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3024
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active wallet session</span>
|
|
3025
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3026
|
+
<span class="cstat-no" title="statement not covered" > async buildSendHbar(fromAccount: string, toAccount: string, amount: number): Promise<string> {</span>
|
|
3027
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TransferTransaction()</span>
|
|
3028
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(AccountId.fromString(fromAccount), new Hbar(-amount))</span>
|
|
3029
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(AccountId.fromString(toAccount), new Hbar(amount));</span>
|
|
3030
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3031
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, fromAccount);</span>
|
|
3032
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3033
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3034
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3035
|
+
<span class="cstat-no" title="statement not covered" > * Builds a fungible token transfer transaction.</span>
|
|
3036
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3037
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
3038
|
+
<span class="cstat-no" title="statement not covered" > * Creates a TransferTransaction that moves fungible tokens between accounts.</span>
|
|
3039
|
+
<span class="cstat-no" title="statement not covered" > * The amount is automatically converted to the smallest unit based on decimals.</span>
|
|
3040
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3041
|
+
<span class="cstat-no" title="statement not covered" > * @param fromAccount - Sender account ID</span>
|
|
3042
|
+
<span class="cstat-no" title="statement not covered" > * @param toAccount - Recipient account ID</span>
|
|
3043
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenId - Token ID (e.g., "0.0.98765")</span>
|
|
3044
|
+
<span class="cstat-no" title="statement not covered" > * @param amount - Token amount in display units (e.g., 100 tokens)</span>
|
|
3045
|
+
<span class="cstat-no" title="statement not covered" > * @param decimals - Token decimals for conversion (default 0)</span>
|
|
3046
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3047
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3048
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3049
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active wallet session</span>
|
|
3050
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3051
|
+
<span class="cstat-no" title="statement not covered" > async buildSendToken(</span>
|
|
3052
|
+
<span class="cstat-no" title="statement not covered" > fromAccount: string,</span>
|
|
3053
|
+
<span class="cstat-no" title="statement not covered" > toAccount: string,</span>
|
|
3054
|
+
<span class="cstat-no" title="statement not covered" > tokenId: string,</span>
|
|
3055
|
+
<span class="cstat-no" title="statement not covered" > amount: number,</span>
|
|
3056
|
+
<span class="cstat-no" title="statement not covered" > decimals = 0,</span>
|
|
3057
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3058
|
+
<span class="cstat-no" title="statement not covered" > const token = TokenId.fromString(tokenId);</span>
|
|
3059
|
+
<span class="cstat-no" title="statement not covered" > // bigint scaling avoids the silent precision loss that</span>
|
|
3060
|
+
<span class="cstat-no" title="statement not covered" > // `amount * Math.pow(10, decimals)` exhibits past Number.MAX_SAFE_INTEGER</span>
|
|
3061
|
+
<span class="cstat-no" title="statement not covered" > // (Hedera supports up to 18 decimals). Narrow once at the SDK boundary</span>
|
|
3062
|
+
<span class="cstat-no" title="statement not covered" > // with an explicit overflow assertion.</span>
|
|
3063
|
+
<span class="cstat-no" title="statement not covered" > const scaled = scaleHederaAmountToBaseUnits(amount, decimals);</span>
|
|
3064
|
+
<span class="cstat-no" title="statement not covered" > const actualAmount = assertSafeInteger(scaled, `buildSendToken tokenId=${tokenId}`);</span>
|
|
3065
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3066
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TransferTransaction()</span>
|
|
3067
|
+
<span class="cstat-no" title="statement not covered" > .addTokenTransfer(token, AccountId.fromString(fromAccount), -actualAmount)</span>
|
|
3068
|
+
<span class="cstat-no" title="statement not covered" > .addTokenTransfer(token, AccountId.fromString(toAccount), actualAmount);</span>
|
|
3069
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3070
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, fromAccount);</span>
|
|
3071
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3072
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3073
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3074
|
+
<span class="cstat-no" title="statement not covered" > * Builds an NFT transfer transaction.</span>
|
|
3075
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3076
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
3077
|
+
<span class="cstat-no" title="statement not covered" > * Creates a TransferTransaction that moves an NFT (identified by token ID</span>
|
|
3078
|
+
<span class="cstat-no" title="statement not covered" > * and serial number) from one account to another.</span>
|
|
3079
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3080
|
+
<span class="cstat-no" title="statement not covered" > * @param fromAccount - Sender account ID</span>
|
|
3081
|
+
<span class="cstat-no" title="statement not covered" > * @param toAccount - Recipient account ID</span>
|
|
3082
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenId - NFT token ID (e.g., "0.0.98765")</span>
|
|
3083
|
+
<span class="cstat-no" title="statement not covered" > * @param serialNumber - NFT serial number (e.g., 1, 2, 3)</span>
|
|
3084
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3085
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3086
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3087
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active wallet session</span>
|
|
3088
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3089
|
+
<span class="cstat-no" title="statement not covered" > async buildSendNft(</span>
|
|
3090
|
+
<span class="cstat-no" title="statement not covered" > fromAccount: string,</span>
|
|
3091
|
+
<span class="cstat-no" title="statement not covered" > toAccount: string,</span>
|
|
3092
|
+
<span class="cstat-no" title="statement not covered" > tokenId: string,</span>
|
|
3093
|
+
<span class="cstat-no" title="statement not covered" > serialNumber: number,</span>
|
|
3094
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3095
|
+
<span class="cstat-no" title="statement not covered" > const nftId = new NftId(TokenId.fromString(tokenId), serialNumber);</span>
|
|
3096
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3097
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TransferTransaction().addNftTransfer(</span>
|
|
3098
|
+
<span class="cstat-no" title="statement not covered" > nftId,</span>
|
|
3099
|
+
<span class="cstat-no" title="statement not covered" > AccountId.fromString(fromAccount),</span>
|
|
3100
|
+
<span class="cstat-no" title="statement not covered" > AccountId.fromString(toAccount),</span>
|
|
3101
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
3102
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3103
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, fromAccount);</span>
|
|
3104
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3105
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3106
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3107
|
+
<span class="cstat-no" title="statement not covered" > * Builds a token association transaction.</span>
|
|
3108
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3109
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
3110
|
+
<span class="cstat-no" title="statement not covered" > * Creates a TokenAssociateTransaction that associates one or more tokens</span>
|
|
3111
|
+
<span class="cstat-no" title="statement not covered" > * with an account. This is required before an account can receive tokens</span>
|
|
3112
|
+
<span class="cstat-no" title="statement not covered" > * on Hedera.</span>
|
|
3113
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3114
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account to associate tokens with</span>
|
|
3115
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenIds - Array of token IDs to associate</span>
|
|
3116
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3117
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3118
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3119
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active wallet session</span>
|
|
3120
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3121
|
+
<span class="cstat-no" title="statement not covered" > async buildAssociateToken(account: string, tokenIds: string[]): Promise<string> {</span>
|
|
3122
|
+
<span class="cstat-no" title="statement not covered" > const tokens = tokenIds.map((id) => TokenId.fromString(id));</span>
|
|
3123
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3124
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TokenAssociateTransaction()</span>
|
|
3125
|
+
<span class="cstat-no" title="statement not covered" > .setAccountId(AccountId.fromString(account))</span>
|
|
3126
|
+
<span class="cstat-no" title="statement not covered" > .setTokenIds(tokens);</span>
|
|
3127
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3128
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3129
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3130
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3131
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3132
|
+
<span class="cstat-no" title="statement not covered" > * Builds a token dissociation transaction.</span>
|
|
3133
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3134
|
+
<span class="cstat-no" title="statement not covered" > * @description</span>
|
|
3135
|
+
<span class="cstat-no" title="statement not covered" > * Creates a TokenDissociateTransaction that removes the association between</span>
|
|
3136
|
+
<span class="cstat-no" title="statement not covered" > * an account and one or more tokens. The account must have zero balance of</span>
|
|
3137
|
+
<span class="cstat-no" title="statement not covered" > * each token before dissociating.</span>
|
|
3138
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3139
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account to dissociate tokens from</span>
|
|
3140
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenIds - Array of token IDs to dissociate</span>
|
|
3141
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3142
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3143
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3144
|
+
<span class="cstat-no" title="statement not covered" > * @throws {Error} If no active wallet session</span>
|
|
3145
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3146
|
+
<span class="cstat-no" title="statement not covered" > async buildDissociateToken(account: string, tokenIds: string[]): Promise<string> {</span>
|
|
3147
|
+
<span class="cstat-no" title="statement not covered" > const tokens = tokenIds.map((id) => TokenId.fromString(id));</span>
|
|
3148
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3149
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TokenDissociateTransaction()</span>
|
|
3150
|
+
<span class="cstat-no" title="statement not covered" > .setAccountId(AccountId.fromString(account))</span>
|
|
3151
|
+
<span class="cstat-no" title="statement not covered" > .setTokenIds(tokens);</span>
|
|
3152
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3153
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3154
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3155
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3156
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3157
|
+
<span class="cstat-no" title="statement not covered" > * Build a scheduled transaction</span>
|
|
3158
|
+
<span class="cstat-no" title="statement not covered" > * @param innerTransactionBytes - Base64 encoded inner transaction</span>
|
|
3159
|
+
<span class="cstat-no" title="statement not covered" > * @param payerAccount - Payer account for the scheduled transaction (required)</span>
|
|
3160
|
+
<span class="cstat-no" title="statement not covered" > * @param memo - Optional memo</span>
|
|
3161
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded scheduled transaction bytes</span>
|
|
3162
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3163
|
+
<span class="cstat-no" title="statement not covered" > async buildScheduledTransaction(</span>
|
|
3164
|
+
<span class="cstat-no" title="statement not covered" > innerTransactionBytes: string,</span>
|
|
3165
|
+
<span class="cstat-no" title="statement not covered" > payerAccount: string,</span>
|
|
3166
|
+
<span class="cstat-no" title="statement not covered" > memo?: string,</span>
|
|
3167
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3168
|
+
<span class="cstat-no" title="statement not covered" > const exampleInnerTx = new TransferTransaction()</span>
|
|
3169
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(AccountId.fromString(payerAccount), new Hbar(-1))</span>
|
|
3170
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(AccountId.fromString('0.0.3'), new Hbar(1));</span>
|
|
3171
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3172
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new ScheduleCreateTransaction()</span>
|
|
3173
|
+
<span class="cstat-no" title="statement not covered" > .setScheduledTransaction(exampleInnerTx)</span>
|
|
3174
|
+
<span class="cstat-no" title="statement not covered" > .setPayerAccountId(AccountId.fromString(payerAccount));</span>
|
|
3175
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3176
|
+
<span class="cstat-no" title="statement not covered" > if (memo) {</span>
|
|
3177
|
+
<span class="cstat-no" title="statement not covered" > transaction.setScheduleMemo(memo);</span>
|
|
3178
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3179
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3180
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, payerAccount);</span>
|
|
3181
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3182
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3183
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3184
|
+
<span class="cstat-no" title="statement not covered" > * Build a batch of transactions with the same payer</span>
|
|
3185
|
+
<span class="cstat-no" title="statement not covered" > * @param transactions - Array of base64 encoded transactions</span>
|
|
3186
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of base64 encoded transactions (ready for batch submission)</span>
|
|
3187
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3188
|
+
<span class="cstat-no" title="statement not covered" > async buildBatchTransactions(transactions: string[]): Promise<string[]> {</span>
|
|
3189
|
+
<span class="cstat-no" title="statement not covered" > return transactions;</span>
|
|
3190
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3191
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3192
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3193
|
+
<span class="cstat-no" title="statement not covered" > * Build a complex atomic transaction (multiple transfers in one transaction)</span>
|
|
3194
|
+
<span class="cstat-no" title="statement not covered" > * @param transfers - Array of transfer operations</span>
|
|
3195
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3196
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3197
|
+
<span class="cstat-no" title="statement not covered" > async buildAtomicTransaction(</span>
|
|
3198
|
+
<span class="cstat-no" title="statement not covered" > transfers: Array<{</span>
|
|
3199
|
+
<span class="cstat-no" title="statement not covered" > type: 'hbar' | 'token';</span>
|
|
3200
|
+
<span class="cstat-no" title="statement not covered" > fromAccount: string;</span>
|
|
3201
|
+
<span class="cstat-no" title="statement not covered" > toAccount: string;</span>
|
|
3202
|
+
<span class="cstat-no" title="statement not covered" > amount: number;</span>
|
|
3203
|
+
<span class="cstat-no" title="statement not covered" > tokenId?: string;</span>
|
|
3204
|
+
<span class="cstat-no" title="statement not covered" > decimals?: number;</span>
|
|
3205
|
+
<span class="cstat-no" title="statement not covered" > }>,</span>
|
|
3206
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3207
|
+
<span class="cstat-no" title="statement not covered" > if (transfers.length === 0) {</span>
|
|
3208
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('At least one transfer is required for an atomic transaction');</span>
|
|
3209
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3210
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3211
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TransferTransaction();</span>
|
|
3212
|
+
<span class="cstat-no" title="statement not covered" > const payerAccount = transfers[0].fromAccount;</span>
|
|
3213
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3214
|
+
<span class="cstat-no" title="statement not covered" > for (const transfer of transfers) {</span>
|
|
3215
|
+
<span class="cstat-no" title="statement not covered" > if (transfer.type === 'hbar') {</span>
|
|
3216
|
+
<span class="cstat-no" title="statement not covered" > transaction</span>
|
|
3217
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(AccountId.fromString(transfer.fromAccount), new Hbar(-transfer.amount))</span>
|
|
3218
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(AccountId.fromString(transfer.toAccount), new Hbar(transfer.amount));</span>
|
|
3219
|
+
<span class="cstat-no" title="statement not covered" > } else if (transfer.type === 'token' && transfer.tokenId) {</span>
|
|
3220
|
+
<span class="cstat-no" title="statement not covered" > const token = TokenId.fromString(transfer.tokenId);</span>
|
|
3221
|
+
<span class="cstat-no" title="statement not covered" > const decimals = transfer.decimals || 0;</span>
|
|
3222
|
+
<span class="cstat-no" title="statement not covered" > const scaled = scaleHederaAmountToBaseUnits(transfer.amount, decimals);</span>
|
|
3223
|
+
<span class="cstat-no" title="statement not covered" > const actualAmount = assertSafeInteger(</span>
|
|
3224
|
+
<span class="cstat-no" title="statement not covered" > scaled,</span>
|
|
3225
|
+
<span class="cstat-no" title="statement not covered" > `atomicTransaction token=${transfer.tokenId}`,</span>
|
|
3226
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
3227
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3228
|
+
<span class="cstat-no" title="statement not covered" > transaction</span>
|
|
3229
|
+
<span class="cstat-no" title="statement not covered" > .addTokenTransfer(token, AccountId.fromString(transfer.fromAccount), -actualAmount)</span>
|
|
3230
|
+
<span class="cstat-no" title="statement not covered" > .addTokenTransfer(token, AccountId.fromString(transfer.toAccount), actualAmount);</span>
|
|
3231
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3232
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3233
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3234
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, payerAccount);</span>
|
|
3235
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3236
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3237
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3238
|
+
<span class="cstat-no" title="statement not covered" > * Build a token creation transaction with automatic key configuration.</span>
|
|
3239
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3240
|
+
<span class="cstat-no" title="statement not covered" > * **Auto-key behavior**: If no adminKey/supplyKey is provided, the token will automatically</span>
|
|
3241
|
+
<span class="cstat-no" title="statement not covered" > * inherit the creating account's key structure:</span>
|
|
3242
|
+
<span class="cstat-no" title="statement not covered" > * - Single-sig account → token keys = account's public key</span>
|
|
3243
|
+
<span class="cstat-no" title="statement not covered" > * - Multisig account → token keys = threshold key with all signers</span>
|
|
3244
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3245
|
+
<span class="cstat-no" title="statement not covered" > * This ensures tokens created from multisig accounts are also controlled by the multisig.</span>
|
|
3246
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3247
|
+
<span class="cstat-no" title="statement not covered" > * @param treasuryAccount - Account that will hold the tokens</span>
|
|
3248
|
+
<span class="cstat-no" title="statement not covered" > * @param options - Token creation options (keys auto-detected if not provided)</span>
|
|
3249
|
+
<span class="cstat-no" title="statement not covered" > * @param optionsOrName</span>
|
|
3250
|
+
<span class="cstat-no" title="statement not covered" > * @param symbol</span>
|
|
3251
|
+
<span class="cstat-no" title="statement not covered" > * @param decimals</span>
|
|
3252
|
+
<span class="cstat-no" title="statement not covered" > * @param initialSupply</span>
|
|
3253
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenType</span>
|
|
3254
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3255
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3256
|
+
<span class="cstat-no" title="statement not covered" > async buildTokenCreate(</span>
|
|
3257
|
+
<span class="cstat-no" title="statement not covered" > treasuryAccount: string,</span>
|
|
3258
|
+
<span class="cstat-no" title="statement not covered" > optionsOrName: TokenCreateOptions | string,</span>
|
|
3259
|
+
<span class="cstat-no" title="statement not covered" > symbol?: string,</span>
|
|
3260
|
+
<span class="cstat-no" title="statement not covered" > decimals?: number,</span>
|
|
3261
|
+
<span class="cstat-no" title="statement not covered" > initialSupply?: number,</span>
|
|
3262
|
+
<span class="cstat-no" title="statement not covered" > tokenType: 'FUNGIBLE' | 'NFT' = 'FUNGIBLE',</span>
|
|
3263
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3264
|
+
<span class="cstat-no" title="statement not covered" > // Support both object and positional arguments</span>
|
|
3265
|
+
<span class="cstat-no" title="statement not covered" > const opts: TokenCreateOptions =</span>
|
|
3266
|
+
<span class="cstat-no" title="statement not covered" > typeof optionsOrName === 'string'</span>
|
|
3267
|
+
<span class="cstat-no" title="statement not covered" > ? {</span>
|
|
3268
|
+
<span class="cstat-no" title="statement not covered" > name: optionsOrName,</span>
|
|
3269
|
+
<span class="cstat-no" title="statement not covered" > symbol: symbol!,</span>
|
|
3270
|
+
<span class="cstat-no" title="statement not covered" > decimals: decimals!,</span>
|
|
3271
|
+
<span class="cstat-no" title="statement not covered" > initialSupply: initialSupply!,</span>
|
|
3272
|
+
<span class="cstat-no" title="statement not covered" > tokenType,</span>
|
|
3273
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3274
|
+
<span class="cstat-no" title="statement not covered" > : optionsOrName;</span>
|
|
3275
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3276
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TokenCreateTransaction()</span>
|
|
3277
|
+
<span class="cstat-no" title="statement not covered" > .setTokenName(opts.name)</span>
|
|
3278
|
+
<span class="cstat-no" title="statement not covered" > .setTokenSymbol(opts.symbol)</span>
|
|
3279
|
+
<span class="cstat-no" title="statement not covered" > .setDecimals(opts.decimals)</span>
|
|
3280
|
+
<span class="cstat-no" title="statement not covered" > .setInitialSupply(opts.initialSupply)</span>
|
|
3281
|
+
<span class="cstat-no" title="statement not covered" > .setTreasuryAccountId(AccountId.fromString(treasuryAccount))</span>
|
|
3282
|
+
<span class="cstat-no" title="statement not covered" > .setTokenType(</span>
|
|
3283
|
+
<span class="cstat-no" title="statement not covered" > opts.tokenType === 'NFT' ? TokenType.NonFungibleUnique : TokenType.FungibleCommon,</span>
|
|
3284
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
3285
|
+
<span class="cstat-no" title="statement not covered" > .setSupplyType(opts.maxSupply ? TokenSupplyType.Finite : TokenSupplyType.Infinite);</span>
|
|
3286
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3287
|
+
<span class="cstat-no" title="statement not covered" > // Set max supply if finite</span>
|
|
3288
|
+
<span class="cstat-no" title="statement not covered" > if (opts.maxSupply) {</span>
|
|
3289
|
+
<span class="cstat-no" title="statement not covered" > transaction.setMaxSupply(opts.maxSupply);</span>
|
|
3290
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3291
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3292
|
+
<span class="cstat-no" title="statement not covered" > // Set memo if provided</span>
|
|
3293
|
+
<span class="cstat-no" title="statement not covered" > if (opts.memo) {</span>
|
|
3294
|
+
<span class="cstat-no" title="statement not covered" > transaction.setTokenMemo(opts.memo);</span>
|
|
3295
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3296
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3297
|
+
<span class="cstat-no" title="statement not covered" > // Auto-detect key config from active account if not explicitly provided</span>
|
|
3298
|
+
<span class="cstat-no" title="statement not covered" > const autoKeyConfig = this.getActiveAccountKeyConfig();</span>
|
|
3299
|
+
<span class="cstat-no" title="statement not covered" > const isAutoDetected = !!autoKeyConfig;</span>
|
|
3300
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3301
|
+
<span class="cstat-no" title="statement not covered" > // Set admin key - use provided or auto-detected</span>
|
|
3302
|
+
<span class="cstat-no" title="statement not covered" > const adminKeyConfig = opts.adminKey ?? autoKeyConfig;</span>
|
|
3303
|
+
<span class="cstat-no" title="statement not covered" > const adminKey = this.buildKeyFromConfig(adminKeyConfig);</span>
|
|
3304
|
+
<span class="cstat-no" title="statement not covered" > if (adminKey) {</span>
|
|
3305
|
+
<span class="cstat-no" title="statement not covered" > transaction.setAdminKey(adminKey);</span>
|
|
3306
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token admin key set', { autoDetected: !opts.adminKey && isAutoDetected });</span>
|
|
3307
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3308
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3309
|
+
<span class="cstat-no" title="statement not covered" > // Set supply key - use provided or auto-detected</span>
|
|
3310
|
+
<span class="cstat-no" title="statement not covered" > const supplyKeyConfig = opts.supplyKey ?? autoKeyConfig;</span>
|
|
3311
|
+
<span class="cstat-no" title="statement not covered" > const supplyKey = this.buildKeyFromConfig(supplyKeyConfig);</span>
|
|
3312
|
+
<span class="cstat-no" title="statement not covered" > if (supplyKey) {</span>
|
|
3313
|
+
<span class="cstat-no" title="statement not covered" > transaction.setSupplyKey(supplyKey);</span>
|
|
3314
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token supply key set', {</span>
|
|
3315
|
+
<span class="cstat-no" title="statement not covered" > autoDetected: !opts.supplyKey && isAutoDetected,</span>
|
|
3316
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3317
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3318
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3319
|
+
<span class="cstat-no" title="statement not covered" > // Set freeze key - only if explicitly provided (not auto-set)</span>
|
|
3320
|
+
<span class="cstat-no" title="statement not covered" > const freezeKey = this.buildKeyFromConfig(opts.freezeKey);</span>
|
|
3321
|
+
<span class="cstat-no" title="statement not covered" > if (freezeKey) {</span>
|
|
3322
3322
|
<span class="cstat-no" title="statement not covered" > transaction.setFreezeKey(freezeKey);</span>
|
|
3323
3323
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token freeze key set');</span>
|
|
3324
3324
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3325
|
-
|
|
3326
|
-
// Set wipe key - only if explicitly provided (not auto-set)
|
|
3327
|
-
const wipeKey = this.buildKeyFromConfig(opts.wipeKey)
|
|
3328
|
-
|
|
3325
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3326
|
+
<span class="cstat-no" title="statement not covered" > // Set wipe key - only if explicitly provided (not auto-set)</span>
|
|
3327
|
+
<span class="cstat-no" title="statement not covered" > const wipeKey = this.buildKeyFromConfig(opts.wipeKey);</span>
|
|
3328
|
+
<span class="cstat-no" title="statement not covered" > if (wipeKey) {</span>
|
|
3329
3329
|
<span class="cstat-no" title="statement not covered" > transaction.setWipeKey(wipeKey);</span>
|
|
3330
3330
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token wipe key set');</span>
|
|
3331
3331
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3332
|
-
|
|
3333
|
-
// Set pause key - only if explicitly provided (not auto-set)
|
|
3334
|
-
const pauseKey = this.buildKeyFromConfig(opts.pauseKey)
|
|
3335
|
-
|
|
3332
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3333
|
+
<span class="cstat-no" title="statement not covered" > // Set pause key - only if explicitly provided (not auto-set)</span>
|
|
3334
|
+
<span class="cstat-no" title="statement not covered" > const pauseKey = this.buildKeyFromConfig(opts.pauseKey);</span>
|
|
3335
|
+
<span class="cstat-no" title="statement not covered" > if (pauseKey) {</span>
|
|
3336
3336
|
<span class="cstat-no" title="statement not covered" > transaction.setPauseKey(pauseKey);</span>
|
|
3337
3337
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token pause key set');</span>
|
|
3338
3338
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3339
|
-
|
|
3340
|
-
// Set KYC key - only if explicitly provided (not auto-set)
|
|
3341
|
-
const kycKey = this.buildKeyFromConfig(opts.kycKey)
|
|
3342
|
-
|
|
3339
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3340
|
+
<span class="cstat-no" title="statement not covered" > // Set KYC key - only if explicitly provided (not auto-set)</span>
|
|
3341
|
+
<span class="cstat-no" title="statement not covered" > const kycKey = this.buildKeyFromConfig(opts.kycKey);</span>
|
|
3342
|
+
<span class="cstat-no" title="statement not covered" > if (kycKey) {</span>
|
|
3343
3343
|
<span class="cstat-no" title="statement not covered" > transaction.setKycKey(kycKey);</span>
|
|
3344
3344
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token KYC key set');</span>
|
|
3345
3345
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3346
|
-
|
|
3347
|
-
// Set fee schedule key - only if explicitly provided (not auto-set)
|
|
3348
|
-
const feeScheduleKey = this.buildKeyFromConfig(opts.feeScheduleKey)
|
|
3349
|
-
|
|
3346
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3347
|
+
<span class="cstat-no" title="statement not covered" > // Set fee schedule key - only if explicitly provided (not auto-set)</span>
|
|
3348
|
+
<span class="cstat-no" title="statement not covered" > const feeScheduleKey = this.buildKeyFromConfig(opts.feeScheduleKey);</span>
|
|
3349
|
+
<span class="cstat-no" title="statement not covered" > if (feeScheduleKey) {</span>
|
|
3350
3350
|
<span class="cstat-no" title="statement not covered" > transaction.setFeeScheduleKey(feeScheduleKey);</span>
|
|
3351
3351
|
<span class="cstat-no" title="statement not covered" > this.logger.debug('Token fee schedule key set');</span>
|
|
3352
3352
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3353
|
-
|
|
3354
|
-
return this.serializeTransaction(transaction, treasuryAccount)
|
|
3355
|
-
}
|
|
3356
|
-
|
|
3357
|
-
|
|
3358
|
-
* Build a token mint transaction
|
|
3359
|
-
* @param tokenId - Token ID to mint
|
|
3360
|
-
* @param amount - Amount to mint
|
|
3361
|
-
* @param account - Account performing the mint
|
|
3362
|
-
* @returns Base64 encoded transaction bytes
|
|
3363
|
-
|
|
3364
|
-
<span class="
|
|
3353
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3354
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, treasuryAccount);</span>
|
|
3355
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3356
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3357
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3358
|
+
<span class="cstat-no" title="statement not covered" > * Build a token mint transaction</span>
|
|
3359
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenId - Token ID to mint</span>
|
|
3360
|
+
<span class="cstat-no" title="statement not covered" > * @param amount - Amount to mint</span>
|
|
3361
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account performing the mint</span>
|
|
3362
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3363
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3364
|
+
<span class="cstat-no" title="statement not covered" > async buildTokenMint(tokenId: string, amount: number, account: string): Promise<string> {</span>
|
|
3365
3365
|
<span class="cstat-no" title="statement not covered" > const transaction = new TokenMintTransaction()</span>
|
|
3366
3366
|
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tokenId))</span>
|
|
3367
3367
|
<span class="cstat-no" title="statement not covered" > .setAmount(amount);</span>
|
|
3368
3368
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3369
3369
|
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3370
3370
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3371
|
-
|
|
3372
|
-
|
|
3373
|
-
* Build a token burn transaction
|
|
3374
|
-
* @param tokenId - Token ID to burn
|
|
3375
|
-
* @param amount - Amount to burn
|
|
3376
|
-
* @param account - Account performing the burn
|
|
3377
|
-
* @returns Base64 encoded transaction bytes
|
|
3378
|
-
|
|
3379
|
-
<span class="
|
|
3371
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3372
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3373
|
+
<span class="cstat-no" title="statement not covered" > * Build a token burn transaction</span>
|
|
3374
|
+
<span class="cstat-no" title="statement not covered" > * @param tokenId - Token ID to burn</span>
|
|
3375
|
+
<span class="cstat-no" title="statement not covered" > * @param amount - Amount to burn</span>
|
|
3376
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account performing the burn</span>
|
|
3377
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3378
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3379
|
+
<span class="cstat-no" title="statement not covered" > async buildTokenBurn(tokenId: string, amount: number, account: string): Promise<string> {</span>
|
|
3380
3380
|
<span class="cstat-no" title="statement not covered" > const transaction = new TokenBurnTransaction()</span>
|
|
3381
3381
|
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tokenId))</span>
|
|
3382
3382
|
<span class="cstat-no" title="statement not covered" > .setAmount(amount);</span>
|
|
3383
3383
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3384
3384
|
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3385
3385
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
* Build a topic creation transaction with automatic key configuration
|
|
3389
|
-
|
|
3390
|
-
* **Auto-key behavior**: If no adminKey is provided, the topic will automatically
|
|
3391
|
-
* inherit the creating account's key structure
|
|
3392
|
-
* - Single-sig account → topic adminKey = account's public key
|
|
3393
|
-
* - Multisig account → topic adminKey = threshold key with all signers
|
|
3394
|
-
|
|
3395
|
-
* This ensures topics created from multisig accounts are also controlled by the multisig
|
|
3396
|
-
|
|
3397
|
-
* @param account - Account creating the topic
|
|
3398
|
-
* @param options - Topic creation options (keys auto-detected if not provided)
|
|
3399
|
-
* @returns Base64 encoded transaction bytes
|
|
3400
|
-
|
|
3401
|
-
async buildTopicCreate(
|
|
3402
|
-
account: string
|
|
3403
|
-
options?: TopicCreateOptions | string, // string treated as memo
|
|
3404
|
-
): Promise<string> {
|
|
3405
|
-
const transaction = new TopicCreateTransaction()
|
|
3406
|
-
|
|
3407
|
-
// Support both object and string (memo shorthand)
|
|
3408
|
-
const opts: TopicCreateOptions
|
|
3409
|
-
typeof options === 'string' ? { memo: options } : (
|
|
3410
|
-
|
|
3411
|
-
if (opts.memo) {
|
|
3412
|
-
transaction.setTopicMemo(opts.memo)
|
|
3413
|
-
}
|
|
3414
|
-
|
|
3415
|
-
// Auto-detect key config from active account if not explicitly provided
|
|
3416
|
-
const autoKeyConfig = this.getActiveAccountKeyConfig()
|
|
3417
|
-
|
|
3418
|
-
// Set admin key - use provided or auto-detected
|
|
3419
|
-
const adminKeyConfig = opts.adminKey ?? autoKeyConfig
|
|
3420
|
-
const adminKey = this.buildKeyFromConfig(adminKeyConfig)
|
|
3421
|
-
if (adminKey) {
|
|
3422
|
-
transaction.setAdminKey(adminKey)
|
|
3423
|
-
this.logger.debug('Topic admin key set', {
|
|
3424
|
-
|
|
3425
|
-
autoDetected: !opts.adminKey && !!autoKeyConfig
|
|
3426
|
-
})
|
|
3427
|
-
}
|
|
3428
|
-
|
|
3429
|
-
// Set submit key - use provided or auto-detected (same as admin by default)
|
|
3430
|
-
const submitKeyConfig = opts.submitKey ?? autoKeyConfig
|
|
3431
|
-
const submitKey = this.buildKeyFromConfig(submitKeyConfig)
|
|
3432
|
-
if (submitKey) {
|
|
3433
|
-
transaction.setSubmitKey(submitKey)
|
|
3434
|
-
this.logger.debug('Topic submit key set', {
|
|
3435
|
-
|
|
3436
|
-
autoDetected: !opts.submitKey && !!autoKeyConfig
|
|
3437
|
-
})
|
|
3438
|
-
}
|
|
3439
|
-
|
|
3440
|
-
// Set auto-renew account if provided
|
|
3441
|
-
if (opts.autoRenewAccountId) {
|
|
3442
|
-
transaction.setAutoRenewAccountId(AccountId.fromString(opts.autoRenewAccountId))
|
|
3443
|
-
}
|
|
3444
|
-
|
|
3445
|
-
return this.serializeTransaction(transaction, account)
|
|
3446
|
-
}
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
* Build a topic message submit transaction
|
|
3450
|
-
* @param topicId - Topic ID (e.g., "0.0.12345")
|
|
3451
|
-
* @param message - Message to submit
|
|
3452
|
-
* @param account - Account submitting the message
|
|
3453
|
-
* @returns Base64 encoded transaction bytes
|
|
3454
|
-
|
|
3455
|
-
<span class="
|
|
3386
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3387
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3388
|
+
<span class="cstat-no" title="statement not covered" > * Build a topic creation transaction with automatic key configuration.</span>
|
|
3389
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3390
|
+
<span class="cstat-no" title="statement not covered" > * **Auto-key behavior**: If no adminKey is provided, the topic will automatically</span>
|
|
3391
|
+
<span class="cstat-no" title="statement not covered" > * inherit the creating account's key structure:</span>
|
|
3392
|
+
<span class="cstat-no" title="statement not covered" > * - Single-sig account → topic adminKey = account's public key</span>
|
|
3393
|
+
<span class="cstat-no" title="statement not covered" > * - Multisig account → topic adminKey = threshold key with all signers</span>
|
|
3394
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3395
|
+
<span class="cstat-no" title="statement not covered" > * This ensures topics created from multisig accounts are also controlled by the multisig.</span>
|
|
3396
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3397
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account creating the topic</span>
|
|
3398
|
+
<span class="cstat-no" title="statement not covered" > * @param options - Topic creation options (keys auto-detected if not provided)</span>
|
|
3399
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3400
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3401
|
+
<span class="cstat-no" title="statement not covered" > async buildTopicCreate(</span>
|
|
3402
|
+
<span class="cstat-no" title="statement not covered" > account: string,</span>
|
|
3403
|
+
<span class="cstat-no" title="statement not covered" > options?: TopicCreateOptions | string, // string treated as memo</span>
|
|
3404
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3405
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new TopicCreateTransaction();</span>
|
|
3406
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3407
|
+
<span class="cstat-no" title="statement not covered" > // Support both object and string (memo shorthand)</span>
|
|
3408
|
+
<span class="cstat-no" title="statement not covered" > const opts: TopicCreateOptions =</span>
|
|
3409
|
+
<span class="cstat-no" title="statement not covered" > typeof options === 'string' ? { memo: options } : (options ?? {});</span>
|
|
3410
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3411
|
+
<span class="cstat-no" title="statement not covered" > if (opts.memo) {</span>
|
|
3412
|
+
<span class="cstat-no" title="statement not covered" > transaction.setTopicMemo(opts.memo);</span>
|
|
3413
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3414
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3415
|
+
<span class="cstat-no" title="statement not covered" > // Auto-detect key config from active account if not explicitly provided</span>
|
|
3416
|
+
<span class="cstat-no" title="statement not covered" > const autoKeyConfig = this.getActiveAccountKeyConfig();</span>
|
|
3417
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3418
|
+
<span class="cstat-no" title="statement not covered" > // Set admin key - use provided or auto-detected</span>
|
|
3419
|
+
<span class="cstat-no" title="statement not covered" > const adminKeyConfig = opts.adminKey ?? autoKeyConfig;</span>
|
|
3420
|
+
<span class="cstat-no" title="statement not covered" > const adminKey = this.buildKeyFromConfig(adminKeyConfig);</span>
|
|
3421
|
+
<span class="cstat-no" title="statement not covered" > if (adminKey) {</span>
|
|
3422
|
+
<span class="cstat-no" title="statement not covered" > transaction.setAdminKey(adminKey);</span>
|
|
3423
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Topic admin key set', {</span>
|
|
3424
|
+
<span class="cstat-no" title="statement not covered" > isThreshold: adminKeyConfig?.signerPublicKeys ? true : false,</span>
|
|
3425
|
+
<span class="cstat-no" title="statement not covered" > autoDetected: !opts.adminKey && !!autoKeyConfig,</span>
|
|
3426
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3427
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3428
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3429
|
+
<span class="cstat-no" title="statement not covered" > // Set submit key - use provided or auto-detected (same as admin by default)</span>
|
|
3430
|
+
<span class="cstat-no" title="statement not covered" > const submitKeyConfig = opts.submitKey ?? autoKeyConfig;</span>
|
|
3431
|
+
<span class="cstat-no" title="statement not covered" > const submitKey = this.buildKeyFromConfig(submitKeyConfig);</span>
|
|
3432
|
+
<span class="cstat-no" title="statement not covered" > if (submitKey) {</span>
|
|
3433
|
+
<span class="cstat-no" title="statement not covered" > transaction.setSubmitKey(submitKey);</span>
|
|
3434
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Topic submit key set', {</span>
|
|
3435
|
+
<span class="cstat-no" title="statement not covered" > isThreshold: submitKeyConfig?.signerPublicKeys ? true : false,</span>
|
|
3436
|
+
<span class="cstat-no" title="statement not covered" > autoDetected: !opts.submitKey && !!autoKeyConfig,</span>
|
|
3437
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3438
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3439
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3440
|
+
<span class="cstat-no" title="statement not covered" > // Set auto-renew account if provided</span>
|
|
3441
|
+
<span class="cstat-no" title="statement not covered" > if (opts.autoRenewAccountId) {</span>
|
|
3442
|
+
<span class="cstat-no" title="statement not covered" > transaction.setAutoRenewAccountId(AccountId.fromString(opts.autoRenewAccountId));</span>
|
|
3443
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3444
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3445
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3446
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3447
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3448
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3449
|
+
<span class="cstat-no" title="statement not covered" > * Build a topic message submit transaction</span>
|
|
3450
|
+
<span class="cstat-no" title="statement not covered" > * @param topicId - Topic ID (e.g., "0.0.12345")</span>
|
|
3451
|
+
<span class="cstat-no" title="statement not covered" > * @param message - Message to submit</span>
|
|
3452
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account submitting the message</span>
|
|
3453
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3454
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3455
|
+
<span class="cstat-no" title="statement not covered" > async buildTopicMessageSubmit(</span>
|
|
3456
3456
|
<span class="cstat-no" title="statement not covered" > topicId: string,</span>
|
|
3457
3457
|
<span class="cstat-no" title="statement not covered" > message: string,</span>
|
|
3458
3458
|
<span class="cstat-no" title="statement not covered" > account: string,</span>
|
|
@@ -3461,48 +3461,48 @@ export class HederaTransactionBuilderService {
|
|
|
3461
3461
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3462
3462
|
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, account);</span>
|
|
3463
3463
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
* Build an account creation transaction with key configuration
|
|
3467
|
-
|
|
3468
|
-
* For single-sig accounts: pass { publicKey: '...' }
|
|
3469
|
-
* For multisig accounts: pass { signerPublicKeys: [...], threshold: N }
|
|
3470
|
-
|
|
3471
|
-
* If no key is provided, a random key is generated (NOT RECOMMENDED for production)
|
|
3472
|
-
|
|
3473
|
-
* @param creatorAccount - Account creating the new account
|
|
3474
|
-
* @param options - Account creation options including key config
|
|
3475
|
-
* @param optionsOrBalance
|
|
3476
|
-
* @returns Base64 encoded transaction bytes
|
|
3477
|
-
|
|
3478
|
-
async buildAccountCreate(
|
|
3479
|
-
creatorAccount: string
|
|
3480
|
-
optionsOrBalance: AccountCreateOptions | number
|
|
3481
|
-
): Promise<string> {
|
|
3482
|
-
// Support both object and number (initial balance shorthand)
|
|
3483
|
-
const opts: AccountCreateOptions
|
|
3484
|
-
|
|
3464
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3465
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3466
|
+
<span class="cstat-no" title="statement not covered" > * Build an account creation transaction with key configuration.</span>
|
|
3467
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3468
|
+
<span class="cstat-no" title="statement not covered" > * For single-sig accounts: pass { publicKey: '...' }</span>
|
|
3469
|
+
<span class="cstat-no" title="statement not covered" > * For multisig accounts: pass { signerPublicKeys: [...], threshold: N }</span>
|
|
3470
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3471
|
+
<span class="cstat-no" title="statement not covered" > * If no key is provided, a random key is generated (NOT RECOMMENDED for production).</span>
|
|
3472
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
3473
|
+
<span class="cstat-no" title="statement not covered" > * @param creatorAccount - Account creating the new account</span>
|
|
3474
|
+
<span class="cstat-no" title="statement not covered" > * @param options - Account creation options including key config</span>
|
|
3475
|
+
<span class="cstat-no" title="statement not covered" > * @param optionsOrBalance</span>
|
|
3476
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3477
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3478
|
+
<span class="cstat-no" title="statement not covered" > async buildAccountCreate(</span>
|
|
3479
|
+
<span class="cstat-no" title="statement not covered" > creatorAccount: string,</span>
|
|
3480
|
+
<span class="cstat-no" title="statement not covered" > optionsOrBalance: AccountCreateOptions | number,</span>
|
|
3481
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<string> {</span>
|
|
3482
|
+
<span class="cstat-no" title="statement not covered" > // Support both object and number (initial balance shorthand)</span>
|
|
3483
|
+
<span class="cstat-no" title="statement not covered" > const opts: AccountCreateOptions =</span>
|
|
3484
|
+
<span class="cstat-no" title="statement not covered" > typeof optionsOrBalance === 'number'</span>
|
|
3485
3485
|
<span class="cstat-no" title="statement not covered" > ? { initialBalance: optionsOrBalance }</span>
|
|
3486
|
-
: optionsOrBalance
|
|
3487
|
-
|
|
3488
|
-
const transaction = new AccountCreateTransaction().setInitialBalance(
|
|
3489
|
-
new Hbar(opts.initialBalance)
|
|
3490
|
-
)
|
|
3491
|
-
|
|
3492
|
-
// Auto-detect key config from active account if not explicitly provided
|
|
3493
|
-
// This ensures accounts created from multisig wallets inherit the multisig key structure
|
|
3494
|
-
const autoKeyConfig = this.getActiveAccountKeyConfig()
|
|
3495
|
-
const keyConfig = opts.key ?? autoKeyConfig
|
|
3496
|
-
|
|
3497
|
-
// Set account key - use provided or auto-detected
|
|
3498
|
-
const accountKey = this.buildKeyFromConfig(keyConfig)
|
|
3499
|
-
if (accountKey) {
|
|
3500
|
-
transaction.setKey(accountKey)
|
|
3501
|
-
this.logger.debug('Account key set', {
|
|
3502
|
-
isThreshold: keyConfig?.signerPublicKeys ? true : false
|
|
3503
|
-
autoDetected: !opts.key && !!autoKeyConfig
|
|
3504
|
-
})
|
|
3505
|
-
<span class="
|
|
3486
|
+
<span class="cstat-no" title="statement not covered" > : optionsOrBalance;</span>
|
|
3487
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3488
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new AccountCreateTransaction().setInitialBalance(</span>
|
|
3489
|
+
<span class="cstat-no" title="statement not covered" > new Hbar(opts.initialBalance),</span>
|
|
3490
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
3491
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3492
|
+
<span class="cstat-no" title="statement not covered" > // Auto-detect key config from active account if not explicitly provided</span>
|
|
3493
|
+
<span class="cstat-no" title="statement not covered" > // This ensures accounts created from multisig wallets inherit the multisig key structure</span>
|
|
3494
|
+
<span class="cstat-no" title="statement not covered" > const autoKeyConfig = this.getActiveAccountKeyConfig();</span>
|
|
3495
|
+
<span class="cstat-no" title="statement not covered" > const keyConfig = opts.key ?? autoKeyConfig;</span>
|
|
3496
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3497
|
+
<span class="cstat-no" title="statement not covered" > // Set account key - use provided or auto-detected</span>
|
|
3498
|
+
<span class="cstat-no" title="statement not covered" > const accountKey = this.buildKeyFromConfig(keyConfig);</span>
|
|
3499
|
+
<span class="cstat-no" title="statement not covered" > if (accountKey) {</span>
|
|
3500
|
+
<span class="cstat-no" title="statement not covered" > transaction.setKey(accountKey);</span>
|
|
3501
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Account key set', {</span>
|
|
3502
|
+
<span class="cstat-no" title="statement not covered" > isThreshold: keyConfig?.signerPublicKeys ? true : false,</span>
|
|
3503
|
+
<span class="cstat-no" title="statement not covered" > autoDetected: !opts.key && !!autoKeyConfig,</span>
|
|
3504
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3505
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
3506
3506
|
<span class="cstat-no" title="statement not covered" > // Fallback: generate random key (not recommended for production)</span>
|
|
3507
3507
|
<span class="cstat-no" title="statement not covered" > const newKey = PrivateKey.generateED25519();</span>
|
|
3508
3508
|
<span class="cstat-no" title="statement not covered" > transaction.setKey(newKey.publicKey);</span>
|
|
@@ -3510,46 +3510,46 @@ export class HederaTransactionBuilderService {
|
|
|
3510
3510
|
<span class="cstat-no" title="statement not covered" > 'Generated random key for new account - provide key config for production use',</span>
|
|
3511
3511
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
3512
3512
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3513
|
-
|
|
3514
|
-
// Set memo if provided
|
|
3515
|
-
if (opts.memo) {
|
|
3516
|
-
transaction.setAccountMemo(opts.memo)
|
|
3517
|
-
}
|
|
3518
|
-
|
|
3519
|
-
// Set max automatic token associations
|
|
3520
|
-
if (opts.maxAutomaticTokenAssociations !== undefined) {
|
|
3521
|
-
transaction.setMaxAutomaticTokenAssociations(opts.maxAutomaticTokenAssociations)
|
|
3522
|
-
}
|
|
3523
|
-
|
|
3524
|
-
// Set receiver signature required
|
|
3525
|
-
if (opts.receiverSignatureRequired !== undefined) {
|
|
3526
|
-
transaction.setReceiverSignatureRequired(opts.receiverSignatureRequired)
|
|
3527
|
-
}
|
|
3528
|
-
|
|
3529
|
-
return this.serializeTransaction(transaction, creatorAccount)
|
|
3530
|
-
}
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
* Build an account update transaction
|
|
3534
|
-
* @param accountId - Account to update
|
|
3535
|
-
* @param memo - New account memo
|
|
3536
|
-
* @returns Base64 encoded transaction bytes
|
|
3537
|
-
|
|
3538
|
-
async buildAccountUpdate(accountId: string, memo: string): Promise<string> {
|
|
3539
|
-
const transaction = new AccountUpdateTransaction()
|
|
3540
|
-
.setAccountId(AccountId.fromString(accountId))
|
|
3541
|
-
.setAccountMemo(memo)
|
|
3542
|
-
|
|
3543
|
-
return this.serializeTransaction(transaction, accountId)
|
|
3544
|
-
}
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
* Build a batch transaction with multiple inner transactions
|
|
3548
|
-
* @param innerTransactions - Array of transaction descriptors
|
|
3549
|
-
* @param payerAccount - Account paying for the batch transaction
|
|
3550
|
-
* @returns Base64 encoded batch transaction bytes
|
|
3551
|
-
|
|
3552
|
-
<span class="
|
|
3513
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3514
|
+
<span class="cstat-no" title="statement not covered" > // Set memo if provided</span>
|
|
3515
|
+
<span class="cstat-no" title="statement not covered" > if (opts.memo) {</span>
|
|
3516
|
+
<span class="cstat-no" title="statement not covered" > transaction.setAccountMemo(opts.memo);</span>
|
|
3517
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3518
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3519
|
+
<span class="cstat-no" title="statement not covered" > // Set max automatic token associations</span>
|
|
3520
|
+
<span class="cstat-no" title="statement not covered" > if (opts.maxAutomaticTokenAssociations !== undefined) {</span>
|
|
3521
|
+
<span class="cstat-no" title="statement not covered" > transaction.setMaxAutomaticTokenAssociations(opts.maxAutomaticTokenAssociations);</span>
|
|
3522
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3523
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3524
|
+
<span class="cstat-no" title="statement not covered" > // Set receiver signature required</span>
|
|
3525
|
+
<span class="cstat-no" title="statement not covered" > if (opts.receiverSignatureRequired !== undefined) {</span>
|
|
3526
|
+
<span class="cstat-no" title="statement not covered" > transaction.setReceiverSignatureRequired(opts.receiverSignatureRequired);</span>
|
|
3527
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3528
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3529
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, creatorAccount);</span>
|
|
3530
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3531
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3532
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3533
|
+
<span class="cstat-no" title="statement not covered" > * Build an account update transaction</span>
|
|
3534
|
+
<span class="cstat-no" title="statement not covered" > * @param accountId - Account to update</span>
|
|
3535
|
+
<span class="cstat-no" title="statement not covered" > * @param memo - New account memo</span>
|
|
3536
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded transaction bytes</span>
|
|
3537
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3538
|
+
<span class="cstat-no" title="statement not covered" > async buildAccountUpdate(accountId: string, memo: string): Promise<string> {</span>
|
|
3539
|
+
<span class="cstat-no" title="statement not covered" > const transaction = new AccountUpdateTransaction()</span>
|
|
3540
|
+
<span class="cstat-no" title="statement not covered" > .setAccountId(AccountId.fromString(accountId))</span>
|
|
3541
|
+
<span class="cstat-no" title="statement not covered" > .setAccountMemo(memo);</span>
|
|
3542
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3543
|
+
<span class="cstat-no" title="statement not covered" > return this.serializeTransaction(transaction, accountId);</span>
|
|
3544
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3545
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3546
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3547
|
+
<span class="cstat-no" title="statement not covered" > * Build a batch transaction with multiple inner transactions</span>
|
|
3548
|
+
<span class="cstat-no" title="statement not covered" > * @param innerTransactions - Array of transaction descriptors</span>
|
|
3549
|
+
<span class="cstat-no" title="statement not covered" > * @param payerAccount - Account paying for the batch transaction</span>
|
|
3550
|
+
<span class="cstat-no" title="statement not covered" > * @returns Base64 encoded batch transaction bytes</span>
|
|
3551
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3552
|
+
<span class="cstat-no" title="statement not covered" > async buildBatchTransaction(</span>
|
|
3553
3553
|
<span class="cstat-no" title="statement not covered" > innerTransactions: Array<{</span>
|
|
3554
3554
|
<span class="cstat-no" title="statement not covered" > type: 'send-hbar' | 'send-token' | 'token-mint';</span>
|
|
3555
3555
|
<span class="cstat-no" title="statement not covered" > toAccount?: string;</span>
|
|
@@ -3629,63 +3629,63 @@ export class HederaTransactionBuilderService {
|
|
|
3629
3629
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
3630
3630
|
<span class="cstat-no" title="statement not covered" > return this.uint8ArrayToBase64(bytes);</span>
|
|
3631
3631
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3632
|
-
|
|
3633
|
-
|
|
3634
|
-
* Build inner transactions for batch (unsigned, with batchKey set)
|
|
3635
|
-
* @param account - Account executing the batch
|
|
3636
|
-
* @param batchKey - Public key for batch transactions
|
|
3637
|
-
* @param innerTransactions - Array of transaction descriptors
|
|
3638
|
-
* @returns Array of base64 encoded unsigned inner transactions
|
|
3639
|
-
|
|
3640
|
-
async buildBatchInnerTransactions(
|
|
3641
|
-
account: string
|
|
3642
|
-
batchKey: string
|
|
3643
|
-
innerTransactions: Array<BatchInnerTransaction>
|
|
3644
|
-
): Promise<Array<{ payload: string; description: string }>> {
|
|
3645
|
-
const accountId = AccountId.fromString(account)
|
|
3646
|
-
const batchPublicKey = PublicKey.fromString(batchKey)
|
|
3647
|
-
|
|
3648
|
-
const networkId = this.getNetworkId()
|
|
3649
|
-
|
|
3650
|
-
|
|
3632
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3633
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3634
|
+
<span class="cstat-no" title="statement not covered" > * Build inner transactions for batch (unsigned, with batchKey set)</span>
|
|
3635
|
+
<span class="cstat-no" title="statement not covered" > * @param account - Account executing the batch</span>
|
|
3636
|
+
<span class="cstat-no" title="statement not covered" > * @param batchKey - Public key for batch transactions</span>
|
|
3637
|
+
<span class="cstat-no" title="statement not covered" > * @param innerTransactions - Array of transaction descriptors</span>
|
|
3638
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of base64 encoded unsigned inner transactions</span>
|
|
3639
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3640
|
+
<span class="cstat-no" title="statement not covered" > async buildBatchInnerTransactions(</span>
|
|
3641
|
+
<span class="cstat-no" title="statement not covered" > account: string,</span>
|
|
3642
|
+
<span class="cstat-no" title="statement not covered" > batchKey: string,</span>
|
|
3643
|
+
<span class="cstat-no" title="statement not covered" > innerTransactions: Array<BatchInnerTransaction>,</span>
|
|
3644
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<Array<{ payload: string; description: string }>> {</span>
|
|
3645
|
+
<span class="cstat-no" title="statement not covered" > const accountId = AccountId.fromString(account);</span>
|
|
3646
|
+
<span class="cstat-no" title="statement not covered" > const batchPublicKey = PublicKey.fromString(batchKey);</span>
|
|
3647
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3648
|
+
<span class="cstat-no" title="statement not covered" > const networkId = this.getNetworkId();</span>
|
|
3649
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3650
|
+
<span class="cstat-no" title="statement not covered" > if (!networkId) {</span>
|
|
3651
3651
|
<span class="cstat-no" title="statement not covered" > throw new Error('No active wallet session. Please connect your wallet first.');</span>
|
|
3652
3652
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3653
|
-
|
|
3654
|
-
const client = this.createClientForNetwork(networkId)
|
|
3655
|
-
const results: Array<{ payload: string; description: string }> = []
|
|
3656
|
-
|
|
3657
|
-
for (const tx of innerTransactions) {
|
|
3658
|
-
let transaction: Transaction
|
|
3659
|
-
let description: string
|
|
3660
|
-
|
|
3661
|
-
try {
|
|
3662
|
-
switch (tx.type) {
|
|
3663
|
-
case 'send-hbar'
|
|
3664
|
-
transaction = new TransferTransaction()
|
|
3665
|
-
.setTransactionId(TransactionId.generate(accountId))
|
|
3666
|
-
|
|
3667
|
-
.addHbarTransfer(
|
|
3668
|
-
AccountId.fromString(tx.toAccount!)
|
|
3669
|
-
|
|
3670
|
-
)
|
|
3671
|
-
.setBatchKey(batchPublicKey)
|
|
3672
|
-
description = `Send ${tx.amount} tinybar to ${tx.toAccount}
|
|
3673
|
-
break
|
|
3674
|
-
|
|
3675
|
-
case 'send-token'
|
|
3676
|
-
transaction = new TransferTransaction()
|
|
3677
|
-
.setTransactionId(TransactionId.generate(accountId))
|
|
3678
|
-
.addTokenTransfer(TokenId.fromString(tx.tokenId!), accountId, -(tx
|
|
3679
|
-
.addTokenTransfer(
|
|
3680
|
-
TokenId.fromString(tx.tokenId!)
|
|
3681
|
-
AccountId.fromString(tx.toAccount!)
|
|
3682
|
-
|
|
3683
|
-
)
|
|
3684
|
-
.setBatchKey(batchPublicKey)
|
|
3685
|
-
description = `Send ${tx.amount} of token ${tx.tokenId} to ${tx.toAccount}
|
|
3686
|
-
break
|
|
3687
|
-
|
|
3688
|
-
<span class="
|
|
3653
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3654
|
+
<span class="cstat-no" title="statement not covered" > const client = this.createClientForNetwork(networkId);</span>
|
|
3655
|
+
<span class="cstat-no" title="statement not covered" > const results: Array<{ payload: string; description: string }> = [];</span>
|
|
3656
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3657
|
+
<span class="cstat-no" title="statement not covered" > for (const tx of innerTransactions) {</span>
|
|
3658
|
+
<span class="cstat-no" title="statement not covered" > let transaction: Transaction;</span>
|
|
3659
|
+
<span class="cstat-no" title="statement not covered" > let description: string;</span>
|
|
3660
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3661
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3662
|
+
<span class="cstat-no" title="statement not covered" > switch (tx.type) {</span>
|
|
3663
|
+
<span class="cstat-no" title="statement not covered" > case 'send-hbar':</span>
|
|
3664
|
+
<span class="cstat-no" title="statement not covered" > transaction = new TransferTransaction()</span>
|
|
3665
|
+
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3666
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(accountId, Hbar.fromTinybars(-(tx.amount || 0)))</span>
|
|
3667
|
+
<span class="cstat-no" title="statement not covered" > .addHbarTransfer(</span>
|
|
3668
|
+
<span class="cstat-no" title="statement not covered" > AccountId.fromString(tx.toAccount!),</span>
|
|
3669
|
+
<span class="cstat-no" title="statement not covered" > Hbar.fromTinybars(tx.amount || 0),</span>
|
|
3670
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
3671
|
+
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3672
|
+
<span class="cstat-no" title="statement not covered" > description = `Send ${tx.amount} tinybar to ${tx.toAccount}`;</span>
|
|
3673
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3674
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3675
|
+
<span class="cstat-no" title="statement not covered" > case 'send-token':</span>
|
|
3676
|
+
<span class="cstat-no" title="statement not covered" > transaction = new TransferTransaction()</span>
|
|
3677
|
+
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3678
|
+
<span class="cstat-no" title="statement not covered" > .addTokenTransfer(TokenId.fromString(tx.tokenId!), accountId, -(tx.amount || 0))</span>
|
|
3679
|
+
<span class="cstat-no" title="statement not covered" > .addTokenTransfer(</span>
|
|
3680
|
+
<span class="cstat-no" title="statement not covered" > TokenId.fromString(tx.tokenId!),</span>
|
|
3681
|
+
<span class="cstat-no" title="statement not covered" > AccountId.fromString(tx.toAccount!),</span>
|
|
3682
|
+
<span class="cstat-no" title="statement not covered" > tx.amount || 0,</span>
|
|
3683
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
3684
|
+
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3685
|
+
<span class="cstat-no" title="statement not covered" > description = `Send ${tx.amount} of token ${tx.tokenId} to ${tx.toAccount}`;</span>
|
|
3686
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3687
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3688
|
+
<span class="cstat-no" title="statement not covered" > case 'send-nft':</span>
|
|
3689
3689
|
<span class="cstat-no" title="statement not covered" > transaction = new TransferTransaction()</span>
|
|
3690
3690
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3691
3691
|
<span class="cstat-no" title="statement not covered" > .addNftTransfer(</span>
|
|
@@ -3696,17 +3696,17 @@ export class HederaTransactionBuilderService {
|
|
|
3696
3696
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3697
3697
|
<span class="cstat-no" title="statement not covered" > description = `Send NFT ${tx.tokenId}#${tx.serialNumber} to ${tx.toAccount}`;</span>
|
|
3698
3698
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3699
|
-
|
|
3700
|
-
case 'token-associate'
|
|
3701
|
-
transaction = new TokenAssociateTransaction()
|
|
3702
|
-
.setTransactionId(TransactionId.generate(accountId))
|
|
3703
|
-
.setAccountId(accountId)
|
|
3704
|
-
.setTokenIds([TokenId.fromString(tx.tokenId!)])
|
|
3705
|
-
.setBatchKey(batchPublicKey)
|
|
3706
|
-
description = `Associate token ${tx.tokenId}
|
|
3707
|
-
break
|
|
3708
|
-
|
|
3709
|
-
<span class="
|
|
3699
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3700
|
+
<span class="cstat-no" title="statement not covered" > case 'token-associate':</span>
|
|
3701
|
+
<span class="cstat-no" title="statement not covered" > transaction = new TokenAssociateTransaction()</span>
|
|
3702
|
+
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3703
|
+
<span class="cstat-no" title="statement not covered" > .setAccountId(accountId)</span>
|
|
3704
|
+
<span class="cstat-no" title="statement not covered" > .setTokenIds([TokenId.fromString(tx.tokenId!)])</span>
|
|
3705
|
+
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3706
|
+
<span class="cstat-no" title="statement not covered" > description = `Associate token ${tx.tokenId}`;</span>
|
|
3707
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3708
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3709
|
+
<span class="cstat-no" title="statement not covered" > case 'token-dissociate':</span>
|
|
3710
3710
|
<span class="cstat-no" title="statement not covered" > transaction = new TokenDissociateTransaction()</span>
|
|
3711
3711
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3712
3712
|
<span class="cstat-no" title="statement not covered" > .setAccountId(accountId)</span>
|
|
@@ -3714,8 +3714,8 @@ export class HederaTransactionBuilderService {
|
|
|
3714
3714
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3715
3715
|
<span class="cstat-no" title="statement not covered" > description = `Dissociate token ${tx.tokenId}`;</span>
|
|
3716
3716
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3717
|
-
|
|
3718
|
-
<span class="
|
|
3717
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3718
|
+
<span class="cstat-no" title="statement not covered" > case 'token-create': {</span>
|
|
3719
3719
|
<span class="cstat-no" title="statement not covered" > const createTx = new TokenCreateTransaction()</span>
|
|
3720
3720
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3721
3721
|
<span class="cstat-no" title="statement not covered" > .setTokenName(tx.tokenName || 'Token')</span>
|
|
@@ -3737,31 +3737,31 @@ export class HederaTransactionBuilderService {
|
|
|
3737
3737
|
<span class="cstat-no" title="statement not covered" > description = `Create token ${tx.tokenName} (${tx.tokenSymbol})`;</span>
|
|
3738
3738
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3739
3739
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3740
|
-
|
|
3741
|
-
case 'token-mint': {
|
|
3742
|
-
const mintTx = new TokenMintTransaction()
|
|
3743
|
-
.setTransactionId(TransactionId.generate(accountId))
|
|
3744
|
-
.setTokenId(TokenId.fromString(tx.tokenId!))
|
|
3745
|
-
.setBatchKey(batchPublicKey)
|
|
3746
|
-
// Handle NFT metadata (array) vs fungible amount
|
|
3747
|
-
if (tx.metadata) {
|
|
3748
|
-
const encoder = new TextEncoder()
|
|
3749
|
-
|
|
3740
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3741
|
+
<span class="cstat-no" title="statement not covered" > case 'token-mint': {</span>
|
|
3742
|
+
<span class="cstat-no" title="statement not covered" > const mintTx = new TokenMintTransaction()</span>
|
|
3743
|
+
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3744
|
+
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tx.tokenId!))</span>
|
|
3745
|
+
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3746
|
+
<span class="cstat-no" title="statement not covered" > // Handle NFT metadata (array) vs fungible amount</span>
|
|
3747
|
+
<span class="cstat-no" title="statement not covered" > if (tx.metadata) {</span>
|
|
3748
|
+
<span class="cstat-no" title="statement not covered" > const encoder = new TextEncoder();</span>
|
|
3749
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(tx.metadata)) {</span>
|
|
3750
3750
|
<span class="cstat-no" title="statement not covered" > mintTx.setMetadata(tx.metadata.map((m) => encoder.encode(m)));</span>
|
|
3751
|
-
} else {
|
|
3752
|
-
mintTx.setMetadata([encoder.encode(tx.metadata)])
|
|
3753
|
-
}
|
|
3754
|
-
} else {
|
|
3755
|
-
|
|
3756
|
-
}
|
|
3757
|
-
transaction = mintTx
|
|
3758
|
-
description = tx.metadata
|
|
3759
|
-
? `Mint NFT for token ${tx.tokenId}
|
|
3760
|
-
: `Mint ${tx.amount} of token ${tx.tokenId}
|
|
3761
|
-
break
|
|
3762
|
-
}
|
|
3763
|
-
|
|
3764
|
-
<span class="
|
|
3751
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
3752
|
+
<span class="cstat-no" title="statement not covered" > mintTx.setMetadata([encoder.encode(tx.metadata)]);</span>
|
|
3753
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3754
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
3755
|
+
<span class="cstat-no" title="statement not covered" > mintTx.setAmount(tx.amount || 1);</span>
|
|
3756
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3757
|
+
<span class="cstat-no" title="statement not covered" > transaction = mintTx;</span>
|
|
3758
|
+
<span class="cstat-no" title="statement not covered" > description = tx.metadata</span>
|
|
3759
|
+
<span class="cstat-no" title="statement not covered" > ? `Mint NFT for token ${tx.tokenId}`</span>
|
|
3760
|
+
<span class="cstat-no" title="statement not covered" > : `Mint ${tx.amount} of token ${tx.tokenId}`;</span>
|
|
3761
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3762
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3763
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3764
|
+
<span class="cstat-no" title="statement not covered" > case 'token-burn': {</span>
|
|
3765
3765
|
<span class="cstat-no" title="statement not covered" > const burnTx = new TokenBurnTransaction()</span>
|
|
3766
3766
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3767
3767
|
<span class="cstat-no" title="statement not covered" > .setTokenId(TokenId.fromString(tx.tokenId!))</span>
|
|
@@ -3777,8 +3777,8 @@ export class HederaTransactionBuilderService {
|
|
|
3777
3777
|
<span class="cstat-no" title="statement not covered" > : `Burn ${tx.amount} of token ${tx.tokenId}`;</span>
|
|
3778
3778
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3779
3779
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3780
|
-
|
|
3781
|
-
<span class="
|
|
3780
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3781
|
+
<span class="cstat-no" title="statement not covered" > case 'topic-create': {</span>
|
|
3782
3782
|
<span class="cstat-no" title="statement not covered" > const topicTx = new TopicCreateTransaction()</span>
|
|
3783
3783
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3784
3784
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
@@ -3789,8 +3789,8 @@ export class HederaTransactionBuilderService {
|
|
|
3789
3789
|
<span class="cstat-no" title="statement not covered" > description = tx.topicMemo ? `Create topic: ${tx.topicMemo}` : 'Create topic';</span>
|
|
3790
3790
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3791
3791
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3792
|
-
|
|
3793
|
-
<span class="
|
|
3792
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3793
|
+
<span class="cstat-no" title="statement not covered" > case 'topic-message':</span>
|
|
3794
3794
|
<span class="cstat-no" title="statement not covered" > transaction = new TopicMessageSubmitTransaction()</span>
|
|
3795
3795
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3796
3796
|
<span class="cstat-no" title="statement not covered" > .setTopicId(tx.topicId!)</span>
|
|
@@ -3798,8 +3798,8 @@ export class HederaTransactionBuilderService {
|
|
|
3798
3798
|
<span class="cstat-no" title="statement not covered" > .setBatchKey(batchPublicKey);</span>
|
|
3799
3799
|
<span class="cstat-no" title="statement not covered" > description = `Submit message to topic ${tx.topicId}`;</span>
|
|
3800
3800
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3801
|
-
|
|
3802
|
-
<span class="
|
|
3801
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3802
|
+
<span class="cstat-no" title="statement not covered" > case 'account-create': {</span>
|
|
3803
3803
|
<span class="cstat-no" title="statement not covered" > const acctTx = new AccountCreateTransaction()</span>
|
|
3804
3804
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3805
3805
|
<span class="cstat-no" title="statement not covered" > .setInitialBalance(Hbar.fromTinybars(tx.initialBalance || 0))</span>
|
|
@@ -3811,8 +3811,8 @@ export class HederaTransactionBuilderService {
|
|
|
3811
3811
|
<span class="cstat-no" title="statement not covered" > description = `Create account with ${tx.initialBalance} tinybar`;</span>
|
|
3812
3812
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3813
3813
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3814
|
-
|
|
3815
|
-
<span class="
|
|
3814
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3815
|
+
<span class="cstat-no" title="statement not covered" > case 'account-update': {</span>
|
|
3816
3816
|
<span class="cstat-no" title="statement not covered" > const updateTx = new AccountUpdateTransaction()</span>
|
|
3817
3817
|
<span class="cstat-no" title="statement not covered" > .setTransactionId(TransactionId.generate(accountId))</span>
|
|
3818
3818
|
<span class="cstat-no" title="statement not covered" > .setAccountId(accountId)</span>
|
|
@@ -3827,89 +3827,89 @@ export class HederaTransactionBuilderService {
|
|
|
3827
3827
|
<span class="cstat-no" title="statement not covered" > description = `Update account ${account}`;</span>
|
|
3828
3828
|
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3829
3829
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3830
|
-
|
|
3831
|
-
default
|
|
3832
|
-
throw new Error(`Unknown transaction type: ${(tx as any).type}`)
|
|
3833
|
-
}
|
|
3834
|
-
|
|
3835
|
-
this.logger.debug('Freezing transaction', { type: tx.type })
|
|
3836
|
-
const frozen = await transaction.freezeWith(client)
|
|
3837
|
-
|
|
3838
|
-
this.logger.debug('Frozen transaction, serializing', { type: tx.type })
|
|
3839
|
-
const bytes = frozen.toBytes()
|
|
3840
|
-
|
|
3841
|
-
this.logger.debug('Serialized transaction', { type: tx.type, length: bytes.length })
|
|
3842
|
-
|
|
3843
|
-
results.push({
|
|
3844
|
-
payload: this.uint8ArrayToBase64(bytes)
|
|
3845
|
-
description
|
|
3846
|
-
})
|
|
3847
|
-
|
|
3848
|
-
this.logger.debug('Successfully processed transaction', { type: tx.type })
|
|
3849
|
-
} catch (error) {
|
|
3850
|
-
this.logger.error('Failed to process transaction', { type: tx.type, error })
|
|
3851
|
-
throw new Error(`Failed to build ${tx.type} transaction: ${error}`)
|
|
3852
|
-
}
|
|
3853
|
-
}
|
|
3854
|
-
|
|
3855
|
-
return results
|
|
3856
|
-
}
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
* Serialize a transaction to base64 encoded bytes
|
|
3860
|
-
* @param transaction
|
|
3861
|
-
* @param payerAccountId
|
|
3862
|
-
|
|
3863
|
-
private async serializeTransaction(transaction: any, payerAccountId: string): Promise<string> {
|
|
3864
|
-
const networkId = this.getNetworkId()
|
|
3865
|
-
|
|
3866
|
-
if (!networkId) {
|
|
3867
|
-
throw new Error('No active wallet session. Please connect your wallet first.')
|
|
3868
|
-
}
|
|
3869
|
-
|
|
3870
|
-
transaction.setTransactionId(TransactionId.generate(AccountId.fromString(payerAccountId)))
|
|
3871
|
-
const client = this.createClientForNetwork(networkId)
|
|
3872
|
-
const frozen = await transaction.freezeWith(client)
|
|
3873
|
-
const bytes = frozen.toBytes()
|
|
3874
|
-
|
|
3875
|
-
return this.uint8ArrayToBase64(bytes)
|
|
3876
|
-
}
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
* Create a Hedera client for the specified network
|
|
3880
|
-
* @param networkId
|
|
3881
|
-
|
|
3882
|
-
private createClientForNetwork(networkId: string): Client {
|
|
3883
|
-
const network = networkId.split(':')[1]?.toLowerCase()
|
|
3884
|
-
|
|
3885
|
-
switch (network) {
|
|
3886
|
-
case 'mainnet'
|
|
3887
|
-
return Client.forMainnet()
|
|
3888
|
-
case 'testnet'
|
|
3889
|
-
return Client.forTestnet()
|
|
3890
|
-
default
|
|
3891
|
-
this.logger.warn('Unknown Hedera network, defaulting to testnet', { network })
|
|
3892
|
-
return Client.forTestnet()
|
|
3893
|
-
}
|
|
3894
|
-
}
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
* Convert Uint8Array to base64 string
|
|
3898
|
-
* @param bytes
|
|
3899
|
-
|
|
3900
|
-
private uint8ArrayToBase64(bytes: Uint8Array): string {
|
|
3901
|
-
let binary = ''
|
|
3902
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
3903
|
-
binary += String.fromCharCode(bytes[i])
|
|
3904
|
-
}
|
|
3905
|
-
return btoa(binary)
|
|
3906
|
-
}
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
* Convert base64 string to Uint8Array
|
|
3910
|
-
* @param base64
|
|
3911
|
-
|
|
3912
|
-
|
|
3830
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3831
|
+
<span class="cstat-no" title="statement not covered" > default:</span>
|
|
3832
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Unknown transaction type: ${(tx as any).type}`);</span>
|
|
3833
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3834
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3835
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Freezing transaction', { type: tx.type });</span>
|
|
3836
|
+
<span class="cstat-no" title="statement not covered" > const frozen = await transaction.freezeWith(client);</span>
|
|
3837
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3838
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Frozen transaction, serializing', { type: tx.type });</span>
|
|
3839
|
+
<span class="cstat-no" title="statement not covered" > const bytes = frozen.toBytes();</span>
|
|
3840
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3841
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Serialized transaction', { type: tx.type, length: bytes.length });</span>
|
|
3842
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3843
|
+
<span class="cstat-no" title="statement not covered" > results.push({</span>
|
|
3844
|
+
<span class="cstat-no" title="statement not covered" > payload: this.uint8ArrayToBase64(bytes),</span>
|
|
3845
|
+
<span class="cstat-no" title="statement not covered" > description,</span>
|
|
3846
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3847
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3848
|
+
<span class="cstat-no" title="statement not covered" > this.logger.debug('Successfully processed transaction', { type: tx.type });</span>
|
|
3849
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
3850
|
+
<span class="cstat-no" title="statement not covered" > this.logger.error('Failed to process transaction', { type: tx.type, error });</span>
|
|
3851
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Failed to build ${tx.type} transaction: ${error}`);</span>
|
|
3852
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3853
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3854
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3855
|
+
<span class="cstat-no" title="statement not covered" > return results;</span>
|
|
3856
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3857
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3858
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3859
|
+
<span class="cstat-no" title="statement not covered" > * Serialize a transaction to base64 encoded bytes</span>
|
|
3860
|
+
<span class="cstat-no" title="statement not covered" > * @param transaction</span>
|
|
3861
|
+
<span class="cstat-no" title="statement not covered" > * @param payerAccountId</span>
|
|
3862
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3863
|
+
<span class="cstat-no" title="statement not covered" > private async serializeTransaction(transaction: any, payerAccountId: string): Promise<string> {</span>
|
|
3864
|
+
<span class="cstat-no" title="statement not covered" > const networkId = this.getNetworkId();</span>
|
|
3865
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3866
|
+
<span class="cstat-no" title="statement not covered" > if (!networkId) {</span>
|
|
3867
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('No active wallet session. Please connect your wallet first.');</span>
|
|
3868
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3869
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3870
|
+
<span class="cstat-no" title="statement not covered" > transaction.setTransactionId(TransactionId.generate(AccountId.fromString(payerAccountId)));</span>
|
|
3871
|
+
<span class="cstat-no" title="statement not covered" > const client = this.createClientForNetwork(networkId);</span>
|
|
3872
|
+
<span class="cstat-no" title="statement not covered" > const frozen = await transaction.freezeWith(client);</span>
|
|
3873
|
+
<span class="cstat-no" title="statement not covered" > const bytes = frozen.toBytes();</span>
|
|
3874
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3875
|
+
<span class="cstat-no" title="statement not covered" > return this.uint8ArrayToBase64(bytes);</span>
|
|
3876
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3877
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3878
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3879
|
+
<span class="cstat-no" title="statement not covered" > * Create a Hedera client for the specified network</span>
|
|
3880
|
+
<span class="cstat-no" title="statement not covered" > * @param networkId</span>
|
|
3881
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3882
|
+
<span class="cstat-no" title="statement not covered" > private createClientForNetwork(networkId: string): Client {</span>
|
|
3883
|
+
<span class="cstat-no" title="statement not covered" > const network = networkId.split(':')[1]?.toLowerCase();</span>
|
|
3884
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3885
|
+
<span class="cstat-no" title="statement not covered" > switch (network) {</span>
|
|
3886
|
+
<span class="cstat-no" title="statement not covered" > case 'mainnet':</span>
|
|
3887
|
+
<span class="cstat-no" title="statement not covered" > return Client.forMainnet();</span>
|
|
3888
|
+
<span class="cstat-no" title="statement not covered" > case 'testnet':</span>
|
|
3889
|
+
<span class="cstat-no" title="statement not covered" > return Client.forTestnet();</span>
|
|
3890
|
+
<span class="cstat-no" title="statement not covered" > default:</span>
|
|
3891
|
+
<span class="cstat-no" title="statement not covered" > this.logger.warn('Unknown Hedera network, defaulting to testnet', { network });</span>
|
|
3892
|
+
<span class="cstat-no" title="statement not covered" > return Client.forTestnet();</span>
|
|
3893
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3894
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3895
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3896
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3897
|
+
<span class="cstat-no" title="statement not covered" > * Convert Uint8Array to base64 string</span>
|
|
3898
|
+
<span class="cstat-no" title="statement not covered" > * @param bytes</span>
|
|
3899
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3900
|
+
<span class="cstat-no" title="statement not covered" > private uint8ArrayToBase64(bytes: Uint8Array): string {</span>
|
|
3901
|
+
<span class="cstat-no" title="statement not covered" > let binary = '';</span>
|
|
3902
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < bytes.length; i++) {</span>
|
|
3903
|
+
<span class="cstat-no" title="statement not covered" > binary += String.fromCharCode(bytes[i]);</span>
|
|
3904
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3905
|
+
<span class="cstat-no" title="statement not covered" > return btoa(binary);</span>
|
|
3906
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3907
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3908
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3909
|
+
<span class="cstat-no" title="statement not covered" > * Convert base64 string to Uint8Array</span>
|
|
3910
|
+
<span class="cstat-no" title="statement not covered" > * @param base64</span>
|
|
3911
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3912
|
+
<span class="cstat-no" title="statement not covered" > private base64ToUint8Array(base64: string): Uint8Array {</span>
|
|
3913
3913
|
<span class="cstat-no" title="statement not covered" > const binary = atob(base64);</span>
|
|
3914
3914
|
<span class="cstat-no" title="statement not covered" > const bytes = new Uint8Array(binary.length);</span>
|
|
3915
3915
|
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < binary.length; i++) {</span>
|
|
@@ -3917,7 +3917,7 @@ export class HederaTransactionBuilderService {
|
|
|
3917
3917
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3918
3918
|
<span class="cstat-no" title="statement not covered" > return bytes;</span>
|
|
3919
3919
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3920
|
-
}
|
|
3920
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
3921
3921
|
</pre></td></tr></table></pre>
|
|
3922
3922
|
|
|
3923
3923
|
<div class='push'></div><!-- for sticky footer -->
|
|
@@ -3925,7 +3925,7 @@ export class HederaTransactionBuilderService {
|
|
|
3925
3925
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
3926
3926
|
Code coverage generated by
|
|
3927
3927
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3928
|
-
at 2026-06-
|
|
3928
|
+
at 2026-06-10T09:00:36.727Z
|
|
3929
3929
|
</div>
|
|
3930
3930
|
<script src="../../../prettify.js"></script>
|
|
3931
3931
|
<script>
|