@hsuite/native-connect-angular 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/USAGE_EXAMPLES.md +476 -0
- package/assets/wallets/extension.svg +7 -0
- package/assets/wallets/hashpack.svg +6 -0
- package/assets/wallets/hsuite.svg +11 -0
- package/assets/wallets/kabila.svg +11 -0
- package/assets/wallets/walletconnect.svg +13 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-summary.json +50 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +476 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +476 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lcov-report/lib/directives/index.html +146 -0
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lcov-report/lib/index.html +116 -0
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lcov-report/lib/models/index.html +131 -0
- package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lcov-report/lib/providers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lcov-report/lib/services/index.html +191 -0
- package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lcov-report/lib/transports/index.html +116 -0
- package/coverage/lcov-report/lib/utils/index.html +116 -0
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +19252 -0
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lib/components/account-selector/index.html +161 -0
- package/coverage/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lib/directives/index.html +146 -0
- package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lib/index.html +116 -0
- package/coverage/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lib/models/index.html +131 -0
- package/coverage/lib/models/provider-types.ts.html +577 -0
- package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lib/providers/index.html +146 -0
- package/coverage/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lib/services/index.html +191 -0
- package/coverage/lib/services/logger.service.ts.html +463 -0
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lib/transports/index.html +116 -0
- package/coverage/lib/utils/index.html +116 -0
- package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/README.md +48 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
- package/dist/index.d.ts +6949 -0
- package/examples/minimal-connect.ts +178 -0
- package/examples/multi-protocol.ts +495 -0
- package/examples/transaction-signing.ts +361 -0
- package/jest.config.json +45 -0
- package/karma.conf.js +42 -0
- package/ng-package.json +20 -0
- package/package.json +60 -0
- package/src/index.ts +203 -0
- package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
- package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
- package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
- package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
- package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.component.html +135 -0
- package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
- package/src/lib/components/account-selector/account-selector.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.service.ts +501 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
- package/src/lib/directives/wallet-connected.directive.ts +195 -0
- package/src/lib/directives/wallet-context.directive.ts +154 -0
- package/src/lib/directives/wallet-events.directive.ts +232 -0
- package/src/lib/hsuite-wallet.module.ts +210 -0
- package/src/lib/models/connection-config.model.ts +65 -0
- package/src/lib/models/provider-types.ts +164 -0
- package/src/lib/models/unified-account.model.ts +76 -0
- package/src/lib/models/wallet-context.model.ts +121 -0
- package/src/lib/models/wallet-events.model.ts +158 -0
- package/src/lib/providers/base-wallet-provider.ts +351 -0
- package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
- package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
- package/src/lib/providers/hsuite-native/index.ts +8 -0
- package/src/lib/providers/hsuite-native-provider.ts +754 -0
- package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
- package/src/lib/providers/p2p-native/index.ts +30 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
- package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
- package/src/lib/providers/wallet-error-handler.ts +349 -0
- package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
- package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
- package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
- package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
- package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
- package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
- package/src/lib/providers/walletconnect/index.ts +33 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
- package/src/lib/services/logger.service.ts +126 -0
- package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
- package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
- package/src/lib/services/transaction-builders/index.ts +54 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
- package/src/lib/services/transaction.service.ts +346 -0
- package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
- package/src/lib/services/unified-wallet.service.ts +852 -0
- package/src/lib/services/wallet-context.service.ts +184 -0
- package/src/lib/services/wallet-event-bus.service.ts +186 -0
- package/src/lib/services/wallet-providers.service.ts +137 -0
- package/src/lib/transports/chrome-extension-transport.ts +246 -0
- package/src/lib/utils/index.ts +14 -0
- package/src/lib/utils/ledger-icons.util.ts +78 -0
- package/test/test-setup.ts +21 -0
- package/test-setup.ts +63 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +29 -0
- package/tsconfig.spec.json +15 -0
- package/vitest.config.ts +48 -0
|
@@ -0,0 +1,2563 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for lib/providers/walletconnect/core/walletconnect-provider.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../../index.html">All files</a> / <a href="index.html">lib/providers/walletconnect/core</a> walletconnect-provider.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">64.52% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>533/826</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">50% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>17/34</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">52.63% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>10/19</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">64.52% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>533/826</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line medium'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
893
|
+
<span class="cline-any cline-yes">1x</span>
|
|
894
|
+
<span class="cline-any cline-yes">1x</span>
|
|
895
|
+
<span class="cline-any cline-yes">1x</span>
|
|
896
|
+
<span class="cline-any cline-yes">1x</span>
|
|
897
|
+
<span class="cline-any cline-yes">1x</span>
|
|
898
|
+
<span class="cline-any cline-yes">1x</span>
|
|
899
|
+
<span class="cline-any cline-yes">1x</span>
|
|
900
|
+
<span class="cline-any cline-yes">1x</span>
|
|
901
|
+
<span class="cline-any cline-yes">1x</span>
|
|
902
|
+
<span class="cline-any cline-yes">1x</span>
|
|
903
|
+
<span class="cline-any cline-yes">1x</span>
|
|
904
|
+
<span class="cline-any cline-yes">1x</span>
|
|
905
|
+
<span class="cline-any cline-yes">1x</span>
|
|
906
|
+
<span class="cline-any cline-yes">1x</span>
|
|
907
|
+
<span class="cline-any cline-yes">1x</span>
|
|
908
|
+
<span class="cline-any cline-yes">1x</span>
|
|
909
|
+
<span class="cline-any cline-yes">1x</span>
|
|
910
|
+
<span class="cline-any cline-yes">1x</span>
|
|
911
|
+
<span class="cline-any cline-yes">1x</span>
|
|
912
|
+
<span class="cline-any cline-yes">1x</span>
|
|
913
|
+
<span class="cline-any cline-yes">1x</span>
|
|
914
|
+
<span class="cline-any cline-yes">1x</span>
|
|
915
|
+
<span class="cline-any cline-yes">1x</span>
|
|
916
|
+
<span class="cline-any cline-yes">1x</span>
|
|
917
|
+
<span class="cline-any cline-yes">1x</span>
|
|
918
|
+
<span class="cline-any cline-yes">1x</span>
|
|
919
|
+
<span class="cline-any cline-yes">1x</span>
|
|
920
|
+
<span class="cline-any cline-yes">1x</span>
|
|
921
|
+
<span class="cline-any cline-yes">1x</span>
|
|
922
|
+
<span class="cline-any cline-yes">1x</span>
|
|
923
|
+
<span class="cline-any cline-yes">1x</span>
|
|
924
|
+
<span class="cline-any cline-yes">1x</span>
|
|
925
|
+
<span class="cline-any cline-yes">1x</span>
|
|
926
|
+
<span class="cline-any cline-yes">1x</span>
|
|
927
|
+
<span class="cline-any cline-yes">1x</span>
|
|
928
|
+
<span class="cline-any cline-yes">1x</span>
|
|
929
|
+
<span class="cline-any cline-yes">1x</span>
|
|
930
|
+
<span class="cline-any cline-yes">1x</span>
|
|
931
|
+
<span class="cline-any cline-yes">1x</span>
|
|
932
|
+
<span class="cline-any cline-yes">1x</span>
|
|
933
|
+
<span class="cline-any cline-yes">1x</span>
|
|
934
|
+
<span class="cline-any cline-yes">1x</span>
|
|
935
|
+
<span class="cline-any cline-yes">1x</span>
|
|
936
|
+
<span class="cline-any cline-yes">1x</span>
|
|
937
|
+
<span class="cline-any cline-yes">1x</span>
|
|
938
|
+
<span class="cline-any cline-yes">1x</span>
|
|
939
|
+
<span class="cline-any cline-yes">1x</span>
|
|
940
|
+
<span class="cline-any cline-yes">1x</span>
|
|
941
|
+
<span class="cline-any cline-yes">1x</span>
|
|
942
|
+
<span class="cline-any cline-yes">1x</span>
|
|
943
|
+
<span class="cline-any cline-yes">1x</span>
|
|
944
|
+
<span class="cline-any cline-yes">1x</span>
|
|
945
|
+
<span class="cline-any cline-yes">1x</span>
|
|
946
|
+
<span class="cline-any cline-yes">1x</span>
|
|
947
|
+
<span class="cline-any cline-yes">1x</span>
|
|
948
|
+
<span class="cline-any cline-yes">1x</span>
|
|
949
|
+
<span class="cline-any cline-yes">1x</span>
|
|
950
|
+
<span class="cline-any cline-yes">1x</span>
|
|
951
|
+
<span class="cline-any cline-yes">1x</span>
|
|
952
|
+
<span class="cline-any cline-yes">1x</span>
|
|
953
|
+
<span class="cline-any cline-yes">1x</span>
|
|
954
|
+
<span class="cline-any cline-yes">1x</span>
|
|
955
|
+
<span class="cline-any cline-yes">1x</span>
|
|
956
|
+
<span class="cline-any cline-yes">1x</span>
|
|
957
|
+
<span class="cline-any cline-yes">1x</span>
|
|
958
|
+
<span class="cline-any cline-yes">1x</span>
|
|
959
|
+
<span class="cline-any cline-yes">1x</span>
|
|
960
|
+
<span class="cline-any cline-yes">1x</span>
|
|
961
|
+
<span class="cline-any cline-yes">1x</span>
|
|
962
|
+
<span class="cline-any cline-yes">1x</span>
|
|
963
|
+
<span class="cline-any cline-yes">1x</span>
|
|
964
|
+
<span class="cline-any cline-yes">1x</span>
|
|
965
|
+
<span class="cline-any cline-yes">1x</span>
|
|
966
|
+
<span class="cline-any cline-yes">1x</span>
|
|
967
|
+
<span class="cline-any cline-yes">1x</span>
|
|
968
|
+
<span class="cline-any cline-yes">1x</span>
|
|
969
|
+
<span class="cline-any cline-yes">1x</span>
|
|
970
|
+
<span class="cline-any cline-yes">16x</span>
|
|
971
|
+
<span class="cline-any cline-yes">16x</span>
|
|
972
|
+
<span class="cline-any cline-yes">16x</span>
|
|
973
|
+
<span class="cline-any cline-yes">16x</span>
|
|
974
|
+
<span class="cline-any cline-yes">16x</span>
|
|
975
|
+
<span class="cline-any cline-yes">16x</span>
|
|
976
|
+
<span class="cline-any cline-yes">16x</span>
|
|
977
|
+
<span class="cline-any cline-yes">16x</span>
|
|
978
|
+
<span class="cline-any cline-yes">16x</span>
|
|
979
|
+
<span class="cline-any cline-yes">16x</span>
|
|
980
|
+
<span class="cline-any cline-yes">16x</span>
|
|
981
|
+
<span class="cline-any cline-yes">16x</span>
|
|
982
|
+
<span class="cline-any cline-yes">16x</span>
|
|
983
|
+
<span class="cline-any cline-yes">16x</span>
|
|
984
|
+
<span class="cline-any cline-yes">16x</span>
|
|
985
|
+
<span class="cline-any cline-yes">16x</span>
|
|
986
|
+
<span class="cline-any cline-yes">16x</span>
|
|
987
|
+
<span class="cline-any cline-yes">16x</span>
|
|
988
|
+
<span class="cline-any cline-yes">16x</span>
|
|
989
|
+
<span class="cline-any cline-yes">16x</span>
|
|
990
|
+
<span class="cline-any cline-yes">16x</span>
|
|
991
|
+
<span class="cline-any cline-yes">16x</span>
|
|
992
|
+
<span class="cline-any cline-yes">16x</span>
|
|
993
|
+
<span class="cline-any cline-yes">16x</span>
|
|
994
|
+
<span class="cline-any cline-yes">16x</span>
|
|
995
|
+
<span class="cline-any cline-yes">16x</span>
|
|
996
|
+
<span class="cline-any cline-yes">16x</span>
|
|
997
|
+
<span class="cline-any cline-yes">16x</span>
|
|
998
|
+
<span class="cline-any cline-yes">16x</span>
|
|
999
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1000
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1002
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1005
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1006
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1007
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1008
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1009
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1010
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1011
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1012
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1013
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1014
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1015
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1016
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1026
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1027
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1028
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1029
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1030
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1031
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1033
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1050
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1051
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1052
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1054
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1055
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1056
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1057
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1058
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1059
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1060
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1061
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1062
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1063
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1064
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1065
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1066
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1067
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1068
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-no"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1106
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1107
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1108
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1109
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1110
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1111
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1112
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1113
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1114
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1115
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1116
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-no"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1234
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1235
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1236
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1237
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1238
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1239
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1240
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1241
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1242
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1243
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1244
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1245
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1246
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1247
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1248
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1249
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1250
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1254
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1255
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1256
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1257
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1258
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1259
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1260
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1261
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1270
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1271
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1272
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1273
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1274
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1275
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1276
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1277
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1278
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1282
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1283
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1284
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1285
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1286
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1287
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1288
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1289
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1290
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1291
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1292
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1293
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1294
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1295
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1296
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1297
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1298
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1299
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1300
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1301
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1302
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1303
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1304
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1305
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1306
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1307
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1308
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1309
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1315
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1316
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1317
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1318
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1319
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1320
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1321
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1322
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1323
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1324
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1325
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1326
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1327
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1328
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1329
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1330
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1331
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1333
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1334
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1335
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1336
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1337
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1338
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1339
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1340
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1341
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1342
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1343
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1344
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1345
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1346
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1347
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1348
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1349
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1350
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1351
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1352
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1353
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1354
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1355
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1356
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1357
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1358
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1359
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1360
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1361
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1362
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1363
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1364
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1365
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1366
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1367
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1368
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1369
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1370
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1371
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1372
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1373
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1374
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1375
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1376
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1377
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1378
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1379
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1380
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1381
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1382
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1383
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1384
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1394
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1395
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1397
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1398
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1399
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1400
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1401
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1402
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1411
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1412
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1413
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1414
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1415
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1419
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1420
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1421
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1423
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1424
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1425
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1426
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1427
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1428
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1429
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1430
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1431
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1432
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1433
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1434
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1435
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1436
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1437
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1438
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1439
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1440
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1441
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1444
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1445
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1446
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1447
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1448
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1449
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1450
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1451
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1452
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1453
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1454
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1455
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1456
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1459
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1460
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1461
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1462
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1463
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1464
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1467
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1468
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1469
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1470
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1471
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1472
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1473
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1474
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1475
|
+
<span class="cline-any cline-yes">13x</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">13x</span>
|
|
1494
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1495
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1497
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1498
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1499
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1500
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1501
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1502
|
+
<span class="cline-any cline-no"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-no"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-no"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-no"> </span>
|
|
1513
|
+
<span class="cline-any cline-no"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-no"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-no"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-no"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1538
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1539
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1540
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1541
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1542
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1543
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1544
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1545
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1546
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1547
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1548
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1549
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1550
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1551
|
+
<span class="cline-any cline-yes">12x</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-yes">12x</span>
|
|
1559
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1560
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1561
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1562
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1563
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1564
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1565
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1566
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1567
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1568
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1569
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1570
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1571
|
+
<span class="cline-any cline-yes">4x</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-yes">4x</span>
|
|
1576
|
+
<span class="cline-any cline-yes">4x</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-yes">4x</span>
|
|
1604
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1605
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1606
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1607
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1608
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1609
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1610
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1611
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1612
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1613
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1614
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1615
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1616
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1617
|
+
<span class="cline-any cline-yes">4x</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-yes">4x</span>
|
|
1622
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1623
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1624
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1625
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1626
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1627
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1628
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1629
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1630
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1631
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1632
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1633
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1634
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1635
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1636
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1637
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1638
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1639
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1640
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1641
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1642
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1643
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1644
|
+
<span class="cline-any cline-no"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1647
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1648
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1649
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1650
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1651
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1652
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1653
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1654
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1658
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1659
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1660
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1661
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1662
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1663
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1664
|
+
<span class="cline-any cline-yes">16x</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-yes">16x</span>
|
|
1671
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1672
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1673
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1674
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1675
|
+
<span class="cline-any cline-yes">16x</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-yes">16x</span>
|
|
1682
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1683
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1684
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1685
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1686
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-no"> </span>
|
|
1689
|
+
<span class="cline-any cline-yes">16x</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-yes">16x</span>
|
|
1693
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1694
|
+
<span class="cline-any cline-yes">16x</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-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-yes">16x</span>
|
|
1708
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1709
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1710
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1711
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1712
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1713
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1714
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1719
|
+
* HSuite Native Connect
|
|
1720
|
+
* Copyright 2024-2025 HSuite (https://hsuite.finance)
|
|
1721
|
+
*
|
|
1722
|
+
* SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
|
|
1723
|
+
*
|
|
1724
|
+
* This file is part of HSuite Native Connect. For commercial licensing,
|
|
1725
|
+
* visit https://hsuite.finance/licensing
|
|
1726
|
+
*/
|
|
1727
|
+
|
|
1728
|
+
/**
|
|
1729
|
+
* @file walletconnect-provider.ts
|
|
1730
|
+
* @description Refactored WalletConnect v2 provider using Strategy Pattern
|
|
1731
|
+
*
|
|
1732
|
+
* Multi-chain WalletConnect v2 provider that delegates ledger-specific logic
|
|
1733
|
+
* to specialized signer implementations.
|
|
1734
|
+
*
|
|
1735
|
+
* Architecture:
|
|
1736
|
+
* - Provider: Orchestrates connection, session management, and UI
|
|
1737
|
+
* - Signers: Handle ledger-specific transaction signing and formatting
|
|
1738
|
+
* - Encoders: Convert between SDK formats and WalletConnect formats
|
|
1739
|
+
*
|
|
1740
|
+
* Benefits:
|
|
1741
|
+
* - Clean separation of concerns
|
|
1742
|
+
* - Easy to add new ledgers (just implement IWalletConnectSigner)
|
|
1743
|
+
* - Testable (mock signers for unit tests)
|
|
1744
|
+
* - Maintainable (ledger logic is isolated)
|
|
1745
|
+
*/
|
|
1746
|
+
|
|
1747
|
+
import { Injectable, signal, inject, NgZone } from '@angular/core';
|
|
1748
|
+
import { getLogger } from '@hsuite/native-connect-sdk';
|
|
1749
|
+
|
|
1750
|
+
import type {
|
|
1751
|
+
ConnectionStatus,
|
|
1752
|
+
ProviderMetadata,
|
|
1753
|
+
ConnectionConfig,
|
|
1754
|
+
WalletConnectV2Config,
|
|
1755
|
+
} from '../../../models/provider-types';
|
|
1756
|
+
import type { UnifiedAccount } from '../../../models/unified-account.model';
|
|
1757
|
+
import { WalletEventBus } from '../../../services/wallet-event-bus.service';
|
|
1758
|
+
import { BaseWalletProvider } from '../../base-wallet-provider';
|
|
1759
|
+
import type {
|
|
1760
|
+
SignTransactionOptions,
|
|
1761
|
+
SubmitTransactionOptions,
|
|
1762
|
+
SignResult,
|
|
1763
|
+
SubmitResult,
|
|
1764
|
+
SignMessageOptions,
|
|
1765
|
+
SignMessageResult,
|
|
1766
|
+
} from '../../base-wallet-provider';
|
|
1767
|
+
import { SignerFactory } from '../signers/signer-factory';
|
|
1768
|
+
|
|
1769
|
+
import { WalletConnectClientManager } from './walletconnect-client-manager';
|
|
1770
|
+
import { WalletConnectSessionStore } from './walletconnect-session-store';
|
|
1771
|
+
import { WalletConnectSigningOrchestrator } from './walletconnect-signing-orchestrator';
|
|
1772
|
+
|
|
1773
|
+
const logger = getLogger().scoped?.('WalletConnectV2Provider'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
|
|
1774
|
+
|
|
1775
|
+
/**
|
|
1776
|
+
* Storage key prefix for persisting user's network selection per session topic.
|
|
1777
|
+
* This is critical for proper session restoration after page reload.
|
|
1778
|
+
*/
|
|
1779
|
+
const NETWORK_SELECTION_STORAGE_KEY = 'wc_user_network_selection_';
|
|
1780
|
+
|
|
1781
|
+
/**
|
|
1782
|
+
* WalletConnect v2 provider with multi-chain support.
|
|
1783
|
+
*
|
|
1784
|
+
* Uses Strategy Pattern to delegate ledger-specific operations to
|
|
1785
|
+
* specialized signer implementations (HederaSigner, XrplSigner, etc.).
|
|
1786
|
+
*
|
|
1787
|
+
* Features:
|
|
1788
|
+
* - Automatic session restoration from IndexedDB
|
|
1789
|
+
* - QR code modal for wallet connection
|
|
1790
|
+
* - Support for multiple ledgers (Hedera, XRPL, extensible)
|
|
1791
|
+
* - Clean separation of orchestration vs ledger logic
|
|
1792
|
+
* - **Multi-session support**: Connect multiple wallets across different ledgers/networks
|
|
1793
|
+
*/
|
|
1794
|
+
@Injectable({ providedIn: 'root' })
|
|
1795
|
+
export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
1796
|
+
override readonly id = 'walletconnect-v2';
|
|
1797
|
+
|
|
1798
|
+
override readonly metadata: ProviderMetadata = {
|
|
1799
|
+
id: 'walletconnect-v2',
|
|
1800
|
+
name: 'WalletConnect',
|
|
1801
|
+
type: 'walletconnect-v2',
|
|
1802
|
+
description: 'Connect via QR code to Hedera, XRPL, and other wallets',
|
|
1803
|
+
supportsMultipleAccounts: true, // Changed to true for multi-session
|
|
1804
|
+
};
|
|
1805
|
+
|
|
1806
|
+
/**
|
|
1807
|
+
* Client manager - handles SignClient lifecycle.
|
|
1808
|
+
*/
|
|
1809
|
+
private readonly clientManager = new WalletConnectClientManager();
|
|
1810
|
+
|
|
1811
|
+
/**
|
|
1812
|
+
* Session store - handles session Map and account aggregation.
|
|
1813
|
+
*/
|
|
1814
|
+
private readonly sessionStore = new WalletConnectSessionStore();
|
|
1815
|
+
|
|
1816
|
+
/**
|
|
1817
|
+
* Signing orchestrator - handles transaction signing routing.
|
|
1818
|
+
*/
|
|
1819
|
+
private signingOrchestrator!: WalletConnectSigningOrchestrator;
|
|
1820
|
+
|
|
1821
|
+
// Track session_delete listener registration
|
|
1822
|
+
private sessionDeleteListenerRegistered = false;
|
|
1823
|
+
|
|
1824
|
+
// Reactive state
|
|
1825
|
+
private _status = signal<ConnectionStatus>('disconnected');
|
|
1826
|
+
private _error = signal<string | null>(null);
|
|
1827
|
+
|
|
1828
|
+
override readonly status = this._status.asReadonly();
|
|
1829
|
+
override readonly accounts = this.sessionStore.accounts;
|
|
1830
|
+
override readonly error = this._error.asReadonly();
|
|
1831
|
+
|
|
1832
|
+
// Event bus for emitting wallet events
|
|
1833
|
+
private readonly eventBus = inject(WalletEventBus);
|
|
1834
|
+
|
|
1835
|
+
// NgZone for ensuring change detection runs after WalletConnect events
|
|
1836
|
+
private readonly zone = inject(NgZone);
|
|
1837
|
+
|
|
1838
|
+
/**
|
|
1839
|
+
*
|
|
1840
|
+
*/
|
|
1841
|
+
constructor() {
|
|
1842
|
+
super();
|
|
1843
|
+
|
|
1844
|
+
// Initialize signing orchestrator
|
|
1845
|
+
this.signingOrchestrator = new WalletConnectSigningOrchestrator({
|
|
1846
|
+
providerId: this.id,
|
|
1847
|
+
sessionStore: this.sessionStore,
|
|
1848
|
+
clientManager: this.clientManager,
|
|
1849
|
+
eventBus: this.eventBus,
|
|
1850
|
+
});
|
|
1851
|
+
|
|
1852
|
+
logger.info('Initializing - will attempt session restoration');
|
|
1853
|
+
void this.restoreSession();
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
/**
|
|
1857
|
+
* Ensure that a previously restored WalletConnect session is present in memory.
|
|
1858
|
+
* Useful for UI flows that want to re-select a session after reload without forcing a new pairing flow.
|
|
1859
|
+
* @param sessionKey
|
|
1860
|
+
*/
|
|
1861
|
+
<span class="fstat-no" title="function not covered" > async resumeSession(sessionKey: string): Promise<boolean> {</span>
|
|
1862
|
+
<span class="cstat-no" title="statement not covered" > if (this.sessionStore.hasSession(sessionKey)) {</span>
|
|
1863
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
1864
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
1865
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1866
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1867
|
+
<span class="cstat-no" title="statement not covered" > await this.restoreSession();</span>
|
|
1868
|
+
<span class="cstat-no" title="statement not covered" > const exists = this.sessionStore.hasSession(sessionKey);</span>
|
|
1869
|
+
<span class="cstat-no" title="statement not covered" > if (exists) {</span>
|
|
1870
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
1871
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1872
|
+
<span class="cstat-no" title="statement not covered" > return exists;</span>
|
|
1873
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1874
|
+
|
|
1875
|
+
/**
|
|
1876
|
+
* Restore existing WalletConnect sessions from IndexedDB.
|
|
1877
|
+
* Automatically called during provider initialization.
|
|
1878
|
+
* Uses clientManager for client lifecycle.
|
|
1879
|
+
*/
|
|
1880
|
+
private async restoreSession(): Promise<void> {
|
|
1881
|
+
try {
|
|
1882
|
+
logger.debug('Attempting to restore sessions...');
|
|
1883
|
+
|
|
1884
|
+
// Restore client from stored projectId
|
|
1885
|
+
const client = await this.clientManager.restoreClient({
|
|
1886
|
+
name: 'HSuite Demo',
|
|
1887
|
+
description: 'Multi-chain wallet connection',
|
|
1888
|
+
url: window.location.origin,
|
|
1889
|
+
icons: [],
|
|
1890
|
+
});
|
|
1891
|
+
|
|
1892
|
+
if (!client) {
|
|
1893
|
+
return;
|
|
1894
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > }</span>
|
|
1895
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1896
|
+
<span class="cstat-no" title="statement not covered" > // Register session_delete listener</span>
|
|
1897
|
+
<span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
|
|
1898
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1899
|
+
<span class="cstat-no" title="statement not covered" > // Get all active sessions</span>
|
|
1900
|
+
<span class="cstat-no" title="statement not covered" > const activeSessions = this.clientManager.getActiveSessions();</span>
|
|
1901
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Found active sessions', { count: activeSessions.length });</span>
|
|
1902
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1903
|
+
<span class="cstat-no" title="statement not covered" > if (activeSessions.length === 0) {</span>
|
|
1904
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1905
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1906
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1907
|
+
<span class="cstat-no" title="statement not covered" > // Restore each session</span>
|
|
1908
|
+
<span class="cstat-no" title="statement not covered" > for (const session of activeSessions) {</span>
|
|
1909
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1910
|
+
<span class="cstat-no" title="statement not covered" > await this.restoreSingleSession(session);</span>
|
|
1911
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
1912
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Failed to restore session', {</span>
|
|
1913
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
|
|
1914
|
+
<span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
|
|
1915
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1916
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1917
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1918
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1919
|
+
<span class="cstat-no" title="statement not covered" > // Update aggregated accounts</span>
|
|
1920
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1922
|
+
<span class="cstat-no" title="statement not covered" > if (this.sessionStore.size > 0) {</span>
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('connected');</span>
|
|
1924
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Restored sessions', { count: this.sessionStore.size });</span>
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1926
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
|
|
1927
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Failed to restore sessions', {</span>
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
|
|
1929
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1930
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1933
|
+
/**
|
|
1934
|
+
* Restore a single WalletConnect session.
|
|
1935
|
+
* Internal helper for multi-session restoration.
|
|
1936
|
+
*
|
|
1937
|
+
* IMPORTANT: Reads user's network selection from localStorage to ensure
|
|
1938
|
+
* restored sessions use the correct network the user originally selected.
|
|
1939
|
+
*
|
|
1940
|
+
* @param session - WalletConnect session object from IndexedDB
|
|
1941
|
+
*/
|
|
1942
|
+
<span class="fstat-no" title="function not covered" > private async restoreSingleSession(session: any): Promise<void> {</span>
|
|
1943
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Restoring session', { topic: session.topic });</span>
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Session namespaces', { namespaces: Object.keys(session.namespaces) });</span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1946
|
+
<span class="cstat-no" title="statement not covered" > // Determine ledger from session namespaces</span>
|
|
1947
|
+
<span class="cstat-no" title="statement not covered" > let ledgerId: string | undefined;</span>
|
|
1948
|
+
<span class="cstat-no" title="statement not covered" > let walletReportedNetwork: string | undefined;</span>
|
|
1949
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1950
|
+
<span class="cstat-no" title="statement not covered" > if (session.namespaces.hedera) {</span>
|
|
1951
|
+
<span class="cstat-no" title="statement not covered" > ledgerId = 'hedera';</span>
|
|
1952
|
+
<span class="cstat-no" title="statement not covered" > walletReportedNetwork = session.namespaces.hedera.chains?.[0] || 'hedera:testnet';</span>
|
|
1953
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Found Hedera namespace', { chains: session.namespaces.hedera.chains });</span>
|
|
1954
|
+
<span class="cstat-no" title="statement not covered" > } else if (session.namespaces.xrpl) {</span>
|
|
1955
|
+
<span class="cstat-no" title="statement not covered" > ledgerId = 'xrpl';</span>
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" > walletReportedNetwork = session.namespaces.xrpl.chains?.[0] || 'xrpl:testnet';</span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Found XRPL namespace', { chains: session.namespaces.xrpl.chains });</span>
|
|
1958
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1959
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1960
|
+
<span class="cstat-no" title="statement not covered" > if (!ledgerId || !walletReportedNetwork) {</span>
|
|
1961
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Could not determine ledger for session', {</span>
|
|
1962
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
|
|
1963
|
+
<span class="cstat-no" title="statement not covered" > availableNamespaces: Object.keys(session.namespaces),</span>
|
|
1964
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1965
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1966
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1967
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1968
|
+
<span class="cstat-no" title="statement not covered" > // CRITICAL: Retrieve user's original network selection from localStorage</span>
|
|
1969
|
+
<span class="cstat-no" title="statement not covered" > // This ensures we restore the session with the network the user actually selected</span>
|
|
1970
|
+
<span class="cstat-no" title="statement not covered" > const userSelectedNetwork = this.getUserNetworkSelection(session.topic);</span>
|
|
1971
|
+
<span class="cstat-no" title="statement not covered" > const networkId = userSelectedNetwork || walletReportedNetwork;</span>
|
|
1972
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1973
|
+
<span class="cstat-no" title="statement not covered" > if (userSelectedNetwork) {</span>
|
|
1974
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Restored user network selection', {</span>
|
|
1975
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork,</span>
|
|
1976
|
+
<span class="cstat-no" title="statement not covered" > walletReportedNetwork,</span>
|
|
1977
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic.substring(0, 16),</span>
|
|
1978
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1979
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1980
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('No stored network selection found, using wallet-reported network', {</span>
|
|
1981
|
+
<span class="cstat-no" title="statement not covered" > walletReportedNetwork,</span>
|
|
1982
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic.substring(0, 16),</span>
|
|
1983
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1984
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1985
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1986
|
+
<span class="cstat-no" title="statement not covered" > // Get the appropriate signer</span>
|
|
1987
|
+
<span class="cstat-no" title="statement not covered" > const signer = SignerFactory.getSigner(ledgerId);</span>
|
|
1988
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1989
|
+
<span class="cstat-no" title="statement not covered" > // Generate session key using the user's selected network</span>
|
|
1990
|
+
<span class="cstat-no" title="statement not covered" > const sessionKey = this.sessionStore.generateSessionKey(ledgerId, networkId, session.topic);</span>
|
|
1991
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1992
|
+
<span class="cstat-no" title="statement not covered" > // Parse accounts from session, filtering by user's selected network</span>
|
|
1993
|
+
<span class="cstat-no" title="statement not covered" > const namespace = session.namespaces[ledgerId];</span>
|
|
1994
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Namespace for restoration', {</span>
|
|
1995
|
+
<span class="cstat-no" title="statement not covered" > ledgerId,</span>
|
|
1996
|
+
<span class="cstat-no" title="statement not covered" > accountCount: (namespace as { accounts?: any[] })?.accounts?.length || 0,</span>
|
|
1997
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1998
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > // Pass the user's selected network to filter accounts appropriately</span>
|
|
2000
|
+
<span class="cstat-no" title="statement not covered" > const parsedAccounts = signer.parseAccounts(namespace, userSelectedNetwork);</span>
|
|
2001
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Parsed accounts from restored session', {</span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" > count: parsedAccounts.length,</span>
|
|
2003
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork,</span>
|
|
2004
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2006
|
+
<span class="cstat-no" title="statement not covered" > if (parsedAccounts.length === 0) {</span>
|
|
2007
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Restored session has no accounts for selected network', {</span>
|
|
2008
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork,</span>
|
|
2009
|
+
<span class="cstat-no" title="statement not covered" > walletReportedNetwork,</span>
|
|
2010
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2011
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2012
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2013
|
+
<span class="cstat-no" title="statement not covered" > // Create UnifiedAccount objects with user's selected network</span>
|
|
2014
|
+
<span class="cstat-no" title="statement not covered" > const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) => ({</span>
|
|
2015
|
+
<span class="cstat-no" title="statement not covered" > id: `${this.id}-${ledgerId}-${acc.address}`,</span>
|
|
2016
|
+
<span class="cstat-no" title="statement not covered" > address: acc.address,</span>
|
|
2017
|
+
<span class="cstat-no" title="statement not covered" > label: `Account ${index + 1}`,</span>
|
|
2018
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: ledgerId as 'hedera' | 'xrpl',</span>
|
|
2019
|
+
<span class="cstat-no" title="statement not covered" > networkId: networkId, // Use user's selected network</span>
|
|
2020
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2021
|
+
<span class="cstat-no" title="statement not covered" > providerType: 'walletconnect-v2',</span>
|
|
2022
|
+
<span class="cstat-no" title="statement not covered" > metadata: {</span>
|
|
2023
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
|
|
2024
|
+
<span class="cstat-no" title="statement not covered" > ledger: ledgerId,</span>
|
|
2025
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2026
|
+
<span class="cstat-no" title="statement not covered" > peer: session.peer?.metadata,</span>
|
|
2027
|
+
<span class="cstat-no" title="statement not covered" > walletReportedChainId: acc.chainId, // Keep original for debugging</span>
|
|
2028
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: networkId,</span>
|
|
2029
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2030
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2031
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2032
|
+
<span class="cstat-no" title="statement not covered" > // Store session data with user's network selection</span>
|
|
2033
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.setSession(sessionKey, {</span>
|
|
2034
|
+
<span class="cstat-no" title="statement not covered" > session,</span>
|
|
2035
|
+
<span class="cstat-no" title="statement not covered" > ledgerId,</span>
|
|
2036
|
+
<span class="cstat-no" title="statement not covered" > networkId,</span>
|
|
2037
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: networkId,</span>
|
|
2038
|
+
<span class="cstat-no" title="statement not covered" > signer,</span>
|
|
2039
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2040
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2041
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2042
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Restored session', {</span>
|
|
2043
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2044
|
+
<span class="cstat-no" title="statement not covered" > ledgerId,</span>
|
|
2045
|
+
<span class="cstat-no" title="statement not covered" > networkId,</span>
|
|
2046
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: networkId,</span>
|
|
2047
|
+
<span class="cstat-no" title="statement not covered" > accountCount: accounts.length,</span>
|
|
2048
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2049
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2050
|
+
<span class="cstat-no" title="statement not covered" > // Emit session restored event</span>
|
|
2051
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.sessionRestored.emit({</span>
|
|
2052
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2053
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2055
|
+
<span class="cstat-no" title="statement not covered" > metadata: { topic: session.topic, ledgerId, networkId, userSelectedNetwork: networkId },</span>
|
|
2056
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2057
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2058
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2059
|
+
|
|
2060
|
+
// NOTE: generateSessionKey and updateAggregatedAccounts have been moved to WalletConnectSessionStore
|
|
2061
|
+
|
|
2062
|
+
/**
|
|
2063
|
+
* Store user's network selection in localStorage for session restoration.
|
|
2064
|
+
* This ensures the user's network choice persists across page reloads.
|
|
2065
|
+
*
|
|
2066
|
+
* @param sessionTopic - WalletConnect session topic
|
|
2067
|
+
* @param networkId - User's selected network (e.g., 'hedera:mainnet')
|
|
2068
|
+
*/
|
|
2069
|
+
private storeUserNetworkSelection(sessionTopic: string, networkId: string): void {
|
|
2070
|
+
try {
|
|
2071
|
+
localStorage.setItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`, networkId);
|
|
2072
|
+
logger.debug('Stored user network selection', {
|
|
2073
|
+
topic: sessionTopic.substring(0, 16),
|
|
2074
|
+
networkId,
|
|
2075
|
+
});
|
|
2076
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch (e) {</span>
|
|
2077
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Failed to store network selection', { error: (e as Error).message });</span>
|
|
2078
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2079
|
+
}
|
|
2080
|
+
|
|
2081
|
+
/**
|
|
2082
|
+
* Retrieve user's network selection from localStorage for session restoration.
|
|
2083
|
+
*
|
|
2084
|
+
* @param sessionTopic - WalletConnect session topic
|
|
2085
|
+
* @returns User's selected network, or undefined if not found
|
|
2086
|
+
*/
|
|
2087
|
+
private <span class="fstat-no" title="function not covered" >getUserNetworkSelection(sessionTopic: string): string | undefined {</span>
|
|
2088
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2089
|
+
<span class="cstat-no" title="statement not covered" > return localStorage.getItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`) || undefined;</span>
|
|
2090
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
2091
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('Failed to retrieve network selection', { error: (e as Error).message });</span>
|
|
2092
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2093
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2094
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2095
|
+
|
|
2096
|
+
/**
|
|
2097
|
+
* Clean up stored network selection for a session.
|
|
2098
|
+
*
|
|
2099
|
+
* @param sessionTopic - WalletConnect session topic
|
|
2100
|
+
*/
|
|
2101
|
+
private clearUserNetworkSelection(sessionTopic: string): void {
|
|
2102
|
+
try {
|
|
2103
|
+
localStorage.removeItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`);
|
|
2104
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch (_e) {</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" > // Ignore cleanup errors</span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
/**
|
|
2110
|
+
* Connect to a wallet via WalletConnect QR code.
|
|
2111
|
+
*
|
|
2112
|
+
* Multi-session support:
|
|
2113
|
+
* - Each connect() call creates a NEW session
|
|
2114
|
+
* - Sessions are tracked separately in the sessions Map
|
|
2115
|
+
* - Multiple sessions can coexist for different ledgers/networks
|
|
2116
|
+
*
|
|
2117
|
+
* Process:
|
|
2118
|
+
* 1. Get appropriate signer for the ledger
|
|
2119
|
+
* 2. Initialize WalletConnect client and modal
|
|
2120
|
+
* 3. Build namespace configuration using signer
|
|
2121
|
+
* 4. Generate QR code and wait for wallet approval
|
|
2122
|
+
* 5. Store session and update aggregated accounts
|
|
2123
|
+
*
|
|
2124
|
+
* @param config - Connection configuration including ledger and network
|
|
2125
|
+
*/
|
|
2126
|
+
async connect(config: ConnectionConfig): Promise<void> {
|
|
2127
|
+
const wcConfig = config as WalletConnectV2Config;
|
|
2128
|
+
|
|
2129
|
+
try {
|
|
2130
|
+
this._status.set('connecting');
|
|
2131
|
+
this._error.set(null);
|
|
2132
|
+
|
|
2133
|
+
// Validate configuration
|
|
2134
|
+
const projectId = wcConfig.projectId;
|
|
2135
|
+
if (!projectId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2137
|
+
<span class="cstat-no" title="statement not covered" > 'WalletConnect projectId is required. Get one from https://cloud.walletconnect.com',</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2140
|
+
|
|
2141
|
+
// Get the appropriate signer for this ledger (Strategy Pattern)
|
|
2142
|
+
const signer = SignerFactory.getSigner(wcConfig.ledgerId);
|
|
2143
|
+
logger.debug('Using signer for ledger', { ledgerId: wcConfig.ledgerId });
|
|
2144
|
+
|
|
2145
|
+
// Initialize client via manager
|
|
2146
|
+
await this.clientManager.initialize(projectId, {
|
|
2147
|
+
name: wcConfig.appName || 'HSuite Demo',
|
|
2148
|
+
description: wcConfig.appDescription || 'Multi-chain wallet connection',
|
|
2149
|
+
url: window.location.origin,
|
|
2150
|
+
icons: wcConfig.<span class="branch-0 cbranch-no" title="branch not covered" >appIconUrl ? [wcConfig.appIconUrl] : [</span>],
|
|
2151
|
+
});
|
|
2152
|
+
this.registerSessionDeleteListener();
|
|
2153
|
+
|
|
2154
|
+
// Create modal for QR code display
|
|
2155
|
+
const modal = this.clientManager.createModal(projectId, [wcConfig.networkId]);
|
|
2156
|
+
|
|
2157
|
+
// Build namespace configuration using signer
|
|
2158
|
+
const namespaceConfig = signer.buildNamespace(wcConfig.networkId);
|
|
2159
|
+
const optionalNamespaces = { [wcConfig.ledgerId]: namespaceConfig };
|
|
2160
|
+
logger.debug('Namespace config', { ledgerId: wcConfig.ledgerId });
|
|
2161
|
+
|
|
2162
|
+
// Build session properties to pass user's preferred network to wallet
|
|
2163
|
+
// This tells the wallet which network accounts to show in the picker
|
|
2164
|
+
const sessionProperties = {
|
|
2165
|
+
preferredNetwork: wcConfig.networkId,
|
|
2166
|
+
preferredLedger: wcConfig.ledgerId,
|
|
2167
|
+
};
|
|
2168
|
+
|
|
2169
|
+
logger.info('Connecting with preferred network', {
|
|
2170
|
+
preferredNetwork: wcConfig.networkId,
|
|
2171
|
+
preferredLedger: wcConfig.ledgerId,
|
|
2172
|
+
});
|
|
2173
|
+
|
|
2174
|
+
// Connect and show QR code
|
|
2175
|
+
const { uri, approval } = await this.clientManager.connect(
|
|
2176
|
+
optionalNamespaces,
|
|
2177
|
+
sessionProperties,
|
|
2178
|
+
);
|
|
2179
|
+
|
|
2180
|
+
if (uri) {
|
|
2181
|
+
await modal.openModal({ uri });
|
|
2182
|
+
}
|
|
2183
|
+
|
|
2184
|
+
// Wait for wallet approval
|
|
2185
|
+
logger.info('Waiting for wallet approval...');
|
|
2186
|
+
const session = await approval();
|
|
2187
|
+
this.clientManager.closeModal();
|
|
2188
|
+
|
|
2189
|
+
logger.info('[WC:DAPP:APPROVED] Session approved by wallet', {
|
|
2190
|
+
topic: session.topic.substring(0, 16) + '...',
|
|
2191
|
+
fullTopic: session.topic,
|
|
2192
|
+
namespaces: Object.keys(session.namespaces),
|
|
2193
|
+
expiry: session.expiry,
|
|
2194
|
+
});
|
|
2195
|
+
|
|
2196
|
+
// Generate session key
|
|
2197
|
+
const sessionKey = this.sessionStore.generateSessionKey(
|
|
2198
|
+
wcConfig.ledgerId,
|
|
2199
|
+
wcConfig.networkId,
|
|
2200
|
+
session.topic,
|
|
2201
|
+
);
|
|
2202
|
+
|
|
2203
|
+
// Parse accounts from session
|
|
2204
|
+
const sessionNamespace = session.namespaces[wcConfig.ledgerId];
|
|
2205
|
+
logger.debug('Session namespace for ledger', {
|
|
2206
|
+
ledgerId: wcConfig.ledgerId,
|
|
2207
|
+
accountCount: (sessionNamespace as { accounts?: any[] })?.accounts?.<span class="branch-0 cbranch-no" title="branch not covered" >length || 0,</span>
|
|
2208
|
+
});
|
|
2209
|
+
|
|
2210
|
+
if (!sessionNamespace) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2211
|
+
<span class="cstat-no" title="statement not covered" > logger.error('No namespace found for ledger', {</span>
|
|
2212
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
|
|
2213
|
+
<span class="cstat-no" title="statement not covered" > availableNamespaces: Object.keys(session.namespaces),</span>
|
|
2214
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2215
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2216
|
+
<span class="cstat-no" title="statement not covered" > `Wallet did not approve ${wcConfig.ledgerId} namespace. Available: ${Object.keys(session.namespaces).join(', ')}`,</span>
|
|
2217
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2218
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2219
|
+
|
|
2220
|
+
// Parse accounts from session namespace, filtering by user's selected network
|
|
2221
|
+
// This ensures we only show accounts that match the network the user selected
|
|
2222
|
+
const parsedAccounts = signer.parseAccounts(sessionNamespace, wcConfig.networkId);
|
|
2223
|
+
logger.debug('Parsed accounts', {
|
|
2224
|
+
count: parsedAccounts.length,
|
|
2225
|
+
userSelectedNetwork: wcConfig.networkId,
|
|
2226
|
+
});
|
|
2227
|
+
|
|
2228
|
+
if (parsedAccounts.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2229
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('No accounts returned from wallet - possible causes:', {</span>
|
|
2230
|
+
<span class="cstat-no" title="statement not covered" > reason1: 'Wallet has no accounts for the requested network',</span>
|
|
2231
|
+
<span class="cstat-no" title="statement not covered" > reason2: 'Wallet denied account sharing',</span>
|
|
2232
|
+
<span class="cstat-no" title="statement not covered" > reason3: 'Wallet returned accounts in unexpected format',</span>
|
|
2233
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId,</span>
|
|
2234
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2235
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2236
|
+
|
|
2237
|
+
// Create UnifiedAccount objects
|
|
2238
|
+
// IMPORTANT: Use wcConfig.networkId (user's selection) for account networkId
|
|
2239
|
+
// This respects user intent rather than relying on wallet-reported chain
|
|
2240
|
+
const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) => ({
|
|
2241
|
+
id: `${this.id}-${wcConfig.ledgerId}-${acc.address}`,
|
|
2242
|
+
address: acc.address,
|
|
2243
|
+
label: `Account ${index + 1}`,
|
|
2244
|
+
ledgerId: wcConfig.ledgerId,
|
|
2245
|
+
networkId: wcConfig.networkId, // Use user's selected network, not wallet-reported
|
|
2246
|
+
providerId: this.id,
|
|
2247
|
+
providerType: 'walletconnect-v2',
|
|
2248
|
+
metadata: {
|
|
2249
|
+
topic: session.topic,
|
|
2250
|
+
ledger: wcConfig.ledgerId,
|
|
2251
|
+
sessionKey,
|
|
2252
|
+
walletReportedChainId: acc.chainId, // Keep original for debugging
|
|
2253
|
+
userSelectedNetwork: wcConfig.networkId, // Store for session restoration
|
|
2254
|
+
},
|
|
2255
|
+
}));
|
|
2256
|
+
|
|
2257
|
+
// Store session data with user's selected network
|
|
2258
|
+
this.sessionStore.setSession(sessionKey, {
|
|
2259
|
+
session,
|
|
2260
|
+
ledgerId: wcConfig.ledgerId,
|
|
2261
|
+
networkId: wcConfig.networkId,
|
|
2262
|
+
userSelectedNetwork: wcConfig.networkId, // Store user's selection for restoration
|
|
2263
|
+
signer,
|
|
2264
|
+
accounts,
|
|
2265
|
+
});
|
|
2266
|
+
|
|
2267
|
+
// Persist user's network selection for session restoration after page reload
|
|
2268
|
+
this.storeUserNetworkSelection(session.topic, wcConfig.networkId);
|
|
2269
|
+
|
|
2270
|
+
// Verify session exists in WC SDK after storing
|
|
2271
|
+
const sdkSession = this.clientManager.getSession(session.topic);
|
|
2272
|
+
|
|
2273
|
+
logger.info('[WC:DAPP:STORED] Session stored locally', {
|
|
2274
|
+
sessionKey,
|
|
2275
|
+
topic: session.topic.substring(0, 16) + '...',
|
|
2276
|
+
fullTopic: session.topic,
|
|
2277
|
+
accountCount: accounts.length,
|
|
2278
|
+
totalSessions: this.sessionStore.size,
|
|
2279
|
+
existsInSdkSession: !!sdkSession,
|
|
2280
|
+
});
|
|
2281
|
+
|
|
2282
|
+
// Update aggregated accounts
|
|
2283
|
+
this.sessionStore.updateAggregatedAccounts();
|
|
2284
|
+
this._status.set('connected');
|
|
2285
|
+
|
|
2286
|
+
// Emit session created event
|
|
2287
|
+
this.eventBus.sessionCreated.emit({
|
|
2288
|
+
providerId: this.id,
|
|
2289
|
+
sessionKey,
|
|
2290
|
+
accounts,
|
|
2291
|
+
metadata: {
|
|
2292
|
+
topic: session.topic,
|
|
2293
|
+
ledgerId: wcConfig.ledgerId,
|
|
2294
|
+
networkId: wcConfig.networkId,
|
|
2295
|
+
},
|
|
2296
|
+
timestamp: Date.now(),
|
|
2297
|
+
});
|
|
2298
|
+
|
|
2299
|
+
// Register session_delete listener (idempotent)
|
|
2300
|
+
this.registerSessionDeleteListener();
|
|
2301
|
+
} catch (error) {
|
|
2302
|
+
this._status.set('error');
|
|
2303
|
+
this._error.set(error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : 'Connection failed')</span>;
|
|
2304
|
+
logger.error('Connection failed', {
|
|
2305
|
+
error: error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error),</span>
|
|
2306
|
+
});
|
|
2307
|
+
|
|
2308
|
+
// Emit provider error event
|
|
2309
|
+
this.eventBus.providerError.emit({
|
|
2310
|
+
providerId: this.id,
|
|
2311
|
+
error: error instanceof Error ? <span class="branch-0 cbranch-no" title="branch not covered" >error : String(error),</span>
|
|
2312
|
+
context: 'connection',
|
|
2313
|
+
timestamp: Date.now(),
|
|
2314
|
+
});
|
|
2315
|
+
|
|
2316
|
+
this.clientManager.closeModal();
|
|
2317
|
+
throw error;
|
|
2318
|
+
}
|
|
2319
|
+
}
|
|
2320
|
+
|
|
2321
|
+
/**
|
|
2322
|
+
* Remove a session by its WalletConnect topic.
|
|
2323
|
+
* Internal helper for session_delete event handling.
|
|
2324
|
+
*
|
|
2325
|
+
* @param topic - WalletConnect session topic
|
|
2326
|
+
*/
|
|
2327
|
+
private <span class="fstat-no" title="function not covered" >removeSessionByTopic(topic: string): void {</span>
|
|
2328
|
+
<span class="cstat-no" title="statement not covered" > // Find and remove the session using session store</span>
|
|
2329
|
+
<span class="cstat-no" title="statement not covered" > const removed = this.sessionStore.removeSessionByTopic(topic);</span>
|
|
2330
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2331
|
+
<span class="cstat-no" title="statement not covered" > // Clean up stored network selection</span>
|
|
2332
|
+
<span class="cstat-no" title="statement not covered" > this.clearUserNetworkSelection(topic);</span>
|
|
2333
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2334
|
+
<span class="cstat-no" title="statement not covered" > // Update aggregated accounts</span>
|
|
2335
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
2336
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2337
|
+
<span class="cstat-no" title="statement not covered" > // Update status</span>
|
|
2338
|
+
<span class="cstat-no" title="statement not covered" > if (this.sessionStore.size === 0) {</span>
|
|
2339
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('disconnected');</span>
|
|
2340
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2341
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2342
|
+
<span class="cstat-no" title="statement not covered" > // Emit events if session was found</span>
|
|
2343
|
+
<span class="cstat-no" title="statement not covered" > if (removed) {</span>
|
|
2344
|
+
<span class="cstat-no" title="statement not covered" > // Emit session deleted event</span>
|
|
2345
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.sessionDeleted.emit({</span>
|
|
2346
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2347
|
+
<span class="cstat-no" title="statement not covered" > sessionKey: removed.sessionKey,</span>
|
|
2348
|
+
<span class="cstat-no" title="statement not covered" > accounts: removed.data.accounts,</span>
|
|
2349
|
+
<span class="cstat-no" title="statement not covered" > metadata: { topic, reason: 'wallet_initiated' },</span>
|
|
2350
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2351
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2352
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2353
|
+
<span class="cstat-no" title="statement not covered" > // Emit disconnection event</span>
|
|
2354
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.disconnected.emit({</span>
|
|
2355
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2356
|
+
<span class="cstat-no" title="statement not covered" > providerType: 'walletconnect-v2',</span>
|
|
2357
|
+
<span class="cstat-no" title="statement not covered" > sessionKey: removed.sessionKey,</span>
|
|
2358
|
+
<span class="cstat-no" title="statement not covered" > reason: 'wallet_initiated_disconnect',</span>
|
|
2359
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2360
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2361
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2362
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2363
|
+
|
|
2364
|
+
/**
|
|
2365
|
+
* Register session_delete event listener to handle wallet-initiated disconnects.
|
|
2366
|
+
* Idempotent - only registers once even if called multiple times.
|
|
2367
|
+
*
|
|
2368
|
+
* @private
|
|
2369
|
+
*/
|
|
2370
|
+
private registerSessionDeleteListener(): void {
|
|
2371
|
+
if (!this.clientManager.isInitialized() || this.sessionDeleteListenerRegistered) {
|
|
2372
|
+
return;
|
|
2373
|
+
}
|
|
2374
|
+
|
|
2375
|
+
// ✅ CRITICAL: Run inside NgZone to trigger Angular's change detection
|
|
2376
|
+
// WalletConnect events arrive outside Angular's zone
|
|
2377
|
+
this.clientManager.on('session_delete', (event: any) => {
|
|
2378
|
+
<span class="cstat-no" title="statement not covered" > this.zone.run(() => {</span>
|
|
2379
|
+
<span class="cstat-no" title="statement not covered" > logger.info('� Session deleted by wallet (session_delete event)', {</span>
|
|
2380
|
+
<span class="cstat-no" title="statement not covered" > topic: (event as { topic: string }).topic,</span>
|
|
2381
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2382
|
+
<span class="cstat-no" title="statement not covered" > this.removeSessionByTopic((event as { topic: string }).topic);</span>
|
|
2383
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2384
|
+
});
|
|
2385
|
+
|
|
2386
|
+
this.sessionDeleteListenerRegistered = true;
|
|
2387
|
+
logger.debug('session_delete listener registered');
|
|
2388
|
+
}
|
|
2389
|
+
|
|
2390
|
+
/**
|
|
2391
|
+
* Disconnect from WalletConnect sessions.
|
|
2392
|
+
* Supports disconnecting all sessions or a specific session.
|
|
2393
|
+
*
|
|
2394
|
+
* @param sessionKey - Optional session key to disconnect specific session
|
|
2395
|
+
*/
|
|
2396
|
+
async disconnect(sessionKey?: string): Promise<void> {
|
|
2397
|
+
if (!this.clientManager.isInitialized()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2398
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('No client to disconnect');</span>
|
|
2399
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2400
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2401
|
+
|
|
2402
|
+
if (sessionKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2403
|
+
<span class="cstat-no" title="statement not covered" > // Disconnect specific session</span>
|
|
2404
|
+
<span class="cstat-no" title="statement not covered" > const sessionData = this.sessionStore.getSession(sessionKey);</span>
|
|
2405
|
+
<span class="cstat-no" title="statement not covered" > if (sessionData) {</span>
|
|
2406
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2407
|
+
<span class="cstat-no" title="statement not covered" > await this.clientManager.disconnect(sessionData.session.topic, {</span>
|
|
2408
|
+
<span class="cstat-no" title="statement not covered" > code: 6000,</span>
|
|
2409
|
+
<span class="cstat-no" title="statement not covered" > message: 'User disconnected session',</span>
|
|
2410
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2411
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Disconnected session', { sessionKey });</span>
|
|
2412
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
2413
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Disconnect error for session', {</span>
|
|
2414
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2415
|
+
<span class="cstat-no" title="statement not covered" > error: e instanceof Error ? e.message : String(e),</span>
|
|
2416
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2417
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2418
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2419
|
+
<span class="cstat-no" title="statement not covered" > // Clean up stored network selection</span>
|
|
2420
|
+
<span class="cstat-no" title="statement not covered" > this.clearUserNetworkSelection(sessionData.session.topic);</span>
|
|
2421
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2422
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.deleteSession(sessionKey);</span>
|
|
2423
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
2424
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2425
|
+
<span class="cstat-no" title="statement not covered" > if (this.sessionStore.size === 0) {</span>
|
|
2426
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('disconnected');</span>
|
|
2427
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2428
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2429
|
+
} else {
|
|
2430
|
+
// Disconnect all sessions
|
|
2431
|
+
const disconnectPromises: Promise<void>[] = [];
|
|
2432
|
+
|
|
2433
|
+
for (const [_key, sessionData] of this.sessionStore.entries()) {
|
|
2434
|
+
// Clean up stored network selection for each session
|
|
2435
|
+
this.clearUserNetworkSelection(sessionData.session.topic);
|
|
2436
|
+
|
|
2437
|
+
disconnectPromises.push(
|
|
2438
|
+
this.clientManager
|
|
2439
|
+
.disconnect(sessionData.session.topic, {
|
|
2440
|
+
code: 6000,
|
|
2441
|
+
message: 'User disconnected all sessions',
|
|
2442
|
+
})
|
|
2443
|
+
.catch((err: Error) =>
|
|
2444
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Disconnect error', {</span>
|
|
2445
|
+
<span class="cstat-no" title="statement not covered" > error: err.message,</span>
|
|
2446
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2447
|
+
),
|
|
2448
|
+
);
|
|
2449
|
+
}
|
|
2450
|
+
|
|
2451
|
+
await Promise.all(disconnectPromises);
|
|
2452
|
+
|
|
2453
|
+
this.sessionStore.clear();
|
|
2454
|
+
this._status.set('disconnected');
|
|
2455
|
+
|
|
2456
|
+
logger.info('Disconnected all sessions');
|
|
2457
|
+
}
|
|
2458
|
+
|
|
2459
|
+
this.clientManager.closeModal();
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
// NOTE: findSessionForAccount and validateSessionInSdk moved to WalletConnectSigningOrchestrator
|
|
2463
|
+
|
|
2464
|
+
/**
|
|
2465
|
+
* Sign a transaction without submitting (delegates to SigningOrchestrator).
|
|
2466
|
+
* @param options
|
|
2467
|
+
*/
|
|
2468
|
+
async signTransaction(options: SignTransactionOptions): Promise<SignResult> {
|
|
2469
|
+
if (!this.clientManager.isInitialized()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2470
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2471
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2472
|
+
return this.signingOrchestrator.signTransaction(options);
|
|
2473
|
+
}
|
|
2474
|
+
|
|
2475
|
+
/**
|
|
2476
|
+
* Sign and submit a transaction (delegates to SigningOrchestrator).
|
|
2477
|
+
* @param options
|
|
2478
|
+
*/
|
|
2479
|
+
async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {
|
|
2480
|
+
if (!this.clientManager.isInitialized()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2481
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2482
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2483
|
+
return this.signingOrchestrator.submitTransaction(options);
|
|
2484
|
+
}
|
|
2485
|
+
|
|
2486
|
+
/**
|
|
2487
|
+
* Sign and execute transaction in one call (delegates to SigningOrchestrator).
|
|
2488
|
+
* @param options
|
|
2489
|
+
*/
|
|
2490
|
+
<span class="fstat-no" title="function not covered" > async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {</span>
|
|
2491
|
+
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2492
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2493
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2494
|
+
<span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signAndExecuteTransaction(options);</span>
|
|
2495
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2496
|
+
|
|
2497
|
+
/**
|
|
2498
|
+
* Sign an arbitrary message (delegates to SigningOrchestrator).
|
|
2499
|
+
* @param options
|
|
2500
|
+
*/
|
|
2501
|
+
<span class="fstat-no" title="function not covered" > async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {</span>
|
|
2502
|
+
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2503
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2504
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2505
|
+
<span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signMessage(options);</span>
|
|
2506
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2507
|
+
|
|
2508
|
+
/**
|
|
2509
|
+
* Check if WalletConnect is available.
|
|
2510
|
+
* Always returns true as WalletConnect is browser-based.
|
|
2511
|
+
*/
|
|
2512
|
+
<span class="fstat-no" title="function not covered" > async isAvailable(): Promise<boolean> {</span>
|
|
2513
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
2514
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2515
|
+
|
|
2516
|
+
/**
|
|
2517
|
+
* Get all active WalletConnect sessions.
|
|
2518
|
+
* Useful for displaying session information in UI and managing multiple connections.
|
|
2519
|
+
* Delegates to session store.
|
|
2520
|
+
*
|
|
2521
|
+
* @returns Array of session information objects
|
|
2522
|
+
*/
|
|
2523
|
+
<span class="fstat-no" title="function not covered" > getActiveSessions(): Array<{</span>
|
|
2524
|
+
<span class="cstat-no" title="statement not covered" > sessionKey: string;</span>
|
|
2525
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
|
|
2526
|
+
<span class="cstat-no" title="statement not covered" > networkId: string;</span>
|
|
2527
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: string;</span>
|
|
2528
|
+
<span class="cstat-no" title="statement not covered" > accounts: UnifiedAccount[];</span>
|
|
2529
|
+
<span class="cstat-no" title="statement not covered" > topic: string;</span>
|
|
2530
|
+
<span class="cstat-no" title="statement not covered" > }> {</span>
|
|
2531
|
+
<span class="cstat-no" title="statement not covered" > return this.sessionStore.getActiveSessions();</span>
|
|
2532
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2533
|
+
|
|
2534
|
+
/**
|
|
2535
|
+
* Disconnect a specific session by session key.
|
|
2536
|
+
* Public wrapper for the private disconnect method.
|
|
2537
|
+
*
|
|
2538
|
+
* @param sessionKey - The session key to disconnect
|
|
2539
|
+
*/
|
|
2540
|
+
<span class="fstat-no" title="function not covered" > async disconnectSession(sessionKey: string): Promise<void> {</span>
|
|
2541
|
+
<span class="cstat-no" title="statement not covered" > await this.disconnect(sessionKey);</span>
|
|
2542
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2543
|
+
}
|
|
2544
|
+
</pre></td></tr></table></pre>
|
|
2545
|
+
|
|
2546
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2547
|
+
</div><!-- /wrapper -->
|
|
2548
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2549
|
+
Code coverage generated by
|
|
2550
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2551
|
+
at 2026-06-02T14:30:38.257Z
|
|
2552
|
+
</div>
|
|
2553
|
+
<script src="../../../../prettify.js"></script>
|
|
2554
|
+
<script>
|
|
2555
|
+
window.onload = function () {
|
|
2556
|
+
prettyPrint();
|
|
2557
|
+
};
|
|
2558
|
+
</script>
|
|
2559
|
+
<script src="../../../../sorter.js"></script>
|
|
2560
|
+
<script src="../../../../block-navigation.js"></script>
|
|
2561
|
+
</body>
|
|
2562
|
+
</html>
|
|
2563
|
+
|