diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..12b7a933 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,52 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release +.eslintcache + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +# flow-typed +flow-typed/npm/* +!flow-typed/npm/module_vx.x.x.js + +# App packaged +release +app/main.prod.js +app/main.prod.js.map +app/renderer.prod.js +app/renderer.prod.js.map +app/style.css +app/style.css.map +dist +dll +main.js +main.js.map + +.idea +npm-debug.log.* +.*.dockerfile \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..4a7ea303 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..f59d2f06 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,56 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release +.eslintcache + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +# flow-typed +flow-typed/npm/* +!flow-typed/npm/module_vx.x.x.js + +# App packaged +release +app/main.prod.js +app/main.prod.js.map +app/renderer.prod.js +app/renderer.prod.js.map +app/style.css +app/style.css.map +dist +dll +main.js +main.js.map + +.idea +npm-debug.log.* +__snapshots__ + +# Package.json +package.json +.travis.yml diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..2ad67fb6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + extends: 'erb', + settings: { + 'import/resolver': { + webpack: { + config: require.resolve('./configs/webpack.config.eslint.js') + } + } + } +} diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 00000000..3c2a132f --- /dev/null +++ b/.flowconfig @@ -0,0 +1,26 @@ +[ignore] +/app/main.prod.js +/app/main.prod.js.map +/app/dist/.* +/resources/.* +/node_modules/webpack-cli +/release/.* +/dll/.* +/release/.* +/git/.* + +[include] + +[libs] + +[options] +esproposal.class_static_fields=enable +esproposal.class_instance_fields=enable +esproposal.export_star_as=enable +module.name_mapper.extension='css' -> '/internals/flow/CSSModule.js.flow' +module.name_mapper.extension='styl' -> '/internals/flow/CSSModule.js.flow' +module.name_mapper.extension='scss' -> '/internals/flow/CSSModule.js.flow' +module.name_mapper.extension='png' -> '/internals/flow/WebpackAsset.js.flow' +module.name_mapper.extension='jpg' -> '/internals/flow/WebpackAsset.js.flow' +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..9283fca2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +* text eol=lf +*.png binary +*.jpg binary +*.jpeg binary +*.ico binary +*.icns binary diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..98a95d07 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,4 @@ + diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 00000000..3708b464 --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,6 @@ +requiredHeaders: + - Prerequisites + - Expected Behavior + - Current Behavior + - Possible Solution + - Your Environment diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 00000000..96032601 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pr + - discussion + - e2e + - enhancement +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml new file mode 100644 index 00000000..7b1ad1a9 --- /dev/null +++ b/.github/workflows/electron.yml @@ -0,0 +1,150 @@ +name: Electron CD + +on: + push: + branches: + - release + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-16.04, macos-latest, windows-latest] + + steps: + - name: Context + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + run: echo "$GITHUB_CONTEXT" + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - uses: actions-rs/toolchain@v1 + with: + toolchain: 1.41.0 + override: true + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + - name: yarn install + run: | + yarn install + - name: Build and Package@Linux + if: contains(matrix.os, 'ubuntu') + run: | + yarn package-linux + - name: Mac Certificate-Gen + if: contains(matrix.os, 'macos') + env: + p12base64: ${{ secrets.p12cert }} + run: | + echo "$p12base64" | openssl base64 -d -out cert.p12 + - name: Mac Certificate-Install + if: contains(matrix.os, 'macos') + uses: apple-actions/import-codesign-certs@v1 + with: + p12-filepath: 'cert.p12' + p12-password: ${{ secrets.p12certpassword }} + - name: Build and Package@Mac + if: contains(matrix.os, 'macos') + env: + appleId: ${{ secrets.appleId }} + appleIdPassword: ${{ secrets.appleIdPassword }} + run: | + yarn package-mac + - name: Build and Package@Win + if: contains(matrix.os, 'windows') + run: | + yarn package-win + - name: Version@Linux@Mac + if: contains(matrix.os, 'ubuntu') || contains(matrix.os, 'macos') + run: | + ./bin/printversion.sh + - name: Version@Win + if: contains(matrix.os, 'windows') + run: | + ./bin/printversion.ps1 + - name: Upload artifacts-deb + uses: actions/upload-artifact@v1 + if: contains(matrix.os, 'ubuntu') + with: + name: ${{ matrix.os }} + path: release/Zecwallet_Lite_${{ env.VERSION }}_amd64.deb + - name: Upload artifacts-AppImage + uses: actions/upload-artifact@v1 + if: contains(matrix.os, 'ubuntu') + with: + name: ${{ matrix.os }} + path: release/Zecwallet Lite-${{ env.VERSION }}.AppImage + - name: Upload artifacts-dmg + uses: actions/upload-artifact@v1 + if: contains(matrix.os, 'macos') + with: + name: ${{ matrix.os }} + path: release/Zecwallet Lite-${{ env.VERSION }}.dmg + - name: Upload artifacts-zip + uses: actions/upload-artifact@v1 + if: contains(matrix.os, 'windows') + with: + name: ${{ matrix.os }} + path: release/Zecwallet Lite-${{ env.VERSION }}-win.zip + - name: Upload artifacts-msi + uses: actions/upload-artifact@v1 + if: contains(matrix.os, 'windows') + with: + name: ${{ matrix.os }} + path: release/Zecwallet Lite ${{ env.VERSION }}.msi + + job_signbinaries: + name: Consolidate and sign binaries + needs: build + runs-on: ubuntu-latest + steps: + - name: Context + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + run: echo "$GITHUB_CONTEXT" + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Version + run: | + ./bin/printversion.sh + - name: Download ubuntu + uses: actions/download-artifact@v1 + with: + name: ubuntu-16.04 + - name: Download windows + uses: actions/download-artifact@v1 + with: + name: windows-latest + - name: Download MacOS + uses: actions/download-artifact@v1 + with: + name: macos-latest + - name: Get gpg key + env: + gpgbase64: ${{ secrets.gpgkey }} + run: | + echo "$gpgbase64" | openssl base64 -d -out gpg.key + - name: Import gpg key + run: | + gpg --allow-secret-key-import --import gpg.key + mkdir release + cp windows-latest/* release/ + cp ubuntu-16.04/* release/ + cp macos-latest/* release/ + - name: Sign binaries + env: + APP_VERSION: ${{ env.VERSION }} + run: | + bin/signbinaries.sh + tar -cf artifacts.tar.gz release/signatures*.zip release/Zecwallet* + - name: Upload final artifacts + uses: actions/upload-artifact@v1 + with: + name: artifacts + path: artifacts.tar.gz diff --git a/.gitignore b/.gitignore index 273106ca..8671a0cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,42 +1,55 @@ -bin/ -debug/ -release/ -x64/ -artifacts/ -docs/website/public -.vscode/ -res/libsodium.a -res/libsodium/libsodium* -res/libsodium.a -src/ui_*.h -*.autosave -src/precompiled.h.cpp -.qmake.stash -zecwallet -Zecwallet-Lite.app -zecwallet-lite-mingw* -zecwallet-lite.vcxproj* -zecwallet.vcxproj* -zecwallet-lite.sln -zecwallet-lite.pro.user -/Makefile -/Makefile.* -qrc_application.cpp -zec-qt-wallet_plugin_import.cpp -zecwallet_plugin_import.cpp -zec-qt-wallet_resource* -zecwallet_resource* -workspace.code-workspace -*.zip -*.tar.gz -*.xcsettings +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release +.eslintcache + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX .DS_Store -*.mak + +# flow-typed +flow-typed/npm/* +!flow-typed/npm/module_vx.x.x.js + +# App packaged +release +app/main.prod.js +app/main.prod.js.map +app/renderer.prod.js +app/renderer.prod.js.map +app/style.css +app/style.css.map +dist +dll +main.js +main.js.map + +.idea +npm-debug.log.* + zcashd -IDEWorkspaceChecks.plist -*.sln -node_modules -zec-qt-wallet.pro.user.4.10-pre1 -zecwallet-lite -zecwallet-lite_plugin_import.cpp -zecwallet-lite_resource.rc + +native/artifacts.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..70abfb0e --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,12 @@ +{ + "overrides": [ + { + "files": [".prettierrc", ".babelrc", ".eslintrc", ".stylelintrc"], + "options": { + "parser": "json" + } + } + ], + "singleQuote": true, + "printWidth": 120 +} diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 00000000..2e8ff586 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,3 @@ +{ + "extends": ["stylelint-config-standard", "stylelint-config-prettier"] +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1f2853db..00000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -matrix: - include: - # works on Precise and Trusty - - os: linux - compiler: clang - addons: - apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] - packages: ['clang-3.7', 'g++-8'] - -before_install: - - sudo add-apt-repository ppa:beineri/opt-qt591-xenial -y - - sudo apt-get update -qq - - sudo apt-get install qt59base qt59websockets libgl1-mesa-dev - - source /opt/qt59/bin/qt59-env.sh - -script: - - qmake -v - - clang++ -v - - g++-8 -v - - qmake zec-qt-wallet.pro CONFIG+=release -spec linux-clang - - make CC=clang CXX=clang++ -j2 - - make distclean - - qmake zec-qt-wallet.pro CONFIG+=release -spec linux-g++ - - res/libsodium/buildlibsodium.sh - - make CC=gcc-8 CXX=g++-8 -j2 - diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..d90d676a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "dzannotti.vscode-babel-coloring", + "EditorConfig.EditorConfig", + "flowtype.flow-for-vscode" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..1fae53cc --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Electron: Renderer", + "type": "chrome", + "request": "attach", + "port": 9223, + "webRoot": "${workspaceFolder}", + "timeout": 150000 + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..dc9231f5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "files.associations": { + ".babelrc": "jsonc", + ".eslintrc": "jsonc", + ".prettierrc": "jsonc", + + ".stylelintrc": "json", + + ".dockerignore": "ignore", + ".eslintignore": "ignore", + ".flowconfig": "ignore" + }, + + "javascript.validate.enable": false, + "javascript.format.enable": false, + "typescript.validate.enable": false, + "typescript.format.enable": false, + + "flow.useNPMPackagedFlow": true, + "search.exclude": { + ".git": true, + ".eslintcache": true, + "app/dist": true, + "app/main.prod.js": true, + "app/main.prod.js.map": true, + "bower_components": true, + "dll": true, + "flow-typed": true, + "release": true, + "node_modules": true, + "npm-debug.log.*": true, + "test/**/__snapshots__": true, + "yarn.lock": true + }, + "workbench.colorCustomizations": { + "activityBar.background": "#49212F", + "titleBar.activeBackground": "#662E42", + "titleBar.activeForeground": "#FCF8FA" + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..f889d290 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "dev", + "group": { "kind": "build", "isDefault": true }, + "problemMatcher": [] + }, + { + "type": "npm", + "label": "Start Webpack Dev", + "script": "start-renderer-dev", + "options": { + "cwd": "${workspaceFolder}" + }, + "isBackground": true, + "problemMatcher": { + "owner": "custom", + "pattern": { + "regexp": "____________" + }, + "background": { + "activeOnStart": true, + "beginsPattern": "Compiling\\.\\.\\.$", + "endsPattern": "(Compiled successfully|Failed to compile)\\.$" + } + } + } + ] +} diff --git a/LICENSE b/LICENSE index def1a058..a1fca9c6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,22 @@ -Copyright 2018 adityapk +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2018-present Zecwallet -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/afterSignHook.js b/afterSignHook.js new file mode 100644 index 00000000..e9f0d261 --- /dev/null +++ b/afterSignHook.js @@ -0,0 +1,35 @@ +/* eslint-disable camelcase */ +const fs = require('fs'); +const electron_notarize = require('electron-notarize'); + +module.exports = async function(params) { + // Only notarize the app on Mac OS only. + if (process.platform !== 'darwin') { + return; + } + // console.log('afterSign hook triggered', params); + + // Same appId in electron-builder. + const appId = 'co.zecwallet.lite'; + + const appPath = params.artifactPaths.find(p => p.endsWith('.dmg')); + + if (!fs.existsSync(appPath)) { + throw new Error(`Cannot find application at: ${appPath}`); + } + + console.log(`Notarizing ${appId} found at ${appPath}`); + + try { + await electron_notarize.notarize({ + appBundleId: appId, + appPath, + appleId: process.env.appleId, + appleIdPassword: process.env.appleIdPassword + }); + } catch (error) { + console.error(error); + } + + console.log(`Done notarizing ${appId}`); +}; diff --git a/app/.testcafe-electron-rc b/app/.testcafe-electron-rc new file mode 100644 index 00000000..708ef19a --- /dev/null +++ b/app/.testcafe-electron-rc @@ -0,0 +1,4 @@ +{ + "mainWindowUrl": "./app.html", + "appPath": "." +} diff --git a/app/Routes.js b/app/Routes.js new file mode 100644 index 00000000..f0cd2971 --- /dev/null +++ b/app/Routes.js @@ -0,0 +1,548 @@ +/* eslint-disable react/jsx-props-no-spreading */ +/* eslint-disable max-classes-per-file */ +/* eslint-disable react/prop-types */ +/* eslint-disable react/no-unused-state */ +import React from 'react'; +import ReactModal from 'react-modal'; +import { Switch, Route } from 'react-router'; +import native from '../native/index.node'; +import { ErrorModal, ErrorModalData } from './components/ErrorModal'; +import cstyles from './components/Common.css'; +import routes from './constants/routes.json'; +import App from './containers/App'; +import Dashboard from './components/Dashboard'; +import Send from './components/Send'; +import Receive from './components/Receive'; +import LoadingScreen from './components/LoadingScreen'; +import AppState, { + AddressBalance, + TotalBalance, + Transaction, + SendPageState, + ToAddr, + RPCConfig, + Info, + ReceivePageState, + AddressBookEntry, + PasswordState +} from './components/AppState'; +import RPC from './rpc'; +import Utils from './utils/utils'; +import Zcashd from './components/Zcashd'; +import AddressBook from './components/Addressbook'; +import AddressbookImpl from './utils/AddressbookImpl'; +import Sidebar from './components/Sidebar'; +import Transactions from './components/Transactions'; +import PasswordModal from './components/PasswordModal'; +import CompanionAppListener from './companion'; +import WormholeConnection from './components/WormholeConnection'; + +type Props = {}; + +export default class RouteApp extends React.Component { + rpc: RPC; + + companionAppListener: CompanionAppListener; + + constructor(props) { + super(props); + + this.state = { + totalBalance: new TotalBalance(), + addressesWithBalance: [], + addressPrivateKeys: {}, + addresses: [], + addressBook: [], + transactions: null, + sendPageState: new SendPageState(), + receivePageState: new ReceivePageState(), + rpcConfig: new RPCConfig(), + info: new Info(), + rescanning: false, + location: null, + errorModalData: new ErrorModalData(), + passwordState: new PasswordState(), + connectedCompanionApp: null + }; + + // Create the initial ToAddr box + // eslint-disable-next-line react/destructuring-assignment + this.state.sendPageState.toaddrs = [new ToAddr(Utils.getNextToAddrID())]; + + // Set the Modal's app element + ReactModal.setAppElement('#root'); + + console.log(native.litelib_wallet_exists('main')); + } + + componentDidMount() { + if (!this.rpc) { + this.rpc = new RPC( + this.setTotalBalance, + this.setAddressesWithBalances, + this.setTransactionList, + this.setAllAddresses, + this.setInfo, + this.setZecPrice + ); + } + + // Read the address book + (async () => { + const addressBook = await AddressbookImpl.readAddressBook(); + if (addressBook) { + this.setState({ addressBook }); + } + })(); + + // Setup the websocket for the companion app + this.companionAppListener = new CompanionAppListener( + this.getFullState, + this.sendTransaction, + this.updateConnectedCompanionApp + ); + this.companionAppListener.setUp(); + } + + componentWillUnmount() {} + + getFullState = (): AppState => { + return this.state; + }; + + openErrorModal = (title: string, body: string) => { + const errorModalData = new ErrorModalData(); + errorModalData.modalIsOpen = true; + errorModalData.title = title; + errorModalData.body = body; + + this.setState({ errorModalData }); + }; + + closeErrorModal = () => { + const errorModalData = new ErrorModalData(); + errorModalData.modalIsOpen = false; + + this.setState({ errorModalData }); + }; + + openPassword = ( + confirmNeeded: boolean, + passwordCallback: string => void, + closeCallback: () => void, + helpText: string + ) => { + const passwordState = new PasswordState(); + + passwordState.showPassword = true; + passwordState.confirmNeeded = confirmNeeded; + passwordState.helpText = helpText; + + // Set the callbacks, but before calling them back, we close the modals + passwordState.passwordCallback = (password: string) => { + this.setState({ passwordState: new PasswordState() }); + + // Call the callback after a bit, so as to give time to the modal to close + setTimeout(() => passwordCallback(password), 10); + }; + passwordState.closeCallback = () => { + this.setState({ passwordState: new PasswordState() }); + + // Call the callback after a bit, so as to give time to the modal to close + setTimeout(() => closeCallback(), 10); + }; + + this.setState({ passwordState }); + }; + + // This will: + // 1. Check if the wallet is encrypted and locked + // 2. If it is, open the password dialog + // 3. Attempt to unlock wallet. + // a. If unlock suceeds, do the callback + // b. If the unlock fails, show an error + // 4. If wallet is not encrypted or already unlocked, just call the successcallback. + openPasswordAndUnlockIfNeeded = (successCallback: () => void) => { + // Check if it is locked + const { info } = this.state; + + if (info.encrypted && info.locked) { + this.openPassword( + false, + (password: string) => { + (async () => { + const success = await this.unlockWallet(password); + + if (success) { + // If the unlock succeeded, do the submit + successCallback(); + } else { + this.openErrorModal('Wallet unlock failed', 'Could not unlock the wallet with the password.'); + } + })(); + }, + // Close callback is a no-op + () => {} + ); + } else { + successCallback(); + } + }; + + unlockWallet = async (password: string): boolean => { + const success = await this.rpc.unlockWallet(password); + + return success; + }; + + lockWallet = async (): boolean => { + const success = await this.rpc.lockWallet(); + return success; + }; + + encryptWallet = async (password): boolean => { + const success = await this.rpc.encryptWallet(password); + return success; + }; + + decryptWallet = async (password): boolean => { + const success = await this.rpc.decryptWallet(password); + return success; + }; + + setInfo = (info: Info) => { + this.setState({ info }); + }; + + setTotalBalance = (totalBalance: TotalBalance) => { + this.setState({ totalBalance }); + }; + + setAddressesWithBalances = (addressesWithBalance: AddressBalance[]) => { + this.setState({ addressesWithBalance }); + + const { sendPageState } = this.state; + + // If there is no 'from' address, we'll set a default one + if (!sendPageState.fromaddr) { + // Find a z-address with the highest balance + const defaultAB = addressesWithBalance + .filter(ab => Utils.isSapling(ab.address)) + .reduce((prev, ab) => { + // We'll start with a sapling address + if (prev == null) { + return ab; + } + // Find the sapling address with the highest balance + if (prev.balance < ab.balance) { + return ab; + } + + return prev; + }, null); + + if (defaultAB) { + const newSendPageState = new SendPageState(); + newSendPageState.fromaddr = defaultAB.address; + newSendPageState.toaddrs = sendPageState.toaddrs; + + this.setState({ sendPageState: newSendPageState }); + } + } + }; + + setTransactionList = (transactions: Transaction[]) => { + this.setState({ transactions }); + }; + + setAllAddresses = (addresses: string[]) => { + this.setState({ addresses }); + }; + + setSendPageState = (sendPageState: SendPageState) => { + this.setState({ sendPageState }); + }; + + setSendTo = (address: string, amount: number | null, memo: string | null) => { + // Clear the existing send page state and set up the new one + const { sendPageState } = this.state; + + const newSendPageState = new SendPageState(); + newSendPageState.fromaddr = sendPageState.fromaddr; + + const to = new ToAddr(Utils.getNextToAddrID()); + if (address) { + to.to = address; + } + if (amount) { + to.amount = amount; + } + if (memo) { + to.memo = memo; + } + newSendPageState.toaddrs = [to]; + + this.setState({ sendPageState: newSendPageState }); + }; + + setRPCConfig = (rpcConfig: RPCConfig) => { + this.setState({ rpcConfig }); + console.log(rpcConfig); + this.rpc.configure(rpcConfig); + }; + + setZecPrice = (price: number | null) => { + console.log(`Price = ${price}`); + const { info } = this.state; + + const newInfo = new Info(); + Object.assign(newInfo, info); + newInfo.zecPrice = price; + + this.setState({ info: newInfo }); + }; + + setRescanning = (rescanning: boolean) => { + this.setState({ rescanning }); + }; + + setInfo = (newInfo: Info) => { + // If the price is not set in this object, copy it over from the current object + const { info } = this.state; + if (!newInfo.zecPrice) { + // eslint-disable-next-line no-param-reassign + newInfo.zecPrice = info.zecPrice; + } + + this.setState({ info: newInfo }); + }; + + sendTransaction = (sendJson: []): string => { + try { + const txid = this.rpc.sendTransaction(sendJson); + return txid; + } catch (err) { + console.log('route sendtx error', err); + } + }; + + // Get a single private key for this address, and return it as a string. + // Wallet needs to be unlocked + getPrivKeyAsString = (address: string): string => { + const pk = RPC.getPrivKeyAsString(address); + return pk; + }; + + // Getter methods, which are called by the components to update the state + fetchAndSetSinglePrivKey = async (address: string) => { + this.openPasswordAndUnlockIfNeeded(async () => { + const key = await RPC.getPrivKeyAsString(address); + const addressPrivateKeys = {}; + addressPrivateKeys[address] = key; + + this.setState({ addressPrivateKeys }); + }); + }; + + addAddressBookEntry = (label: string, address: string) => { + // Add an entry into the address book + const { addressBook } = this.state; + const newAddressBook = addressBook.concat(new AddressBookEntry(label, address)); + + // Write to disk. This method is async + AddressbookImpl.writeAddressBook(newAddressBook); + + this.setState({ addressBook: newAddressBook }); + }; + + removeAddressBookEntry = (label: string) => { + const { addressBook } = this.state; + const newAddressBook = addressBook.filter(i => i.label !== label); + + // Write to disk. This method is async + AddressbookImpl.writeAddressBook(newAddressBook); + + this.setState({ addressBook: newAddressBook }); + }; + + createNewAddress = async (zaddress: boolean) => { + // Create a new address + const newaddress = RPC.createNewAddress(zaddress); + console.log(`Created new Address ${newaddress}`); + + // And then fetch the list of addresses again to refresh (totalBalance gets all addresses) + this.rpc.fetchTotalBalance(); + + const { receivePageState } = this.state; + const newRerenderKey = receivePageState.rerenderKey + 1; + + const newReceivePageState = new ReceivePageState(); + newReceivePageState.newAddress = newaddress; + newReceivePageState.rerenderKey = newRerenderKey; + + this.setState({ receivePageState: newReceivePageState }); + }; + + updateConnectedCompanionApp = (connectedCompanionApp: ConnectedCompanionApp | null) => { + this.setState({ connectedCompanionApp }); + }; + + doRefresh = () => { + this.rpc.refresh(); + }; + + render() { + const { + totalBalance, + transactions, + addressesWithBalance, + addressPrivateKeys, + addresses, + addressBook, + sendPageState, + receivePageState, + rpcConfig, + info, + rescanning, + errorModalData, + passwordState, + connectedCompanionApp + } = this.state; + + const standardProps = { + openErrorModal: this.openErrorModal, + closeErrorModal: this.closeErrorModal, + setSendTo: this.setSendTo, + info, + openPasswordAndUnlockIfNeeded: this.openPasswordAndUnlockIfNeeded + }; + + return ( + + + + + +
+ {info && info.version && ( +
+ +
+ )} +
+ + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + + } + /> + + ( + + )} + /> + ( + + )} + /> + +
+
+
+ ); + } +} diff --git a/app/app.global.css b/app/app.global.css new file mode 100644 index 00000000..493c461d --- /dev/null +++ b/app/app.global.css @@ -0,0 +1,144 @@ +/* + * @NOTE: Prepend a `~` to css file paths that are in your node_modules + * See https://github.com/webpack-contrib/sass-loader#imports + */ +@import '~@fortawesome/fontawesome-free/css/all.css'; +@import '~typeface-roboto/index.css'; + +html { + overflow: hidden; +} + +body { + position: relative; + color: white; + height: 100vh; + background-color: #212124; + font-family: Roboto, Arial, Helvetica, Helvetica Neue, serif; +} + +::-webkit-scrollbar { + width: 0.5em; +} + +::-webkit-scrollbar-track { + box-shadow: inset 0 0 6px grey; + background-color: rgb(1, 1, 1); +} + +::-webkit-scrollbar-thumb { + background-color: white; + outline: 1px solid slategrey; +} + +h2 { + margin: 0; + font-size: 2.25rem; + font-weight: bold; + letter-spacing: -0.025em; + color: #fff; +} + +p { + font-size: 12px; +} + +li { + list-style: none; +} + +a { + color: white; + text-decoration: none; +} + +input[disabled] { + color: grey; +} + +.react-tabs { + -webkit-tap-highlight-color: transparent; +} + +.react-tabs__tab-list { + border-bottom: 1px solid #aaa; + margin: 0 0 10px; + padding: 0; +} + +.react-tabs__tab { + display: inline-block; + border: 1px solid transparent; + border-bottom: none; + bottom: -1px; + position: relative; + list-style: none; + padding: 6px 12px; + cursor: pointer; + font-size: 16px; +} + +.react-tabs__tab--selected { + background: #c3921f; + color: black; + border-radius: 5px 5px 0 0; +} + +.react-tabs__tab--disabled { + color: grey; + cursor: default; +} + +.react-tabs__tab:focus { + box-shadow: 0 0 5px hsl(208, 99%, 50%); + border-color: hsl(208, 99%, 50%); + outline: none; +} + +.react-tabs__tab:focus::after { + content: ''; + position: absolute; + height: 5px; + left: -4px; + right: -4px; + bottom: -5px; + background: #fff; +} + +.react-tabs__tab-panel { + display: none; +} + +.react-tabs__tab-panel--selected { + display: block; +} + +img, +img::after, +img::before { + -webkit-user-select: none; + -webkit-user-drag: none; + -webkit-app-region: no-drag; + cursor: default; +} + +a, +a::after, +a::before { + -webkit-user-select: none; + -webkit-user-drag: none; + -webkit-app-region: no-drag; + cursor: default; +} + +a:hover { + opacity: 0.8; + text-decoration: none; + cursor: pointer; +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} diff --git a/app/app.html b/app/app.html new file mode 100644 index 00000000..8cc9707d --- /dev/null +++ b/app/app.html @@ -0,0 +1,48 @@ + + + + + Zecwallet Lite + + + + + +
+ + + diff --git a/app/app.icns b/app/app.icns new file mode 100644 index 00000000..4f3cbbaf Binary files /dev/null and b/app/app.icns differ diff --git a/app/assets/img/arrow_up_dark.png b/app/assets/img/arrow_up_dark.png new file mode 100644 index 00000000..5286b3d7 Binary files /dev/null and b/app/assets/img/arrow_up_dark.png differ diff --git a/app/assets/img/arrow_up_light.png b/app/assets/img/arrow_up_light.png new file mode 100644 index 00000000..70dd3152 Binary files /dev/null and b/app/assets/img/arrow_up_light.png differ diff --git a/app/assets/img/logobig.gif b/app/assets/img/logobig.gif new file mode 100644 index 00000000..73a0cbe9 Binary files /dev/null and b/app/assets/img/logobig.gif differ diff --git a/app/assets/img/logobig.png b/app/assets/img/logobig.png new file mode 100644 index 00000000..0622e48b Binary files /dev/null and b/app/assets/img/logobig.png differ diff --git a/app/assets/img/zcashdlogo.gif b/app/assets/img/zcashdlogo.gif new file mode 100644 index 00000000..a2c3ce65 Binary files /dev/null and b/app/assets/img/zcashdlogo.gif differ diff --git a/app/companion.js b/app/companion.js new file mode 100644 index 00000000..aa28ae8b --- /dev/null +++ b/app/companion.js @@ -0,0 +1,499 @@ +/* eslint-disable flowtype/no-weak-types */ +/* eslint-disable max-classes-per-file */ +/* eslint-disable class-methods-use-this */ + +import _sodium from 'libsodium-wrappers-sumo'; +import Store from 'electron-store'; +import WebSocket from 'ws'; +import AppState, { ConnectedCompanionApp } from './components/AppState'; +import Utils from './utils/utils'; + +// Wormhole code is sha256(sha256(secret_key)) +function getWormholeCode(keyHex: string, sodium: any): string { + const key = sodium.from_hex(keyHex); + + const pass1 = sodium.crypto_hash_sha256(key); + const pass2 = sodium.to_hex(sodium.crypto_hash_sha256(pass1)); + + return pass2; +} + +// A class that connects to wormhole given a secret key +class WormholeClient { + keyHex: string; + + wormholeCode: string; + + sodium: any; + + wss: WebSocket = null; + + listner: CompanionAppListener = null; + + keepAliveTimerID: TimerID = null; + + constructor(keyHex: string, sodium: any, listner: CompanionAppListener) { + this.keyHex = keyHex; + this.sodium = sodium; + this.listner = listner; + + this.wormholeCode = getWormholeCode(keyHex, this.sodium); + + this.connect(); + } + + connect() { + this.wss = new WebSocket('wss://wormhole.zecqtwallet.com:443'); + + this.wss.on('open', () => { + // On open, register ourself + const reg = { register: getWormholeCode(this.keyHex, this.sodium) }; + + // No encryption for the register call + this.wss.send(JSON.stringify(reg)); + + // Now, do a ping every 4 minutes to keep the connection alive. + this.keepAliveTimerID = setInterval(() => { + const ping = { ping: 'ping' }; + this.wss.send(JSON.stringify(ping)); + }, 4 * 60 * 1000); + }); + + this.wss.on('message', data => { + this.listner.processIncoming(data, this.keyHex, this.wss); + }); + + this.wss.on('close', (code, reason) => { + console.log('Socket closed for ', this.keyHex, code, reason); + }); + + this.wss.on('error', (ws, err) => { + console.log('ws error', err); + }); + } + + getKeyHex(): string { + return this.keyHex; + } + + close() { + if (this.keepAliveTimerID) { + clearInterval(this.keepAliveTimerID); + } + + // Close the websocket. + if (this.wss) { + this.wss.close(); + } + } +} + +// The singleton Companion App listener, that can spawn a wormhole server +// or (multiple) wormhole clients +export default class CompanionAppListener { + sodium = null; + + fnGetState: () => AppState = null; + + fnSendTransaction: ([]) => string = null; + + fnUpdateConnectedClient: (string, number) => void = null; + + permWormholeClient: WormholeClient = null; + + tmpWormholeClient: WormholeClient = null; + + constructor( + fnGetSate: () => AppState, + fnSendTransaction: ([]) => string, + fnUpdateConnectedClient: (string, number) => void + ) { + this.fnGetState = fnGetSate; + this.fnSendTransaction = fnSendTransaction; + this.fnUpdateConnectedClient = fnUpdateConnectedClient; + } + + async setUp() { + await _sodium.ready; + this.sodium = _sodium; + + // Create a new wormhole listner + const permKeyHex = this.getEncKey(); + if (permKeyHex) { + this.permWormholeClient = new WormholeClient(permKeyHex, this.sodium, this); + } + + // At startup, set the last client name/time by loading it + const store = new Store(); + const name = store.get('companion/name'); + const lastSeen = store.get('companion/lastseen'); + + if (name && lastSeen) { + const o = new ConnectedCompanionApp(); + o.name = name; + o.lastSeen = lastSeen; + + this.fnUpdateConnectedClient(o); + } + } + + createTmpClient(keyHex: string) { + if (this.tmpWormholeClient) { + this.tmpWormholeClient.close(); + } + + this.tmpWormholeClient = new WormholeClient(keyHex, this.sodium, this); + } + + closeTmpClient() { + if (this.tmpWormholeClient) { + this.tmpWormholeClient.close(); + + this.tmpWormholeClient = null; + } + } + + replacePermClientWithTmp() { + if (this.permWormholeClient) { + this.permWormholeClient.close(); + } + + // Replace the stored code with the new one + this.permWormholeClient = this.tmpWormholeClient; + this.tmpWormholeClient = null; + this.setEncKey(this.permWormholeClient.getKeyHex()); + + // Reset local nonce + const store = new Store(); + store.delete('companion/localnonce'); + } + + processIncoming(data: string, keyHex: string, ws: Websocket) { + const dataJson = JSON.parse(data); + + // If the wormhole sends some messages, we ignore them + if ('error' in dataJson) { + console.log('Incoming data contains an error message', data); + return; + } + + // If the message is a ping, just ignore it + if ('ping' in dataJson) { + return; + } + + // Then, check if the message is encrpted + if (!('nonce' in dataJson)) { + const err = { error: 'Encryption error', to: getWormholeCode(keyHex, this.sodium) }; + ws.send(JSON.stringify(err)); + + return; + } + + let cmd; + + // If decryption passes and this is a tmp wormhole client, then set it as the permanant client + if (this.tmpWormholeClient && keyHex === this.tmpWormholeClient.getKeyHex()) { + const { decrypted, nonce } = this.decryptIncoming(data, keyHex, false); + if (!decrypted) { + console.log('Decryption failed'); + + const err = { error: 'Encryption error', to: getWormholeCode(keyHex, this.sodium) }; + ws.send(JSON.stringify(err)); + return; + } + cmd = JSON.parse(decrypted); + + // Replace the permanant client + this.replacePermClientWithTmp(); + + this.updateRemoteNonce(nonce); + } else { + const { decrypted, nonce } = this.decryptIncoming(data, keyHex, true); + if (!decrypted) { + const err = { error: 'Encryption error', to: getWormholeCode(keyHex, this.sodium) }; + ws.send(JSON.stringify(err)); + + console.log('Decryption failed'); + return; + } + + cmd = JSON.parse(decrypted); + + this.updateRemoteNonce(nonce); + } + + if (cmd.command === 'getInfo') { + const response = this.doGetInfo(cmd); + ws.send(this.encryptOutgoing(response, keyHex)); + } else if (cmd.command === 'getTransactions') { + const response = this.doGetTransactions(); + ws.send(this.encryptOutgoing(response, keyHex)); + } else if (cmd.command === 'sendTx') { + const response = this.doSendTransaction(cmd, ws); + ws.send(this.encryptOutgoing(response, keyHex)); + } + } + + // Generate a new secret key + genNewKeyHex(): string { + const keyHex = this.sodium.to_hex(this.sodium.crypto_secretbox_keygen()); + + return keyHex; + } + + getEncKey(): string { + // Get the nonce. Increment and store the nonce for next use + const store = new Store(); + const keyHex = store.get('companion/key'); + + return keyHex; + } + + setEncKey(keyHex: string) { + // Get the nonce. Increment and store the nonce for next use + const store = new Store(); + store.set('companion/key', keyHex); + } + + saveLastClientName(name: string) { + // Save the last client name + const store = new Store(); + store.set('companion/name', name); + + if (name) { + const now = Date.now(); + store.set('companion/lastseen', now); + + const o = new ConnectedCompanionApp(); + o.name = name; + o.lastSeen = now; + + this.fnUpdateConnectedClient(o); + } else { + this.fnUpdateConnectedClient(null); + } + } + + disconnectLastClient() { + // Remove the permanant connection + if (this.permWormholeClient) { + this.permWormholeClient.close(); + } + + this.saveLastClientName(null); + this.setEncKey(null); + } + + getRemoteNonce(): string { + const store = new Store(); + const nonceHex = store.get('companion/remotenonce'); + + return nonceHex; + } + + updateRemoteNonce(nonce: string) { + if (nonce) { + const store = new Store(); + store.set('companion/remotenonce', nonce); + } + } + + getLocalNonce(): string { + // Get the nonce. Increment and store the nonce for next use + const store = new Store(); + const nonceHex = store.get('companion/localnonce', `01${'00'.repeat(this.sodium.crypto_secretbox_NONCEBYTES - 1)}`); + + // Increment nonce + const newNonce = this.sodium.from_hex(nonceHex); + + this.sodium.increment(newNonce); + this.sodium.increment(newNonce); + store.set('companion/localnonce', this.sodium.to_hex(newNonce)); + + return nonceHex; + } + + encryptOutgoing(str: string, keyHex: string): string { + if (!keyHex) { + console.log('No secret key'); + throw Error('No Secret Key'); + } + + const nonceHex = this.getLocalNonce(); + + const nonce = this.sodium.from_hex(nonceHex); + const key = this.sodium.from_hex(keyHex); + + const encrypted = this.sodium.crypto_secretbox_easy(str, nonce, key); + const encryptedHex = this.sodium.to_hex(encrypted); + + const resp = { + nonce: this.sodium.to_hex(nonce), + payload: encryptedHex, + to: getWormholeCode(keyHex, this.sodium) + }; + + return JSON.stringify(resp); + } + + decryptIncoming(msg: string, keyHex: string, checkNonce: boolean): any { + const msgJson = JSON.parse(msg); + console.log('trying to decrypt', msgJson); + + if (!keyHex) { + console.log('No secret key'); + throw Error('No Secret Key'); + } + + const key = this.sodium.from_hex(keyHex); + const nonce = this.sodium.from_hex(msgJson.nonce); + + if (checkNonce) { + const prevNonce = this.sodium.from_hex(this.getRemoteNonce()); + if (prevNonce && this.sodium.compare(prevNonce, nonce) >= 0) { + return { decrypted: null }; + } + } + + const cipherText = this.sodium.from_hex(msgJson.payload); + + const decrypted = this.sodium.to_string(this.sodium.crypto_secretbox_open_easy(cipherText, nonce, key)); + + return { decrypted, nonce: msgJson.nonce }; + } + + doGetInfo(cmd: any): string { + const appState = this.fnGetState(); + + if (cmd && cmd.name) { + this.saveLastClientName(cmd.name); + } + + const saplingAddress = appState.addresses.find(a => Utils.isSapling(a)); + const tAddress = appState.addresses.find(a => Utils.isTransparent(a)); + const balance = parseFloat(appState.totalBalance.total); + const maxspendable = parseFloat(appState.totalBalance.total); + const maxzspendable = parseFloat(appState.totalBalance.private); + const tokenName = appState.info.currencyName; + const zecprice = parseFloat(appState.info.zecPrice); + + const resp = { + version: 1.0, + command: 'getInfo', + saplingAddress, + tAddress, + balance, + maxspendable, + maxzspendable, + tokenName, + zecprice, + serverversion: '0.9.2' + }; + + return JSON.stringify(resp); + } + + doGetTransactions(): string { + const appState = this.fnGetState(); + + let txlist = []; + if (appState.transactions) { + // Get only the last 20 txns + txlist = appState.transactions.slice(0, 20).map(t => { + let memo = t.detailedTxns && t.detailedTxns.length > 0 ? t.detailedTxns[0].memo : ''; + if (memo) { + memo = memo.trimRight(); + } else { + memo = ''; + } + + const txResp = { + type: t.type, + datetime: t.time, + amount: t.amount.toFixed(8), + txid: t.txid, + address: t.address, + memo, + confirmations: t.confirmations + }; + + return txResp; + }); + } + + const resp = { + version: 1.0, + command: 'getTransactions', + transactions: txlist + }; + + return JSON.stringify(resp); + } + + doSendTransaction(cmd: any, ws: WebSocket): string { + // "command":"sendTx","tx":{"amount":"0.00019927","to":"zs1pzr7ee53jwa3h3yvzdjf7meruujq84w5rsr5kuvye9qg552kdyz5cs5ywy5hxkxcfvy9wln94p6","memo":""}} + const inpTx = cmd.tx; + const appState = this.fnGetState(); + + // eslint-disable-next-line radix + const sendingAmount = parseInt((parseFloat(inpTx.amount) * 10 ** 8).toFixed(0)); + const buildError = (reason: string): string => { + const resp = { + errorCode: -1, + errorMessage: `Couldn't send Tx:${reason}` + }; + + // console.log('sendtx error', resp); + return JSON.stringify(resp); + }; + + // First, find an address that can send the correct amount. + const fromAddress = appState.addressesWithBalance.find(ab => ab.balance > sendingAmount); + if (!fromAddress) { + return buildError(`No address with sufficient balance to send ${sendingAmount}`); + } + + const memo = !inpTx.memo || inpTx.memo.trim() === '' ? null : inpTx.memo; + + // Build a sendJSON object + const sendJSON = []; + if (memo) { + sendJSON.push({ address: inpTx.to, amount: sendingAmount, memo }); + } else { + sendJSON.push({ address: inpTx.to, amount: sendingAmount }); + } + + console.log('sendjson is', sendJSON); + + let resp; + + try { + const txid = this.fnSendTransaction(sendJSON); + + // After the transaction is submitted, we return an intermediate success. + resp = { + version: 1.0, + command: 'sendTx', + result: 'success' + }; + ws.send(this.encryptOutgoing(JSON.stringify(resp))); + + // And then another one when the Tx was submitted successfully. For lightclient, this is the same, + // so we end up sending 2 responses back to back + resp = { + version: 1.0, + command: 'sendTxSubmitted', + txid + }; + } catch (err) { + resp = { + version: 1.0, + command: 'sendTxFailed', + err + }; + } + + return JSON.stringify(resp); + } +} diff --git a/app/components/Addressbook.css b/app/components/Addressbook.css new file mode 100644 index 00000000..b49943d8 --- /dev/null +++ b/app/components/Addressbook.css @@ -0,0 +1,38 @@ +.addressbookcontainer { + display: flex; + flex-direction: column; + margin-left: 16px; + margin-right: 16px; +} + +.addressbooklist { + margin-top: 24px; +} + +.addressbookentry { + padding-left: 8px; + padding-right: 8px; +} + +.addressbookentry:hover { + background-color: #000; + color: #c3921f; + cursor: pointer; + border: solid 1px grey; + padding: 8px; + margin-bottom: 8px; +} + +.addressbookentrybuttons { + display: flex; + justify-content: center; + margin-bottom: 8px; +} + +.addressbookentry .addressbookentrybuttons { + display: none; +} + +.addressbookentry:hover .addressbookentrybuttons { + display: flex; +} diff --git a/app/components/Addressbook.js b/app/components/Addressbook.js new file mode 100644 index 00000000..af7e49cc --- /dev/null +++ b/app/components/Addressbook.js @@ -0,0 +1,200 @@ +/* eslint-disable react/prop-types */ +import React, { Component } from 'react'; +import { withRouter } from 'react-router-dom'; +import { + AccordionItemButton, + AccordionItem, + AccordionItemHeading, + AccordionItemPanel, + Accordion +} from 'react-accessible-accordion'; +import styles from './Addressbook.css'; +import cstyles from './Common.css'; +import { AddressBookEntry } from './AppState'; +import ScrollPane from './ScrollPane'; +import Utils from '../utils/utils'; +import routes from '../constants/routes.json'; + +// Internal because we're using withRouter just below +const AddressBookItemInteral = ({ item, removeAddressBookEntry, setSendTo, history }) => { + return ( + + + +
+
{item.label}
+
{item.address}
+
+
+
+ +
+ + +
+
+
+ ); +}; +const AddressBookItem = withRouter(AddressBookItemInteral); + +type Props = { + addressBook: AddressBookEntry[], + addAddressBookEntry: (label: string, address: string) => void, + removeAddressBookEntry: (label: string) => void, + setSendTo: (address: string, amount: number | null, memo: string | null) => void +}; + +type State = { + currentLabel: string, + currentAddress: string, + addButtonEnabled: boolean +}; + +export default class AddressBook extends Component { + constructor(props) { + super(props); + + this.state = { currentLabel: '', currentAddress: '', addButtonEnabled: false }; + } + + updateLabel = (currentLabel: string) => { + // Don't update the field if it is longer than 20 chars + if (currentLabel.length > 20) return; + + const { currentAddress } = this.state; + this.setState({ currentLabel }); + + const { labelError, addressIsValid } = this.validate(currentLabel, currentAddress); + this.setAddButtonEnabled(!labelError && addressIsValid && currentLabel !== '' && currentAddress !== ''); + }; + + updateAddress = (currentAddress: string) => { + const { currentLabel } = this.state; + this.setState({ currentAddress }); + + const { labelError, addressIsValid } = this.validate(currentLabel, currentAddress); + + this.setAddButtonEnabled(!labelError && addressIsValid && currentLabel !== '' && currentAddress !== ''); + }; + + addButtonClicked = () => { + const { addAddressBookEntry } = this.props; + const { currentLabel, currentAddress } = this.state; + + addAddressBookEntry(currentLabel, currentAddress); + this.setState({ currentLabel: '', currentAddress: '' }); + }; + + setAddButtonEnabled = (addButtonEnabled: boolean) => { + this.setState({ addButtonEnabled }); + }; + + validate = (currentLabel, currentAddress) => { + const { addressBook } = this.props; + + let labelError = addressBook.find(i => i.label === currentLabel) ? 'Duplicate Label' : null; + labelError = currentLabel.length > 12 ? 'Label is too long' : labelError; + + const addressIsValid = + currentAddress === '' || Utils.isZaddr(currentAddress) || Utils.isTransparent(currentAddress); + + return { labelError, addressIsValid }; + }; + + render() { + const { addressBook, removeAddressBookEntry, setSendTo } = this.props; + const { currentLabel, currentAddress, addButtonEnabled } = this.state; + + const { labelError, addressIsValid } = this.validate(currentLabel, currentAddress); + + return ( +
+
Address Book
+ +
+
+
+
Label
+
+ {!labelError ? ( + + ) : ( + {labelError} + )} +
+
+ this.updateLabel(e.target.value)} + /> + +
+ +
+
Address
+
+ {addressIsValid ? ( + + ) : ( + Invalid Address + )} +
+
+ this.updateAddress(e.target.value)} + /> + +
+ + +
+ + +
+
+
Label
+
Address
+
+ {addressBook && ( + + {addressBook.map(item => ( + + ))} + + )} +
+
+
+
+ ); + } +} diff --git a/app/components/AppState.js b/app/components/AppState.js new file mode 100644 index 00000000..cd142cb5 --- /dev/null +++ b/app/components/AppState.js @@ -0,0 +1,209 @@ +/* eslint-disable max-classes-per-file */ + +export class TotalBalance { + // Total t address, confirmed and spendable + transparent: number; + + // Total private, confirmed + unconfirmed + private: number; + + // Total private, confirmed funds that are spendable + verifiedPrivate: number; + + // Total unconfirmed + spendable + total: number; +} + +export class AddressBalance { + address: string; + + balance: number; + + containsPending: boolean; + + constructor(address: string, balance: number) { + this.address = address; + this.balance = balance; + this.containsPending = false; + } +} + +export class AddressBookEntry { + label: string; + + address: string; + + constructor(label: string, address: string) { + this.label = label; + this.address = address; + } +} + +export class TxDetail { + address: string; + + amount: string; + + memo: string | null; +} + +// List of transactions. TODO: Handle memos, multiple addresses etc... +export class Transaction { + type: string; + + address: string; + + amount: number; + + confirmations: number; + + txid: string; + + time: number; + + detailedTxns: TxDetail[]; +} + +export class ToAddr { + id: number; + + to: string; + + amount: number; + + memo: string; + + constructor(id: number) { + this.id = id; + + this.to = ''; + this.amount = 0; + this.memo = ''; + } +} + +export class SendPageState { + fromaddr: string; + + toaddrs: ToAddr[]; + + constructor() { + this.fromaddr = ''; + this.toaddrs = []; + } +} + +export class ReceivePageState { + // A newly created address to show by default + newAddress: string; + + // The key used for the receive page component. + // Increment to force re-render + rerenderKey: number; + + constructor() { + this.newAddress = ''; + this.rerenderKey = 0; + } +} + +export class RPCConfig { + url: string; + + constructor() { + this.url = ''; + } +} + +export class Info { + testnet: boolean; + + latestBlock: number; + + connections: number; + + version: number; + + verificationProgress: number; + + currencyName: string; + + solps: number; + + zecPrice: number; + + encrypted: boolean; + + locked: boolean; +} + +export class PasswordState { + showPassword: boolean; + + confirmNeeded: boolean; + + passwordCallback: (password: string) => void; + + closeCallback: () => void; + + helpText: string | null; + + constructor() { + this.showPassword = false; + this.confirmNeeded = false; + this.passwordCallback = null; + this.closeCallback = null; + this.helpText = null; + } +} + +export class ConnectedCompanionApp { + name: string; + + lastSeen: number; +} + +// eslint-disable-next-line max-classes-per-file +export default class AppState { + // The total confirmed and unconfirmed balance in this wallet + totalBalance: TotalBalance; + + // The list of all t and z addresses that have a current balance. That is, the list of + // addresses that have a (confirmed or unconfirmed) UTXO or note pending. + addressesWithBalance: AddressBalance[]; + + // A map type that contains address -> privatekey mapping, for display on the receive page + // This mapping is ephemeral, and will disappear when the user navigates away. + addressPrivateKeys; + + // List of all addresses in the wallet, including change addresses and addresses + // that don't have any balance or are unused + addresses: string[]; + + // List of Address / Label pairs + addressBook: AddressBookEntry[]; + + // List of all T and Z transactions + transactions: Transaction[]; + + // The state of the send page, as the user constructs a transaction + sendPageState: SendPageState; + + // Any state for the receive page + receivePageState: ReceivePageState; + + // The Current configuration of the RPC params + rpcConfig: RPCConfig; + + // getinfo and getblockchaininfo result + info: Info; + + // Is the app rescanning? + rescanning: boolean; + + // Callbacks for the password dialog box + passwordState: PasswordState; + + // The last seen connected companion app + connectedCompanionApp: ConnectedCompanionApp; +} diff --git a/app/components/BalanceBlocks.js b/app/components/BalanceBlocks.js new file mode 100644 index 00000000..36215bf4 --- /dev/null +++ b/app/components/BalanceBlocks.js @@ -0,0 +1,39 @@ +import React from 'react'; +import cstyles from './Common.css'; +import Utils from '../utils/utils'; + +// eslint-disable-next-line react/prop-types +export const BalanceBlockHighlight = ({ zecValue, usdValue, topLabel, currencyName }) => { + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(zecValue); + + return ( +
+ {topLabel &&
{topLabel}
} +
+ + {currencyName} {bigPart} + + {smallPart} +
+
{usdValue}
+
+ ); +}; + +// eslint-disable-next-line react/prop-types +export const BalanceBlock = ({ zecValue, usdValue, topLabel, currencyName }) => { + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(zecValue); + + return ( +
+
{topLabel}
+
+ + {currencyName} {bigPart} + + {smallPart} +
+
{usdValue}
+
+ ); +}; diff --git a/app/components/Common.css b/app/components/Common.css new file mode 100644 index 00000000..3e9e5546 --- /dev/null +++ b/app/components/Common.css @@ -0,0 +1,216 @@ +.sidebarcontainer { + width: 220px; + float: left; +} + +.contentcontainer { + width: calc(100% - 220px); + float: right; +} + +.well { + background-color: #000; + padding: 16px; +} + +.verticalflex { + flex-direction: column; +} + +.flex { + display: flex; +} + +.flexspacebetween { + display: flex; + justify-content: space-between; +} + +.highlight { + color: #c3921f; +} + +.xlarge { + font-size: 32px; +} + +.large { + font-size: 18px; +} + +.normal { + font-size: 14px; +} + +.small { + font-size: 12px; +} + +.fixedfont { + font-family: monospace; +} + +.sublight { + color: #6a6a6a; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +.red { + color: red; +} + +.green { + color: green; +} + +.yellow { + color: yellow; +} + +.breakword { + word-break: break-all; +} + +.primarybutton { + background-color: #c3921f; + color: #000; + font-weight: bold; + font-size: 14px; + padding-top: 8px; + padding-bottom: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 4px; + border-color: #c3921f; + margin-left: 8px; + margin-right: 8px; +} + +.primarybutton:disabled, +.primarybutton[disabled] { + border: 1px solid #999; + background-color: #ccc; + color: #666; +} + +.primarybutton:hover { + cursor: pointer; +} + +.padtopsmall { + padding-top: 4px; +} + +.padbottomsmall { + padding-bottom: 4px; +} + +.marginbottomsmall { + margin-bottom: 4px; +} + +.margintopsmall { + margin-top: 4px; +} + +.margintoplarge { + margin-top: 24px; +} + +.marginleft { + margin-left: 16px; +} + +.marginbottomlarge { + margin-bottom: 24px; +} + +.padall { + padding: 16px; +} + +.padsmallall { + padding: 4px; +} + +.zecsmallpart { + padding-left: 2px; +} + +.blackbg { + background-color: #000; +} + +.maxwidth { + width: 100%; +} + +.inputbox { + width: calc(100% - 16px); + font-family: Roboto, Arial, Helvetica, Helvetica Neue, serif; + min-height: 38px; + max-height: 300px; + padding-left: 8px; + padding-right: 8px; + font-size: 16px; + border: none; + border-bottom: grey 1px solid; + background-color: #000; + color: white; +} + +.buttoncontainer { + text-align: center; + padding-top: 24px; +} + +.modal { + top: 25%; + left: 12.5%; + right: 12.5%; + bottom: auto; + opacity: 1; + transform: translate(-0%, -12.5%); + background: #212124; + position: absolute; + padding: 16px; + min-width: 700px; +} + +.modalOverlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(100, 100, 100, 0.5); +} + +.accordionHeader:hover { + cursor: pointer; +} + +.accordionHeader:focus { + outline: none; +} + +.tableheader { + margin: 8px; + border-bottom: solid 1px grey; +} + +.balancebox { + display: flex; + justify-content: space-between; +} + +.containermargin { + margin: 16px; +} diff --git a/app/components/Dashboard.css b/app/components/Dashboard.css new file mode 100644 index 00000000..d9bdd280 --- /dev/null +++ b/app/components/Dashboard.css @@ -0,0 +1,6 @@ +.addressbalancecontainer { + display: flex; + flex-direction: column; + margin-left: 16px; + margin-right: 16px; +} diff --git a/app/components/Dashboard.js b/app/components/Dashboard.js new file mode 100644 index 00000000..e888552d --- /dev/null +++ b/app/components/Dashboard.js @@ -0,0 +1,129 @@ +/* eslint-disable jsx-a11y/no-static-element-interactions */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +/* eslint-disable no-plusplus */ +/* eslint-disable react/prop-types */ +// @flow +import React, { Component } from 'react'; +import { + AccordionItemButton, + AccordionItem, + AccordionItemHeading, + AccordionItemPanel, + Accordion +} from 'react-accessible-accordion'; +import styles from './Dashboard.css'; +import cstyles from './Common.css'; +import { TotalBalance, Info, AddressBalance } from './AppState'; +import Utils from '../utils/utils'; +import ScrollPane from './ScrollPane'; +import { BalanceBlockHighlight, BalanceBlock } from './BalanceBlocks'; + +const AddressBalanceItem = ({ currencyName, zecPrice, item }) => { + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(Math.abs(item.balance)); + + return ( + + + +
+
+
{Utils.splitStringIntoChunks(item.address, 6).join(' ')}
+ {item.containsPending && ( +
+ Some transactions are pending. Balances may change. +
+ )} +
+
+
+ + {currencyName} {bigPart} + + {smallPart} +
+
+ {Utils.getZecToUsdString(zecPrice, Math.abs(item.balance))} +
+
+
+
+
+ +
+ ); +}; + +type Props = { + totalBalance: TotalBalance, + info: Info, + addressesWithBalance: AddressBalance[] +}; + +export default class Home extends Component { + render() { + const { totalBalance, info, addressesWithBalance } = this.props; + + const anyPending = addressesWithBalance && addressesWithBalance.find(i => i.containsPending); + + return ( +
+
+
+ + + +
+
+ {anyPending && ( +
+ Some transactions are pending. Balances may change. +
+ )} +
+
+ +
+ +
+
+
Address
+
Balance
+
+ {addressesWithBalance && + (addressesWithBalance.length === 0 ? ( +
No Addresses with a balance
+ ) : ( + + {addressesWithBalance + .filter(ab => ab.balance > 0) + .map(ab => ( + + ))} + + ))} +
+
+
+
+ ); + } +} diff --git a/app/components/ErrorModal.js b/app/components/ErrorModal.js new file mode 100644 index 00000000..bcb83260 --- /dev/null +++ b/app/components/ErrorModal.js @@ -0,0 +1,46 @@ +/* eslint-disable react/prop-types */ +import Modal from 'react-modal'; +import React from 'react'; +import cstyles from './Common.css'; + +export class ErrorModalData { + title: string; + + body: string; + + modalIsOpen: boolean; + + constructor() { + this.modalIsOpen = false; + } +} + +export const ErrorModal = ({ title, body, modalIsOpen, closeModal }) => { + return ( + +
+
+ {title} +
+ +
+ {body} +
+
+ +
+ +
+
+ ); +}; diff --git a/app/components/LoadingScreen.css b/app/components/LoadingScreen.css new file mode 100644 index 00000000..202750b8 --- /dev/null +++ b/app/components/LoadingScreen.css @@ -0,0 +1,10 @@ +.loadingcontainer { + margin-left: -220px; +} + +.newwalletcontainer { + flex-direction: column; + margin-left: 10%; + margin-right: 10%; + text-align: left; +} diff --git a/app/components/LoadingScreen.js b/app/components/LoadingScreen.js new file mode 100644 index 00000000..c9b2a20a --- /dev/null +++ b/app/components/LoadingScreen.js @@ -0,0 +1,368 @@ +/* eslint-disable radix */ +/* eslint-disable max-classes-per-file */ +import React, { Component } from 'react'; +import { Redirect, withRouter } from 'react-router'; +import { ipcRenderer } from 'electron'; +import TextareaAutosize from 'react-textarea-autosize'; +import native from '../../native/index.node'; +import routes from '../constants/routes.json'; +import { RPCConfig, Info } from './AppState'; +import RPC from '../rpc'; +import cstyles from './Common.css'; +import styles from './LoadingScreen.css'; +import Logo from '../assets/img/logobig.png'; + +type Props = { + setRPCConfig: (rpcConfig: RPCConfig) => void, + rescanning: boolean, + setRescanning: boolean => void, + setInfo: (info: Info) => void +}; + +class LoadingScreenState { + currentStatus: string; + + loadingDone: boolean; + + rpcConfig: RPCConfig | null; + + url: string; + + walletScreen: number; // 0 -> no wallet, load existing wallet 1 -> show option 2-> create new 3 -> restore existing + + newWalletError: null | string; // Any errors when creating/restoring wallet + + seed: string; // The new seed phrase for a newly created wallet or the seed phrase to restore from + + birthday: number; // Wallet birthday if we're restoring + + getinfoRetryCount: number; + + constructor() { + this.currentStatus = 'Loading...'; + this.loadingDone = false; + this.rpcConfig = null; + this.url = ''; + this.getinfoRetryCount = 0; + this.walletScreen = 0; + this.newWalletError = null; + this.seed = ''; + this.birthday = 0; + } +} + +class LoadingScreen extends Component { + constructor(props: Props) { + super(props); + + const state = new LoadingScreenState(); + state.url = 'https://lightwalletd.zecwallet.co:1443'; + this.state = state; + } + + componentDidMount() { + const { rescanning } = this.props; + + if (rescanning) { + this.runSyncStatusPoller(); + } else { + this.doFirstTimeSetup(); + } + } + + doFirstTimeSetup = async () => { + // Try to load the light client + const { url } = this.state; + + // First, set up the exit handler + this.setupExitHandler(); + + // Test to see if the wallet exists + if (!native.litelib_wallet_exists('main')) { + // Show the wallet creation screen + this.setState({ walletScreen: 1 }); + } else { + const result = native.litelib_initialize_existing(true, url); + console.log(`Intialization: ${result}`); + if (result !== 'OK') { + this.setState({ + currentStatus: ( + + Error Initializing Lightclient +
+ {result} +
+ ) + }); + + return; + } + + this.getInfo(); + } + }; + + setupExitHandler = () => { + // App is quitting, make sure to save the wallet properly. + ipcRenderer.on('appquitting', () => { + RPC.doSave(); + + // And reply that we're all done. + ipcRenderer.send('appquitdone'); + }); + }; + + getInfo() { + // Try getting the info. + try { + // Do a sync at start + this.setState({ currentStatus: 'Syncing...' }); + + // This will do the sync in another thread, so we have to check for sync status + RPC.doSync(); + + this.runSyncStatusPoller(); + } catch (err) { + // Not yet finished loading. So update the state, and setup the next refresh + this.setState({ currentStatus: err }); + } + } + + runSyncStatusPoller = () => { + const me = this; + + const { setRPCConfig, setInfo, setRescanning } = this.props; + const { url } = this.state; + + const info = RPC.getInfoObject(); + + // And after a while, check the sync status. + const poller = setInterval(() => { + const syncstatus = RPC.doSyncStatus(); + const ss = JSON.parse(syncstatus); + + if (ss.syncing === 'false') { + // First, save the wallet so we don't lose the just-synced data + RPC.doSave(); + + // Set the info object, so the sidebar will show + console.log(info); + setInfo(info); + + // This will cause a redirect to the dashboard + me.setState({ loadingDone: true }); + + setRescanning(false); + + // Configure the RPC, which will setup the refresh + const rpcConfig = new RPCConfig(); + rpcConfig.url = url; + setRPCConfig(rpcConfig); + + // And cancel the updater + clearInterval(poller); + } else { + // Still syncing, grab the status and update the status + const p = ss.synced_blocks; + const t = ss.total_blocks; + const currentStatus = `Syncing ${p} / ${t}`; + + me.setState({ currentStatus }); + } + }, 1000); + }; + + createNewWallet = () => { + const { url } = this.state; + const result = native.litelib_initialize_new(true, url); + + if (result.startsWith('Error')) { + this.setState({ newWalletError: result }); + } else { + const r = JSON.parse(result); + this.setState({ walletScreen: 2, seed: r.seed }); + } + }; + + startNewWallet = () => { + // Start using the new wallet + this.setState({ walletScreen: 0 }); + this.getInfo(); + }; + + restoreExistingWallet = () => { + this.setState({ walletScreen: 3 }); + }; + + updateSeed = e => { + this.setState({ seed: e.target.value }); + }; + + updateBirthday = e => { + this.setState({ birthday: e.target.value }); + }; + + restoreWalletBack = () => { + // Reset the seed and birthday and try again + this.setState({ seed: '', birthday: 0, newWalletError: null, walletScreen: 3 }); + }; + + doRestoreWallet = () => { + const { seed, birthday, url } = this.state; + console.log(`Restoring ${seed} with ${birthday}`); + + const result = native.litelib_initialize_new_from_phrase(false, url, seed, parseInt(birthday)); + if (result.startsWith('Error')) { + this.setState({ newWalletError: result }); + } else { + this.setState({ walletScreen: 0 }); + this.getInfo(); + } + }; + + render() { + const { loadingDone, currentStatus, walletScreen, newWalletError, seed, birthday } = this.state; + + // If still loading, show the status + if (!loadingDone) { + return ( +
+ {walletScreen === 0 && ( +
+
+ Logo +
+
{currentStatus}
+
+ )} + + {walletScreen === 1 && ( +
+
+ Logo +
+
+
+
Create A New Wallet
+
+ Creates a new wallet with a new randomly generated seed phrase. Please save the seed phrase + carefully, it’s the only way to restore your wallet. +
+
+ +
+
+
+
Restore Wallet From Seed
+
+ If you already have a seed phrase, you can restore it to this wallet. This will rescan the + blockchain for all transactions from the seed phrase. +
+
+ +
+
+
+
+ )} + + {walletScreen === 2 && ( +
+
+ Logo +
+
+
+ {newWalletError && ( +
+
Error Creating New Wallet
+
There was an error creating a new wallet
+
+
{newWalletError}
+
+
+ )} + + {!newWalletError && ( +
+
Your New Wallet
+
+ This is your new wallet. Below is your seed phrase. PLEASE STORE IT CAREFULLY! The seed phrase + is the only way to recover your funds and transactions. +
+
+
{seed}
+
+
+ +
+
+ )} +
+
+
+ )} + + {walletScreen === 3 && ( +
+
+ Logo +
+
+
+ {newWalletError && ( +
+
Error Restoring Wallet
+
There was an error restoring your seed phrase
+
+
{newWalletError}
+
+
+ +
+
+ )} + + {!newWalletError && ( +
+
Please enter your seed phrase
+ this.updateSeed(e)} /> + +
+ Wallet Birthday. If you don’t know this, it is OK to enter ‘0’ +
+ this.updateBirthday(e)} + /> + +
+ +
+
+ )} +
+
+
+ )} +
+ ); + } + + return ; + } +} + +export default withRouter(LoadingScreen); diff --git a/app/components/PasswordModal.js b/app/components/PasswordModal.js new file mode 100644 index 00000000..cd2e4442 --- /dev/null +++ b/app/components/PasswordModal.js @@ -0,0 +1,105 @@ +// @flow +import React, { PureComponent } from 'react'; +import Modal from 'react-modal'; +import cstyles from './Common.css'; + +type Props = { + modalIsOpen: boolean, + confirmNeeded: boolean, + passwordCallback: (password: string) => void, + closeCallback: () => void, + helpText: string | null +}; + +type State = { + password: string, + confirmPassword: string +}; + +export default class PasswordModal extends PureComponent { + constructor(props: Props) { + super(props); + + this.state = { password: '', confirmPassword: '' }; + } + + enterButton = () => { + const { passwordCallback } = this.props; + const { password } = this.state; + + passwordCallback(password); + + // Clear the passwords + this.setState({ password: '', confirmPassword: '' }); + }; + + closeButton = () => { + const { closeCallback } = this.props; + + closeCallback(); + + // Clear the passwords + this.setState({ password: '', confirmPassword: '' }); + }; + + render() { + const { modalIsOpen, confirmNeeded, helpText } = this.props; + const { password, confirmPassword } = this.state; + + const enabled = !confirmNeeded || password === confirmPassword; + + return ( + +
+
+ {helpText && {helpText}} + {!helpText && Enter Wallet Password} +
+ +
+
Password
+ this.setState({ password: e.target.value })} + /> + + {confirmNeeded && ( +
+
Confirm Password
+ this.setState({ confirmPassword: e.target.value })} + /> +
+ )} +
+ +
+ {!enabled &&
Passwords do not match
} + + + +
+
+
+ ); + } +} diff --git a/app/components/Receive.css b/app/components/Receive.css new file mode 100644 index 00000000..b3ebf8f6 --- /dev/null +++ b/app/components/Receive.css @@ -0,0 +1,18 @@ +.receivecontainer { + margin: 16px; +} + +.receiveblock { + margin-bottom: 16px; + display: flex; + flex-direction: column; +} + +.receiveDetail { + margin-top: 16px; +} + +.receiveQrcode { + padding: 8px; + background-color: white; +} diff --git a/app/components/Receive.js b/app/components/Receive.js new file mode 100644 index 00000000..4f29ae98 --- /dev/null +++ b/app/components/Receive.js @@ -0,0 +1,243 @@ +/* eslint-disable react/prop-types */ +import React, { Component, useState } from 'react'; +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import { + Accordion, + AccordionItem, + AccordionItemHeading, + AccordionItemButton, + AccordionItemPanel +} from 'react-accessible-accordion'; +import QRCode from 'qrcode.react'; +import { shell, clipboard } from 'electron'; +import styles from './Receive.css'; +import cstyles from './Common.css'; +import Utils from '../utils/utils'; +import { AddressBalance, Info, ReceivePageState, AddressBookEntry } from './AppState'; +import ScrollPane from './ScrollPane'; + +const AddressBlock = ({ addressBalance, label, currencyName, zecPrice, privateKey, fetchAndSetSinglePrivKey }) => { + const { address } = addressBalance; + + const [copied, setCopied] = useState(false); + const balance = addressBalance.balance || 0; + + const openAddress = () => { + if (currencyName === 'TAZ') { + shell.openExternal(`https://chain.so/address/ZECTEST/${address}`); + } else { + shell.openExternal(`https://zcha.in/accounts/${address}`); + } + }; + + return ( + + + {address} + + +
+
+ {label && ( +
+
Label
+
{label}
+
+ )} + +
Funds
+
+ {currencyName} {balance} +
+
{Utils.getZecToUsdString(zecPrice, balance)}
+ +
+ {privateKey && ( +
+
Private Key
+
+ {privateKey} +
+
+ )} +
+ +
+ + {!privateKey && ( + + )} + {Utils.isTransparent(address) && ( + + )} +
+
+
+ +
+
+
+
+ ); +}; + +type Props = { + addresses: string[], + addressesWithBalance: AddressBalance[], + addressBook: AddressBookEntry[], + info: Info, + receivePageState: ReceivePageState, + fetchAndSetSinglePrivKey: string => void, + createNewAddress: boolean => void, + rerenderKey: number +}; + +export default class Receive extends Component { + render() { + const { + addresses, + addressesWithBalance, + addressPrivateKeys, + addressBook, + info, + receivePageState, + fetchAndSetSinglePrivKey, + createNewAddress, + rerenderKey + } = this.props; + + // Convert the addressBalances into a map. + const addressMap = addressesWithBalance.reduce((map, a) => { + // eslint-disable-next-line no-param-reassign + map[a.address] = a.balance; + return map; + }, {}); + + const zaddrs = addresses + .filter(a => Utils.isSapling(a)) + .slice(0, 100) + .map(a => new AddressBalance(a, addressMap[a])); + + let defaultZaddr = zaddrs.length ? zaddrs[0].address : ''; + if (receivePageState && Utils.isSapling(receivePageState.newAddress)) { + defaultZaddr = receivePageState.newAddress; + + // move this address to the front, since the scrollbar will reset when we re-render + zaddrs.sort((x, y) => { + // eslint-disable-next-line prettier/prettier, no-nested-ternary + return x.address === defaultZaddr ? -1 : y.address === defaultZaddr ? 1 : 0 + }); + } + + const taddrs = addresses + .filter(a => Utils.isTransparent(a)) + .slice(0, 100) + .map(a => new AddressBalance(a, addressMap[a])); + + let defaultTaddr = taddrs.length ? taddrs[0].address : ''; + if (receivePageState && Utils.isTransparent(receivePageState.newAddress)) { + defaultTaddr = receivePageState.newAddress; + + // move this address to the front, since the scrollbar will reset when we re-render + taddrs.sort((x, y) => { + // eslint-disable-next-line prettier/prettier, no-nested-ternary + return x.address === defaultTaddr ? -1 : y.address === defaultTaddr ? 1 : 0 + }); + } + + const addressBookMap = addressBook.reduce((map, obj) => { + // eslint-disable-next-line no-param-reassign + map[obj.address] = obj.label; + return map; + }, {}); + + return ( +
+
+ + + Shielded + Transparent + + + + {/* Change the hardcoded height */} + + + {zaddrs.map(a => ( + + ))} + + + + + + + + {/* Change the hardcoded height */} + + + {taddrs.map(a => ( + + ))} + + + + + + +
+
+ ); + } +} diff --git a/app/components/ScrollPane.js b/app/components/ScrollPane.js new file mode 100644 index 00000000..3a4f40ac --- /dev/null +++ b/app/components/ScrollPane.js @@ -0,0 +1,49 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +type PaneState = { + height: number +}; + +type Props = { + children: PropTypes.node.isRequired, + className: PropTypes.node.isRequired, + offsetHeight: number +}; + +export default class ScrollPane extends Component { + constructor(props: Props) { + super(props); + + this.state = { height: 0 }; + } + + componentDidMount() { + this.updateDimensions(); + window.addEventListener('resize', this.updateDimensions.bind(this)); + } + + componentWillUnmount() { + window.removeEventListener('resize', this.updateDimensions.bind(this)); + } + + /** + * Calculate & Update state of height, needed for the scrolling + */ + updateDimensions() { + // eslint-disable-next-line react/destructuring-assignment + const updateHeight = window.innerHeight - this.props.offsetHeight; + this.setState({ height: updateHeight }); + } + + render() { + const { children, className } = this.props; + const { height } = this.state; + + return ( +
+ {children} +
+ ); + } +} diff --git a/app/components/Send.css b/app/components/Send.css new file mode 100644 index 00000000..48198f48 --- /dev/null +++ b/app/components/Send.css @@ -0,0 +1,39 @@ +.toaddrcontainer { + overflow-y: auto; +} + +.toaddrbutton { + height: 24px; + margin-top: 13px; +} + +.toaddrbutton:hover { + cursor: pointer; +} + +.confirmModal { + top: 25%; + left: 25%; + right: auto; + bottom: auto; + opacity: 1; + transform: translate(-12.5%, -12.5%); + background: #212124; + position: absolute; + padding: 16px; + min-width: 700px; +} + +.confirmModalAddress { + width: 60%; + padding-bottom: 8px; +} + +.confirmOverlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(100, 100, 100, 0.5); +} diff --git a/app/components/Send.js b/app/components/Send.js new file mode 100644 index 00000000..b2250e36 --- /dev/null +++ b/app/components/Send.js @@ -0,0 +1,585 @@ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-else-return */ +/* eslint-disable radix */ +/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +/* eslint-disable react/prop-types */ +/* eslint-disable max-classes-per-file */ +// @flow +import React, { PureComponent } from 'react'; +import Modal from 'react-modal'; +import TextareaAutosize from 'react-textarea-autosize'; +import { withRouter } from 'react-router-dom'; +import styles from './Send.css'; +import cstyles from './Common.css'; +import { ToAddr, AddressBalance, SendPageState, Info, AddressBookEntry, TotalBalance } from './AppState'; +import Utils from '../utils/utils'; +import ScrollPane from './ScrollPane'; +import ArrowUpLight from '../assets/img/arrow_up_dark.png'; +import { ErrorModal } from './ErrorModal'; +import { BalanceBlockHighlight } from './BalanceBlocks'; +import routes from '../constants/routes.json'; + +type OptionType = { + value: string, + label: string +}; + +const Spacer = () => { + return
; +}; + +// $FlowFixMe +const ToAddrBox = ({ + toaddr, + zecPrice, + updateToField, + fromAddress, + fromAmount, + setMaxAmount, + setSendButtonEnable, + totalAmountAvailable +}) => { + const isMemoDisabled = !Utils.isZaddr(toaddr.to); + + const addressIsValid = toaddr.to === '' || Utils.isZaddr(toaddr.to) || Utils.isTransparent(toaddr.to); + const memoIsValid = toaddr.memo.length <= 512; + + let amountError = null; + if (toaddr.amount) { + if (toaddr.amount < 0) { + amountError = 'Amount cannot be negative'; + } + if (toaddr.amount > fromAmount) { + amountError = 'Amount Exceeds Balance'; + } + const s = toaddr.amount.toString().split('.'); + if (s && s.length > 1 && s[1].length > 8) { + amountError = 'Too Many Decimals'; + } + } + + if (isNaN(toaddr.amount)) { + // Amount is empty + amountError = 'Amount cannot be empty'; + } + + if ( + !addressIsValid || + amountError || + !memoIsValid || + toaddr.to === '' || + parseFloat(toaddr.amount) === 0 || + fromAmount === 0 + ) { + setSendButtonEnable(false); + } else { + setSendButtonEnable(true); + } + + const usdValue = Utils.getZecToUsdString(zecPrice, toaddr.amount); + + const addReplyTo = () => { + if (toaddr.memo.endsWith(fromAddress)) { + return; + } + + if (fromAddress) { + updateToField(toaddr.id, null, null, `${toaddr.memo}\nReply-To:\n${fromAddress}`); + } + }; + + return ( +
+
+
+
To
+
+ {addressIsValid ? ( + + ) : ( + Invalid Address + )} +
+
+ updateToField(toaddr.id, e, null, null)} + /> + +
+
Amount
+
+ {amountError ? {amountError} : {usdValue}} +
+
+
+ updateToField(toaddr.id, null, e, null)} + /> + Max setMaxAmount(toaddr.id, totalAmountAvailable)} + /> +
+ + + + {isMemoDisabled &&
Memos only for z-addresses
} + + {!isMemoDisabled && ( +
+
+
Memo
+
+ {memoIsValid ? toaddr.memo.length : {toaddr.memo.length}} / 512 +
+
+ updateToField(toaddr.id, null, null, e)} + /> + e.target.checked && addReplyTo()} /> + Include Reply-To address +
+ )} + +
+ +
+ ); +}; + +function getSendManyJSON(sendPageState: SendPageState): [] { + const json = sendPageState.toaddrs.map(to => { + const memo = to.memo || ''; + const amount = parseInt((parseFloat(to.amount) * 10 ** 8).toFixed(0)); + + if (memo === '') { + return { address: to.to, amount }; + } else { + return { address: to.to, amount, memo }; + } + }); + + console.log('Sending:'); + console.log(json); + + return json; +} + +const ConfirmModalToAddr = ({ toaddr, info }) => { + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(toaddr.amount); + + const memo: string = toaddr.memo ? toaddr.memo : ''; + + return ( +
+
+
+ {Utils.splitStringIntoChunks(toaddr.to, 6).join(' ')} +
+
+
+
+ + {info.currencyName} {bigPart} + + {smallPart} +
+
+
{Utils.getZecToUsdString(info.zecPrice, toaddr.amount)}
+
+
+
{memo}
+
+ ); +}; + +// Internal because we're using withRouter just below +const ConfirmModalInternal = ({ + sendPageState, + info, + sendTransaction, + clearToAddrs, + closeModal, + modalIsOpen, + openErrorModal, + openPasswordAndUnlockIfNeeded, + history +}) => { + const sendingTotal = sendPageState.toaddrs.reduce((s, t) => parseFloat(s) + parseFloat(t.amount), 0.0) + 0.0001; + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(sendingTotal); + + const sendButton = () => { + // First, close the confirm modal. + closeModal(); + + // This will be replaced by either a success TXID or error message that the user + // has to close manually. + openErrorModal('Computing Transaction', 'Please wait...This could take a while'); + + // Now, send the Tx in a timeout, so that the error modal above has a chance to display + setTimeout(() => { + openPasswordAndUnlockIfNeeded(() => { + // Then send the Tx async + (async () => { + const sendJson = getSendManyJSON(sendPageState); + let txid = ''; + + try { + txid = sendTransaction(sendJson); + + openErrorModal( + 'Successfully Broadcast Transaction', + `Transaction was successfully broadcast.\nTXID: ${txid}` + ); + + clearToAddrs(); + + // Redirect to dashboard after + history.push(routes.DASHBOARD); + } catch (err) { + // If there was an error, show the error modal + openErrorModal('Error Sending Transaction', err); + } + })(); + }); + }, 10); + }; + + return ( + +
+
Confirm Transaction
+
+
+
Total
+
+
+ + {info.currencyName} {bigPart} + + {smallPart} +
+ +
{Utils.getZecToUsdString(info.zecPrice, sendingTotal)}
+
+
+
+ +
+ {sendPageState.toaddrs.map(t => ( + + ))} +
+ + + +
+ + +
+
+
+ ); +}; + +const ConfirmModal = withRouter(ConfirmModalInternal); + +type Props = { + addresses: string[], + totalBalance: TotalBalance, + addressBook: AddressBookEntry[], + sendPageState: SendPageState, + sendTransaction: (sendJson: []) => string, + setSendPageState: (sendPageState: SendPageState) => void, + openErrorModal: (title: string, body: string) => void, + closeErrorModal: () => void, + info: Info, + openPasswordAndUnlockIfNeeded: (successCallback: () => void) => void +}; + +class SendState { + modalIsOpen: boolean; + + errorModalIsOpen: boolean; + + errorModalTitle: string; + + errorModalBody: string; + + sendButtonEnabled: boolean; + + constructor() { + this.modalIsOpen = false; + this.errorModalIsOpen = false; + this.errorModalBody = ''; + this.errorModalTitle = ''; + this.sendButtonEnabled = false; + } +} + +export default class Send extends PureComponent { + constructor(props: Props) { + super(props); + + this.state = new SendState(); + } + + addToAddr = () => { + const { sendPageState, setSendPageState } = this.props; + const newToAddrs = sendPageState.toaddrs.concat(new ToAddr(Utils.getNextToAddrID())); + + // Create the new state object + const newState = new SendPageState(); + newState.fromaddr = sendPageState.fromaddr; + newState.toaddrs = newToAddrs; + + setSendPageState(newState); + }; + + clearToAddrs = () => { + const { sendPageState, setSendPageState } = this.props; + const newToAddrs = [new ToAddr(Utils.getNextToAddrID())]; + + // Create the new state object + const newState = new SendPageState(); + newState.fromaddr = sendPageState.fromaddr; + newState.toaddrs = newToAddrs; + + setSendPageState(newState); + }; + + changeFrom = (selectedOption: OptionType) => { + const { sendPageState, setSendPageState } = this.props; + + // Create the new state object + const newState = new SendPageState(); + newState.fromaddr = selectedOption.value; + newState.toaddrs = sendPageState.toaddrs; + + setSendPageState(newState); + }; + + updateToField = (id: number, address: Event | null, amount: Event | null, memo: Event | string | null) => { + const { sendPageState, setSendPageState } = this.props; + + const newToAddrs = sendPageState.toaddrs.slice(0); + // Find the correct toAddr + const toAddr = newToAddrs.find(a => a.id === id); + if (address) { + // $FlowFixMe + toAddr.to = address.target.value.replace(/ /g, ''); // Remove spaces + } + + if (amount) { + // Check to see the new amount if valid + // $FlowFixMe + const newAmount = parseFloat(amount.target.value); + if (newAmount < 0 || newAmount > 21 * 10 ** 6) { + return; + } + // $FlowFixMe + toAddr.amount = newAmount; + } + + if (memo) { + if (typeof memo === 'string') { + toAddr.memo = memo; + } else { + // $FlowFixMe + toAddr.memo = memo.target.value; + } + } + + // Create the new state object + const newState = new SendPageState(); + newState.fromaddr = sendPageState.fromaddr; + newState.toaddrs = newToAddrs; + + setSendPageState(newState); + }; + + setMaxAmount = (id: number, total: number) => { + const { sendPageState, setSendPageState } = this.props; + + const newToAddrs = sendPageState.toaddrs.slice(0); + + let totalOtherAmount: number = newToAddrs + .filter(a => a.id !== id) + .reduce((s, a) => parseFloat(s) + parseFloat(a.amount), 0); + + // Add Fee + totalOtherAmount += 0.0001; + + // Find the correct toAddr + const toAddr = newToAddrs.find(a => a.id === id); + toAddr.amount = total - totalOtherAmount; + if (toAddr.amount < 0) toAddr.amount = 0; + toAddr.amount = Utils.maxPrecision(toAddr.amount); + + // Create the new state object + const newState = new SendPageState(); + newState.fromaddr = sendPageState.fromaddr; + newState.toaddrs = newToAddrs; + + setSendPageState(newState); + }; + + setSendButtonEnable = (sendButtonEnabled: boolean) => { + this.setState({ sendButtonEnabled }); + }; + + openModal = () => { + this.setState({ modalIsOpen: true }); + }; + + closeModal = () => { + this.setState({ modalIsOpen: false }); + }; + + getBalanceForAddress = (addr: string, addressesWithBalance: AddressBalance[]): number => { + // Find the addr in addressesWithBalance + const addressBalance: AddressBalance = addressesWithBalance.find(ab => ab.address === addr); + + if (!addressBalance) { + return 0; + } + + return addressBalance.balance; + }; + + getLabelForFromAddress = (addr: string, addressesWithBalance: AddressBalance[], currencyName: string) => { + // Find the addr in addressesWithBalance + const { addressBook } = this.props; + const label = addressBook.find(ab => ab.address === addr); + const labelStr = label ? ` [ ${label.label} ]` : ''; + + const balance = this.getBalanceForAddress(addr, addressesWithBalance); + + return `[ ${currencyName} ${balance.toString()} ]${labelStr} ${addr}`; + }; + + render() { + const { modalIsOpen, errorModalIsOpen, errorModalTitle, errorModalBody, sendButtonEnabled } = this.state; + const { + addresses, + sendTransaction, + sendPageState, + info, + totalBalance, + openErrorModal, + closeErrorModal, + openPasswordAndUnlockIfNeeded + } = this.props; + + const totalAmountAvailable = totalBalance.transparent + totalBalance.verifiedPrivate; + const fromaddr = addresses.find(a => Utils.isSapling(a)); + + return ( +
+
Send
+ +
+
+ + +
+ + + {sendPageState.toaddrs.map(toaddr => { + return ( + + ); + })} +
+ +
+
+ +
+ + +
+ + + + +
+
+ ); + } +} diff --git a/app/components/Sidebar.css b/app/components/Sidebar.css new file mode 100644 index 00000000..61dd710b --- /dev/null +++ b/app/components/Sidebar.css @@ -0,0 +1,25 @@ +.sidebar { + background-color: #000; + height: calc(100vh - 135px); +} + +.sidebarmenuitem { + height: 40px; + padding: 10px; + margin-left: 16px; + font-size: 20px; +} + +.sidebarmenuitemactive { + color: #c3921f; +} + +.sidebarlogobg { + background: #ffb100; + margin-bottom: 8px; +} + +.exportedPrivKeys { + width: 100%; + max-height: calc(100vh - 400px); +} diff --git a/app/components/Sidebar.js b/app/components/Sidebar.js new file mode 100644 index 00000000..593d7c96 --- /dev/null +++ b/app/components/Sidebar.js @@ -0,0 +1,513 @@ +/* eslint-disable react/destructuring-assignment */ +/* eslint-disable react/prop-types */ +import React, { PureComponent } from 'react'; +import type { Element } from 'react'; +import url from 'url'; +import querystring from 'querystring'; +import Modal from 'react-modal'; +import { withRouter } from 'react-router'; +import { Link } from 'react-router-dom'; +import { ipcRenderer } from 'electron'; +import TextareaAutosize from 'react-textarea-autosize'; +import PropTypes from 'prop-types'; +import styles from './Sidebar.css'; +import cstyles from './Common.css'; +import routes from '../constants/routes.json'; +import Logo from '../assets/img/logobig.png'; +import { Info } from './AppState'; +import Utils from '../utils/utils'; +import RPC from '../rpc'; + +const ExportPrivKeyModal = ({ modalIsOpen, exportedPrivKeys, closeModal }) => { + return ( + +
+
+ Your Wallet Private Keys +
+ +
+ These are all the private keys in your wallet. Please store them carefully! +
+ + {exportedPrivKeys && ( + + )} +
+ +
+ +
+
+ ); +}; + +const PayURIModal = ({ + modalIsOpen, + modalInput, + setModalInput, + closeModal, + modalTitle, + actionButtonName, + actionCallback +}) => { + return ( + +
+
+ {modalTitle} +
+ +
+ setModalInput(e.target.value)} + /> +
+
+ +
+ {actionButtonName && ( + + )} + + +
+
+ ); +}; + +const SidebarMenuItem = ({ name, routeName, currentRoute, iconname }) => { + let isActive = false; + + if ((currentRoute.endsWith('app.html') && routeName === routes.HOME) || currentRoute === routeName) { + isActive = true; + } + + let activeColorClass = ''; + if (isActive) { + activeColorClass = styles.sidebarmenuitemactive; + } + + return ( +
+ + + +     + {name} + + +
+ ); +}; + +type Props = { + info: Info, + setRescanning: boolean => void, + addresses: string[], + setInfo: Info => void, + setSendTo: (address: string, amount: number | null, memo: string | null) => void, + getPrivKeyAsString: (address: string) => string, + history: PropTypes.object.isRequired, + openErrorModal: (title: string, body: string | Element<'div'>) => void, + openPassword: (boolean, (string) => void, () => void, string) => void, + openPasswordAndUnlockIfNeeded: (successCallback: () => void) => void, + lockWallet: () => void, + encryptWallet: string => void, + decryptWallet: string => void +}; + +type State = { + uriModalIsOpen: boolean, + uriModalInputValue: string | null, + exportPrivKeysModalIsOpen: boolean, + exportedPrivKeys: string[] | null +}; + +class Sidebar extends PureComponent { + constructor(props) { + super(props); + this.state = { + uriModalIsOpen: false, + uriModalInputValue: null, + exportPrivKeysModalIsOpen: false, + exportedPrivKeys: null + }; + + this.setupMenuHandlers(); + } + + // Handle menu items + setupMenuHandlers = async () => { + const { setSendTo, setInfo, setRescanning, history, openErrorModal, openPasswordAndUnlockIfNeeded } = this.props; + + // About + ipcRenderer.on('about', () => { + openErrorModal( + 'Zecwallet Lite', +
+
Zecwallet Lite v1.1.0
+
Built with Electron. Copyright (c) 2018-2020, Aditya Kulkarni.
+
+ The MIT License (MIT) Copyright (c) 2018-2020 Zecwallet +
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + documentation files (the "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the + following conditions: +
+
+ The above copyright notice and this permission notice shall be included in all copies or substantial + portions of the Software. +
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. +
+
+ ); + }); + + // Donate button + ipcRenderer.on('donate', () => { + const { info } = this.props; + + setSendTo( + Utils.getDonationAddress(info.testnet), + Utils.getDefaultDonationAmount(info.testnet), + Utils.getDefaultDonationMemo(info.testnet) + ); + + history.push(routes.SEND); + }); + + // Pay URI + ipcRenderer.on('payuri', (event, uri) => { + this.openURIModal(uri); + }); + + // Export Seed + ipcRenderer.on('seed', () => { + openPasswordAndUnlockIfNeeded(() => { + const seed = RPC.fetchSeed(); + + openErrorModal( + 'Wallet Seed', +
+
+ This is your wallet’s seed phrase. It can be used to recover your entire wallet. +
+ PLEASE KEEP IT SAFE! +
+
+
{seed}
+
+
+ ); + }); + }); + + // Encrypt wallet + ipcRenderer.on('encrypt', async () => { + const { info, lockWallet, encryptWallet, openPassword } = this.props; + + if (info.encrypted && info.locked) { + openErrorModal('Already Encrypted', 'Your wallet is already encrypted and locked.'); + } else if (info.encrypted && !info.locked) { + await lockWallet(); + openErrorModal('Locked', 'Your wallet has been locked. A password will be needed to spend funds.'); + } else { + // Encrypt the wallet + openPassword( + true, + async password => { + await encryptWallet(password); + openErrorModal('Encrypted', 'Your wallet has been encrypted. The password will be needed to spend funds.'); + }, + () => { + openErrorModal('Cancelled', 'Your wallet was not encrypted.'); + }, +
+ Please enter a password to encrypt your wallet.
+ WARNING: If you forget this password, the only way to recover your wallet is from the seed phrase. +
+ ); + } + }); + + // Remove wallet encryption + ipcRenderer.on('decrypt', async () => { + const { info, decryptWallet, openPassword } = this.props; + + if (!info.encrypted) { + openErrorModal('Not Encrypted', 'Your wallet is not encrypted and ready for spending.'); + } else { + // Remove the wallet remove the wallet encryption + openPassword( + false, + async password => { + const success = await decryptWallet(password); + if (success) { + openErrorModal( + 'Decrypted', + `Your wallet's encryption has been removed. A password will no longer be needed to spend funds.` + ); + } else { + openErrorModal('Decryption Failed', 'Wallet decryption failed. Do you have the right password?'); + } + }, + () => { + openErrorModal('Cancelled', 'Your wallet is still encrypted.'); + } + ); + } + }); + + // Unlock wallet + ipcRenderer.on('unlock', () => { + const { info } = this.props; + if (!info.encrypted || !info.locked) { + openErrorModal('Already Unlocked', 'Your wallet is already unlocked for spending'); + } else { + openPasswordAndUnlockIfNeeded(async () => { + openErrorModal('Unlocked', 'Your wallet is unlocked for spending'); + }); + } + }); + + // Rescan + ipcRenderer.on('rescan', () => { + // To rescan, we reset the wallet loading + // So set info the default, and redirect to the loading screen + RPC.doRescan(); + + // Set the rescanning global state to true + setRescanning(true); + + // Reset the info object, it will be refetched + setInfo(new Info()); + + history.push(routes.LOADING); + }); + + // Export all private keys + ipcRenderer.on('exportall', async () => { + // Get all the addresses and run export key on each of them. + const { addresses, getPrivKeyAsString } = this.props; + openPasswordAndUnlockIfNeeded(async () => { + const privKeysPromise = addresses.map(async a => { + const privKey = await getPrivKeyAsString(a); + return `${privKey} #${a}`; + }); + const exportedPrivKeys = await Promise.all(privKeysPromise); + + this.setState({ exportPrivKeysModalIsOpen: true, exportedPrivKeys }); + }); + }); + + // View zcashd + ipcRenderer.on('zcashd', () => { + history.push(routes.ZCASHD); + }); + + // Connect mobile app + ipcRenderer.on('connectmobile', () => { + history.push(routes.CONNECTMOBILE); + }); + }; + + closeExportPrivKeysModal = () => { + this.setState({ exportPrivKeysModalIsOpen: false, exportedPrivKeys: null }); + }; + + openURIModal = (defaultValue: string | null) => { + const uriModalInputValue = defaultValue || ''; + this.setState({ uriModalIsOpen: true, uriModalInputValue }); + }; + + setURIInputValue = (uriModalInputValue: string) => { + this.setState({ uriModalInputValue }); + }; + + closeURIModal = () => { + this.setState({ uriModalIsOpen: false }); + }; + + payURI = (uri: string) => { + console.log(`Paying ${uri}`); + const { openErrorModal, setSendTo, history } = this.props; + + const errTitle = 'URI Error'; + const errBody = ( + + The URI "{escape(uri)}" was not recognized. +
+ Please type in a valid URI of the form " zcash:address?amout=xx&memo=yy " +
+ ); + + if (!uri || uri === '') { + openErrorModal(errTitle, errBody); + return; + } + + const parsedUri = url.parse(uri); + if (!parsedUri || parsedUri.protocol !== 'zcash:' || !parsedUri.query) { + openErrorModal(errTitle, errBody); + return; + } + + const address = parsedUri.host; + if (!address || !(Utils.isTransparent(address) || Utils.isZaddr(address))) { + openErrorModal(errTitle, The address ${address} was not recognized as a Zcash address); + return; + } + + const parsedParams = querystring.parse(parsedUri.query); + if (!parsedParams || (!parsedParams.amt && !parsedParams.amount)) { + openErrorModal(errTitle, errBody); + return; + } + + const amount = parsedParams.amt || parsedParams.amount; + const memo = parsedParams.memo || ''; + + setSendTo(address, amount, memo); + history.push(routes.SEND); + }; + + render() { + const { location, info } = this.props; + const { uriModalIsOpen, uriModalInputValue, exportPrivKeysModalIsOpen, exportedPrivKeys } = this.state; + + let state = 'DISCONNECTED'; + let progress = 100; + if (info && info.version) { + if (info.verificationProgress < 0.9999) { + state = 'SYNCING'; + progress = (info.verificationProgress * 100).toFixed(1); + } else { + state = 'CONNECTED'; + } + } + + return ( +
+ {/* Payment URI Modal */} + + + {/* Exported (all) Private Keys */} + + +
+ logo +
+ +
+ + + + + +
+ +
+ {state === 'CONNECTED' && ( +
+ +   Connected +
+ )} + {state === 'SYNCING' && ( +
+
+ +   Syncing +
+
{`${progress}%`}
+
+ )} + {state === 'DISCONNECTED' && ( +
+ +   Connected +
+ )} +
+
+ ); + } +} + +export default withRouter(Sidebar); diff --git a/app/components/Transactions.css b/app/components/Transactions.css new file mode 100644 index 00000000..b459fc4a --- /dev/null +++ b/app/components/Transactions.css @@ -0,0 +1,62 @@ +.txbox { + margin-left: 16px; + margin-right: 16px; + margin-top: 4px; + margin-bottom: 16px; + display: flex; + cursor: pointer; +} + +.txdate { + margin-left: 16px; +} + +.txtype { + width: 15%; + float: left; +} + +.txaddressamount { + width: 85%; + float: left; + display: flex; + flex-direction: column; +} + +.txaddress { + width: 75%; + float: left; +} + +.txamount { + width: 20%; + float: right; +} + +.txmemo { + word-break: break-all; +} + +.txmodal { + top: 12.5%; + left: 12.5%; + right: 12.5%; + bottom: auto; + opacity: 1; + transform: translate(-0%, -12.5%); + background: #212124; + position: absolute; + padding: 16px; + min-width: 700px; + max-height: calc(100vh - 100px); + overflow-y: auto; +} + +.txmodalOverlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(100, 100, 100, 0.5); +} diff --git a/app/components/Transactions.js b/app/components/Transactions.js new file mode 100644 index 00000000..5b1c594f --- /dev/null +++ b/app/components/Transactions.js @@ -0,0 +1,323 @@ +/* eslint-disable react/prop-types */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +/* eslint-disable jsx-a11y/no-static-element-interactions */ +import React, { Component } from 'react'; +import Modal from 'react-modal'; +import dateformat from 'dateformat'; +import { shell } from 'electron'; +import { withRouter } from 'react-router'; +import { BalanceBlockHighlight } from './BalanceBlocks'; +import styles from './Transactions.css'; +import cstyles from './Common.css'; +import { Transaction, Info } from './AppState'; +import ScrollPane from './ScrollPane'; +import Utils from '../utils/utils'; +import AddressBook from './Addressbook'; +import routes from '../constants/routes.json'; + +const TxModalInternal = ({ modalIsOpen, tx, closeModal, currencyName, zecPrice, setSendTo, history }) => { + let txid = ''; + let type = ''; + let typeIcon = ''; + let typeColor = ''; + let confirmations = 0; + let detailedTxns = []; + let amount = 0; + let datePart = ''; + let timePart = ''; + + if (tx) { + txid = tx.txid; + type = tx.type; + if (tx.type === 'receive') { + typeIcon = 'fa-arrow-circle-down'; + typeColor = 'green'; + } else { + typeIcon = 'fa-arrow-circle-up'; + typeColor = 'red'; + } + + datePart = dateformat(tx.time * 1000, 'mmm dd, yyyy'); + timePart = dateformat(tx.time * 1000, 'hh:MM tt'); + + confirmations = tx.confirmations; + detailedTxns = tx.detailedTxns; + amount = Math.abs(tx.amount); + } + + const openTxid = () => { + if (currencyName === 'TAZ') { + shell.openExternal(`https://chain.so/tx/ZECTEST/${txid}`); + } else { + shell.openExternal(`https://zcha.in/transactions/${txid}`); + } + }; + + const doReply = (address: string) => { + setSendTo(address, 0.0001, null); + closeModal(); + + history.push(routes.SEND); + }; + + return ( + +
+
Transaction Status
+ +
+ +
+ +
+ {type} + +
+ +
+
+
Time
+
+ {datePart} {timePart} +
+
+
+
Confirmations
+
{confirmations}
+
+
+ +
+ +
+
+
TXID
+
{txid}
+
+ +
+ View TXID   + +
+
+ +
+
+ + {detailedTxns.map(txdetail => { + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(Math.abs(txdetail.amount)); + + let { address } = txdetail; + const { memo } = txdetail; + + if (!address) { + address = '(Shielded)'; + } + + let replyTo = null; + if (tx.type === 'receive' && memo) { + const split = memo.split(/[ :\n\r\t]+/); + console.log(split); + if (split && split.length > 0 && Utils.isSapling(split[split.length - 1])) { + replyTo = split[split.length - 1]; + } + } + + console.log('replyto is', replyTo); + + return ( +
+
Address
+
{Utils.splitStringIntoChunks(address, 6).join(' ')}
+ +
+ +
Amount
+
+ + {currencyName} {bigPart} + + {smallPart} +
+ +
+ + {memo && ( +
+
Memo
+
+
{memo}
+ {replyTo && ( +
doReply(replyTo)}> + Reply +
+ )} +
+
+ )} + +
+
+ ); + })} + +
+ +
+
+ + ); +}; + +const TxModal = withRouter(TxModalInternal); + +const TxItemBlock = ({ transaction, currencyName, zecPrice, txClicked, addressBookMap }) => { + const txDate = new Date(transaction.time * 1000); + const datePart = dateformat(txDate, 'mmm dd, yyyy'); + const timePart = dateformat(txDate, 'hh:MM tt'); + + return ( +
+
{datePart}
+
{ + txClicked(transaction); + }} + > +
+
{transaction.type}
+
{timePart}
+
+
+ {transaction.detailedTxns.map(txdetail => { + const { bigPart, smallPart } = Utils.splitZecAmountIntoBigSmall(Math.abs(txdetail.amount)); + + let { address } = txdetail; + const { memo } = txdetail; + + if (!address) { + address = '(Shielded)'; + } + + const label = addressBookMap[address] || ''; + + return ( +
+
+
{label}
+
{Utils.splitStringIntoChunks(address, 6).join(' ')}
+
+ {memo} +
+
+
+
+ + {currencyName} {bigPart} + + {smallPart} +
+
+ {Utils.getZecToUsdString(zecPrice, Math.abs(txdetail.amount))} +
+
+
+ ); + })} +
+
+
+ ); +}; + +type Props = { + transactions: Transaction[], + addressBook: AddressBook[], + info: Info, + setSendTo: (string, number | null, string | null) => void +}; + +type State = { + clickedTx: Transaction | null, + modalIsOpen: boolean +}; + +export default class Transactions extends Component { + constructor(props: Props) { + super(props); + + this.state = { clickedTx: null, modalIsOpen: false }; + } + + txClicked = (tx: Transaction) => { + // Show the modal + if (!tx) return; + this.setState({ clickedTx: tx, modalIsOpen: true }); + }; + + closeModal = () => { + this.setState({ clickedTx: null, modalIsOpen: false }); + }; + + render() { + const { transactions, info, addressBook, setSendTo } = this.props; + const { clickedTx, modalIsOpen } = this.state; + + const addressBookMap = addressBook.reduce((map, obj) => { + // eslint-disable-next-line no-param-reassign + map[obj.address] = obj.label; + return map; + }, {}); + + return ( +
+
Transactions
+ + {/* Change the hardcoded height */} + + {/* If no transactions, show the "loading..." text */ + !transactions &&
Loading...
} + + {transactions && transactions.length === 0 && ( +
No Transactions Yet
+ )} + {transactions && + transactions.map(t => { + const key = t.type + t.txid + t.address; + return ( + + ); + })} +
+ + +
+ ); + } +} diff --git a/app/components/WormholeConnection.css b/app/components/WormholeConnection.css new file mode 100644 index 00000000..0338d65a --- /dev/null +++ b/app/components/WormholeConnection.css @@ -0,0 +1,20 @@ +.wormholeqr { + width: 400px; +} + +.qrcodecontainer { + margin: 20px; + text-align: center; +} + +.appinfocontainer { + width: 50%; + margin-left: 25%; + margin-top: 20px; +} + +.appinfo { + margin-top: 20px; + border: 1px solid grey; + padding: 16px; +} diff --git a/app/components/WormholeConnection.js b/app/components/WormholeConnection.js new file mode 100644 index 00000000..625598ad --- /dev/null +++ b/app/components/WormholeConnection.js @@ -0,0 +1,110 @@ +import React, { PureComponent } from 'react'; +import QRCode from 'qrcode.react'; +import dateformat from 'dateformat'; +import cstyles from './Common.css'; +import styles from './WormholeConnection.css'; +import CompanionAppListener from '../companion'; +import { ConnectedCompanionApp } from './AppState'; + +type Props = { + companionAppListener: CompanionAppListener, + connectedCompanionApp: ConnectedCompanionApp | null +}; + +type State = { + tempKeyHex: string +}; + +export default class WormholeConnection extends PureComponent { + constructor(props) { + super(props); + this.state = { tempKeyHex: null }; + } + + componentDidMount() { + // If there is no temp key, create one + const { companionAppListener } = this.props; + const { tempKeyHex } = this.state; + + if (!tempKeyHex) { + const newKey = companionAppListener.genNewKeyHex(); + companionAppListener.createTmpClient(newKey); + this.setState({ tempKeyHex: newKey }); + } + } + + componentWillUnmount() { + const { companionAppListener } = this.props; + companionAppListener.closeTmpClient(); + } + + disconnectCurrentMobile = () => { + const { companionAppListener } = this.props; + companionAppListener.disconnectLastClient(); + }; + + render() { + const { tempKeyHex } = this.state; + const { connectedCompanionApp } = this.props; + + const clientName = (connectedCompanionApp && connectedCompanionApp.name) || null; + const lastSeen = (connectedCompanionApp && connectedCompanionApp.lastSeen) || null; + + let datePart = null; + let timePart = null; + + if (lastSeen) { + const txDate = new Date(lastSeen); + datePart = dateformat(txDate, 'mmm dd, yyyy'); + timePart = dateformat(txDate, 'hh:MM tt'); + } + + const connStr = `ws://127.0.0.1:7070,${tempKeyHex},1`; + + return ( +
+
Connect Mobile App
+ +
+
This is your connection code. Scan this QR code from the Zecwallet Companion App.
+ +
+ +
+
{connStr}
+
+ +
+
+ {clientName && ( +
+
+
+ Current App Connected: +
+
{clientName}
+
+ +
+
+ Last Seen: +
+
+ {datePart} {timePart} +
+
+
+ +
+
+ )} + + {!clientName &&
No Companion App Connected
} +
+
+
+ ); + } +} diff --git a/app/components/Zcashd.css b/app/components/Zcashd.css new file mode 100644 index 00000000..3b5e7f60 --- /dev/null +++ b/app/components/Zcashd.css @@ -0,0 +1,33 @@ +.container { + overflow: hidden; + display: flex; + flex-direction: column; +} + +.imgcontainer { + width: 100%; + text-align: center; + margin-top: 10%; +} + +.imgcontainer img { + max-width: 500px; +} + +.detailcontainer { + width: 50%; + flex-direction: column; + margin-left: 25%; + margin-top: 5%; +} + +.detaillines { + border: 1px solid grey; + padding: 16px; +} + +.detailline { + display: flex; + justify-content: space-between; + margin-bottom: 8px; +} diff --git a/app/components/Zcashd.js b/app/components/Zcashd.js new file mode 100644 index 00000000..7a2c5605 --- /dev/null +++ b/app/components/Zcashd.js @@ -0,0 +1,77 @@ +/* eslint-disable react/prop-types */ +import React, { Component } from 'react'; +import { Info } from './AppState'; +import cstyles from './Common.css'; +import styles from './Zcashd.css'; +import ScrollPane from './ScrollPane'; +import Heart from '../assets/img/zcashdlogo.gif'; + +const DetailLine = ({ label, value }) => { + return ( +
+
{label} :
+
{value}
+
+ ); +}; + +type Props = { + info: Info, + refresh: PropTypes.object.isRequired +}; + +export default class Zcashd extends Component { + render() { + const { info, rpcConfig, refresh } = this.props; + const { url } = rpcConfig; + + if (!info || !info.version) { + return ( +
+
+
+ +
+
Not Connected
+
+
+ ); + // eslint-disable-next-line no-else-return + } else { + let height = info.latestBlock; + if (info.verificationProgress < 0.9999) { + const progress = (info.verificationProgress * 100).toFixed(1); + height = `${height} (${progress}%)`; + } + + return ( +
+
+ +
+ heart +
+ +
+
+ + + + +
+
+ +
+ +
+ +
+ +
+
+ ); + } + } +} diff --git a/app/constants/routes.json b/app/constants/routes.json new file mode 100644 index 00000000..721df473 --- /dev/null +++ b/app/constants/routes.json @@ -0,0 +1,11 @@ +{ + "LOADING": "/", + "DASHBOARD": "/dashboard", + "SEND": "/send", + "RECEIVE": "/receive", + "ADDRESSBOOK": "/addressbook", + "TRANSACTIONS": "/transactions", + "SETTINGS": "/settings", + "ZCASHD": "/zcashd", + "CONNECTMOBILE": "/connectmobile" +} diff --git a/app/containers/App.js b/app/containers/App.js new file mode 100644 index 00000000..7b81b309 --- /dev/null +++ b/app/containers/App.js @@ -0,0 +1,15 @@ +// @flow +import * as React from 'react'; + +type Props = { + children: React.Node +}; + +export default class App extends React.Component { + props: Props; + + render() { + const { children } = this.props; + return <>{children}; + } +} diff --git a/app/containers/Root.js b/app/containers/Root.js new file mode 100644 index 00000000..f797da11 --- /dev/null +++ b/app/containers/Root.js @@ -0,0 +1,13 @@ +// @flow +import React from 'react'; +import { BrowserRouter as Router } from 'react-router-dom'; +import { hot } from 'react-hot-loader/root'; +import Routes from '../Routes'; + +const Root = () => ( + + + +); + +export default hot(Root); diff --git a/app/index.js b/app/index.js new file mode 100644 index 00000000..f2ce8af9 --- /dev/null +++ b/app/index.js @@ -0,0 +1,14 @@ +import React, { Fragment } from 'react'; +import { render } from 'react-dom'; +import { AppContainer as ReactHotAppContainer } from 'react-hot-loader'; +import Root from './containers/Root'; +import './app.global.css'; + +const AppContainer = process.env.PLAIN_HMR ? Fragment : ReactHotAppContainer; + +render( + + + , + document.getElementById('root') +); diff --git a/app/main.dev.js b/app/main.dev.js new file mode 100644 index 00000000..30dcb84b --- /dev/null +++ b/app/main.dev.js @@ -0,0 +1,152 @@ +/* eslint-disable compat/compat */ +/* eslint global-require: off */ + +/** + * This module executes inside of electron's main process. You can start + * electron renderer process from here and communicate with the other processes + * through IPC. + * + * When running `yarn build` or `yarn build-main`, this file is compiled to + * `./app/main.prod.js` using webpack. This gives us some performance wins. + * + * @flow + */ +import { app, shell, BrowserWindow, ipcMain } from 'electron'; +import log from 'electron-log'; +import MenuBuilder from './menu'; + +export default class AppUpdater { + constructor() { + log.transports.file.level = 'info'; + } +} + +let mainWindow = null; + +if (process.env.NODE_ENV === 'production') { + const sourceMapSupport = require('source-map-support'); + sourceMapSupport.install(); +} + +if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + require('electron-debug')(); +} + +const installExtensions = async () => { + const installer = require('electron-devtools-installer'); + const forceDownload = !!process.env.UPGRADE_EXTENSIONS; + const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS']; + + return Promise.all(extensions.map(name => installer.default(installer[name], forceDownload))).catch(console.log); +}; + +let waitingForClose = false; +let proceedToClose = false; + +const createWindow = async () => { + if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + await installExtensions(); + } + + mainWindow = new BrowserWindow({ + show: false, + width: 1300, + height: 728, + minHeight: 500, + minWidth: 1100, + webPreferences: { + // Allow node integration because we're only loading local content here. + nodeIntegration: true + } + }); + + mainWindow.loadURL(`file://${__dirname}/app.html`); + + app.on('web-contents-created', (event, contents) => { + contents.on('new-window', async (eventInner, navigationUrl) => { + // In this example, we'll ask the operating system + // to open this event's url in the default browser. + console.log('attempting to open window', navigationUrl); + + eventInner.preventDefault(); + + await shell.openExternal(navigationUrl); + }); + }); + + // @TODO: Use 'ready-to-show' event + // https://github.com/electron/electron/blob/master/docs/api/browser-window.md#using-ready-to-show-event + mainWindow.webContents.on('did-finish-load', () => { + if (!mainWindow) { + throw new Error('"mainWindow" is not defined'); + } + if (process.env.START_MINIMIZED) { + mainWindow.minimize(); + } else { + mainWindow.show(); + mainWindow.focus(); + } + }); + + mainWindow.on('close', event => { + // If we are clear to close, then return and allow everything to close + if (proceedToClose) { + return; + } + + // If we're already waiting for close, then don't allow another close event to actually close the window + if (waitingForClose) { + console.log('Waiting for close... Timeout in 10s'); + event.preventDefault(); + return; + } + + waitingForClose = true; + event.preventDefault(); + + ipcMain.on('appquitdone', () => { + waitingForClose = false; + proceedToClose = true; + app.quit(); + }); + + // $FlowFixMe + mainWindow.webContents.send('appquitting'); + + // Failsafe, timeout after 3 seconds + setTimeout(() => { + waitingForClose = false; + proceedToClose = true; + console.log('Timeout, quitting'); + + app.quit(); + }, 3 * 1000); + }); + + mainWindow.on('closed', () => { + mainWindow = null; + }); + + const menuBuilder = new MenuBuilder(mainWindow); + menuBuilder.buildMenu(); + + // Remove this if your app does not use auto updates + // eslint-disable-next-line + new AppUpdater(); +}; + +/** + * Add event listeners... + */ + +app.on('window-all-closed', () => { + app.quit(); +}); + +app.on('ready', createWindow); + +app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) createWindow(); +}); diff --git a/app/main.prod.js.LICENSE b/app/main.prod.js.LICENSE new file mode 100644 index 00000000..15036cdc --- /dev/null +++ b/app/main.prod.js.LICENSE @@ -0,0 +1 @@ +/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ diff --git a/app/menu.js b/app/menu.js new file mode 100644 index 00000000..3f3cb5bc --- /dev/null +++ b/app/menu.js @@ -0,0 +1,367 @@ +// @flow +import { app, Menu, shell, BrowserWindow } from 'electron'; + +export default class MenuBuilder { + mainWindow: BrowserWindow; + + constructor(mainWindow: BrowserWindow) { + this.mainWindow = mainWindow; + } + + buildMenu() { + if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') { + this.setupDevelopmentEnvironment(); + } + + const template = process.platform === 'darwin' ? this.buildDarwinTemplate() : this.buildDefaultTemplate(); + + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + + return menu; + } + + setupDevelopmentEnvironment() { + this.mainWindow.openDevTools(); + this.mainWindow.webContents.on('context-menu', (e, props) => { + const { x, y } = props; + + Menu.buildFromTemplate([ + { + label: 'Inspect element', + click: () => { + this.mainWindow.inspectElement(x, y); + } + } + ]).popup(this.mainWindow); + }); + } + + buildDarwinTemplate() { + const { mainWindow } = this; + + const subMenuAbout = { + label: 'Zecwallet Lite', + submenu: [ + { + label: 'About Zecwallet Lite', + selector: 'orderFrontStandardAboutPanel:', + click: () => { + mainWindow.webContents.send('about'); + } + }, + { type: 'separator' }, + { label: 'Services', submenu: [] }, + { type: 'separator' }, + { + label: 'Hide Zecwallet Lite', + accelerator: 'Command+H', + selector: 'hide:' + }, + { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:' + }, + { label: 'Show All', selector: 'unhideAllApplications:' }, + { type: 'separator' }, + { + label: 'Quit', + accelerator: 'Command+Q', + click: () => { + app.quit(); + } + } + ] + }; + const subMenuEdit = { + label: 'Edit', + submenu: [ + { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, + { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, + { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, + { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, + { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:' + } + ] + }; + const subMenuViewDev = { + label: 'Wallet', + submenu: [ + { + label: 'Wallet Seed', + click: () => { + mainWindow.webContents.send('seed'); + } + }, + { + label: '&Export All Private Keys', + click: () => { + mainWindow.webContents.send('exportall'); + } + }, + { + label: '&Rescan', + click: () => { + mainWindow.webContents.send('rescan'); + } + }, + { + label: 'View Lightwalletd Info', + click: () => { + this.mainWindow.webContents.send('zcashd'); + } + }, + { + label: 'Connect Mobile App', + click: () => { + this.mainWindow.webContents.send('connectmobile'); + } + }, + { type: 'separator' }, + { + label: 'Encrypt Wallet', + click: () => { + this.mainWindow.webContents.send('encrypt'); + } + }, + { + label: 'Remove Wallet Encryption', + click: () => { + this.mainWindow.webContents.send('decrypt'); + } + }, + { + label: 'Unlock', + click: () => { + this.mainWindow.webContents.send('unlock'); + } + } + // { type: 'separator' }, + // { + // label: 'Toggle Developer Tools', + // accelerator: 'Alt+Command+I', + // click: () => { + // this.mainWindow.toggleDevTools(); + // } + // } + ] + }; + const subMenuViewProd = { + label: 'Wallet', + submenu: [ + { + label: 'Wallet Seed', + click: () => { + mainWindow.webContents.send('seed'); + } + }, + { + label: '&Export All Private Keys', + click: () => { + mainWindow.webContents.send('exportall'); + } + }, + { + label: '&Rescan', + click: () => { + mainWindow.webContents.send('rescan'); + } + }, + { + label: 'Server info', + click: () => { + this.mainWindow.webContents.send('zcashd'); + } + }, + { + label: 'Connect Mobile App', + click: () => { + this.mainWindow.webContents.send('connectmobile'); + } + }, + { type: 'separator' }, + { + label: 'Encrypt Wallet', + click: () => { + this.mainWindow.webContents.send('encrypt'); + } + }, + { + label: 'Remove Wallet Encryption', + click: () => { + this.mainWindow.webContents.send('decrypt'); + } + }, + { + label: 'Unlock', + click: () => { + this.mainWindow.webContents.send('unlock'); + } + } + ] + }; + const subMenuWindow = { + label: 'Window', + submenu: [ + { + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:' + }, + { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, + { type: 'separator' }, + { label: 'Bring All to Front', selector: 'arrangeInFront:' } + ] + }; + const subMenuHelp = { + label: 'Help', + submenu: [ + { + label: 'Donate', + click() { + mainWindow.webContents.send('donate'); + } + }, + { + label: 'Check github.com for updates', + click() { + shell.openExternal('https://github.com/adityapk00/zecwallet-lite/releases'); + } + }, + { + label: 'File a bug...', + click() { + shell.openExternal('https://github.com/adityapk00/zecwallet-lite/issues'); + } + } + ] + }; + + const subMenuView = process.env.NODE_ENV === 'development' ? subMenuViewDev : subMenuViewProd; + + return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp]; + } + + buildDefaultTemplate() { + const { mainWindow } = this; + + const templateDefault = [ + { + label: '&File', + submenu: [ + { + label: '&Pay URI', + accelerator: 'Ctrl+P', + click: () => { + mainWindow.webContents.send('payuri'); + } + }, + { + label: '&Close', + accelerator: 'Ctrl+W', + click: () => { + this.mainWindow.close(); + } + } + ] + }, + { + label: '&Wallet', + submenu: [ + { + label: 'Wallet Seed', + click: () => { + mainWindow.webContents.send('seed'); + } + }, + { + label: '&Export All Private Keys', + click: () => { + mainWindow.webContents.send('exportall'); + } + }, + { + label: '&Rescan', + click: () => { + mainWindow.webContents.send('rescan'); + } + }, + { + label: 'Server info', + click: () => { + this.mainWindow.webContents.send('zcashd'); + } + }, + { + label: 'Connect Mobile App', + click: () => { + this.mainWindow.webContents.send('connectmobile'); + } + }, + // { + // label: 'Devtools', + // click: () => { + // mainWindow.webContents.openDevTools(); + // } + // }, + { type: 'separator' }, + { + label: 'Encrypt Wallet', + click: () => { + this.mainWindow.webContents.send('encrypt'); + } + }, + { + label: 'Remove Wallet Encryption', + click: () => { + this.mainWindow.webContents.send('decrypt'); + } + }, + { + label: 'Unlock', + click: () => { + this.mainWindow.webContents.send('unlock'); + } + } + ] + }, + { + label: 'Help', + submenu: [ + { + label: 'About Zecwallet Lite', + click: () => { + mainWindow.webContents.send('about'); + } + }, + { + label: 'Donate', + click() { + mainWindow.webContents.send('donate'); + } + }, + { + label: 'Check github.com for updates', + click() { + shell.openExternal('https://github.com/adityapk00/zecwallet-lite/releases'); + } + }, + { + label: 'File a bug...', + click() { + shell.openExternal('https://github.com/adityapk00/zecwallet-lite/issues'); + } + } + ] + } + ]; + + return templateDefault; + } +} diff --git a/app/package-lock.json b/app/package-lock.json new file mode 100644 index 00000000..89857430 --- /dev/null +++ b/app/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "electron-react-boilerplate", + "version": "0.18.1", + "lockfileVersion": 1 +} diff --git a/app/package.json b/app/package.json new file mode 100644 index 00000000..65cb9f51 --- /dev/null +++ b/app/package.json @@ -0,0 +1,18 @@ +{ + "name": "zecwallet", + "productName": "Zecwallet Lite", + "version": "1.1.0", + "description": "Zecwallet Lite", + "main": "./main.prod.js", + "author": { + "name": "Aditya Kulkarni", + "email": "aditya@zecwallet.co", + "url": "https://github.com/adityapk00/zecwallet-electron" + }, + "scripts": { + "electron-rebuild": "node -r ../internals/scripts/BabelRegister.js ../internals/scripts/ElectronRebuild.js", + "postinstall": "yarn electron-rebuild" + }, + "license": "MIT", + "dependencies": {} +} diff --git a/app/rpc.js b/app/rpc.js new file mode 100644 index 00000000..8c63c6e0 --- /dev/null +++ b/app/rpc.js @@ -0,0 +1,379 @@ +/* eslint-disable max-classes-per-file */ +import axios from 'axios'; +import { TotalBalance, AddressBalance, Transaction, RPCConfig, TxDetail, Info } from './components/AppState'; +import native from '../native/index.node'; + +export default class RPC { + rpcConfig: RPCConfig; + + fnSetInfo: Info => void; + + fnSetTotalBalance: TotalBalance => void; + + fnSetAddressesWithBalance: (AddressBalance[]) => void; + + fnSetTransactionsList: (Transaction[]) => void; + + fnSetAllAddresses: (string[]) => void; + + fnSetZecPrice: number => void; + + refreshTimerID: TimerID; + + priceTimerID: TimerID; + + constructor( + fnSetTotalBalance: TotalBalance => void, + fnSetAddressesWithBalance: (AddressBalance[]) => void, + fnSetTransactionsList: (Transaction[]) => void, + fnSetAllAddresses: (string[]) => void, + fnSetInfo: Info => void, + fnSetZecPrice: number => void + ) { + this.fnSetTotalBalance = fnSetTotalBalance; + this.fnSetAddressesWithBalance = fnSetAddressesWithBalance; + this.fnSetTransactionsList = fnSetTransactionsList; + this.fnSetAllAddresses = fnSetAllAddresses; + this.fnSetInfo = fnSetInfo; + this.fnSetZecPrice = fnSetZecPrice; + } + + async configure(rpcConfig: RPCConfig) { + this.rpcConfig = rpcConfig; + + if (!this.refreshTimerID) { + this.refreshTimerID = setTimeout(() => this.refresh(), 1000); + } + + if (!this.priceTimerID) { + this.priceTimerID = setTimeout(() => this.getZecPrice(), 1000); + } + } + + setupNextFetch(lastBlockHeight: number) { + this.refreshTimerID = setTimeout(() => this.refresh(lastBlockHeight), 60 * 1000); + } + + static doSync() { + const syncstr = native.litelib_execute('sync', ''); + console.log(`Sync exec result: ${syncstr}`); + } + + static doRescan() { + const syncstr = native.litelib_execute('rescan', ''); + console.log(`rescan exec result: ${syncstr}`); + } + + static doSyncStatus(): string { + const syncstr = native.litelib_execute('syncstatus', ''); + console.log(`syncstatus: ${syncstr}`); + return syncstr; + } + + static doSave() { + const savestr = native.litelib_execute('save', ''); + console.log(`Sync status: ${savestr}`); + } + + async refresh(lastBlockHeight: number) { + const latestBlockHeight = await this.fetchInfo(); + + if (!lastBlockHeight || lastBlockHeight < latestBlockHeight) { + // If the latest block height has changed, make sure to sync + await RPC.doSync(); + + const balP = this.fetchTotalBalance(); + const txns = this.fetchTandZTransactions(latestBlockHeight); + + await balP; + await txns; + + // All done, set up next fetch + console.log(`Finished full refresh at ${latestBlockHeight}`); + } else { + // Still at the latest block + console.log('Already have latest block, waiting for next refresh'); + } + + this.setupNextFetch(latestBlockHeight); + } + + // Special method to get the Info object. This is used both internally and by the Loading screen + static getInfoObject() { + const infostr = native.litelib_execute('info', ''); + const infoJSON = JSON.parse(infostr); + + const info = new Info(); + info.testnet = infoJSON.chain_name === 'test'; + info.latestBlock = infoJSON.latest_block_height; + info.connections = 1; + info.version = infoJSON.version; + info.verificationProgress = 1; + info.currencyName = info.testnet ? 'TAZ' : 'ZEC'; + info.solps = 0; + + const encStatus = native.litelib_execute('encryptionstatus', ''); + const encJSON = JSON.parse(encStatus); + info.encrypted = encJSON.encrypted; + info.locked = encJSON.locked; + + return info; + } + + async fetchInfo(): number { + const info = RPC.getInfoObject(this.rpcConfig); + + this.fnSetInfo(info); + + return info.latestBlock; + } + + // This method will get the total balances + async fetchTotalBalance() { + const balanceStr = native.litelib_execute('balance', ''); + const balanceJSON = JSON.parse(balanceStr); + + // Total Balance + const balance = new TotalBalance(); + balance.private = balanceJSON.zbalance / 10 ** 8; + balance.transparent = balanceJSON.tbalance / 10 ** 8; + balance.verifiedPrivate = balanceJSON.verified_zbalance / 10 ** 8; + balance.total = balance.private + balance.transparent; + this.fnSetTotalBalance(balance); + + // Fetch pending notes and UTXOs + const pendingNotes = native.litelib_execute('notes', ''); + const pendingJSON = JSON.parse(pendingNotes); + + const pendingAddressBalances = new Map(); + + // Process sapling notes + pendingJSON.pending_notes.forEach(s => { + pendingAddressBalances.set(s.address, s.value); + }); + + // Process UTXOs + pendingJSON.pending_utxos.forEach(s => { + pendingAddressBalances.set(s.address, s.value); + }); + + // Addresses with Balance. The lite client reports balances in zatoshi, so divide by 10^8; + const zaddresses = balanceJSON.z_addresses + .map(o => { + // If this has any unconfirmed txns, show that in the UI + const ab = new AddressBalance(o.address, o.zbalance / 10 ** 8); + if (pendingAddressBalances.has(ab.address)) { + ab.containsPending = true; + } + return ab; + }) + .filter(ab => ab.balance > 0); + + const taddresses = balanceJSON.t_addresses + .map(o => { + // If this has any unconfirmed txns, show that in the UI + const ab = new AddressBalance(o.address, o.balance / 10 ** 8); + if (pendingAddressBalances.has(ab.address)) { + ab.containsPending = true; + } + return ab; + }) + .filter(ab => ab.balance > 0); + + const addresses = zaddresses.concat(taddresses); + + this.fnSetAddressesWithBalance(addresses); + + // Also set all addresses + const allZAddresses = balanceJSON.z_addresses.map(o => o.address); + const allTAddresses = balanceJSON.t_addresses.map(o => o.address); + const allAddresses = allZAddresses.concat(allTAddresses); + + this.fnSetAllAddresses(allAddresses); + } + + static getPrivKeyAsString(address: string): string { + const privKeyStr = native.litelib_execute('export', address); + const privKeyJSON = JSON.parse(privKeyStr); + + return privKeyJSON[0].private_key; + } + + static createNewAddress(zaddress: boolean) { + const addrStr = native.litelib_execute('new', zaddress ? 'z' : 't'); + const addrJSON = JSON.parse(addrStr); + + return addrJSON[0]; + } + + static fetchSeed(): string { + const seedStr = native.litelib_execute('seed', ''); + const seedJSON = JSON.parse(seedStr); + + return seedJSON.seed; + } + + // Fetch all T and Z transactions + async fetchTandZTransactions(latestBlockHeight: number) { + const listStr = native.litelib_execute('list', ''); + const listJSON = JSON.parse(listStr); + + const txlist = listJSON.map(tx => { + const transaction = new Transaction(); + + const type = tx.outgoing_metadata ? 'sent' : 'receive'; + + transaction.address = + // eslint-disable-next-line no-nested-ternary + type === 'sent' ? (tx.outgoing_metadata.length > 0 ? tx.outgoing_metadata[0].address : '') : tx.address; + transaction.type = type; + transaction.amount = tx.amount / 10 ** 8; + transaction.confirmations = latestBlockHeight - tx.block_height + 1; + transaction.txid = tx.txid; + transaction.time = tx.datetime; + if (tx.outgoing_metadata) { + transaction.detailedTxns = tx.outgoing_metadata.map(o => { + const detail = new TxDetail(); + detail.address = o.address; + detail.amount = o.value / 10 ** 8; + detail.memo = o.memo; + + return detail; + }); + } else { + transaction.detailedTxns = [new TxDetail()]; + transaction.detailedTxns[0].address = tx.address; + transaction.detailedTxns[0].amount = tx.amount / 10 ** 8; + transaction.detailedTxns[0].memo = tx.memo; + } + + return transaction; + }); + + txlist.sort((t1, t2) => t1.confirmations - t2.confirmations); + + this.fnSetTransactionsList(txlist); + } + + // Send a transaction using the already constructed sendJson structure + sendTransaction(sendJson: []): string { + let sendStr; + try { + sendStr = native.litelib_execute('send', JSON.stringify(sendJson)); + } catch (err) { + // TODO Show a modal with the error + console.log(`Error sending Tx: ${err}`); + throw err; + } + + if (sendStr.startsWith('Error')) { + // Throw the proper error + throw sendStr.split(/[\r\n]+/)[0]; + } + + console.log(`Send response: ${sendStr}`); + const sendJSON = JSON.parse(sendStr); + const { txid, error } = sendJSON; + + if (error) { + console.log(`Error sending Tx: ${error}`); + throw error; + } else { + // And refresh data (full refresh) + this.refresh(null); + + return txid; + } + } + + async encryptWallet(password): boolean { + const resultStr = native.litelib_execute('encrypt', password); + const resultJSON = JSON.parse(resultStr); + + // To update the wallet encryption status + this.fetchInfo(); + + // And save the wallet + RPC.doSave(); + + return resultJSON.result === 'success'; + } + + async decryptWallet(password): boolean { + const resultStr = native.litelib_execute('decrypt', password); + const resultJSON = JSON.parse(resultStr); + + // To update the wallet encryption status + this.fetchInfo(); + + // And save the wallet + RPC.doSave(); + + return resultJSON.result === 'success'; + } + + async lockWallet(): boolean { + const resultStr = native.litelib_execute('lock', ''); + const resultJSON = JSON.parse(resultStr); + + // To update the wallet encryption status + this.fetchInfo(); + + return resultJSON.result === 'success'; + } + + async unlockWallet(password: string): boolean { + const resultStr = native.litelib_execute('unlock', password); + const resultJSON = JSON.parse(resultStr); + + // To update the wallet encryption status + this.fetchInfo(); + + return resultJSON.result === 'success'; + } + + setupNextZecPriceRefresh(retryCount: number, timeout: number) { + // Every hour + this.priceTimerID = setTimeout(() => this.getZecPrice(retryCount), timeout); + } + + async getZecPrice(retryCount: number) { + if (!retryCount) { + // eslint-disable-next-line no-param-reassign + retryCount = 0; + } + + try { + const response = await new Promise((resolve, reject) => { + axios('https://api.coincap.io/v2/rates/zcash', { + method: 'GET' + }) + .then(r => resolve(r.data)) + .catch(err => { + reject(err); + }); + }); + + const zecData = response.data; + if (zecData) { + this.fnSetZecPrice(zecData.rateUsd); + this.setupNextZecPriceRefresh(0, 1000 * 60 * 60); // Every hour + } else { + this.fnSetZecPrice(null); + let timeout = 1000 * 60; // 1 minute + if (retryCount > 5) { + timeout = 1000 * 60 * 60; // an hour later + } + this.setupNextZecPriceRefresh(retryCount + 1, timeout); + } + } catch (err) { + console.log(err); + this.fnSetZecPrice(null); + let timeout = 1000 * 60; // 1 minute + if (retryCount > 5) { + timeout = 1000 * 60 * 60; // an hour later + } + this.setupNextZecPriceRefresh(retryCount + 1, timeout); + } + } +} diff --git a/app/utils/.gitkeep b/app/utils/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/app/utils/AddressbookImpl.js b/app/utils/AddressbookImpl.js new file mode 100644 index 00000000..06f32fed --- /dev/null +++ b/app/utils/AddressbookImpl.js @@ -0,0 +1,37 @@ +import fs from 'fs'; +import path from 'path'; +import { remote } from 'electron'; +import { AddressBookEntry } from '../components/AppState'; + +// Utility class to save / read the address book. +export default class AddressbookImpl { + static async getFileName() { + const dir = path.join(remote.app.getPath('appData'), 'zecwallet'); + if (!fs.existsSync(dir)) { + await fs.promises.mkdir(dir); + } + const fileName = path.join(dir, 'AddressBook.json'); + + return fileName; + } + + // Write the address book to disk + static async writeAddressBook(ab: AddressBookEntry[]) { + const fileName = await this.getFileName(); + + await fs.promises.writeFile(fileName, JSON.stringify(ab)); + } + + // Read the address book + static async readAddressBook(): AddressBookEntry[] { + const fileName = await this.getFileName(); + + try { + return JSON.parse(await fs.promises.readFile(fileName)); + } catch (err) { + // File probably doesn't exist, so return nothing + console.log(err); + return []; + } + } +} diff --git a/app/utils/SentTxStore.js b/app/utils/SentTxStore.js new file mode 100644 index 00000000..a66f65e0 --- /dev/null +++ b/app/utils/SentTxStore.js @@ -0,0 +1,50 @@ +import os from 'os'; +import path from 'path'; +import fs from 'fs'; +import { remote } from 'electron'; +import { Transaction, TxDetail } from '../components/AppState'; + +export default class SentTxStore { + static locateSentTxStore() { + if (os.platform() === 'darwin') { + return path.join(remote.app.getPath('appData'), 'Zcash', 'senttxstore.dat'); + } + + if (os.platform() === 'linux') { + return path.join( + remote.app.getPath('home'), + '.local', + 'share', + 'zec-qt-wallet-org', + 'zec-qt-wallet', + 'senttxstore.dat' + ); + } + + return path.join(remote.app.getPath('appData'), 'Zcash', 'senttxstore.dat'); + } + + static async loadSentTxns(): Transaction[] { + try { + const sentTx = JSON.parse(await fs.promises.readFile(SentTxStore.locateSentTxStore())); + + return sentTx.map(s => { + const transction = new Transaction(); + transction.type = s.type; + transction.amount = s.amount; + transction.address = s.from; + transction.txid = s.txid; + transction.time = s.datetime; + transction.detailedTxns = [new TxDetail()]; + transction.detailedTxns[0].address = s.address; + transction.detailedTxns[0].amount = s.amount; + transction.detailedTxns[0].memo = s.memo; + + return transction; + }); + } catch (err) { + // If error for whatever reason (most likely, file not found), just return an empty array + return []; + } + } +} diff --git a/app/utils/utils.js b/app/utils/utils.js new file mode 100644 index 00000000..9d34c09d --- /dev/null +++ b/app/utils/utils.js @@ -0,0 +1,112 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-else-return */ +/* eslint-disable no-plusplus */ +export const NO_CONNECTION: string = 'Could not connect to zcashd'; + +export default class Utils { + static isSapling(addr: string): boolean { + if (!addr) return false; + return new RegExp('^z[a-z0-9]{77}$').test(addr) || new RegExp('^ztestsapling[a-z0-9]{76}$').test(addr); + } + + static isSprout(addr: string): boolean { + if (!addr) return false; + return new RegExp('^z[a-zA-Z0-9]{94}$').test(addr); + } + + static isZaddr(addr: string): boolean { + if (!addr) return false; + return Utils.isSapling(addr) || Utils.isSprout(addr); + } + + static isTransparent(addr: string): boolean { + if (!addr) return false; + return new RegExp('^t[a-zA-Z0-9]{34}$').test(addr); + } + + // Convert to max 8 decimal places, and remove trailing zeros + static maxPrecision(v: number): string { + if (!v) return v; + + if (typeof v === 'string' || v instanceof String) { + // eslint-disable-next-line no-param-reassign + v = parseFloat(v); + } + + return v.toFixed(8); + } + + static splitZecAmountIntoBigSmall(zecValue: number) { + if (!zecValue) { + return { bigPart: zecValue, smallPart: '' }; + } + + let bigPart = Utils.maxPrecision(zecValue); + let smallPart = ''; + + if (bigPart.indexOf('.') >= 0) { + const decimalPart = bigPart.substr(bigPart.indexOf('.') + 1); + if (decimalPart.length > 4) { + smallPart = decimalPart.substr(4); + bigPart = bigPart.substr(0, bigPart.length - smallPart.length); + + // Pad the small part with trailing 0s + while (smallPart.length < 4) { + smallPart += '0'; + } + } + } + + if (smallPart === '0000') { + smallPart = ''; + } + + return { bigPart, smallPart }; + } + + static splitStringIntoChunks(s: string, numChunks: number) { + if (numChunks > s.length) return [s]; + if (s.length < 16) return [s]; + + const chunkSize = Math.round(s.length / numChunks); + const chunks = []; + for (let i = 0; i < numChunks - 1; i++) { + chunks.push(s.substr(i * chunkSize, chunkSize)); + } + // Last chunk might contain un-even length + chunks.push(s.substr((numChunks - 1) * chunkSize)); + + return chunks; + } + + static nextToAddrID: number = 0; + + static getNextToAddrID(): number { + // eslint-disable-next-line no-plusplus + return Utils.nextToAddrID++; + } + + static getDonationAddress(testnet: boolean): string { + if (testnet) { + return 'ztestsapling1wn6889vznyu42wzmkakl2effhllhpe4azhu696edg2x6me4kfsnmqwpglaxzs7tmqsq7kudemp5'; + } else { + return 'zs1gv64eu0v2wx7raxqxlmj354y9ycznwaau9kduljzczxztvs4qcl00kn2sjxtejvrxnkucw5xx9u'; + } + } + + static getDefaultDonationAmount(testnet: boolean): number { + return 0.1; + } + + static getDefaultDonationMemo(testnet: boolean): string { + return 'Thanks for supporting Zecwallet!'; + } + + static getZecToUsdString(price: number | null, zecValue: number | null): string { + if (!price || !zecValue) { + return 'USD --'; + } + + return `USD ${(price * zecValue).toFixed(2)}`; + } +} diff --git a/app/yarn.lock b/app/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/app/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/application.qrc b/application.qrc deleted file mode 100644 index 33408fa8..00000000 --- a/application.qrc +++ /dev/null @@ -1,39 +0,0 @@ - - - res/Ubuntu-R.ttf - - - res/connected.gif - res/loading.gif - res/paymentreq.gif - res/icon.ico - - - res/zcashdlogo.gif - res/logobig.gif - - - res/zec_qt_wallet_es.qm - res/zec_qt_wallet_fr.qm - res/zec_qt_wallet_pt.qm - res/zec_qt_wallet_it.qm - res/zec_qt_wallet_zh.qm - res/zec_qt_wallet_tr.qm - - - res/css/blue.css - res/css/dark.css - res/css/default.css - res/css/light.css - - - res/images/blue/unchecked.png - res/images/blue/checked.png - res/images/blue/blue_downArrow.png - res/images/blue/blue_downArrow_small.png - res/images/blue/blue_upArrow_small.png - res/images/blue/blue_leftArrow_small.png - res/images/blue/blue_rightArrow_small.png - res/images/blue/blue_qtreeview_selected.png - - diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..1b7d9b6a --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,39 @@ +image: Visual Studio 2017 + +platform: + - x64 + +environment: + matrix: + - nodejs_version: 10 + +cache: + - '%LOCALAPPDATA%/Yarn' + - node_modules + - app/node_modules + - flow-typed + - '%USERPROFILE%\.electron' + +matrix: + fast_finish: true + +build: off + +version: '{build}' + +shallow_clone: true + +clone_depth: 1 + +install: + - ps: Install-Product node $env:nodejs_version x64 + - set CI=true + - yarn + +test_script: + - yarn package-ci + - yarn lint + # - yarn flow + - yarn test + - yarn build-e2e + - yarn test-e2e diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..a23fb7c6 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,66 @@ +/* eslint global-require: off */ + +const developmentEnvironments = ['development', 'test']; + +const developmentPlugins = [require('react-hot-loader/babel')]; + +const productionPlugins = [ + require('babel-plugin-dev-expression'), + + // babel-preset-react-optimize + require('@babel/plugin-transform-react-constant-elements'), + require('@babel/plugin-transform-react-inline-elements'), + require('babel-plugin-transform-react-remove-prop-types') +]; + +module.exports = api => { + // see docs about api at https://babeljs.io/docs/en/config-files#apicache + + const development = api.env(developmentEnvironments); + + return { + presets: [ + [ + require('@babel/preset-env'), + { + targets: { electron: require('electron/package.json').version } + } + ], + require('@babel/preset-flow'), + [require('@babel/preset-react'), { development }] + ], + plugins: [ + // Stage 0 + require('@babel/plugin-proposal-function-bind'), + + // Stage 1 + require('@babel/plugin-proposal-export-default-from'), + require('@babel/plugin-proposal-logical-assignment-operators'), + [require('@babel/plugin-proposal-optional-chaining'), { loose: false }], + [ + require('@babel/plugin-proposal-pipeline-operator'), + { proposal: 'minimal' } + ], + [ + require('@babel/plugin-proposal-nullish-coalescing-operator'), + { loose: false } + ], + require('@babel/plugin-proposal-do-expressions'), + + // Stage 2 + [require('@babel/plugin-proposal-decorators'), { legacy: true }], + require('@babel/plugin-proposal-function-sent'), + require('@babel/plugin-proposal-export-namespace-from'), + require('@babel/plugin-proposal-numeric-separator'), + require('@babel/plugin-proposal-throw-expressions'), + + // Stage 3 + require('@babel/plugin-syntax-dynamic-import'), + require('@babel/plugin-syntax-import-meta'), + [require('@babel/plugin-proposal-class-properties'), { loose: true }], + require('@babel/plugin-proposal-json-strings'), + + ...(development ? developmentPlugins : productionPlugins) + ] + }; +}; diff --git a/bin/printversion.ps1 b/bin/printversion.ps1 new file mode 100644 index 00000000..968b85f2 --- /dev/null +++ b/bin/printversion.ps1 @@ -0,0 +1 @@ +echo "::set-env name=VERSION::1.1.0" diff --git a/bin/printversion.sh b/bin/printversion.sh new file mode 100755 index 00000000..33221745 --- /dev/null +++ b/bin/printversion.sh @@ -0,0 +1,4 @@ +#!/bin/bash +VERSION="1.1.0" + +echo "::set-env name=VERSION::$VERSION" diff --git a/bin/signbinaries.sh b/bin/signbinaries.sh new file mode 100755 index 00000000..3169ba2b --- /dev/null +++ b/bin/signbinaries.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Accept the variables as command line arguments as well +POSITIONAL=() +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + -v|--version) + APP_VERSION="$2" + shift # past argument + shift # past value + ;; + *) # unknown option + POSITIONAL+=("$1") # save it in an array for later + shift # past argument + ;; +esac +done +set -- "${POSITIONAL[@]}" # restore positional parameters + +if [ -z $APP_VERSION ]; then echo "APP_VERSION is not set"; exit 1; fi + +# Store the hash and signatures here +cd release +rm -rf signatures +mkdir signatures + +# Remove previous signatures/hashes +rm -f sha256sum-$APP_VERSION.txt +rm -f signatures-$APP_VERSION.zip + +# sha256sum the binaries +sha256sum Zecwallet*$APP_VERSION* > sha256sum-$APP_VERSION.txt + +OIFS="$IFS" +IFS=$'\n' + +for i in `find ./ -iname "Zecwallet*$APP_VERSION*" -o -iname "sha256sum-$APP_VERSION.txt"`; do + echo "Signing" "$i" + gpg --batch --output "signatures/$i.sig" --detach-sig "$i" +done + +cp sha256sum-$APP_VERSION.txt signatures/ +cp ../configs/SIGNATURES_README signatures/ + +zip -r signatures-$APP_VERSION.zip signatures/ diff --git a/res/SIGNATURES_README b/configs/SIGNATURES_README similarity index 80% rename from res/SIGNATURES_README rename to configs/SIGNATURES_README index bc672ca3..93bb0f21 100644 --- a/res/SIGNATURES_README +++ b/configs/SIGNATURES_README @@ -4,10 +4,9 @@ Verify the hashes by running: sha256sum -c sha256sum-vX.Y.Z.txt Verify signatures: -1. First, import the public key (Available on GitHub +1. First, import the public key (Available on GitHub at https://github.com/ZcashFoundation/zecwallet/blob/master/public_key.asc) gpg --import public_key.asc -2. Verify signature +2. Verify signature gpg --verify - diff --git a/configs/entitlements.mac.inherit.plist b/configs/entitlements.mac.inherit.plist new file mode 100644 index 00000000..273c351b --- /dev/null +++ b/configs/entitlements.mac.inherit.plist @@ -0,0 +1,12 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + + \ No newline at end of file diff --git a/configs/webpack.config.base.js b/configs/webpack.config.base.js new file mode 100644 index 00000000..a9e41c49 --- /dev/null +++ b/configs/webpack.config.base.js @@ -0,0 +1,51 @@ +/** + * Base webpack config used across other specific configs + */ + +import path from 'path'; +import webpack from 'webpack'; +import { dependencies as externals } from '../app/package.json'; + +export default { + externals: [...Object.keys(externals || {}), 'bufferutil', 'utf-8-validate'], + + module: { + rules: [ + { + test: /\.jsx?$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + cacheDirectory: true + } + } + } + ] + }, + + output: { + path: path.join(__dirname, '..', 'app'), + // https://github.com/webpack/webpack/issues/1114 + libraryTarget: 'commonjs2' + }, + + /** + * Determine the array of extensions that should be used to resolve modules. + */ + resolve: { + extensions: ['.js', '.jsx', '.json'], + modules: [path.join(__dirname, '..', 'app'), 'node_modules'], + alias: { + ws: path.resolve(path.join(__dirname, '..', 'node_modules/ws/index.js')) + } + }, + + plugins: [ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production' + }), + + new webpack.NamedModulesPlugin() + ] +}; diff --git a/configs/webpack.config.eslint.js b/configs/webpack.config.eslint.js new file mode 100644 index 00000000..bd000487 --- /dev/null +++ b/configs/webpack.config.eslint.js @@ -0,0 +1,4 @@ +/* eslint import/no-unresolved: off, import/no-self-import: off */ +require('@babel/register'); + +module.exports = require('./webpack.config.renderer.dev.babel').default; diff --git a/configs/webpack.config.main.prod.babel.js b/configs/webpack.config.main.prod.babel.js new file mode 100644 index 00000000..4a7063e8 --- /dev/null +++ b/configs/webpack.config.main.prod.babel.js @@ -0,0 +1,72 @@ +/** + * Webpack config for production electron main process + */ + +import path from 'path'; +import webpack from 'webpack'; +import merge from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import baseConfig from './webpack.config.base'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; + +CheckNodeEnv('production'); + +export default merge.smart(baseConfig, { + devtool: 'source-map', + + mode: 'production', + + target: 'electron-main', + + entry: './app/main.dev', + + output: { + path: path.join(__dirname, '..'), + filename: './app/main.prod.js' + }, + + optimization: { + minimizer: process.env.E2E_BUILD + ? [] + : [ + new TerserPlugin({ + parallel: true, + sourceMap: true, + cache: true + }) + ] + }, + + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', + openAnalyzer: process.env.OPEN_ANALYZER === 'true' + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + START_MINIMIZED: false + }) + ], + + /** + * Disables webpack processing of __dirname and __filename. + * If you run the bundle in node.js it falls back to these values of node.js. + * https://github.com/webpack/webpack/issues/2010 + */ + node: { + __dirname: false, + __filename: false + } +}); diff --git a/configs/webpack.config.renderer.dev.babel.js b/configs/webpack.config.renderer.dev.babel.js new file mode 100644 index 00000000..d49c1af3 --- /dev/null +++ b/configs/webpack.config.renderer.dev.babel.js @@ -0,0 +1,291 @@ +/* eslint global-require: off, import/no-dynamic-require: off */ + +/** + * Build config for development electron renderer process that uses + * Hot-Module-Replacement + * + * https://webpack.js.org/concepts/hot-module-replacement/ + */ + +import path from 'path'; +import fs from 'fs'; +import webpack from 'webpack'; +import chalk from 'chalk'; +import merge from 'webpack-merge'; +import { spawn, execSync } from 'child_process'; +import baseConfig from './webpack.config.base'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; + +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + CheckNodeEnv('development'); +} + +const port = process.env.PORT || 1212; +const publicPath = `http://localhost:${port}/dist`; +const dll = path.join(__dirname, '..', 'dll'); +const manifest = path.resolve(dll, 'renderer.json'); +const requiredByDLLConfig = module.parent.filename.includes('webpack.config.renderer.dev.dll'); + +/** + * Warn if the DLL is not built + */ +if (!requiredByDLLConfig && !(fs.existsSync(dll) && fs.existsSync(manifest))) { + console.log( + chalk.black.bgYellow.bold('The DLL files are missing. Sit back while we build them for you with "yarn build-dll"') + ); + execSync('yarn build-dll'); +} + +export default merge.smart(baseConfig, { + devtool: 'inline-source-map', + + mode: 'development', + + target: 'electron-renderer', + + entry: [ + ...(process.env.PLAIN_HMR ? [] : ['react-hot-loader/patch']), + `webpack-dev-server/client?http://localhost:${port}/`, + 'webpack/hot/only-dev-server', + require.resolve('../app/index') + ], + + output: { + publicPath: `http://localhost:${port}/dist/`, + filename: 'renderer.dev.js' + }, + + module: { + rules: [ + { + test: /\.jsx?$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + cacheDirectory: true + } + } + }, + { + test: /\.global\.css$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + } + ] + }, + { + test: /^((?!\.global).)*\.css$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, + sourceMap: true, + importLoaders: 1 + } + } + ] + }, + // SASS support - compile all .global.scss files and pipe it to style.css + { + test: /\.global\.(scss|sass)$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + }, + { + loader: 'sass-loader' + } + ] + }, + // SASS support - compile all other .scss files and pipe it to style.css + { + test: /^((?!\.global).)*\.(scss|sass)$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, + sourceMap: true, + importLoaders: 1 + } + }, + { + loader: 'sass-loader' + } + ] + }, + // WOFF Font + { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff' + } + } + }, + // WOFF2 Font + { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff' + } + } + }, + // TTF Font + { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/octet-stream' + } + } + }, + // EOT Font + { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + use: 'file-loader' + }, + // SVG Font + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'image/svg+xml' + } + } + }, + // Common Image Formats + { + test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, + use: 'url-loader' + }, + { + test: /\.node$/, + use: [ + { + loader: path.resolve('./internals/scripts/NativeLoader.js'), + options: { + name: '[name]-[hash].[ext]' + } + } + ] + } + ] + }, + resolve: { + alias: { + 'react-dom': '@hot-loader/react-dom', + ws: path.resolve(path.join(__dirname, '..', 'node_modules/ws/index.js')) + } + }, + plugins: [ + requiredByDLLConfig + ? null + : new webpack.DllReferencePlugin({ + context: path.join(__dirname, '..', 'dll'), + manifest: require(manifest), + sourceType: 'var' + }), + + new webpack.HotModuleReplacementPlugin({ + multiStep: true + }), + + new webpack.NoEmitOnErrorsPlugin(), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + * + * By default, use 'development' as NODE_ENV. This can be overridden with + * 'staging', for example, by changing the ENV variables in the npm scripts + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development' + }), + + new webpack.LoaderOptionsPlugin({ + debug: true + }) + ], + + node: { + __dirname: false, + __filename: false + }, + + devServer: { + port, + publicPath, + compress: true, + noInfo: true, + stats: 'errors-only', + inline: true, + lazy: false, + hot: true, + headers: { 'Access-Control-Allow-Origin': '*' }, + contentBase: path.join(__dirname, 'dist'), + watchOptions: { + aggregateTimeout: 300, + ignored: /node_modules/, + poll: 100 + }, + historyApiFallback: { + verbose: true, + disableDotRule: false + }, + before() { + if (process.env.START_HOT) { + console.log('Starting Main Process...'); + spawn('npm', ['run', 'start-main-dev'], { + shell: true, + env: process.env, + stdio: 'inherit' + }) + .on('close', code => process.exit(code)) + .on('error', spawnError => console.error(spawnError)); + } + } + } +}); diff --git a/configs/webpack.config.renderer.dev.dll.babel.js b/configs/webpack.config.renderer.dev.dll.babel.js new file mode 100644 index 00000000..f80e40fa --- /dev/null +++ b/configs/webpack.config.renderer.dev.dll.babel.js @@ -0,0 +1,74 @@ +/* eslint global-require: off, import/no-dynamic-require: off */ + +/** + * Builds the DLL for development electron renderer process + */ + +import webpack from 'webpack'; +import path from 'path'; +import merge from 'webpack-merge'; +import baseConfig from './webpack.config.base'; +import { dependencies } from '../package.json'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; + +CheckNodeEnv('development'); + +const dist = path.join(__dirname, '..', 'dll'); + +export default merge.smart(baseConfig, { + context: path.join(__dirname, '..'), + + devtool: 'eval', + + mode: 'development', + + target: 'electron-renderer', + + externals: ['fsevents', 'crypto-browserify'], + + /** + * Use `module` from `webpack.config.renderer.dev.js` + */ + module: require('./webpack.config.renderer.dev.babel').default.module, + + entry: { + renderer: Object.keys(dependencies || {}) + }, + + output: { + library: 'renderer', + path: dist, + filename: '[name].dev.dll.js', + libraryTarget: 'var' + }, + + plugins: [ + new webpack.DllPlugin({ + path: path.join(dist, '[name].json'), + name: '[name]' + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development' + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + options: { + context: path.join(__dirname, '..', 'app'), + output: { + path: path.join(__dirname, '..', 'dll') + } + } + }) + ] +}); diff --git a/configs/webpack.config.renderer.prod.babel.js b/configs/webpack.config.renderer.prod.babel.js new file mode 100644 index 00000000..15c9d402 --- /dev/null +++ b/configs/webpack.config.renderer.prod.babel.js @@ -0,0 +1,228 @@ +/** + * Build config for electron renderer process + */ + +import path from 'path'; +import webpack from 'webpack'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import OptimizeCSSAssetsPlugin from 'optimize-css-assets-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import merge from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import CheckNodeEnv from '../internals/scripts/CheckNodeEnv'; + +CheckNodeEnv('production'); + +export default merge.smart(baseConfig, { + devtool: 'source-map', + + mode: 'production', + + target: 'electron-renderer', + + entry: path.join(__dirname, '..', 'app/index'), + + output: { + path: path.join(__dirname, '..', 'app/dist'), + publicPath: './dist/', + filename: 'renderer.prod.js' + }, + + module: { + rules: [ + // Extract all .global.css to style.css as is + { + test: /\.global\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: './' + } + }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + } + ] + }, + // Pipe other styles through css modules and append to style.css + { + test: /^((?!\.global).)*\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, + sourceMap: true + } + } + ] + }, + // Add SASS support - compile all .global.scss files and pipe it to style.css + { + test: /\.global\.(scss|sass)$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + importLoaders: 1 + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + }, + // Add SASS support - compile all other .scss files and pipe it to style.css + { + test: /^((?!\.global).)*\.(scss|sass)$/, + use: [ + { + loader: MiniCssExtractPlugin.loader + }, + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[name]__[local]__[hash:base64:5]' + }, + importLoaders: 1, + sourceMap: true + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + }, + // WOFF Font + { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff' + } + } + }, + // WOFF2 Font + { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff' + } + } + }, + // TTF Font + { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/octet-stream' + } + } + }, + // EOT Font + { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + use: 'file-loader' + }, + // SVG Font + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'image/svg+xml' + } + } + }, + // Common Image Formats + { + test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, + use: 'url-loader' + }, + { + test: /\.node$/, + use: [ + { + loader: path.resolve('./internals/scripts/NativeLoader.js'), + options: { + name: '[name]-[hash].[ext]' + } + } + ] + } + ] + }, + + optimization: { + minimizer: process.env.E2E_BUILD + ? [] + : [ + new TerserPlugin({ + parallel: true, + sourceMap: true, + cache: true + }), + new OptimizeCSSAssetsPlugin({ + cssProcessorOptions: { + map: { + inline: false, + annotation: true + } + } + }) + ] + }, + + plugins: [ + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production' + }), + + new MiniCssExtractPlugin({ + filename: 'style.css' + }), + + new BundleAnalyzerPlugin({ + analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', + openAnalyzer: process.env.OPEN_ANALYZER === 'true' + }) + ] +}); diff --git a/docs/index.html b/docs/index.html deleted file mode 100755 index a82f0769..00000000 --- a/docs/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - -Hello World - - \ No newline at end of file diff --git a/docs/linguist-screenshot.png b/docs/linguist-screenshot.png deleted file mode 100644 index 2f51c62d..00000000 Binary files a/docs/linguist-screenshot.png and /dev/null differ diff --git a/docs/qt-install.PNG b/docs/qt-install.PNG deleted file mode 100644 index c06ee01b..00000000 Binary files a/docs/qt-install.PNG and /dev/null differ diff --git a/docs/screenshot-main-win.png b/docs/screenshot-main-win.png deleted file mode 100644 index 7c5610e7..00000000 Binary files a/docs/screenshot-main-win.png and /dev/null differ diff --git a/docs/screenshot-main.png b/docs/screenshot-main.png deleted file mode 100644 index 73bca46e..00000000 Binary files a/docs/screenshot-main.png and /dev/null differ diff --git a/docs/screenshot-sub.png b/docs/screenshot-sub.png deleted file mode 100644 index e0b6881d..00000000 Binary files a/docs/screenshot-sub.png and /dev/null differ diff --git a/flow-typed/module_vx.x.x.js b/flow-typed/module_vx.x.x.js new file mode 100644 index 00000000..734bb1c7 --- /dev/null +++ b/flow-typed/module_vx.x.x.js @@ -0,0 +1,3 @@ +declare module 'module' { + declare module.exports: any; +} diff --git a/internals/flow/CSSModule.js.flow b/internals/flow/CSSModule.js.flow new file mode 100644 index 00000000..6bd2a54f --- /dev/null +++ b/internals/flow/CSSModule.js.flow @@ -0,0 +1,3 @@ +// @flow + +declare export default { [key: string]: string } \ No newline at end of file diff --git a/internals/flow/WebpackAsset.js.flow b/internals/flow/WebpackAsset.js.flow new file mode 100644 index 00000000..37d49d3e --- /dev/null +++ b/internals/flow/WebpackAsset.js.flow @@ -0,0 +1,2 @@ +// @flow +declare export default string diff --git a/internals/scripts/BabelRegister.js b/internals/scripts/BabelRegister.js new file mode 100644 index 00000000..b3c9f851 --- /dev/null +++ b/internals/scripts/BabelRegister.js @@ -0,0 +1,5 @@ +const path = require('path'); + +require('@babel/register')({ + cwd: path.join(__dirname, '..', '..') +}); diff --git a/internals/scripts/CheckBuildsExist.js b/internals/scripts/CheckBuildsExist.js new file mode 100644 index 00000000..e109b9db --- /dev/null +++ b/internals/scripts/CheckBuildsExist.js @@ -0,0 +1,35 @@ +// @flow +// Check if the renderer and main bundles are built +import path from 'path'; +import chalk from 'chalk'; +import fs from 'fs'; + +function CheckBuildsExist() { + const mainPath = path.join(__dirname, '..', '..', 'app', 'main.prod.js'); + const rendererPath = path.join( + __dirname, + '..', + '..', + 'app', + 'dist', + 'renderer.prod.js' + ); + + if (!fs.existsSync(mainPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The main process is not built yet. Build it by running "yarn build-main"' + ) + ); + } + + if (!fs.existsSync(rendererPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The renderer process is not built yet. Build it by running "yarn build-renderer"' + ) + ); + } +} + +CheckBuildsExist(); diff --git a/internals/scripts/CheckNativeDep.js b/internals/scripts/CheckNativeDep.js new file mode 100644 index 00000000..7d3de967 --- /dev/null +++ b/internals/scripts/CheckNativeDep.js @@ -0,0 +1,51 @@ +// @flow +import fs from 'fs'; +import chalk from 'chalk'; +import { execSync } from 'child_process'; +import { dependencies } from '../../package.json'; + +(() => { + if (!dependencies) return; + const dependenciesKeys = Object.keys(dependencies); + const nativeDeps = fs + .readdirSync('node_modules') + .filter(folder => fs.existsSync(`node_modules/${folder}/binding.gyp`)); + try { + // Find the reason for why the dependency is installed. If it is installed + // because of a devDependency then that is okay. Warn when it is installed + // because of a dependency + const { dependencies: dependenciesObject } = JSON.parse( + execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString() + ); + const rootDependencies = Object.keys(dependenciesObject); + const filteredRootDependencies = rootDependencies.filter(rootDependency => + dependenciesKeys.includes(rootDependency) + ); + if (filteredRootDependencies.length > 0) { + const plural = filteredRootDependencies.length > 1; + console.log(` + ${chalk.whiteBright.bgYellow.bold( + 'Webpack does not work with native dependencies.' + )} +${chalk.bold(filteredRootDependencies.join(', '))} ${ + plural ? 'are native dependencies' : 'is a native dependency' + } and should be installed inside of the "./app" folder. + First uninstall the packages from "./package.json": +${chalk.whiteBright.bgGreen.bold('yarn remove your-package')} + ${chalk.bold( + 'Then, instead of installing the package to the root "./package.json":' + )} +${chalk.whiteBright.bgRed.bold('yarn add your-package')} + ${chalk.bold('Install the package to "./app/package.json"')} +${chalk.whiteBright.bgGreen.bold('cd ./app && yarn add your-package')} + Read more about native dependencies at: +${chalk.bold( + 'https://github.com/electron-react-boilerplate/electron-react-boilerplate/wiki/Module-Structure----Two-package.json-Structure' +)} + `); + process.exit(1); + } + } catch (e) { + console.log('Native dependencies could not be checked'); + } +})(); diff --git a/internals/scripts/CheckNodeEnv.js b/internals/scripts/CheckNodeEnv.js new file mode 100644 index 00000000..b2f50bcf --- /dev/null +++ b/internals/scripts/CheckNodeEnv.js @@ -0,0 +1,17 @@ +// @flow +import chalk from 'chalk'; + +export default function CheckNodeEnv(expectedEnv: string) { + if (!expectedEnv) { + throw new Error('"expectedEnv" not set'); + } + + if (process.env.NODE_ENV !== expectedEnv) { + console.log( + chalk.whiteBright.bgRed.bold( + `"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config` + ) + ); + process.exit(2); + } +} diff --git a/internals/scripts/CheckPortInUse.js b/internals/scripts/CheckPortInUse.js new file mode 100644 index 00000000..c4feaf07 --- /dev/null +++ b/internals/scripts/CheckPortInUse.js @@ -0,0 +1,19 @@ +// @flow +import chalk from 'chalk'; +import detectPort from 'detect-port'; + +(function CheckPortInUse() { + const port: string = process.env.PORT || '1212'; + + detectPort(port, (err: ?Error, availablePort: number) => { + if (port !== String(availablePort)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 yarn dev` + ) + ); + } else { + process.exit(0); + } + }); +})(); diff --git a/internals/scripts/CheckYarn.js b/internals/scripts/CheckYarn.js new file mode 100644 index 00000000..03764fcb --- /dev/null +++ b/internals/scripts/CheckYarn.js @@ -0,0 +1,7 @@ +// @flow + +if (!/yarn\.js$/.test(process.env.npm_execpath || '')) { + console.warn( + "\u001b[33mYou don't seem to be using yarn. This could produce unexpected results.\u001b[39m" + ); +} diff --git a/internals/scripts/ElectronRebuild.js b/internals/scripts/ElectronRebuild.js new file mode 100644 index 00000000..b4ace7ba --- /dev/null +++ b/internals/scripts/ElectronRebuild.js @@ -0,0 +1,31 @@ +// @flow +import path from 'path'; +import { execSync } from 'child_process'; +import fs from 'fs'; +import { dependencies } from '../../app/package.json'; + +(() => { + const nodeModulesPath = path.join( + __dirname, + '..', + '..', + 'app', + 'node_modules' + ); + + if ( + Object.keys(dependencies || {}).length > 0 && + fs.existsSync(nodeModulesPath) + ) { + const electronRebuildCmd = + '../node_modules/.bin/electron-rebuild --parallel --force --types prod,dev,optional --module-dir .'; + const cmd = + process.platform === 'win32' + ? electronRebuildCmd.replace(/\//g, '\\') + : electronRebuildCmd; + execSync(cmd, { + cwd: path.join(__dirname, '..', '..', 'app'), + stdio: 'inherit' + }); + } +})(); diff --git a/internals/scripts/NativeLoader.js b/internals/scripts/NativeLoader.js new file mode 100644 index 00000000..7cb6745d --- /dev/null +++ b/internals/scripts/NativeLoader.js @@ -0,0 +1,36 @@ +/* eslint-disable func-names */ +/* eslint-disable prefer-template */ +const loaderUtils = require('loader-utils'); +const path = require('path'); + +module.exports = function(content) { + const loaderOptions = loaderUtils.getOptions(this) || {}; + + const from = loaderOptions.from || '.'; + const name = loaderUtils.interpolateName(this, loaderOptions.name || '[name].[ext]', { + content, + context: loaderOptions.context || this.rootContext || (this.config && this.config.context) + }); + + let requirePath; + if (process.env.NODE_ENV === 'production') { + requirePath = path.posix.relative(from, name); + if (requirePath[0] !== '.') { + requirePath = './dist/' + requirePath; + } + } else { + requirePath = '../native/index.node'; + } + + console.log(`Require path: ${requirePath}`); + + if (typeof this.emitFile === 'function') { + this.emitFile(name, content, false); + this.addDependency(this.resourcePath); + } else { + throw new Error('emitFile function is not available'); + } + return `module.exports = __non_webpack_require__(${loaderUtils.stringifyRequest(this, requirePath)});`; +}; + +module.exports.raw = true; diff --git a/lib/.gitignore b/lib/.gitignore deleted file mode 100644 index 66cc7107..00000000 --- a/lib/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target/ - diff --git a/lib/Cargo.toml b/lib/Cargo.toml deleted file mode 100644 index fb85c4c0..00000000 --- a/lib/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "qtlib" -version = "0.1.0" -authors = ["ZecWallet"] -edition = "2018" - -[lib] -name = "zecwalletlite" -crate-type = ["staticlib"] - -[dependencies] -libc = "0.2.58" -lazy_static = "1.4.0" -zecwalletlitelib = { git = "https://github.com/adityapk00/zecwallet-light-cli", rev = "14fe907cf69d1c2ef01ce70fab895e56fa269b94" } diff --git a/lib/Makefile b/lib/Makefile deleted file mode 100644 index 0d2c41f5..00000000 --- a/lib/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -ifeq ($(shell uname),Darwin) - EXT := dylib - CFLAGS := "-mmacosx-version-min=10.11" -else - EXT := a - CFLAGS := "" -endif - -PWD := $(shell pwd) - -all: release - -winrelease: target/x86_64-pc-windows-gnu/release/zecwalletlite.lib - -target/x86_64-pc-windows-gnu/release/zecwalletlite.lib: src/lib.rs Cargo.toml - SODIUM_LIB_DIR="$(PWD)/libsodium-mingw/" cargo build --lib --release --target x86_64-pc-windows-gnu - -release: target/release/zecwalletlite.$(EXT) -debug: target/debug/zecwalletlite.$(EXT) - -target/release/zecwalletlite.$(EXT): src/lib.rs Cargo.toml - LIBS="" CFLAGS=$(CFLAGS) cargo build --lib --release - -target/debug/zecwalletlite.$(EXT): src/lib.rs Cargo.toml - LIBS="" CFLAGS=$(CFLAGS) cargo build --lib - -clean: - rm -rf target \ No newline at end of file diff --git a/lib/libsodium-mingw/libsodium.a b/lib/libsodium-mingw/libsodium.a deleted file mode 100644 index 363c7437..00000000 Binary files a/lib/libsodium-mingw/libsodium.a and /dev/null differ diff --git a/lib/src/lib.rs b/lib/src/lib.rs deleted file mode 100644 index 39c59894..00000000 --- a/lib/src/lib.rs +++ /dev/null @@ -1,202 +0,0 @@ -#[macro_use] -extern crate lazy_static; - -use libc::{c_char}; - -use std::ffi::{CStr, CString}; -use std::sync::{Mutex, Arc}; -use std::cell::RefCell; - -use zecwalletlitelib::{commands, lightclient::{LightClient, LightClientConfig}}; - -// We'll use a MUTEX to store a global lightclient instance, -// so we don't have to keep creating it. We need to store it here, in rust -// because we can't return such a complex structure back to C++ -lazy_static! { - static ref LIGHTCLIENT: Mutex>>> = Mutex::new(RefCell::new(None)); -} - -// Check if there is an existing wallet -#[no_mangle] -pub extern fn litelib_wallet_exists(chain_name: *const c_char) -> bool { - let chain_name_str = unsafe { - assert!(!chain_name.is_null()); - - CStr::from_ptr(chain_name).to_string_lossy().into_owned() - }; - - let config = LightClientConfig::create_unconnected(chain_name_str, None); - - println!("Wallet exists: {}", config.wallet_exists()); - config.wallet_exists() -} - -/// Create a new wallet and return the seed for the newly created wallet. -#[no_mangle] -pub extern fn litelib_initialize_new(dangerous: bool, server: *const c_char) -> *mut c_char { - let server_str = unsafe { - assert!(!server.is_null()); - - CStr::from_ptr(server).to_string_lossy().into_owned() - }; - - let server = LightClientConfig::get_server_or_default(Some(server_str)); - let (config, latest_block_height) = match LightClientConfig::create(server, dangerous) { - Ok((c, h)) => (c, h), - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - let lightclient = match LightClient::new(&config, latest_block_height) { - Ok(l) => l, - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - // Initialize logging - let _ = lightclient.init_logging(); - - let seed = match lightclient.do_seed_phrase() { - Ok(s) => s.dump(), - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); - - // Return the wallet's seed - let s_str = CString::new(seed).unwrap(); - return s_str.into_raw(); -} - -/// Restore a wallet from the seed phrase -#[no_mangle] -pub extern fn litelib_initialize_new_from_phrase(dangerous: bool, server: *const c_char, - seed: *const c_char, birthday: u64) -> *mut c_char { - let server_str = unsafe { - assert!(!server.is_null()); - - CStr::from_ptr(server).to_string_lossy().into_owned() - }; - - let seed_str = unsafe { - assert!(!seed.is_null()); - - CStr::from_ptr(seed).to_string_lossy().into_owned() - }; - - let server = LightClientConfig::get_server_or_default(Some(server_str)); - let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) { - Ok((c, h)) => (c, h), - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - let lightclient = match LightClient::new_from_phrase(seed_str, &config, birthday) { - Ok(l) => l, - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - // Initialize logging - let _ = lightclient.init_logging(); - - LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); - - let c_str = CString::new("OK").unwrap(); - return c_str.into_raw(); -} - -// Initialize a new lightclient and store its value -#[no_mangle] -pub extern fn litelib_initialize_existing(dangerous: bool, server: *const c_char) -> *mut c_char { - let server_str = unsafe { - assert!(!server.is_null()); - - CStr::from_ptr(server).to_string_lossy().into_owned() - }; - - let server = LightClientConfig::get_server_or_default(Some(server_str)); - let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) { - Ok((c, h)) => (c, h), - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - let lightclient = match LightClient::read_from_disk(&config) { - Ok(l) => l, - Err(e) => { - let e_str = CString::new(format!("Error: {}", e)).unwrap(); - return e_str.into_raw(); - } - }; - - // Initialize logging - let _ = lightclient.init_logging(); - - LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); - - let c_str = CString::new("OK").unwrap(); - return c_str.into_raw(); -} - -#[no_mangle] -pub extern fn litelib_execute(cmd: *const c_char, args: *const c_char) -> *mut c_char { - let cmd_str = unsafe { - assert!(!cmd.is_null()); - - CStr::from_ptr(cmd).to_string_lossy().into_owned() - }; - - let arg_str = unsafe { - assert!(!args.is_null()); - - CStr::from_ptr(args).to_string_lossy().into_owned() - }; - - let resp: String; - { - let lightclient: Arc; - { - let lc = LIGHTCLIENT.lock().unwrap(); - - if lc.borrow().is_none() { - let e_str = CString::new("Error: Light Client is not initialized").unwrap(); - return e_str.into_raw(); - } - - lightclient = lc.borrow().as_ref().unwrap().clone(); - }; - - let args = if arg_str.is_empty() { vec![] } else { vec![arg_str.as_ref()] }; - - resp = commands::do_user_command(&cmd_str, &args, lightclient.as_ref()).clone(); - }; - - let c_str = CString::new(resp.as_bytes()).unwrap(); - return c_str.into_raw(); -} - -/** - * Callers that receive string return values from other functions should call this to return the string - * back to rust, so it can be freed. Failure to call this function will result in a memory leak - */ -#[no_mangle] -pub extern fn litelib_rust_free_string(s: *mut c_char) { - unsafe { - if s.is_null() { return } - CString::from_raw(s) - }; -} \ No newline at end of file diff --git a/lib/zecwalletlitelib.h b/lib/zecwalletlitelib.h deleted file mode 100644 index b985fa73..00000000 --- a/lib/zecwalletlitelib.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _ZEC_PAPER_RUST_H -#define _ZEC_PAPER_RUST_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern bool litelib_wallet_exists (const char* chain_name); -extern char * litelib_initialize_new (bool dangerous, const char* server); -extern char * litelib_initialize_new_from_phrase - (bool dangerous, const char* server, const char* seed, - unsigned long long birthday); -extern char * litelib_initialize_existing (bool dangerous, const char* server); -extern char * litelib_execute (const char* s, const char* args); -extern void litelib_rust_free_string (char* s); - -#ifdef __cplusplus -} -#endif - -// This is a function implemented in connection.cpp that will process a string response from -// the litelib and turn into into a QString in a memory-safe way. -QString litelib_process_response(char* resp); - -#endif \ No newline at end of file diff --git a/native/.gitignore b/native/.gitignore new file mode 100644 index 00000000..7b020940 --- /dev/null +++ b/native/.gitignore @@ -0,0 +1,3 @@ +target/ +index.node +artifacts.json diff --git a/lib/Cargo.lock b/native/Cargo.lock similarity index 85% rename from lib/Cargo.lock rename to native/Cargo.lock index ad27a39e..d1aace54 100644 --- a/lib/Cargo.lock +++ b/native/Cargo.lock @@ -21,7 +21,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -34,6 +34,14 @@ dependencies = [ "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "aho-corasick" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "antidote" version = "1.0.0" @@ -70,7 +78,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "async-stream-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -78,9 +86,9 @@ name = "async-stream-impl" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -88,9 +96,9 @@ name = "async-trait" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -105,12 +113,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -120,7 +128,7 @@ version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -133,7 +141,7 @@ name = "base64" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -153,7 +161,7 @@ source = "git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7 dependencies = [ "bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "blake2s_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.4.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", @@ -201,7 +209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -231,7 +239,7 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.1.2" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -241,7 +249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" -version = "1.3.2" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -249,7 +257,7 @@ name = "bytes" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -266,6 +274,14 @@ dependencies = [ "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cast" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cc" version = "1.0.50" @@ -305,7 +321,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -328,10 +344,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crossbeam-utils" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -358,6 +374,11 @@ dependencies = [ "crypto_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cslice" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "digest" version = "0.8.1" @@ -381,7 +402,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -396,12 +417,21 @@ name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "error-chain" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "failure" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -410,9 +440,9 @@ name = "failure_derive" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -426,7 +456,7 @@ name = "ff" version = "0.4.0" source = "git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4#188537ea025fcb7fbdfc11266f307a084a5451e4" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "ff_derive 0.3.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -450,7 +480,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -467,7 +497,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -482,7 +512,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -514,15 +544,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures-channel" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "futures-core" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -536,21 +566,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures-task" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures-util" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,7 +598,7 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -589,14 +619,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -605,7 +635,7 @@ name = "hashbrown" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -619,10 +649,10 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -677,9 +707,9 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -689,14 +719,14 @@ dependencies = [ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "indexmap" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -707,7 +737,7 @@ name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -752,7 +782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.66" +version = "0.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -772,7 +802,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "libflate 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -817,13 +847,13 @@ dependencies = [ "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log-mdc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde-value 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "thread-id 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -837,7 +867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "2.3.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -858,7 +888,7 @@ dependencies = [ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -883,7 +913,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -912,13 +942,63 @@ name = "multimap" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "neon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cslice 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-build 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-runtime 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "neon-build" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "neon-runtime" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "neon-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "neon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-runtime 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "neon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -927,7 +1007,7 @@ name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -963,8 +1043,8 @@ name = "num_cpus" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -998,7 +1078,7 @@ name = "pairing" version = "0.14.2" source = "git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4#188537ea025fcb7fbdfc11266f307a084a5451e4" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.4.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "group 0.1.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1018,7 +1098,7 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1030,7 +1110,7 @@ name = "pbkdf2" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1045,7 +1125,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fixedbitset 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1061,9 +1141,9 @@ name = "pin-project-internal" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1096,7 +1176,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1135,9 +1215,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1151,33 +1231,24 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.10.1" +version = "2.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "protobuf-codegen" -version = "2.10.1" +version = "2.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "protobuf 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "protobuf-codegen-pure" -version = "2.10.1" +version = "2.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "protobuf 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf-codegen 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "qtlib" -version = "0.1.0" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "zecwalletlitelib 0.1.0 (git+https://github.com/adityapk00/zecwallet-light-cli?rev=14fe907cf69d1c2ef01ce70fab895e56fa269b94)", + "protobuf 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf-codegen 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1198,7 +1269,7 @@ name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1207,7 +1278,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1225,7 +1296,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1300,7 +1371,7 @@ name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1312,7 +1383,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1383,6 +1454,22 @@ dependencies = [ "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "regex" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "remove_dir_all" version = "0.5.2" @@ -1398,7 +1485,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1428,27 +1515,27 @@ dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rust-embed" -version = "5.2.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rust-embed-impl 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-embed-impl 5.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rust-embed-utils 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rust-embed-impl" -version = "5.2.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rust-embed-utils 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1492,7 +1579,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1511,7 +1598,7 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1547,7 +1634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1591,14 +1678,14 @@ name = "serde_derive" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.46" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1634,7 +1721,7 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1656,7 +1743,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1666,7 +1753,7 @@ name = "sodiumoxide" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "libsodium-sys 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1703,10 +1790,10 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1716,9 +1803,9 @@ name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1733,7 +1820,7 @@ version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "filetime 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1744,7 +1831,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1756,17 +1843,25 @@ name = "thread-id" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1787,16 +1882,16 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1804,18 +1899,18 @@ dependencies = [ "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-macros" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1823,9 +1918,9 @@ name = "tokio-rustls" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1835,11 +1930,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1851,8 +1946,8 @@ dependencies = [ "async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1861,7 +1956,7 @@ dependencies = [ "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustls-native-certs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1869,8 +1964,8 @@ dependencies = [ "tower-load 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-make 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-futures 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-futures 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1878,10 +1973,10 @@ name = "tonic-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1889,7 +1984,7 @@ name = "tower" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "tower-buffer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-discover 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1906,20 +2001,20 @@ name = "tower-balance" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-discover 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-load 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-make 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tower-ready-cache 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tower-ready-cache 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1927,12 +2022,12 @@ name = "tower-buffer" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1940,7 +2035,7 @@ name = "tower-discover" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1955,9 +2050,9 @@ name = "tower-limit" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1967,10 +2062,10 @@ name = "tower-load" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-discover 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1980,7 +2075,7 @@ name = "tower-load-shed" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1991,20 +2086,20 @@ name = "tower-make" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tower-ready-cache" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2013,9 +2108,9 @@ name = "tower-retry" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2031,7 +2126,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2041,35 +2136,35 @@ name = "tower-util" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tracing" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-attributes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-attributes 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tracing-attributes" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tracing-core" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2077,11 +2172,11 @@ dependencies = [ [[package]] name = "tracing-futures" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2145,6 +2240,11 @@ name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "version_check" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "walkdir" version = "2.3.1" @@ -2183,12 +2283,12 @@ name = "wasm-bindgen-backend" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2206,9 +2306,9 @@ name = "wasm-bindgen-macro-support" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2226,9 +2326,9 @@ dependencies = [ "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2275,7 +2375,7 @@ name = "which" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2329,7 +2429,7 @@ name = "xattr" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2350,8 +2450,8 @@ dependencies = [ "ff 0.4.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "pairing 0.14.2 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", - "protobuf 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf-codegen-pure 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf-codegen-pure 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "zcash_primitives 0.0.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", ] @@ -2364,7 +2464,7 @@ dependencies = [ "aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "blake2s_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "crypto_api_chachapoly 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.4.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "fpe 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2386,7 +2486,7 @@ source = "git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7 dependencies = [ "bellman 0.1.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.4.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "pairing 0.14.2 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2396,11 +2496,11 @@ dependencies = [ [[package]] name = "zecwalletlitelib" version = "0.1.0" -source = "git+https://github.com/adityapk00/zecwallet-light-cli?rev=14fe907cf69d1c2ef01ce70fab895e56fa269b94#14fe907cf69d1c2ef01ce70fab895e56fa269b94" +source = "git+https://github.com/adityapk00/zecwallet-light-cli?rev=6fa8d1f36558029f7574891b9bd612d66df5583e#6fa8d1f36558029f7574891b9bd612d66df5583e" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "bellman 0.1.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.4.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", @@ -2413,16 +2513,16 @@ dependencies = [ "pairing 0.14.2 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", "ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-embed 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-embed 5.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "secp256k1 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sodiumoxide 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "tonic 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tonic-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2433,11 +2533,24 @@ dependencies = [ "zcash_proofs 0.0.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)", ] +[[package]] +name = "zecwalletnative" +version = "0.1.0" +dependencies = [ + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "neon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-build 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "neon-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "zecwalletlitelib 0.1.0 (git+https://github.com/adityapk00/zecwallet-light-cli?rev=6fa8d1f36558029f7574891b9bd612d66df5583e)", +] + [metadata] "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" "checksum aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" +"checksum aho-corasick 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d5e63fd144e18ba274ae7095c0197a870a7b9468abc801dd62f190d80817d2ec" "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" "checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" "checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841" @@ -2449,7 +2562,7 @@ dependencies = [ "checksum async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "750b1c38a1dfadd108da0f01c08f4cdc7ff1bb39b325f9c82cc972361780a6e1" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)" = "7f80256bc78f67e7df7e36d77366f636ed976895d91fe2ab9efa3973e8fe8c4f" +"checksum backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e4036b9bf40f3cf16aba72a3d65e8a520fc4bafcdc7079aea8f848c58c5b5536" "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" @@ -2464,12 +2577,13 @@ dependencies = [ "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" "checksum bs58 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c95ee6bba9d950218b6cc910cf62bc9e0a171d0f4537e3627b0f54d08549b188" -"checksum bumpalo 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb8038c1ddc0a5f73787b130f4cc75151e96ed33e417fde765eb5a81e3532f4" +"checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" -"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" +"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" +"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" "checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" @@ -2479,15 +2593,17 @@ dependencies = [ "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19" -"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" +"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum crypto_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f855e87e75a4799e18b8529178adcde6fd4f97c1449ff4821e747ff728bb102" "checksum crypto_api_chachapoly 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95b2ad7cab08fd71addba81df5077c49df208effdfb3118a1519f9cdeac5aaf2" +"checksum cslice 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "697c714f50560202b1f4e2e09cd50a421881c83e9025db75d15f276616f04f40" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" "checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" "checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" "checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +"checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" "checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" "checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" @@ -2502,19 +2618,19 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" -"checksum futures-channel 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c92c2137e8e1ebf1ac99453550ab46eb4f35c5c53476d57d75eb782fb4d71e84" -"checksum futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ccfb301b0b09e940a67376cf40d1b0ac4db9366ee737f65c02edea225057e91e" +"checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" +"checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -"checksum futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0485279d763e8a3669358f500e805339138b7bbe90f5718c80eedfdcb2ea36a4" -"checksum futures-task 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cefffab2aacc73845afd3f202e09fc775a55e2e96f46c8b1a46c117ae1c126ca" -"checksum futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c3f8c59707f898b8b6f0b54c2aef5408ae90a560b7bf0fbf1b95b3c652b0171" +"checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" +"checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" +"checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" "checksum group 0.1.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)" = "" "checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" +"checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" "checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b" @@ -2522,7 +2638,7 @@ dependencies = [ "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" "checksum hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1c527bbc634be72aa7ba31e4e4def9bbb020f5416916279b7c705cd838893e" -"checksum indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" +"checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" @@ -2530,7 +2646,7 @@ dependencies = [ "checksum json 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a38661a28126f8621fb246611288ae28935ddf180f5e21f2d0fbfe5e4131dbe" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" +"checksum libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)" = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" "checksum libflate 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "d9135df43b1f5d0e333385cb6e7897ecd1a43d7d11b91ac003f4d2c2d2401fdd" "checksum libsodium-sys 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1c344ff12b90ef8fa1f0fffacd348c1fd041db331841fec9eab23fdb991f5e73" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" @@ -2539,7 +2655,7 @@ dependencies = [ "checksum log-mdc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" "checksum log4rs 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "100052474df98158c0738a7d3f4249c99978490178b5f9f68cd835ac57adbd1b" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" +"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" "checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" @@ -2547,6 +2663,11 @@ dependencies = [ "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226" "checksum multimap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a97fbd5d00e0e37bfb10f433af8f5aaf631e739368dc9fc28286ca81ca4948dc" +"checksum neon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "53b85accbbd250627f899a6fc1f220bbb4c8c2ff6dc71830dc6b752b39c2eb97" +"checksum neon-build 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ae406bf1065c4399e69d328a3bd8d4f088f2a205dc3881bf68c0ac775bfef337" +"checksum neon-runtime 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d8465ac4ed3f340dead85e053b75a5f639f48ac6343b3523eff90a751758eead" +"checksum neon-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da9e108f87d76d1a7e11d1fa9c7554a0431b84d170104cb46d1546fb64d6bf63" +"checksum neon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ae4cf3871ca5a395077e68144c1754e94e9e1e3329e7f8399d999ca573ed89a" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" @@ -2570,14 +2691,14 @@ dependencies = [ "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" +"checksum proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" "checksum prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" "checksum prost-build 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" "checksum prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" "checksum prost-types 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" -"checksum protobuf 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6686ddd96a8dbe2687b5f2a687b2cfb520854010ec480f2d74c32e7c9873d3c5" -"checksum protobuf-codegen 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6456421eecf7fc72905868cd760c3e35848ded3552e480cfe67726ed4dbd8d23" -"checksum protobuf-codegen-pure 2.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4a7cb42d5ab6073333be90208ab5ea6ab41c8f6803b35fd773a7572624cc15c9" +"checksum protobuf 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "37a5325d019a4d837d3abde0a836920f959e33d350f77b5f1e289e061e774942" +"checksum protobuf-codegen 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "64dd3a6192e0c6c1b0dae8f125b7f6b201c39fc487ebda0ee717d7a87fc47dc2" +"checksum protobuf-codegen-pure 2.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "037fa49710ee83b3be232ed53c5fce0bdb1b64c6aa6b1143a86640969c3e4b1d" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" @@ -2601,13 +2722,15 @@ dependencies = [ "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" +"checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" +"checksum regex-syntax 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7246cd0a0a6ec2239a5405b2b16e3f404fa0dcc6d28f5f5b877bf80e33e0f294" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)" = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" "checksum ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" "checksum rle-decode-fast 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac" "checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" -"checksum rust-embed 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b18893bdbdb0fa5bce588f5d7ab4afbd0678fc879d31535912bf39b7fbc062d6" -"checksum rust-embed-impl 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50633968284cfc373661345fc6382e62b738079f045738023ebc5e445cf44357" +"checksum rust-embed 5.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "20eb43fdf7722a83abfcbc60e10a99c0940d3f07ca69a643edee10bf174240ff" +"checksum rust-embed-impl 5.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c44c2cbb1a7168b8232ce002b83ebe0c669414d53d6deb38994222d995027f97" "checksum rust-embed-utils 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97655158074ccb2d2cfb1ccb4c956ef0f4054e43a2c1e71146d4991e6961e105" "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" @@ -2615,7 +2738,7 @@ dependencies = [ "checksum rustls-native-certs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51ffebdbb48c14f84eba0b715197d673aff1dd22cc1007ca647e28483bbcc307" "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" +"checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" "checksum secp256k1 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e0344a794ff109f85547039536028e12f313178ac1545e49fdf16a530d900a7b" @@ -2626,7 +2749,7 @@ dependencies = [ "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" "checksum serde-value 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7a663f873dedc4eac1a559d4c6bc0d0b2c34dc5ac4702e105014b8281489e44f" "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)" = "21b01d7f0288608a01dca632cf1df859df6fd6ffa885300fc275ce2ba6221953" +"checksum serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" "checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35" "checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" @@ -2639,16 +2762,17 @@ dependencies = [ "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c65d530b10ccaeac294f349038a597e435b18fb456aadd0840a623f83b9e941" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" -"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" +"checksum syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum tar 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)" = "b3196bfbffbba3e57481b6ea32249fbaf590396a52505a2615adbb79d9d826d3" "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum thread-id 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" +"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" -"checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" -"checksum tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" +"checksum tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616" +"checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" "checksum tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "141afec0978abae6573065a48882c6bae44c5cc61db9b511ac4abf6a09bfd9cc" "checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" "checksum tonic 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08283643b1d483eb7f3fc77069e63b5cba3e4db93514b3d45470e67f123e4e48" @@ -2662,15 +2786,15 @@ dependencies = [ "checksum tower-load 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cc79fc3afd07492b7966d7efa7c6c50f8ed58d768a6075dd7ae6591c5d2017b" "checksum tower-load-shed 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9f021e23900173dc315feb4b6922510dae3e79c689b74c089112066c11f0ae4e" "checksum tower-make 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce50370d644a0364bf4877ffd4f76404156a248d104e2cc234cd391ea5cdc965" -"checksum tower-ready-cache 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2183d0a00b68a41c0af9e281cf51f40c7de2e1d4af4a43f92a5c35bbe7728d7" +"checksum tower-ready-cache 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4eabb6620e5481267e2ec832c780b31cad0c15dcb14ed825df5076b26b591e1f" "checksum tower-retry 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e6727956aaa2f8957d4d9232b308fe8e4e65d99db30f42b225646e86c9b6a952" "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" "checksum tower-timeout 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "127b8924b357be938823eaaec0608c482d40add25609481027b96198b2e4b31e" "checksum tower-util 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5702d7890e35b2aae6ee420e8a762547505dbed30c075fbc84ec069a0aa18314" -"checksum tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e213bd24252abeb86a0b7060e02df677d367ce6cb772cef17e9214b8390a8d3" -"checksum tracing-attributes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04cfd395def5a60236e187e1ff905cb55668a59f29928dec05e6e1b1fd2ac1f3" -"checksum tracing-core 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "13a46f11e372b8bd4b4398ea54353412fdd7fd42a8370c7e543e218cf7661978" -"checksum tracing-futures 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "33848db47a7c848ab48b66aab3293cb9c61ea879a3586ecfcd17302fcea0baf1" +"checksum tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1721cc8cf7d770cc4257872507180f35a4797272f5962f24c806af9e7faf52ab" +"checksum tracing-attributes 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "7fbad39da2f9af1cae3016339ad7f2c7a9e870f12e8fd04c4fd7ef35b30c0d2b" +"checksum tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +"checksum tracing-futures 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "58b0b7fd92dc7b71f29623cc6836dd7200f32161a2313dd78be233a8405694f6" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" @@ -2682,6 +2806,7 @@ dependencies = [ "checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" "checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" "checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" "checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" @@ -2708,4 +2833,4 @@ dependencies = [ "checksum zcash_client_backend 0.0.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)" = "" "checksum zcash_primitives 0.0.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)" = "" "checksum zcash_proofs 0.0.0 (git+https://github.com/adityapk00/librustzcash.git?rev=188537ea025fcb7fbdfc11266f307a084a5451e4)" = "" -"checksum zecwalletlitelib 0.1.0 (git+https://github.com/adityapk00/zecwallet-light-cli?rev=14fe907cf69d1c2ef01ce70fab895e56fa269b94)" = "" +"checksum zecwalletlitelib 0.1.0 (git+https://github.com/adityapk00/zecwallet-light-cli?rev=6fa8d1f36558029f7574891b9bd612d66df5583e)" = "" diff --git a/native/Cargo.toml b/native/Cargo.toml new file mode 100644 index 00000000..ee2566ce --- /dev/null +++ b/native/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "zecwalletnative" +version = "0.1.0" +edition = "2018" +authors = ["Zecwallet"] +license = "MIT/Apache-2.0" +build = "build.rs" + +[lib] +name = "zecwalletnative" +crate-type = ["cdylib"] + +[build-dependencies] +neon-build = "0.3.3" + +[dependencies] +zecwalletlitelib = { git = "https://github.com/adityapk00/zecwallet-light-cli", rev = "6fa8d1f36558029f7574891b9bd612d66df5583e" } +neon = "0.3.3" +lazy_static = "1.4.0" +neon-serde = "0.2.0" +serde = "1.0.80" diff --git a/native/build.rs b/native/build.rs new file mode 100644 index 00000000..b3e5729e --- /dev/null +++ b/native/build.rs @@ -0,0 +1,3 @@ +fn main() { + neon_build::setup(); +} diff --git a/native/src/lib.rs b/native/src/lib.rs new file mode 100644 index 00000000..825340b5 --- /dev/null +++ b/native/src/lib.rs @@ -0,0 +1,143 @@ +#[macro_use] +extern crate lazy_static; + +use neon::register_module; +use neon_serde::export; + +use std::sync::{Mutex, Arc}; +use std::cell::RefCell; +use std::thread; + +use zecwalletlitelib::{commands, lightclient::{LightClient, LightClientConfig}}; + +// We'll use a MUTEX to store a global lightclient instance, +// so we don't have to keep creating it. We need to store it here, in rust +// because we can't return such a complex structure back to JS +lazy_static! { + static ref LIGHTCLIENT: Mutex>>> = Mutex::new(RefCell::new(None)); +} + + +export! { + // Check if there is an existing wallet + fn litelib_wallet_exists(chain_name: String) -> bool { + let config = LightClientConfig::create_unconnected(chain_name, None); + + config.wallet_exists() + } + + /// Create a new wallet and return the seed for the newly created wallet. + fn litelib_initialize_new(dangerous: bool, server_uri: String) -> String { + let server = LightClientConfig::get_server_or_default(Some(server_uri)); + let (config, latest_block_height) = match LightClientConfig::create(server, dangerous) { + Ok((c, h)) => (c, h), + Err(e) => { + return format!("Error: {}", e); + } + }; + + let lightclient = match LightClient::new(&config, latest_block_height) { + Ok(l) => l, + Err(e) => { + return format!("Error: {}", e); + } + }; + + // Initialize logging + let _ = lightclient.init_logging(); + + let seed = match lightclient.do_seed_phrase() { + Ok(s) => s.dump(), + Err(e) => { + return format!("Error: {}", e); + } + }; + + LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); + + // Return the wallet's seed + return seed; + } + + /// Restore a wallet from the seed phrase + fn litelib_initialize_new_from_phrase(dangerous: bool, server_uri: String, + seed: String, birthday: u64) -> String { + let server = LightClientConfig::get_server_or_default(Some(server_uri)); + let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) { + Ok((c, h)) => (c, h), + Err(e) => { + return format!("Error: {}", e); + } + }; + + let lightclient = match LightClient::new_from_phrase(seed, &config, birthday) { + Ok(l) => l, + Err(e) => { + return format!("Error: {}", e); + } + }; + + // Initialize logging + let _ = lightclient.init_logging(); + + LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); + + format!("OK") + } + + // Initialize a new lightclient and store its value + fn litelib_initialize_existing(dangerous: bool, server_uri: String) -> String { + let server = LightClientConfig::get_server_or_default(Some(server_uri)); + let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) { + Ok((c, h)) => (c, h), + Err(e) => { + return format!("Error: {}", e); + } + }; + + let lightclient = match LightClient::read_from_disk(&config) { + Ok(l) => l, + Err(e) => { + return format!("Error: {}", e); + } + }; + + // Initialize logging + let _ = lightclient.init_logging(); + + LIGHTCLIENT.lock().unwrap().replace(Some(Arc::new(lightclient))); + + format!("OK") + } + + fn litelib_execute(cmd: String, args_list: String) -> String { + let resp: String; + { + let lightclient: Arc; + { + let lc = LIGHTCLIENT.lock().unwrap(); + + if lc.borrow().is_none() { + return format!("Error: Light Client is not initialized"); + } + + lightclient = lc.borrow().as_ref().unwrap().clone(); + }; + + if cmd == "sync".to_string() || cmd == "rescan".to_string() { + thread::spawn(move || { + let args = if args_list.is_empty() { vec![] } else { vec![args_list.as_ref()] }; + commands::do_user_command(&cmd, &args, lightclient.as_ref()); + }); + + return format!("OK"); + } else { + let args = if args_list.is_empty() { vec![] } else { vec![args_list.as_ref()] }; + resp = commands::do_user_command(&cmd, &args, lightclient.as_ref()).clone(); + } + }; + + return resp; + } +} + diff --git a/package.json b/package.json new file mode 100644 index 00000000..8782b94b --- /dev/null +++ b/package.json @@ -0,0 +1,318 @@ +{ + "name": "zecwallet", + "productName": "Zecwallet Lite", + "version": "1.1.0", + "description": "Zecwallet Lite (Electron version)", + "scripts": { + "build": "yarn neon && concurrently \"yarn build-main\" \"yarn build-renderer\"", + "build-dll": "cross-env NODE_ENV=development webpack --config ./configs/webpack.config.renderer.dev.dll.babel.js --colors", + "build-e2e": "cross-env E2E_BUILD=true yarn build", + "build-main": "cross-env NODE_ENV=production webpack --config ./configs/webpack.config.main.prod.babel.js --colors", + "build-renderer": "cross-env NODE_ENV=production webpack --config ./configs/webpack.config.renderer.prod.babel.js --colors", + "dev": "cross-env START_HOT=1 node -r @babel/register ./internals/scripts/CheckPortInUse.js && yarn neon && cross-env START_HOT=1 yarn start-renderer-dev", + "electron-rebuild": "electron-rebuild --parallel --force --types prod,dev,optional --module-dir app", + "flow": "flow", + "flow-typed": "rimraf flow-typed/npm && flow-typed install --overwrite || true", + "lint": "cross-env NODE_ENV=development eslint --cache --format=pretty .", + "lint-fix": "yarn --silent lint --fix; exit 0", + "lint-styles": "stylelint --ignore-path .eslintignore '**/*.*(css|scss)' --syntax scss", + "lint-styles-fix": "yarn --silent lint-styles --fix; exit 0", + "neon": "electron-build-env neon build --release", + "package": "yarn build && electron-builder build --publish never", + "package-all": "yarn build && electron-builder build -mwl", + "package-ci": "yarn postinstall && yarn build && electron-builder --publish always", + "package-mac": "yarn build && electron-builder build --mac", + "package-linux": "yarn build && electron-builder build --linux", + "package-win": "yarn build && electron-builder build --win --x64", + "postinstall": "node -r @babel/register internals/scripts/CheckNativeDep.js && yarn flow-typed && electron-builder install-app-deps && yarn build-dll && opencollective-postinstall", + "postlint-fix": "prettier --ignore-path .eslintignore --single-quote --write '**/*.{js,jsx,json,html,css,less,scss,yml}'", + "postlint-styles-fix": "prettier --ignore-path .eslintignore --single-quote --write '**/*.{css,scss}'", + "preinstall": "node ./internals/scripts/CheckYarn.js", + "prestart": "yarn build", + "start": "cross-env NODE_ENV=production electron ./app/main.prod.js", + "start-main-dev": "cross-env START_HOT=1 NODE_ENV=development electron -r @babel/register ./app/main.dev.js --remote-debugging-port=9223", + "start-renderer-dev": "cross-env NODE_ENV=development webpack-dev-server --config configs/webpack.config.renderer.dev.babel.js" + }, + "lint-staged": { + "*.{js,jsx}": [ + "cross-env NODE_ENV=development eslint --cache --format=pretty", + "git add" + ], + "{*.json,.{babelrc,eslintrc,prettierrc,stylelintrc}}": [ + "prettier --ignore-path .eslintignore --parser json --write", + "git add" + ], + "*.{css,scss}": [ + "stylelint --ignore-path .eslintignore --syntax scss --fix", + "prettier --ignore-path .eslintignore --single-quote --write", + "git add" + ], + "*.{html,md,yml}": [ + "prettier --ignore-path .eslintignore --single-quote --write", + "git add" + ] + }, + "build": { + "productName": "Zecwallet Lite", + "appId": "co.zecwallet.lite", + "afterAllArtifactBuild": "./afterSignHook.js", + "files": [ + "dist/", + "node_modules/", + "app.html", + "main.prod.js", + "main.prod.js.map", + "package.json" + ], + "dmg": { + "contents": [ + { + "x": 130, + "y": 220 + }, + { + "x": 410, + "y": 220, + "type": "link", + "path": "/Applications" + } + ] + }, + "win": { + "icon": "./resources/icon.ico", + "target": [ + "zip", + "msi" + ] + }, + "mac": { + "category": "public.app-category.productivity", + "type": "distribution", + "hardenedRuntime": true, + "entitlements": "./configs/entitlements.mac.inherit.plist", + "target": [ + "dmg" + ], + "icon": "./resources/icon.icns" + }, + "deb": { + "depends": [ + "gconf2", + "gconf-service", + "libnotify4", + "libappindicator1", + "libxtst6", + "libnss3" + ], + "artifactName": "Zecwallet_Lite_${version}_${arch}.deb" + }, + "linux": { + "category": "Development", + "icon": "./resources/icon.icns", + "target": [ + "deb", + "AppImage" + ], + "desktop": { + "Name": "ZecWallet Lite", + "Comment": "Shielded Lightclient for Zcash", + "GenericName": "Wallet", + "Type": "Application", + "StartupNotify": true, + "StartupWMClass": "zecwalletlite", + "Categories": "Utility;", + "MimeType": "x-scheme-handler/zcash;", + "Keywords": "zecwallet;" + } + }, + "directories": { + "buildResources": "resources", + "output": "release" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/adityapk00/zecwallet-electron.git" + }, + "author": { + "name": "Aditya Kulkarni", + "email": "aditya@zecwallet.co", + "url": "https://zecwallet.co" + }, + "contributors": [ + { + "name": "Aditya Kulkarni", + "email": "aditya@zecwallet.co", + "url": "https://zecwallet.co" + } + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/adityapk00/zecwallet-electron/issues" + }, + "keywords": [ + "electron", + "boilerplate", + "react", + "redux", + "flow", + "sass", + "webpack", + "hot", + "reload" + ], + "homepage": "https://github.com/adityapk00/zecwallet-electron#readme", + "jest": { + "testURL": "http://localhost/", + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/internals/mocks/fileMock.js", + "\\.(css|less|sass|scss)$": "identity-obj-proxy" + }, + "moduleFileExtensions": [ + "js", + "jsx", + "json" + ], + "moduleDirectories": [ + "node_modules", + "app/node_modules" + ], + "transform": { + "^.+\\.jsx?$": "babel-jest" + }, + "setupFiles": [ + "./internals/scripts/CheckBuildsExist.js" + ] + }, + "devDependencies": { + "@babel/core": "^7.7.5", + "@babel/plugin-proposal-class-properties": "^7.7.4", + "@babel/plugin-proposal-decorators": "^7.7.4", + "@babel/plugin-proposal-do-expressions": "^7.7.4", + "@babel/plugin-proposal-export-default-from": "^7.7.4", + "@babel/plugin-proposal-export-namespace-from": "^7.7.4", + "@babel/plugin-proposal-function-bind": "^7.7.4", + "@babel/plugin-proposal-function-sent": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.7.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.7.4", + "@babel/plugin-proposal-numeric-separator": "^7.7.4", + "@babel/plugin-proposal-optional-chaining": "^7.7.5", + "@babel/plugin-proposal-pipeline-operator": "^7.7.4", + "@babel/plugin-proposal-throw-expressions": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-import-meta": "^7.7.4", + "@babel/plugin-transform-react-constant-elements": "^7.7.4", + "@babel/plugin-transform-react-inline-elements": "^7.7.4", + "@babel/preset-env": "^7.7.6", + "@babel/preset-flow": "^7.7.4", + "@babel/preset-react": "^7.7.4", + "@babel/register": "^7.7.4", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.0.3", + "babel-jest": "^24.9.0", + "babel-loader": "^8.0.6", + "babel-plugin-dev-expression": "^0.2.2", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "chalk": "^3.0.0", + "concurrently": "^5.1.0", + "cross-env": "^6.0.3", + "cross-spawn": "^7.0.1", + "css-loader": "^3.3.2", + "detect-port": "^1.3.0", + "electron": "7.1.4", + "electron-build-env": "^0.2.0", + "electron-builder": "^22.2.0", + "electron-devtools-installer": "^2.2.4", + "electron-notarize": "^0.2.1", + "electron-rebuild": "^1.8.8", + "enzyme": "^3.7.0", + "enzyme-adapter-react-16": "^1.7.0", + "enzyme-to-json": "^3.3.4", + "eslint": "^6.7.2", + "eslint-config-airbnb": "^18.0.1", + "eslint-config-erb": "^0.1.1", + "eslint-config-prettier": "^6.6.0", + "eslint-formatter-pretty": "^3.0.0", + "eslint-import-resolver-webpack": "^0.12.0", + "eslint-plugin-compat": "^3.3.0", + "eslint-plugin-flowtype": "^4.5.2", + "eslint-plugin-import": "^2.19.1", + "eslint-plugin-jest": "^23.1.1", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-react": "^7.17.0", + "eslint-plugin-testcafe": "^0.2.1", + "fbjs-scripts": "^1.2.0", + "file-loader": "^5.0.2", + "flow-bin": "^0.113.0", + "flow-runtime": "^0.17.0", + "flow-typed": "^2.6.2", + "husky": "^3.1.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^24.9.0", + "lint-staged": "^9.5.0", + "mini-css-extract-plugin": "^0.8.0", + "neon": "^2.0.0", + "neon-cli": "^0.3.3", + "node-sass": "^4.13.1", + "opencollective-postinstall": "^2.0.2", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "prettier": "^1.19.1", + "react-test-renderer": "^16.12.0", + "redux-logger": "^3.0.6", + "rimraf": "^3.0.0", + "sass-loader": "^8.0.0", + "sinon": "^7.5.0", + "spectron": "^9.0.0", + "style-loader": "^1.0.1", + "stylelint": "^12.0.0", + "stylelint-config-prettier": "^8.0.0", + "stylelint-config-standard": "^19.0.0", + "terser-webpack-plugin": "^2.3.0", + "url-loader": "^3.0.0", + "webpack": "^4.41.6", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-cli": "^3.3.10", + "webpack-dev-server": "^3.9.0", + "webpack-merge": "^4.2.2", + "yarn": "^1.22.0" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^5.12.0", + "@hot-loader/react-dom": "^16.11.0", + "axios": "^0.19.0", + "dateformat": "^3.0.3", + "electron-debug": "^3.0.1", + "electron-log": "^4.0.0", + "electron-store": "^5.1.1", + "history": "^4.10.1", + "libsodium-wrappers-sumo": "^0.7.6", + "qrcode.react": "^1.0.0", + "react": "^16.12.0", + "react-accessible-accordion": "^3.0.1", + "react-dom": "^16.12.0", + "react-hot-loader": "^4.12.18", + "react-modal": "^3.11.1", + "react-router": "^5.1.2", + "react-router-dom": "^5.1.2", + "react-select": "^3.0.8", + "react-tabs": "^3.1.0", + "react-textarea-autosize": "^7.1.2", + "source-map-support": "^0.5.16", + "typeface-roboto": "^0.0.75", + "ws": "^7.2.1" + }, + "devEngines": { + "node": ">=7.x", + "npm": ">=4.x", + "yarn": ">=0.21.3" + }, + "browserslist": "electron 1.6", + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + } +} diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..eb0f191a --- /dev/null +++ b/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["bliss"] +} diff --git a/res/Info.plist b/res/Info.plist deleted file mode 100644 index 143d3f3e..00000000 --- a/res/Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - CFBundleExecutable - zecwallet-lite - CFBundleGetInfoString - Created by Qt/QMake - CFBundleIconFile - logo.icns - CFBundleIdentifier - com.yourcompany.zecwallet-lite - CFBundlePackageType - APPL - CFBundleSignature - ???? - LSMinimumSystemVersion - 10.11 - NOTE - This file was generated by Qt/QMake. - NSPrincipalClass - NSApplication - NSSupportsAutomaticGraphicsSwitching - - NSRequiresAquaSystemAppearance - YES - - CFBundleURLTypes - - - CFBundleURLName - zcash URI - CFBundleURLSchemes - - zcash - - - - NSUIElement - - - diff --git a/res/Ubuntu-R.ttf b/res/Ubuntu-R.ttf deleted file mode 100644 index d748728a..00000000 Binary files a/res/Ubuntu-R.ttf and /dev/null differ diff --git a/res/appdmg.json b/res/appdmg.json deleted file mode 100644 index 9e269b2b..00000000 --- a/res/appdmg.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "zecwallet-vRELEASE_VERSION", - "icon": "logo.icns", - "background": "dmgbg.png", - "window" : { - "size" : { "width" : 600, "height" : 100}, - "position" : { "x" : 200, "y" : 200} - }, - "contents": [ - { "x": 448, "y": 80, "type": "link", "path": "/Applications" }, - { "x": 152, "y": 80, "type": "file", "path": "zecwallet.app" } - ] -} diff --git a/res/connected.gif b/res/connected.gif deleted file mode 100644 index a515ed49..00000000 Binary files a/res/connected.gif and /dev/null differ diff --git a/res/connectoverinternetcheckbox.png b/res/connectoverinternetcheckbox.png deleted file mode 100644 index 2125854a..00000000 Binary files a/res/connectoverinternetcheckbox.png and /dev/null differ diff --git a/res/css/blue.css b/res/css/blue.css deleted file mode 100644 index 25d810e8..00000000 --- a/res/css/blue.css +++ /dev/null @@ -1,1732 +0,0 @@ -WalletFrame { -border-image: url(':/images/blue/res/images/blue/blue_walletFrame_bg') 0 0 0 0 stretch stretch; -border-top:0px solid #000; -margin:0; -padding:0; -background: #f6f7f8; -} - -QStatusBar { - background: #c5cad3; - border: 0; - color: #3b4c6b; - height: 36px; - min-height: 36px; - padding: 0; -} - -.QFrame { -background-color:transparent; -border:0px solid #fff; -} - -QMenuBar { -background-color:#fff; -} - -QMenuBar::item { -background-color:#fff; -color: #333; -} - -QMenuBar::item:selected { -background-color:#f8f6f6; -} - -QMenu { -background-color:#f8f6f6; -} - -QMenu::item { -color:#333; -} - -QMenu::item:selected { -background-color:#f2f0f0; -color:#333; -} - -QToolBar { - background: #c5cad3; - border: 0; - color: #3b4c6b; - height: 36px; - min-height: 36px; - padding: 0; -} - -QToolBar > QToolButton { -background-color:#01698d; -border:0px solid #333; -min-height:2.5em; -padding: 0em 1em; -font-weight:bold; -color:#fff; -} - -QToolBar > QToolButton:checked { -background-color:#fff; -color:#333; -font-weight:bold; -} - -QMessageBox { -background-color:#F8F6F6; -} - -/*******************************************************/ - -QLabel { /* Base Text Size & Color */ -font-size:13px; -color:#3b4c6b; -} - -.QCheckBox { /* Checkbox Labels */ -color:#3b4c6b; -background-color:transparent; -} - -.QCheckBox:hover { -background-color:transparent; -} - -.QValidatedLineEdit, .QLineEdit { /* Text Entry Fields */ -border: 1px solid #01698d; -font-size:11px; -min-height:25px; -outline:0; -padding:3px; -background-color:#fcfcfc; -} - -.QLineEdit:!focus { -font-size:12px; -} - -.QValidatedLineEdit:disabled, .QLineEdit:disabled { -background-color:#f2f2f2; -} - -/*******************************************************/ - -QPushButton { /* Global Button Style */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #64ACD2, stop: .1 #01698d, stop: .95 #01698d, stop: 1 #1D80B5); -border:0; -border-radius:10px; -color:#ffffff; -font-size:12px; -font-weight:bold; -padding-left:25px; -padding-right:25px; -padding-top:5px; -padding-bottom:5px; -min-height:25px; -} - -QPushButton:hover, -.QPushButton:hover { - background: rgb(186, 190, 194); - color: #FFF; -} - -QPushButton:focus { -border:none; -outline:none; -} - -QPushButton:pressed { -border:1px solid #333; -} - -QComboBox { /* Dropdown Menus */ -border:1px solid #82C3E6; -padding: 3px 5px 3px 5px; -background:#fcfcfc; -min-height:25px; -color:#01698d; -} - -QComboBox:checked { -background:#f2f2f2; -} - -QComboBox:editable { -background: #01698d; -color:#616161; -border:0px solid transparent; -} - -QComboBox::drop-down { -width:25px; -border:0px; -} - -QComboBox::down-arrow { -border-image: url(':/images/blue/res/images/blue/blue_downArrow') 0 0 0 0 stretch stretch; -} - -QComboBox QListView { -background:#fff; -border:1px solid #333; -padding-right:1px; -padding-left:1px; -} - -QComboBox QAbstractItemView::item { margin:4px; } - -QComboBox::item { -color:#01698d; -} - -QComboBox::item:alternate { -background:#fff; -} - -QComboBox::item:selected { -border:0px solid transparent; -background:#f2f2f2; -} - -QComboBox::indicator { -background-color:transparent; -selection-background-color:transparent; -color:transparent; -selection-color:transparent; -} - -QAbstractSpinBox { -border:1px solid #82C3E6; -padding: 3px 5px 3px 5px; -background:#fcfcfc; -min-height:25px; -color:#01698d; -} - -QAbstractSpinBox::up-button { -subcontrol-origin: border; -subcontrol-position: top right; -width:21px; -background:#fcfcfc; -border-left:0px; -border-right:1px solid #82C3E6; -border-top:1px solid #82C3E6; -border-bottom:0px; -padding-right:1px; -padding-left:5px; -padding-top:2px; -} - -QAbstractSpinBox::up-arrow { -image:url(':/images/blue/res/images/blue/blue_upArrow_small'); -} - -QAbstractSpinBox::down-button { -subcontrol-origin: border; -subcontrol-position: bottom right; -width:21px; -background:#fcfcfc; -border-top:0px; -border-left:0px; -border-right:1px solid #82C3E6; -border-bottom:1px solid #82C3E6; -padding-right:1px; -padding-left:5px; -padding-bottom:2px; -} - -QAbstractSpinBox::down-arrow { -image:url(':/images/blue/res/images/blue/blue_downArrow_small'); -} - -QCheckBox { -spacing: 5px; -} - -QCheckBox::indicator { -width: 16px; -height: 16px; -} - -QCheckBox::indicator:unchecked { -image:url(':/images/blue/res/images/blue/unchecked'); -} - -QCheckBox::indicator:unchecked:hover { -image:url(':/images/blue/res/images/blue/unchecked'); -} - -QCheckBox::indicator:unchecked:pressed { -image:url(':/images/blue/res/images/blue/checked'); -} - -QCheckBox::indicator:checked { -image:url(':/images/blue/res/images/blue/checked'); -} - -QCheckBox::indicator:checked:hover { -image:url(':/images/blue/res/images/blue/checked'); -} - -QCheckBox::indicator:checked:pressed { -image:url(':/images/blue/res/images/blue/unchecked'); -} - -QCheckBox::indicator:indeterminate:hover { -image:url(':/images/blue/res/images/blue/unchecked'); -} - -QCheckBox::indicator:indeterminate:pressed { -image:url(':/images/blue/res/images/blue/checked'); -} - - -/*******************************************************/ - -QHeaderView { /* Table Header */ -background-color:transparent; -} - -QHeaderView::section { /* Table Header Sections */ -qproperty-alignment:center; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #4c97bf, stop: 1 #01698d); -color:#fff; -min-height:25px; -font-weight:bold; -font-size:11px; -outline:0; -border:0px solid #fff; -border-right:1px solid #fff; -padding-left:5px; -padding-right:5px; -padding-top:2px; -padding-bottom:2px; -} - -QHeaderView::section:last { -border-right: 0px solid #d7d7d7; -} - -.QScrollArea { -background:transparent; -border:0px; -} - -.QTableView { /* Table - has to be selected as a class otherwise it throws off QCalendarWidget */ -background:transparent; -border:0px solid #fff; -} - -QTableView::item { /* Table Item */ -background-color:#fcfcfc; -font-size:12px; -} - -QTableView::item:selected { /* Table Item Selected */ -background-color:rgb(186, 190, 194); -color:#333; -} - -QScrollBar { /* Scroll Bar */ - -} - -QScrollBar:vertical { /* Vertical Scroll Bar Attributes */ -border:0; -background:#ffffff; -width:18px; -margin: 18px 0px 18px 0px; -} - -QScrollBar:horizontal { /* Horizontal Scroll Bar Attributes */ -border:0; -background:#ffffff; -height:18px; -margin: 0px 18px 0px 18px; -} - - -QScrollBar::handle:vertical { /* Scroll Bar Slider - vertical */ -background:#e0e0e0; -min-height:10px; -} - -QScrollBar::handle:horizontal { /* Scroll Bar Slider - horizontal */ -background:#e0e0e0; -min-width:10px; -} - -QScrollBar::add-page, QScrollBar::sub-page { /* Scroll Bar Background */ -background:#F8F6F6; -} - -QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical, QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { /* Define Arrow Button Dimensions */ -background-color:#F8F6F6; -border: 1px solid #f2f0f0; -width:16px; -height:16px; -} - -QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed, QScrollBar::add-line:horizontal:pressed, QScrollBar::sub-line:horizontal:pressed { -background-color:#e0e0e0; -} - -QScrollBar::sub-line:vertical { /* Vertical - top button position */ -subcontrol-position:top; -subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical { /* Vertical - bottom button position */ -subcontrol-position:bottom; -subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal { /* Vertical - left button position */ -subcontrol-position:left; -subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal { /* Vertical - right button position */ -subcontrol-position:right; -subcontrol-origin: margin; -} - -QScrollBar:up-arrow, QScrollBar:down-arrow, QScrollBar:left-arrow, QScrollBar:right-arrow { /* Arrows Icon */ -width:10px; -height:10px; -} - -QScrollBar:up-arrow { -background-image: url(':/images/blue/res/images/blue/blue_upArrow_small'); -} - -QScrollBar:down-arrow { -background-image: url(':/images/blue/res/images/blue/blue_downArrow_small'); -} - -QScrollBar:left-arrow { -background-image: url(':/images/blue/res/images/blue/blue_leftArrow_small.png'); -} - -QScrollBar:right-arrow { -background-image: url(':/images/blue/res/images/blue/blue_rightArrow_small.png'); -} - - -/*******************************************************/ - -/* DIALOG BOXES */ - -QDialog .QTabWidget { -border-bottom:1px solid #333; -} - -QDialog .QTabWidget::pane { -border: 1px solid #d7d7d7; -} - -.QTabWidget QTabBar::tab { -background-color:#01698D; -color:#FFFFFF; -padding-left:20px; -padding-right:20px; -padding-top:5px; -padding-bottom:5px; -border-top: 1px solid #d7d7d7; -border: 1px solid white; -min-height: 9px; -} - -.QTabWidget QTabBar::tab:first { -border-left: 1px solid #01698D; -} - -.QTabWidget QTabBar::tab:last { -border-right: 1px solid #343A40; -} - -.QTabWidget QTabBar::tab:selected { -background-color:#FFFFFF; -color:#000; -border: 1px ridge #01698D; - -} - -.QTabWidget QTabBar::tab:hover { -background-color:rgb(186, 190, 194); -color:#FFFFFF; -border: 1px ridge #FFFFFF; -} - -QDialog .QTabWidget .QWidget { -background-color:#fff; -color:#333; -} - -QDialog .QTabWidget .QWidget QAbstractSpinBox { -min-height:15px; -} - -QDialog .QTabWidget .QWidget QAbstractSpinBox::down-button { -width:15px; -} - -QDialog .QTabWidget .QWidget QAbstractSpinBox::up-button { -width:15px; -} - -QDialog .QTabWidget .QWidget QComboBox { -min-height:15px; -} - -QDialog QWidget { /* Remove Annoying Focus Rectangle */ -outline: 0; -} - -/*******************************************************/ -/* FILE MENU */ - -/* Dialog: Open URI */ -QDialog#OpenURIDialog { -background-color:#F8F6F6; -} - -QDialog#OpenURIDialog QLabel#label { /* URI Label */ -font-weight:bold; -} - -QDialog#OpenURIDialog QPushButton#selectFileButton { /* ... Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QDialog#OpenURIDialog QPushButton#selectFileButton:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QDialog#OpenURIDialog QPushButton#selectFileButton:pressed { -border:1px solid #9e9e9e; -} - -/* Dialog: Sign / Verify Message */ -QDialog#SignVerifyMessageDialog { -background-color:#F8F6F6; -} - -QDialog#SignVerifyMessageDialog QPushButton#addressBookButton_SM { /* Address Book Button */ -background-color:transparent; -padding-left:10px; -padding-right:10px; -} - -QDialog#SignVerifyMessageDialog QPlainTextEdit { /* Message Signing Text */ -border:1px solid #82C3E6; -background-color:#fff; -} - -QDialog#SignVerifyMessageDialog QPushButton#pasteButton_SM { /* Paste Button */ -qproperty-icon: url(":/icons/blue/res/icons/blue/blue_editpaste"); -background-color:transparent; -padding-left:15px; -} - -QDialog#SignVerifyMessageDialog QLineEdit:!focus { /* Font Hack */ -font-size:10px; -} - -QDialog#SignVerifyMessageDialog QPushButton#copySignatureButton_SM { /* Copy Button */ -qproperty-icon: url(":/icons/blue/res/icons/blue/blue_editcopy"); -background-color:transparent; -padding-left:10px; -padding-right:10px; -} - -QDialog#SignVerifyMessageDialog QPushButton#clearButton_SM { /* Clear Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QDialog#SignVerifyMessageDialog QPushButton#clearButton_SM:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QDialog#SignVerifyMessageDialog QPushButton#clearButton_SM:pressed { -border:1px solid #9e9e9e; -} - -QDialog#SignVerifyMessageDialog QPushButton#addressBookButton_VM { /* Verify Message - Address Book Button */ -background-color:transparent; -border:0; -padding-left:10px; -padding-right:10px; -} - -QDialog#SignVerifyMessageDialog QPushButton#clearButton_VM { /* Verify Message - Clear Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QDialog#SignVerifyMessageDialog QPushButton#clearButton_VM:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QDialog#SignVerifyMessageDialog QPushButton#clearButton_VM:pressed { -border:1px solid #9e9e9e; -} - -/* Dialog: Send and Receive */ -QWidget#AddressBookPage { -background-color:#F8F6F6; -} - -QWidget#AddressBookPage QPushButton#newAddress { /* New Address Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#AddressBookPage QPushButton#newAddress:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#AddressBookPage QPushButton#newAddress:pressed { -border:1px solid #9e9e9e; -} - -QWidget#AddressBookPage QPushButton#copyAddress { /* Copy Address Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#AddressBookPage QPushButton#copyAddress:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#AddressBookPage QPushButton#copyAddress:pressed { -border:1px solid #9e9e9e; -} - -QWidget#AddressBookPage QPushButton#showAddressQRCode { /* Show Address QR code Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#AddressBookPage QPushButton#showAddressQRCode:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#AddressBookPage QPushButton#showAddressQRCode:pressed { -border:1px solid #9e9e9e; -} - -QWidget#AddressBookPage QPushButton#deleteAddress { /* Delete Address Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#AddressBookPage QPushButton#deleteAddress:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#AddressBookPage QPushButton#deleteAddress:pressed { -border:1px solid #9e9e9e; -} - -QWidget#AddressBookPage QTableView { /* Address Listing */ -font-size:12px; -} - -QWidget#AddressBookPage QHeaderView::section { /* Min width for Windows fix */ -min-width:260px; -} - -/* SETTINGS MENU */ - -/* Encrypt Wallet and Change Passphrase Dialog */ -QDialog#AskPassphraseDialog { -background-color:#F8F6F6; -} - -QDialog#AskPassphraseDialog QLabel#passLabel1, QDialog#AskPassphraseDialog QLabel#passLabel2, QDialog#AskPassphraseDialog QLabel#passLabel3 { -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:170px; -min-height:33px; /* base width of 25px for QLineEdit, plus padding and border */ -} - -/* Options Dialog */ -QDialog#OptionsDialog { -background-color:#F8F6F6; -} - -QDialog#OptionsDialog QValueComboBox, QDialog#OptionsDialog QSpinBox { -margin-top:5px; -margin-bottom:5px; -} - -QDialog#OptionsDialog QValidatedLineEdit, QDialog#OptionsDialog QValidatedLineEdit:disabled, QDialog#OptionsDialog QLineEdit, QDialog#OptionsDialog QLineEdit:disabled { -qproperty-alignment: 'AlignVCenter | AlignLeft'; -min-height:20px; -margin-top:0px; -margin-bottom:0px; -padding-top:1px; -padding-bottom:1px; -} - -QDialog#OptionsDialog > QLabel { -qproperty-alignment: 'AlignVCenter'; -min-height:20px; -} - -QDialog#OptionsDialog QWidget#tabDisplay QValueComboBox { -margin-top:0px; -margin-bottom:0px; -} - -QDialog#OptionsDialog QLabel#label_3 { /* Translations Missing? Label */ -qproperty-alignment: 'AlignVCenter | AlignCenter'; -color:#01698d; -padding-bottom:8px; -} - -QDialog#OptionsDialog QCheckBox { -min-height:20px; -} - -QDialog#OptionsDialog QCheckBox#displayAddresses { -min-height:33px; - -} - -/* TOOLS MENU */ - -QDialog#RPCConsole { /* RPC Console Dialog Box */ -background-color:#F8F6F6; -} - -QDialog#RPCConsole QWidget#tab_info QLabel#label_11, QDialog#RPCConsole QWidget#tab_info QLabel#label_10 { /* Margin between Network and Block Chain headers */ -qproperty-alignment: 'AlignBottom'; -min-height:25px; -min-width:180px; -} - -QDialog#RPCConsole QWidget#tab_peers QLabel#peerHeading { /* Peers Info Header */ -color:#01698d; -} - -QDialog#RPCConsole QPushButton#openDebugLogfileButton { -max-width:60px; -} - -QDialog#RPCConsole QTextEdit#messagesWidget { /* Console Messages Window */ -border:0; -} - -QDialog#RPCConsole QLineEdit#lineEdit { /* Console Input */ -margin-right:5px; -} - -QDialog#RPCConsole QPushButton#clearButton { /* Console Clear Button */ -background-color:transparent; -padding-left:10px; -padding-right:10px; -} - -QDialog#RPCConsole .QGroupBox #line { /* Network In Line */ -background-color:#00ff00; -} - -QDialog#RPCConsole .QGroupBox #line_2 { /* Network Out Line */ -background:#ff0000; -} - -/* HELP MENU */ - -/* Command Line Options Dialog */ -QDialog#HelpMessageDialog { -background-color:#F8F6F6; -} - -QDialog#HelpMessageDialog QScrollArea * { -background-color:#ffffff; -} - -QDialog#HelpMessageDialog QScrollBar:vertical, QDialog#HelpMessageDialog QScrollBar:horizontal { -border:0; -} - -/* About Dash Dialog */ -QDialog#AboutDialog { -background-color:#F8F6F6; -} - -QDialog#AboutDialog QLabel#label, QDialog#AboutDialog QLabel#copyrightLabel, QDialog#AboutDialog QLabel#label_2 { /* About Dash Contents */ -margin-left:10px; -} - -QDialog#AboutDialog QLabel#label_2 { /* Margin for About Dash text */ -margin-right:10px; -} - -/* Edit Address Dialog */ -QDialog#EditAddressDialog { -background-color:#F8F6F6; -} - -QDialog#EditAddressDialog QLabel { -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-height:27px; -font-weight:normal; -padding-right:5px; -} - -/* OVERVIEW SCREEN */ - -QWidget .QFrame#frame { /* Wallet Balance */ -min-width:490px; -} - -QWidget .QFrame#frame > .QLabel { -min-width:190px; -font-weight:normal; -min-height:30px; -} - -QWidget .QFrame#frame .QLabel#label_5 { /* Wallet Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:transparent; -color:#fff; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#frame .QLabel#labelWalletStatus { /* Wallet Sync Status */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -margin-left:3px; -} - -QWidget .QFrame#frame .QLabel#labelSpendable { /* Spendable Header */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:18px; -} - -QWidget .QFrame#frame .QLabel#labelWatchonly { /* Watch-only Header */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:16px; -} - -QWidget .QFrame#frame .QLabel#labelBalanceText { /* Available Balance Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#01698d; -color:#ffffff; -margin-right:5px; -padding-right:5px; -font-weight:bold; -font-size:14px; -min-height:35px; -} - -QWidget .QFrame#frame .QLabel#labelBalance { /* Available Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -font-weight:bold; -color:#01698d; -margin-left:0px; -} - -QWidget .QFrame#frame .QLabel#labelWatchAvailable { /* Watch-only Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:16px; -} - -QWidget .QFrame#frame .QLabel#labelPendingText { /* Pending Balance Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -font-size:12px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#frame .QLabel#labelUnconfirmed { /* Pending Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:0px; -} - -QWidget .QFrame#frame .QLabel#labelWatchPending { /* Watch-only Pending Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:16px; -} - -QWidget .QFrame#frame .QLabel#labelImmatureText { /* Immature Balance Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -font-size:12px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#frame .QLabel#labelImmature { /* Immature Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:0px; -} - -QWidget .QFrame#frame .QLabel#labelWatchImmature { /* Watch-only Immature Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:16px; -} - -QWidget .QFrame#frame .QLabel#labelTotalText { /* Total Balance Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -font-size:12px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#frame .QLabel#labelTotal { /* Total Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:0px; -} - -QWidget .QFrame#frame .QLabel#labelWatchTotal { /* Watch-only Total Balance */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -font-size:12px; -margin-left:16px; -} - -/* PRIVATESEND WIDGET */ - -QWidget .QFrame#framePrivateSend { /* PrivateSend Widget */ -background-color:transparent; -max-width: 451px; -min-width: 451px; -max-height: 350px; -} - -QWidget .QFrame#framePrivateSend .QWidget#layoutWidgetPrivateSendHeader { /* PrivateSend Header */ -max-width: 421px; -min-width: 421px; -} - -QWidget .QFrame#framePrivateSend .QLabel#labelPrivateSendHeader { /* PrivateSend Header */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#01698d; -color:#fff; -margin-right:5px; -padding-right:5px; -font-weight:bold; -font-size:14px; -min-height:35px; -max-height:35px; -} -/******************************************************************/ -QWidget .QFrame#framePrivateSend .QLabel#labelPrivateSendSyncStatus { /* PrivateSend Sync Status */ -qproperty-alignment: 'AlignVCenter | AlignLeft'; -margin-left:2px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget { -max-width: 451px; -max-height: 175px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget > .QLabel { -min-width:175px; -font-weight:normal; -min-height:25px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelPrivateSendEnabledText { /* PrivateSend Status Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelPrivateSendEnabled { /* PrivateSend Status */ - -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelCompletitionText { /* PrivateSend Completion Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; - -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QProgressBar#privateSendProgress { /* PrivateSend Completion */ -border: 1px solid #01698d; -border-radius: 10px; -margin-right:43px; -text-align: right; -color:#01698d; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QProgressBar#privateSendProgress::chunk { -background-color: #01698d; -width:1px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelAnonymizedText { /* PrivateSend Balance Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelAnonymized { /* PrivateSend Balance */ - -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelAmountAndRoundsText { /* PrivateSend Amount and Rounds Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelAmountRounds { /* PrivateSend Amount and Rounds */ - -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelSubmittedDenomText { /* PrivateSend Submitted Denom Label */ -qproperty-alignment: 'AlignVCenter | AlignRight'; -min-width:160px; -background-color:#F8F6F6; -margin-right:5px; -padding-right:5px; -} - -QWidget .QFrame#framePrivateSend #privateSendFormLayoutWidget .QLabel#labelSubmittedDenom { /* PrivateSend Submitted Denom */ - -} - -QWidget .QFrame#framePrivateSend .QWidget#layoutWidgetLastMessageAndButtons { -max-width: 451px; -} - -QWidget .QFrame#framePrivateSend .QLabel#labelPrivateSendLastMessage { /* PrivateSend Status Notifications */ -qproperty-alignment: 'AlignVCenter | AlignCenter'; -min-width: 288px; -min-height: 43px; -font-size:11px; -color:#01698d; -} - -/* PRIVATESEND BUTTONS */ - -QWidget .QFrame#framePrivateSend .QPushButton { /* PrivateSend Buttons - General Attributes */ -border:0px solid #ffffff; -} - -QWidget .QFrame#framePrivateSend QPushButton:focus { -border:none; -outline:none; -} - -QWidget .QFrame#framePrivateSend .QPushButton#togglePrivateSend { /* Start PrivateSend Mixing */ -font-size:15px; -font-weight:bold; -color:#ffffff; -padding-left:10px; -padding-right:10px; -padding-top:5px; -padding-bottom:6px; -} - -QWidget .QFrame#framePrivateSend .QPushButton#togglePrivateSend:hover { - -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendAuto { /* Try Mix Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -min-height:25px; -font-size:9px; -padding:0px; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendAuto:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendAuto:pressed { -border:1px solid #9e9e9e; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendReset { /* Reset Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -min-height:25px; -font-size:9px; -padding:0px; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendReset:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendReset:pressed { -border:1px solid #9e9e9e; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendInfo { /* Info Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -min-height:25px; -font-size:9px; -padding:0px; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendInfo:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget .QFrame#framePrivateSend .QPushButton#privateSendInfo:pressed { -border:1px solid #9e9e9e; -} - -/* RECENT TRANSACTIONS */ - -QWidget .QFrame#frame_2 { /* Transactions Widget */ -min-width:410px; -margin-right:20px; -margin-left:0; -margin-top:0; -background-image: url(':/images/blue/res/images/blue/dash_logo_horizontal'); -background-repeat:none; -} - -QWidget .QFrame#frame_2 .QLabel#label_4 { /* Recent Transactions Label */ -min-width:180px; -color:#01698d; -margin-left:67px; -margin-top:83px; -margin-right:5px; -padding-right:5px; -font-weight:bold; -font-size:15px; -min-height:24px; -} - -QWidget .QFrame#frame_2 .QLabel#labelTransactionsStatus { /* Recent Transactions Sync Status */ -qproperty-alignment: 'AlignBottom | AlignRight'; -min-width:93px; -margin-top:83px; -margin-left:16px; -margin-right:5px; -min-height:16px; -} - -QWidget .QFrame#frame_2 QListView { /* Transaction List */ -font-weight:normal; -font-size:12px; -max-width:369px; -margin-top:12px; -margin-left:0px; /* CSS Voodoo - set to -66px to hide default transaction icons */ -} - -/* MODAL OVERLAY */ - -QWidget#bgWidget { /* The 'frame' overlaying the overview-page */ - background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); - color:#616161; - padding-left:10px; - padding-right:10px; -} - -QWidget#bgWidget .QPushButton#warningIcon { -width:64px; -height:64px; -padding:5px; -background-color:transparent; -} - -QWidget#contentWidget { /* The actual content with the text/buttons/etc... */ -border-image: url(':/images/blue/res/images/blue/blue_walletFrame_bg') 0 0 0 0 stretch stretch; -border-top:0px solid #000; -margin:0; -padding-top:20px; -padding-bottom: 20px; -} - -QWidget#bgWidget .QPushButton#closeButton { - -} - -/* SEND DIALOG */ - -QDialog#SendCoinsDialog .QFrame#frameCoinControl { /* Coin Control Section */ - -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl > .QLabel { /* Default Font Color and Size */ -font-weight:normal; -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QPushButton#pushButtonCoinControl { /* Coin Control Inputs Button */ -padding-left:10px; -padding-right:10px; -min-height:25px; -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QLabel#labelCoinControlFeatures { /* Coin Control Header */ -color:#01698d; -font-weight:bold; -font-size:14px; -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QWidget#widgetCoinControl { /* Coin Control Inputs */ -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QWidget#widgetCoinControl > .QLabel { /* Coin Control Inputs Labels */ -padding:2px; -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QCheckBox#checkBoxCoinControlChange { /* Custom Change Label */ -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QValidatedLineEdit#lineEditCoinControlChange { /* Custom Change Address */ -} - -QDialog#SendCoinsDialog .QFrame#frameCoinControl .QLabel#labelCoinControlChangeLabel { /* Custom Change Address Validation Label */ -font-weight:normal; -qproperty-margin:-6; -margin-right:112px; -} - -QDialog#SendCoinsDialog .QScrollArea#scrollArea .QWidget#scrollAreaWidgetContents { /* Send To Widget */ -background:transparent; -} - -QDialog#SendCoinsDialog .QPushButton#sendButton { /* Send Button */ -padding-left:10px; -padding-right:10px; -} - -QDialog#SendCoinsDialog .QPushButton#clearButton { /* Clear Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QDialog#SendCoinsDialog .QPushButton#clearButton:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QDialog#SendCoinsDialog .QPushButton#clearButton:pressed { -border:1px solid #9e9e9e; -} - -QDialog#SendCoinsDialog .QPushButton#addButton { /* Add Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QDialog#SendCoinsDialog .QPushButton#addButton:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QDialog#SendCoinsDialog .QPushButton#addButton:pressed { -border:1px solid #9e9e9e; -} - -QDialog#SendCoinsDialog .QCheckBox#checkUsePrivateSend { /* PrivateSend Checkbox */ -color:#616161; -font-weight:bold; -background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 rgba(248, 246, 246, 128), stop: 1 rgba(0, 0, 0, 0)); -border-radius:10px; -padding-top:20px; -padding-bottom:18px; -} - -QDialog#SendCoinsDialog .QCheckBox#checkUseInstantSend { /* InstantSend Checkbox */ -color:#616161; -font-weight:bold; -background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 rgba(248, 246, 246, 128), stop: 1 rgba(0, 0, 0, 0)); -border-radius:10px; -padding-top:20px; -padding-bottom:18px; -margin-left:10px; -margin-right:20px; -} - -/* This QLabel uses name = "label" which conflicts with Address Book -> New Address */ -/* To maximize backwards compatibility this formatting has been removed */ - -QDialog#SendCoinsDialog QLabel#label { -/*margin-left:20px; -margin-right:-2px; -padding-right:-2px; -color:#616161; -font-size:14px; -font-weight:bold; -border-radius:5px; -padding-top:20px; -padding-bottom:20px;*/ -min-height:27px; -} - -QDialog#SendCoinsDialog QLabel#labelBalance { -margin-left:0px; -padding-left:0px; -color:#333333; -/* font-weight:bold; -border-radius:5px; -padding-top:20px; -padding-bottom:20px; */ -min-height:27px; -} - -#checkboxSubtractFeeFromAmount { -padding-left:10px; -} - -/* SEND COINS ENTRY */ - -QStackedWidget#SendCoinsEntry .QFrame#SendCoins > .QLabel { /* Send Coin Entry Labels */ -background-color:#01698d; -min-width:102px; -font-weight:bold; -font-size:11px; -color:#ffffff; -min-height:25px; -margin-right:5px; -padding-right:5px; -} - -QStackedWidget#SendCoinsEntry .QFrame#SendCoins .QLabel#amountLabel { -background-color:#6a6a6a; -} - -QStackedWidget#SendCoinsEntry .QValidatedLineEdit#payTo { /* Pay To Input Field */ -} - -QStackedWidget#SendCoinsEntry .QToolButton { /* General Settings for Pay To Icons */ -background-color:transparent; -padding-left:5px; -padding-right:5px; -border: 0; -outline: 0; -} - -QStackedWidget#SendCoinsEntry .QToolButton#addressBookButton { /* Address Book Button */ -padding-left:10px; -} - -QStackedWidget#SendCoinsEntry .QToolButton#addressBookButton { -} - -QStackedWidget#SendCoinsEntry .QToolButton#pasteButton { -} - -QStackedWidget#SendCoinsEntry .QToolButton#deleteButton { -} - -QStackedWidget#SendCoinsEntry .QLineEdit#addAsLabel { /* Pay To Input Field */ -} - -/* COIN CONTROL POPUP */ - -QDialog#CoinControlDialog { /* Coin Control Dialog Window */ -background-color:#F8F6F6; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlQuantityText { /* Coin Control Quantity Label */ -min-height:30px; -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlQuantity { /* Coin Control Quantity */ -min-height:30px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlBytesText { /* Coin Control Bytes Label */ -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlBytes { /* Coin Control Bytes */ -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlAmountText { /* Coin Control Amount Label */ -min-height:30px; -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlAmount { /* Coin Control Amount */ -min-height:30px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlPriorityText { /* Coin Control Priority Label */ -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlPriority { /* Coin Control Priority */ -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlFeeText { /* Coin Control Fee Label */ -min-height:30px; -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlFee { /* Coin Control Fee */ -min-height:30px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlLowOutputText { /* Coin Control Low Output Label */ -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlLowOutput { /* Coin Control Low Output */ -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlAfterFeeText { /* Coin Control After Fee Label */ -min-height:30px; -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlAfterFee { /* Coin Control After Fee */ -min-height:30px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlChangeText { /* Coin Control Change Label */ -padding-left:15px; -} - -QDialog#CoinControlDialog .QLabel#labelCoinControlChange { /* Coin Control Change */ - -} - -QDialog#CoinControlDialog .QFrame#frame .QPushButton#pushButtonSelectAll { /* (un)select all button */ -padding-left:10px; -padding-right:10px; -min-height:25px; -} - -QDialog#CoinControlDialog .QFrame#frame .QPushButton#pushButtonToggleLock { /* Toggle lock state button */ -padding-left:10px; -padding-right:10px; -min-height:25px; -} - -QDialog#CoinControlDialog .QDialogButtonBox#buttonBox QPushButton { /* Coin Control 'OK' button */ -} - -QDialog#CoinControlDialog .QFrame#frame .QRadioButton#radioTreeMode { /* Coin Control Tree Mode Selector */ -color:#01698d; -background-color:transparent; -} - -QDialog#CoinControlDialog .QFrame#frame .QRadioButton#radioListMode { /* Coin Control List Mode Selector */ -color:#01698d; -background-color:transparent; -} - -QDialog#CoinControlDialog QHeaderView::section:first { /* Bug Fix: the number "1" displays in this table for some reason... */ -color:transparent; -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget { /* Coin Control Widget Container */ -outline:0; -background-color:#ffffff; -border:0px solid #01698d; -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::item { -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::item:selected { /* Coin Control Item (selected) */ -background-color:#f7f7f7; -color:#333; -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::item:checked { /* Coin Control Item (checked) */ -background-color:#f7f7f7; -color:#333; -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::branch:selected { /* Coin Control Branch Icon */ -background-image: url(':/images/blue/res/images/blue/blue_qtreeview_selected'); -background-repeat:no-repeat; -background-position:center; -background-color:#f7f7f7; -color:#333; -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::branch:checked { /* Coin Control Branch Icon */ -background-image: url(':/images/blue/res/images/blue/blue_qtreeview_selected'); -background-repeat:no-repeat; -background-position:center; -background-color:#f7f7f7; -color:#333; -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::seperator { - -} - -QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::indicator { /* Coin Control Widget Checkbox */ - -} - -/* RECEIVE COINS */ - -QWidget#ReceiveCoinsDialog .QFrame#frame2 .QLabel#label_2 { /* Label Label */ -background-color:#01698d; -min-width:102px; -color:#ffffff; -font-weight:bold; -font-size:11px; -padding-right:5px; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame2 .QLabel#label { /* Amount Label */ -background-color:#6a6a6a; -min-width:102px; -color:#ffffff; -font-weight:bold; -font-size:11px; -padding-right:5px; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame2 .QLabel#label_3 { /* Message Label */ -background-color:#01698d; -min-width:102px; -color:#ffffff; -font-weight:bold; -font-size:11px; -padding-right:5px; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame2 QPushButton#clearButton { /* Clear Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame2 QPushButton#clearButton:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame2 QPushButton#clearButton:pressed { -border:1px solid #9e9e9e; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#showRequestButton { /* Show Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#showRequestButton:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#showRequestButton:pressed { -border:1px solid #9e9e9e; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#removeRequestButton { /* Remove Button */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb); -border:1px solid #d2d2d2; -color:#616161; -padding-left:10px; -padding-right:10px; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#removeRequestButton:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb); -color:#333; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#removeRequestButton:pressed { -border:1px solid #9e9e9e; -} - -QWidget#ReceiveCoinsDialog .QFrame#frame .QLabel#label_6 { /* Requested Payments History Label */ -color:#01698d; -font-weight:bold; -font-size:14px; -} - -/* RECEIVE COINS DIALOG */ - -QDialog#ReceiveRequestDialog { -background-color:#F8F6F6; -} - -QDialog#ReceiveRequestDialog QTextEdit { /* Contents of Receive Coin Dialog */ -border:1px solid #d7d7d7; -} - -/* General QR-code DIALOG */ - -QDialog#QRDialog { -background-color:#F8F6F6; -} - -QDialog#QRDialog QTextEdit { /* Contents of QR-code Dialog */ -border:1px solid #d7d7d7; -} - -/* TRANSACTIONS PAGE */ - -TransactionView QLineEdit { /* Filters */ -margin-bottom:2px; -margin-right:1px; -min-width:111px; -text-align:center; -} - -TransactionView QLineEdit#addressWidget { /* Address Filter */ -margin-bottom:2px; -margin-right:1px; -min-width:900px; -text-align:center; -} - -TransactionView QLineEdit#amountWidget { /* Amount Filter */ -margin-bottom:2px; -margin-right:1px; -max-width:100px; -text-align:center; -} - -TransactionView QComboBox { -margin-bottom:1px; -margin-right:1px; -} - -QLabel#transactionSumLabel { /* Example of setObjectName for widgets without name */ -color:#333333; -font-weight:bold; -} - -QLabel#transactionSum { /* Example of setObjectName for widgets without name */ -color:#333333; -} - -/* TRANSACTION DETAIL DIALOG */ - -QDialog#TransactionDescDialog { -background-color:#F8F6F6; -} - -QDialog#TransactionDescDialog QTextEdit { /* Contents of Receive Coin Dialog */ -border:1px solid #d7d7d7; -} - - -/* QT */ -QLineEdit#sendAddressBalance{ - min-width: 175px; - max-width: 225px; - font: bold; -} - -QComboBox#inputsCombo QListView { -border:2px solid #01698d; -padding-right:1px; -padding-left:1px; - font: normal; -} - -QComboBox#listReceiveAddresses -{ - font: normal; -} - -QComboBox#listReceiveAddresses QListView { -border:2px solid #01698d; -padding-right:1px; -padding-left:1px; - font: normal; -} - -.QValidatedLineEdit, .QLineEdit { /* Text Entry Fields */ - border: 1px solid #01698d; - font-size:11px; - min-height:25px; - outline:0; - padding:3px; - background-color:#fcfcfc; - color:#333333; - } - - .QLineEdit:!focus { - font-size:12px; - } - - .QValidatedLineEdit:disabled, .QLineEdit:disabled { - background-color:#f2f2f2; - } - - /* Form elements */ -QLineEdit { /* inputs */ - border-radius: 4px; - border: 1px solid #c5cad3; - padding: 5px; - font: 12px "Volte"; diff --git a/res/css/dark.css b/res/css/dark.css deleted file mode 100644 index 7846b253..00000000 --- a/res/css/dark.css +++ /dev/null @@ -1,88 +0,0 @@ - -QWidget, QMainWindow, QMenuBar, QMenu, QDialog, QTabWidget, QTableView, QTableView::item, QScrollArea, QGroupBox, QPlainTextEdit, QLineEdit, QLabel, MainWindow -{ - background-color: #303335; - color: #ffffff; -} - -QTabWidget QTabBar::tab { -padding-left:20px; -padding-right:20px; -padding-top:5px; -padding-bottom:5px; -border: 1px solid #525355; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #3E4244); -} - -QTabWidget QTabBar::tab:selected { -min-height: 10px; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #525355, stop: 1 #303335); -color:#fff; -border: 1px ridge #000; -} - -QTabWidget QTabBar::tab:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #3E4244); -color:#fff; -border: 1px ridge #fff; -min-height: 20px -} - -QHeaderView { /* Table Header */ -background-color:#303335; -} - -QHeaderView::section { /* Table Header Sections */ -qproperty-alignment:center; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #3E4244); -color:#fff; -min-height:25px; -font-weight:bold; -font-size:11px; -outline:0; -border:1px solid #525355; -border-right:1px solid #fff; -border-left:1px solid #fff; -padding-left:5px; -padding-right:5px; -padding-top:2px; -padding-bottom:2px; -} - -QHeaderView::section:last { -border-right: 0px solid #d7d7d7; -} - -QScrollArea { -background:transparent; -border:0px; -} - -QTableView { /* Table - has to be selected as a class otherwise it throws off QCalendarWidget */ -background:#303335; -} - -QTableView::item { /* Table Item */ -background-color:#303335; -border:1px solid #fff; -font-size:12px; -} - -QTableView::item:selected { /* Table Item Selected */ -background-color:#fff; -color:#000; -} - -QMenuBar { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #525355, stop: 1 #303335); -color: #fff; -} - -QMenuBar::item { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #525355, stop: 1 #303335); -color: #fff; -} - -QMenuBar::item:selected { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #3E4244); -} diff --git a/res/css/default.css b/res/css/default.css deleted file mode 100644 index ac10db5c..00000000 --- a/res/css/default.css +++ /dev/null @@ -1,5 +0,0 @@ -QWidget, QMainWindow, QMenuBar, QMenu, QDialog, QTabWidget, QTableView, QTableView::item, QScrollArea, QGroupBox, QPlainTextEdit, QLineEdit, QLabel, MainWindow -{ - /**/ - -} diff --git a/res/css/light.css b/res/css/light.css deleted file mode 100644 index 16b9a0b2..00000000 --- a/res/css/light.css +++ /dev/null @@ -1,90 +0,0 @@ -QWidget, QMainWindow, QMenuBar, QMenu, QDialog, QTabWidget, QTableView, QTableView::item, QScrollArea, QGroupBox, QWidget, QPlainTextEdit, QLineEdit, QLabel, MainWindow -{ - background-color: #dadada; - color: #000000; - -} - -QTabWidget QTabBar::tab { -padding-left:20px; -padding-right:20px; -padding-top:5px; -padding-bottom:5px; -border: 1px solid #525355; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #DADADA, stop: 1 #747577); -color:#fff; -} - -QTabWidget QTabBar::tab:selected { -min-height: 10px; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #DADADA); -color:#000; -border: 1px ridge #000; -} - -QTabWidget QTabBar::tab:hover { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #DADADA); -color:#000; -border: 1px ridge #fff; -min-height: 20px -} - -QHeaderView { /* Table Header */ -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #DADADA, stop: 1 #747577); -} - -QHeaderView::section { /* Table Header Sections */ -qproperty-alignment:center; -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #DADADA, stop: 1 #747577); -color:#fff; -min-height:25px; -font-weight:bold; -font-size:11px; -outline:0; -border:1px solid #747577; -border-right:1px solid #fff; -border-left:1px solid #fff; -padding-left:5px; -padding-right:5px; -padding-top:2px; -padding-bottom:2px; -} - -QHeaderView::section:last { -border-right: 0px solid #d7d7d7; -} - -QScrollArea { -background:transparent; -border:0px; -} - -QTableView { /* Table - has to be selected as a class otherwise it throws off QCalendarWidget */ -background:#DADADA; -} - -QTableView::item { /* Table Item */ -background-color:#DADADA; -border:1px solid #fff; -font-size:12px; -} - -QTableView::item:selected { /* Table Item Selected */ -background-color:#747577; -color:#fff; -} - -QMenuBar { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #DADADA, stop: 1 #747577); -color: #fff; -} - -QMenuBar::item { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #DADADA, stop: 1 #747577); -color: #fff; -} - -QMenuBar::item:selected { -background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #747577, stop: 1 #DADADA); -color:#000; -} diff --git a/res/dmgbg.png b/res/dmgbg.png deleted file mode 100644 index 27da5249..00000000 Binary files a/res/dmgbg.png and /dev/null differ diff --git a/res/icon.ico b/res/icon.ico deleted file mode 100644 index 1434c8af..00000000 Binary files a/res/icon.ico and /dev/null differ diff --git a/res/images/blue/blue_downArrow.png b/res/images/blue/blue_downArrow.png deleted file mode 100644 index e26c529d..00000000 Binary files a/res/images/blue/blue_downArrow.png and /dev/null differ diff --git a/res/images/blue/blue_downArrow_small.png b/res/images/blue/blue_downArrow_small.png deleted file mode 100644 index 0f66a1a6..00000000 Binary files a/res/images/blue/blue_downArrow_small.png and /dev/null differ diff --git a/res/images/blue/blue_leftArrow_small.png b/res/images/blue/blue_leftArrow_small.png deleted file mode 100644 index eb0f63ec..00000000 Binary files a/res/images/blue/blue_leftArrow_small.png and /dev/null differ diff --git a/res/images/blue/blue_qtreeview_selected.png b/res/images/blue/blue_qtreeview_selected.png deleted file mode 100644 index 2656a1ef..00000000 Binary files a/res/images/blue/blue_qtreeview_selected.png and /dev/null differ diff --git a/res/images/blue/blue_rightArrow_small.png b/res/images/blue/blue_rightArrow_small.png deleted file mode 100644 index 6041a526..00000000 Binary files a/res/images/blue/blue_rightArrow_small.png and /dev/null differ diff --git a/res/images/blue/blue_upArrow_small.png b/res/images/blue/blue_upArrow_small.png deleted file mode 100644 index 4e854fdf..00000000 Binary files a/res/images/blue/blue_upArrow_small.png and /dev/null differ diff --git a/res/images/blue/checked.png b/res/images/blue/checked.png deleted file mode 100644 index 91a675a7..00000000 Binary files a/res/images/blue/checked.png and /dev/null differ diff --git a/res/images/blue/unchecked.png b/res/images/blue/unchecked.png deleted file mode 100644 index 9aabccb2..00000000 Binary files a/res/images/blue/unchecked.png and /dev/null differ diff --git a/res/images/sapling paper.png b/res/images/sapling paper.png deleted file mode 100644 index 85e0da72..00000000 Binary files a/res/images/sapling paper.png and /dev/null differ diff --git a/res/liblibsodium.a b/res/liblibsodium.a deleted file mode 100644 index 363c7437..00000000 Binary files a/res/liblibsodium.a and /dev/null differ diff --git a/res/libsodium.lib b/res/libsodium.lib deleted file mode 100644 index 7a93b9d0..00000000 Binary files a/res/libsodium.lib and /dev/null differ diff --git a/res/libsodium/buildlibsodium.sh b/res/libsodium/buildlibsodium.sh deleted file mode 100755 index e185369f..00000000 --- a/res/libsodium/buildlibsodium.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -# First thing to do is see if libsodium.a exists in the res folder. If it does, then there's nothing to do -if [ -f res/libsodium.a ]; then - exit 0 -fi - -echo "Building libsodium" - -# Go into the lib sodium directory -cd res/libsodium -if [ ! -f libsodium-1.0.16.tar.gz ]; then - curl -LO https://download.libsodium.org/libsodium/releases/old/libsodium-1.0.16.tar.gz -fi - -if [ ! -d libsodium-1.0.16 ]; then - tar xf libsodium-1.0.16.tar.gz -fi - -# Now build it -cd libsodium-1.0.16 -LIBS="" ./configure -make clean -if [[ "$OSTYPE" == "darwin"* ]]; then - make CFLAGS="-mmacosx-version-min=10.11" CPPFLAGS="-mmacosx-version-min=10.11" -j4 -else - make -j8 -fi -cd .. - -# copy the library to the parents's res/ folder -cp libsodium-1.0.16/src/libsodium/.libs/libsodium.a ../ diff --git a/res/libsodiumd.lib b/res/libsodiumd.lib deleted file mode 100644 index 98a68f87..00000000 Binary files a/res/libsodiumd.lib and /dev/null differ diff --git a/res/loading.gif b/res/loading.gif deleted file mode 100644 index 891c0f88..00000000 Binary files a/res/loading.gif and /dev/null differ diff --git a/res/logo.icns b/res/logo.icns deleted file mode 100644 index 0bc4c351..00000000 Binary files a/res/logo.icns and /dev/null differ diff --git a/res/logo.svg b/res/logo.svg deleted file mode 100644 index 70f95bc3..00000000 --- a/res/logo.svg +++ /dev/null @@ -1,143 +0,0 @@ - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/logobig.gif b/res/logobig.gif deleted file mode 100644 index 4bc6e1ee..00000000 Binary files a/res/logobig.gif and /dev/null differ diff --git a/res/mkicns.sh b/res/mkicns.sh deleted file mode 100755 index 2f6e61e8..00000000 --- a/res/mkicns.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -### -# Adapted from: https://stackoverflow.com/a/20703594 -### - -if [ -z "${1+set}" ]; then - echo "Pass path to the inkscape command as first argument" - exit 1 -fi -if [ -z "${2+set}" ]; then - echo "Pass svg file as second argument" - exit 1 -fi -if [ -z "${3+set}" ]; then - echo "Pass output name (w/o .icns) as third argument" - exit 1 -fi - -inkscape=$1 -svg_file=$2 -output_name=$3 - -set -e -mkdir $output_name.iconset -$inkscape -z -e "$PWD/$output_name.iconset/icon_16x16.png" -w 16 -h 16 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_16x16@2x.png" -w 32 -h 32 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_32x32.png" -w 32 -h 32 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_32x32@2x.png" -w 64 -h 64 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_128x128.png" -w 128 -h 128 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_128x128@2x.png" -w 256 -h 256 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_256x256.png" -w 256 -h 256 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_256x256@2x.png" -w 512 -h 512 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_512x512.png" -w 512 -h 512 -y 0 "$PWD/$svg_file" -$inkscape -z -e "$PWD/$output_name.iconset/icon_512x512@2x.png" -w 1024 -h 1024 -y 0 "$PWD/$svg_file" -iconutil -c icns "$output_name.iconset" -rm -R "$output_name.iconset" - diff --git a/res/paymentreq.gif b/res/paymentreq.gif deleted file mode 100644 index f451982d..00000000 Binary files a/res/paymentreq.gif and /dev/null differ diff --git a/res/qt5.natvis b/res/qt5.natvis deleted file mode 100644 index 95eedd0d..00000000 --- a/res/qt5.natvis +++ /dev/null @@ -1,712 +0,0 @@ - - - - - - - - {{ x = {xp}, y = {yp} }} - - xp - yp - - - - - {{ x = {x1}, y = {y1}, width = {x2 - x1 + 1}, height = {y2 - y1 + 1} }} - - x1 - y1 - x2 - x1 + 1 - y2 - y1 + 1 - - - - - {{ x = {xp}, y = {yp}, width = {w}, height = {h} }} - - xp - yp - w - h - - - - - - {{ width = {wd}, height = {ht} }} - - wd - ht - - - - - - {{ start point = {pt1}, end point = {pt2} }} - - - {pt1} - - pt1 - - - - {pt2} - - pt2 - - - - - - - - {{ size = {d->size} }} - - d->ref.atomic._q_value - - d->size - (QPoint*)((reinterpret_cast<char*>(d)) + d->offset) - - - - - - {{ size = {d->size} }} - - - d->size > 0 - && ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).xp - == (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).xp) - && ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).yp - == (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).yp) - - d->ref.atomic._q_value - - d->size - (QPointF*)((reinterpret_cast<char*>(d)) + d->offset) - - - - - - {{ x = {xp}, y = {yp} }} - - xp - yp - - - - - {{ x = {xp}, y = {yp}, z = {zp} }} - - xp - yp - zp - - - - - {{ x = {xp}, y = {yp}, z = {zp}, w = {wp} }} - - xp - yp - zp - wp - - - - - - {{ m11 = {_m11}, m12 = {_m12}, m21 = {_m21}, m22 = {_m22}, ... }} - - - _m11 - _m12 - _m21 - _m22 - _dx - _dy - - - - - - {{ m11 = {m[0][0]}, m12 = {m[1][0]}, m13 = {m[2][0]}, m14 = {m[3][0]}, ... }} - - - m[0][0] - m[1][0] - m[2][0] - m[3][0] - m[0][1] - m[1][1] - m[2][1] - m[3][1] - m[0][2] - m[1][2] - m[2][2] - m[3][2] - m[0][3] - m[1][3] - m[2][3] - m[3][3] - - - - - - {{ horizontal = {static_cast<Policy>(bits.horPolicy)}, vertical = {static_cast<Policy>(bits.verPolicy)}, type = {ControlType(1 << bits.ctype)} }} - - - - QSizePolicy::Policy::{static_cast<Policy>(bits.verPolicy)} - - - QSizePolicy::Policy::{static_cast<Policy>(bits.horPolicy)} - - - QSizePolicy::ControlType::{ControlType(1 << bits.ctype)} - - - - Qt::Vertical (2) - - - Qt::Horizontal (1) - - - static_cast<int>(bits.verStretch) - static_cast<int>(bits.horStretch) - bits.hfw == 1 - bits.wfh == 1 - - - - - {ucs,c} - ucs,c - - ucs > 0xff ? '\0' : char(ucs),c - ucs,c - - - - - {((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),sub} - ((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),sub - - d->size - d->ref.atomic._q_value - - d->size - ((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),c - - - - - - {((reinterpret_cast<char*>(d)) + d->offset),sb} - ((reinterpret_cast<char*>(d)) + d->offset),sb - - d->size - d->ref.atomic._q_value - - d->size - ((reinterpret_cast<char*>(d)) + d->offset),c - - - - - - {{ size = {(d.d->size << 3) - *((reinterpret_cast<char*>(d.d)) + d.d->offset)} }} - - d.d->ref.atomic._q_value - - (d.d->size << 3) - *((reinterpret_cast<char*>(d.d)) + d.d->offset) - - (*(reinterpret_cast<const unsigned char*>((reinterpret_cast<char*>(d.d)) + d.d->offset) + 1 - + ($i >> 3)) & (1 << ($i & 7))) != 0 - - - - - - - - {{ size = {s} }} - - a - - s - ptr - - - - - - {{ julian day = {jd} }} - - - - - {{ millisecond = {mds} }} - {{ milliseconds = {mds} }} - - mds / 3600000, d - mds / 3600000, d - (mds % 3600000) / 60000, d - (mds % 3600000) / 60000, d - (mds / 1000) % 60, d - (mds / 1000) % 60, d - mds % 1000, d - mds % 1000, d - - - - - {d.pattern} - - - - - ref._q_value - - - - - strong reference to shared pointer of type {"$T1"} - - value == 0 - d->weakref._q_value - d->strongref._q_value - - - - - pointer to implicit shared object of type {"$T1"} - - d - - - - - pointer to explicit shared object of type {"$T1"} - - d - - - - - guarded pointer to subclass of QObject of type {"$T1"} - - wp.d == 0 || wp.d->strongref._q_value == 0 || wp.value == 0 - - - - - weak reference to shared pointer of type {"$T1"} - - d == 0 || d->strongref._q_value == 0 || value == 0 - d->weakref._q_value - d->strongref._q_value - - - - - scoped pointer to a dynamically allocated object of type {"$T1"} - - !d - - - - - scoped pointer to dynamically allocated array of objects of type {"$T1"} - - !d - - - - - ({first}, {second}) - - first - second - - - - - - {{ size = {d->size} }} - - d->ref.atomic._q_value - - d->size - ($T1*)((reinterpret_cast<char*>(d)) + d->offset) - - - - - - - - {{ size = {d->end - d->begin} }} - - d->ref.atomic._q_value - - d->end - d->begin - *reinterpret_cast<$T1*>((sizeof($T1) > sizeof(void*)) - ? reinterpret_cast<Node*>(d->array + d->begin + $i)->v - : reinterpret_cast<$T1*>(d->array + d->begin + $i)) - - - - - - - {{ size = {d->size} }} - - d->ref.atomic._q_value - - d->size - d->n - n - (*(QLinkedListNode<$T1>*)this).t - - - - - - ({key}, {value}) - - key - value - - - - - - {{ size = {d->size} }} - - d->ref.atomic._q_value - - d->size - d->header.left - left - right - *((QMapNode<$T1,$T2>*)this) - - - - - - (empty) - ({key}, {value}) - - key - value - - - - - - {{ size = {d->size} }} - - d->ref.atomic._q_value - - d->numBuckets - *((QHashNode<$T1,$T2>*)d->buckets[$i]) - - - - - - (empty) - ({key}) - - key - - - - - {{ size = {q_hash.d->size} }} - - q_hash - - - - - ({*keyPtr}, {*t}) - - *keyPtr - *t - - - - - {{ size = {hash.d->size} }} - - mx - total - hash.d->ref.atomic._q_value - - hash.d->size - f - n - *((Node*)this) - - - - - - - - Invalid - {d.data.b} - {d.data.i} - {d.data.u} - {d.data.ll} - {d.data.ull} - {d.data.d} - {d.data.c} - - {*((QMap<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QList<QVariant>*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QString*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QStringList*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QByteArray*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QBitArray*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QDate*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QTime*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - DateTime - Url - Locale - - {*((QRect*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QRectF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QSize*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QSizeF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QLine*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QLineF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QPoint*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - - {*((QPointF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - RegExp - RegularExpression - - {*((QHash<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr)))} - - EasingCurve - Uuid - ModelIndex - LastCoreType - Font - Pixmap - Brush - Color - Palette - Image - Polygon - Region - Bitmap - Cursor - KeySequence - Pen - TextLength - TextFormat - Matrix - Transform - Matrix4x4 - Vector2D - Vector3D - Vector4D - Quaternion - PolygonF - Icon - LastGuiType - SizePolicy - UserType - LastType - - - - - - d.data.c - - - *((QString*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - - *((QByteArray*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - - - - - - - *((QMap<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QList<QVariant>*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QString*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QStringList*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QByteArray*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QBitArray*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QDate*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QTime*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QRect*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QRectF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QSize*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QSizeF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QLine*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QLineF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QPoint*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QPointF*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - *((QHash<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr - : reinterpret_cast<const void *>(&d.data.ptr))) - - - - - - - diff --git a/res/resize.sh b/res/resize.sh deleted file mode 100755 index c365cf98..00000000 --- a/res/resize.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -for size in 16 32 48 128 256; do - inkscape -z -e $size.png -w $size -h $size logo.svg >/dev/null 2>/dev/null -done -convert 16.png 32.png 48.png 128.png 256.png -colors 256 icon.ico -rm 16.png 32.png 48.png 128.png 256.png diff --git a/res/wormholeconnect.png b/res/wormholeconnect.png deleted file mode 100644 index ccd478b1..00000000 Binary files a/res/wormholeconnect.png and /dev/null differ diff --git a/res/wxsbanner.bmp b/res/wxsbanner.bmp deleted file mode 100644 index ede9d60f..00000000 Binary files a/res/wxsbanner.bmp and /dev/null differ diff --git a/res/wxsdialog.bmp b/res/wxsdialog.bmp deleted file mode 100644 index 5e129dda..00000000 Binary files a/res/wxsdialog.bmp and /dev/null differ diff --git a/res/zcashdlogo.gif b/res/zcashdlogo.gif deleted file mode 100644 index bde1631e..00000000 Binary files a/res/zcashdlogo.gif and /dev/null differ diff --git a/res/zec_qt_wallet_de.qm b/res/zec_qt_wallet_de.qm deleted file mode 100644 index 98a1b3b3..00000000 Binary files a/res/zec_qt_wallet_de.qm and /dev/null differ diff --git a/res/zec_qt_wallet_de.ts b/res/zec_qt_wallet_de.ts deleted file mode 100644 index d74cd661..00000000 --- a/res/zec_qt_wallet_de.ts +++ /dev/null @@ -1,2146 +0,0 @@ - - - - - AddressBookModel - - - Label - YOUR_TRANSLATION_HERE - - - - Address - YOUR_TRANSLATION_HERE - - - - BalancesTableModel - - - Address - YOUR_TRANSLATION_HERE - - - - Amount - YOUR_TRANSLATION_HERE - - - - ConnectionDialog - - - ZecWallet - YOUR_TRANSLATION_HERE - - - - Starting Up - YOUR_TRANSLATION_HERE - - - - MainWindow - - - ZecWallet - YOUR_TRANSLATION_HERE - - - - Balance - YOUR_TRANSLATION_HERE - - - - Summary - YOUR_TRANSLATION_HERE - - - - Shielded - YOUR_TRANSLATION_HERE - - - - Transparent - YOUR_TRANSLATION_HERE - - - - Total - YOUR_TRANSLATION_HERE - - - - Some transactions are not yet confirmed - YOUR_TRANSLATION_HERE - - - - Address Balances - YOUR_TRANSLATION_HERE - - - - - Send - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - Address Balance - YOUR_TRANSLATION_HERE - - - - Send To - YOUR_TRANSLATION_HERE - - - - Recipient - YOUR_TRANSLATION_HERE - - - - - - - - Address - YOUR_TRANSLATION_HERE - - - - - Address Book - YOUR_TRANSLATION_HERE - - - - - - - Amount - YOUR_TRANSLATION_HERE - - - - Max Available - YOUR_TRANSLATION_HERE - - - - - - - Memo - YOUR_TRANSLATION_HERE - - - - Add Recipient - YOUR_TRANSLATION_HERE - - - - Recurring payment - - - - - Every month, starting 12-May-2012, for 6 payments - - - - - Edit Schedule - - - - - - Miner Fee - YOUR_TRANSLATION_HERE - - - - 0 - YOUR_TRANSLATION_HERE - - - - Cancel - YOUR_TRANSLATION_HERE - - - - Receive - YOUR_TRANSLATION_HERE - - - - Address Type - YOUR_TRANSLATION_HERE - - - - Validate Address - - - - z-Addr(Sapling) - YOUR_TRANSLATION_HERE - - - - t-Addr - YOUR_TRANSLATION_HERE - - - z-Addr(Sprout) - YOUR_TRANSLATION_HERE - - - - New Address - YOUR_TRANSLATION_HERE - - - - Label - YOUR_TRANSLATION_HERE - - - - Update Label - YOUR_TRANSLATION_HERE - - - - Address balance - - - - - Optional - YOUR_TRANSLATION_HERE - - - - - Export Private Key - YOUR_TRANSLATION_HERE - - - - z-Addr - - - - - - Your node is still syncing, balances may not be updated - - - - - View All Addresses - - - - - Transactions - YOUR_TRANSLATION_HERE - - - - zcashd - YOUR_TRANSLATION_HERE - - - - You are currently not mining - YOUR_TRANSLATION_HERE - - - - - - Loading... - YOUR_TRANSLATION_HERE - - - - Block height - YOUR_TRANSLATION_HERE - - - - Network solution rate - YOUR_TRANSLATION_HERE - - - - Connections - YOUR_TRANSLATION_HERE - - - - - - | - YOUR_TRANSLATION_HERE - - - - &File - YOUR_TRANSLATION_HERE - - - - &Help - YOUR_TRANSLATION_HERE - - - - &Apps - YOUR_TRANSLATION_HERE - - - - &Edit - YOUR_TRANSLATION_HERE - - - - E&xit - YOUR_TRANSLATION_HERE - - - - &About - YOUR_TRANSLATION_HERE - - - - &Settings - YOUR_TRANSLATION_HERE - - - - Ctrl+P - YOUR_TRANSLATION_HERE - - - - &Donate - YOUR_TRANSLATION_HERE - - - - Check github.com for &updates - YOUR_TRANSLATION_HERE - - - - Sapling &turnstile - YOUR_TRANSLATION_HERE - - - - Ctrl+A, Ctrl+T - YOUR_TRANSLATION_HERE - - - - &Import private key - YOUR_TRANSLATION_HERE - - - - &Export all private keys - YOUR_TRANSLATION_HERE - - - &z-board.net - YOUR_TRANSLATION_HERE - - - Ctrl+A, Ctrl+Z - YOUR_TRANSLATION_HERE - - - - Address &book - YOUR_TRANSLATION_HERE - - - - Ctrl+B - YOUR_TRANSLATION_HERE - - - - &Backup wallet.dat - YOUR_TRANSLATION_HERE - - - - - Export transactions - - - - - Pay zcash &URI... - - - - - Connect mobile &app - - - - - Ctrl+M - - - - - &Recurring Payments - - - - - Request zcash... - - - - - File a bug... - - - - - Tor configuration is available only when running an embedded zcashd. - - - - - You're using an external zcashd. Please restart zcashd with -rescan - - - - - You're using an external zcashd. Please restart zcashd with -reindex - - - - - Enable Tor - - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - - - - - Disable Tor - - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - - - - - Thanks for supporting ZecWallet! - YOUR_TRANSLATION_HERE - - - - Donate 0.01 - YOUR_TRANSLATION_HERE - - - - to support ZecWallet - YOUR_TRANSLATION_HERE - - - - You are on testnet, your post won't actually appear on z-board.net - YOUR_TRANSLATION_HERE - - - - You need a sapling address with available balance to post - YOUR_TRANSLATION_HERE - - - - Computing Tx: - YOUR_TRANSLATION_HERE - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - YOUR_TRANSLATION_HERE - - - - Private key import rescan finished - YOUR_TRANSLATION_HERE - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - - - - - Restart ZecWallet - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Paste Zcash URI - - - - - Not yet ready - - - - - zcashd is not yet ready. Please wait for the UI to load - - - - - View tx on block explorer - - - - - Refresh - - - - - Enter Address to validate - - - - - Transparent or Shielded Address: - - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - YOUR_TRANSLATION_HERE - - - - The keys will be imported into your connected zcashd node - YOUR_TRANSLATION_HERE - - - - Error - - - - - Error exporting transactions, file was not saved - - - - - No wallet.dat - YOUR_TRANSLATION_HERE - - - - Couldn't find the wallet.dat on this computer - YOUR_TRANSLATION_HERE - - - - You need to back it up from the machine zcashd is running on - YOUR_TRANSLATION_HERE - - - - Backup wallet.dat - YOUR_TRANSLATION_HERE - - - - Couldn't backup - YOUR_TRANSLATION_HERE - - - - Couldn't backup the wallet.dat file. - YOUR_TRANSLATION_HERE - - - - You need to back it up manually. - YOUR_TRANSLATION_HERE - - - - This might take several minutes. Loading... - - - - - These are all the private keys for all the addresses in your wallet - YOUR_TRANSLATION_HERE - - - - Private key for - YOUR_TRANSLATION_HERE - - - - Save File - YOUR_TRANSLATION_HERE - - - - Unable to open file - YOUR_TRANSLATION_HERE - - - - - Copy address - YOUR_TRANSLATION_HERE - - - - - - Copied to clipboard - YOUR_TRANSLATION_HERE - - - - Get private key - YOUR_TRANSLATION_HERE - - - - Shield balance to Sapling - YOUR_TRANSLATION_HERE - - - - - View on block explorer - YOUR_TRANSLATION_HERE - - - - Migrate to Sapling - YOUR_TRANSLATION_HERE - - - - - Copy txid - YOUR_TRANSLATION_HERE - - - - View Payment Request - - - - - View Memo - YOUR_TRANSLATION_HERE - - - - Reply to - - - - - Created new t-Addr - YOUR_TRANSLATION_HERE - - - - Copy Address - - - - - Address has been previously used - - - - - Address is unused - - - - - Cannot support multiple addresses - - - - - Recurring payments doesn't currently support multiple addresses - - - - - Recipient - YOUR_TRANSLATION_HERE - - - - Only z-addresses can have memos - YOUR_TRANSLATION_HERE - - - - Memos can only be used with z-addresses - YOUR_TRANSLATION_HERE - - - - The memo field can only be used with a z-address. - - YOUR_TRANSLATION_HERE - - - - -doesn't look like a z-address - YOUR_TRANSLATION_HERE - - - - Change from - YOUR_TRANSLATION_HERE - - - - Current balance : - - - - - Balance after this Tx: - - - - - Transaction Error - YOUR_TRANSLATION_HERE - - - - From Address is Invalid - YOUR_TRANSLATION_HERE - - - - Recipient Address - YOUR_TRANSLATION_HERE - - - - is Invalid - YOUR_TRANSLATION_HERE - - - - Amount for address '%1' is invalid! - - - - - MemoDialog - - - - Memo - YOUR_TRANSLATION_HERE - - - - Include Reply Address - - - - - MemoEdit - - - Reply to - - - - - MigrationDialog - - - Migration Turnstile - - - - - Migration History - - - - - Migrated Amount - - - - - Unmigrated Amount - - - - - Sprout -> Sapling migration enabled - - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - - - - - MigrationTxns - - - Migration Txids - - - - - MobileAppConnector - - - Connect Mobile App - - - - - QR Code - - - - - Connection String - - - - - Allow connections over the internet via ZecWallet wormhole - - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - - - - - ZecWallet Companion App - - - - - Disconnect - - - - - - TextLabel - - - - - Last seen: - - - - - Connection type: - - - - - PrivKey - - Private Key - YOUR_TRANSLATION_HERE - - - - Private Keys - - - - - QObject - - - Attempting autoconnect - YOUR_TRANSLATION_HERE - - - - Starting embedded zcashd - YOUR_TRANSLATION_HERE - - - - zcashd is set to run as daemon - YOUR_TRANSLATION_HERE - - - - Waiting for zcashd - YOUR_TRANSLATION_HERE - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - YOUR_TRANSLATION_HERE - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - YOUR_TRANSLATION_HERE - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - YOUR_TRANSLATION_HERE - - - - Hide Advanced Config - - - - - Show Advanced Config - - - - - Choose data directory - - - - - All Downloads Finished Successfully! - YOUR_TRANSLATION_HERE - - - - Couldn't download params. Please check the help site for more info. - YOUR_TRANSLATION_HERE - - - - The process returned - YOUR_TRANSLATION_HERE - - - - - Downloading - YOUR_TRANSLATION_HERE - - - - more remaining ) - YOUR_TRANSLATION_HERE - - - - MB of - YOUR_TRANSLATION_HERE - - - - MB at - YOUR_TRANSLATION_HERE - - - - Downloading blocks - YOUR_TRANSLATION_HERE - - - - Block height - YOUR_TRANSLATION_HERE - - - - Syncing - YOUR_TRANSLATION_HERE - - - - Connected - YOUR_TRANSLATION_HERE - - - - testnet: - YOUR_TRANSLATION_HERE - - - - Connected to zcashd - YOUR_TRANSLATION_HERE - - - - zcashd has no peer connections - - - - - There was an error connecting to zcashd. The error was - YOUR_TRANSLATION_HERE - - - - - - The transaction with id - YOUR_TRANSLATION_HERE - - - - - - failed. The error was - YOUR_TRANSLATION_HERE - - - - - - - failed - YOUR_TRANSLATION_HERE - - - - - - - Tx - YOUR_TRANSLATION_HERE - - - - tx computing. This can take several minutes. - YOUR_TRANSLATION_HERE - - - - Update Available - - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - - - - - No updates available - - - - - You already have the latest release v%1 - - - - - Please wait for ZecWallet to exit - YOUR_TRANSLATION_HERE - - - - Waiting for zcashd to exit - YOUR_TRANSLATION_HERE - - - - failed. Please check the help site for more info - YOUR_TRANSLATION_HERE - - - - zcashd error - YOUR_TRANSLATION_HERE - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - YOUR_TRANSLATION_HERE - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - YOUR_TRANSLATION_HERE - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - YOUR_TRANSLATION_HERE - - - - Your zcashd is starting up. Please wait. - YOUR_TRANSLATION_HERE - - - - This may take several hours - - - - - - Connection Error - YOUR_TRANSLATION_HERE - - - - - - - Transaction Error - YOUR_TRANSLATION_HERE - - - - There was an error sending the transaction. The error was: - YOUR_TRANSLATION_HERE - - - - - No Connection - YOUR_TRANSLATION_HERE - - - - Pick - - - - - Address or Label Error - - - - - Address or Label cannot be empty - - - - - Address Format Error - YOUR_TRANSLATION_HERE - - - doesn't seem to be a valid Zcash address. - YOUR_TRANSLATION_HERE - - - - %1 doesn't seem to be a valid Zcash address. - - - - - Label Error - - - - - The label '%1' already exists. Please remove the existing label. - - - - - Import Address Book - - - - - Unable to open file - YOUR_TRANSLATION_HERE - - - - Address Book Import Done - - - - - Imported %1 new Address book entries - - - - - Copy address - YOUR_TRANSLATION_HERE - - - - Copied to clipboard - YOUR_TRANSLATION_HERE - - - - Delete label - YOUR_TRANSLATION_HERE - - - - Tx submitted (right click to copy) txid: - YOUR_TRANSLATION_HERE - - - - Locked funds - YOUR_TRANSLATION_HERE - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - YOUR_TRANSLATION_HERE - - - - - Computing Tx: - YOUR_TRANSLATION_HERE - - - - Type - YOUR_TRANSLATION_HERE - - - - Address - YOUR_TRANSLATION_HERE - - - - Date/Time - YOUR_TRANSLATION_HERE - - - - Amount - YOUR_TRANSLATION_HERE - - - - Confirmations - - - - - Connected directly - - - - - Connected over the internet via ZecWallet wormhole service - - - - - Node is still syncing. - - - - - No sapling or transparent addresses with enough balance to spend. - - - - - No ZEC price was available to convert from USD - - - - - Computing Recurring Tx: - - - - - - View on block explorer - YOUR_TRANSLATION_HERE - - - - View Error - - - - - Reported Error - - - - - - Are you sure you want to delete the recurring payment? - - - - - All future payments will be cancelled. - - - - - RecurringDialog - - - Dialog - - - - - View - - - - - Delete - - - - - RecurringListViewModel - - - Amount - YOUR_TRANSLATION_HERE - - - - Schedule - - - - - Payments Left - - - - - Next Payment - - - - - To - YOUR_TRANSLATION_HERE - - - - Every - - - - - None - - - - - RecurringPayments - - - Payments - - - - - RecurringPaymentsListViewModel - - - Date - - - - - Status - - - - - Txid - - - - - Not due yet - - - - - Pending - - - - - Skipped - - - - - Paid - - - - - Error - - - - - - Unknown - - - - - RecurringPending - - - Dialog - - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - - - - - Schedule - - - - - How should ZecWallet proceed? - - - - - Pay All in 1 Tx - - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - - - - - Pay Latest Only - - - - - Pay None - - - - - All pending payments collected, added up and paid in a single transaction - - - - - Description - - - - - To - YOUR_TRANSLATION_HERE - - - - The following recurring payment has multiple payments pending - - - - - RequestDialog - - - Payment Request - - - - - AddressBook - - - - - Request From - - - - - My Address - - - - - Amount in - - - - - z address - - - - - Amount - YOUR_TRANSLATION_HERE - - - - The recipient will see this address in the "to" field when they pay your request. - - - - - Amount USD - - - - - Memo - YOUR_TRANSLATION_HERE - - - - TextLabel - - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Pay To - - - - - Pay - - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - - - - - Can only request from Sapling addresses - - - - - Settings - - - Settings - YOUR_TRANSLATION_HERE - - - - zcashd connection - YOUR_TRANSLATION_HERE - - - - Host - YOUR_TRANSLATION_HERE - - - - Port - YOUR_TRANSLATION_HERE - - - - RPC Username - YOUR_TRANSLATION_HERE - - - - RPC Password - YOUR_TRANSLATION_HERE - - - - Options - YOUR_TRANSLATION_HERE - - - - Check github for updates at startup - - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - YOUR_TRANSLATION_HERE - - - - Connect via Tor - - - - - Connect to github on startup to check for updates - - - - - Connect to the internet to fetch ZEC prices - - - - - Fetch ZEC / USD prices - - - - - Troubleshooting - - - - - Reindex - - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - - - - - Rescan - - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - - - - - Clear History - YOUR_TRANSLATION_HERE - - - - Remember shielded transactions - YOUR_TRANSLATION_HERE - - - - Allow custom fees - YOUR_TRANSLATION_HERE - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - YOUR_TRANSLATION_HERE - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - YOUR_TRANSLATION_HERE - - - - Shield change from t-Addresses to your sapling address - YOUR_TRANSLATION_HERE - - - - Turnstile - - - - Turnstile Migration - YOUR_TRANSLATION_HERE - - - - Migrate over - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - YOUR_TRANSLATION_HERE - - - - To - YOUR_TRANSLATION_HERE - - - - Balance - YOUR_TRANSLATION_HERE - - - - Miner Fees - YOUR_TRANSLATION_HERE - - - - Total Balance - YOUR_TRANSLATION_HERE - - - - TurnstileProgress - - - Turnstile Migration Progress - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - To - YOUR_TRANSLATION_HERE - - - - Please ensure you have your wallet.dat backed up! - YOUR_TRANSLATION_HERE - - - - Next Transaction in 4 hours - YOUR_TRANSLATION_HERE - - - - Migration Progress - YOUR_TRANSLATION_HERE - - - - ValidateAddress - - - Validate Address - - - - - TextLabel - - - - - Address: - - - - - ValidateAddressesModel - - - Property - - - - - Value - - - - - ViewAddressesDialog - - - All Addresses - - - - - Export All Keys - - - - - ViewAllAddressesModel - - - Address - YOUR_TRANSLATION_HERE - - - - Balance (%1) - - - - - about - - - About - YOUR_TRANSLATION_HERE - - - - addressBook - - - Address Book - YOUR_TRANSLATION_HERE - - - - Add New Address - YOUR_TRANSLATION_HERE - - - - Address (z-Addr or t-Addr) - YOUR_TRANSLATION_HERE - - - - Label - YOUR_TRANSLATION_HERE - - - - Add to Address Book - YOUR_TRANSLATION_HERE - - - - Import Address Book - - - - - confirm - - - Confirm Transaction - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - To - YOUR_TRANSLATION_HERE - - - - Recurring Payment - - - - - TextLabel - - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - - - - - You are sending a transaction while your node is still syncing. This may not work. - YOUR_TRANSLATION_HERE - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - YOUR_TRANSLATION_HERE - - - - createZcashConf - - - Configure zcash.conf - - - - - Show Advanced Configuration - - - - - Your zcash node will be configured for you automatically - - - - - Enable Fast Sync - - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - - - - - Use custom datadir - - - - - Connect to the internet for updates and price feeds - - - - - Please choose a directory to store your wallet.dat and blockchain - - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - - - - - Choose directory - - - - - Connect over Tor - - - - - Please note that you'll need to already have a Tor service configured on port 9050 - - - - - newRecurringDialog - - - Edit Schedule - - - - - Schedule - - - - - Payment Description - - - - - From - YOUR_TRANSLATION_HERE - - - - Number of payments - - - - - Amount - YOUR_TRANSLATION_HERE - - - - Next Payment - - - - - To - YOUR_TRANSLATION_HERE - - - - Memo - YOUR_TRANSLATION_HERE - - - - zboard - - - Post to z-board.net - YOUR_TRANSLATION_HERE - - - - Total Fee - YOUR_TRANSLATION_HERE - - - - Memo - YOUR_TRANSLATION_HERE - - - - (optional) - YOUR_TRANSLATION_HERE - - - - Send From - YOUR_TRANSLATION_HERE - - - - Post As: - YOUR_TRANSLATION_HERE - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - YOUR_TRANSLATION_HERE - - - - Warning - YOUR_TRANSLATION_HERE - - - - Posting to Board - YOUR_TRANSLATION_HERE - - - diff --git a/res/zec_qt_wallet_es.qm b/res/zec_qt_wallet_es.qm deleted file mode 100644 index baca3005..00000000 Binary files a/res/zec_qt_wallet_es.qm and /dev/null differ diff --git a/res/zec_qt_wallet_es.ts b/res/zec_qt_wallet_es.ts deleted file mode 100644 index b564e85a..00000000 --- a/res/zec_qt_wallet_es.ts +++ /dev/null @@ -1,2162 +0,0 @@ - - - - - AddressBookModel - - - Label - Etiqueta - - - - Address - Dirección - - - - BalancesTableModel - - - Address - Dirección - - - - Amount - Monto - - - - ConnectionDialog - - - ZecWallet - ZecWallet - - - - Starting Up - Empezando - - - - MainWindow - - - ZecWallet - ZecWallet - - - - Balance - Saldo - - - - Summary - Vista general - - - - Shielded - Protegido - - - - Transparent - Transparente - - - - Total - Total - - - - Some transactions are not yet confirmed - Algunas transacciones aún no estan confirmadas - - - - Address Balances - Saldo De Direcciones - - - - - Send - Envía - - - - From - Desde - - - - Address Balance - Saldo De Dirección - - - - Send To - Enviar a - - - - Recipient - Destinatario - - - - - - - - Address - Dirección - - - - - Address Book - Directorio - - - - - - - Amount - Monto - - - - Max Available - Máximo Disponible - - - - - - - Memo - Memo - - - - Add Recipient - Agregar Destinatario - - - - Recurring payment - - - - - Every month, starting 12-May-2012, for 6 payments - - - - - Edit Schedule - - - - - - Miner Fee - Cuota Minera - - - - 0 - 0 - - - - Cancel - Cancelar - - - - Receive - Recibir - - - - Address Type - Tipo De Dirección - - - - Validate Address - - - - z-Addr(Sapling) - z-Addr(Sapling) - - - - t-Addr - t-Addr - - - z-Addr(Sprout) - z-Addr(Sprout) - - - - New Address - Nueva Dirección - - - - Label - Etiqueta - - - - Update Label - Actualizar Etiqueta - - - - Address balance - - - - - Optional - Opcional - - - - - Export Private Key - Exportar Clave Privada - - - - z-Addr - - - - - - Your node is still syncing, balances may not be updated - - - - - View All Addresses - - - - - Transactions - Transacciones - - - - zcashd - zcashd - - - - You are currently not mining - Actualmente no estas minando - - - - - - Loading... - Cargando... - - - - Block height - Altura del bloque - - - - Network solution rate - Rapidez de solución de red - - - - Connections - Conexiones - - - - - - | - | - - - - &File - &Archivo - - - - &Help - &Ayuda - - - - &Apps - &Apps - - - - &Edit - &Editar - - - - E&xit - Salir - - - - &About - &Acerca de - - - - &Settings - &Configuración - - - - Ctrl+P - Ctrl+P - - - - &Donate - &Donar - - - - Check github.com for &updates - Consulte las actualizaciones en github.com - - - - Sapling &turnstile - Sapling &turnstile - - - - Ctrl+A, Ctrl+T - Ctrl+A, Ctrl+T - - - - &Import private key - Importar clave privada - - - - &Export all private keys - Exportar todas las claves privadas - - - &z-board.net - z-board.net - - - Ctrl+A, Ctrl+Z - Ctrl+A, Ctrl+Z - - - - Address &book - Directorio - - - - Ctrl+B - Ctrl+B - - - - &Backup wallet.dat - Respaldar wallet.dat - - - - - Export transactions - - - - - Pay zcash &URI... - - - - - Connect mobile &app - - - - - Ctrl+M - - - - - &Recurring Payments - - - - - Request zcash... - - - - - File a bug... - - - - - Tor configuration is available only when running an embedded zcashd. - - - - - You're using an external zcashd. Please restart zcashd with -rescan - - - - - You're using an external zcashd. Please restart zcashd with -reindex - - - - - Enable Tor - - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - - - - - Disable Tor - - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - - - - - Thanks for supporting ZecWallet! - Gracias por apoyar ZecWallet! - - - - Donate 0.01 - Donar 0.01 - - - - to support ZecWallet - para apoyar ZecWallet - - - - You are on testnet, your post won't actually appear on z-board.net - Estas en testnet, tu publicación no aparecerá en z-board.net - - - - You need a sapling address with available balance to post - Necesitas una dirección Sapling con saldo disponible para publicar - - - - Computing Tx: - Calculando Tx: - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - Las claves fueron importadas. Puede que se demore varios minutos en volver a escanear el blockchain. Hasta entonces, la funcionalidad puede ser limitada. - - - - Private key import rescan finished - Importación de clave privada re-escaneada finalizada - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - - - - - Restart ZecWallet - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Paste Zcash URI - - - - - Not yet ready - - - - - zcashd is not yet ready. Please wait for the UI to load - - - - - View tx on block explorer - - - - - Refresh - - - - - Enter Address to validate - - - - - Transparent or Shielded Address: - - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - Por favor pegue sus claves privadas (z-Addr o t-Addr) aqui, una por línea - - - - The keys will be imported into your connected zcashd node - Las claves serán importadas en su nodo zcashd conectado - - - - Error - - - - - Error exporting transactions, file was not saved - - - - - No wallet.dat - Sin wallet.dat - - - - Couldn't find the wallet.dat on this computer - No se pudo encontrar wallet.dat en esta computadora - - - - You need to back it up from the machine zcashd is running on - Necesitas hacer una copia de seguridad de la computadora en la que se está ejecutando zcashd - - - - Backup wallet.dat - Respaldar wallet.dat - - - - Couldn't backup - No se pudo hacer una copia de seguridad - - - - Couldn't backup the wallet.dat file. - No se pudo hacer copia de seguridad de wallet.dat - - - - You need to back it up manually. - Necesitas hacer una copia de seguridad manualmente. - - - - This might take several minutes. Loading... - - - - - These are all the private keys for all the addresses in your wallet - Estas son todas las claves privadas para todas las direcciones en tu billetera - - - - Private key for - Clave privada para - - - - Save File - Guardar Archivo - - - - Unable to open file - No es posible abrir el archivo - - - - - Copy address - Copiar dirección - - - - - - Copied to clipboard - Copiado al portapapeles - - - - Get private key - Obtener clave privada - - - - Shield balance to Sapling - Proteger saldo a Sapling - - - - - View on block explorer - Ver en el explorador de bloques - - - - Migrate to Sapling - Migrar a Sapling - - - - - Copy txid - Copiar txid - - - - View Payment Request - - - - - View Memo - Ver Memo - - - - Reply to - - - - - Created new t-Addr - Nuevo dirección t-Addr creada - - - - Copy Address - - - - - Address has been previously used - - - - - Address is unused - - - - - Cannot support multiple addresses - - - - - Recurring payments doesn't currently support multiple addresses - - - - - Recipient - Destinatario - - - - Only z-addresses can have memos - Solo las direcciones z-Addr pueden tener memos - - - - Memos can only be used with z-addresses - Los memos solo se pueden usar con direcciones z-Addr - - - - The memo field can only be used with a z-address. - - El campo memo solo puede ser usado con una direccion z-Addr - - - - -doesn't look like a z-address - no parece una direccion z-Addr - - - - Change from - Cambiar de - - - - Current balance : - - - - - Balance after this Tx: - - - - - Transaction Error - Error de Transacción - - - - From Address is Invalid - Dirección de envio inválida - - - - Recipient Address - Dirección de Destinatario - - - - is Invalid - es Inválida - - - - Amount for address '%1' is invalid! - - - - - MemoDialog - - - - Memo - Memo - - - - Include Reply Address - - - - - MemoEdit - - - Reply to - - - - - MigrationDialog - - - Migration Turnstile - - - - - Migration History - - - - - Migrated Amount - - - - - Unmigrated Amount - - - - - Sprout -> Sapling migration enabled - - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - - - - - MigrationTxns - - - Migration Txids - - - - - MobileAppConnector - - - Connect Mobile App - - - - - QR Code - - - - - Connection String - - - - - Allow connections over the internet via ZecWallet wormhole - - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - - - - - ZecWallet Companion App - - - - - Disconnect - - - - - - TextLabel - - - - - Last seen: - - - - - Connection type: - - - - - PrivKey - - Private Key - Clave Privada - - - - Private Keys - - - - - QObject - - - - No Connection - Sin Conexión - - - - Downloading blocks - Descargando Bloques - - - - Block height - Altura del bloque - - - - Syncing - Sincronizando - - - - Connected - Conectando - - - - testnet: - testnet: - - - - Connected to zcashd - Conectando a zcashd - - - - zcashd has no peer connections - - - - - There was an error connecting to zcashd. The error was - Hubo un error al conectar con zcashd. El error fue - - - - - - The transaction with id - La transacción con id - - - - - - failed. The error was - falló. El error fue - - - - - - - Tx - Tx - - - - - - - failed - falló - - - - tx computing. This can take several minutes. - tx computando. Esto puede tomar varios minutos. - - - - Update Available - - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - - - - - No updates available - - - - - You already have the latest release v%1 - - - - - Please wait for ZecWallet to exit - Por favor, espere que ZecWallet salga - - - - Waiting for zcashd to exit - Esperando que zcashd salga - - - - Attempting autoconnect - Intentando de autoconectarse - - - - Starting embedded zcashd - Iniciando zcashd incorporado - - - - zcashd is set to run as daemon - zcashd está configurado para ejecutarse como demonio - - - - Waiting for zcashd - Esperando zcashd - - - - Hide Advanced Config - - - - - Show Advanced Config - - - - - Choose data directory - - - - - All Downloads Finished Successfully! - Todas Las Descargas Terminaron Exitosamente! - - - - Couldn't download params. Please check the help site for more info. - No se pudieron descargar los parámetros. Por favor, consulta el sitio de ayuda para mayor información. - - - - - Downloading - Descargando - - - - more remaining ) - faltan )) - - - - MB of - MB de - - - - MB at - MB a - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - Una conexión manual fue solicitada, pero el host/puerta no fue configurada. - Por favor, especificar el host/puerta y usario/contraseña en el menú Editar->Configuración. - - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - No su puede conectar a zcashd usando la configuración actual. - -Por favor, especificar el host/puerta y usario/contraseña en el menú Editar->Configuración. - - - - - This may take several hours - - - - - - - - Transaction Error - Error De Transacción - - - - failed. Please check the help site for more info - falló. Por favor, consulte el sitio de ayuda para más información - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - Has configurado zcashd para ejecutar como demonio, lo que puede causar problemas con ZecWallet. -Por favor, eliminar la siguente linea de zcashd.conf y reinicia ZecWallet -daemon=1 - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - No se pudo iniciar zcashd incorporado. - -Por favor, intenta reiniciar. - -Si todo falla, por favor ejecutar zcashd manualmente. - - - - - The process returned - El proceso devuelto - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - No se pudo conectar con zcashd configurado en zcashd.conf. - -No iniciaré zcashd incorporado porque la opcion --no-embedded fue dada. - - - - zcashd error - error de zcashd - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - Autenticación fallida. El usario/contraseña que epecificó no fue aceptado por zcashd. Intenta cambiarlo en el menu Editar->Configuración. - - - - Your zcashd is starting up. Please wait. - Tu zcashd se está iniciando. Por favor espera. - - - - - Connection Error - Error de conexión - - - - There was an error sending the transaction. The error was: - Hubo un error al enviar la transacción. El error fue: - - - - Tx submitted (right click to copy) txid: - Tx presentado (clic derecho para copiar) txid: - - - - Locked funds - Fondos bloqueados - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - No se pudo iniciar la migración. -El saldo es insuficiente para una migración automática. - - - - - - Computing Tx: - Calculando Tx: - - - - Type - Tipo - - - - Address - Dirección - - - - Date/Time - Fecha/Hora - - - - Amount - Monto - - - - Confirmations - - - - - Pick - - - - - Address or Label Error - - - - - Address or Label cannot be empty - - - - - Address Format Error - Error en el formato de la dirección. - - - doesn't seem to be a valid Zcash address. - no parece ser una dirección Zcash válida - - - - %1 doesn't seem to be a valid Zcash address. - - - - - Label Error - - - - - The label '%1' already exists. Please remove the existing label. - - - - - Import Address Book - - - - - Unable to open file - No es posible abrir el archivo - - - - Address Book Import Done - - - - - Imported %1 new Address book entries - - - - - Copy address - Copiar dirección - - - - Copied to clipboard - Copiado al portapapeles - - - - Delete label - Eliminar etiqueta - - - - Connected directly - - - - - Connected over the internet via ZecWallet wormhole service - - - - - Node is still syncing. - - - - - No sapling or transparent addresses with enough balance to spend. - - - - - No ZEC price was available to convert from USD - - - - - Computing Recurring Tx: - - - - - - View on block explorer - Ver en el explorador de bloques - - - - View Error - - - - - Reported Error - - - - - - Are you sure you want to delete the recurring payment? - - - - - All future payments will be cancelled. - - - - - RecurringDialog - - - Dialog - - - - - View - - - - - Delete - - - - - RecurringListViewModel - - - Amount - Monto - - - - Schedule - - - - - Payments Left - - - - - Next Payment - - - - - To - A - - - - Every - - - - - None - - - - - RecurringPayments - - - Payments - - - - - RecurringPaymentsListViewModel - - - Date - - - - - Status - - - - - Txid - - - - - Not due yet - - - - - Pending - - - - - Skipped - - - - - Paid - - - - - Error - - - - - - Unknown - - - - - RecurringPending - - - Dialog - - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - - - - - Schedule - - - - - How should ZecWallet proceed? - - - - - Pay All in 1 Tx - - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - - - - - Pay Latest Only - - - - - Pay None - - - - - All pending payments collected, added up and paid in a single transaction - - - - - Description - - - - - To - A - - - - The following recurring payment has multiple payments pending - - - - - RequestDialog - - - Payment Request - - - - - AddressBook - - - - - Request From - - - - - My Address - - - - - Amount in - - - - - z address - - - - - Amount - Monto - - - - The recipient will see this address in the "to" field when they pay your request. - - - - - Amount USD - - - - - Memo - Memo - - - - TextLabel - - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Pay To - - - - - Pay - - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - - - - - Can only request from Sapling addresses - - - - - Settings - - - Settings - Configuración - - - - zcashd connection - conexión zcashd - - - - Host - Host - - - - Port - Puerto - - - - RPC Username - Nombre de usario RPC - - - - RPC Password - Contraseña de RPC - - - - Options - Opciones - - - - Check github for updates at startup - - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - Las transacciones protegidas se guardan localmente y se muestran en la pestaña de transacciones. Si desactivas esto, las transacciones protegidas no aparecerán en la pestaña de transacciones. - - - - Connect via Tor - - - - - Connect to github on startup to check for updates - - - - - Connect to the internet to fetch ZEC prices - - - - - Fetch ZEC / USD prices - - - - - Troubleshooting - - - - - Reindex - - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - - - - - Rescan - - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - - - - - Clear History - Borrar historial - - - - Remember shielded transactions - Recuerde las transacciones protegidas - - - - Allow custom fees - Permitir tarifas personalizadas - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - Permite utilizar tarifas no estándar al enviar transacciones. Habilitar esta opción puede reducir su privacidad porque las tarifas son transparentes. - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - Normalmente, el vuelto de las t-Addr va a otra t-Addr. Al marcar esta opción, se enviará el vuelto a su dirección protegida. Marcar esta opción para aumentar tu privacidad. - - - - Shield change from t-Addresses to your sapling address - Proteger el vuelto de direcciones t-Addr a su direccion Sapling - - - - Turnstile - - - - Turnstile Migration - Migración Turnstile - - - - Migrate over - Tiempo de migración - - - - From - Desde - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - <html><head/><body><p>Fondos de direcciones z-Addr Sprout (que comienzan con &quot;zc&quot;) necesitan ser movidos a direcciones z-Addr Sapling (que comienzan con &quot;zs&quot;). Los fondos no pueden ser movidos directamente, deben enviarse a través de direcciones intermedias &quot;transparentes&quot; de manera que se mantenga la privacidad.</p><p>Esta migración se puede hacer automáticamente.</p></body></html> - - - - To - A - - - - Balance - Saldo - - - - Miner Fees - Cuota Minera - - - - Total Balance - Saldo Total - - - - TurnstileProgress - - - Turnstile Migration Progress - Progreso de la migracion Turnstile - - - - From - Desde - - - - To - A - - - - Please ensure you have your wallet.dat backed up! - Por favor, asegúrese de tener una copia de seguridad de wallet.dat! - - - - Next Transaction in 4 hours - Siguente transacción en 4 horas - - - - Migration Progress - Progreso de la migracion - - - - ValidateAddress - - - Validate Address - - - - - TextLabel - - - - - Address: - - - - - ValidateAddressesModel - - - Property - - - - - Value - - - - - ViewAddressesDialog - - - All Addresses - - - - - Export All Keys - - - - - ViewAllAddressesModel - - - Address - Dirección - - - - Balance (%1) - - - - - about - - - About - Sobre - - - - addressBook - - - Address Book - Directorio - - - - Add New Address - Agregar nueva dirección - - - - Address (z-Addr or t-Addr) - Dirección (z-Addr o t-Addr) - - - - Label - Etiqueta - - - - Add to Address Book - Agregar a Directorio - - - - Import Address Book - - - - - confirm - - - Confirm Transaction - Confirmar Transacción - - - - From - Desde - - - - To - A - - - - Recurring Payment - - - - - TextLabel - - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - - - - - You are sending a transaction while your node is still syncing. This may not work. - Estás enviando una transacción mientras su nodo aún se esta sincronizando. Esto puede no funcionar. - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - Estás utilizando una tarifa personalizada. Como las tarifas son transparentes estás perdiendo algo de privacidad. Por favor, solo haz esto si sabes lo que estás haciendo! - - - - createZcashConf - - - Configure zcash.conf - - - - - Show Advanced Configuration - - - - - Your zcash node will be configured for you automatically - - - - - Enable Fast Sync - - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - - - - - Use custom datadir - - - - - Connect to the internet for updates and price feeds - - - - - Please choose a directory to store your wallet.dat and blockchain - - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - - - - - Choose directory - - - - - Connect over Tor - - - - - Please note that you'll need to already have a Tor service configured on port 9050 - - - - - newRecurringDialog - - - Edit Schedule - - - - - Schedule - - - - - Payment Description - - - - - From - Desde - - - - Number of payments - - - - - Amount - Monto - - - - Next Payment - - - - - To - A - - - - Memo - Memo - - - - zboard - - - Post to z-board.net - Publicar en z-board.net - - - - Total Fee - Costo Total - - - - Memo - Memo - - - - (optional) - (opcional) - - - - Send From - Enviado desde - - - - Post As: - Publicar Como: - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - <html><head/><body><p>ZBoard: Mensajes de chat totalmente anónimos e imposibles de rastrear basados en la cadena de bloques Zcash. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - - - - Warning - Advertencia - - - - Posting to Board - Publicar en ZBoard - - - diff --git a/res/zec_qt_wallet_fr.qm b/res/zec_qt_wallet_fr.qm deleted file mode 100644 index 55a21157..00000000 Binary files a/res/zec_qt_wallet_fr.qm and /dev/null differ diff --git a/res/zec_qt_wallet_fr.ts b/res/zec_qt_wallet_fr.ts deleted file mode 100644 index c09a7d6f..00000000 --- a/res/zec_qt_wallet_fr.ts +++ /dev/null @@ -1,2187 +0,0 @@ - - - - - AddressBookModel - - - Label - Etiquette - - - - Address - Adresse - - - - BalancesTableModel - - - Address - Adresse - - - - Amount - Montant - - - - ConnectionDialog - - - ZecWallet - ZecWallet - - - - Starting Up - Démarrage - - - - MainWindow - - - ZecWallet - ZecWallet - - - - Balance - Solde - - - - Summary - Résumé - - - - Shielded - Privé - - - - Transparent - Transparant - - - - Total - Total - - - - - Your node is still syncing, balances may not be updated - - - - - Some transactions are not yet confirmed - Certaines transactions ne sont pas encore confirmées - - - - Address Balances - Solde des adresses - - - - - Send - Envoyer - - - - From - De - - - - Address Balance - Solde de l'adresse - - - - Send To - Envoyer à - - - - Recipient - Destinataire - - - - - - - - Address - Adresse - - - - - Address Book - Carnet d'adresses - - - - - - - Amount - Montant - - - - Max Available - Maximum disponible - - - - - - - Memo - Mémo - - - - Add Recipient - Ajouter un destinataire - - - - Recurring payment - - - - - Every month, starting 12-May-2012, for 6 payments - - - - - Edit Schedule - - - - - - Miner Fee - I replaced this with "transaction fee" which sounds much better in French.. I hope it's correct too.. - Frais de transaction - - - - 0 - 0 - - - - Cancel - Annuler - - - - Receive - Recevoir - - - - Address Type - Type d'adresse - - - - Validate Address - - - - z-Addr(Sapling) - Adresse-z(Sapling) - - - - t-Addr - Adresse-t - - - z-Addr(Sprout) - Adresse-z(Sprout) - - - - New Address - Nouvelle Adresse - - - - Label - Etiquette - - - - Update Label - Mettre à jour l'étiquette - - - - Address balance - Solde de l'adresse - - - - Optional - Optionnel - - - - - Export Private Key - Exporter la clef privée - - - Address used - Adresse utilisée - - - - z-Addr - - - - - View All Addresses - - - - - Transactions - Transactions - - - - zcashd - zcashd - - - - You are currently not mining - Vous ne minez pas à présent - - - - - - Loading... - Chargement... - - - - Block height - Hauteur de block - - - - Network solution rate - Taux de solution du réseau - - - - Connections - Connections - - - - - - | - | - - - - &File - &Fichier - - - - &Help - &Aide - - - - &Apps - &Applications - - - - &Edit - &Edition - - - - E&xit - Q&uiter - - - - &About - &À propos - - - - &Settings - &Préférences - - - - Ctrl+P - Ctrl+P - - - - &Donate - &Faire un don - - - - Check github.com for &updates - Vérifier &github.com pour des mises à jour - - - - Sapling &turnstile - Sapling &turnstile - - - - Ctrl+A, Ctrl+T - Ctrl+A, Ctrl+T - - - - &Import private key - &Importer une clef privée - - - - &Export all private keys - &Exporter toutes les clefs privées - - - &z-board.net - &z-board.net - - - Ctrl+A, Ctrl+Z - Ctrl+A, Ctrl+Z - - - - Address &book - Carnet &d'adresse - - - - Ctrl+B - Ctrl+B - - - - &Backup wallet.dat - &Sauvegarder "wallet.dat" - - - - - Export transactions - Exporter les transactions - - - - Pay zcash &URI... - PAyer une URI zcash - - - - Connect mobile &app - - - - - Ctrl+M - - - - - &Recurring Payments - - - - - Request zcash... - - - - - File a bug... - - - - - Tor configuration is available only when running an embedded zcashd. - La configuration de Tor est disponible uniquement lors de l'exécution du processus zcashd intégré. - - - - You're using an external zcashd. Please restart zcashd with -rescan - - - - - You're using an external zcashd. Please restart zcashd with -reindex - - - - - Enable Tor - Activer Tor - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - La connection via Tor est activée. Afin d'utiliser cette fonctionnalité, veuillez redémarer ZecWallet. - - - - Disable Tor - Désactiver Tor - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - La connection via Tor a été désactivée. Afin de complètement se déconnecter de Tor, vous devez redémarrer ZecWallet. - - - - Thanks for supporting ZecWallet! - Merci de supporter ZecWallet ! - - - - Donate 0.01 - Donner 0.01 - - - - to support ZecWallet - pour supporter ZecWallet - - - - Enter Address to validate - - - - - Transparent or Shielded Address: - - - - - You are on testnet, your post won't actually appear on z-board.net - Vous êtes connecté au réseau de test. Votre message n'apparaîtra donc pas sur z-board.net - - - - You need a sapling address with available balance to post - Vous avez besoin d'une adresse de type Sapling avec un solde suffisant pour pouvoir poster - - - - Computing Tx: - Calcul de la transaction en cours: - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - Les clefs ont été importées. Cela peut prendre quelque minutes pour rescanner la blockchain. Durant cette période, les fonctionnalités peuvent être limitées - - - - Private key import rescan finished - Rescan de l'import de la clef privée achevé - - - - Not yet ready - - - - - zcashd is not yet ready. Please wait for the UI to load - - - - - View tx on block explorer - - - - - Refresh - - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - - - - - Restart ZecWallet - - - - - Error paying zcash URI - Erreur lors du payement du URI zcash - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - Le format URI doit être comme suit: 'zcash:<addr>?amt=x&memo=y - - - - Paste Zcash URI - Coller le URI Zcash - - - Could not understand address - Adresse non valide - - - Unknown field in URI: - Champ inconnu dans le URI - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - Veuillez coller votre clef privée (Adresse-z ou Adresse-t) ici. Une clef par ligne - - - - The keys will be imported into your connected zcashd node - Les clef seront importées dans votre noeud zcashd connecté - - - - Error - Erreur - - - - Error exporting transactions, file was not saved - Erreur lors de l'exportation des transactions. Le fichier n'a pas été sauvegardé. - - - - No wallet.dat - Pas de fichier "wallet.dat" - - - - Couldn't find the wallet.dat on this computer - Impossible de trouver le fichier "wallet.dat" sur cet ordinateur - - - - You need to back it up from the machine zcashd is running on - Vous devez effectuer la sauvegarde depuis la machine sur laquelle zcashd est en cours d'exécution - - - - Backup wallet.dat - Sauvegarder wallet.dat - - - - Couldn't backup - La sauvegarde n'a pas pu être effectuée - - - - Couldn't backup the wallet.dat file. - Impossible de sauvegarder le fichier "wallet.dat". - - - - You need to back it up manually. - Vous devez le sauvegarder manuellement. - - - - This might take several minutes. Loading... - - - - - These are all the private keys for all the addresses in your wallet - Ce sont toutes les clés privées pour toutes les adresses de votre portefeuille - - - - Private key for - Clef privée pour - - - - Save File - Sauvegarder le fichier - - - - Unable to open file - mpossible d'ouvrir le fichier - - - - - Copy address - Copier l'adresse - - - - - - Copied to clipboard - Copié dans le presse-papier - - - - Get private key - Obtenir la clef privée - - - - Shield balance to Sapling - Rendre privé le solde vers Sapling - - - - - View on block explorer - Voir dans l'explorateur de block - - - - Migrate to Sapling - Migrer vers Sapling - - - - - Copy txid - Copier l'ID de transaction - - - - View Payment Request - - - - - View Memo - Voir le mémo - - - - Reply to - Répondre à - - - - Created new t-Addr - Nouvelle Adresse-t créée - - - - Copy Address - - - - - Address has been previously used - L'adresse a été utilisée précédemment. - - - - Address is unused - L'adresse est inutilisée. - - - - Recipient - Destinataire - - - - Only z-addresses can have memos - Seules les Adresses-z peuvent avoir un mémo - - - - Memos can only be used with z-addresses - Les mémos peuvent seulement être utilisés avec des Adresses-z - - - - The memo field can only be used with a z-address. - - Le champs mémo ne peut uniquement être utilisé avec une adresse-z. - - - - - -doesn't look like a z-address - -Cette adresse ne semble pas être de type adresse-z - - - Reply to - Répondre à - - - - Cannot support multiple addresses - - - - - Recurring payments doesn't currently support multiple addresses - - - - - Change from - Changer de - - - - Current balance : - Solde actuel : - - - - Balance after this Tx: - Solde après cette Tx: - - - - Transaction Error - Erreur de transaction - - - - From Address is Invalid - L'adresse de l'émetteur est invalide - - - - Recipient Address - Adresse du destinataire - - - - is Invalid - est invalide - - - - Amount for address '%1' is invalid! - - - - Amount '%1' is invalid! - Le montant '%1' est invalide. - - - - MemoDialog - - - - Memo - Mémo - - - - Include Reply Address - Inclure l'adresse de réponse - - - - MemoEdit - - - Reply to - Répondre à - - - - MigrationDialog - - - Migration Turnstile - - - - - Migration History - - - - - Migrated Amount - - - - - Unmigrated Amount - - - - - Sprout -> Sapling migration enabled - - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - - - - - MigrationTxns - - - Migration Txids - - - - - MobileAppConnector - - - Connect Mobile App - - - - - QR Code - - - - - Connection String - - - - - Allow connections over the internet via ZecWallet wormhole - - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - - - - - ZecWallet Companion App - - - - - Disconnect - - - - - - TextLabel - - - - - Last seen: - - - - - Connection type: - - - - - PrivKey - - Private Key - Clef privée - - - - Private Keys - - - - - QObject - - - Attempting autoconnect - Tentative de connection automatique - - - - Starting embedded zcashd - Démarrage de zcashd intégré - - - - zcashd is set to run as daemon - zcashd est configuré pour s'exécuter en tant que démon - - - - Waiting for zcashd - En attente de zcashd - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - vous avez zcashd configuré pour démarrer en tant que démon ce qui peut causer des problèmes avec ZecWallet - - Veuillez enlever la ligne suivante de votre fichier "zcash.conf" et redémarrer ZecWallet: -daemon=1 - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - Impossible de démarrer le zcashd intégré. - -Veuillez essayer de redémarrer. - -Si vous avez précédemment démarré zcashd avec des arguments, vous devrez peut-être réinitialiser le fichier zcash.conf. - -Si tout échoue, exécutez zcashd manuellement. - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - Le démarrage de zcashd n'a pas eu lieu car l'argument --no-embedded a été utilisé au lancement - - - - Hide Advanced Config - - - - - Show Advanced Config - - - - - Choose data directory - - - - - All Downloads Finished Successfully! - Tous les téléchargements terminés avec succès ! - - - - Couldn't download params. Please check the help site for more info. - Impossible de télécharger les paramètres. Veuillez vous rendre sur le site d'aide pour plus d'info. - - - - The process returned - Le processus a renvoyé - - - - - Downloading - Téléchargement en cours - - - - more remaining ) - restant) - - - - MB of - MB de - - - - MB at - MB à - - - - Downloading blocks - Blocs en cours de téléchargement - - - - Block height - Hauteur de bloc - - - - Syncing - Synchronisation - - - - Connected - Connecté - - - - testnet: - réseau test: - - - - Connected to zcashd - Connecté à zcashd - - - - zcashd has no peer connections - zcashd n'a aucune connexion à un pair - - - - There was an error connecting to zcashd. The error was - Une erreur est survenue lors de la connection à zcashd. L'erreur est - - - - - - The transaction with id - La transaction avec ID - - - - - - failed. The error was - a échoué. L'erreur était - - - - - - - failed - a échoué - - - - - - - Tx - Tx - - - - tx computing. This can take several minutes. - tx en cours de calcul. Ceci peut prendre quelques minutes. - - - - Update Available - MàJ disponible - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - Voulez-vous visiter la page des nouvelles versions ? - - - - No updates available - Pas de MàJ disponible - - - - You already have the latest release v%1 - Vous utilisez déjà la dernière version v%1 - - - - Please wait for ZecWallet to exit - Veuillez patienter. Fermeture de ZecWallet en cours - - - - Waiting for zcashd to exit - Attente de la fermeture de zcashd - - - - failed. Please check the help site for more info - a échoué. Veuillez vous rendre sur le site d'aide pour plus d'info - - - - zcashd error - erreur zcashd - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - Une connection manuelle était demandée, mais les réglages ne sont pas configurés. - -Veuillez configurer l'hôte/port et utilisateur/mot de passe dans le menu Edition->Préférences. - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - Impossible de se connecter au zcashd configuré dans les préférences. - -Veuillez configurer l'hôte/port et utilisateur/mot de passe dans le menu Edition->Préférences. - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - Authentification échouée. Le nom d'utilisateur / mot de passe que vous avez spécifié n'a pas été accepté par zcashd. Essayez de le changer dans le menu Edition-> Préférences - - - - Your zcashd is starting up. Please wait. - Votre zcashd est en cours de démarrage. Veuillez patienter. - - - - This may take several hours - - - - - - Connection Error - Erreur de connection - - - - - - - Transaction Error - Erreur de transaction - - - - There was an error sending the transaction. The error was: - Une erreur est survenue en envoyant la transaction. L'erreur est: - - - - - No Connection - Pas de connection - - - - Pick - Choisir - - - - Address or Label Error - - - - - Address or Label cannot be empty - - - - - Address Format Error - Erreur de format d'adresse - - - doesn't seem to be a valid Zcash address. - ne semble pas être une adresse Zcash valide. - - - - %1 doesn't seem to be a valid Zcash address. - - - - - Label Error - - - - - The label '%1' already exists. Please remove the existing label. - - - - - Import Address Book - Importer le carnet d'adresses - - - - Unable to open file - Impossible d'ouvrir le fichier - - - - Address Book Import Done - Import du carnet d'adresses terminé - - - - Imported %1 new Address book entries - %1 nouvelle(s) entrée(s) importée(s) dans le carnet d'adresses. - - - - Copy address - Copier l'adresse - - - - Copied to clipboard - Copiée dans le presse papier - - - - Delete label - Effacer l'étiquette - - - - Tx submitted (right click to copy) txid: - Tx soumise. (clic droit pour copier) txid: - - - - Locked funds - Fonds verouillés - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - Impossible d'initier la migration. -Vous avez soit des fonds non confirmés soit le solde est trop petit pour une migration automatique. - - - - - Computing Tx: - Calcul de Tx en cours: - - - - Type - Type - - - - Address - Adresse - - - - Date/Time - Date/Heure - - - - Amount - Montant - - - - Confirmations - - - - - Connected directly - - - - - Connected over the internet via ZecWallet wormhole service - - - - - Node is still syncing. - - - - - No sapling or transparent addresses with enough balance to spend. - - - - - No ZEC price was available to convert from USD - - - - - Computing Recurring Tx: - - - - - - View on block explorer - Voir dans l'explorateur de block - - - - View Error - - - - - Reported Error - - - - - - Are you sure you want to delete the recurring payment? - - - - - All future payments will be cancelled. - - - - - RecurringDialog - - - Dialog - - - - - View - - - - - Delete - - - - - RecurringListViewModel - - - Amount - Montant - - - - Schedule - - - - - Payments Left - - - - - Next Payment - - - - - To - À - - - - Every - - - - - None - - - - - RecurringPayments - - - Payments - - - - - RecurringPaymentsListViewModel - - - Date - - - - - Status - - - - - Txid - - - - - Not due yet - - - - - Pending - - - - - Skipped - - - - - Paid - - - - - Error - Erreur - - - - - Unknown - - - - - RecurringPending - - - Dialog - - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - - - - - Schedule - - - - - How should ZecWallet proceed? - - - - - Pay All in 1 Tx - - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - - - - - Pay Latest Only - - - - - Pay None - - - - - All pending payments collected, added up and paid in a single transaction - - - - - Description - - - - - To - À - - - - The following recurring payment has multiple payments pending - - - - - RequestDialog - - - Payment Request - - - - - AddressBook - - - - - Request From - - - - - My Address - - - - - Amount in - - - - - z address - - - - - Amount - Montant - - - - The recipient will see this address in the "to" field when they pay your request. - - - - - Amount USD - - - - - Memo - Mémo - - - - TextLabel - - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - - - - - Error paying zcash URI - Erreur lors du payement du URI zcash - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - Le format URI doit être comme suit: 'zcash:<addr>?amt=x&memo=y - - - - Pay To - - - - - Pay - - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - - - - - Can only request from Sapling addresses - - - - - Settings - - - Settings - Préférences - - - - zcashd connection - connection zcashd - - - - Host - Hôte - - - - Port - Port - - - - RPC Username - Nom d'utilisateur RPC - - - - RPC Password - Mot de passe RPC - - - - Options - Options - - - - Check github for updates at startup - - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - Se connecter au réseau Tor via le proxy SOCKS en cours d'exécution sur 127.0.0.1:9050. Veuillez noter que vous devrez installer et exécuter le service Tor en externe. - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - Les transactions protégées sont enregistrées localement et affichées dans l’onglet transactions. Si vous décochez cette case, les transactions protégées n'apparaîtront pas dans l'onglet des transactions. - - - - Connect via Tor - Se connecter via Tor - - - - Connect to github on startup to check for updates - - - - - Connect to the internet to fetch ZEC prices - - - - - Fetch ZEC / USD prices - - - - - Troubleshooting - - - - - Reindex - - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - - - - - Rescan - - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - - - - - Clear History - Effacer l'historique - - - - Remember shielded transactions - Se souvenir des transactions privées - - - - Allow custom fees - Permettre les frais personnalisés - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - Permettre le changement des frais par défaut lors de l'envoi de transactions. L'activation de cette option peut compromettre votre confidentialité, car les frais sont transparents. - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - Nornalement, le change d'une adresse-t se fait à une autre adresse-t. Sélectionner cette option enverra le change à votre adresse privée Sapling à la place. Cochez cette option pour augmenter votre vie privée. - - - - Shield change from t-Addresses to your sapling address - Rendre privé le change de l'Adresse-t vers l'Adresse-z - - - - Turnstile - - - - Turnstile Migration - Turnstile migration - - - - Migrate over - Migration terminée - - - - From - De - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - <html><head/><body><p>Les fonds provenant des adresses-z de type Sprout (qui commencent par "zc") doivent être transférés vers les adresses-z améliorées de type Sapling (qui commencent par "zs"). Les fonds ne peuvent pas être transférés directement, mais doivent être envoyés via des adresses-t transparentes intermédiaires tout cela en respectant votre vie privée.</p><p>Cette migration peut être faite automatiquement pour vous.</p></body></html> - - - - To - À - - - - Balance - Solde - - - - Miner Fees - Frais de transaction - - - - Total Balance - Solde total - - - - TurnstileProgress - - - Turnstile Migration Progress - Progrès de la migration turnstile - - - - From - De - - - - To - À - - - - Please ensure you have your wallet.dat backed up! - Veuillez vous assurer que vous avez sauvegarder le fichier "wallet.dat"! - - - - Next Transaction in 4 hours - Prochaine transaction dans 4 heures - - - - Migration Progress - Progrès de la migration - - - - ValidateAddress - - - Validate Address - - - - - TextLabel - - - - - Address: - - - - - ValidateAddressesModel - - - Property - - - - - Value - - - - - ViewAddressesDialog - - - All Addresses - - - - - Export All Keys - - - - - ViewAllAddressesModel - - - Address - Adresse - - - - Balance (%1) - - - - - about - - - About - À propos - - - - addressBook - - - Address Book - Carnet d'adresses - - - - Add New Address - Ajouter une nouvelle adresse - - - - Address (z-Addr or t-Addr) - Adresse (Adresse-z ou Adresse-t) - - - - Label - Etiquette - - - - Add to Address Book - Ajouter au carnet d'adresse - - - - Import Address Book - Importer de carnet d'adresses - - - - confirm - - - Confirm Transaction - Confirmer la transaction - - - - From - De - - - - To - À - - - - Recurring Payment - - - - - TextLabel - - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this Transaction might not work. - zcashd semble n'avoir aucune connexion à un autre pair. Comme vous n'êtes peut-être pas connecté à Internet, cette transaction pourrait ne pas fonctionner. - - - - You are sending a transaction while your node is still syncing. This may not work. - Vous envoyer une transaction alors que votre noeud se synchronize encore. Cela ne pourrait pas fonctionner. - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - Vous appliquez des frais personnalisés. Comme les frais sont transparents, vous diminuez votre caractère privé. Veuillez seulement utiliser ceci si vous êtes sûr de ce que vous faites ! - - - - createZcashConf - - - Configure zcash.conf - - - - - Show Advanced Configuration - - - - - Your zcash node will be configured for you automatically - - - - - Enable Fast Sync - - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - - - - - Use custom datadir - - - - - Connect to the internet for updates and price feeds - - - - - Please choose a directory to store your wallet.dat and blockchain - - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - - - - - Choose directory - - - - - Connect over Tor - - - - - Please note that you'll need to already have a Tor service configured on port 9050 - - - - - newRecurringDialog - - - Edit Schedule - - - - - Schedule - - - - - Payment Description - - - - - From - De - - - - Number of payments - - - - - Amount - Montant - - - - Next Payment - - - - - To - À - - - - Memo - Mémo - - - - zboard - - - Post to z-board.net - Poster sur z-board.net - - - - Total Fee - Frais totaux - - - - Memo - Mémo - - - - (optional) - (optionnel) - - - - Send From - Envoyer de - - - - Post As: - Poster en tant que: - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - <html><head/><body><p>Zboard: Messagerie entièrement anonyme et intraçable basée sur la blockchain ZCash. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - - - - Warning - Attention - - - - Posting to Board - Poster sur le forum - - - diff --git a/res/zec_qt_wallet_it.qm b/res/zec_qt_wallet_it.qm deleted file mode 100644 index 49ccf1a4..00000000 Binary files a/res/zec_qt_wallet_it.qm and /dev/null differ diff --git a/res/zec_qt_wallet_it.ts b/res/zec_qt_wallet_it.ts deleted file mode 100644 index 7a2d0773..00000000 --- a/res/zec_qt_wallet_it.ts +++ /dev/null @@ -1,2174 +0,0 @@ - - - - - AddressBookModel - - - Label - Etichetta - - - - Address - Indirizzo - - - - BalancesTableModel - - - Address - Indirizzo - - - - Amount - Saldo - - - - ConnectionDialog - - - ZecWallet - ZecWallet - - - - Starting Up - Avvio in corso - - - - MainWindow - - - ZecWallet - ZecWallet - - - - Balance - check - Saldo - - - - Summary - Riepilogo - - - - Shielded - meglio tenerla in EN - Shielded - - - - Transparent - Trasparente - - - - Total - Totale - - - - - Your node is still syncing, balances may not be updated - - - - - Some transactions are not yet confirmed - Rilevate transazioni non ancora confermate - - - - Address Balances - Saldo degli indirizzi - - - - - Send - Invia - - - - From - Da - - - - Address Balance - check - Saldo Indirizzo - - - - Send To - Inviare a - - - - Recipient - Destinatario - - - - - - - - Address - Indirizzo - - - - - Address Book - Rubrica - - - - - - - Amount - check - Importo - - - - Max Available - Invia tutto - - - - - - - Memo - Memo - - - - Add Recipient - Aggiungi alla rubrica - - - - Recurring payment - - - - - Every month, starting 12-May-2012, for 6 payments - - - - - Edit Schedule - - - - - - Miner Fee - Commissioni di rete - - - - 0 - 0 - - - - Cancel - Annulla - - - - Receive - Ricevi - - - - Address Type - Tipo Indirizzo - - - z-Addr(Sapling) - z-Addr(Sapling) - - - - t-Addr - t-Addr (Trasparente) - - - z-Addr(Sprout) - z-Addr(Legacy Sprout) - - - - z-Addr - - - - - New Address - Crea Indirizzo - - - - View All Addresses - - - - - Label - Etichetta - - - - Update Label - Aggiorna etichetta - - - - Address balance - - - - - Optional - Opzionale - - - - - Export Private Key - Esporta la chiave privata - - - - Transactions - Transazioni - - - - zcashd - zcashd - - - - You are currently not mining - Al momento non stai minando - - - - - - Loading... - Caricamento... - - - - Block height - check - Ultimo blocco trovato - - - - Network solution rate - check - Potenza di calcolo Network - - - - Connections - Connessioni attive - - - - - - | - | - - - - &File - &File - - - - &Help - &Aiuto - - - - &Apps - &Apps - - - - &Edit - &Modifica - - - - E&xit - &Esci - - - - &About - &About - - - - &Settings - &Impostazioni - - - - Ctrl+P - Ctrl+P - - - - &Donate - &Dona - - - - Check github.com for &updates - Controllo nuovi &aggiornamenti - - - - Sapling &turnstile - Sapling &turnstile - - - - Ctrl+A, Ctrl+T - Ctrl+A, Ctrl+T - - - - &Import private key - &Importa chiave privata - - - - &Export all private keys - &Esporta tutte le chiavi private - - - - Validate Address - - - - &z-board.net - &z-board.net - - - Ctrl+A, Ctrl+Z - Ctrl+A, Ctrl+Z - - - - Address &book - check - Rubrica &Contatti - - - - Ctrl+B - Ctrl+B - - - - &Backup wallet.dat - &Backup wallet.dat - - - - - Export transactions - - - - - Pay zcash &URI... - - - - - Connect mobile &app - - - - - Ctrl+M - - - - - &Recurring Payments - - - - - Request zcash... - - - - - File a bug... - - - - - Thanks for supporting ZecWallet! - Grazie per il tuo supporto a ZecWallet! - - - - Donate 0.01 - Dona 0.01 - - - - to support ZecWallet - per supportare ZecWallet - - - - You are on testnet, your post won't actually appear on z-board.net - Sei nella testnet, i tuoi post non appariranno realmente su z-board.net - - - - You need a sapling address with available balance to post - Hai bisogno di un indirizzo Sapling con saldo per postare - - - - Computing Tx: - Computazione Transazione: - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - Le chiavi sono state importate. Potrebbero essere necessari alcuni minuti per eseguire nuovamente la scansione della blockchain. Fino ad allora, le funzionalità potrebbero essere limitate - - - - Private key import rescan finished - L'importazione delle chiavi private è stata completata - - - - Tor configuration is available only when running an embedded zcashd. - - - - - You're using an external zcashd. Please restart zcashd with -rescan - - - - - You're using an external zcashd. Please restart zcashd with -reindex - - - - - Enable Tor - - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - - - - - Disable Tor - - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - - - - - Restart ZecWallet - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Paste Zcash URI - - - - - Not yet ready - - - - - zcashd is not yet ready. Please wait for the UI to load - - - - - View tx on block explorer - - - - - Refresh - - - - - Enter Address to validate - - - - - Transparent or Shielded Address: - - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - Si prega di incollare le chiavi private (z-Addr or t-Addr) qui, una per volta - - - - The keys will be imported into your connected zcashd node - check - Le chiavi saranno importate nel tuo nodo zcashd - - - - Error - - - - - Error exporting transactions, file was not saved - - - - - No wallet.dat - Nessun wallet.dat - - - - Couldn't find the wallet.dat on this computer - Impossibile trovare il wallet.dat su questo computer - - - - You need to back it up from the machine zcashd is running on - È necessario eseguire il backup dalla macchina su cui zcashd è in esecuzione - - - - Backup wallet.dat - Backup wallet.dat - - - - Couldn't backup - Impossibile eseguire il backup - - - - Couldn't backup the wallet.dat file. - Impossibile eseguire il backup del file wallet.dat. - - - - You need to back it up manually. - Devi eseguire il backup manualmente. - - - - This might take several minutes. Loading... - - - - - These are all the private keys for all the addresses in your wallet - Queste sono le chiavi private per tutti gli indirizzi nel tuo portafoglio - - - - Private key for - Chiave privata per - - - - Save File - Salva File - - - - Unable to open file - Impossibile aprire il file - - - - - Copy address - Copia indirizzo - - - - - - Copied to clipboard - Copiato negli appunti - - - - Get private key - Ottieni una chiave privata - - - - Shield balance to Sapling - Trasferisci il saldo su un indirizzo shielded Sapling - - - - - View on block explorer - Guarda sul block-explorer - - - - Migrate to Sapling - Migra a Sapling - - - - - Copy txid - Copia txid - - - - View Payment Request - - - - - View Memo - Visualizza memo - - - - Reply to - - - - - Created new t-Addr - Crea nuovo t-Addr - - - - Copy Address - - - - - Address has been previously used - - - - - Address is unused - - - - - Cannot support multiple addresses - - - - - Recurring payments doesn't currently support multiple addresses - - - - - Recipient - Destinatario - - - - Only z-addresses can have memos - Solo gli indirizzi shielded (z-address) possono avere le memo - - - - Memos can only be used with z-addresses - Le memos possono essere utilizzate solo con z-addresses (Shielded) - - - - The memo field can only be used with a z-address. - - Il campo memo può essere utilizzato solo con z-address (Shielded) - - - - -doesn't look like a z-address - Non sembra uno z-address (Shielded) - - - - Change from - Controllare se opportuno inserire Mittente - Cambiare da - - - - Current balance : - - - - - Balance after this Tx: - - - - - Transaction Error - Errore di transazione - - - - From Address is Invalid - Check - L'indirizzo selezionato non è valido - - - - Recipient Address - Indirizzo Destinatario - - - - is Invalid - non valido - - - - Amount for address '%1' is invalid! - - - - - MemoDialog - - - - Memo - Memo - - - - Include Reply Address - - - - - MemoEdit - - - Reply to - - - - - MigrationDialog - - - Migration Turnstile - - - - - Migration History - - - - - Migrated Amount - - - - - Unmigrated Amount - - - - - Sprout -> Sapling migration enabled - - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - - - - - MigrationTxns - - - Migration Txids - - - - - MobileAppConnector - - - Connect Mobile App - - - - - QR Code - - - - - Connection String - - - - - Allow connections over the internet via ZecWallet wormhole - - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - - - - - ZecWallet Companion App - - - - - Disconnect - - - - - - TextLabel - - - - - Last seen: - - - - - Connection type: - - - - - PrivKey - - Private Key - Chiave Privata - - - - Private Keys - - - - - QObject - - - Attempting autoconnect - Tentativo di connessione automatica - - - - Starting embedded zcashd - check - Avvio demone zcashd - - - - zcashd is set to run as daemon - zcashd è impostato per essere eseguito come un demone - - - - Waiting for zcashd - In attesa di zcashd - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - Hai zcashd impostato per l'avvio come daemon, che può causare problemi con ZecWallet - YOUR_TRANSLATION_HERE - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - check - Impossibile avviare zcashd integrato -Per favore prova a riavviare. -Se hai precedentemente avviato zcashd con parametri personalizzati, potresti dover reimpostare lo zcash.conf -Se tutto il resto fallisce, si prega di eseguire manualmente zcashd. - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - Check - Impossibile connettersi a zcashd come configurato nello zcash.conf. -Non è stato avviato zcashd integrato perché è stato passato il comando --no-embedded - - - - Hide Advanced Config - - - - - Show Advanced Config - - - - - Choose data directory - - - - - All Downloads Finished Successfully! - Tutti i download sono terminati con successo! - - - - Couldn't download params. Please check the help site for more info. - Impossibile scaricare i parametri. Si prega di controllare il sito di aiuto per maggiori informazioni. - - - - The process returned - check - Il processo ha ritornato - - - - - Downloading - Downlaoding - - - - more remaining ) - rimanenti ) - - - - MB of - MB di - - - - MB at - MB a - - - - Downloading blocks - Scaricando i blocchi - - - - Block height - Altezza ultimo blocco - - - - Syncing - Sincronizzazione in corso - - - - Connected - Connesso - - - - testnet: - testnet: - - - - Connected to zcashd - Connesso a zcashd - - - - zcashd has no peer connections - - - - - There was an error connecting to zcashd. The error was - Si è verificato un errore durante la connessione a zcashd. L'errore era - - - - - - The transaction with id - La transazione con id - - - - - - failed. The error was - fallito. l'errore era - - - - - - - failed - fallito - - - - - - - Tx - Tx - - - - tx computing. This can take several minutes. - computazione Tx. Questo può richiedere diversi minuti. - - - - Update Available - - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - - - - - No updates available - - - - - You already have the latest release v%1 - - - - - Please wait for ZecWallet to exit - controllare, senza contesto potrebbe voler dire "attendere zec qt wallet per uscire" o altro, non ho contesto - Si prega di attendere che ZecWallet finisca la procedura di uscita - - - - Waiting for zcashd to exit - vedi appunto precedente - Attendere l'uscita di zcashd - - - - failed. Please check the help site for more info - fallito. Per favore controlllare il sito di aiuto per maggior informazioni - - - - zcashd error - zcashd errore - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - È stata richiesta una connessione manuale, ma le impostazioni non sono state configurate. -Impostare host/porta e utente/password nel menu Modifica-> Impostazioni. - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - Impossibile connettersi a zcashd configurato nelle impostazioni. - -Impostare host/porta e utente/password nel menu Modifica-> Impostazioni. - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - Autenticazione fallita. Il nome utente/password che hai specificato non sono stati accettati da zcashd. Prova a cambiarlo nel menu Modifica-> Impostazioni - - - - Your zcashd is starting up. Please wait. - Il tuo zcashd si sta avviando. Attendere prego. - - - - This may take several hours - - - - - - Connection Error - Errore di Connessione - - - - - - - Transaction Error - Errore di transazione - - - - There was an error sending the transaction. The error was: - Si è verificato un errore durante l'invio della transazione. L'errore era: - - - - - No Connection - Nessuna connessione - - - - Pick - - - - - Address or Label Error - - - - - Address or Label cannot be empty - - - - - Address Format Error - Errore nel formato dell'indirizzo - - - doesn't seem to be a valid Zcash address. - Non sembra un indirizzo Zcash Valido. - - - - %1 doesn't seem to be a valid Zcash address. - - - - - Label Error - - - - - The label '%1' already exists. Please remove the existing label. - - - - - Import Address Book - - - - - Unable to open file - Impossibile aprire il file - - - - Address Book Import Done - - - - - Imported %1 new Address book entries - - - - - Copy address - Copia indirizzo - - - - Copied to clipboard - Copiato negli appunti - - - - Delete label - elimina l'etichetta - - - - Tx submitted (right click to copy) txid: - Tx inviato (clic destro per copiare) txid: - - - - Locked funds - Fondi bloccati - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - Impossibile avviare la migrazione. -Avete fondi non confermati o il saldo è troppo basso per una migrazione automatica. - - - - - Computing Tx: - Computing Tx: - - - - Type - Tipo - - - - Address - Indirizzo - - - - Date/Time - Data/Ora - - - - Amount - Importo - - - - Confirmations - - - - - Connected directly - - - - - Connected over the internet via ZecWallet wormhole service - - - - - Node is still syncing. - - - - - No sapling or transparent addresses with enough balance to spend. - - - - - No ZEC price was available to convert from USD - - - - - Computing Recurring Tx: - - - - - - View on block explorer - Guarda sul block-explorer - - - - View Error - - - - - Reported Error - - - - - - Are you sure you want to delete the recurring payment? - - - - - All future payments will be cancelled. - - - - - RecurringDialog - - - Dialog - - - - - View - - - - - Delete - - - - - RecurringListViewModel - - - Amount - - - - - Schedule - - - - - Payments Left - - - - - Next Payment - - - - - To - - - - - Every - - - - - None - - - - - RecurringPayments - - - Payments - - - - - RecurringPaymentsListViewModel - - - Date - - - - - Status - - - - - Txid - - - - - Not due yet - - - - - Pending - - - - - Skipped - - - - - Paid - - - - - Error - - - - - - Unknown - - - - - RecurringPending - - - Dialog - - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - - - - - Schedule - - - - - How should ZecWallet proceed? - - - - - Pay All in 1 Tx - - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - - - - - Pay Latest Only - - - - - Pay None - - - - - All pending payments collected, added up and paid in a single transaction - - - - - Description - - - - - To - - - - - The following recurring payment has multiple payments pending - - - - - RequestDialog - - - Payment Request - - - - - AddressBook - - - - - Request From - - - - - My Address - - - - - Amount in - - - - - z address - - - - - Amount - - - - - The recipient will see this address in the "to" field when they pay your request. - - - - - Amount USD - - - - - Memo - Memo - - - - TextLabel - - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Pay To - - - - - Pay - - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - - - - - Can only request from Sapling addresses - - - - - Settings - - - Settings - Impostazioni - - - - zcashd connection - Connessione zcashd - - - - Host - Host - - - - Port - Porta - - - - RPC Username - RPC Username - - - - RPC Password - RPC Password - - - - Options - Opzioni - - - - Check github for updates at startup - - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - Le transazioni Shielded vengono salvate localmente e visualizzate nella scheda delle transazioni. Se deselezioni questa opzione, le transazioni Shielded non verranno visualizzate nella scheda delle transazioni. - - - - Connect via Tor - - - - - Connect to github on startup to check for updates - - - - - Connect to the internet to fetch ZEC prices - - - - - Fetch ZEC / USD prices - - - - - Troubleshooting - - - - - Reindex - - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - - - - - Rescan - - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - - - - - Clear History - Cancellare la cronologia - - - - Remember shielded transactions - Ricorda le transazioni Shielded - - - - Allow custom fees - commissioni? Va bene? - Consenti commissioni personalizzate - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - Consentire di ignorare le commissioni di default quando si inviano transazioni. L'attivazione di questa opzione potrebbe compromettere la tua privacy in quanto le commissioni sono trasparenti. - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - Normalmente, il passaggio da t-Addresses passa a un altro t-Address. Selezionando questa opzione invierai invece la transazione di resto al tuo indirizzo Shielded Sapling. Seleziona questa opzione per aumentare la tua privacy. - - - - Shield change from t-Addresses to your sapling address - check - Cambia l'indirizzo Shielded da t-Addresses al tuo indirizzo Sapling - - - - Turnstile - - - - Turnstile Migration - Turnstile Migration - - - - Migrate over - Migrazione terminata - - - - From - da - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - <html><head/><body><p>I fondi da indirizzo Shielded Sprout (che inizia con &quot;zc&quot;) DEVONO essere trasferiti manualmente in un indirizzo Shielded Sapling (che inizia con &quot;zs&quot;). i fondi non possono essere trasferiti direttamente, ma devono essere inviati tramite un indirizzo&quot;Trasparente&quot; intermedio, in modo che sia preservata la privacy.</p><p>La migrazione può essere effettuata in modo automatico</p></body></html> - - - - To - a - - - - Balance - Saldo - - - - Miner Fees - Commissioni Miner - - - - Total Balance - Bilancio Finale - - - - TurnstileProgress - - - Turnstile Migration Progress - Turnstile Migration Progress - - - - From - Da - - - - To - A - - - - Please ensure you have your wallet.dat backed up! - Assicurati di aver eseguito il backup del tuo wallet.dat! - - - - Next Transaction in 4 hours - Prossima transazione in 4 ore - - - - Migration Progress - Avanzamento della migrazione - - - - ValidateAddress - - - Validate Address - - - - - TextLabel - - - - - Address: - - - - - ValidateAddressesModel - - - Property - - - - - Value - - - - - ViewAddressesDialog - - - All Addresses - - - - - Export All Keys - - - - - ViewAllAddressesModel - - - Address - Indirizzo - - - - Balance (%1) - - - - - about - - - About - About - - - - addressBook - - - Address Book - Rubrica - - - - Add New Address - Aggiungi Nuovo Indirizzo - - - - Address (z-Addr or t-Addr) - Indirizzo (z-Addr or t-Addr) - - - - Label - Etichetta - - - - Add to Address Book - Aggiungi a Rubrica - - - - Import Address Book - - - - - confirm - - - Confirm Transaction - Conferma Transazione - - - - From - Da - - - - To - A - - - - Recurring Payment - - - - - TextLabel - - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - - - - - You are sending a transaction while your node is still syncing. This may not work. - Stai inviando una transazione mentre il tuo nodo si sta ancora sincronizzando. Potrebbe non funzionare. - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - Stai utilizzando delle commissioni personalizzate. Dato che le che le commissioni sono trasparenti, stai rinunciando alla privacy. Si prega di usare questo solo se consapevoli di ciò che si sta facendo! - - - - createZcashConf - - - Configure zcash.conf - - - - - Show Advanced Configuration - - - - - Your zcash node will be configured for you automatically - - - - - Enable Fast Sync - - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - - - - - Use custom datadir - - - - - Connect to the internet for updates and price feeds - - - - - Please choose a directory to store your wallet.dat and blockchain - - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - - - - - Choose directory - - - - - Connect over Tor - - - - - Please note that you'll need to already have a Tor service configured on port 9050 - - - - - newRecurringDialog - - - Edit Schedule - - - - - Schedule - - - - - Payment Description - - - - - From - - - - - Number of payments - - - - - Amount - - - - - Next Payment - - - - - To - - - - - Memo - Memo - - - - zboard - - - Post to z-board.net - Posta su z-board.net - - - - Total Fee - Commissioni Totali - - - - Memo - Memo - - - - (optional) - (opzionale) - - - - Send From - Invia Da - - - - Post As: - Posta come: - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - Check, no idea - <html><head/><body><p>ZBoard: messaggi di chat completamente anonimi e non tracciabili basati sulla blockchain di ZCash. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - - - - Warning - Attenzione - - - - Posting to Board - Pubblicazione sulla Board - - - diff --git a/res/zec_qt_wallet_pt.qm b/res/zec_qt_wallet_pt.qm deleted file mode 100644 index bbcaaf62..00000000 Binary files a/res/zec_qt_wallet_pt.qm and /dev/null differ diff --git a/res/zec_qt_wallet_pt.ts b/res/zec_qt_wallet_pt.ts deleted file mode 100644 index b5ce3ca8..00000000 --- a/res/zec_qt_wallet_pt.ts +++ /dev/null @@ -1,2161 +0,0 @@ - - - - - AddressBookModel - - - Label - Etiqueta - - - - Address - Endereço - - - - BalancesTableModel - - - Address - Endereço - - - - Amount - Quantidade - - - - ConnectionDialog - - - ZecWallet - ZecWallet - - - - Starting Up - Iniciando - - - - MainWindow - - - ZecWallet - ZecWallet - - - - Balance - Saldo - - - - Summary - Sumário - - - - Shielded - Blindado - - - - Transparent - Transparente - - - - Total - Total - - - - Some transactions are not yet confirmed - Existem transações não confirmadas ainda - - - - Address Balances - Saldo dos Endereços - - - - - Send - Enviar - - - - From - Endereço de partida - - - - Address Balance - Saldo do Endereço - - - - Send To - Enviar para - - - - Recipient - Destinatário - - - - - - - - Address - Endereço - - - - - Address Book - Agenda - - - - - - - Amount - Quantidade - - - - Max Available - Máximo disponível - - - - - - - Memo - Anexar recado - - - - Add Recipient - Adicionar destinatário - - - - Recurring payment - - - - - Every month, starting 12-May-2012, for 6 payments - - - - - Edit Schedule - - - - - - Miner Fee - Taxa de mineração - - - - 0 - 0 - - - - Cancel - Cancelar - - - - Receive - Receber - - - - Address Type - Tipo de Endereço - - - - Validate Address - - - - z-Addr(Sapling) - z-Addr(Sapling) - - - - t-Addr - t-Addr - - - z-Addr(Sprout) - z-Addr(Sprout) - - - - New Address - Novo Endereço - - - - Label - Etiqueta - - - - Update Label - Atualizar - - - - Address balance - - - - - Optional - Opcional - - - - - Export Private Key - Exportar Chave Privada - - - - z-Addr - - - - - - Your node is still syncing, balances may not be updated - - - - - View All Addresses - - - - - Transactions - Transações - - - - zcashd - zcashd - - - - You are currently not mining - Você não está minerando atualmente - - - - - - Loading... - Carregando... - - - - Block height - Altura do Bloco - - - - Network solution rate - Taxa de soluções da rede - - - - Connections - Conexões - - - - - - | - | - - - - &File - &Arquivo - - - - &Help - &Ajuda - - - - &Apps - &Aplicações - - - - &Edit - &Editar - - - - E&xit - Sair - - - - &About - &Sobre - - - - &Settings - &Preferências - - - - Ctrl+P - Ctrl+P - - - - &Donate - &Doar - - - - Check github.com for &updates - &Checar github.com por atualizações - - - - Sapling &turnstile - Sapling &turnstile - - - - Ctrl+A, Ctrl+T - Ctrl+A, Ctrl+T - - - - &Import private key - &Importar chave privada - - - - &Export all private keys - &Exportar todas as chaves privadas - - - &z-board.net - &z-board.net - - - Ctrl+A, Ctrl+Z - Ctrl+A, Ctrl+Z - - - - Address &book - &Agenda de Endereços - - - - Ctrl+B - Ctrl+B - - - - &Backup wallet.dat - &Salvar wallet.dat - - - - - Export transactions - - - - - Pay zcash &URI... - - - - - Connect mobile &app - - - - - Ctrl+M - - - - - &Recurring Payments - - - - - Request zcash... - - - - - File a bug... - - - - - Tor configuration is available only when running an embedded zcashd. - - - - - You're using an external zcashd. Please restart zcashd with -rescan - - - - - You're using an external zcashd. Please restart zcashd with -reindex - - - - - Enable Tor - - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - - - - - Disable Tor - - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - - - - - Thanks for supporting ZecWallet! - Obrigado por apoiar a ZecWallet! - - - - Donate 0.01 - Doar 0.01 - - - - to support ZecWallet - para apoiar ZecWallet - - - - You are on testnet, your post won't actually appear on z-board.net - Você está na testnet, seu post não aparecerá no z-board.net - - - - You need a sapling address with available balance to post - Você precisa de um endereço sapling com saldo disponível para postar - - - - Computing Tx: - Gerando Tx: - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - Chaves importadas. Pode demorar alguns minutos para re-escanear a blockchain. Até lá, funcionalidades poderão estar limitadas - - - - Private key import rescan finished - Re-escan de chave privada completo - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - - - - - Restart ZecWallet - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Paste Zcash URI - - - - - Not yet ready - - - - - zcashd is not yet ready. Please wait for the UI to load - - - - - View tx on block explorer - - - - - Refresh - - - - - Enter Address to validate - - - - - Transparent or Shielded Address: - - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - Coloque sua(s) chave(s) privadas (z-Addr ou t-Addr) aqui, uma por linha - - - - The keys will be imported into your connected zcashd node - As chaves serão importadas em seu nó zcashd conectado - - - - Error - - - - - Error exporting transactions, file was not saved - - - - - No wallet.dat - Nenhum wallet.data - - - - Couldn't find the wallet.dat on this computer - Não foi localizado o wallet.dat nesse computador - - - - You need to back it up from the machine zcashd is running on - Você precisar salvar a partir da máquina que zcashd está rodando - - - - Backup wallet.dat - Salvar wallet.dat - - - - Couldn't backup - Não foi possível salvar - - - - Couldn't backup the wallet.dat file. - Não foi possível salvar o arquivo wallet.dat. - - - - You need to back it up manually. - Você precisar salvá-lo manualmente. - - - - This might take several minutes. Loading... - - - - - These are all the private keys for all the addresses in your wallet - YOUR_TRANSLATION_HERE - - - - Private key for - Chave privada para - - - - Save File - Salvar Arquivo - - - - Unable to open file - Não foi possível abrir o arquivo - - - - - Copy address - Copiar endereço - - - - - - Copied to clipboard - Copiado - - - - Get private key - Obter chave privada - - - - Shield balance to Sapling - Blindar saldo para Sapling - - - - - View on block explorer - Ver no explorador de blocos - - - - Migrate to Sapling - Migrar para Sapling - - - - - Copy txid - Copiar txid - - - - View Payment Request - - - - - View Memo - Ver Recado - - - - Reply to - - - - - Created new t-Addr - Criar novo t-Addr - - - - Copy Address - - - - - Address has been previously used - - - - - Address is unused - - - - - Cannot support multiple addresses - - - - - Recurring payments doesn't currently support multiple addresses - - - - - Recipient - Destinatário - - - - Only z-addresses can have memos - Apenas z-Addresses podem conter recados - - - - Memos can only be used with z-addresses - Recados só podem ser anexados com z-Addresses - - - - The memo field can only be used with a z-address. - - O campo de recado só pode ser usado junto com z-Addresses. - - - - - -doesn't look like a z-address - -não se parece com um z-Address - - - - Change from - Troco de - - - - Current balance : - - - - - Balance after this Tx: - - - - - Transaction Error - Erro na Transação - - - - From Address is Invalid - Endereço de partida inválido - - - - Recipient Address - Endereço destinatário - - - - is Invalid - é Inválido - - - - Amount for address '%1' is invalid! - - - - - MemoDialog - - - - Memo - Recado - - - - Include Reply Address - - - - - MemoEdit - - - Reply to - - - - - MigrationDialog - - - Migration Turnstile - - - - - Migration History - - - - - Migrated Amount - - - - - Unmigrated Amount - - - - - Sprout -> Sapling migration enabled - - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - - - - - MigrationTxns - - - Migration Txids - - - - - MobileAppConnector - - - Connect Mobile App - - - - - QR Code - - - - - Connection String - - - - - Allow connections over the internet via ZecWallet wormhole - - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - - - - - ZecWallet Companion App - - - - - Disconnect - - - - - - TextLabel - - - - - Last seen: - - - - - Connection type: - - - - - PrivKey - - Private Key - Chave Privada - - - - Private Keys - - - - - QObject - - - Attempting autoconnect - Tentando conectar-se automaticamente - - - - Starting embedded zcashd - Iniciando zcashd acoplado - - - - zcashd is set to run as daemon - erro no zcashd - - - - Waiting for zcashd - Esperando pelo zcashd - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - Você tem zcashd configurado como daemon, o que pode causar problemas com a ZecWallet - Por favor, remova a seguinte linha do seu zcash.conf e reinicie a ZecWallet: -daemon=1 - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - Não foi possível iniciar o zcashd acoplado. -Por favor, tenta reiniciar. -Se você iniciou zcashd anteriormente com parâmetros customizados você pode precisar resetar seu zcash.conf. - -Se ainda assim não der certo, por favor rode zcashd manualmente. - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - Não foi possível conectar ao zcashd configurado em zcash.conf. - -Não iniciando zcashd acoplado porque nenhum foi passado como parâmetro - - - - Hide Advanced Config - - - - - Show Advanced Config - - - - - Choose data directory - - - - - All Downloads Finished Successfully! - Todos os downloads terminaram com sucesso! - - - - Couldn't download params. Please check the help site for more info. - Não foi possível baixar os parâmetros. Por favor, verifique o site de ajuda para mais informações. - - - - The process returned - O processo retornou - - - - - Downloading - Baixando - - - - more remaining ) - faltando ) - - - - MB of - MB de - - - - MB at - MB a - - - - Downloading blocks - Baixando blocos - - - - Block height - Altura do bloco - - - - Syncing - Sincronizando - - - - Connected - Conectado - - - - testnet: - testnet: - - - - Connected to zcashd - Conectado ao zcashd - - - - zcashd has no peer connections - - - - - There was an error connecting to zcashd. The error was - Ocorreu um erro conectando ao zcashd. O erro foi - - - - - - The transaction with id - A transação com id - - - - - - failed. The error was - falhou. O erro foi - - - - - - - failed - falhou - - - - - - - Tx - Tx - - - - tx computing. This can take several minutes. - gerando transação. Isso pode levar alguns minutos. - - - - Update Available - - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - - - - - No updates available - - - - - You already have the latest release v%1 - - - - - Please wait for ZecWallet to exit - Por favor, espera ZecWallet finalizar - - - - Waiting for zcashd to exit - Esperando zcashd finalizar - - - - failed. Please check the help site for more info - falhou. Por favor, cheque o site de ajuda para mais informações - - - - zcashd error - erro no zcashd - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - Uma conexão manual foi requisitada, mas os ajustes não estão configurados. - -Por favor, coloque o host/porta e usuário/senha no menu Editar>Preferências. - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - Não foi possível conectar ao zcashd configurado nas preferências. - -Por favor, coloque o host/porta e usuário/senha no menu Editar>Preferências. - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - Autenticação falhou. O usuário/senha especificado não foi aceitado pelo zcashd. Tente alterá-los em Editar->Preferências - - - - Your zcashd is starting up. Please wait. - Seu zcashd está iniciando. Por favor aguarde. - - - - This may take several hours - - - - - - Connection Error - Erro na Conexão - - - - - - - Transaction Error - Erro na transação - - - - There was an error sending the transaction. The error was: - Ocorreu um erro enviando a transação. O erro foi: - - - - - No Connection - Sem Conexão - - - - Pick - - - - - Address or Label Error - - - - - Address or Label cannot be empty - - - - - Address Format Error - Erro no Formato do Endereço - - - doesn't seem to be a valid Zcash address. - não aparenter ser um endereço válido de Zcash. - - - - %1 doesn't seem to be a valid Zcash address. - - - - - Label Error - - - - - The label '%1' already exists. Please remove the existing label. - - - - - Import Address Book - - - - - Unable to open file - Não foi possível abrir o arquivo - - - - Address Book Import Done - - - - - Imported %1 new Address book entries - - - - - Copy address - Copiar endereço - - - - Copied to clipboard - Copiado - - - - Delete label - Deletar etiqueta - - - - Tx submitted (right click to copy) txid: - Tx enviada (botão-direito para copiar) txid: - - - - Locked funds - Fundos presos - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - Não foi possível iniciar a migração. -Você possui fundos não confirmados ou o saldo é muito baixo para uma migração automática. - - - - - Computing Tx: - Gerando Tx: - - - - Type - Tipo - - - - Address - Endereço - - - - Date/Time - Data/Hora - - - - Amount - Quantidade - - - - Confirmations - - - - - Connected directly - - - - - Connected over the internet via ZecWallet wormhole service - - - - - Node is still syncing. - - - - - No sapling or transparent addresses with enough balance to spend. - - - - - No ZEC price was available to convert from USD - - - - - Computing Recurring Tx: - - - - - - View on block explorer - Ver no explorador de blocos - - - - View Error - - - - - Reported Error - - - - - - Are you sure you want to delete the recurring payment? - - - - - All future payments will be cancelled. - - - - - RecurringDialog - - - Dialog - - - - - View - - - - - Delete - - - - - RecurringListViewModel - - - Amount - Quantidade - - - - Schedule - - - - - Payments Left - - - - - Next Payment - - - - - To - Para - - - - Every - - - - - None - - - - - RecurringPayments - - - Payments - - - - - RecurringPaymentsListViewModel - - - Date - - - - - Status - - - - - Txid - - - - - Not due yet - - - - - Pending - - - - - Skipped - - - - - Paid - - - - - Error - - - - - - Unknown - - - - - RecurringPending - - - Dialog - - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - - - - - Schedule - - - - - How should ZecWallet proceed? - - - - - Pay All in 1 Tx - - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - - - - - Pay Latest Only - - - - - Pay None - - - - - All pending payments collected, added up and paid in a single transaction - - - - - Description - - - - - To - Para - - - - The following recurring payment has multiple payments pending - - - - - RequestDialog - - - Payment Request - - - - - AddressBook - - - - - Request From - - - - - My Address - - - - - Amount in - - - - - z address - - - - - Amount - Quantidade - - - - The recipient will see this address in the "to" field when they pay your request. - - - - - Amount USD - - - - - Memo - - - - - TextLabel - - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - - - - - Error paying zcash URI - - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - - - - - Pay To - - - - - Pay - - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - - - - - Can only request from Sapling addresses - - - - - Settings - - - Settings - Preferências - - - - zcashd connection - Conexão com zcashd - - - - Host - Host - - - - Port - Porta - - - - RPC Username - RPC-Usuário - - - - RPC Password - RPC-Senha - - - - Options - Opções - - - - Check github for updates at startup - - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - Transações blindadas são salvas localmente e exibidas na aba de transações. Se desmarcado, transações blindadas não aparecerão na aba de transações. - - - - Connect via Tor - - - - - Connect to github on startup to check for updates - - - - - Connect to the internet to fetch ZEC prices - - - - - Fetch ZEC / USD prices - - - - - Troubleshooting - - - - - Reindex - - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - - - - - Rescan - - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - - - - - Clear History - Limpar histórico - - - - Remember shielded transactions - Lembrar transações blindadas - - - - Allow custom fees - Permitir taxas customizadas - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - Permite configurar as taxas de transação manualmente. Ativar essa opção pode comprometer sua privacidade uma vez que as taxas são transparentes na rede. - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - Normalmente, trocos de um t-Address vão para outro t-Address. Ativar essa opção irá fazer com que o troco seja encaminhando para um endereço blindado. Ative essa opção para aumentar sua privacidade. - - - - Shield change from t-Addresses to your sapling address - Blinde trocos de t-Addresses para seu endereço Sapling - - - - Turnstile - - - - Turnstile Migration - Migração Turnstile - - - - Migrate over - Migrar durante - - - - From - Endereço de partida - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - <html><head/><body><p>Fundos de endereços z-Address Sprout (que começam com &quot;zc&quot;) precisam ser movidos para os novos z-Addresses Sapling (que começam com &quot;zs&quot;). Os fundos não podem ser movidos diretamente, mas precisam ser enviados passando por endereços transparentes de uma maneira que proteja sua privacidade. </p><p>Essa migração pode ser feita automaticamente para você.</p></body></html> - - - - To - Para - - - - Balance - Saldo - - - - Miner Fees - Taxa de mineração - - - - Total Balance - Saldo Total - - - - TurnstileProgress - - - Turnstile Migration Progress - Progresso da Migração Turnstile - - - - From - Endereço de partida - - - - To - Para - - - - Please ensure you have your wallet.dat backed up! - Por favor, se assegure de ter uma cópia do seu wallet.dat! - - - - Next Transaction in 4 hours - Próxima transação em 4 horas - - - - Migration Progress - YOUR_TRANSLATION_HERProgresso da TransaçãoE - - - - ValidateAddress - - - Validate Address - - - - - TextLabel - - - - - Address: - - - - - ValidateAddressesModel - - - Property - - - - - Value - - - - - ViewAddressesDialog - - - All Addresses - - - - - Export All Keys - - - - - ViewAllAddressesModel - - - Address - Endereço - - - - Balance (%1) - - - - - about - - - About - Sobre - - - - addressBook - - - Address Book - Agenda de Endereços - - - - Add New Address - Adicionar Novo Endereço - - - - Address (z-Addr or t-Addr) - Endereço (z-Addr ou t-Addr) - - - - Label - Etiqueta - - - - Add to Address Book - Adicionar a Agenda - - - - Import Address Book - - - - - confirm - - - Confirm Transaction - Confirmar Transação - - - - From - Endereço de partida - - - - To - Para - - - - Recurring Payment - - - - - TextLabel - - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - - - - - You are sending a transaction while your node is still syncing. This may not work. - Você está enviando uma transação enquanto seu nó ainda está sincronizando. Isso pode não funcionar. - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - Você está usando uma taxa customizada. Como as taxas são transparentes, você pode estar comprometendo sua privacidade. Por favor, só use isso se souber o que está fazendo! - - - - createZcashConf - - - Configure zcash.conf - - - - - Show Advanced Configuration - - - - - Your zcash node will be configured for you automatically - - - - - Enable Fast Sync - - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - - - - - Use custom datadir - - - - - Connect to the internet for updates and price feeds - - - - - Please choose a directory to store your wallet.dat and blockchain - - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - - - - - Choose directory - - - - - Connect over Tor - - - - - Please note that you'll need to already have a Tor service configured on port 9050 - - - - - newRecurringDialog - - - Edit Schedule - - - - - Schedule - - - - - Payment Description - - - - - From - Endereço de partida - - - - Number of payments - - - - - Amount - Quantidade - - - - Next Payment - - - - - To - Para - - - - Memo - - - - - zboard - - - Post to z-board.net - Postar no z-board.net - - - - Total Fee - Taxa Total - - - - Memo - Recado - - - - (optional) - (opcional) - - - - Send From - Enviar de - - - - Post As: - Postar como: - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - <html><head/><body><p>ZBoard: Chat de mensagens totalmente anônimas e irrastreáveis usando a blockchain da Zcash. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - - - - Warning - Aviso - - - - Posting to Board - Postando no Grupo - - - diff --git a/res/zec_qt_wallet_template.ts b/res/zec_qt_wallet_template.ts deleted file mode 100644 index 71682cd1..00000000 --- a/res/zec_qt_wallet_template.ts +++ /dev/null @@ -1,1111 +0,0 @@ - - - - - BalancesTableModel - - - Address - YOUR_TRANSLATION_HERE - - - - Amount - YOUR_TRANSLATION_HERE - - - - ConnectionDialog - - - zec-qt-wallet - YOUR_TRANSLATION_HERE - - - - Starting Up - YOUR_TRANSLATION_HERE - - - - MainWindow - - - zec-qt-wallet - YOUR_TRANSLATION_HERE - - - - Balance - YOUR_TRANSLATION_HERE - - - - Summary - YOUR_TRANSLATION_HERE - - - - Shielded - YOUR_TRANSLATION_HERE - - - - Transparent - YOUR_TRANSLATION_HERE - - - - Total - YOUR_TRANSLATION_HERE - - - - Some transactions are not yet confirmed - YOUR_TRANSLATION_HERE - - - - Address Balances - YOUR_TRANSLATION_HERE - - - - - Send - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - - Address Balance - YOUR_TRANSLATION_HERE - - - - Send To - YOUR_TRANSLATION_HERE - - - - Recipient - YOUR_TRANSLATION_HERE - - - - - - - - Address - YOUR_TRANSLATION_HERE - - - - - Address Book - YOUR_TRANSLATION_HERE - - - - - - - Amount - YOUR_TRANSLATION_HERE - - - - Max Available - YOUR_TRANSLATION_HERE - - - - - - - Memo - YOUR_TRANSLATION_HERE - - - - Add Recipient - YOUR_TRANSLATION_HERE - - - - - Miner Fee - YOUR_TRANSLATION_HERE - - - - 0 - YOUR_TRANSLATION_HERE - - - - Cancel - YOUR_TRANSLATION_HERE - - - - Receive - YOUR_TRANSLATION_HERE - - - - Address Type - YOUR_TRANSLATION_HERE - - - - z-Addr(Sapling) - YOUR_TRANSLATION_HERE - - - - t-Addr - YOUR_TRANSLATION_HERE - - - - z-Addr(Sprout) - YOUR_TRANSLATION_HERE - - - - New Address - YOUR_TRANSLATION_HERE - - - - Label - YOUR_TRANSLATION_HERE - - - - Update Label - YOUR_TRANSLATION_HERE - - - - Optional - YOUR_TRANSLATION_HERE - - - - Export Private Key - YOUR_TRANSLATION_HERE - - - - Transactions - YOUR_TRANSLATION_HERE - - - - zcashd - YOUR_TRANSLATION_HERE - - - - You are currently not mining - YOUR_TRANSLATION_HERE - - - - - - - Loading... - YOUR_TRANSLATION_HERE - - - - Block height - YOUR_TRANSLATION_HERE - - - - Network solution rate - YOUR_TRANSLATION_HERE - - - - Connections - YOUR_TRANSLATION_HERE - - - - - - | - YOUR_TRANSLATION_HERE - - - - &File - YOUR_TRANSLATION_HERE - - - - &Help - YOUR_TRANSLATION_HERE - - - - &Apps - YOUR_TRANSLATION_HERE - - - - &Edit - YOUR_TRANSLATION_HERE - - - - E&xit - YOUR_TRANSLATION_HERE - - - - &About - YOUR_TRANSLATION_HERE - - - - &Settings - YOUR_TRANSLATION_HERE - - - - Ctrl+P - YOUR_TRANSLATION_HERE - - - - &Donate - YOUR_TRANSLATION_HERE - - - - Check github.com for &updates - YOUR_TRANSLATION_HERE - - - - Sapling &turnstile - YOUR_TRANSLATION_HERE - - - - Ctrl+A, Ctrl+T - YOUR_TRANSLATION_HERE - - - - &Import private key - YOUR_TRANSLATION_HERE - - - - &Export all private keys - YOUR_TRANSLATION_HERE - - - - &z-board.net - YOUR_TRANSLATION_HERE - - - - Ctrl+A, Ctrl+Z - YOUR_TRANSLATION_HERE - - - - Address &book - YOUR_TRANSLATION_HERE - - - - Ctrl+B - YOUR_TRANSLATION_HERE - - - - &Backup wallet.dat - YOUR_TRANSLATION_HERE - - - - Thanks for supporting zec-qt-wallet! - YOUR_TRANSLATION_HERE - - - - Donate 0.01 - YOUR_TRANSLATION_HERE - - - - to support zec-qt-wallet - YOUR_TRANSLATION_HERE - - - - You are on testnet, your post won't actually appear on z-board.net - YOUR_TRANSLATION_HERE - - - - You need a sapling address with available balance to post - YOUR_TRANSLATION_HERE - - - - - Computing Tx: - YOUR_TRANSLATION_HERE - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - YOUR_TRANSLATION_HERE - - - - Private key import rescan finished - YOUR_TRANSLATION_HERE - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - YOUR_TRANSLATION_HERE - - - - The keys will be imported into your connected zcashd node - YOUR_TRANSLATION_HERE - - - - No wallet.dat - YOUR_TRANSLATION_HERE - - - - Couldn't find the wallet.dat on this computer - YOUR_TRANSLATION_HERE - - - - You need to back it up from the machine zcashd is running on - YOUR_TRANSLATION_HERE - - - - Backup wallet.dat - YOUR_TRANSLATION_HERE - - - - Couldn't backup - YOUR_TRANSLATION_HERE - - - - Couldn't backup the wallet.dat file. - YOUR_TRANSLATION_HERE - - - - You need to back it up manually. - YOUR_TRANSLATION_HERE - - - - These are all the private keys for all the addresses in your wallet - YOUR_TRANSLATION_HERE - - - - Private key for - YOUR_TRANSLATION_HERE - - - - Save File - YOUR_TRANSLATION_HERE - - - - Unable to open file - YOUR_TRANSLATION_HERE - - - - - Copy address - YOUR_TRANSLATION_HERE - - - - - - Copied to clipboard - YOUR_TRANSLATION_HERE - - - - Get private key - YOUR_TRANSLATION_HERE - - - - Shield balance to Sapling - YOUR_TRANSLATION_HERE - - - - - View on block explorer - YOUR_TRANSLATION_HERE - - - - Migrate to Sapling - YOUR_TRANSLATION_HERE - - - - Copy txid - YOUR_TRANSLATION_HERE - - - - View Memo - YOUR_TRANSLATION_HERE - - - - Created new t-Addr - YOUR_TRANSLATION_HERE - - - - Recipient - YOUR_TRANSLATION_HERE - - - - Only z-addresses can have memos - YOUR_TRANSLATION_HERE - - - - Memos can only be used with z-addresses - YOUR_TRANSLATION_HERE - - - - The memo field can only be used with a z-address. - - YOUR_TRANSLATION_HERE - - - - -doesn't look like a z-address - YOUR_TRANSLATION_HERE - - - - Change from - YOUR_TRANSLATION_HERE - - - - Transaction Error - YOUR_TRANSLATION_HERE - - - - From Address is Invalid - YOUR_TRANSLATION_HERE - - - - Recipient Address - YOUR_TRANSLATION_HERE - - - - is Invalid - YOUR_TRANSLATION_HERE - - - - MemoDialog - - - - Memo - YOUR_TRANSLATION_HERE - - - - PrivKey - - - Private Key - YOUR_TRANSLATION_HERE - - - - QObject - - - Attempting autoconnect - YOUR_TRANSLATION_HERE - - - - Starting embedded zcashd - YOUR_TRANSLATION_HERE - - - - zcashd is set to run as daemon - YOUR_TRANSLATION_HERE - - - - Waiting for zcashd - YOUR_TRANSLATION_HERE - - - - You have zcashd set to start as a daemon, which can cause problems with zec-qt-wallet - -.Please remove the following line from your zcash.conf and restart zec-qt-wallet -daemon=1 - YOUR_TRANSLATION_HERE - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - YOUR_TRANSLATION_HERE - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - YOUR_TRANSLATION_HERE - - - - All Downloads Finished Successfully! - YOUR_TRANSLATION_HERE - - - - Couldn't download params. Please check the help site for more info. - YOUR_TRANSLATION_HERE - - - - The process returned - YOUR_TRANSLATION_HERE - - - - - Downloading - YOUR_TRANSLATION_HERE - - - - more remaining ) - YOUR_TRANSLATION_HERE - - - - MB of - YOUR_TRANSLATION_HERE - - - - MB at - YOUR_TRANSLATION_HERE - - - - Downloading blocks - YOUR_TRANSLATION_HERE - - - - Block height - YOUR_TRANSLATION_HERE - - - - Syncing - YOUR_TRANSLATION_HERE - - - - Connected - YOUR_TRANSLATION_HERE - - - - testnet: - YOUR_TRANSLATION_HERE - - - - Connected to zcashd - YOUR_TRANSLATION_HERE - - - - There was an error connecting to zcashd. The error was - YOUR_TRANSLATION_HERE - - - - The transaction with id - YOUR_TRANSLATION_HERE - - - - failed. The error was - YOUR_TRANSLATION_HERE - - - - failed - YOUR_TRANSLATION_HERE - - - - Tx - YOUR_TRANSLATION_HERE - - - - tx computing. This can take several minutes. - YOUR_TRANSLATION_HERE - - - - Please wait for zec-qt-wallet to exit - YOUR_TRANSLATION_HERE - - - - Waiting for zcashd to exit - YOUR_TRANSLATION_HERE - - - - failed. Please check the help site for more info - YOUR_TRANSLATION_HERE - - - - zcashd error - YOUR_TRANSLATION_HERE - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - YOUR_TRANSLATION_HERE - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - YOUR_TRANSLATION_HERE - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - YOUR_TRANSLATION_HERE - - - - Your zcashd is starting up. Please wait. - YOUR_TRANSLATION_HERE - - - - - Connection Error - YOUR_TRANSLATION_HERE - - - - - Transaction Error - YOUR_TRANSLATION_HERE - - - - There was an error sending the transaction. The error was: - YOUR_TRANSLATION_HERE - - - - - No Connection - YOUR_TRANSLATION_HERE - - - - Address Format Error - YOUR_TRANSLATION_HERE - - - - doesn't seem to be a valid Zcash address. - YOUR_TRANSLATION_HERE - - - - Copy address - YOUR_TRANSLATION_HERE - - - - Copied to clipboard - YOUR_TRANSLATION_HERE - - - - Delete label - YOUR_TRANSLATION_HERE - - - - Tx submitted (right click to copy) txid: - YOUR_TRANSLATION_HERE - - - - Locked funds - YOUR_TRANSLATION_HERE - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - YOUR_TRANSLATION_HERE - - - - Computing Tx: - YOUR_TRANSLATION_HERE - - - - Type - YOUR_TRANSLATION_HERE - - - - Address - YOUR_TRANSLATION_HERE - - - - Date/Time - YOUR_TRANSLATION_HERE - - - - Amount - YOUR_TRANSLATION_HERE - - - - Settings - - - Settings - YOUR_TRANSLATION_HERE - - - - zcashd connection - YOUR_TRANSLATION_HERE - - - - Host - YOUR_TRANSLATION_HERE - - - - Port - YOUR_TRANSLATION_HERE - - - - RPC Username - YOUR_TRANSLATION_HERE - - - - RPC Password - YOUR_TRANSLATION_HERE - - - - Options - YOUR_TRANSLATION_HERE - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - YOUR_TRANSLATION_HERE - - - - Clear History - YOUR_TRANSLATION_HERE - - - - Remember shielded transactions - YOUR_TRANSLATION_HERE - - - - Allow custom fees - YOUR_TRANSLATION_HERE - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - YOUR_TRANSLATION_HERE - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - YOUR_TRANSLATION_HERE - - - - Shield change from t-Addresses to your sapling address - YOUR_TRANSLATION_HERE - - - - Turnstile - - - - Turnstile Migration - YOUR_TRANSLATION_HERE - - - - Migrate over - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - YOUR_TRANSLATION_HERE - - - - To - YOUR_TRANSLATION_HERE - - - - Balance - YOUR_TRANSLATION_HERE - - - - Miner Fees - YOUR_TRANSLATION_HERE - - - - Total Balance - YOUR_TRANSLATION_HERE - - - - TurnstileProgress - - - Turnstile Migration Progress - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - To - YOUR_TRANSLATION_HERE - - - - Please ensure you have your wallet.dat backed up! - YOUR_TRANSLATION_HERE - - - - Next Transaction in 4 hours - YOUR_TRANSLATION_HERE - - - - Migration Progress - YOUR_TRANSLATION_HERE - - - - about - - - About - YOUR_TRANSLATION_HERE - - - - addressBook - - - Address Book - YOUR_TRANSLATION_HERE - - - - Add New Address - YOUR_TRANSLATION_HERE - - - - Address (z-Addr or t-Addr) - YOUR_TRANSLATION_HERE - - - - Label - YOUR_TRANSLATION_HERE - - - - Add to Address Book - YOUR_TRANSLATION_HERE - - - - confirm - - - Confirm Transaction - YOUR_TRANSLATION_HERE - - - - From - YOUR_TRANSLATION_HERE - - - - To - YOUR_TRANSLATION_HERE - - - - You are sending a transaction while your node is still syncing. This may not work. - YOUR_TRANSLATION_HERE - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - YOUR_TRANSLATION_HERE - - - - zboard - - - Post to z-board.net - YOUR_TRANSLATION_HERE - - - - Total Fee - YOUR_TRANSLATION_HERE - - - - Memo - YOUR_TRANSLATION_HERE - - - - (optional) - YOUR_TRANSLATION_HERE - - - - Send From - YOUR_TRANSLATION_HERE - - - - Post As: - YOUR_TRANSLATION_HERE - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - YOUR_TRANSLATION_HERE - - - - Warning - YOUR_TRANSLATION_HERE - - - - Posting to Board - YOUR_TRANSLATION_HERE - - - diff --git a/res/zec_qt_wallet_tr.qm b/res/zec_qt_wallet_tr.qm deleted file mode 100644 index 78cb72b5..00000000 Binary files a/res/zec_qt_wallet_tr.qm and /dev/null differ diff --git a/res/zec_qt_wallet_tr.ts b/res/zec_qt_wallet_tr.ts deleted file mode 100644 index 4edd94cb..00000000 --- a/res/zec_qt_wallet_tr.ts +++ /dev/null @@ -1,2198 +0,0 @@ - - - - - AddressBookModel - - - Label - Etiket - - - - Address - Adres - - - - BalancesTableModel - - - Address - Adres - - - - Amount - Miktar - - - - ConnectionDialog - - zec-qt-wallet - ZecWallet - - - - ZecWallet - ZecWallet - - - - Starting Up - Başlatılıyor - - - - MainWindow - - zec-qt-wallet - ZecWallet - - - - Balance - Bakiye - - - - Summary - Özet - - - - Shielded - Korumalı - - - - Transparent - Transparan - - - - Total - Toplam - - - - Some transactions are not yet confirmed - Bazı işlemler henüz onaylanmadı - - - - Address Balances - Adres Bakiyeleri - - - - - Send - Gönder - - - - From - Gönderen - - - - Address Balance - Adres Bakiyesi - - - - Send To - Alıcıya Gönder - - - - Recipient - Alıcı - - - - - - - - Address - Adres - - - - - Address Book - Adres Defteri - - - - - - - Amount - Miktar - - - - Max Available - Maks. Kullanılabilir - - - - - - - Memo - Memo - - - - Add Recipient - Alıcı Ekle - - - - - Miner Fee - Madenci Ücreti - - - - 0 - 0 - - - - Cancel - İptal - - - - Receive - Al - - - - Address Type - Adres Tipi - - - z-Addr(Sapling) - z-Adres(Sapling) - - - - t-Addr - t-Adres - - - z-Addr(Sprout) - z-Adres(Sprout) - - - - ZecWallet - ZecWallet - - - - - Your node is still syncing, balances may not be updated - Düğümünüz hala senkronize oluyor, bakiyeler güncellenmeyebilir - - - - Recurring payment - Düzenli ödeme - - - - Every month, starting 12-May-2012, for 6 payments - Her ay, 12-May-2012'den itibaren, 6 ödeme için - - - - Edit Schedule - Programı Düzenle - - - - z-Addr - z-Adres - - - - New Address - Yeni Adres - - - - View All Addresses - Tüm Adresleri Görüntüle - - - - Label - Etiket - - - - Update Label - Etiketi Güncelle - - - - Address balance - Adres bakiyesi - - - - Optional - İsteğe bağlı - - - - - Export Private Key - Özel Anahtarı Dışarı Aktar - - - - Transactions - İşlemler - - - - zcashd - zcashd - - - - You are currently not mining - Şu anda madencilik yapmıyorsunuz - - - - - - Loading... - Yükleniyor... - - - - Block height - Blok yüksekliği - - - - Network solution rate - Ağ çözüm oranı - - - - Connections - Bağlantılar - - - - - - | - | - - - - &File - Dosya - - - - &Help - Yardım - - - - &Apps - Uygulamalar - - - - &Edit - Düzenle - - - - E&xit - Çıkış - - - - &About - Hakkında - - - - &Settings - Ayarlar - - - - Ctrl+P - Ctrl+P - - - - &Donate - Bağış Yap - - - - Check github.com for &updates - Güncellemeler için github.com adresini kontrol edin - - - - Sapling &turnstile - YOUR_TRANSLATION_HERE - - - - Ctrl+A, Ctrl+T - Ctrl+A, Ctrl+T - - - - &Import private key - Özel anahtarı içeri aktar - - - - &Export all private keys - Tüm özel anahtarları dışarı aktar - - - - - Export transactions - İşlemleri dışa aktar - - - - Pay zcash &URI... - zcash URI öde... - - - - Connect mobile &app - Mobil uygulamayı bağla - - - - Ctrl+M - Ctrl+M - - - - &Recurring Payments - Düzenli Ödemeler - - - - Request zcash... - zcash iste... - - - - File a bug... - Hata bildir... - - - - Validate Address - Adres Doğrula - - - &z-board.net - z-board.net - - - Ctrl+A, Ctrl+Z - Ctrl+A, Ctrl+Z - - - - Address &book - Adres defteri - - - - Ctrl+B - Ctrl+B - - - - &Backup wallet.dat - wallet.dat dosyasını yedekle - - - Thanks for supporting zec-qt-wallet! - ZecWallet'i desteklediğiniz için teşekkür ederiz! - - - - Donate 0.01 - 0.01 Bağış yap - - - to support zec-qt-wallet - 0.01 Bağış yap yazısının devamı - ve ZecWallet'i destekle - - - - You are on testnet, your post won't actually appear on z-board.net - Testnet'tesiniz, gönderiniz aslında z-board.net'te görünmeyecek - - - - You need a sapling address with available balance to post - Göndermek için uygun bakiye ile bir sapling adres'i gerekir - - - - Computing Tx: - İşlem Hesaplama: - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - Anahtarlar içeri aktarıldı. Blockchain'i yeniden taramak birkaç dakika sürebilir. O zamana kadar, işlevsellik sınırlı olabilir - - - - Private key import rescan finished - Özel anahtar içe aktarma yeniden taraması tamamlandı - - - - Not yet ready - Henüz hazır değil - - - - zcashd is not yet ready. Please wait for the UI to load - zcashd henüz hazır değil. Lütfen arayüzün yüklenmesini bekleyin - - - - View tx on block explorer - İşlemi blok gezgininde görüntüle - - - - Refresh - Yenile - - - - Tor configuration is available only when running an embedded zcashd. - Tor konfigürasyonu yalnızca gömülü bir zcashd çalışırken kullanılabilir. - - - - You're using an external zcashd. Please restart zcashd with -rescan - Harici bir zcashd kullanıyorsun. Lütfen zcashd'yi -rescan ile yeniden başlat - - - - You're using an external zcashd. Please restart zcashd with -reindex - Harici bir zcashd kullanıyorsun. Lütfen zcashd'yi -reindex ile yeniden başlat - - - - Enable Tor - Tor'u etkinleştir - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - Tor üzerinden bağlantı etkin. Bu özelliği kullanmak için, ZecWallet'i yeniden başlatmanız gerekir. - - - - Disable Tor - Tor'u devre dışı bırak - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - Tor üzerinden bağlantı devre dışı bırakıldı. Tor ile bağlantıyı tamamen kesmek için ZecWallet'i yeniden başlatmanız gerekir. - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - ZecWallet yeniden tarama/yeniden indeksleme için yeniden başlatılması gerekiyor. ZecWallet şimdi kapanacak, lütfen devam etmek için ZecWallet'i yeniden başlatın - - - - Restart ZecWallet - ZecWallet'i yeniden başlat - - - - Thanks for supporting ZecWallet! - ZecWallet'i desteklediğiniz için teşekkür ederiz! - - - - to support ZecWallet - ZecWallet'i desteklemek için - - - - Enter Address to validate - Doğrulamak için adres girin - - - - Transparent or Shielded Address: - Transparan veya Korumalı Adres: - - - - Paste Zcash URI - Zcash URI Yapıştır - - - - Error paying zcash URI - zcash URI ödeme hatası - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - URI bu şekilde olmalıdır: 'zcash:<addr>?amt=x&memo=y - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - Lütfen özel anahtarlarınızı (z-Adres veya t-Adres) buraya, her satıra bir tane olacak şekilde yapıştırın - - - - The keys will be imported into your connected zcashd node - Anahtarlar bağlı zcashd düğümünüze aktarılacak - YOUR_TRANSLATION_HERE - - - - Error - Hata - - - - Error exporting transactions, file was not saved - İşlemler dışa aktarılırken hata oluştu, dosya kaydedilmedi - - - - No wallet.dat - wallet.dat yok - - - - Couldn't find the wallet.dat on this computer - wallet.dat dosyası bu bilgisayarda bulunamadı - - - - You need to back it up from the machine zcashd is running on - zcashd'nin çalıştığı makineden yedeklemeniz gerekiyor - - - - Backup wallet.dat - wallet.dat dosyasını yedekle - - - - Couldn't backup - Yedeklenemedi - - - - Couldn't backup the wallet.dat file. - wallet.dat dosyası yedeklenemedi. - - - - You need to back it up manually. - Manuel olarak yedeklemeniz gerekir. - - - - This might take several minutes. Loading... - Bu birkaç dakika sürebilir. Yükleniyor... - - - - These are all the private keys for all the addresses in your wallet - Bunlar, cüzdanınızdaki tüm adreslerin özel anahtarlarıdır - - - - Private key for - için özel anahtar - - - - Save File - Dosyayı Kaydet - - - - Unable to open file - Dosya açılamıyor - - - - - Copy address - Adresi kopyala - - - - - - Copied to clipboard - Panoya kopyalandı - - - - Get private key - Özel anahtarı al - - - - Shield balance to Sapling - - - - - - View on block explorer - Blok gezgini üzerinde göster - - - - Migrate to Sapling - Sapling'e geç - - - - Copy Address - Adresi kopyala - - - - Address has been previously used - Adres daha önce kullanılmış - - - - Address is unused - Adres kullanılmamış - - - - - Copy txid - txid'i kopyala - - - - View Payment Request - Ödeme Talebini Görüntüle - - - - View Memo - Memo'yu Görüntüle - - - - Reply to - - - - - Created new t-Addr - Yeni t-Addr oluşturuldu - - - - Cannot support multiple addresses - Birden fazla adres desteklenemiyor - - - - Recurring payments doesn't currently support multiple addresses - Düzenli ödemeler şu anda birden fazla adresi desteklemiyor - - - - Recipient - Alıcı - - - - Only z-addresses can have memos - Sadece z-adres'leri memo'lara sahip olabilir - - - - Memos can only be used with z-addresses - Memo'lar yalnızca z-adres'leriyle kullanılabilir - - - - The memo field can only be used with a z-address. - - Memo alanı yalnızca bir z-adres'i ile kullanılabilir. - - - - - -doesn't look like a z-address - -z-adres'i gibi görünmüyor - - - - Change from - Şuradan para üstü - - - - Current balance : - Mevcut bakiye : - - - - Balance after this Tx: - Bu işlemden sonra bakiye: - - - - Transaction Error - İşlem Hatası - - - - From Address is Invalid - Gönderen Adresi Geçersiz - - - - Recipient Address - Alıcı Adresi - - - - is Invalid - geçersizdir - - - - Amount for address '%1' is invalid! - '% 1' adresinin tutarı geçersiz! - - - - MemoDialog - - - - Memo - Memo - - - - Include Reply Address - Yanıt Adresini Dahil Et - - - - MemoEdit - - - Reply to - - - - - MigrationDialog - - - Migration Turnstile - Turnstile Taşınması - - - - Migration History - Taşıma Geçmişi - - - - Migrated Amount - Taşınan miktar - - - - Unmigrated Amount - Taşınmamış miktar - - - - Sprout -> Sapling migration enabled - Sprout -> Sapling taşınması etkin - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - Etkinleştirilirse, zcashd Sprout korumalı fonlarınızı yavaşça Sapling adresinize taşıyacaktır. - - - - MigrationTxns - - - Migration Txids - Geçiş İşlem id'leri - - - - MobileAppConnector - - - Connect Mobile App - Mobil Uygulamaya Bağlan - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - Telefonunuzu bağlamak için bu QR Kodu'nu ZecWallet dostu uygulamadan tarayın - - - - QR Code - QR Kodu - - - - Connection String - Bağlantı Dizisi - - - - Allow connections over the internet via ZecWallet wormhole - ZecWallet solucan deliği aracılığıyla internet üzerinden bağlantıya izin ver - - - - ZecWallet Companion App - ZecWallet Dostu Uygulama - - - - Disconnect - Bağlantıyı Kes - - - - - TextLabel - Metin Etiketi - - - - Last seen: - Son görülen: - - - - Connection type: - Bağlantı tipi: - - - - PrivKey - - Private Key - Özel Anahtar - - - - Private Keys - Özel Anahtarlar - - - - QObject - - - Attempting autoconnect - Otomatik bağlanmaya çalışılıyor - - - - Starting embedded zcashd - Gömülü zcashd başlatılıyor - - - - zcashd is set to run as daemon - zcashd daemon olarak çalışacak şekilde ayarlandı - - - - Waiting for zcashd - zcashd bekleniyor - - - You have zcashd set to start as a daemon, which can cause problems with zec-qt-wallet - -.Please remove the following line from your zcash.conf and restart zec-qt-wallet -daemon=1 - zcashd, zec-qt-wallet ile sorunlara neden olan bir daemon olarak başlayacak şekilde ayarladınız. - -.Lütfen aşağıdaki satırı zcash.conf dosyanızdan kaldırın ve ZecWallet'i yeniden başlatın -daemon=1 - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - Gömülü zcashd başlatılamadı. - -Lütfen yeniden başlatmayı deneyin. - -Daha önce zcashd'yi özel argümanlarla başlattıysanız, zcash.conf dosyasını sıfırlamanız gerekebilir. - -Hepsi başarısız olursa, lütfen zcashd'yi manuel olarak çalıştırın. - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - zcash.conf ile yapılandırılmış zcashd'ye bağlanılamadı. - ---no-embedded iletildiğinden gömülü zcashd başlatılmıyor - - - - All Downloads Finished Successfully! - Tüm İndirmeler Başarıyla Tamamlandı! - - - - Couldn't download params. Please check the help site for more info. - Parametreler indirilemedi. Lütfen daha fazla bilgi için yardım sitesine bakın. - - - - The process returned - İşlem geri döndü - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - zcashd'yi, zec-qt-wallet ile sorunlara neden olabilecek bir daemon olacak şekilde ayarladınız. - -.Lütfen aşağıdaki satırı zcash.conf dosyanızdan kaldırın ve ZecWallet'i yeniden başlatın -daemon=1 - - - - Hide Advanced Config - Gelişmiş Konfigürasyonu Gizle - - - - Show Advanced Config - Gelişmiş Konfigürasyonu Göster - - - - Choose data directory - Veri dizini seç - - - - - Downloading - İndiriliyor - - - - more remaining ) - daha kaldı ) - - - - MB of - MB / - - - - MB at - MB saniyede - - - - Downloading blocks - Bloklar indiriliyor - - - - Block height - Blok yüksekliği - - - - Syncing - Senkronize ediliyor - - - - Connected - Bağlanıldı - - - - testnet: - testnet: - - - - Connected to zcashd - Zcashd'ye bağlanıldı - - - - zcashd has no peer connections - zcashd'nin eş bağlantısı yok - - - - There was an error connecting to zcashd. The error was - zcashd ile bağlantı kurulurken bir hata oluştu. Hata - - - - - - The transaction with id - id ile işlem - - - - - - failed. The error was - başarısız oldu. Hata - - - - Update Available - Güncelleme Mevcut - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - Yeni bir sürüm olan v%1 mevcut! Sizin sürümünüz: v%2. - -Yayınlanan sürümler sayfasını ziyaret etmek ister misiniz? - - - - No updates available - Güncelleme yok - - - - You already have the latest release v%1 - Zaten en son sürüme (v%1) sahipsiniz - - - - Please wait for ZecWallet to exit - Lütfen çıkmak için ZecWallet'i bekleyin - - - - No ZEC price was available to convert from USD - USD'den dönüştürülebilecek ZEC fiyatı yok - - - - Computing Recurring Tx: - Düzenli İşlem Hesaplama: - - - - - - - failed - başarısız oldu - - - - - - - Tx - işlem - - - - - View on block explorer - Blok gezgini üzerinde göster - - - - View Error - Hatayı Göster - - - - Reported Error - Rapor Edilen Hata - - - - - Are you sure you want to delete the recurring payment? - Düzenli ödemeyi silmek istediğinize emin misiniz? - - - - All future payments will be cancelled. - Gelecekteki tüm ödemeler iptal edilecektir. - - - - tx computing. This can take several minutes. - tx hesaplanıyor. Bu birkaç dakika sürebilir. - - - Please wait for zec-qt-wallet to exit - Lütfen çıkmak için ZecWallet'i bekleyin - - - - Waiting for zcashd to exit - Çıkmak için zcashd bekleniyor - - - - failed. Please check the help site for more info - başarısız oldu. Daha fazla bilgi için lütfen yardım sitesine bakın - - - - zcashd error - zcashd hatası - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - Manuel bir bağlantı istendi, ancak ayarlar yapılandırılmadı. - -Lütfen Düzenle->Ayarlar menüsünde sunucu/bağlantı noktasını ve kullanıcı adı/şifreyi ayarlayın. - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - Ayarlarda yapılandırılmış zcashd'ye bağlanılamadı. - -Lütfen Düzenle->Ayarlar menüsünde sunucu/bağlantı noktası ve kullanıcı adı/şifreyi ayarlayın. - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - Kimlik doğrulama başarısız oldu. Belirttiğiniz kullanıcı adı/şifre zcashd tarafından kabul edilmedi. Düzenle-> Ayarlar menüsünde değiştirmeyi deneyin - - - - Your zcashd is starting up. Please wait. - Zcashd'niz başlıyor. Lütfen bekle. - - - - This may take several hours - Bu birkaç saat sürebilir - - - - - Connection Error - Bağlantı Hatası - - - - - - - Transaction Error - İşlem Hatası - - - - There was an error sending the transaction. The error was: - İşlem gönderilirken bir hata oluştu. Hata: - - - - - No Connection - Bağlantı Yok - - - - Address Format Error - Adres Formatı Hatası - - - doesn't seem to be a valid Zcash address. - geçerli bir Zcash adresi gibi görünmüyor. - - - - Pick - Seç - - - - Address or Label Error - Adres veya Etiket Hatası - - - - Address or Label cannot be empty - Adres veya Etiket boş olamaz - - - - %1 doesn't seem to be a valid Zcash address. - %1 geçerli bir Zcash adresi gibi gözükmüyor. - - - - Label Error - Etiket Hatası - - - - The label '%1' already exists. Please remove the existing label. - '%1' etiketi zaten var. Lütfen mevcut etiketi kaldırın. - - - - Import Address Book - Adres Defterini İçe Aktar - - - - Unable to open file - Dosya açılamıyor - - - - Address Book Import Done - Adres Defteri İçe Aktarma İşlemi Yapıldı - - - - Imported %1 new Address book entries - %1 yeni Adres defteri girişi içeri aktarıldı - - - - Copy address - Adresi kopyala - - - - Copied to clipboard - Panoya kopyalandı - - - - Delete label - Etiketi sil - - - - Tx submitted (right click to copy) txid: - İşlem gönderildi (kopyalamak için sağ tıklayın) id: - - - - Locked funds - Kilitli fonlar - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - Geçiş başlatılamadı. -Onaylanmamış fonunuz var veya otomatik geçiş için bakiye çok düşük. - - - - - Computing Tx: - İşlem Hesaplanıyor: - - - - Type - Tür - - - - Address - Adres - - - - Date/Time - Tarih/Saat - - - - Amount - Miktar - - - - Confirmations - Onaylar - - - - Connected directly - Doğrudan bağlandı - - - - Connected over the internet via ZecWallet wormhole service - ZecWallet'in solucan deliği servisi aracılığıyla internet üzerinden bağlandı - - - - Node is still syncing. - Düğüm hala senkronize oluyor. - - - - No sapling or transparent addresses with enough balance to spend. - Harcanacak bakiyesi olan Sapling veya Transparan adres yok. - - - - RecurringDialog - - - Dialog - Diyalog - - - - View - Görüntüle - - - - Delete - Sil - - - - RecurringListViewModel - - - Amount - Miktar - - - - Schedule - Program - - - - Payments Left - Kalan Ödemeler - - - - Next Payment - Sonraki Ödeme - - - - To - Alıcı - - - - Every - Her - - - - None - Yok - - - - RecurringPayments - - - Payments - Ödemeler - - - - RecurringPaymentsListViewModel - - - Date - Tarih - - - - Status - Durum - - - - Txid - İşlem id - - - - Not due yet - Henüz değil - - - - Pending - Kuyrukta - - - - Skipped - Atlandı - - - - Paid - Ödenmiş - - - - Error - Hata - - - - - Unknown - Bilinmeyen - - - - RecurringPending - - - Dialog - Diyalog - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - Hiçbir ödeme işleme alınmayacak. Bunları Düzenli Ödemeler Diyalog kutusundan manuel olarak ödeyebilirsiniz - - - - Schedule - Program - - - - How should ZecWallet proceed? - ZecWallet nasıl ilerlemeli? - - - - Pay All in 1 Tx - Hepsini 1 işlemde öde - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - Yalnızca en son bekleyen ödeme işleme koyulur. Önceki tüm bekleyen ödemeler atlanacak - - - - Pay Latest Only - Sadece Son Ödeme - - - - Pay None - Hiç Ödeme - - - - All pending payments collected, added up and paid in a single transaction - Beklemedeki tüm ödemeler toplanır, eklenir ve tek bir işlemde ödenir - - - - Description - Açıklama - - - - To - Alıcı - - - - The following recurring payment has multiple payments pending - Aşağıdaki tekrarlayan ödemede bekleyen birden fazla ödeme var - - - - RequestDialog - - - Payment Request - Ödeme Talebi - - - - AddressBook - Adres Defteri - - - - Request From - İstek Adresi - - - - My Address - Benim Adresim - - - - Amount in - Miktar: - - - - z address - z adres - - - - Amount - Miktar - - - - The recipient will see this address in the "to" field when they pay your request. - Alıcı, isteğinizi ödediğinde bu adresi "alıcı" alanında görecektir. - - - - Amount USD - USD Miktarı - - - - Memo - Memo - - - - TextLabel - Metin Etiketi - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - Bir Sapling adresinden ödeme talep edin. Bir zcash ödeme URI'si olan bir adrese ZEC 0.0001 işlemi gönderirsiniz. Adres size ödeme yaptığında Memo işleme dahil edilecektir. - - - - Error paying zcash URI - zcash URI ödeme hatası - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - URI bu şekilde olmalıdır: 'zcash:<addr>?amt=x&memo=y - - - - Pay To - - - - - Pay - Öde - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - Bir ödeme isteği ödüyorsunuz. Adresiniz bu ödemeyi isteyen kişiye görünmez. - - - - Can only request from Sapling addresses - Sadece Sapling adreslerinden talep edebilir - - - - Settings - - - Settings - Ayarlar - - - - zcashd connection - zcashd bağlantısı - - - - Host - Sunucu - - - - Port - Bağlantı noktası - - - - RPC Username - RPC Kullanıcı Adı - - - - RPC Password - RPC Şifresi - - - - Options - Seçenekler - - - - Connect via Tor - Tor ile bağlan - - - - Check github for updates at startup - Başlangıçta güncellemeler için github'u kontrol et - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - Korumalı işlemler yerel olarak kaydedilir ve işlemler sekmesinde gösterilir. Bu seçeneğin işaretini kaldırırsanız, korumalı işlemler işlemler sekmesinde görünmez. - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - Tor ağına 127.0.0.1:9050'de çalışan SOCKS proxy üzerinden bağlanın. Lütfen Tor servisini harici olarak kurmanız ve çalıştırmanız gerektiğini lütfen unutmayın. - - - - Connect to github on startup to check for updates - Güncellemeleri denetlemek için başlangıçta github'a bağlanır - - - - Connect to the internet to fetch ZEC prices - ZEC fiyatlarını çekmek için internete bağlanır - - - - Fetch ZEC / USD prices - ZEC / USD fiyatlarını çek - - - - Troubleshooting - Sorun giderme - - - - Reindex - Yeniden indeksle - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - Eksik cüzdan işlemleri ve cüzdan bakiyenizi düzeltmek için blok zincirini yeniden tarayın. Bu birkaç saat sürebilir. Bunun gerçekleşmesi için ZecWallet'i yeniden başlatmanız gerekir - - - - Rescan - Yeniden tara - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - Tüm blok dosyalarını yeniden tarayarak blok zincirini genesis bloğundan yeniden oluşturun. Bu, donanımınıza bağlı olarak birkaç saat ila günler sürebilir. Bunun gerçekleşmesi için ZecWallet’i yeniden başlatmanız gerekir - - - - Clear History - Geçmişi Temizle - - - - Remember shielded transactions - Korumalı işlemleri hatırla - - - - Allow custom fees - Özel ücretlere izin ver - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - İşlemleri gönderirken varsayılan ücretlerin geçersiz kılınmasına izin verin. Bu seçeneğin etkinleştirilmesi, ücretler şeffaf olduğu için gizliliğinizi tehlikeye atabilir. - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - Normalde, t-Adres'lerinden para üstü başka bir t-Adres'e gider. Bu seçeneğin işaretlenmesi, para üstünü Korumalı Sapling adresinize gönderecektir. Gizliliğinizi artırmak için bu seçeneği işaretleyin. - - - - Shield change from t-Addresses to your sapling address - t-Adres'in para üstünü Korumalı Sapling adresine gönder - - - - Turnstile - - - - Turnstile Migration - Turnstile Taşıması - - - - Migrate over - Geçiş yap - - - - From - Gönderen - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - YOUR_TRANSLATION_HERE - - - - To - Alıcı - - - - Balance - Bakiye - - - - Miner Fees - Madenci Ücreti - - - - Total Balance - Toplam Bakiye - - - - TurnstileProgress - - - Turnstile Migration Progress - Turnstile Geçiş İlerlemesi - - - - From - Gönderen - - - - To - Alıcı - - - - Please ensure you have your wallet.dat backed up! - Lütfen wallet.dat dosyanızı yedeklediğinizden emin olun! - - - - Next Transaction in 4 hours - 4 saat içinde sonraki işlem - - - - Migration Progress - Geçiş İlerlemesi - - - - ValidateAddress - - - Validate Address - Adres Doğrulama - - - - TextLabel - Metin Etiketi - - - - Address: - Adres: - - - - ValidateAddressesModel - - - Property - - - - - Value - Değer - - - - ViewAddressesDialog - - - All Addresses - Tüm Adresler - - - - Export All Keys - Tüm Anahtarları Dışa Aktar - - - - ViewAllAddressesModel - - - Address - Adres - - - - Balance (%1) - Bakiye (%1) - - - - about - - - About - Hakkında - - - - addressBook - - - Address Book - Adres Defteri - - - - Add New Address - Yeni Adres Ekle - - - - Address (z-Addr or t-Addr) - Adres (z-Adres veya t-Adres) - - - - Label - Etiket - - - - Add to Address Book - Adres Defterine Ekle - - - - Import Address Book - Adres Defterini İçe Aktar - - - - confirm - - - Confirm Transaction - İşlemi Onayla - - - - From - Gönderen - - - - To - Alıcı - - - - Recurring Payment - Düzenli Ödeme - - - - TextLabel - Metin Etiketi - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - zcashd'in düğümleri yok gibi görünüyor. İnternete bağlı olmadığınız için bu işlem çalışmayabilir. - - - - You are sending a transaction while your node is still syncing. This may not work. - Düğümünüz hala senkronize oluyorken bir işlem gönderiyorsunuz. Bu işe yaramayabilir. - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - Özel bir ücret kullanıyorsunuz. Ücretler şeffaf olduğu için, bazı gizliliklerden vazgeçiyorsunuz. Lütfen bunu sadece ne yaptığınızı biliyorsanız kullanın! - - - - createZcashConf - - - Configure zcash.conf - zcash.conf dosyasını yapılandırma - - - - Your zcash node will be configured for you automatically - zcash düğümünüz sizin için otomatik olarak yapılandırılacak - - - - Enable Fast Sync - Hızlı Senkronizasyonu Etkinleştir - - - - Show Advanced Configuration - Gelişmiş Yapılandırmayı Göster - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - ZEC/USD fiyatlarını çekme, güncellemeleri denetleme vb. işlemler için internete bağlanmaya izin ver - - - - Use custom datadir - Özel datadir (veri dizini) kullan - - - - Choose directory - Dizin seç - - - - Please note that you'll need to already have a Tor service configured on port 9050 - Lütfen 9050 numaralı bağlantı noktasında yapılandırılmış bir Tor servisine ihtiyacınız olduğunu unutmayın - - - - Connect to the internet for updates and price feeds - Güncellemelere ve fiyatlara bakmak için internete bağlan - - - - Please choose a directory to store your wallet.dat and blockchain - Lütfen wallet.dat ve blok zinciri'nizi saklamak için bir dizin seçin - - - - Connect over Tor - Tor üzerinden bağlan - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - <html><head/><body><p>Blok indirme işlemi sırasında en uzun süren kontrolleri atlar. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Daha fazla bilgi edin</span></a></p></body></html> - - - - newRecurringDialog - - - Edit Schedule - Program düzenleme - - - - Payment Description - Ödeme Açıklaması - - - - Schedule - Program - - - - Next Payment - Sonraki Ödeme - - - - Amount - Miktar - - - - Memo - Memo - - - - To - Alıcı - - - - From - Gönderen - - - - Number of payments - Ödeme sayısı - - - - zboard - - - Post to z-board.net - z-board.net'e gönder - - - - Total Fee - Toplam Ücret - - - - Memo - Memo - - - - (optional) - (isteğe bağlı) - - - - Send From - Bu Adresten Gönder - - - - Post As: - Olarak Gönder: - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - <html><head/><body><p>ZBoard: ZCash blockchain'i üzerinde tamamen anonim ve takip edilemeyen sohbet mesajları. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - - - - Warning - Uyarı - - - - Posting to Board - ZBoard'a gönderme - - - diff --git a/res/zec_qt_wallet_zh.qm b/res/zec_qt_wallet_zh.qm deleted file mode 100644 index d50d9b77..00000000 Binary files a/res/zec_qt_wallet_zh.qm and /dev/null differ diff --git a/res/zec_qt_wallet_zh.ts b/res/zec_qt_wallet_zh.ts deleted file mode 100644 index 1be06448..00000000 --- a/res/zec_qt_wallet_zh.ts +++ /dev/null @@ -1,2158 +0,0 @@ - - - - - AddressBookModel - - - Label - 标签 - - - - Address - 地址 - - - - BalancesTableModel - - - Address - 地址 - - - - Amount - 金额 - - - - ConnectionDialog - - - ZecWallet - ZEC钱包 - - - - Starting Up - 启动中 - - - - MainWindow - - - ZecWallet - ZEC钱包 - - - - Balance - 余额 - - - - Summary - 概要 - - - - Shielded - 隐蔽余额 - - - - Transparent - 非隐蔽余额 - - - - Total - 所有余额 - - - - - Your node is still syncing, balances may not be updated - 您的节点仍在同步,余额可能没有更新 - - - - Some transactions are not yet confirmed - 部分交易尚未得到确认 - - - - Address Balances - 地址余额 - - - - - Send - 发送 - - - - From - - - - - Address Balance - 地址余额 - - - - Send To - 发送给 - - - - Recipient - 接收者 - - - - - - - - Address - 地址 - - - - - Address Book - 地址薄 - - - - - - - Amount - 金额 - - - - Max Available - 最大可发送金额 - - - - - - - Memo - 备注 - - - - Add Recipient - 添加接收者 - - - - Recurring payment - 循环支付 - - - - Every month, starting 12-May-2012, for 6 payments - 从2012年5月12日开始,每月支付6次 - - - - Edit Schedule - 编辑计划 - - - - - Miner Fee - 矿工费用 - - - - 0 - 0 - - - - Cancel - 取消 - - - - Receive - 接收 - - - - Address Type - 地址类型 - - - - z-Addr - 隐蔽地址(z-Addr) - - - - t-Addr - 非隐蔽地址(t-Addr) - - - - New Address - 创建新地址 - - - - View All Addresses - - - - - Label - 标签 - - - - Update Label - 更新标签 - - - - Address balance - 地址余额 - - - - Optional - 可选 - - - - - Export Private Key - 导出私钥 - - - - Transactions - 交易 - - - - zcashd - 节点 - - - - You are currently not mining - 您目前没有在挖矿 - - - - - - Loading... - 加载中... - - - - Block height - 区块高度 - - - - Network solution rate - 全网算力 - - - - Connections - 连接数 - - - - - - | - | - - - - &File - &文件 - - - - &Help - &帮助 - - - - &Apps - &应用 - - - - &Edit - &编辑 - - - - E&xit - &退出 - - - - &About - &关于 - - - - &Settings - &设置 - - - - Ctrl+P - Ctrl+P - - - - &Donate - &捐赠 - - - - Check github.com for &updates - 检查github.com获取和&更新 - - - - Sapling &turnstile - 树苗&十字旋转门 - - - - Ctrl+A, Ctrl+T - Ctrl+A, Ctrl+T - - - - &Import private key - &导入私钥 - - - - &Export all private keys - &导出所有私钥 - - - - Validate Address - - - - &z-board.net - &z-board.net - - - Ctrl+A, Ctrl+Z - Ctrl+A, Ctrl+Z - - - - Address &book - &地址簿 - - - - Ctrl+B - Ctrl+B - - - - &Backup wallet.dat - &备份 wallet.dat - - - - - Export transactions - 导出交易 - - - - Pay zcash &URI... - 支付zcash &URI ... - - - - Connect mobile &app - 连接移动&App - - - - Ctrl+M - Ctrl+M - - - - &Recurring Payments - &定期付款 - - - - Request zcash... - 请求 zcash... - - - - File a bug... - 提交错误... - - - - Not yet ready - 尚未准备好 - - - - zcashd is not yet ready. Please wait for the UI to load - zcashd尚未准备好。 请等待UI加载 - - - - View tx on block explorer - - - - - Refresh - - - - - Tor configuration is available only when running an embedded zcashd. - Tor配置仅在运行嵌入的zcashd时可用。 - - - - You're using an external zcashd. Please restart zcashd with -rescan - 你正在使用外部zcashd。 请使用-rescan参数重新启动zcashd - - - - You're using an external zcashd. Please restart zcashd with -reindex - 你正在使用外部zcashd。 请使用-reindex重新启动zcashd - - - - Enable Tor - 启用Tor - - - - Connection over Tor has been enabled. To use this feature, you need to restart ZecWallet. - 已启用Tor上的连接。 要使用此功能,您需要重新启动ZecWallet。 - - - - Disable Tor - 禁用Tor - - - - Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart ZecWallet. - Tor上的连接已被禁用。 要完全断开与Tor的连接,您需要重新启动ZecWallet。 - - - - ZecWallet needs to restart to rescan/reindex. ZecWallet will now close, please restart ZecWallet to continue - ZecWallet需要重新启动才能重新扫描/重新索引。 ZecWallet现在关闭,请重启ZecWallet以继续 - - - - Restart ZecWallet - 重启ZecWallet - - - - Thanks for supporting ZecWallet! - 感谢您支持ZecWallet! - - - - Donate 0.01 - 捐赠0.01 - - - - to support ZecWallet - 支持ZecWallet - - - - Enter Address to validate - - - - - Transparent or Shielded Address: - - - - - You are on testnet, your post won't actually appear on z-board.net - 你在testnet上,你的帖子实际上不会出现在z-board.net上 - - - - You need a sapling address with available balance to post - 您需要一个具有可用余额的sapling地址才能发布 - - - - Computing Tx: - 计算交易: - - - - Private key import rescan finished - 私钥导入重新扫描完成 - - - - Paste Zcash URI - 粘贴Zcash URI - - - - Error paying zcash URI - 支付zcash URI时出错 - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - URI的格式应为 'zcash:<addr>?amt=x&memo=y' - - - - Please paste your private keys (z-Addr or t-Addr) here, one per line - 请在此粘贴您的私钥(z-Addr或t-Addr),每行一个 - - - - The keys will be imported into your connected zcashd node - 密钥将导入已连接的zcashd节点 - - - - The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited - 钥匙是导入的。 重新扫描区块链可能需要几分钟时间。 在此之前,功能可能会受到限制 - - - - Error - 错误 - - - - Error exporting transactions, file was not saved - 导出交易时出错,文件未保存 - - - - No wallet.dat - 没有 wallet.dat - - - - Couldn't find the wallet.dat on this computer - 在这台电脑上找不到wallet.dat - - - - You need to back it up from the machine zcashd is running on - 你需要从运行zcashd的机器备份它 - - - - Backup wallet.dat - 备份 wallet.dat - - - - Couldn't backup - 无法备份 - - - - Couldn't backup the wallet.dat file. - 无法备份wallet.dat文件。 - - - - You need to back it up manually. - 您需要手动备份它。 - - - - This might take several minutes. Loading... - - - - - These are all the private keys for all the addresses in your wallet - 这些都是钱包中所有地址的私钥 - - - - Private key for - 私钥 - - - - Save File - 保存文件 - - - - Unable to open file - 无法打开文件 - - - - - Copy address - 复制成功 - - - - - - Copied to clipboard - 复制到剪贴板 - - - - Get private key - 获取私钥 - - - - Shield balance to Sapling - 屏蔽余额到Sapling地址 - - - - - View on block explorer - 从区块浏览器中查看 - - - - Migrate to Sapling - 迁移到Sapling地址 - - - - - Copy txid - 复制交易ID - - - - View Payment Request - 查看付款申请 - - - - View Memo - 查看备注 - - - - Reply to - 回复给 - - - - Created new t-Addr - 创建了新的t-Addr - - - - Copy Address - - - - - Address has been previously used - 该地址以前使用过 - - - - Address is unused - 地址未使用 - - - - Cannot support multiple addresses - 不能支持多个地址 - - - - Recurring payments doesn't currently support multiple addresses - 定期付款目前不支持多个地址 - - - - Recipient - 接收者 - - - - Only z-addresses can have memos - 只有 z-addresses 才能有备注 - - - - Memos can only be used with z-addresses - 备注只能与z-addresses一起使用 - - - - The memo field can only be used with a z-address. - - 备注字段只能与z-address一起使用。 - - - - - -doesn't look like a z-address - -看起来不像是z-address - - - - Change from - 更改发送地址 - - - - Current balance : - 当前余额 : - - - - Balance after this Tx: - 这次交易后余额: - - - - Transaction Error - 交易错误 - - - - From Address is Invalid - 发送地址无效 - - - - Recipient Address - 接收地址 - - - - is Invalid - 无效 - - - - Amount for address '%1' is invalid! - - - - Amount '%1' is invalid! - 转账金额 '%1' 无效! - - - - MemoDialog - - - - Memo - 备注 - - - - Include Reply Address - 包含回复地址 - - - - MemoEdit - - - Reply to - 回复 - - - - MigrationDialog - - - Migration Turnstile - 迁移旋转门 - - - - Migration History - 迁移历史记录 - - - - Migrated Amount - 已迁移金额 - - - - Unmigrated Amount - 未迁移金额 - - - - Sprout -> Sapling migration enabled - Sprout ->Sapling 启用迁移 - - - - If enabled, zcashd will slowly migrate your Sprout shielded funds to your Sapling address. - 如果启用,zcashd将慢慢将您的Sprout屏蔽资金迁移到您的Sapling地址。 - - - - MigrationTxns - - - Migration Txids - 迁移交易ID - - - - MobileAppConnector - - - Connect Mobile App - 连接手机App - - - - Scan this QRCode from your ZecWallet companion app to connect your phone - 从您的ZecWallet配套应用程序扫描此二维码以连接您的手机 - - - - QR Code - 二维码 - - - - Connection String - 连接字符串 - - - - Allow connections over the internet via ZecWallet wormhole - 允许通过ZecWallet虫洞连接互联网 - - - - ZecWallet Companion App - ZecWallet配套App - - - - Disconnect - 断开连接 - - - - - TextLabel - TextLabel - - - - Last seen: - 上一次连接: - - - - Connection type: - 连接类型: - - - - PrivKey - - Private Key - 私钥 - - - - Private Keys - - - - - QObject - - - Pick - 选择 - - - - Address or Label Error - 地址或标签错误 - - - - Address or Label cannot be empty - 地址或标签不能为空 - - - - Address Format Error - 地址格式错误 - - - - %1 doesn't seem to be a valid Zcash address. - %1 似乎不是有效的Zcash地址。 - - - - Label Error - 标签错误 - - - - The label '%1' already exists. Please remove the existing label. - 标签 '%1' 已存在。 请删除现有标签。 - - - - Import Address Book - 导入地址簿 - - - - Unable to open file - 无法打开文件 - - - - Address Book Import Done - 地址簿导入完成 - - - - Imported %1 new Address book entries - 已导入 %1 个新地址簿条目 - - - - Copy address - 复制地址 - - - - Copied to clipboard - 复制到剪贴板 - - - - Delete label - 删除标签 - - - - Attempting autoconnect - 尝试自动连接 - - - - Starting embedded zcashd - 启动内嵌的zcashd - - - - zcashd is set to run as daemon - zcashd设置为作为守护进程运行 - - - - Waiting for zcashd - 等待zcashd - - - - You have zcashd set to start as a daemon, which can cause problems with ZecWallet - -.Please remove the following line from your zcash.conf and restart ZecWallet -daemon=1 - 你已经将zcashd设置为守护进程启动,这可能会导致ZecWallet出现问题 - -。请从zcash.conf中删除以下行并重新启动ZecWallet -daemon=1 - - - - Couldn't start the embedded zcashd. - -Please try restarting. - -If you previously started zcashd with custom arguments, you might need to reset zcash.conf. - -If all else fails, please run zcashd manually. - 无法启动内嵌的zcashd。 - -请尝试重新启动。 - -如果您之前使用自定义参数启动了zcashd,则可能需要重置zcash.conf。 - -如果所有其他方法都失败了,请手动运行zcashd。 - - - - The process returned - 该进程返回 - - - - Couldn't connect to zcashd configured in zcash.conf. - -Not starting embedded zcashd because --no-embedded was passed - 无法连接到zcash.conf中配置的zcashd。 - -没有启动内嵌的zcashd,因为已经传了--no-embedded参数 - - - - Hide Advanced Config - 隐藏高级配置 - - - - Show Advanced Config - 显示高级配置 - - - - Choose data directory - 选择数据目录 - - - - All Downloads Finished Successfully! - 所有下载成功完成! - - - - Couldn't download params. Please check the help site for more info. - 无法下载params。 请查看帮助网站以获取更多信息。 - - - - - Downloading - 下载 - - - - more remaining ) - 剩余) - - - - MB of - MB of - - - - MB at - MB at - - - - failed. Please check the help site for more info - 失败。 请查看帮助网站以获取更多信息 - - - - zcashd error - zcashd 出错 - - - - A manual connection was requested, but the settings are not configured. - -Please set the host/port and user/password in the Edit->Settings menu. - 请求了手动连接,但未配置设置。 - -请在编辑 - >设置菜单中设置主机/端口和用户/密码。 - - - - Could not connect to zcashd configured in settings. - -Please set the host/port and user/password in the Edit->Settings menu. - 无法连接到设置中配置的zcashd。 - -请在编辑 - >设置菜单中设置主机/端口和用户/密码。 - - - - Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu - 验证失败。 zcashd不接受您指定的用户名/密码。 请在编辑 - >设置菜单中更改它 - - - - Your zcashd is starting up. Please wait. - 你的zcashd正在启动。 请耐心等待。 - - - - This may take several hours - 这可能需要几个小时 - - - - - Connection Error - 连接错误 - - - - - - - Transaction Error - 交易错误 - - - - There was an error sending the transaction. The error was: - 发送交易时出错。 错误是: - - - - - - - Tx - 交易 - - - - - - - failed - 失败 - - - - - - The transaction with id - 交易 - - - - - - failed. The error was - 失败。 错误是 - - - - No ZEC price was available to convert from USD - ZEC的美元价格无法获取 - - - - Computing Recurring Tx: - 计算重复交易: - - - - - View on block explorer - 在区块浏览器查看 - - - - View Error - 查看错误 - - - - Reported Error - 报告错误 - - - - - Are you sure you want to delete the recurring payment? - 您确定要删除定期付款吗? - - - - All future payments will be cancelled. - 所有未来的付款都将被取消。 - - - - - No Connection - 没有连接 - - - - Downloading blocks - 下载区块 - - - - Block height - 区块高度 - - - - Syncing - 同步中 - - - - Connected - 已连接 - - - - testnet: - testnet: - - - - Connected to zcashd - 连接到zcashd - - - - zcashd has no peer connections - zcashd没有节点可连接 - - - - There was an error connecting to zcashd. The error was - 连接到zcashd时出错。 错误是 - - - - tx computing. This can take several minutes. - 交易计算中。 这可能需要几分钟。 - - - - Update Available - 可用更新 - - - - A new release v%1 is available! You have v%2. - -Would you like to visit the releases page? - 新版本 v%1.可用! 你有 v%2. - -您想访问发布页面吗? - - - - No updates available - 没有可用的更新 - - - - You already have the latest release v%1 - 您已拥有最新版本 v%1 - - - - Please wait for ZecWallet to exit - 请等待ZecWallet退出 - - - - Waiting for zcashd to exit - 等待zcashd退出 - - - - Tx submitted (right click to copy) txid: - 交易提交(右键单击复制)交易ID: - - - - Locked funds - 锁定资金 - - - - Could not initiate migration. -You either have unconfirmed funds or the balance is too low for an automatic migration. - 无法启动迁移。 -您要么有未经证实的资金,要么余额太低,无法进行自动迁移。 - - - - - Computing Tx: - 计算交易: - - - - Type - 类型 - - - - Address - 地址 - - - - Date/Time - 日期/时间 - - - - Amount - 金额 - - - - Confirmations - - - - - Connected directly - 直接连接 - - - - Connected over the internet via ZecWallet wormhole service - 通过ZecWallet虫洞服务连接互联网 - - - - Node is still syncing. - 节点仍在同步。 - - - - No sapling or transparent addresses with enough balance to spend. - 没有sapling或透明地址有足够的余额可以花费。 - - - - RecurringDialog - - - Dialog - 对话框 - - - - View - 视图 - - - - Delete - 删除 - - - - RecurringListViewModel - - - Amount - - - - - Schedule - - - - - Payments Left - - - - - Next Payment - - - - - To - - - - - Every - - - - - None - - - - - RecurringPayments - - - Payments - 支付 - - - - RecurringPaymentsListViewModel - - - Date - 日期 - - - - Status - 状态 - - - - Txid - 交易ID - - - - Not due yet - 尚未到期 - - - - Pending - 等待中 - - - - Skipped - 跳过 - - - - Paid - 已支付 - - - - Error - 错误 - - - - - Unknown - 未知状态 - - - - RecurringPending - - - Dialog - 对话框 - - - - No payments will be processed. You can manually pay them from the Recurring Payments Dialog box - 没有付款将被处理。您可以从“定期付款”对话框手动支付 - - - - Schedule - 计划 - - - - How should ZecWallet proceed? - ZecWallet应该如何处理? - - - - Pay All in 1 Tx - 在一个交易中支付全部 - - - - Only the latest pending payment will be processed. All previous pending payments will be skipped - 只会处理最新的待处理付款。 之前的所有待付款都将被跳过 - - - - Pay Latest Only - 仅支付最新费用 - - - - Pay None - 没有支付 - - - - All pending payments collected, added up and paid in a single transaction - 所有待处理的付款都在一次交易中收集,累计和支付 - - - - Description - 描述 - - - - To - 发送到 - - - - The following recurring payment has multiple payments pending - 以下定期付款有多笔待付款 - - - - RequestDialog - - - Payment Request - 付款请求 - - - - AddressBook - 地址簿 - - - - Request From - 请求来自 - - - - My Address - 我的地址 - - - - Amount in - 金额 - - - - z address - z address - - - - Amount - 金额 - - - - The recipient will see this address in the "to" field when they pay your request. - 支付者在付款时会在“接收者”字段中看到此地址。 - - - - Amount USD - 金额 美元 - - - - Memo - 备注 - - - - TextLabel - TextLabel - - - - Request payment from a Sapling address. You'll send a ZEC 0.0001 transaction to the address with a zcash payment URI. The memo will be included in the transaction when the address pays you. - 要求从树苗地址付款。 您将使用zcash支付URI将ZEC 0.0001交易发送到该地址。 当地址付款时,备注将包含在交易中。 - - - - Error paying zcash URI - 支付zcash URI时出错 - - - - URI should be of the form 'zcash:<addr>?amt=x&memo=y - URI的格式应为'zcash:<addr>?amt=x&memo=y‘ - - - - Pay To - 支付给 - - - - Pay - 支付 - - - - You are paying a payment request. Your address will not be visible to the person requesting this payment. - 您正在支付一个付款申请。 请求此付款的人员无法看到您的地址。 - - - - Can only request from Sapling addresses - 只能从Sapling地址请求 - - - - Settings - - - Settings - 设置 - - - - zcashd connection - zcashd连接 - - - - Host - 主机 - - - - Port - 端口 - - - - RPC Username - RPC用户名 - - - - RPC Password - RPC密码 - - - - Options - 选项 - - - - Connect via Tor - 通过Tor连接 - - - - Check github for updates at startup - 启动时检查github更新 - - - - Remember shielded transactions - 记住隐蔽交易 - - - - Normally, change from t-Addresses goes to another t-Address. Checking this option will send the change to your shielded sapling address instead. Check this option to increase your privacy. - 通常,从t-Addresses发送到另一个t-Address。 选中此选项会将更改发送到屏蔽的树苗地址。 选中此选项可增加隐私。 - - - - Allow overriding the default fees when sending transactions. Enabling this option may compromise your privacy since fees are transparent. - 允许在发送交易时覆盖默认费用。由于费用是透明的,因此启用此选项可能会损害您的隐私。 - - - - Clear History - 清空历史屏蔽交易 - - - - Shielded transactions are saved locally and shown in the transactions tab. If you uncheck this, shielded transactions will not appear in the transactions tab. - 屏蔽交易在本地保存并显示在交易“选项”卡中。 如果取消选中此项,屏蔽的交易将不会显示在“交易”选项卡中。 - - - - Allow custom fees - 允许自定义费用 - - - - Shield change from t-Addresses to your sapling address - 屏蔽改变从t-Addresses到您的树苗地址 - - - - Connect to the Tor network via SOCKS proxy running on 127.0.0.1:9050. Please note that you'll have to install and run the Tor service externally. - 通过运行在127.0.0.1:9050上的SOCKS代理连接到Tor网络。 请注意,您必须在外部安装和运行Tor服务。 - - - - Connect to github on startup to check for updates - 在启动时连接到github以检查更新 - - - - Connect to the internet to fetch ZEC prices - 连接到互联网以获取ZEC价格 - - - - Fetch ZEC / USD prices - 获取 ZEC/USD 价格 - - - - Troubleshooting - 故障排除 - - - - Reindex - 重建索引 - - - - Rescan the blockchain for any missing wallet transactions and to correct your wallet balance. This may take several hours. You need to restart ZecWallet for this to take effect - 重新扫描区块链以查找任何丢失的钱包交易并更正您的钱包余额。 这可能需要几个小时。 您需要重新启动ZecWallet才能使其生效 - - - - Rescan - 重新扫描 - - - - Rebuild the entire blockchain from the genesis block, by rescanning all the block files. This may take several hours to days, depending on your hardware. You need to restart ZecWallet for this to take effect - 通过重新扫描所有区块文件,从创世块重建整个区块链。 这可能需要几个小时到几天,具体取决于您的硬件环境。 您需要重新启动ZecWallet才能使其生效 - - - - Turnstile - - - - Turnstile Migration - 十字转门迁移 - - - - Migrate over - 中间地址 - - - - From - - - - - <html><head/><body><p>Funds from Sprout z-Addresses (which start with &quot;zc&quot;) need to be moved to the upgraded Sapling z-Addresses (which start with &quot;zs&quot;). The funds cannot be moved directly, but need to be sent through intermediate &quot;transparent&quot; addresses in privacy-preserving way.</p><p>This migration can be done automatically for you.</p></body></html> - <html><head/><body><p>来自Sprout z-Addresses(以“zc”开头)的资金需要被移动到升级的Sapling z-Addresses(以“zs”开头)。 资金不能直接转移,但需要以隐私保护的方式通过中间透明地址发送。</p><p>此迁移可以自动完成。</p></body></html> - - - - To - 迁移到 - - - - Balance - 余额 - - - - Miner Fees - 矿工费 - - - - Total Balance - 总余额 - - - - TurnstileProgress - - - Turnstile Migration Progress - 十字转门迁移进度 - - - - From - - - - - To - 发送到 - - - - Please ensure you have your wallet.dat backed up! - 请确保你的wallet.dat已经备份! - - - - Next Transaction in 4 hours - 4小时后的下一笔交易 - - - - Migration Progress - 迁移进度 - - - - ValidateAddress - - - Validate Address - - - - - TextLabel - TextLabel - - - - Address: - - - - - ValidateAddressesModel - - - Property - - - - - Value - - - - - ViewAddressesDialog - - - All Addresses - - - - - Export All Keys - - - - - ViewAllAddressesModel - - - Address - 地址 - - - - Balance (%1) - - - - - about - - - About - 关于 - - - - addressBook - - - Address Book - 地址簿 - - - - Add New Address - 添加新地址 - - - - Address (z-Addr or t-Addr) - 地址 (z-Addr or t-Addr) - - - - Label - 标签 - - - - Add to Address Book - 添加到地址薄 - - - - Import Address Book - 导入地址簿 - - - - confirm - - - Confirm Transaction - 确认交易 - - - - From - - - - - To - 发送到 - - - - Recurring Payment - 重复付款 - - - - TextLabel - TextLabel - - - - zcashd doesn't seem to have any peers. You might not be connected to the internet, so this transaction might not work. - zcashd似乎没有任何可连接的节点。 您可能没有连接到互联网,因此此交易可能无效。 - - - - You are sending a transaction while your node is still syncing. This may not work. - 您在节点仍在同步时发送交易, 这可能发送不成功。 - - - - You are using a custom fee. Since fees are transparent, you are giving up some privacy. Please use this only if you know what you are doing! - 您使用的是自定义费用。 由于费用是透明的,您放弃了一些隐私。 只有在你知道自己在做什么的情况下才能使用它! - - - - createZcashConf - - - Configure zcash.conf - 配置 zcash.conf - - - - Your zcash node will be configured for you automatically - 您的zcash节点将自动为您配置 - - - - Enable Fast Sync - 启用快速同步 - - - - Show Advanced Configuration - 显示高级配置 - - - - Allow connections to the internet to check for updates, get ZEC/USD prices etc... - 允许连接到互联网检查更新,获得ZEC/USD价格等… - - - - Use custom datadir - 使用自定义datadir - - - - Choose directory - 选择目录 - - - - Please note that you'll need to already have a Tor service configured on port 9050 - 请注意,您需要在端口9050上已经配置了Tor服务 - - - - Connect to the internet for updates and price feeds - 连接到internet获取更新和价格数据 - - - - Please choose a directory to store your wallet.dat and blockchain - 请选择一个目录来存储您的wallet.dat和区块链数据 - - - - Connect over Tor - 连接到Tor - - - - <html><head/><body><p>Skips the most expensive checks during the initial block download. <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">Learn More</span></a></p></body></html> - <html><head/><body><p>在初始块下载期间跳过了最费时的检查。 <a href="https://docs.zecwallet.co/using-zecwallet/#fastsync"><span style=" text-decoration: underline; color:#0000ff;">了解更多</span></a></p></body></html> - - - - newRecurringDialog - - - Edit Schedule - 编辑计划 - - - - Payment Description - 付款说明 - - - - Schedule - 计划 - - - - Next Payment - 下一次付款 - - - - Amount - 金额 - - - - Memo - 备注 - - - - To - 发送给 - - - - From - - - - - Number of payments - 支付次数 - - - - zboard - - - Post to z-board.net - 发布到z-board.net - - - - Total Fee - 总费用 - - - - Memo - 备注 - - - - (optional) - (可选) - - - - Send From - 发送来自 - - - - Post As: - 发布为: - - - - <html><head/><body><p>ZBoard: Fully anonymous and untraceable chat messages based on the ZCash blockchain. <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - <html><head/><body><p>ZBoard:基于ZCash区块链的完全匿名且无法追踪的聊天消息。 <a href="http://www.z-board.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.z-board.net/</span></a></p></body></html> - - - - Warning - 警告 - - - - Posting to Board - 发布到Board - - - diff --git a/res/zecwallet-lite.xpm b/res/zecwallet-lite.xpm deleted file mode 100644 index 1adb011e..00000000 --- a/res/zecwallet-lite.xpm +++ /dev/null @@ -1,1614 +0,0 @@ -/* XPM */ -static char * zecwallet_xpm[] = { -"512 512 1099 2", -" c None", -". c #676767", -"+ c #666666", -"@ c #686868", -"# c #636363", -"$ c #616060", -"% c #5E5D5D", -"& c #5B5959", -"* c #575555", -"= c #545252", -"- c #524F4F", -"; c #4E4C4C", -"> c #4B4848", -", c #484545", -"' c #464343", -") c #454242", -"! c #494646", -"~ c #4C4A4A", -"{ c #4F4C4C", -"] c #535151", -"^ c #5A5959", -"/ c #605F5F", -"( c #4B4949", -"_ c #423F3F", -": c #403C3C", -"< c #423E3E", -"[ c #676666", -"} c #514F4F", -"| c #434040", -"1 c #4E4B4B", -"2 c #5D5C5C", -"3 c #606060", -"4 c #575656", -"5 c #555353", -"6 c #646464", -"7 c #5B5A5A", -"8 c #585757", -"9 c #4F4D4D", -"0 c #4C4949", -"a c #403D3D", -"b c #636262", -"c c #454141", -"d c #413E3E", -"e c #656464", -"f c #525050", -"g c #585656", -"h c #5A5858", -"i c #626262", -"j c #444040", -"k c #4A4747", -"l c #514D4D", -"m c #585555", -"n c #5E5B5B", -"o c #646262", -"p c #6C6A6A", -"q c #716F6F", -"r c #787777", -"s c #6A6868", -"t c #464242", -"u c #555252", -"v c #5B5858", -"w c #605E5E", -"x c #666464", -"y c #727070", -"z c #7E7D7D", -"A c #848383", -"B c #8D8C8C", -"C c #969696", -"D c #989898", -"E c #818080", -"F c #595858", -"G c #504E4E", -"H c #4D4B4B", -"I c #444141", -"J c #413D3D", -"K c #433F3F", -"L c #8A8989", -"M c #8F8F8F", -"N c #979797", -"O c #898888", -"P c #656565", -"Q c #514E4E", -"R c #474444", -"S c #6F6D6D", -"T c #8F8E8E", -"U c #878686", -"V c #959595", -"W c #626161", -"X c #5C5B5B", -"Y c #565454", -"Z c #4A4848", -"` c #484444", -" . c #4A4646", -".. c #474343", -"+. c #666565", -"@. c #5F5F5F", -"#. c #5D5B5B", -"$. c #565555", -"%. c #969595", -"&. c #504D4D", -"*. c #575454", -"=. c #5D5A5A", -"-. c #807F7F", -";. c #636161", -">. c #535050", -",. c #5D5959", -"'. c #646161", -"). c #6D6B6B", -"!. c #757272", -"~. c #7E7C7C", -"{. c #878585", -"]. c #8F8D8D", -"^. c #534F4F", -"/. c #5F5E5E", -"(. c #595757", -"_. c #9A9A9A", -":. c #9E9E9E", -"<. c #A2A2A2", -"[. c #A6A6A6", -"}. c #AAAAAA", -"|. c #AEAEAE", -"1. c #B0B0B0", -"2. c #B2B2B2", -"3. c #B6B6B6", -"4. c #BBBBBB", -"5. c #BEBEBE", -"6. c #C2C2C2", -"7. c #BCBBBB", -"8. c #C1C0C0", -"9. c #C5C5C5", -"0. c #D2D2D2", -"a. c #D4D4D4", -"b. c #666363", -"c. c #696767", -"d. c #B4B4B4", -"e. c #C6C6C6", -"f. c #CACACA", -"g. c #CECECE", -"h. c #D0D0D0", -"i. c #6F6C6C", -"j. c #A0A0A0", -"k. c #B8B8B8", -"l. c #787575", -"m. c #4D4A4A", -"n. c #A4A4A4", -"o. c #C0C0C0", -"p. c #D3D3D3", -"q. c #807E7E", -"r. c #A8A8A8", -"s. c #C4C4C4", -"t. c #898787", -"u. c #ACACAC", -"v. c #C8C8C8", -"w. c #918F8F", -"x. c #929292", -"y. c #9A9999", -"z. c #9C9C9C", -"A. c #A2A1A1", -"B. c #5C5A5A", -"C. c #555454", -"D. c #7A7979", -"E. c #BCBCBC", -"F. c #ACAAAA", -"G. c #B4B3B3", -"H. c #BDBCBC", -"I. c #696868", -"J. c #6B6A6A", -"K. c #6E6D6D", -"L. c #717171", -"M. c #737373", -"N. c #757575", -"O. c #777777", -"P. c #787878", -"Q. c #7A7A7A", -"R. c #7B7B7B", -"S. c #7C7C7C", -"T. c #7E7E7E", -"U. c #7F7F7F", -"V. c #808080", -"W. c #828282", -"X. c #838383", -"Y. c #848484", -"Z. c #868686", -"`. c #878787", -" + c #888888", -".+ c #898989", -"++ c #8A8A8A", -"@+ c #8B8B8B", -"#+ c #8C8C8C", -"$+ c #939393", -"%+ c #9D9D9D", -"&+ c #A1A1A1", -"*+ c #A9A9A9", -"=+ c #B9B9B9", -"-+ c #646363", -";+ c #6F6F6F", -">+ c #CCCCCC", -",+ c #BFBFBF", -"'+ c #B1B1B1", -")+ c #8E8E8E", -"!+ c #696969", -"~+ c #767676", -"{+ c #B7B7B7", -"]+ c #D7D7D7", -"^+ c #E5E5E5", -"/+ c #E3E3E3", -"(+ c #CBCBCB", -"_+ c #6D6D6D", -":+ c #E2E2E2", -"<+ c #919191", -"[+ c #6B6B6B", -"}+ c #949494", -"|+ c #E4E4E4", -"1+ c #DDDDDD", -"2+ c #B3B3B3", -"3+ c #7D7D7D", -"4+ c #6A6A6A", -"5+ c #D8D8D8", -"6+ c #BEBDBD", -"7+ c #A9A8A8", -"8+ c #B7B6B7", -"9+ c #DFDFDF", -"0+ c #C1C1C1", -"a+ c #9A9898", -"b+ c #373435", -"c+ c #231F20", -"d+ c #2D292A", -"e+ c #817F7F", -"f+ c #E1E1E1", -"g+ c #757373", -"h+ c #545152", -"i+ c #DEDEDE", -"j+ c #D6D6D6", -"k+ c #8D8B8C", -"l+ c #AEADAD", -"m+ c #262223", -"n+ c #797677", -"o+ c #C6C5C5", -"p+ c #2E2A2B", -"q+ c #908E8F", -"r+ c #D9D9D9", -"s+ c #3C393A", -"t+ c #252122", -"u+ c #A7A6A6", -"v+ c #DADADA", -"w+ c #474445", -"x+ c #2A2627", -"y+ c #BBBABA", -"z+ c #909090", -"A+ c #524F50", -"B+ c #2F2B2C", -"C+ c #BDBCBD", -"D+ c #AFAFAF", -"E+ c #625F60", -"F+ c #302C2D", -"G+ c #A3A3A3", -"H+ c #626060", -"I+ c #332F30", -"J+ c #C3C2C3", -"K+ c #DBDBDB", -"L+ c #615E5F", -"M+ c #6E6E6E", -"N+ c #DCDCDC", -"O+ c #5E5C5C", -"P+ c #343031", -"Q+ c #C4C3C3", -"R+ c #BABABA", -"S+ c #999999", -"T+ c #A7A7A7", -"U+ c #484546", -"V+ c #252B2C", -"W+ c #2C2929", -"X+ c #AFAEAE", -"Y+ c #797979", -"Z+ c #3C3839", -"`+ c #293C3D", -" @ c #4DE7E7", -".@ c #2E5354", -"+@ c #9E9C9D", -"@@ c #312D2E", -"#@ c #4CDBDB", -"$@ c #52FFFF", -"%@ c #50F0F0", -"&@ c #2A3F40", -"*@ c #242021", -"=@ c #8A8889", -"-@ c #979596", -";@ c #242122", -">@ c #46BFBF", -",@ c #4FE3E4", -"'@ c #273132", -")@ c #41A2A2", -"!@ c #4CCECE", -"~@ c #242526", -"{@ c #5B5859", -"]@ c #C9C8C9", -"^@ c #494647", -"/@ c #3F9293", -"(@ c #49B7B7", -"_@ c #232021", -":@ c #BFBEBE", -"<@ c #CFCFCF", -"[@ c #3B8282", -"}@ c #48AFAF", -"|@ c #282425", -"1@ c #989697", -"2@ c #C5C4C4", -"3@ c #3A7676", -"4@ c #52FEFE", -"5@ c #47AEAF", -"6@ c #706E6E", -"7@ c #E0E0E0", -"8@ c #D2D1D1", -"9@ c #6B6869", -"0@ c #2B2829", -"a@ c #716E6F", -"b@ c #B0AFB0", -"c@ c #3B7777", -"d@ c #52FCFC", -"e@ c #48A8A8", -"f@ c #CBCACA", -"g@ c #807E7F", -"h@ c #444142", -"i@ c #383535", -"j@ c #686566", -"k@ c #8B898A", -"l@ c #6E6B6C", -"m@ c #408585", -"n@ c #4AA9AA", -"o@ c #888686", -"p@ c #3D3A3B", -"q@ c #3E3B3B", -"r@ c #A6A5A5", -"s@ c #A6A4A5", -"t@ c #363334", -"u@ c #449696", -"v@ c #4CA9AA", -"w@ c #252223", -"x@ c #5F5C5D", -"y@ c #393536", -"z@ c #9D9C9C", -"A@ c #707070", -"B@ c #959393", -"C@ c #464243", -"D@ c #A5A4A4", -"E@ c #565354", -"F@ c #252324", -"G@ c #49A8A8", -"H@ c #4EB9B9", -"I@ c #272728", -"J@ c #AAA8A9", -"K@ c #474344", -"L@ c #595657", -"M@ c #A1A0A0", -"N@ c #262323", -"O@ c #292C2D", -"P@ c #4FC4C4", -"Q@ c #50CFCF", -"R@ c #2C3233", -"S@ c #C7C7C7", -"T@ c #ABAAAB", -"U@ c #423E3F", -"V@ c #363233", -"W@ c #838181", -"X@ c #858384", -"Y@ c #2F3E3E", -"Z@ c #51DBDB", -"`@ c #52E0E0", -" # c #324243", -".# c #797778", -"+# c #4C4849", -"@# c #B5B4B4", -"## c #DCDBDC", -"$# c #322F2F", -"%# c #3A6060", -"&# c #52EEEE", -"*# c #52EBEB", -"=# c #3C5758", -"-# c #353132", -";# c #403C3D", -"># c #818181", -",# c #3B3738", -"'# c #3A3637", -")# c #848282", -"!# c #489495", -"~# c #52F5F5", -"{# c #487777", -"]# c #D1D0D0", -"^# c #4A4748", -"/# c #2D3435", -"(# c #4FC3C3", -"_# c #4FB0B0", -":# c #2C2A2B", -"<# c #413D3E", -"[# c #7F7C7D", -"}# c #787677", -"|# c #3D6565", -"1# c #52E9E9", -"2# c #51D3D3", -"3# c #364344", -"4# c #747273", -"5# c #7C7A7A", -"6# c #555253", -"7# c #848283", -"8# c #B1B0B1", -"9# c #2B2C2D", -"0# c #4DA7A7", -"a# c #52F1F1", -"b# c #447172", -"c# c #605D5E", -"d# c #ACABAB", -"e# c #777575", -"f# c #7A7879", -"g# c #949292", -"h# c #B6B5B6", -"i# c #585556", -"j# c #3C5F60", -"k# c #52E3E3", -"l# c #52FDFD", -"m# c #4FA3A3", -"n# c #2C2C2D", -"o# c #ABA9AA", -"p# c #DDDCDC", -"q# c #CDCDCD", -"r# c #656263", -"s# c #BAB9B9", -"t# c #CCCBCB", -"u# c #A4A2A3", -"v# c #4EAFAF", -"w# c #52DCDC", -"x# c #3F5D5E", -"y# c #272324", -"z# c #767474", -"A# c #292526", -"B# c #4E4B4C", -"C# c #262122", -"D# c #447575", -"E# c #2F3232", -"F# c #5C595A", -"G# c #E2E1E1", -"H# c #9F9D9E", -"I# c #737172", -"J# c #242324", -"K# c #3A5758", -"L# c #51D1D1", -"M# c #52E6E6", -"N# c #436C6C", -"O# c #535051", -"P# c #726F70", -"Q# c #2A4344", -"R# c #4CE1E1", -"S# c #344546", -"T# c #4FBABB", -"U# c #50BABA", -"V# c #374344", -"W# c #272223", -"X# c #9B9B9B", -"Y# c #50DFE0", -"Z# c #3F7A7B", -"`# c #252526", -" $ c #313B3B", -".$ c #4DA9A9", -"+$ c #52FAFA", -"@$ c #4D9D9D", -"#$ c #2E3131", -"$$ c #292627", -"%$ c #425353", -"&$ c #50BEBE", -"*$ c #2C4A4B", -"=$ c #D5D5D5", -"-$ c #52EDED", -";$ c #469899", -">$ c #2C3637", -",$ c #314041", -"'$ c #4CAAAA", -")$ c #52F7F7", -"!$ c #498C8C", -"~$ c #2D2929", -"{$ c #444B4B", -"]$ c #52ACAC", -"^$ c #52F9F9", -"/$ c #2C4C4D", -"($ c #A5A5A5", -"_$ c #2B4243", -":$ c #4DBDBD", -"<$ c #3C6A6A", -"[$ c #262425", -"}$ c #374C4C", -"|$ c #4FB4B4", -"1$ c #52EAEA", -"2$ c #478C8C", -"3$ c #2A2B2C", -"4$ c #353131", -"5$ c #495252", -"6$ c #53A5A5", -"7$ c #53F1F1", -"8$ c #2D4D4D", -"9$ c #4BACAC", -"0$ c #375757", -"a$ c #272425", -"b$ c #3F6A6B", -"c$ c #50C2C3", -"d$ c #52F0F0", -"e$ c #4BA5A5", -"f$ c #303F40", -"g$ c #2A2728", -"h$ c #3D393A", -"i$ c #4F5A5A", -"j$ c #52A8A8", -"k$ c #52F4F4", -"l$ c #52E1E1", -"m$ c #4CA6A6", -"n$ c #3C6364", -"o$ c #272627", -"p$ c #324041", -"q$ c #499696", -"r$ c #52E5E5", -"s$ c #4EBABA", -"t$ c #3A6263", -"u$ c #232121", -"v$ c #272323", -"w$ c #373434", -"x$ c #494546", -"y$ c #537878", -"z$ c #52BFBF", -"A$ c #2D4E4F", -"B$ c #52F3F3", -"C$ c #4FC0C0", -"D$ c #448181", -"E$ c #323D3E", -"F$ c #2F3233", -"G$ c #448081", -"H$ c #50CCCC", -"I$ c #51E7E7", -"J$ c #479C9C", -"K$ c #304C4D", -"L$ c #363333", -"M$ c #525F5F", -"N$ c #539B9B", -"O$ c #53E0E0", -"P$ c #2D4F50", -"Q$ c #52DFDF", -"R$ c #4DB0B0", -"S$ c #457E7E", -"T$ c #364445", -"U$ c #458686", -"V$ c #51C7C7", -"W$ c #52F8F8", -"X$ c #50E4E4", -"Y$ c #46A2A2", -"Z$ c #345F60", -"`$ c #252728", -" % c #2C2728", -".% c #383536", -"+% c #525D5D", -"@% c #529595", -"#% c #52D1D1", -"$% c #2D5051", -"%% c #7F7D7E", -"&% c #51CACA", -"*% c #4CA2A2", -"=% c #447778", -"-% c #3A4E4F", -";% c #2C2B2C", -">% c #303536", -",% c #407070", -"'% c #4CA5A6", -")% c #52D8D8", -"!% c #51F9F9", -"~% c #4DCDCD", -"{% c #429B9C", -"]% c #346A6B", -"^% c #293D3E", -"/% c #4E4E4E", -"(% c #537A7A", -"_% c #53A9A9", -":% c #52D9D9", -"<% c #2D5152", -"[% c #828080", -"}% c #52FBFB", -"|% c #50C4C4", -"1% c #4DA8A8", -"2% c #488F90", -"3% c #427474", -"4% c #3B5959", -"5% c #343F40", -"6% c #252222", -"7% c #353F40", -"8% c #3E6768", -"9% c #499091", -"0% c #4FB8B8", -"a% c #51F3F3", -"b% c #4BCACA", -"c% c #419D9E", -"d% c #346E6E", -"e% c #312E2F", -"f% c #3A3737", -"g% c #505F60", -"h% c #538787", -"i% c #52ADAD", -"j% c #52D3D3", -"k% c #52E4E4", -"l% c #51CBCB", -"m% c #51C2C2", -"n% c #50BCBC", -"o% c #4FB5B5", -"p% c #4EB5B5", -"q% c #4DA8A9", -"r% c #4EA8A8", -"s% c #4FB1B1", -"t% c #50B6B6", -"u% c #51C3C3", -"v% c #52D0D0", -"w% c #50EAEA", -"x% c #4CCFCF", -"y% c #46B3B3", -"z% c #3F9596", -"A% c #387778", -"B% c #315959", -"C% c #293E3F", -"D% c #2B2728", -"E% c #302D2E", -"F% c #3D3D3E", -"G% c #445657", -"H% c #4B7172", -"I% c #518A8B", -"J% c #53A0A0", -"K% c #52BBBB", -"L% c #53D8D8", -"M% c #8E8C8C", -"N% c #2B4142", -"O% c #51F0F0", -"P% c #51E6E6", -"Q% c #50DBDB", -"R% c #51DADA", -"S% c #51D0D0", -"T% c #51CECE", -"U% c #51CFCF", -"V% c #53D6D6", -"W% c #53DCDC", -"X% c #2B4445", -"Y% c #4C494A", -"Z% c #283838", -"`% c #9F9E9E", -" & c #2A4041", -".& c #273233", -"+& c #293B3C", -"@& c #283435", -"#& c #262C2D", -"$& c #50F4F4", -"%& c #6C696A", -"&& c #51FDFD", -"*& c #4FE8E8", -"=& c #50F6F6", -"-& c #51FAFA", -";& c #3FA5A6", -">& c #50F5F5", -",& c #4DDBDC", -"'& c #4EEFEF", -")& c #4FF2F2", -"!& c #4BD0D0", -"~& c #49C3C3", -"{& c #4CE0E0", -"]& c #46B5B6", -"^& c #8C8A8B", -"/& c #4AD9D9", -"(& c #42A8A8", -"_& c #959494", -":& c #48D1D2", -"<& c #3E9A9B", -"[& c #47CACB", -"}& c #398686", -"|& c #5A5758", -"1& c #45C2C3", -"2& c #347272", -"3& c #696667", -"4& c #44BBBC", -"5& c #305E5F", -"6& c #787676", -"7& c #42B3B4", -"8& c #868485", -"9& c #40A6A7", -"0& c #D0CFD0", -"a& c #3C9899", -"b& c #A3A2A2", -"c& c #3A8B8C", -"d& c #367C7D", -"e& c #4EE1E1", -"f& c #346F70", -"g& c #4AC9CA", -"h& c #316061", -"i& c #45AFB0", -"j& c #2E5253", -"k& c #3E9494", -"l& c #36797A", -"m& c #272F30", -"n& c #305C5D", -"o& c #51FBFB", -"p& c #737071", -"q& c #918F90", -"r& c #4EE8E8", -"s& c #46C9CA", -"t& c #45C3C4", -"u& c #44BABA", -"v& c #42B2B2", -"w& c #46C7C7", -"x& c #252A2A", -"y& c #878586", -"z& c #49D4D4", -"A& c #283738", -"B& c #262D2E", -"C& c #51F1F1", -"D& c #9B9A9A", -"E& c #B6B5B5", -"F& c #45C1C1", -"G& c #4DD6D6", -"H& c #41ADAE", -"I& c #47B7B7", -"J& c #CAC9CA", -"K& c #3D9A9A", -"L& c #409697", -"M& c #378283", -"N& c #387374", -"O& c #326969", -"P& c #2E5051", -"Q& c #504D4E", -"R& c #676465", -"S& c #273637", -"T& c #52F2F2", -"U& c #242223", -"V& c #4ED5D5", -"W& c #9C9B9B", -"X& c #4CE4E4", -"Y& c #48B2B2", -"Z& c #47CBCB", -"`& c #408B8B", -" * c #41B0B0", -".* c #356262", -"+* c #3B9192", -"@* c #51F2F2", -"#* c #4FD0D0", -"$* c #49ABAC", -"%* c #49D3D3", -"&* c #345656", -"** c #BCBBBC", -"=* c #42B3B3", -"-* c #357677", -";* c #262829", -">* c #3A9091", -",* c #2B494A", -"'* c #50F7F7", -")* c #50DEDE", -"!* c #336B6B", -"~* c #4CE2E2", -"{* c #4BB4B4", -"]* c #2B4546", -"^* c #428889", -"/* c #3C9798", -"(* c #36595A", -"_* c #4AD8D9", -":* c #316465", -"<* c #282A2B", -"[* c #B0AFAF", -"}* c #4FF0F0", -"|* c #40A8A8", -"1* c #51DEDE", -"2* c #3A8C8C", -"3* c #4DE6E7", -"4* c #263031", -"5* c #4ADADA", -"6* c #4BB1B1", -"7* c #326566", -"8* c #2F5859", -"9* c #43B5B6", -"0* c #417F7F", -"a* c #3B8F8F", -"b* c #39898A", -"c* c #324747", -"d* c #7D7B7B", -"e* c #4EEDED", -"f* c #305A5B", -"g* c #51FCFC", -"h* c #A09F9F", -"i* c #45C0C0", -"j* c #283839", -"k* c #293A3B", -"l* c #4FEDEE", -"m* c #3B9293", -"n* c #336B6C", -"o* c #232323", -"p* c #47CCCC", -"q* c #479495", -"r* c #3EA3A3", -"s* c #3C9494", -"t* c #3A5F5F", -"u* c #D1D1D1", -"v* c #252829", -"w* c #2E5657", -"x* c #4DE9E9", -"y* c #50F8F8", -"z* c #2C4849", -"A* c #262E2F", -"B* c #4CE5E5", -"C* c #50D0D0", -"D* c #377B7C", -"E* c #4A9C9C", -"F* c #ADADAD", -"G* c #44BDBD", -"H* c #378080", -"I* c #3D6161", -"J* c #2E5454", -"K* c #2B4646", -"L* c #2F595A", -"M* c #4BDBDB", -"N* c #51CCCC", -"O* c #6C6C6C", -"P* c #595857", -"Q* c #565554", -"R* c #575554", -"S* c #585756", -"T* c #5E5D5C", -"U* c #3A8F90", -"V* c #40A7A8", -"W* c #4B9899", -"X* c #545251", -"Y* c #52504F", -"Z* c #616160", -"`* c #B2B1B1", -" = c #3C9595", -".= c #336869", -"+= c #3D5E5E", -"@= c #535150", -"#= c #4FF1F1", -"$= c #2B292A", -"%= c #336C6D", -"&= c #50C0C0", -"*= c #5B5A59", -"== c #4AD5D5", -"-= c #3FA5A5", -";= c #468585", -">= c #C3C3C3", -",= c #555352", -"'= c #2E5556", -")= c #364444", -"!= c #305D5E", -"~= c #ABABAB", -"{= c #646261", -"]= c #8C8B8A", -"^= c #C1C0BF", -"/= c #949393", -"(= c #706E6D", -"_= c #252627", -":= c #367D7E", -"<= c #4DA5A5", -"[= c #5B5958", -"}= c #9E9D9C", -"|= c #FFFFFF", -"1= c #EDEDED", -"2= c #B1B0B0", -"3= c #6A6867", -"4= c #44BEBE", -"5= c #377E7E", -"6= c #416667", -"7= c #F3F3F3", -"8= c #FCFCFC", -"9= c #615F5E", -"0= c #388585", -"a= c #263131", -"b= c #2F2E2E", -"c= c #6C6A69", -"d= c #49D7D7", -"e= c #51BDBD", -"f= c #7E7D7C", -"g= c #F5F5F5", -"h= c #FEFEFE", -"i= c #A5A4A3", -"j= c #457C7C", -"k= c #7F7D7D", -"l= c #FAFAF9", -"m= c #41ACAD", -"n= c #48D0D0", -"o= c #326768", -"p= c #343839", -"q= c #6E6C6B", -"r= c #4FEEEE", -"s= c #52CBCB", -"t= c #F6F6F6", -"u= c #346D6E", -"v= c #46C6C6", -"w= c #498C8D", -"x= c #D6D5D5", -"y= c #45BFBF", -"z= c #394747", -"A= c #5E5C5B", -"B= c #848281", -"C= c #ADACAC", -"D= c #367979", -"E= c #4BDEDF", -"F= c #2F5555", -"G= c #D4D3D3", -"H= c #273334", -"I= c #4C9797", -"J= c #E5E4E4", -"K= c #686766", -"L= c #48CFCF", -"M= c #377F7F", -"N= c #3B4D4D", -"O= c #6C6B6A", -"P= c #52D6D6", -"Q= c #969594", -"R= c #4B9595", -"S= c #49D6D6", -"T= c #394949", -"U= c #4F4C4D", -"V= c #908E8E", -"W= c #398A8B", -"X= c #3B9393", -"Y= c #CFCECE", -"Z= c #48D0D1", -"`= c #326667", -" - c #4C9191", -".- c #CDCCCC", -"+- c #FDFDFD", -"@- c #48CDCD", -"#- c #394344", -"$- c #C2C1C1", -"%- c #F2F2F2", -"&- c #346E6F", -"*- c #46C5C5", -"=- c #52C8C8", -"-- c #AAA9A9", -";- c #487E7E", -">- c #8A8988", -",- c #4BDFE0", -"'- c #252A2B", -")- c #333435", -"!- c #605E5D", -"~- c #8D8C8B", -"{- c #999798", -"]- c #357475", -"^- c #4CE3E3", -"/- c #51B5B5", -"(- c #F8F8F8", -"_- c #436768", -":- c #D6D5D6", -"<- c #BDBCBB", -"[- c #40ABAB", -"}- c #2D2A2B", -"|- c #4EEBEB", -"1- c #4E9D9D", -"2- c #828180", -"3- c #305B5B", -"4- c #3B4949", -"5- c #5A5857", -"6- c #3FA1A1", -"7- c #52C6C6", -"8- c #DDDDDC", -"9- c #716F6E", -"0- c #477575", -"a- c #C0BFBF", -"b- c #62605F", -"c- c #F8F7F7", -"d- c #43B7B7", -"e- c #50F4F5", -"f- c #2F2D2E", -"g- c #D7D7D6", -"h- c #EEEEEE", -"i- c #777574", -"j- c #4EA2A2", -"k- c #ACABAA", -"l- c #3FA9A9", -"m- c #3A8D8D", -"n- c #3B494A", -"o- c #6E6D6C", -"p- c #C7C6C6", -"q- c #DEDDDD", -"r- c #868584", -"s- c #398787", -"t- c #52C4C4", -"u- c #A8A7A7", -"v- c #E7E7E7", -"w- c #B8B7B7", -"x- c #7B7978", -"y- c #466D6E", -"z- c #B3B2B2", -"A- c #585655", -"B- c #737170", -"C- c #8C8A8A", -"D- c #797776", -"E- c #5F5D5C", -"F- c #60605F", -"G- c #388182", -"H- c #41B1B1", -"I- c #2E2B2C", -"J- c #357878", -"K- c #4C8F8F", -"L- c #656564", -"M- c #45C4C4", -"N- c #53F3F3", -"O- c #36393A", -"P- c #50ACAC", -"Q- c #3E9FA0", -"R- c #3D4F4F", -"S- c #747474", -"T- c #555453", -"U- c #388384", -"V- c #305F60", -"W- c #52C0C0", -"X- c #25292A", -"Y- c #4ADDDD", -"Z- c #436161", -"`- c #575655", -" ; c #53CDCD", -".; c #626261", -"+; c #5A5958", -"@; c #487172", -"#; c #3E9C9C", -"$; c #3B9696", -"%; c #29393A", -"&; c #52DBDB", -"*; c #2E292A", -"=; c #498080", -"-; c #2E2D2E", -";; c #4B8989", -">; c #367576", -",; c #A5A3A4", -"'; c #4A8888", -"); c #4A8585", -"!; c #468080", -"~; c #52DEDE", -"{; c #4FF3F3", -"]; c #426E6F", -"^; c #434041", -"/; c #4EECEC", -"(; c #3C5657", -"_; c #4FB7B7", -":; c #232020", -"<; c #499F9F", -"[; c #52ECEC", -"}; c #2A2E2F", -"|; c #407778", -"1; c #4FCECE", -"2; c #334B4B", -"3; c #636061", -"4; c #49A1A2", -"5; c #51EAEA", -"6; c #272C2C", -"7; c #3A6F70", -"8; c #3FA2A2", -"9; c #3C9697", -"0; c #3D9D9D", -"a; c #4CC2C2", -"b; c #51F4F4", -"c; c #2A3939", -"d; c #3A7979", -"e; c #4BC6C6", -"f; c #51F5F5", -"g; c #2F5758", -"h; c #3A7A7B", -"i; c #3FA4A4", -"j; c #4AC7C8", -"k; c #4ADCDC", -"l; c #336666", -"m; c #398888", -"n; c #42A5A6", -"o; c #4DDDDD", -"p; c #45B8B8", -"q; c #4CDEDE", -"r; c #4D4A4B", -"s; c #326A6A", -"t; c #6D6A6B", -"u; c #46C5C6", -"v; c #357374", -"w; c #4FEFF0", -"x; c #41AEAF", -"y; c #43B4B5", -"z; c #4AD7D8", -"A; c #48CECE", -"B; c #283536", -"C; c #4DEAEA", -"D; c #2D4E4E", -"E; c #2C4B4C", -"F; c #4DE6E6", -"G; c #2A3F3F", -"H; c #423F40", -"I; c #242425", -"J; c #3E9E9F", -"K; c #BDBDBD", -"L; c #D7D6D6", -"M; c #B5B5B5", -"N; c #3D9D9E", -"O; c #2C4748", -"P; c #41AFAF", -"Q; c #43B9B9", -"R; c #727272", -"S; c #7B7979", -"T; c #388181", -"U; c #B9B8B8", -"V; c #8D8D8D", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" . + + . . . . . . . . . . ", -" . . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % & * = - ; > , , ' ) ) ' ! ~ { ] ^ $ . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # / % & * = - { ( , ) _ : : : : : : : : : : : : : : : : : : : : : : < ! ] % . . . . . . . . . . . . . . . . . . . ", -" + . . . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ # / % ^ * = } { ( , ) _ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : | 1 2 . . . . . . . . . . . . . . . . . + ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ # 3 2 ^ 4 = } { ( , ) _ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ) 5 # . . . . . . . . . . . . . . . . ", -" @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 $ % 7 8 * = 9 0 ! ' | a : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : a 9 b . . . . . . . . . . . . . . + ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + b 3 2 ^ 4 = } 1 > , c < : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : d } e . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 $ % 7 8 * f ; 0 ! ' | : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : _ g . . . . . . . . . . . . . . ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + b / 2 h * = } ; > , ) < : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : > i . . . . . . . . . . . . . ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % 7 8 * f ; 0 ! ' | : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : j k l m n o p q r s : : : : : : : : : : : : : : < ^ . . . . . . . . . . . . . ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % 7 8 * f ; 0 ! ' | : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : t { u v w x p y r z A B C D D D D D D D D D E : : : : : : : : : : : : : : : : 9 + . . . . . . . . . . . . ", -" . . . . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # / 2 F * = G H > , I J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u n x p y r z A L M N D D D D D D D D D D D D D D D D D D D D D D O : : : : : : : : : : : : : : : : : ! e . . . . . . . . . . . . ", -" . . . . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P # / 2 F * = Q H > R I J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x S r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D T : : : : : : : : : : : : : : : : : : R # . . . . . . . . . . . . ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % 7 8 5 } ; 0 ! ' | : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : t { u v w x p y r z U M C D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D V : : : : : : : : : : : : : : : : : : : c W . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P i / X F Y = Q 1 Z ` c d : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { m w x p y r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D K : : : : : : : : : : : : : : : : : : : c i . . . . . . . . . . . ", -" @ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % 7 8 5 } ; 0 ! ' | : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x S r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D .: : : : : : : : : : : : : : : : : : : : ..e . . . . . . . . . . . ", -" + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +.i @.#.F $.] } 1 > R c < : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x p y r z U M %.D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D &.: : : : : : : : : : : : : : : : : : : : : ! + . . . . . . . . . . ", -" + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +.b @.#.h $.] } 1 k R j < : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { m w x p y r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D *.: : : : : : : : : : : : : : : : : : : : : : H . . . . . . . . . . . ", -" @ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % 7 8 5 } ; 0 ! ' < : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x S r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D =.: : : : : : : : : : : : : : : : : : : : : : : g . . . . . . . . . . . ", -" . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % 7 g = } ; 0 ! ' < : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x p y r -.L M %.D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D ;.: : : J .>.,.'.).!.~.{.].^.: : : : : : : : : d 3 . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + W /.X (.* ] G H k R I J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { m w x p y r z A L M D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.}.|.1.2.3.4.5.6.7.7.8.9.0.a.a.a.a.a.a.a.a.a.b.: : : : : : : : : : R + . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P W /.X (.* ] G H k R I J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w c.y r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.}.|.2.d.3.4.5.6.e.f.g.h.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.: : : : : : : : : : : = . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P W /.X (.Y ] G H k R I J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x p y r -.L M %.D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.j.<.[.}.|.2.3.k.4.5.6.e.f.g.0.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.l.: : : : : : : : : : : d b . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P i /.X F Y ] G m.k R | J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , Q v w x p y r z A L M D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.n.[.}.|.2.3.4.5.o.6.e.f.g.p.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.q.: : : : : : : : : : : : H . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P i /.X F Y ] &.m.k ..| J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w c.y r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.r.}.|.2.3.4.5.6.s.e.f.g.p.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.t.: : : : : : : : : : : : : % . . . . . . . . . . ", -" + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P i /.X F Y ] &.m.k ..| a : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x p y r -.L M %.D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.}.u.|.2.3.4.5.6.e.v.f.g.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.: : : : : : : : : : : : : > . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % ^ * = } ; 0 ! ) J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , Q v w x p y r z A L x.D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.}.|.2.d.3.4.5.6.e.f.g.h.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.y.: : : : : : : : : : : : : : @.. . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # $ % ^ * = } ; 0 ! ) J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w c.y r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.z.:.<.[.}.|.2.3.k.4.5.6.e.f.g.0.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.A.: : : : : : : : : : : : : : ; . . . . . . . . . + ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . e W /.B.8 C.] G ~ ! R j J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v w x p y D.A L M C D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.j.<.[.}.|.2.3.4.E.5.6.e.f.g.0.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.F.: : : : : : : : : : : : : : J # . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . 3 8 ] { ! j J : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , Q v w x p y r z A L x.D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.r.}.|.2.3.4.5.o.6.e.f.g.p.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.G.: : : : : : : : : : : : : : : C.. . . . . . . . . @ ", -" . . . . . . . . . . . . . . . . . . . $ C.0 | : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : K , { u v ;.p y r z A L M N D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D _.:.<.[.}.u.|.2.3.4.5.6.e.v.f.g.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.H.: : : : : : : : : : : : : : : , . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . W 5 R : : : : : d ` H } f 5 * 8 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 7 2 /.$ b e [ I.J.K.L.M.N.O.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.Q.R.S.T.U.V.V.W.X.Y.Z.`. +.+++@+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+$+D %+&+*+3.=+a : : : : : : : : : : : : : : : $ . . . . . . . . . ", -" + . . . . . . . . . . . . . . . 2 > : : : _ m.Y 2 b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + / ^ ] , J : : : : : : : : : : 5 . . . . . . . . . ", -" . . . . . . . . . . . . . . + F ` : J > Y @.+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 7 - ' : : : : : : : k . . . . . . . . . . ", -" . . . . . . . . . . . . . . % , : ' 5 -+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $ f | : : : : J + . . . . . . . . . ", -" . . . . . . . . . . . . . b 1 < } $ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . [ 7 Z : : : /.. . . . . . . . . ", -" . . . . . . . . . . . . . ^ ) f e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / ; a C.. . . . . . . . . ", -" . . . . . . . . . . . . +.} C.P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 * . . . . . . . . . ", -" . . . . . . . . . . . . W >.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . / /.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . W . . . . . . . . . . . . . . . . . . . . . ;+W.C r.d.4.6.v.>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+9.,+=+'+&+)+Q.!+. . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . 6 . . . . . . . . . . . . . . . . . . ~+C {+]+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+(+}.++_+. . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . + . . . . . . . . . . . . . . . . ~+n.0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+o.<+[+. . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . !+}+9.|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+2+3+. . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . 4+V 0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+,+W.. . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . @ N 5+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+6+7+8+9+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0+R.. . . . . . . . . . . . . . . ", -" + . . . . . . . . . . . . . . . . . . . . . . 3+v.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a+b+c+c+c+d+e+f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+*+_+. . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . 4+u./+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+g+c+c+c+c+c+c+c+h+i+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+j+++. . . . . . . . . . . . . + ", -" . . . . . . . . . . . . . . . . . . . . . ~+f.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+k+c+c+c+c+c+c+c+c+c+=.:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+|.!+. . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . M 1+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+l+m+c+c+c+c+c+c+c+c+c+c+n+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+(+O.. . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . [.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o+p+c+c+c+c+c+c+c+c+c+c+c+c+q+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+r+U.. . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . @ |.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+p.s+c+c+c+c+c+c+c+c+c+c+c+c+c+t+u+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9+.+. . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . 4+4.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+w+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+x+y+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+z+. . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . @ {+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+A+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B+C+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+#+. . . . . . . . . . . + ", -" . . . . . . . . . . . . . . . . . . D+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+E+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+F+6+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9+W.. . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . G+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+H+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+I+J+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+R.. . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . #+|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+L+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+I+J+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+p.M+. . . . . . . . . . ", -" . . . . . . . . . . . . . . . . N.N+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+O+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+P+Q+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+R+. . . . . . . . . . . ", -" . . . . . . . . . . . . . . . !+v.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+*.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+P+6+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+S+. . . . . . . . . . . ", -" . . . . . . . . . . . . . . . T+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0.U+c+c+c+c+c+c+c+c+c+c+c+c+c+c+V+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W+X+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+Y+. . . . . . . . . . ", -" . . . . . . . . . . . . . . Y+f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o+Z+c+c+c+c+c+c+c+c+c+c+c+c+c+c+`+ @.@c+c+c+c+c+c+c+c+c+c+c+c+c+c+m++@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+6.. . . . . . . . . . . ", -" . . . . . . . . . . . . . . . o.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G.@@c+c+c+c+c+c+c+c+c+c+c+c+c+c+V+#@$@%@&@c+c+c+c+c+c+c+c+c+c+c+c+c+c+*@=@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+z+. . . . . . . . . . ", -" . . . . . . . . . . . . . . x.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+-@m+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@>@$@$@$@,@'@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+g+/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]+_+. . . . . . . . . . ", -" . . . . . . . . . . . . . !+a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+c.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+)@$@$@$@$@$@!@~@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+{@]+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G+. . . . . . . . . . ", -" . . . . . . . . . . . . . }+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]@^@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+/@$@$@$@$@$@$@$@(@_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+s+:@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+_+. . . . . . . . . + ", -" . . . . . . . . . . . . @ <@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^++@W+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+[@$@$@$@$@$@$@$@$@$@}@_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+|@1@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:.. . . . . . . . . + ", -" + . . . . . . . . . . . . )+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9+Q+2@f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+c.c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+3@4@$@$@$@$@$@$@$@$@$@$@5@_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+6@7@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+5+4+. . . . . . . . . ", -" + . . . . . . . . . . . . o.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+8@9@x+c+c+0@a@0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+b@Z+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c@d@$@$@$@$@$@$@$@$@$@$@$@$@e@_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+0 f@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a.g@h@p+i@j@C+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+)+. . . . . . . . . . ", -" + . . . . . . . . . . . M./+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+J+P+c+c+c+c+c+c+d+k@f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+r+l@*@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m@4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@n@*@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W+a+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+o@d+c+c+c+c+c+m+O ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+E.. . . . . . . . . . ", -" . . . . . . . . . . . . :.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+p@c+c+c+c+c+c+c+c+c+q@r@|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+s@t@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+u@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@v@w@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+x@0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/++@y@c+c+c+c+c+c+c+c+c+z@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+A@. . . . . . . . . ", -" . . . . . . . . . . . . >+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+B@c+c+c+c+c+c+c+c+c+c+c+c+C@D@/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Q+E@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+F@G@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@H@I@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+F+y.|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+J@K@c+c+c+c+c+c+c+c+c+c+c+P+i+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+_.. . . . . . . . . . ", -" + . . . . . . . . . . M.|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+L@c+c+c+c+c+c+c+c+c+c+c+c+c+c+) M@f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]+n+N@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+O@P@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Q@R@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+h+S@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+l+0 c+c+c+c+c+c+c+c+c+c+c+c+c+c+T@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+5.. . . . . . . . . . ", -" . . . . . . . . . . . }+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+U@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+V@W@8@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+X@p+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+Y@Z@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@`@ #c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m+.#v+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+D@+#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+k@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+!+. . . . . . . . . ", -" + . . . . . . . . . . 2+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+s+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m+;.@#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+##k+$#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+%#&#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@*#=#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+-#%.:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9+1@;#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+>#. . . . . . . . . ", -" . . . . . . . . . . . a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+'#~.S@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a.)#@@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+w@!#d@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@~#{#m+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+,#-@:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]#)#I+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+e+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<.. . . . . . . . . ", -" . . . . . . . . . . ;+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+^#o@2@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+C+S |@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+/#(#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@_#:#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+<#1@7@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+u+=.t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+[#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+4.. . . . . . . . . . ", -" . . . . . . . . . . W.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+'#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+<#}#l+1+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+r+B@w+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+|#1#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@2#3#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+V@o@0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+y+4#@@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+5#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<@. . . . . . . . . . ", -" . . . . . . . . . . V ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+'#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+|@6#7#8#K+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v++@#.|@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+9#0#4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a#b#t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+N@c#d#:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+@#e#'#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+f#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+@ . . . . . . . . . ", -" . . . . . . . . . . r.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+y@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m+w+q g#h#r+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+C+k@i#|@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+j#k#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l#m#n#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+F+9@o#p#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q#a+r#$#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+n+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O.. . . . . . . . . ", -" + . . . . . . . . . =+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+,#6#S t.A.s#t###^+^+^+^+^+^+^+^+^+^+^+^+^+i+2@u#~.i#F+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+/#v#l#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@w#x#*@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+y#- 7#l+a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+6+g#c.p@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+z#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+`.. . . . . . . . . ", -" . . . . . . . . . . 0+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+b+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A#i@w+B#*.L@;.;.;.O+*.^@I+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+C#D#*#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@_#E#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+b+F#f#%.8#f@1+^+^+^+^+^+^+^+^+^+^+^+^+^+G#q#8+H#X@o h@m+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+I#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+)+. . . . . . . . . ", -" . . . . . . . . . . S@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+t@c+c+c+c+c+c+c+c+c+~@J#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+K#L#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M#N#t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+0@p@^#O#*.H+;.#.*.*.> p@@@*@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+P#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V . . . . . . . . . ", -" . . . . . . . . . . q#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V@c+c+c+c+c+c+c+c+c+Q#R#3@;@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+S#T#4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@U#V#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W#c+c+c+c+c+c+c+c+c+c+c+I#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+X#. . . . . . . . . ", -" . . . . . . . . . . p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V@c+c+c+c+c+c+c+c+c+Q#$@$@Y#Z#`#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ $.$+$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@~#@$#$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+$$%$&$*$c+c+c+c+c+c+c+c+c+c+g+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G+. . . . . . . . . ", -" . . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+-#c+c+c+c+c+c+c+c+c+Q#$@$@$@$@-$;$>$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+,$'$)$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@*#!$n#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+~${$]$^$$@/$c+c+c+c+c+c+c+c+c+c+e#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+-#c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@^$:$<$[$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+*@}$|$+$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@1$2$3$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+t+4$5$6$7$$@$@$@8$c+c+c+c+c+c+c+c+c+c+n+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" . . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+P+c+c+c+c+c+c+c+c+c+Q#$@$@$@$@$@$@$@$@$@ $0$t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a$b$c$l#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d$e$f$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+g$h$i$j$k$$@$@$@$@$@8$c+c+c+c+c+c+c+c+c+c+.#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+I+c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@l$m$n$o$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+p$q$r$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@+$s$t$u$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+v$w$x$y$z$+$$@$@$@$@$@$@$@A$c+c+c+c+c+c+c+c+c+c+5#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+I+c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B$C$D$E$t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+F$G$H$l#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@I$J$K$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+y#L$t M$N$O$$@$@$@$@$@$@$@$@$@$@P$c+c+c+c+c+c+c+c+c+c+~.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+t@c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@Q$R$S$T$y#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+*@E$U$V$W$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@X$Y$Z$`$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ %.%, +%@%#%l#$@$@$@$@$@$@$@$@$@$@$@$@$%c+c+c+c+c+c+c+c+c+c+%%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Z+c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&#&%*%=%-%;%t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+t+>%,%'%)%4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!%~%{%]%^%c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+x+-#U@/%(%_%:%l#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@<%c+c+c+c+c+c+c+c+c+c+[%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+;#c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}%l$|%1%2%3%4%5%d+A#6%c+c+c+c+c+c+c+c+c+c+c+c+y#~$7%8%9%0%w#d@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a%b%c%d%Q#~@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A#e%f%c g%h%i%j%)$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$%c+c+c+c+c+c+c+c+c+c+o@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+) c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@a#k%)%l%m%n%o%p%q%r%s%t%u%v%k%^$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@w%x%y%z%A%B%C%V+c+c+c+c+c+c+c+c+c+*@y#D%E%L$F%G%H%I%J%K%L%k$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@*$c+c+c+c+c+c+c+c+c+c+M%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^@c+c+c+c+c+c+c+c+c+N%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l#O%P%Q%R%S%T%U%v%V%W%k%-$)$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@X%c+c+c+c+c+c+c+c+c+c+g#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Y%c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@C%c+c+c+c+c+c+c+c+c+c+a+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+- c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Z%c+c+c+c+c+c+c+c+c+c+`%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+E@c+c+c+c+c+c+c+c+c+ &$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@.&c+c+c+c+c+c+c+c+c+c+s@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+{@c+c+c+c+c+c+c+c+c++&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@V+c+c+c+c+c+c+c+c+c+c+T@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+x@c+c+c+c+c+c+c+c+c+@&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@~@c+c+c+c+c+c+c+c+c+c+8#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+H+c+c+c+c+c+c+c+c+c+#&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@_@c+c+c+c+c+c+c+c+c+c+y+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+j@c+c+c+c+c+c+c+c+c+~@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$&c+c+c+c+c+c+c+c+c+c+c+Q+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+%&c+c+c+c+c+c+c+c+c+c+&&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@*&c+c+c+c+c+c+c+c+c+c+c+<@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q c+c+c+c+c+c+c+c+c+c+=&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@-&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&;&>&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@,&c+c+c+c+c+c+c+c+c+c+c+r+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+g+c+c+c+c+c+c+c+c+c+c+'&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!&c+c+c+c+c+c+c+c+c+c+c+G#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+.#c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@~&c+c+c+c+c+c+c+c+c+c+D%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[%c+c+c+c+c+c+c+c+c+c+{&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@]&c+c+c+c+c+c+c+c+c+c+-#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^&c+c+c+c+c+c+c+c+c+c+/&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@(&c+c+c+c+c+c+c+c+c+c+q@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+_&c+c+c+c+c+c+c+c+c+c+:&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@<&c+c+c+c+c+c+c+c+c+c+^#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^++@c+c+c+c+c+c+c+c+c+c+[&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}&c+c+c+c+c+c+c+c+c+c+|&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+u+c+c+c+c+c+c+c+c+c+c+1&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@2&c+c+c+c+c+c+c+c+c+c+3&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+b@c+c+c+c+c+c+c+c+c+c+4&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@5&c+c+c+c+c+c+c+c+c+c+6&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+y+c+c+c+c+c+c+c+c+c+c+7&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@/$c+c+c+c+c+c+c+c+c+c+8&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+J+c+c+c+c+c+c+c+c+c+c+9&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Z%c+c+c+c+c+c+c+c+c+c+g#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0&c+c+c+c+c+c+c+c+c+c+a&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@~@c+c+c+c+c+c+c+c+c+c+b&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+c+c+c+c+c+c+c+c+c+c+c&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a%c+c+c+c+c+c+c+c+c+c+c+8#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+x+c+c+c+c+c+c+c+c+c+d&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@e&c+c+c+c+c+c+c+c+c+c+c+8.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+b+c+c+c+c+c+c+c+c+c+f&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@g&c+c+c+c+c+c+c+c+c+c+c+p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+C@c+c+c+c+c+c+c+c+c+h&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@i&c+c+c+c+c+c+c+c+c+c+N@/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O#c+c+c+c+c+c+c+c+c+j&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@k&c+c+c+c+c+c+c+c+c+c+y@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+E+c+c+c+c+c+c+c+c+c+_$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l&c+c+c+c+c+c+c+c+c+c+Y%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+6@c+c+c+c+c+c+c+c+c+m&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@n&c+c+c+c+c+c+c+c+c+c+c#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+%%c+c+c+c+c+c+c+c+c+_@o&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Q#c+c+c+c+c+c+c+c+c+c+p&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q&c+c+c+c+c+c+c+c+c+c+r&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@s&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&u&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+v&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&w&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@x&c+c+c+c+c+c+c+c+c+c+y&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+u#c+c+c+c+c+c+c+c+c+c+z&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@C&c+c+c+c+c+c+c+c+c+c+c+D&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+E&c+c+c+c+c+c+c+c+c+c+F&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@G&c+c+c+c+c+c+c+c+c+c+c+b@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v.c+c+c+c+c+c+c+c+c+c+H&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@I&c+c+c+c+c+c+c+c+c+c+c+J&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+c+c+c+c+c+c+c+c+c+c+K&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@L&c+c+c+c+c+c+c+c+c+c+t+7@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0@c+c+c+c+c+c+c+c+c+M&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@N&c+c+c+c+c+c+c+c+c+c+y@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+p@c+c+c+c+c+c+c+c+c+O&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@P&c+c+c+c+c+c+c+c+c+c+- ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Q&c+c+c+c+c+c+c+c+c+P$$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@m&c+c+c+c+c+c+c+c+c+c+s ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+R&c+c+c+c+c+c+c+c+c+S&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@T&c+c+c+c+c+c+c+c+c+c+c+W@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[#c+c+c+c+c+c+c+c+c+U&o&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@V&c+c+c+c+c+c+c+c+c+c+c+W&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+%.c+c+c+c+c+c+c+c+c+c+X&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Y&c+c+c+c+c+c+c+c+c+c+c+@#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+l+c+c+c+c+c+c+c+c+c+c+Z&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@`&c+c+c+c+c+c+c+c+c+c+c+0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o+c+c+c+c+c+c+c+c+c+c+ *$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@.*c+c+c+c+c+c+c+c+c+c+p+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+*@c+c+c+c+c+c+c+c+c++*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c++#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+P+c+c+c+c+c+c+c+c+c+2&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@*c+c+c+c+c+c+c+c+c+c+c+s ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0 c+c+c+c+c+c+c+c+c+j&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@#*c+c+c+c+c+c+c+c+c+c+c+o@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+r#c+c+c+c+c+c+c+c+c+.&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$*c+c+c+c+c+c+c+c+c+c+c+s@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[%c+c+c+c+c+c+c+c+c+c+)&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@m@c+c+c+c+c+c+c+c+c+c+c+J+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+`%c+c+c+c+c+c+c+c+c+c+%*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&*c+c+c+c+c+c+c+c+c+c+m+9+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+**c+c+c+c+c+c+c+c+c+c+=*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+-*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@;*c+c+c+c+c+c+c+c+c+c+U@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+c+c+c+c+c+c+c+c+c+c+>*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+,*'*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)*c+c+c+c+c+c+c+c+c+c+c+r#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V@c+c+c+c+c+c+c+c+c+!*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m&~*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@{*c+c+c+c+c+c+c+c+c+c+c+t.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O#c+c+c+c+c+c+c+c+c+]*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@F&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@^*c+c+c+c+c+c+c+c+c+c+c+d#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q c+c+c+c+c+c+c+c+c+J#-&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+/*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@(*c+c+c+c+c+c+c+c+c+c+c+]#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+].c+c+c+c+c+c+c+c+c+c+_*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+:*4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l#<*c+c+c+c+c+c+c+c+c+c+@@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[*c+c+c+c+c+c+c+c+c+c+v&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*}*|*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+Q#$&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@1*c+c+c+c+c+c+c+c+c+c+c+6#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+5+f.,+4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.f.]+n.. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a.c+c+c+c+c+c+c+c+c+c+2*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@3*4*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+x&5*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@6*c+c+c+c+c+c+c+c+c+c+c+}#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+k.<+M.@ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V@c+c+c+c+c+c+c+c+c+7*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&&8*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+_@9*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@0*c+c+c+c+c+c+c+c+c+c+c+H#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0+.+!+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+L@c+c+c+c+c+c+c+c+c++&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+b*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@c*c+c+c+c+c+c+c+c+c+c+c+v.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+(+`.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+d*c+c+c+c+c+c+c+c+c+c+e*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@s&U&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+f*g*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d$*@c+c+c+c+c+c+c+c+c+c+B+|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9+V @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+h*c+c+c+c+c+c+c+c+c+c+i*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@'&j*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+k*l*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@P@c+c+c+c+c+c+c+c+c+c+c+i#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+5+>#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Q+c+c+c+c+c+c+c+c+c+c+m*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@n*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+o*p*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@q*c+c+c+c+c+c+c+c+c+c+c+g@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v.M.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G#A#c+c+c+c+c+c+c+c+c+7*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@r*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+s*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@t*c+c+c+c+c+c+c+c+c+c+c+J@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+u*M+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+> c+c+c+c+c+c+c+c+c+A&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@/&v*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+w*g*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@^$3$c+c+c+c+c+c+c+c+c+c+c+0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+N+P.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+4#c+c+c+c+c+c+c+c+c+c+x*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y*z*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A*B*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@C*c+c+c+c+c+c+c+c+c+c+c+,#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+`.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+H#c+c+c+c+c+c+c+c+c+c+4&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@D*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+_@u&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@E*c+c+c+c+c+c+c+c+c+c+c+r#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+F*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+J&c+c+c+c+c+c+c+c+c+c+b*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@G*_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+H*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@I*c+c+c+c+c+c+c+c+c+c+c+g#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+L.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+I+c+c+c+c+c+c+c+c+c+J*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@3*4*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+K*'*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)$:#c+c+c+c+c+c+c+c+c+c+c+J+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+=.c+c+c+c+c+c+c+c+c+~@y*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&&L*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+v*M*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@N*c+c+c+c+c+c+c+c+c+c+c+@@/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+O*. . . . . . . . . . . . . . . + % P*Q*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*R*Q*S*T*[ . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o@c+c+c+c+c+c+c+c+c+c+[&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@U*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+V*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@W*c+c+c+c+c+c+c+c+c+c+c+O+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+4.. . . . . . . . . . . . . . . b X*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*= Z*. . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+`*c+c+c+c+c+c+c+c+c+c+ =$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@[&o*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+.=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@+=c+c+c+c+c+c+c+c+c+c+c+M%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+}+. . . . . . . . . . . . . . W @=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*$ . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+m+c+c+c+c+c+c+c+c+c+h&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@#=+&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+j*'&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B$$=c+c+c+c+c+c+c+c+c+c+c+**^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+;+. . . . . . . . . . . . . + X*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*@=P . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+w+c+c+c+c+c+c+c+c+c+#&g*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@%=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+o*Z&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&=c+c+c+c+c+c+c+c+c+c+c+W+G#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<@. . . . . . . . . . . . . . X Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y**=. . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+}#c+c+c+c+c+c+c+c+c+c+==$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@-=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@;=c+c+c+c+c+c+c+c+c+c+c+L@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+>=. . . . . . . . . . . . . . ,=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*X*. . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o#c+c+c+c+c+c+c+c+c+c+K&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@5*v*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+'=g*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@)=c+c+c+c+c+c+c+c+c+c+c+M%^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+{+. . . . . . . . . . . . . 6 Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*-+. . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+N@c+c+c+c+c+c+c+c+c+!=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!%z*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A*B*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@w#y#c+c+c+c+c+c+c+c+c+c+c+6.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+~=. . . . . . . . . . . . . b Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*{=]=u+s#^=s#X+/=(=@=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*$ . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Y%c+c+c+c+c+c+c+c+c+_='*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@:=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+u&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@<=c+c+c+c+c+c+c+c+c+c+c+V@|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*[=}=i+|=|=|=|=|=|=|=|=|=1=2=3=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+%%c+c+c+c+c+c+c+c+c+c+1&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4=_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+5=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@6=c+c+c+c+c+c+c+c+c+c+c+s ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*,=M@7=|=|=|=|=|=|=|=|=|=|=|=|=|=8=H.9=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+8#c+c+c+c+c+c+c+c+c+c+0=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ @a=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+]*'*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B$b=c+c+c+c+c+c+c+c+c+c+c+H#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*c=i+|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=7=o@Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+|@c+c+c+c+c+c+c+c+c+z*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&&L*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+_=d=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@e=*@c+c+c+c+c+c+c+c+c+c+*@0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*f=g=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=h=i=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O#c+c+c+c+c+c+c+c+c+_@x*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@+*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+-=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@j=c+c+c+c+c+c+c+c+c+c+c+w+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*k=l=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=i=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o@c+c+c+c+c+c+c+c+c+c+m=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@n=J#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+o=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@+$p=c+c+c+c+c+c+c+c+c+c+c+5#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*q=g=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=h=o@Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0+c+c+c+c+c+c+c+c+c+c+O&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@#=+&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+Z%r=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@s=6%c+c+c+c+c+c+c+c+c+c+c+h#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*R*7@|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=t=).Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,#c+c+c+c+c+c+c+c+c+x&y*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@u=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@v=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@w=c+c+c+c+c+c+c+c+c+c+c+e%G#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*D@|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=x=@=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+p&c+c+c+c+c+c+c+c+c+c+y=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@9&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+U*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@z=c+c+c+c+c+c+c+c+c+c+c+%&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*A=t=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=B=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+C=c+c+c+c+c+c+c+c+c+c+D=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@E=x&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+F=g*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)%|@c+c+c+c+c+c+c+c+c+c+c+u+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*b&|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=G=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+D%c+c+c+c+c+c+c+c+c+H=&&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!%,*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&X&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@I=c+c+c+c+c+c+c+c+c+c+c+A###^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*J=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=h=K=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O+c+c+c+c+c+c+c+c+c+c+L=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+=*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@N=c+c+c+c+c+c+c+c+c+c+c+F#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*O=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=D&Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+-@c+c+c+c+c+c+c+c+c+c+b*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y=_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+D*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@P=|@c+c+c+c+c+c+c+c+c+c+c+-@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Q=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=o+Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+8@*@c+c+c+c+c+c+c+c+c+Q#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ @a=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+X%=&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@R=c+c+c+c+c+c+c+c+c+c+c+*@8@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*`*|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=G#Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+Y%c+c+c+c+c+c+c+c+c+c+_*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&&f*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+_=S=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@T=c+c+c+c+c+c+c+c+c+c+c+U=^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*o+|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=t=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V=c+c+c+c+c+c+c+c+c+c+W=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@X=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+r*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@j%|@c+c+c+c+c+c+c+c+c+c+c+q&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=h=@=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+8@t+c+c+c+c+c+c+c+c+c+`+4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Z=J#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+`=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ -c+c+c+c+c+c+c+c+c+c+c+t+]#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*.-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=+-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+- c+c+c+c+c+c+c+c+c+c+@-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&`+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+Z%r=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@#-c+c+c+c+c+c+c+c+c+c+c+O#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*$-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=%-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+g#c+c+c+c+c+c+c+c+c+c+M=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@*-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@=-v$c+c+c+c+c+c+c+c+c+c+c+g#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*--|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=v+Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+=$N@c+c+c+c+c+c+c+c+c+.&}%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@|*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@;-c+c+c+c+c+c+c+c+c+c+c+t+0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*>-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=s#Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+*.c+c+c+c+c+c+c+c+c+c+1&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@,-'-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+J*}%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B$)-c+c+c+c+c+c+c+c+c+c+c+E@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*!-h=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=~-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+{-c+c+c+c+c+c+c+c+c+c+]-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!%*$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&^-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@/-*@c+c+c+c+c+c+c+c+c+c+c+-@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*8@|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=(-[=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]+m+c+c+c+c+c+c+c+c+c+V+>&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@H*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+v&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@_-c+c+c+c+c+c+c+c+c+c+c+y#:-^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*~-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=<-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+x@c+c+c+c+c+c+c+c+c+c+[-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y=_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+l&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M#}-c+c+c+c+c+c+c+c+c+c+c+L+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*X*^+|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=8=c=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+J@c+c+c+c+c+c+c+c+c+c+J*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@|-H=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+X%=&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@1-c+c+c+c+c+c+c+c+c+c+c+c+J@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*2-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=`*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G#V@c+c+c+c+c+c+c+c+c+c+M*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&&3-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+~@S=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@4-c+c+c+c+c+c+c+c+c+c+c+I+:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*6+|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=J=5-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[#c+c+c+c+c+c+c+c+c+c+}&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@s*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+6-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@7-y#c+c+c+c+c+c+c+c+c+c+c+n+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*P*8-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=g=9-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]@*@c+c+c+c+c+c+c+c+c+.&o&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Z=J#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+h&4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@0-c+c+c+c+c+c+c+c+c+c+c+c+a-^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*b-/+|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=c-f=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+A+c+c+c+c+c+c+c+c+c+c+d-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@e-&@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A&l*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@*#f-c+c+c+c+c+c+c+c+c+c+c+) ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*!-g-|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=h-i-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^++@c+c+c+c+c+c+c+c+c+c+h&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@*-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@j-c+c+c+c+c+c+c+c+c+c+c+c+].^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*,=k-8=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=(+b-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+p+c+c+c+c+c+c+c+c+c+U&X&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+m-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@n-c+c+c+c+c+c+c+c+c+c+c+y#p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*o-p-h=|=|=|=|=|=|=|=|=|=|=|=|=q-r-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+P#c+c+c+c+c+c+c+c+c+c+s-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@,-'-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A$o&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@t-y#c+c+c+c+c+c+c+c+c+c+c+r#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*3=u-v++-|=|=|=|=|=|=v-w-x-@=Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*/ . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0+c+c+c+c+c+c+c+c+c+c+A*>&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!%*$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&^-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y-c+c+c+c+c+c+c+c+c+c+c+c+z-^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . . . . . W Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*A-B-W@C-r-D-E-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*F-. . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O#c+c+c+c+c+c+c+c+c+c+;&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@G-c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+H-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l$I-c+c+c+c+c+c+c+c+c+c+c+;#|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+F*. . . . . . . . . . . . . i Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*W . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+u-c+c+c+c+c+c+c+c+c+c+X%4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@i*_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+J-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@K-c+c+c+c+c+c+c+c+c+c+c+c+].^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+R+. . . . . . . . . . . . . L-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*6 . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+p@c+c+c+c+c+c+c+c+c+c+M-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@|-@&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+&@e-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@N-O-c+c+c+c+c+c+c+c+c+c+c+|@=$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9.. . . . . . . . . . . . . . Q*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*,=. . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+T c+c+c+c+c+c+c+c+c+c+:*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@g*L*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+_=S=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@P-*@c+c+c+c+c+c+c+c+c+c+c+c.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a.. . . . . . . . . . . . . . % Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*T*. . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+K+p+c+c+c+c+c+c+c+c+c+U&R#$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+Q-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d@R-c+c+c+c+c+c+c+c+c+c+c+c+w-^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+S-. . . . . . . . . . . . . . T-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*T-+ . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+e#c+c+c+c+c+c+c+c+c+c+U-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@u&_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+V-4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@W-y#c+c+c+c+c+c+c+c+c+c+c+) ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+X#. . . . . . . . . . . . . . 6 = Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*X*-+. . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+t#m+c+c+c+c+c+c+c+c+c+X-r=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Y-V+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A&l*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Z-c+c+c+c+c+c+c+c+c+c+c+c+D&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+6.. . . . . . . . . . . . . . . 6 `-Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*Y*`-6 . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+O+c+c+c+c+c+c+c+c+c+c++*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@e-X%c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@M-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ ;D%c+c+c+c+c+c+c+c+c+c+c+P+9+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+M.. . . . . . . . . . . . . . . . .;X F (.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.+;X i . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+E&c+c+c+c+c+c+c+c+c+c+4*e-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@O&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@;c+c+c+c+c+c+c+c+c+c+c+c+7#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+- c+c+c+c+c+c+c+c+c+c+#;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$;c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+%;^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%^%,*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@&;*;c+c+c+c+c+c+c+c+c+c+c+|@p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+Y+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[*c+c+c+c+c+c+c+c+c+c+A&-&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M-U&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@=;c+c+c+c+c+c+c+c+c+c+c+c+S ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+4.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+U=c+c+c+c+c+c+c+c+c+c+V*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B*a=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M#-;c+c+c+c+c+c+c+c+c+c+c+c+6.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+S+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o#c+c+c+c+c+c+c+c+c+c+C%}%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y*8$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@;;c+c+c+c+c+c+c+c+c+c+c+c+m ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+`.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+w+c+c+c+c+c+c+c+c+c+c+v&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@>;c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M#-;c+c+c+c+c+c+c+c+c+c+c+c+l+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+~+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,;c+c+c+c+c+c+c+c+c+c+z*4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@r*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@';c+c+c+c+c+c+c+c+c+c+c+c+^@|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+5+W.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+) c+c+c+c+c+c+c+c+c+c+9*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Z%c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M#-;c+c+c+c+c+c+c+c+c+c+c+c+J@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+`%c+c+c+c+c+c+c+c+c+c+ &}%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@);c+c+c+c+c+c+c+c+c+c+c+c+U+|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+|.M+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+q@c+c+c+c+c+c+c+c+c+c+l-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@r$:#c+c+c+c+c+c+c+c+c+c+c+c+u+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+N+<.[+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+h*c+c+c+c+c+c+c+c+c+c+A&'*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@!;c+c+c+c+c+c+c+c+c+c+c+c+h@/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a.j.P.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+^#c+c+c+c+c+c+c+c+c+c+#;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@~;$$c+c+c+c+c+c+c+c+c+c+c+c+s@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+h.*+#+3+L.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A@L.. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[*c+c+c+c+c+c+c+c+c+c+a={;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@];c+c+c+c+c+c+c+c+c+c+c+c+^;/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+j+a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j+f+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+*.c+c+c+c+c+c+c+c+c+c+U*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l%t+c+c+c+c+c+c+c+c+c+c+c+c+b&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0+t+c+c+c+c+c+c+c+c+c+x&/;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l#(;c+c+c+c+c+c+c+c+c+c+c+c+U+/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+R&c+c+c+c+c+c+c+c+c+c+G-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@_;:;c+c+c+c+c+c+c+c+c+c+c+c+@#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+t#|@c+c+c+c+c+c+c+c+c+o*_*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)$p$c+c+c+c+c+c+c+c+c+c+c+c+#.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+e#c+c+c+c+c+c+c+c+c+c+f*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@<;c+c+c+c+c+c+c+c+c+c+c+c+m+Q+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:-p+c+c+c+c+c+c+c+c+c+c+u&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@[;};c+c+c+c+c+c+c+c+c+c+c+c+P#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+=@c+c+c+c+c+c+c+c+c+c+^%y*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@|;c+c+c+c+c+c+c+c+c+c+c+c+W+0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+U@c+c+c+c+c+c+c+c+c+c+s*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@1;*@c+c+c+c+c+c+c+c+c+c+c+c+8&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+b@c+c+c+c+c+c+c+c+c+c+v*B*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}%2;c+c+c+c+c+c+c+c+c+c+c+c+i@p#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+3;c+c+c+c+c+c+c+c+c+c+f&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4;c+c+c+c+c+c+c+c+c+c+c+c+c+D@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<@0@c+c+c+c+c+c+c+c+c+_@s&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@5;6;c+c+c+c+c+c+c+c+c+c+c+c+i#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o@c+c+c+c+c+c+c+c+c+c+N%y*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@7;c+c+c+c+c+c+c+c+c+c+c+c+|@v.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f+<#c+c+c+c+c+c+c+c+c+c+2*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@8;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;U*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+W=9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;9;0;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@a;c+c+c+c+c+c+c+c+c+c+c+c+c+7#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[*c+c+c+c+c+c+c+c+c+c+o*z&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@b;c;c+c+c+c+c+c+c+c+c+c+c+c+q@9+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+L+c+c+c+c+c+c+c+c+c+c+*$}%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@d;c+c+c+c+c+c+c+c+c+c+c+c+c+X+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+8@B+c+c+c+c+c+c+c+c+c+c+K&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@e;c+c+c+c+c+c+c+c+c+c+c+c+c+;.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+D&c+c+c+c+c+c+c+c+c+c+v*,-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@f;%;c+c+c+c+c+c+c+c+c+c+c+c+$#0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+{@c+c+c+c+c+c+c+c+c+c+g;4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@h;c+c+c+c+c+c+c+c+c+c+c+c+c+u#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]#B+c+c+c+c+c+c+c+c+c+c+i;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@j;_@c+c+c+c+c+c+c+c+c+c+c+c+c#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+-@c+c+c+c+c+c+c+c+c+c+v*k;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@@*j*c+c+c+c+c+c+c+c+c+c+c+c+I+a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+i#c+c+c+c+c+c+c+c+c+c+*$-&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@l;c+c+c+c+c+c+c+c+c+c+c+c+c+D@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q#d+c+c+c+c+c+c+c+c+c+c+m;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@n;c+c+c+c+c+c+c+c+c+c+c+c+c+s ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+g#c+c+c+c+c+c+c+c+c+c+;@*-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@o;v*c+c+c+c+c+c+c+c+c+c+c+c+t@5+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+{@c+c+c+c+c+c+c+c+c+c+A&'&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@+$z*c+c+c+c+c+c+c+c+c+c+c+c+t+8#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+=$V@c+c+c+c+c+c+c+c+c+c+o=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M=c+c+c+c+c+c+c+c+c+c+c+c+c+e+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+@#t+c+c+c+c+c+c+c+c+c+c+9&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@p;_@c+c+c+c+c+c+c+c+c+c+c+c+- G#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+d*c+c+c+c+c+c+c+c+c+c+~@Z=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@q;V+c+c+c+c+c+c+c+c+c+c+c+c+F+q#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G#r;c+c+c+c+c+c+c+c+c+c+j*e*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@>&X%c+c+c+c+c+c+c+c+c+c+c+c+*@7+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f@d+c+c+c+c+c+c+c+c+c+c+f*g*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@s;c+c+c+c+c+c+c+c+c+c+c+c+c+.#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+H#c+c+c+c+c+c+c+c+c+c+c+c&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$;c+c+c+c+c+c+c+c+c+c+c+c+c++#f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+t;c+c+c+c+c+c+c+c+c+c+_@d-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@u;U&c+c+c+c+c+c+c+c+c+c+c+c+P+g.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9+0 c+c+c+c+c+c+c+c+c+c+B&E=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+ @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@R#a=c+c+c+c+c+c+c+c+c+c+c+c+m+@#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<@P+c+c+c+c+c+c+c+c+c+c+_$}*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y*m;m;]-s;s;s;s;s;s;s;s;s;s;s;s;s;s;v;m;m;{;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@w;N%c+c+c+c+c+c+c+c+c+c+c+c+c+-@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+w-y#c+c+c+c+c+c+c+c+c+c+'=!%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@o&f*c+c+c+c+c+c+c+c+c+c+c+c+c+4#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q+c+c+c+c+c+c+c+c+c+c+c+%=4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@D=c+c+c+c+c+c+c+c+c+c+c+c+c+O#:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+l@c+c+c+c+c+c+c+c+c+c+c++*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@m*c+c+c+c+c+c+c+c+c+c+c+c+c+,#=$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+^@c+c+c+c+c+c+c+c+c+c+_@x;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y;_@c+c+c+c+c+c+c+c+c+c+c+c+d+6.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q#-#c+c+c+c+c+c+c+c+c+c+~@[&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@*-_=c+c+c+c+c+c+c+c+c+c+c+c+m+[*^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+6+W+c+c+c+c+c+c+c+c+c+c+m&z;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@A;x&c+c+c+c+c+c+c+c+c+c+c+c+*@W&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+C=N@c+c+c+c+c+c+c+c+c+c+.&Y-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@_*m&c+c+c+c+c+c+c+c+c+c+c+c+c+O ^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+%.c+c+c+c+c+c+c+c+c+c+c+j*X&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@{&B;c+c+c+c+c+c+c+c+c+c+c+c+c+4#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+[#c+c+c+c+c+c+c+c+c+c+c+&@C;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ @`+c+c+c+c+c+c+c+c+c+c+c+c+c+L+:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+s c+c+c+c+c+c+c+c+c+c+c+,*#=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@/;Q#c+c+c+c+c+c+c+c+c+c+c+c+c+Y%1+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+*.c+c+c+c+c+c+c+c+c+c+c+j&e-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@C;X%c+c+c+c+c+c+c+c+c+c+c+c+c+w+]+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+r+U+c+c+c+c+c+c+c+c+c+c+c+D;'&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@C;X%c+c+c+c+c+c+c+c+c+c+c+c+c+K@]+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:-) c+c+c+c+c+c+c+c+c+c+c+E;l*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F;G;c+c+c+c+c+c+c+c+c+c+c+c+c+U@p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0.<#c+c+c+c+c+c+c+c+c+c+c+X%x*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@X&C%c+c+c+c+c+c+c+c+c+c+c+c+c+H;p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" + . . . . . . . . . =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0&p@c+c+c+c+c+c+c+c+c+c+c+N% @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@^-`+c+c+c+c+c+c+c+c+c+c+c+c+c+;#0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+($. . . . . . . . . ", -" . . . . . . . . . . a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+g.Z+c+c+c+c+c+c+c+c+c+c+c+G;B*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@S=S&c+c+c+c+c+c+c+c+c+c+c+c+c+,#q#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+n.. . . . . . . . . ", -" + . . . . . . . . . h.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]@V@c+c+c+c+c+c+c+c+c+c+c+%;_*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M-V+c+c+c+c+c+c+c+c+c+c+c+c+c+U@<@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:.. . . . . . . . . ", -" . . . . . . . . . . f.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o+V@c+c+c+c+c+c+c+c+c+c+c+'-i*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@9*_=c+c+c+c+c+c+c+c+c+c+c+c+c+^@=$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+D . . . . . . . . . ", -" . . . . . . . . . . >=^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f@Z+c+c+c+c+c+c+c+c+c+c+c+I;H&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@J;;@c+c+c+c+c+c+c+c+c+c+c+c+c+- v+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<+. . . . . . . . . ", -" . . . . . . . . . . K;^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+0&U@c+c+c+c+c+c+c+c+c+c+c+_@U*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4@}&c+c+c+c+c+c+c+c+c+c+c+c+c+c+{@1+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+#+. . . . . . . . . ", -" . . . . . . . . . 2.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]++#c+c+c+c+c+c+c+c+c+c+c+c+J-}%$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@>&o=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c#7@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+V.. . . . . . . . . ", -" . . . . . . . . . :.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+Q&c+c+c+c+c+c+c+c+c+c+c+c+'=|-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@3*/$c+c+c+c+c+c+c+c+c+c+c+c+c+c+s G#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+M+. . . . . . . . . ", -" . . . . . . . . . @+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+L@c+c+c+c+c+c+c+c+c+c+c+c+Z%n=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@[&H=c+c+c+c+c+c+c+c+c+c+c+c+c+*@)#|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+5+. . . . . . . . . . ", -" . . . . . . . . . P.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+7@c.c+c+c+c+c+c+c+c+c+c+c+c+_=l-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@;&J#c+c+c+c+c+c+c+c+c+c+c+c+c+A#M@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9.. . . . . . . . . . ", -" . . . . . . . . . !+7@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+=@*@c+c+c+c+c+c+c+c+c+c+c+c+D=-&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}%M=c+c+c+c+c+c+c+c+c+c+c+c+c+c+e%E&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1.. . . . . . . . . . ", -" . . . . . . . . . . >=^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,;x+c+c+c+c+c+c+c+c+c+c+c+c+'= @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F;j&c+c+c+c+c+c+c+c+c+c+c+c+c+c+q@v.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+z+. . . . . . . . . ", -" . . . . . . . . . . G+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+s#P+c+c+c+c+c+c+c+c+c+c+c+c+B&=*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4&4*c+c+c+c+c+c+c+c+c+c+c+c+c+c+Q :-^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+L.. . . . . . . . . ", -" . . . . . . . . . W.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+]@;#c+c+c+c+c+c+c+c+c+c+c+c+c+2&>&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}%U*;@c+c+c+c+c+c+c+c+c+c+c+c+c+c+S f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+q#. . . . . . . . . . ", -" . . . . . . . . . !+1+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+L;E@c+c+c+c+c+c+c+c+c+c+c+c+c+Q#==$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@X&$%c+c+c+c+c+c+c+c+c+c+c+c+c+c+|@1@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+F*. . . . . . . . . . ", -" . . . . . . . . . . M;^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+)#t+c+c+c+c+c+c+c+c+c+c+c+c+_=N;&&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@7&V+c+c+c+c+c+c+c+c+c+c+c+c+c+c+i@y+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+>#. . . . . . . . . ", -" @ . . . . . . . . . Z.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+T@F+c+c+c+c+c+c+c+c+c+c+c+c+c+j&M*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@)&D=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+O#p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+p.@ . . . . . . . . . ", -" . . . . . . . . . @ =$^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+J&C@c+c+c+c+c+c+c+c+c+c+c+c+c+_=U*-&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@F&Z%c+c+c+c+c+c+c+c+c+c+c+c+c+c+*@~.:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+n.. . . . . . . . . . ", -" . . . . . . . . . . T+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+s c+c+c+c+c+c+c+c+c+c+c+c+c+c+O;:&$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@{;D=_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+p+u+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+O.. . . . . . . . . ", -" . . . . . . . . . M.f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1@0@c+c+c+c+c+c+c+c+c+c+c+c+c+J#m;e-$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M-%;c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+B#f@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+4.. . . . . . . . . . ", -" . . . . . . . . . . 1.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v.+#c+c+c+c+c+c+c+c+c+c+c+c+c+c+A&P;4@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@}*l&_@c+c+c+c+c+c+c+c+c+c+c+c+c+c+m+W@G#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+V.. . . . . . . . . . ", -" . . . . . . . . . . ~+/+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G#=@m+c+c+c+c+c+c+c+c+c+c+c+c+c+c+D;A;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@y;H=c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+'#E&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,+. . . . . . . . . . ", -" . . . . . . . . . . 2+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+w-s+c+c+c+c+c+c+c+c+c+c+c+c+c+c+;@J-/;$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@M*g;c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+R&v+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+W.. . . . . . . . . . ", -" . . . . . . . . . . A@N+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+t;c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+X-m;}*$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@'*U*~@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+p++@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+M;. . . . . . . . . . ", -" . . . . . . . . . . X#^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+@#;#c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+A*$;>&$@$@$@$@$@$@$@$@$@$@$@$@$@Q;`+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+L@g.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+N+R;. . . . . . . . . . ", -" . . . . . . . . . . @ f.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+S;N@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+@&Q-y*$@$@$@$@$@$@$@$@$@:&w*c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+@@z@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+_.. . . . . . . . . . ", -" . . . . . . . . . . 3+f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a-^@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+.&U*}*$@$@$@$@$@3*D=;@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+E+0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+9.@ . . . . . . . . . . ", -" . . . . . . . . . . . S+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G#M%W+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+'-T;3*$@>&U*`$c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+-#,;^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+r+M.. . . . . . . . . . ", -" . . . . . . . . . . . {+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+8@9@t+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+~@u=.&c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+*@s L;^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+.+. . . . . . . . . . . ", -" + . . . . . . . . . . M+h.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:@- c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+<#b@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+G+. . . . . . . . . . . ", -" . . . . . . . . . . . N.]+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+o#s+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+p+=@f+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+2.. . . . . . . . . . . . ", -" . . . . . . . . . . . S.N+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+i+t.F+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+*@%&p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,+!+. . . . . . . . . . . ", -" . . . . . . . . . . . . Y.i+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+)#p+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+^@U;^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+e.[+. . . . . . . . . . . ", -" . . . . . . . . . . . . V.v+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+L;[#0@c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+t@{-:+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+,+[+. . . . . . . . . . . ", -" . . . . . . . . . . . . Y+a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+a..#0@c+c+c+c+c+c+c+c+c+c+c+c+c+c+p+o@1+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+2+!+. . . . . . . . . . . + ", -" . . . . . . . . . . . . M.f.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+q+b+c+c+c+c+c+c+c+c+c+c+m+q p.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+n.. . . . . . . . . . . . . ", -" . . . . . . . . . . . . !+[.|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+f++@^;c+c+c+c+c+c+*@;.J&^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+++. . . . . . . . . . . . . ", -" . . . . . . . . . . . . . V;N+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+J@L@A#c+W+o 6+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+s.M.. . . . . . . . . . . . . ", -" . . . . . . . . . . . . . M.{+|+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+v+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+N+S+@ . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . Z.<@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+{+R;. . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . !+D a.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+|+E.U.. . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . !+}+<@^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+/+k.3+. . . . . . . . . . . . . . . + ", -" . . . . . . . . . . . . . . . . . V.|.v+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+<@<.M.. . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . 4+M 2.0.^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+:+e.($3+. . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . N.V ~=5.0./+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+^+1+(+{+n..+[+. . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . !+M.P.V.`..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+Y.3+P.M+. . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", -" + @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + . . ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/resources/icon.icns b/resources/icon.icns new file mode 100644 index 00000000..f5b045a5 Binary files /dev/null and b/resources/icon.icns differ diff --git a/resources/icon.ico b/resources/icon.ico new file mode 100644 index 00000000..ffb3d869 Binary files /dev/null and b/resources/icon.ico differ diff --git a/resources/icon.png b/resources/icon.png new file mode 100755 index 00000000..c78c1f43 Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/logo.svg b/resources/logo.svg new file mode 100644 index 00000000..447bcf23 --- /dev/null +++ b/resources/logo.svg @@ -0,0 +1,206 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/singleapplication/CHANGELOG.md b/singleapplication/CHANGELOG.md deleted file mode 100644 index 837c98b1..00000000 --- a/singleapplication/CHANGELOG.md +++ /dev/null @@ -1,193 +0,0 @@ -Changelog -========= - -__3.0.14__ ----------- - -* Fixed uninitialised variables in the `SingleApplicationPrivate` constructor. - -__3.0.13a__ ----------- - -* Process socket events asynchronously -* Fix undefined variable error on Windows - - _Francis Giraldeau_ - -__3.0.12a__ ----------- - -* Removed signal handling. - -__3.0.11a__ ----------- - -* Fixed bug where the message sent by the second process was not received - correctly when the message is sent immediately following a connection. - - _Francis Giraldeau_ - -* Refactored code and implemented shared memory block consistency checks - via `qChecksum()` (CRC-16). -* Explicit `qWarning` and `qCritical` when the library is unable to initialise - correctly. - -__3.0.10__ ----------- - -* Removed C style casts and eliminated all clang warnings. Fixed `instanceId` - reading from only one byte in the message deserialization. Cleaned up - serialization code using `QDataStream`. Changed connection type to use - `quint8 enum` rather than `char`. -* Renamed `SingleAppConnectionType` to `ConnectionType`. Added initialization - values to all `ConnectionType` enum cases. - - _Jedidiah Buck McCready_ - -__3.0.9__ ---------- - -* Added SingleApplicationPrivate::primaryPid() as a solution to allow - bringing the primary window of an application to the foreground on - Windows. - - _Eelco van Dam from Peacs BV_ - -__3.0.8__ ---------- - -* Bug fix - changed QApplication::instance() to QCoreApplication::instance() - - _Evgeniy Bazhenov_ - -__3.0.7a__ ----------- - -* Fixed compilation error with Mingw32 in MXE thanks to Vitaly Tonkacheyev. -* Removed QMutex used for thread safe behaviour. The implementation now uses - QCoreApplication::instance() to get an instance to SingleApplication for - memory deallocation. - -__3.0.6a__ ----------- - -* Reverted GetUserName API usage on Windows. Fixed bug with missing library. -* Fixed bug in the Calculator example, preventing it's window to be raised - on Windows. - - Special thanks to Charles Gunawan. - -__3.0.5a__ ----------- - -* Fixed a memory leak in the SingleApplicationPrivate destructor. - - _Sergei Moiseev_ - -__3.0.4a__ ----------- - -* Fixed shadow and uninitialised variable warnings. - - _Paul Walmsley_ - -__3.0.3a__ ----------- - -* Removed Microsoft Windows specific code for getting username due to - multiple problems and compiler differences on Windows platforms. On - Windows the shared memory block in User mode now includes the user's - home path (which contains the user's username). - -* Explicitly getting absolute path of the user's home directory as on Unix - a relative path (`~`) may be returned. - -__3.0.2a__ ----------- - -* Fixed bug on Windows when username containing wide characters causes the - library to crash. - - _Le Liu_ - -__3.0.1a__ ----------- - -* Allows the application path and version to be excluded from the server name - hash. The following flags were added for this purpose: - * `SingleApplication::Mode::ExcludeAppVersion` - * `SingleApplication::Mode::ExcludeAppPath` -* Allow a non elevated process to connect to a local server created by an - elevated process run by the same user on Windows -* Fixes a problem with upper case letters in paths on Windows - - _Le Liu_ - -__v3.0a__ ---------- - -* Depricated secondary instances count. -* Added a sendMessage() method to send a message to the primary instance. -* Added a receivedMessage() signal, emitted when a message is received from a - secondary instance. -* The SingleApplication constructor's third parameter is now a bool - specifying if the current instance should be allowed to run as a secondary - instance if there is already a primary instance. -* The SingleApplication constructor accept a fourth parameter specifying if - the SingleApplication block should be User-wide or System-wide. -* SingleApplication no longer relies on `applicationName` and - `organizationName` to be set. It instead concatenates all of the following - data and computes a `SHA256` hash which is used as the key of the - `QSharedMemory` block and the `QLocalServer`. Since at least - `applicationFilePath` is always present there is no need to explicitly set - any of the following prior to initialising `SingleApplication`. - * `QCoreApplication::applicationName` - * `QCoreApplication::applicationVersion` - * `QCoreApplication::applicationFilePath` - * `QCoreApplication::organizationName` - * `QCoreApplication::organizationDomain` - * User name or home directory path if in User mode -* The primary instance is no longer notified when a secondary instance had - been started by default. A `Mode` flag for this feature exists. -* Added `instanceNumber()` which represents a unique identifier for each - secondary instance started. When called from the primary instance will - return `0`. - -__v2.4__ --------- - -* Stability improvements -* Support for secondary instances. -* The library now recovers safely after the primary process has crashed -and the shared memory had not been deleted. - -__v2.3__ --------- - -* Improved pimpl design and inheritance safety. - - _Vladislav Pyatnichenko_ - -__v2.2__ --------- - -* The `QAPPLICATION_CLASS` macro can now be defined in the file including the -Single Application header or with a `DEFINES+=` statement in the project file. - -__v2.1__ --------- - -* A race condition can no longer occur when starting two processes nearly - simultaneously. - - Fix issue [#3](https://github.com/itay-grudev/SingleApplication/issues/3) - -__v2.0__ --------- - -* SingleApplication is now being passed a reference to `argc` instead of a - copy. - - Fix issue [#1](https://github.com/itay-grudev/SingleApplication/issues/1) - -* Improved documentation. diff --git a/singleapplication/LICENSE b/singleapplication/LICENSE deleted file mode 100644 index 85b2a149..00000000 --- a/singleapplication/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Itay Grudev 2015 - 2016 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Note: Some of the examples include code not distributed under the terms of the -MIT License. diff --git a/singleapplication/README.md b/singleapplication/README.md deleted file mode 100644 index 0b1a3552..00000000 --- a/singleapplication/README.md +++ /dev/null @@ -1,265 +0,0 @@ -SingleApplication -================= - -This is a replacement of the QtSingleApplication for `Qt5`. - -Keeps the Primary Instance of your Application and kills each subsequent -instances. It can (if enabled) spawn secondary (non-related to the primary) -instances and can send data to the primary instance from secondary instances. - -Usage ------ - -The `SingleApplication` class inherits from whatever `Q[Core|Gui]Application` -class you specify via the `QAPPLICATION_CLASS` macro (`QCoreApplication` is the -default). Further usage is similar to the use of the `Q[Core|Gui]Application` -classes. - -The library sets up a `QLocalServer` and a `QSharedMemory` block. The first -instance of your Application is your Primary Instance. It would check if the -shared memory block exists and if not it will start a `QLocalServer` and listen -for connections. Each subsequent instance of your application would check if the -shared memory block exists and if it does, it will connect to the QLocalServer -to notify the primary instance that a new instance had been started, after which -it would terminate with status code `0`. In the Primary Instance -`SingleApplication` would emit the `instanceStarted()` signal upon detecting -that a new instance had been started. - -The library uses `stdlib` to terminate the program with the `exit()` function. - -You can use the library as if you use any other `QCoreApplication` derived -class: - -```cpp -#include -#include - -int main( int argc, char* argv[] ) -{ - SingleApplication app( argc, argv ); - - return app.exec(); -} -``` - -To include the library files I would recommend that you add it as a git -submodule to your project and include it's contents with a `.pri` file. Here is -how: - -```bash -git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication -``` - -Then include the `singleapplication.pri` file in your `.pro` project file. Also -don't forget to specify which `QCoreApplication` class your app is using if it -is not `QCoreApplication`. - -```qmake -include(singleapplication/singleapplication.pri) -DEFINES += QAPPLICATION_CLASS=QApplication -``` - -The `Instance Started` signal ------------------------- - -The SingleApplication class implements a `instanceStarted()` signal. You can -bind to that signal to raise your application's window when a new instance had -been started, for example. - -```cpp -// window is a QWindow instance -QObject::connect( - &app, - &SingleApplication::instanceStarted, - &window, - &QWindow::raise -); -``` - -Using `SingleApplication::instance()` is a neat way to get the -`SingleApplication` instance for binding to it's signals anywhere in your -program. - -__Note:__ On Windows the ability to bring the application windows to the -foreground is restricted. See [Windows specific implementations](Windows.md) -for a workaround and an example implementation. - - -Secondary Instances -------------------- - -If you want to be able to launch additional Secondary Instances (not related to -your Primary Instance) you have to enable that with the third parameter of the -`SingleApplication` constructor. The default is `false` meaning no Secondary -Instances. Here is an example of how you would start a Secondary Instance send -a message with the command line arguments to the primary instance and then shut -down. - -```cpp -int main(int argc, char *argv[]) -{ - SingleApplication app( argc, argv, true ); - - if( app.isSecondary() ) { - app.sendMessage( app.arguments().join(' ')).toUtf8() ); - app.exit( 0 ); - } - - return app.exec(); -} -``` - -*__Note:__ A secondary instance won't cause the emission of the -`instanceStarted()` signal by default. See `SingleApplication::Mode` for more -details.* - -You can check whether your instance is a primary or secondary with the following -methods: - -```cpp -app.isPrimary(); -// or -app.isSecondary(); -``` - -*__Note:__ If your Primary Instance is terminated a newly launched instance -will replace the Primary one even if the Secondary flag has been set.* - -API ---- - -### Members - -```cpp -SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100 ) -``` - -Depending on whether `allowSecondary` is set, this constructor may terminate -your app if there is already a primary instance running. Additional `Options` -can be specified to set whether the SingleApplication block should work -user-wide or system-wide. Additionally the `Mode::SecondaryNotification` may be -used to notify the primary instance whenever a secondary instance had been -started (disabled by default). `timeout` specifies the maximum time in -milliseconds to wait for blocking operations. - -*__Note:__ `argc` and `argv` may be changed as Qt removes arguments that it -recognizes.* - -*__Note:__ `Mode::SecondaryNotification` only works if set on both the primary -and the secondary instance.* - -*__Note:__ Operating system can restrict the shared memory blocks to the same -user, in which case the User/System modes will have no effect and the block will -be user wide.* - ---- - -```cpp -bool SingleApplication::sendMessage( QByteArray message, int timeout = 100 ) -``` - -Sends `message` to the Primary Instance. Uses `timeout` as a the maximum timeout -in milliseconds for blocking functions - ---- - -```cpp -bool SingleApplication::isPrimary() -``` - -Returns if the instance is the primary instance. - ---- - -```cpp -bool SingleApplication::isSecondary() -``` -Returns if the instance is a secondary instance. - ---- - -```cpp -quint32 SingleApplication::instanceId() -``` - -Returns a unique identifier for the current instance. - ---- - -```cpp -qint64 SingleApplication::primaryPid() -``` - -Returns the process ID (PID) of the primary instance. - -### Signals - -```cpp -void SingleApplication::instanceStarted() -``` - -Triggered whenever a new instance had been started, except for secondary -instances if the `Mode::SecondaryNotification` flag is not specified. - ---- - -```cpp -void SingleApplication::receivedMessage( quint32 instanceId, QByteArray message ) -``` - -Triggered whenever there is a message received from a secondary instance. - ---- - -### Flags - -```cpp -enum SingleApplication::Mode -``` - -* `Mode::User` - The SingleApplication block should apply user wide. This adds - user specific data to the key used for the shared memory and server name. - This is the default functionality. -* `Mode::System` – The SingleApplication block applies system-wide. -* `Mode::SecondaryNotification` – Whether to trigger `instanceStarted()` even - whenever secondary instances are started. -* `Mode::ExcludeAppPath` – Excludes the application path from the server name - (and memory block) hash. -* `Mode::ExcludeAppVersion` – Excludes the application version from the server - name (and memory block) hash. - -*__Note:__ `Mode::SecondaryNotification` only works if set on both the primary -and the secondary instance.* - -*__Note:__ Operating system can restrict the shared memory blocks to the same -user, in which case the User/System modes will have no effect and the block will -be user wide.* - ---- - -Versioning ----------- - -Each major version introduces either very significant changes or is not -backwards compatible with the previous version. Minor versions only add -additional features, bug fixes or performance improvements and are backwards -compatible with the previous release. See [`CHANGELOG.md`](CHANGELOG.md) for -more details. - -Implementation --------------- - -The library is implemented with a QSharedMemory block which is thread safe and -guarantees a race condition will not occur. It also uses a QLocalSocket to -notify the main process that a new instance had been spawned and thus invoke the -`instanceStarted()` signal and for messaging the primary instance. - -Additionally the library can recover from being forcefully killed on *nix -systems and will reset the memory block given that there are no other -instances running. - -License -------- -This library and it's supporting documentation are released under -`The MIT License (MIT)` with the exception of the Qt calculator examples which -is distributed under the BSD license. diff --git a/singleapplication/Windows.md b/singleapplication/Windows.md deleted file mode 100644 index 13c52da0..00000000 --- a/singleapplication/Windows.md +++ /dev/null @@ -1,46 +0,0 @@ -Windows Specific Implementations -================================ - -Setting the foreground window ------------------------------ - -In the `instanceStarted()` example in the `README` we demonstrated how an -application can bring it's primary instance window whenever a second copy -of the application is started. - -On Windows the ability to bring the application windows to the foreground is -restricted, see [`AllowSetForegroundWindow()`][AllowSetForegroundWindow] for more -details. - -The background process (the primary instance) can bring its windows to the -foreground if it is allowed by the current foreground process (the secondary -instance). To bypass this `SingleApplication` must be initialized with the -`allowSecondary` parameter set to `true` and the `options` parameter must -include `Mode::SecondaryNotification`, See `SingleApplication::Mode` for more -details. - -Here is an example: - -```cpp -if( app.isSecondary() ) { - // This API requires LIBS += User32.lib to be added to the project - AllowSetForegroundWindow( DWORD( app.primaryPid() ) ); -} - -if( app.isPrimary() ) { - QObject::connect( - &app, - &SingleApplication::instanceStarted, - this, - &App::instanceStarted - ); -} -``` - -```cpp -void App::instanceStarted() { - QApplication::setActiveWindow( [window/widget to set to the foreground] ); -} -``` - -[AllowSetForegroundWindow]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms632668.aspx diff --git a/singleapplication/singleapplication.cpp b/singleapplication/singleapplication.cpp deleted file mode 100644 index a7972314..00000000 --- a/singleapplication/singleapplication.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2018 -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#include -#include -#include -#include -#include - -#include "singleapplication.h" -#include "singleapplication_p.h" - -/** - * @brief Constructor. Checks and fires up LocalServer or closes the program - * if another instance already exists - * @param argc - * @param argv - * @param {bool} allowSecondaryInstances - */ -SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary, Options options, int timeout ) - : app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) ) -{ - Q_D(SingleApplication); - - // Store the current mode of the program - d->options = options; - - // Generating an application ID used for identifying the shared memory - // block and QLocalServer - d->genBlockServerName(); - -#ifdef Q_OS_UNIX - // By explicitly attaching it and then deleting it we make sure that the - // memory is deleted even after the process has crashed on Unix. - d->memory = new QSharedMemory( d->blockServerName ); - d->memory->attach(); - delete d->memory; -#endif - // Guarantee thread safe behaviour with a shared memory block. - d->memory = new QSharedMemory( d->blockServerName ); - - // Create a shared memory block - if( d->memory->create( sizeof( InstancesInfo ) ) ) { - // Initialize the shared memory block - d->memory->lock(); - d->initializeMemoryBlock(); - d->memory->unlock(); - } else { - // Attempt to attach to the memory segment - if( ! d->memory->attach() ) { - qCritical() << "SingleApplication: Unable to attach to shared memory block."; - qCritical() << d->memory->errorString(); - delete d; - ::exit( EXIT_FAILURE ); - } - } - - InstancesInfo* inst = static_cast( d->memory->data() ); - QTime time; - time.start(); - - // Make sure the shared memory block is initialised and in consistent state - while( true ) { - d->memory->lock(); - - if( d->blockChecksum() == inst->checksum ) break; - - if( time.elapsed() > 5000 ) { - qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure."; - d->initializeMemoryBlock(); - } - - d->memory->unlock(); - - // Random sleep here limits the probability of a collision between two racing apps - qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits::max() ); - QThread::sleep( 8 + static_cast ( static_cast ( qrand() ) / RAND_MAX * 10 ) ); - } - - if( inst->primary == false) { - d->startPrimary(); - d->memory->unlock(); - return; - } - - // Check if another instance can be started - if( allowSecondary ) { - inst->secondary += 1; - inst->checksum = d->blockChecksum(); - d->instanceNumber = inst->secondary; - d->startSecondary(); - if( d->options & Mode::SecondaryNotification ) { - d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance ); - } - d->memory->unlock(); - return; - } - - d->memory->unlock(); - - d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance ); - - delete d; - - ::exit( EXIT_SUCCESS ); -} - -/** - * @brief Destructor - */ -SingleApplication::~SingleApplication() -{ - Q_D(SingleApplication); - delete d; -} - -bool SingleApplication::isPrimary() -{ - Q_D(SingleApplication); - return d->server != nullptr; -} - -bool SingleApplication::isSecondary() -{ - Q_D(SingleApplication); - return d->server == nullptr; -} - -quint32 SingleApplication::instanceId() -{ - Q_D(SingleApplication); - return d->instanceNumber; -} - -qint64 SingleApplication::primaryPid() -{ - Q_D(SingleApplication); - return d->primaryPid(); -} - -bool SingleApplication::sendMessage( QByteArray message, int timeout ) -{ - Q_D(SingleApplication); - - // Nobody to connect to - if( isPrimary() ) return false; - - // Make sure the socket is connected - d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ); - - d->socket->write( message ); - bool dataWritten = d->socket->flush(); - d->socket->waitForBytesWritten( timeout ); - return dataWritten; -} diff --git a/singleapplication/singleapplication.h b/singleapplication/singleapplication.h deleted file mode 100644 index f123abdb..00000000 --- a/singleapplication/singleapplication.h +++ /dev/null @@ -1,135 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2018 -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#ifndef SINGLE_APPLICATION_H -#define SINGLE_APPLICATION_H - -#include -#include - -#ifndef QAPPLICATION_CLASS - #define QAPPLICATION_CLASS QCoreApplication -#endif - -#include QT_STRINGIFY(QAPPLICATION_CLASS) - -class SingleApplicationPrivate; - -/** - * @brief The SingleApplication class handles multipe instances of the same - * Application - * @see QCoreApplication - */ -class SingleApplication : public QAPPLICATION_CLASS -{ - Q_OBJECT - - typedef QAPPLICATION_CLASS app_t; - -public: - /** - * @brief Mode of operation of SingleApplication. - * Whether the block should be user-wide or system-wide and whether the - * primary instance should be notified when a secondary instance had been - * started. - * @note Operating system can restrict the shared memory blocks to the same - * user, in which case the User/System modes will have no effect and the - * block will be user wide. - * @enum - */ - enum Mode { - User = 1 << 0, - System = 1 << 1, - SecondaryNotification = 1 << 2, - ExcludeAppVersion = 1 << 3, - ExcludeAppPath = 1 << 4 - }; - Q_DECLARE_FLAGS(Options, Mode) - - /** - * @brief Intitializes a SingleApplication instance with argc command line - * arguments in argv - * @arg {int &} argc - Number of arguments in argv - * @arg {const char *[]} argv - Supplied command line arguments - * @arg {bool} allowSecondary - Whether to start the instance as secondary - * if there is already a primary instance. - * @arg {Mode} mode - Whether for the SingleApplication block to be applied - * User wide or System wide. - * @arg {int} timeout - Timeout to wait in miliseconds. - * @note argc and argv may be changed as Qt removes arguments that it - * recognizes - * @note Mode::SecondaryNotification only works if set on both the primary - * instance and the secondary instance. - * @note The timeout is just a hint for the maximum time of blocking - * operations. It does not guarantee that the SingleApplication - * initialisation will be completed in given time, though is a good hint. - * Usually 4*timeout would be the worst case (fail) scenario. - * @see See the corresponding QAPPLICATION_CLASS constructor for reference - */ - explicit SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 1000 ); - ~SingleApplication(); - - /** - * @brief Returns if the instance is the primary instance - * @returns {bool} - */ - bool isPrimary(); - - /** - * @brief Returns if the instance is a secondary instance - * @returns {bool} - */ - bool isSecondary(); - - /** - * @brief Returns a unique identifier for the current instance - * @returns {qint32} - */ - quint32 instanceId(); - - /** - * @brief Returns the process ID (PID) of the primary instance - * @returns {qint64} - */ - qint64 primaryPid(); - - /** - * @brief Sends a message to the primary instance. Returns true on success. - * @param {int} timeout - Timeout for connecting - * @returns {bool} - * @note sendMessage() will return false if invoked from the primary - * instance. - */ - bool sendMessage( QByteArray message, int timeout = 100 ); - -Q_SIGNALS: - void instanceStarted(); - void receivedMessage( quint32 instanceId, QByteArray message ); - -private: - SingleApplicationPrivate *d_ptr; - Q_DECLARE_PRIVATE(SingleApplication) -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(SingleApplication::Options) - -#endif // SINGLE_APPLICATION_H diff --git a/singleapplication/singleapplication.pri b/singleapplication/singleapplication.pri deleted file mode 100644 index 26f5c9c7..00000000 --- a/singleapplication/singleapplication.pri +++ /dev/null @@ -1,19 +0,0 @@ -QT += core network -CONFIG += c++11 - -HEADERS += $$PWD/singleapplication.h \ - $$PWD/singleapplication_p.h -SOURCES += $$PWD/singleapplication.cpp \ - $$PWD/singleapplication_p.cpp - -INCLUDEPATH += $$PWD - -win32 { - msvc:LIBS += Advapi32.lib - gcc:LIBS += -ladvapi32 -} - -DISTFILES += \ - $$PWD/README.md \ - $$PWD/CHANGELOG.md \ - $$PWD/Windows.md diff --git a/singleapplication/singleapplication_p.cpp b/singleapplication/singleapplication_p.cpp deleted file mode 100644 index c2b5f6bc..00000000 --- a/singleapplication/singleapplication_p.cpp +++ /dev/null @@ -1,386 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2018 -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// -// W A R N I N G !!! -// ----------------- -// -// This file is not part of the SingleApplication API. It is used purely as an -// implementation detail. This header file may change from version to -// version without notice, or may even be removed. -// - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "singleapplication.h" -#include "singleapplication_p.h" - - -SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr ) - : q_ptr( q_ptr ) -{ - server = nullptr; - socket = nullptr; - memory = nullptr; - instanceNumber = -1; -} - -SingleApplicationPrivate::~SingleApplicationPrivate() -{ - if( socket != nullptr ) { - socket->close(); - delete socket; - } - - memory->lock(); - InstancesInfo* inst = static_cast(memory->data()); - if( server != nullptr ) { - server->close(); - delete server; - inst->primary = false; - inst->primaryPid = -1; - inst->checksum = blockChecksum(); - } - memory->unlock(); - - delete memory; -} - -void SingleApplicationPrivate::genBlockServerName() -{ - QCryptographicHash appData( QCryptographicHash::Sha256 ); - appData.addData( "SingleApplication", 17 ); - appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); - appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); - appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); - - if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) { - appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); - } - - if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) { -#ifdef Q_OS_WIN - appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); -#else - appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); -#endif - } - - // User level block requires a user specific data in the hash - if( options & SingleApplication::Mode::User ) { -#ifdef Q_OS_WIN - appData.addData( QStandardPaths::standardLocations( QStandardPaths::HomeLocation ).join("").toUtf8() ); -#endif -#ifdef Q_OS_UNIX - appData.addData( - QDir( - QStandardPaths::standardLocations( QStandardPaths::HomeLocation ).first() - ).absolutePath().toUtf8() - ); -#endif - } - - // Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with - // server naming requirements. - blockServerName = appData.result().toBase64().replace("/", "_"); -} - -void SingleApplicationPrivate::initializeMemoryBlock() -{ - InstancesInfo* inst = static_cast( memory->data() ); - inst->primary = false; - inst->secondary = 0; - inst->primaryPid = -1; - inst->checksum = blockChecksum(); -} - -void SingleApplicationPrivate::startPrimary() -{ - Q_Q(SingleApplication); - - // Successful creation means that no main process exists - // So we start a QLocalServer to listen for connections - QLocalServer::removeServer( blockServerName ); - server = new QLocalServer(); - - // Restrict access to the socket according to the - // SingleApplication::Mode::User flag on User level or no restrictions - if( options & SingleApplication::Mode::User ) { - server->setSocketOptions( QLocalServer::UserAccessOption ); - } else { - server->setSocketOptions( QLocalServer::WorldAccessOption ); - } - - server->listen( blockServerName ); - QObject::connect( - server, - &QLocalServer::newConnection, - this, - &SingleApplicationPrivate::slotConnectionEstablished - ); - - // Reset the number of connections - InstancesInfo* inst = static_cast ( memory->data() ); - - inst->primary = true; - inst->primaryPid = q->applicationPid(); - inst->checksum = blockChecksum(); - - instanceNumber = 0; -} - -void SingleApplicationPrivate::startSecondary() -{ -} - -void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType ) -{ - // Connect to the Local Server of the Primary Instance if not already - // connected. - if( socket == nullptr ) { - socket = new QLocalSocket(); - } - - // If already connected - we are done; - if( socket->state() == QLocalSocket::ConnectedState ) - return; - - // If not connect - if( socket->state() == QLocalSocket::UnconnectedState || - socket->state() == QLocalSocket::ClosingState ) { - socket->connectToServer( blockServerName ); - } - - // Wait for being connected - if( socket->state() == QLocalSocket::ConnectingState ) { - socket->waitForConnected( msecs ); - } - - // Initialisation message according to the SingleApplication protocol - if( socket->state() == QLocalSocket::ConnectedState ) { - // Notify the parent that a new instance had been started; - QByteArray initMsg; - QDataStream writeStream(&initMsg, QIODevice::WriteOnly); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - writeStream.setVersion(QDataStream::Qt_5_6); -#endif - - writeStream << blockServerName.toLatin1(); - writeStream << static_cast(connectionType); - writeStream << instanceNumber; - quint16 checksum = qChecksum(initMsg.constData(), static_cast(initMsg.length())); - writeStream << checksum; - - // The header indicates the message length that follows - QByteArray header; - QDataStream headerStream(&header, QIODevice::WriteOnly); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - headerStream.setVersion(QDataStream::Qt_5_6); -#endif - headerStream << static_cast ( initMsg.length() ); - - socket->write( header ); - socket->write( initMsg ); - socket->flush(); - socket->waitForBytesWritten( msecs ); - } -} - -quint16 SingleApplicationPrivate::blockChecksum() -{ - return qChecksum( - static_cast ( memory->data() ), - offsetof( InstancesInfo, checksum ) - ); -} - -qint64 SingleApplicationPrivate::primaryPid() -{ - qint64 pid; - - memory->lock(); - InstancesInfo* inst = static_cast( memory->data() ); - pid = inst->primaryPid; - memory->unlock(); - - return pid; -} - -/** - * @brief Executed when a connection has been made to the LocalServer - */ -void SingleApplicationPrivate::slotConnectionEstablished() -{ - QLocalSocket *nextConnSocket = server->nextPendingConnection(); - connectionMap.insert(nextConnSocket, ConnectionInfo()); - - QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, - [nextConnSocket, this]() { - auto &info = connectionMap[nextConnSocket]; - Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId ); - } - ); - - QObject::connect(nextConnSocket, &QLocalSocket::disconnected, - [nextConnSocket, this](){ - connectionMap.remove(nextConnSocket); - nextConnSocket->deleteLater(); - } - ); - - QObject::connect(nextConnSocket, &QLocalSocket::readyRead, - [nextConnSocket, this]() { - auto &info = connectionMap[nextConnSocket]; - switch(info.stage) { - case StageHeader: - readInitMessageHeader(nextConnSocket); - break; - case StageBody: - readInitMessageBody(nextConnSocket); - break; - case StageConnected: - Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId ); - break; - default: - break; - }; - } - ); -} - -void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock ) -{ - if (!connectionMap.contains( sock )) { - return; - } - - if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ) { - return; - } - - QDataStream headerStream( sock ); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - headerStream.setVersion( QDataStream::Qt_5_6 ); -#endif - - // Read the header to know the message length - quint64 msgLen = 0; - headerStream >> msgLen; - ConnectionInfo &info = connectionMap[sock]; - info.stage = StageBody; - info.msgLen = msgLen; - - if ( sock->bytesAvailable() >= (qint64) msgLen ) { - readInitMessageBody( sock ); - } -} - -void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock ) -{ - Q_Q(SingleApplication); - - if (!connectionMap.contains( sock )) { - return; - } - - ConnectionInfo &info = connectionMap[sock]; - if( sock->bytesAvailable() < ( qint64 )info.msgLen ) { - return; - } - - // Read the message body - QByteArray msgBytes = sock->read(info.msgLen); - QDataStream readStream(msgBytes); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - readStream.setVersion( QDataStream::Qt_5_6 ); -#endif - - // server name - QByteArray latin1Name; - readStream >> latin1Name; - - // connection type - ConnectionType connectionType = InvalidConnection; - quint8 connTypeVal = InvalidConnection; - readStream >> connTypeVal; - connectionType = static_cast ( connTypeVal ); - - // instance id - quint32 instanceId = 0; - readStream >> instanceId; - - // checksum - quint16 msgChecksum = 0; - readStream >> msgChecksum; - - const quint16 actualChecksum = qChecksum( msgBytes.constData(), static_cast( msgBytes.length() - sizeof( quint16 ) ) ); - - bool isValid = readStream.status() == QDataStream::Ok && - QLatin1String(latin1Name) == blockServerName && - msgChecksum == actualChecksum; - - if( !isValid ) { - sock->close(); - return; - } - - info.instanceId = instanceId; - info.stage = StageConnected; - - if( connectionType == NewInstance || - ( connectionType == SecondaryInstance && - options & SingleApplication::Mode::SecondaryNotification ) ) - { - Q_EMIT q->instanceStarted(); - } - - if (sock->bytesAvailable() > 0) { - Q_EMIT this->slotDataAvailable( sock, instanceId ); - } -} - -void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId ) -{ - Q_Q(SingleApplication); - Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() ); -} - -void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId ) -{ - if( closedSocket->bytesAvailable() > 0 ) - Q_EMIT slotDataAvailable( closedSocket, instanceId ); -} diff --git a/singleapplication/singleapplication_p.h b/singleapplication/singleapplication_p.h deleted file mode 100644 index e2c361fb..00000000 --- a/singleapplication/singleapplication_p.h +++ /dev/null @@ -1,99 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2016 -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -// -// W A R N I N G !!! -// ----------------- -// -// This file is not part of the SingleApplication API. It is used purely as an -// implementation detail. This header file may change from version to -// version without notice, or may even be removed. -// - -#ifndef SINGLEAPPLICATION_P_H -#define SINGLEAPPLICATION_P_H - -#include -#include -#include -#include "singleapplication.h" - -struct InstancesInfo { - bool primary; - quint32 secondary; - qint64 primaryPid; - quint16 checksum; -}; - -struct ConnectionInfo { - explicit ConnectionInfo() : - msgLen(0), instanceId(0), stage(0) {} - qint64 msgLen; - quint32 instanceId; - quint8 stage; -}; - -class SingleApplicationPrivate : public QObject { -Q_OBJECT -public: - enum ConnectionType : quint8 { - InvalidConnection = 0, - NewInstance = 1, - SecondaryInstance = 2, - Reconnect = 3 - }; - enum ConnectionStage : quint8 { - StageHeader = 0, - StageBody = 1, - StageConnected = 2, - }; - Q_DECLARE_PUBLIC(SingleApplication) - - SingleApplicationPrivate( SingleApplication *q_ptr ); - ~SingleApplicationPrivate(); - - void genBlockServerName(); - void initializeMemoryBlock(); - void startPrimary(); - void startSecondary(); - void connectToPrimary(int msecs, ConnectionType connectionType ); - quint16 blockChecksum(); - qint64 primaryPid(); - void readInitMessageHeader(QLocalSocket *socket); - void readInitMessageBody(QLocalSocket *socket); - - SingleApplication *q_ptr; - QSharedMemory *memory; - QLocalSocket *socket; - QLocalServer *server; - quint32 instanceNumber; - QString blockServerName; - SingleApplication::Options options; - QMap connectionMap; - -public Q_SLOTS: - void slotConnectionEstablished(); - void slotDataAvailable( QLocalSocket*, quint32 ); - void slotClientConnectionClosed( QLocalSocket*, quint32 ); -}; - -#endif // SINGLEAPPLICATION_P_H diff --git a/src/3rdparty/json/json.hpp b/src/3rdparty/json/json.hpp deleted file mode 100644 index c40620ad..00000000 --- a/src/3rdparty/json/json.hpp +++ /dev/null @@ -1,18928 +0,0 @@ -/* - __ _____ _____ _____ - __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 3.3.0 -|_____|_____|_____|_|___| https://github.com/nlohmann/json - -Licensed under the MIT License . -SPDX-License-Identifier: MIT -Copyright (c) 2013-2018 Niels Lohmann . - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#ifndef NLOHMANN_JSON_HPP -#define NLOHMANN_JSON_HPP - -#define NLOHMANN_JSON_VERSION_MAJOR 3 -#define NLOHMANN_JSON_VERSION_MINOR 3 -#define NLOHMANN_JSON_VERSION_PATCH 0 - -#include // all_of, find, for_each -#include // assert -#include // and, not, or -#include // nullptr_t, ptrdiff_t, size_t -#include // hash, less -#include // initializer_list -#include // istream, ostream -#include // iterator_traits, random_access_iterator_tag -#include // accumulate -#include // string, stoi, to_string -#include // declval, forward, move, pair, swap - -// #include -#ifndef NLOHMANN_JSON_FWD_HPP -#define NLOHMANN_JSON_FWD_HPP - -#include // int64_t, uint64_t -#include // map -#include // allocator -#include // string -#include // vector - -/*! -@brief namespace for Niels Lohmann -@see https://github.com/nlohmann -@since version 1.0.0 -*/ -namespace nlohmann -{ -/*! -@brief default JSONSerializer template argument - -This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) -for serialization. -*/ -template -struct adl_serializer; - -template class ObjectType = - std::map, - template class ArrayType = std::vector, - class StringType = std::string, class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator, - template class JSONSerializer = - adl_serializer> -class basic_json; - -/*! -@brief JSON Pointer - -A JSON pointer defines a string syntax for identifying a specific value -within a JSON document. It can be used with functions `at` and -`operator[]`. Furthermore, JSON pointers are the base for JSON patches. - -@sa [RFC 6901](https://tools.ietf.org/html/rfc6901) - -@since version 2.0.0 -*/ -template -class json_pointer; - -/*! -@brief default JSON class - -This type is the default specialization of the @ref basic_json class which -uses the standard template types. - -@since version 1.0.0 -*/ -using json = basic_json<>; -} - -#endif - -// #include - - -// This file contains all internal macro definitions -// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them - -// exclude unsupported compilers -#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) - #if defined(__clang__) - #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 - #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" - #endif - #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 - #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" - #endif - #endif -#endif - -// disable float-equal warnings on GCC/clang -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wfloat-equal" -#endif - -// disable documentation warnings on clang -#if defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdocumentation" -#endif - -// allow for portable deprecation warnings -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #define JSON_DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) - #define JSON_DEPRECATED __declspec(deprecated) -#else - #define JSON_DEPRECATED -#endif - -// allow to disable exceptions -#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) - #define JSON_THROW(exception) throw exception - #define JSON_TRY try - #define JSON_CATCH(exception) catch(exception) - #define JSON_INTERNAL_CATCH(exception) catch(exception) -#else - #define JSON_THROW(exception) std::abort() - #define JSON_TRY if(true) - #define JSON_CATCH(exception) if(false) - #define JSON_INTERNAL_CATCH(exception) if(false) -#endif - -// override exception macros -#if defined(JSON_THROW_USER) - #undef JSON_THROW - #define JSON_THROW JSON_THROW_USER -#endif -#if defined(JSON_TRY_USER) - #undef JSON_TRY - #define JSON_TRY JSON_TRY_USER -#endif -#if defined(JSON_CATCH_USER) - #undef JSON_CATCH - #define JSON_CATCH JSON_CATCH_USER - #undef JSON_INTERNAL_CATCH - #define JSON_INTERNAL_CATCH JSON_CATCH_USER -#endif -#if defined(JSON_INTERNAL_CATCH_USER) - #undef JSON_INTERNAL_CATCH - #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER -#endif - -// manual branch prediction -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #define JSON_LIKELY(x) __builtin_expect(!!(x), 1) - #define JSON_UNLIKELY(x) __builtin_expect(!!(x), 0) -#else - #define JSON_LIKELY(x) x - #define JSON_UNLIKELY(x) x -#endif - -// C++ language standard detection -#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 - #define JSON_HAS_CPP_17 - #define JSON_HAS_CPP_14 -#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) - #define JSON_HAS_CPP_14 -#endif - -// Ugly macros to avoid uglier copy-paste when specializing basic_json. They -// may be removed in the future once the class is split. - -#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ - template class ObjectType, \ - template class ArrayType, \ - class StringType, class BooleanType, class NumberIntegerType, \ - class NumberUnsignedType, class NumberFloatType, \ - template class AllocatorType, \ - template class JSONSerializer> - -#define NLOHMANN_BASIC_JSON_TPL \ - basic_json - -// #include - - -#include // not -#include // size_t -#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type - -namespace nlohmann -{ -namespace detail -{ -// alias templates to reduce boilerplate -template -using enable_if_t = typename std::enable_if::type; - -template -using uncvref_t = typename std::remove_cv::type>::type; - -// implementation of C++14 index_sequence and affiliates -// source: https://stackoverflow.com/a/32223343 -template -struct index_sequence -{ - using type = index_sequence; - using value_type = std::size_t; - static constexpr std::size_t size() noexcept - { - return sizeof...(Ints); - } -}; - -template -struct merge_and_renumber; - -template -struct merge_and_renumber, index_sequence> - : index_sequence < I1..., (sizeof...(I1) + I2)... > {}; - -template -struct make_index_sequence - : merge_and_renumber < typename make_index_sequence < N / 2 >::type, - typename make_index_sequence < N - N / 2 >::type > {}; - -template<> struct make_index_sequence<0> : index_sequence<> {}; -template<> struct make_index_sequence<1> : index_sequence<0> {}; - -template -using index_sequence_for = make_index_sequence; - -// dispatch utility (taken from ranges-v3) -template struct priority_tag : priority_tag < N - 1 > {}; -template<> struct priority_tag<0> {}; - -// taken from ranges-v3 -template -struct static_const -{ - static constexpr T value{}; -}; - -template -constexpr T static_const::value; -} -} - -// #include - - -#include // not -#include // numeric_limits -#include // false_type, is_constructible, is_integral, is_same, true_type -#include // declval - -// #include - -// #include - -// #include - - -#include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template struct make_void -{ - using type = void; -}; -template using void_t = typename make_void::type; -} -} - - -// http://en.cppreference.com/w/cpp/experimental/is_detected -namespace nlohmann -{ -namespace detail -{ -struct nonesuch -{ - nonesuch() = delete; - ~nonesuch() = delete; - nonesuch(nonesuch const&) = delete; - void operator=(nonesuch const&) = delete; -}; - -template class Op, - class... Args> -struct detector -{ - using value_t = std::false_type; - using type = Default; -}; - -template class Op, class... Args> -struct detector>, Op, Args...> -{ - using value_t = std::true_type; - using type = Op; -}; - -template