diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..8bf752df88 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +node_modules/ +src/node_modules/ + diff --git a/.eslintrc b/.eslintrc index 4bf98c890d..c3b6262cd3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,21 +1,90 @@ { - "parser": "babel-eslint", - "plugins": [ - "react", "prettier" + "env": { + "jest": true, + "react-native/react-native": true + }, + "extends": [ + "plugin:react/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/typescript", + "prettier", + "prettier/react" ], - "extends": ["standard", "standard-react", "prettier"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2019, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "plugins": ["@typescript-eslint", "react", "react-native", "react-hooks", "import", "prettier"], + "settings": { + "react": { + "version": "detect" + }, + "import/resolver": { + "node": { + "extensions": [".js", ".jsx", ".ts", ".tsx"] + } + } + }, "rules": { - 'prettier/prettier': [ - 'warn', + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/class-name-casing": "warn", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/member-delimiter-style": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/indent": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-this-alias": "warn", + "@typescript-eslint/no-empty-function": "warn", + "no-async-promise-executor": "warn", + "no-case-declarations": "off", + "no-prototype-builtins": "off", + "no-empty": ["error", { "allowEmptyCatch": true }], + "no-undef": "warn", + "no-shadow": ["warn", { "allow": ["done"] }], + "no-console": "warn", + "no-redeclare": "warn", + "no-var": "warn", + "object-shorthand": "warn", + "require-atomic-updates": "off", + "prettier/prettier": "error", + "prefer-const": "warn", + "react/display-name": "off", + "react/prop-types": "warn", + "react/no-unescaped-entities": "warn", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "react-native/no-color-literals": "warn", + "react-native/no-raw-text": "warn", + "react-native/no-single-element-style-arrays": "warn", + "react-native/no-unused-styles": "warn", + "import/newline-after-import": "error", + "import/no-duplicates": "error", + "import/order": [ + "error", { - singleQuote: true, - printWidth: 140, - trailingComma: 'all' + "groups": [ + ["builtin", "external"], + ["internal", "parent", "sibling", "index", "unknown"] + ], + "pathGroups": [ + { + "pattern": "app/**", + "group": "internal", + "position": "before" + } + ], + "pathGroupsExcludedImportTypes": ["builtin"], + "alphabetize": { "order": "asc" }, + "newlines-between": "always" } ] - }, - "env":{ - "es6": true - }, - "globals": { "fetch": false } + } } diff --git a/.flowconfig b/.flowconfig index ebf6585f6e..c56efc966f 100644 --- a/.flowconfig +++ b/.flowconfig @@ -43,7 +43,6 @@ module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' module.system.haste.paths.blacklist=.*/__tests__/.* -module.system.haste.paths.blacklist=.*/__mocks__/.* module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* diff --git a/.gitignore b/.gitignore index 4e6fc7f1e4..f5c40985dd 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ build/ .gradle local.properties *.iml +!debug.keystore # node.js # @@ -60,3 +61,9 @@ release-notes.json release-notes.txt ios/Pods/ + +#Firebase +/ios/GoogleService-Info.plist +android/app/google-services.json + +.history diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000000..f4de05b0bf --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,9 @@ +module.exports = { + bracketSpacing: true, + singleQuote: true, + trailingComma: 'all', + printWidth: 120, + semi: true, + tabWidth: 2, + useTabs: false, +}; diff --git a/App.js b/App.js deleted file mode 100644 index 02cdaa5da3..0000000000 --- a/App.js +++ /dev/null @@ -1,326 +0,0 @@ -import React from 'react'; -import { Linking, AppState, Clipboard, StyleSheet, KeyboardAvoidingView, Platform, View } from 'react-native'; -import AsyncStorage from '@react-native-community/async-storage'; -import Modal from 'react-native-modal'; -import { NavigationActions } from 'react-navigation'; -import MainBottomTabs from './MainBottomTabs'; -import NavigationService from './NavigationService'; -import { BlueTextCentered, BlueButton } from './BlueComponents'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import url from 'url'; -import { AppStorage, LightningCustodianWallet } from './class'; -import { Chain } from './models/bitcoinUnits'; - -import * as Sentry from '@sentry/react-native'; - -if (process.env.NODE_ENV !== 'development') { - Sentry.init({ - dsn: 'https://23377936131848ca8003448a893cb622@sentry.io/1295736', - }); -} - -const bitcoin = require('bitcoinjs-lib'); -const bitcoinModalString = 'Bitcoin address'; -const lightningModalString = 'Lightning Invoice'; -const loc = require('./loc'); -/** @type {AppStorage} */ -const BlueApp = require('./BlueApp'); - -export default class App extends React.Component { - navigator = null; - - state = { - appState: AppState.currentState, - isClipboardContentModalVisible: false, - clipboardContentModalAddressType: bitcoinModalString, - clipboardContent: '', - }; - - componentDidMount() { - Linking.getInitialURL() - .then(url => { - if (this.hasSchema(url)) { - this.handleOpenURL({ url }); - } - }) - .catch(console.error); - Linking.addEventListener('url', this.handleOpenURL); - AppState.addEventListener('change', this._handleAppStateChange); - } - - componentWillUnmount() { - Linking.removeEventListener('url', this.handleOpenURL); - AppState.removeEventListener('change', this._handleAppStateChange); - } - - _handleAppStateChange = async nextAppState => { - if (BlueApp.getWallets().length > 0) { - if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') { - const clipboard = await Clipboard.getString(); - const isAddressFromStoredWallet = BlueApp.getWallets().some(wallet => - wallet.chain === Chain.ONCHAIN ? wallet.weOwnAddress(clipboard) : wallet.isInvoiceGeneratedByWallet(clipboard), - ); - if ( - !isAddressFromStoredWallet && - this.state.clipboardContent !== clipboard && - (this.isBitcoinAddress(clipboard) || this.isLightningInvoice(clipboard) || this.isLnUrl(clipboard)) - ) { - this.setState({ isClipboardContentModalVisible: true }); - } - this.setState({ clipboardContent: clipboard }); - } - this.setState({ appState: nextAppState }); - } - }; - - hasSchema(schemaString) { - if (typeof schemaString !== 'string' || schemaString.length <= 0) return false; - const lowercaseString = schemaString.trim().toLowerCase(); - return ( - lowercaseString.startsWith('bitcoin:') || - lowercaseString.startsWith('lightning:') || - lowercaseString.startsWith('blue:') || - lowercaseString.startsWith('bluewallet:') || - lowercaseString.startsWith('lapp:') - ); - } - - isBitcoinAddress(address) { - let isValidBitcoinAddress = false; - try { - bitcoin.address.toOutputScript(address); - isValidBitcoinAddress = true; - this.setState({ clipboardContentModalAddressType: bitcoinModalString }); - } catch (err) { - isValidBitcoinAddress = false; - } - if (!isValidBitcoinAddress) { - if (address.indexOf('bitcoin:') === 0 || address.indexOf('BITCOIN:') === 0) { - isValidBitcoinAddress = true; - this.setState({ clipboardContentModalAddressType: bitcoinModalString }); - } - } - return isValidBitcoinAddress; - } - - isLightningInvoice(invoice) { - let isValidLightningInvoice = false; - if (invoice.toLowerCase().startsWith('lightning:lnb') || invoice.toLowerCase().startsWith('lnb')) { - this.setState({ clipboardContentModalAddressType: lightningModalString }); - isValidLightningInvoice = true; - } - return isValidLightningInvoice; - } - - isLnUrl(text) { - if (text.toLowerCase().startsWith('lightning:lnurl') || text.toLowerCase().startsWith('lnurl')) { - return true; - } - return false; - } - - isSafelloRedirect(event) { - let urlObject = url.parse(event.url, true) // eslint-disable-line - - return !!urlObject.query['safello-state-token']; - } - - handleOpenURL = event => { - if (event.url === null) { - return; - } - if (typeof event.url !== 'string') { - return; - } - if (this.isBitcoinAddress(event.url)) { - this.navigator && - this.navigator.dispatch( - NavigationActions.navigate({ - routeName: 'SendDetails', - params: { - uri: event.url, - }, - }), - ); - } else if (this.isLightningInvoice(event.url)) { - this.navigator && - this.navigator.dispatch( - NavigationActions.navigate({ - routeName: 'ScanLndInvoice', - params: { - uri: event.url, - }, - }), - ); - } else if (this.isLnUrl(event.url)) { - this.navigator && - this.navigator.dispatch( - NavigationActions.navigate({ - routeName: 'LNDCreateInvoice', - params: { - uri: event.url, - }, - }), - ); - } else if (this.isSafelloRedirect(event)) { - let urlObject = url.parse(event.url, true) // eslint-disable-line - - const safelloStateToken = urlObject.query['safello-state-token']; - - this.navigator && - this.navigator.dispatch( - NavigationActions.navigate({ - routeName: 'BuyBitcoin', - params: { - uri: event.url, - safelloStateToken, - }, - }), - ); - } else { - let urlObject = url.parse(event.url, true); // eslint-disable-line - console.log('parsed', urlObject); - (async () => { - if (urlObject.protocol === 'bluewallet:' || urlObject.protocol === 'lapp:' || urlObject.protocol === 'blue:') { - switch (urlObject.host) { - case 'openlappbrowser': - console.log('opening LAPP', urlObject.query.url); - // searching for LN wallet: - let haveLnWallet = false; - for (let w of BlueApp.getWallets()) { - if (w.type === LightningCustodianWallet.type) { - haveLnWallet = true; - } - } - - if (!haveLnWallet) { - // need to create one - let w = new LightningCustodianWallet(); - w.setLabel(this.state.label || w.typeReadable); - - try { - let lndhub = await AsyncStorage.getItem(AppStorage.LNDHUB); - if (lndhub) { - w.setBaseURI(lndhub); - w.init(); - } - await w.createAccount(); - await w.authorize(); - } catch (Err) { - // giving up, not doing anything - return; - } - BlueApp.wallets.push(w); - await BlueApp.saveToDisk(); - } - - // now, opening lapp browser and navigating it to URL. - // looking for a LN wallet: - let lnWallet; - for (let w of BlueApp.getWallets()) { - if (w.type === LightningCustodianWallet.type) { - lnWallet = w; - break; - } - } - - if (!lnWallet) { - // something went wrong - return; - } - - this.navigator && - this.navigator.dispatch( - NavigationActions.navigate({ - routeName: 'LappBrowser', - params: { - fromSecret: lnWallet.getSecret(), - fromWallet: lnWallet, - url: urlObject.query.url, - }, - }), - ); - break; - } - } - })(); - } - }; - - renderClipboardContentModal = () => { - return ( - ReactNativeHapticFeedback.trigger('impactLight', { ignoreAndroidSystemSettings: false })} - isVisible={this.state.isClipboardContentModalVisible} - style={styles.bottomModal} - onBackdropPress={() => { - this.setState({ isClipboardContentModalVisible: false }); - }} - > - - - - You have a {this.state.clipboardContentModalAddressType} on your clipboard. Would you like to use it for a transaction? - - - this.setState({ isClipboardContentModalVisible: false })} - /> - - { - this.setState({ isClipboardContentModalVisible: false }, async () => { - const clipboard = await Clipboard.getString(); - setTimeout(() => this.handleOpenURL({ url: clipboard }), 100); - }); - }} - /> - - - - - ); - }; - - render() { - return ( - - { - this.navigator = nav; - NavigationService.setTopLevelNavigator(nav); - }} - /> - {this.renderClipboardContentModal()} - - ); - } -} - -const styles = StyleSheet.create({ - modalContent: { - backgroundColor: '#FFFFFF', - padding: 22, - justifyContent: 'center', - alignItems: 'center', - borderTopLeftRadius: 16, - borderTopRightRadius: 16, - borderColor: 'rgba(0, 0, 0, 0.1)', - minHeight: 200, - height: 200, - }, - bottomModal: { - justifyContent: 'flex-end', - margin: 0, - }, - modelContentButtonLayout: { - flexDirection: 'row', - margin: 16, - justifyContent: 'space-between', - alignItems: 'flex-end', - }, -}); diff --git a/App.tsx b/App.tsx new file mode 100644 index 0000000000..bd3ff8318a --- /dev/null +++ b/App.tsx @@ -0,0 +1,93 @@ +import { NavigationContainer } from '@react-navigation/native'; +import * as Sentry from '@sentry/react-native'; +import React from 'react'; +import { I18nextProvider } from 'react-i18next'; +import { View, YellowBox, StyleSheet } from 'react-native'; +import { Provider } from 'react-redux'; +import { PersistGate } from 'redux-persist/integration/react'; + +import { BlueApp } from 'app/legacy'; +import { i18n } from 'app/locale'; +import { RootNavigator } from 'app/navigators'; +import { UnlockScreen } from 'app/screens'; +import { SecureStorageService, AppStateManager, navigationRef } from 'app/services'; +import { persistor, store } from 'app/state/store'; + +YellowBox.ignoreWarnings(['VirtualizedLists should never be nested inside', `\`-[RCTRootView cancelTouches]\``]); + +if (process.env.NODE_ENV !== 'development') { + Sentry.init({ + dsn: 'https://23377936131848ca8003448a893cb622@sentry.io/1295736', + }); +} + +interface State { + isPinSet: boolean; + successfullyAuthenticated: boolean; +} + +export default class App extends React.PureComponent { + state: State = { + isPinSet: false, + successfullyAuthenticated: false, + }; + + async componentDidMount() { + const isPinSet = await SecureStorageService.getSecuredValue('pin'); + if (isPinSet) { + this.setState({ isPinSet }); + } + } + + handleAppComesToForeground = async () => { + this.setState({ + successfullyAuthenticated: false, + }); + }; + + onSuccessfullyAuthenticated = () => { + this.setState({ + successfullyAuthenticated: true, + }); + }; + + get showUnlockScreen(): boolean { + if (__DEV__) { + // do not check PIN during development + BlueApp.startAndDecrypt(); + return false; + } + const { successfullyAuthenticated, isPinSet } = this.state; + return isPinSet && !successfullyAuthenticated; + } + + render() { + const isBiometricEnabledByUser = store.getState().appSettings.isBiometricsEnabled; + return ( + + + + + + + + {this.showUnlockScreen && ( + + )} + + + + + + ); + } +} + +const styles = StyleSheet.create({ + wrapper: { + flex: 1, + }, +}); diff --git a/BlueApp.js b/BlueApp.js index 641b6e093e..48cee086ff 100644 --- a/BlueApp.js +++ b/BlueApp.js @@ -2,11 +2,12 @@ * @exports {AppStorage} */ import { AppStorage } from './class'; -let prompt = require('./prompt'); -let EV = require('./events'); -let currency = require('./currency'); -let loc = require('./loc'); -let BlueElectrum = require('./BlueElectrum'); // eslint-disable-line +import DeviceQuickActions from './class/quickActions'; + +const currency = require('./currency'); +const EV = require('./events'); +const loc = require('./loc'); +const prompt = require('./prompt'); /** @type {AppStorage} */ const BlueApp = new AppStorage(); @@ -19,11 +20,12 @@ async function startAndDecrypt(retry) { } let password = false; if (await BlueApp.storageIsEncrypted()) { + DeviceQuickActions.clearShortcutItems(); do { password = await prompt((retry && loc._.bad_password) || loc._.enter_password, loc._.storage_is_encrypted, false); } while (!password); } - let success = await BlueApp.loadFromDisk(password); + const success = await BlueApp.loadFromDisk(password); if (success) { console.log('loaded from disk'); EV(EV.enum.WALLETS_COUNT_CHANGED); @@ -68,3 +70,4 @@ BlueApp.startAndDecrypt = startAndDecrypt; currency.startUpdater(); module.exports = BlueApp; +export default BlueApp; diff --git a/BlueComponents.js b/BlueComponents.js deleted file mode 100644 index a0772cebb7..0000000000 --- a/BlueComponents.js +++ /dev/null @@ -1,2230 +0,0 @@ -/* eslint react/prop-types: 0 */ -/** @type {AppStorage} */ -import React, { Component, useEffect, useState } from 'react'; -import Ionicons from 'react-native-vector-icons/Ionicons'; -import PropTypes from 'prop-types'; -import { Icon, FormLabel, FormInput, Text, Header, List, ListItem } from 'react-native-elements'; -import { - TouchableOpacity, - TouchableWithoutFeedback, - Animated, - ActivityIndicator, - View, - KeyboardAvoidingView, - UIManager, - StyleSheet, - Dimensions, - Image, - Keyboard, - SafeAreaView, - InputAccessoryView, - Clipboard, - Platform, - TextInput, -} from 'react-native'; -import LinearGradient from 'react-native-linear-gradient'; -import { LightningCustodianWallet } from './class'; -import Carousel from 'react-native-snap-carousel'; -import { BitcoinUnit } from './models/bitcoinUnits'; -import NavigationService from './NavigationService'; -import WalletGradient from './class/walletGradient'; -import ToolTip from 'react-native-tooltip'; -import { BlurView } from '@react-native-community/blur'; -import showPopupMenu from 'react-native-popup-menu-android'; -import NetworkTransactionFees, { NetworkTransactionFeeType } from './models/networkTransactionFees'; -import Biometric from './class/biometrics'; -let loc = require('./loc/'); -/** @type {AppStorage} */ -let BlueApp = require('./BlueApp'); -const { height, width } = Dimensions.get('window'); -const aspectRatio = height / width; -const BigNumber = require('bignumber.js'); -let isIpad; -if (aspectRatio > 1.6) { - isIpad = false; -} else { - isIpad = true; -} - -export class BlueButton extends Component { - render() { - let backgroundColor = this.props.backgroundColor ? this.props.backgroundColor : BlueApp.settings.buttonBackgroundColor; - let fontColor = BlueApp.settings.buttonTextColor; - if (this.props.hasOwnProperty('disabled') && this.props.disabled === true) { - backgroundColor = BlueApp.settings.buttonDisabledBackgroundColor; - fontColor = BlueApp.settings.buttonDisabledTextColor; - } - let buttonWidth = width / 1.5; - if (this.props.hasOwnProperty('noMinWidth')) { - buttonWidth = 0; - } - return ( - - - {this.props.icon && } - {this.props.title && {this.props.title}} - - - ); - } -} - -export class BitcoinButton extends Component { - render() { - return ( - { - // eslint-disable-next-line - if (this.props.onPress) this.props.onPress(); - }} - > - - - {loc.wallets.add.bitcoin} - - - - - ); - } -} - -export class LightningButton extends Component { - render() { - return ( - { - // eslint-disable-next-line - if (this.props.onPress) this.props.onPress(); - }} - > - - - {loc.wallets.add.lightning} - - - - - ); - } -} - -export class BlueWalletNavigationHeader extends Component { - static propTypes = { - wallet: PropTypes.shape().isRequired, - onWalletUnitChange: PropTypes.func, - }; - - static getDerivedStateFromProps(props, _state) { - return { wallet: props.wallet, onWalletUnitChange: props.onWalletUnitChange }; - } - - constructor(props) { - super(props); - this.state = { wallet: props.wallet, walletPreviousPreferredUnit: props.wallet.getPreferredBalanceUnit() }; - } - - handleCopyPress = _item => { - Clipboard.setString(loc.formatBalance(this.state.wallet.getBalance(), this.state.wallet.getPreferredBalanceUnit()).toString()); - }; - - handleBalanceVisibility = async _item => { - const wallet = this.state.wallet; - - const isBiometricsEnabled = await Biometric.isBiometricUseCapableAndEnabled(); - - if (isBiometricsEnabled && wallet.hideBalance) { - if (!(await Biometric.unlockWithBiometrics())) { - return this.props.navigation.goBack(); - } - } - - wallet.hideBalance = !wallet.hideBalance; - this.setState({ wallet }); - await BlueApp.saveToDisk(); - }; - - showAndroidTooltip = () => { - showPopupMenu(this.toolTipMenuOptions(), this.handleToolTipSelection, this.walletBalanceText); - }; - - handleToolTipSelection = item => { - if (item === loc.transactions.details.copy || item.id === loc.transactions.details.copy) { - this.handleCopyPress(); - } else if (item === 'balancePrivacy' || item.id === 'balancePrivacy') { - this.handleBalanceVisibility(); - } - }; - - toolTipMenuOptions() { - return Platform.select({ - // NOT WORKING ATM. - // ios: [ - // { text: this.state.wallet.hideBalance ? 'Show Balance' : 'Hide Balance', onPress: this.handleBalanceVisibility }, - // { text: loc.transactions.details.copy, onPress: this.handleCopyPress }, - // ], - android: this.state.wallet.hideBalance - ? [{ id: 'balancePrivacy', label: this.state.wallet.hideBalance ? 'Show Balance' : 'Hide Balance' }] - : [ - { id: 'balancePrivacy', label: this.state.wallet.hideBalance ? 'Show Balance' : 'Hide Balance' }, - { id: loc.transactions.details.copy, label: loc.transactions.details.copy }, - ], - }); - } - - changeWalletBalanceUnit() { - let walletPreviousPreferredUnit = this.state.wallet.getPreferredBalanceUnit(); - const wallet = this.state.wallet; - if (walletPreviousPreferredUnit === BitcoinUnit.BTC) { - wallet.preferredBalanceUnit = BitcoinUnit.SATS; - walletPreviousPreferredUnit = BitcoinUnit.BTC; - } else if (walletPreviousPreferredUnit === BitcoinUnit.SATS) { - wallet.preferredBalanceUnit = BitcoinUnit.LOCAL_CURRENCY; - walletPreviousPreferredUnit = BitcoinUnit.SATS; - } else if (walletPreviousPreferredUnit === BitcoinUnit.LOCAL_CURRENCY) { - wallet.preferredBalanceUnit = BitcoinUnit.BTC; - walletPreviousPreferredUnit = BitcoinUnit.BTC; - } else { - wallet.preferredBalanceUnit = BitcoinUnit.BTC; - walletPreviousPreferredUnit = BitcoinUnit.BTC; - } - - this.setState({ wallet, walletPreviousPreferredUnit: walletPreviousPreferredUnit }, () => { - this.props.onWalletUnitChange(wallet); - }); - } - - manageFundsPressed = () => { - this.props.onManageFundsPressed(); - }; - - render() { - return ( - - - - - {this.state.wallet.getLabel()} - - {Platform.OS === 'ios' && ( - (this.tooltip = tooltip)} - actions={ - this.state.wallet.hideBalance - ? [{ text: this.state.wallet.hideBalance ? 'Show Balance' : 'Hide Balance', onPress: this.handleBalanceVisibility }] - : [ - { text: this.state.wallet.hideBalance ? 'Show Balance' : 'Hide Balance', onPress: this.handleBalanceVisibility }, - { text: loc.transactions.details.copy, onPress: this.handleCopyPress }, - ] - } - /> - )} - this.changeWalletBalanceUnit()} - ref={ref => (this.walletBalanceText = ref)} - onLongPress={() => (Platform.OS === 'ios' ? this.tooltip.showMenu() : this.showAndroidTooltip())} - > - {this.state.wallet.hideBalance ? ( - - ) : ( - - {loc.formatBalance(this.state.wallet.getBalance(), this.state.wallet.getPreferredBalanceUnit(), true).toString()} - - )} - - {this.state.wallet.type === LightningCustodianWallet.type && ( - - - - {loc.lnd.title} - - - - )} - - ); - } -} - -export class BlueButtonLink extends Component { - render() { - return ( - - {this.props.title} - - ); - } -} - -export const BlueNavigationStyle = (navigation, withNavigationCloseButton = false, customCloseButtonFunction = undefined) => ({ - headerStyle: { - backgroundColor: BlueApp.settings.brandingColor, - borderBottomWidth: 0, - elevation: 0, - }, - headerTitleStyle: { - fontWeight: '600', - color: BlueApp.settings.foregroundColor, - }, - headerTintColor: BlueApp.settings.foregroundColor, - headerRight: withNavigationCloseButton ? ( - { - Keyboard.dismiss(); - navigation.goBack(null); - } - : customCloseButtonFunction - } - > - - - ) : null, - headerBackTitle: null, -}); - -export const BlueCreateTxNavigationStyle = (navigation, withAdvancedOptionsMenuButton = false, advancedOptionsMenuButtonAction) => ({ - headerStyle: { - backgroundColor: BlueApp.settings.brandingColor, - borderBottomWidth: 0, - elevation: 0, - }, - headerTitleStyle: { - fontWeight: '600', - color: BlueApp.settings.foregroundColor, - }, - headerTintColor: BlueApp.settings.foregroundColor, - headerLeft: ( - { - Keyboard.dismiss(); - navigation.goBack(null); - }} - > - - - ), - headerRight: withAdvancedOptionsMenuButton ? ( - - - - ) : null, - headerBackTitle: null, -}); - -export const BluePrivateBalance = () => { - return Platform.select({ - ios: ( - - - - - ), - android: ( - - - - - ), - }); -}; - -export const BlueCopyToClipboardButton = ({ stringToCopy, displayText = false }) => { - return ( - Clipboard.setString(stringToCopy)}> - {displayText || loc.transactions.details.copy} - - ); -}; - -export class BlueCopyTextToClipboard extends Component { - static propTypes = { - text: PropTypes.string, - }; - - static defaultProps = { - text: '', - }; - - constructor(props) { - super(props); - if (Platform.OS === 'android') { - UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true); - } - this.state = { hasTappedText: false, address: props.text }; - } - - static getDerivedStateFromProps(props, state) { - if (state.hasTappedText) { - return { hasTappedText: state.hasTappedText, address: state.address }; - } else { - return { hasTappedText: state.hasTappedText, address: props.text }; - } - } - - copyToClipboard = () => { - this.setState({ hasTappedText: true }, () => { - Clipboard.setString(this.props.text); - this.setState({ address: loc.wallets.xpub.copiedToClipboard }, () => { - setTimeout(() => { - this.setState({ hasTappedText: false, address: this.props.text }); - }, 1000); - }); - }); - }; - - render() { - return ( - - - - {this.state.address} - - - - ); - } -} - -const styleCopyTextToClipboard = StyleSheet.create({ - address: { - marginVertical: 32, - fontSize: 15, - color: '#9aa0aa', - textAlign: 'center', - }, -}); - -export class SafeBlueArea extends Component { - render() { - return ( - - ); - } -} - -export class BlueCard extends Component { - render() { - return ; - } -} - -export class BlueText extends Component { - render() { - return ( - - ); - } -} -export class BlueTextCentered extends Component { - render() { - return ; - } -} - -export class BlueListItem extends Component { - render() { - return ( - - ); - } -} - -export class BlueFormLabel extends Component { - render() { - return ; - } -} - -export class BlueFormInput extends Component { - render() { - return ( - - ); - } -} - -export class BlueFormMultiInput extends Component { - constructor(props) { - super(props); - this.state = { - selection: { start: 0, end: 0 }, - }; - } - - render() { - return ( - - ); - } -} - -export class BlueHeader extends Component { - render() { - return ( -
- ); - } -} - -export class BlueHeaderDefaultSub extends Component { - render() { - return ( - -
- { - // eslint-disable-next-line - this.props.leftText - } - - } - rightComponent={ - { - // eslint-disable-next-line - if (this.props.onClose) this.props.onClose(); - }} - > - - - - - - - } - {...this.props} - /> - - ); - } -} - -export class BlueHeaderDefaultMain extends Component { - render() { - return ( - -
- { - // eslint-disable-next-line - this.props.leftText - } - - } - rightComponent={ - - - - } - /> - - ); - } -} - -export class BlueSpacing extends Component { - render() { - return ; - } -} - -export class BlueSpacing40 extends Component { - render() { - return ; - } -} - -export class BlueSpacingVariable extends Component { - render() { - if (isIpad) { - return ; - } else { - return ; - } - } -} - -export class is { - static ipad() { - return isIpad; - } -} - -export class BlueSpacing20 extends Component { - render() { - return ; - } -} - -export class BlueSpacing10 extends Component { - render() { - return ; - } -} - -export class BlueList extends Component { - render() { - return ( - - ); - } -} - -export class BlueUseAllFundsButton extends Component { - static InputAccessoryViewID = 'useMaxInputAccessoryViewID'; - static propTypes = { - wallet: PropTypes.shape().isRequired, - onUseAllPressed: PropTypes.func.isRequired, - }; - - render() { - const inputView = ( - - - - Total: - - {this.props.wallet.allowSendMax() && this.props.wallet.getBalance() > 0 ? ( - - ) : ( - - {loc.formatBalanceWithoutSuffix(this.props.wallet.getBalance(), BitcoinUnit.BTC, true).toString()} {BitcoinUnit.BTC} - - )} - - - Keyboard.dismiss()} - /> - - - ); - if (Platform.OS === 'ios') { - return {inputView}; - } else { - return {inputView}; - } - } -} - -export class BlueDismissKeyboardInputAccessory extends Component { - static InputAccessoryViewID = 'BlueDismissKeyboardInputAccessory'; - - render() { - return Platform.OS !== 'ios' ? null : ( - - - Keyboard.dismiss()} /> - - - ); - } -} - -export class BlueDoneAndDismissKeyboardInputAccessory extends Component { - static InputAccessoryViewID = 'BlueDoneAndDismissKeyboardInputAccessory'; - - onPasteTapped = async () => { - const clipboard = await Clipboard.getString(); - this.props.onPasteTapped(clipboard); - }; - - render() { - const inputView = ( - - - - Keyboard.dismiss()} /> - - ); - - if (Platform.OS === 'ios') { - return {inputView}; - } else { - return {inputView}; - } - } -} - -export class BlueLoading extends Component { - render() { - return ( - - - - - - ); - } -} - -const stylesBlueIcon = StyleSheet.create({ - container: { - flex: 1, - }, - box1: { - position: 'relative', - top: 15, - }, - box: { - alignSelf: 'flex-end', - paddingHorizontal: 14, - paddingTop: 8, - }, - boxIncoming: { - position: 'relative', - }, - ball: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: '#ccddf9', - }, - ballIncoming: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: '#d2f8d6', - transform: [{ rotate: '-45deg' }], - }, - ballIncomingWithoutRotate: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: '#d2f8d6', - }, - ballReceive: { - width: 30, - height: 30, - borderBottomLeftRadius: 15, - backgroundColor: '#d2f8d6', - transform: [{ rotate: '-45deg' }], - }, - ballOutgoing: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: '#f8d2d2', - transform: [{ rotate: '225deg' }], - }, - ballOutgoingWithoutRotate: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: '#f8d2d2', - }, - ballTransparrent: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: 'transparent', - }, - ballDimmed: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: 'gray', - }, -}); -export class BluePlusIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionIncomingIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionPendingIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionExpiredIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionOnchainIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionOffchainIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionOffchainIncomingIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class BlueTransactionOutgoingIcon extends Component { - render() { - return ( - - - - - - - - ); - } -} - -// - -export class BlueReceiveButtonIcon extends Component { - render() { - return ( - - - - - - - - {loc.receive.header} - - - - - ); - } -} - -export class BlueSendButtonIcon extends Component { - render() { - return ( - - - - - - - - {loc.send.header} - - - - - ); - } -} - -export class ManageFundsBigButton extends Component { - render() { - return ( - - - - - - - - {loc.lnd.title} - - - - - ); - } -} - -export class BluePlusIconDimmed extends Component { - render() { - return ( - - - - - - - - ); - } -} - -export class NewWalletPanel extends Component { - constructor(props) { - super(props); - // WalletsCarousel.handleClick = props.handleClick // because cant access `this` from _renderItem - // eslint-disable-next-line - this.handleClick = props.onPress; - } - - render() { - return ( - { - if (this.handleClick) { - this.handleClick(); - } - }} - style={{ marginVertical: 17 }} - > - - - - {loc.wallets.list.create_a_wallet} - - - - {loc.wallets.list.create_a_wallet1} - - - {loc.wallets.list.create_a_wallet2} - - - - ); - } -} - -export const BlueTransactionListItem = ({ item, itemPriceUnit = BitcoinUnit.BTC }) => { - const calculateTimeLabel = () => { - const transactionTimeToReadable = loc.transactionTimeToReadable(item.received); - return setTransactionTimeToReadable(transactionTimeToReadable); - }; - const interval = setInterval(() => calculateTimeLabel(), 60000); - const [transactionTimeToReadable, setTransactionTimeToReadable] = useState('...'); - const [subtitleNumberOfLines, setSubtitleNumberOfLines] = useState(1); - - useEffect(() => { - calculateTimeLabel(); - return () => clearInterval(interval); - }, [item, itemPriceUnit]); - - const txMemo = () => { - if (BlueApp.tx_metadata[item.hash] && BlueApp.tx_metadata[item.hash]['memo']) { - return BlueApp.tx_metadata[item.hash]['memo']; - } - return ''; - }; - - const rowTitle = () => { - if (item.type === 'user_invoice' || item.type === 'payment_request') { - if (isNaN(item.value)) { - item.value = '0'; - } - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = item.timestamp + item.expire_time; - - if (invoiceExpiration > now) { - return loc.formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString(); - } else if (invoiceExpiration < now) { - if (item.ispaid) { - return loc.formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString(); - } else { - return loc.lnd.expired; - } - } - } else { - return loc.formatBalanceWithoutSuffix(item.value && item.value, itemPriceUnit, true).toString(); - } - }; - - const rowTitleStyle = () => { - let color = BlueApp.settings.successColor; - - if (item.type === 'user_invoice' || item.type === 'payment_request') { - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = item.timestamp + item.expire_time; - - if (invoiceExpiration > now) { - color = BlueApp.settings.successColor; - } else if (invoiceExpiration < now) { - if (item.ispaid) { - color = BlueApp.settings.successColor; - } else { - color = BlueApp.settings.failedColor; - } - } - } else if (item.value / 100000000 < 0) { - color = BlueApp.settings.foregroundColor; - } - - return { - fontWeight: '600', - fontSize: 16, - color: color, - }; - }; - - const avatar = () => { - // is it lightning refill tx? - if (item.category === 'receive' && item.confirmations < 3) { - return ( - - - - ); - } - - if (item.type && item.type === 'bitcoind_tx') { - return ( - - - - ); - } - if (item.type === 'paid_invoice') { - // is it lightning offchain payment? - return ( - - - - ); - } - - if (item.type === 'user_invoice' || item.type === 'payment_request') { - if (!item.ispaid) { - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = item.timestamp + item.expire_time; - if (invoiceExpiration < now) { - return ( - - - - ); - } - } else { - return ( - - - - ); - } - } - - if (!item.confirmations) { - return ( - - - - ); - } else if (item.value < 0) { - return ( - - - - ); - } else { - return ( - - - - ); - } - }; - - const subtitle = () => { - return (item.confirmations < 7 ? loc.transactions.list.conf + ': ' + item.confirmations + ' ' : '') + txMemo() + (item.memo || ''); - }; - - const onPress = () => { - if (item.hash) { - NavigationService.navigate('TransactionStatus', { hash: item.hash }); - } else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') { - const lightningWallet = BlueApp.getWallets().filter(wallet => { - if (typeof wallet === 'object') { - if (wallet.hasOwnProperty('secret')) { - return wallet.getSecret() === item.fromWallet; - } - } - }); - if (lightningWallet.length === 1) { - NavigationService.navigate('LNDViewInvoice', { - invoice: item, - fromWallet: lightningWallet[0], - isModal: false, - }); - } - } - }; - - const onLongPress = () => { - if (subtitleNumberOfLines === 1) { - setSubtitleNumberOfLines(0); - } - }; - - return ( - - ); -}; - -export class BlueListTransactionItem extends Component { - static propTypes = { - item: PropTypes.shape().isRequired, - itemPriceUnit: PropTypes.string, - }; - - static defaultProps = { - itemPriceUnit: BitcoinUnit.BTC, - }; - - txMemo = () => { - if (BlueApp.tx_metadata[this.props.item.hash] && BlueApp.tx_metadata[this.props.item.hash]['memo']) { - return BlueApp.tx_metadata[this.props.item.hash]['memo']; - } - return ''; - }; - - rowTitle = () => { - const item = this.props.item; - if (item.type === 'user_invoice' || item.type === 'payment_request') { - if (isNaN(item.value)) { - item.value = '0'; - } - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = item.timestamp + item.expire_time; - - if (invoiceExpiration > now) { - return loc.formatBalanceWithoutSuffix(item.value && item.value, this.props.itemPriceUnit, true).toString(); - } else if (invoiceExpiration < now) { - if (item.ispaid) { - return loc.formatBalanceWithoutSuffix(item.value && item.value, this.props.itemPriceUnit, true).toString(); - } else { - return loc.lnd.expired; - } - } - } else { - return loc.formatBalanceWithoutSuffix(item.value && item.value, this.props.itemPriceUnit, true).toString(); - } - }; - - rowTitleStyle = () => { - const item = this.props.item; - let color = '#37c0a1'; - - if (item.type === 'user_invoice' || item.type === 'payment_request') { - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = item.timestamp + item.expire_time; - - if (invoiceExpiration > now) { - color = '#37c0a1'; - } else if (invoiceExpiration < now) { - if (item.ispaid) { - color = '#37c0a1'; - } else { - color = '#FF0000'; - } - } - } else if (item.value / 100000000 < 0) { - color = BlueApp.settings.foregroundColor; - } - - return { - fontWeight: '600', - fontSize: 16, - color: color, - }; - }; - - avatar = () => { - // is it lightning refill tx? - if (this.props.item.category === 'receive' && this.props.item.confirmations < 3) { - return ( - - - - ); - } - - if (this.props.item.type && this.props.item.type === 'bitcoind_tx') { - return ( - - - - ); - } - if (this.props.item.type === 'paid_invoice') { - // is it lightning offchain payment? - return ( - - - - ); - } - - if (this.props.item.type === 'user_invoice' || this.props.item.type === 'payment_request') { - if (!this.props.item.ispaid) { - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = this.props.item.timestamp + this.props.item.expire_time; - if (invoiceExpiration < now) { - return ( - - - - ); - } - } else { - return ( - - - - ); - } - } - - if (!this.props.item.confirmations) { - return ( - - - - ); - } else if (this.props.item.value < 0) { - return ( - - - - ); - } else { - return ( - - - - ); - } - }; - - subtitle = () => { - return ( - (this.props.item.confirmations < 7 ? loc.transactions.list.conf + ': ' + this.props.item.confirmations + ' ' : '') + - this.txMemo() + - (this.props.item.memo || '') - ); - }; - - onPress = () => { - if (this.props.item.hash) { - NavigationService.navigate('TransactionStatus', { hash: this.props.item.hash }); - } else if ( - this.props.item.type === 'user_invoice' || - this.props.item.type === 'payment_request' || - this.props.item.type === 'paid_invoice' - ) { - const lightningWallet = BlueApp.getWallets().filter(wallet => { - if (typeof wallet === 'object') { - if (wallet.hasOwnProperty('secret')) { - return wallet.getSecret() === this.props.item.fromWallet; - } - } - }); - NavigationService.navigate('LNDViewInvoice', { - invoice: this.props.item, - fromWallet: lightningWallet[0], - isModal: false, - }); - } - }; - - render() { - return ( - - ); - } -} - -const sliderWidth = width * 1; -const itemWidth = width * 0.82; -const sliderHeight = 190; - -export class WalletsCarousel extends Component { - constructor(props) { - super(props); - // eslint-disable-next-line - WalletsCarousel.handleClick = props.handleClick; // because cant access `this` from _renderItem - WalletsCarousel.handleLongPress = props.handleLongPress; - // eslint-disable-next-line - this.onSnapToItem = props.onSnapToItem; - } - - _renderItem({ item, index }) { - let scaleValue = new Animated.Value(1.0); - let props = { duration: 50 }; - if (Platform.OS === 'android') { - props['useNativeDriver'] = true; - } - this.onPressedIn = () => { - props.toValue = 0.9; - Animated.spring(scaleValue, props).start(); - }; - this.onPressedOut = () => { - props.toValue = 1.0; - Animated.spring(scaleValue, props).start(); - }; - - if (!item) { - return ( - { - if (WalletsCarousel.handleClick) { - WalletsCarousel.handleClick(index); - } - }} - /> - ); - } - - return ( - - { - if (WalletsCarousel.handleClick) { - WalletsCarousel.handleClick(index); - } - }} - > - - - - - - {item.getLabel()} - - {item.hideBalance ? ( - - ) : ( - - {loc.formatBalance(Number(item.getBalance()), item.getPreferredBalanceUnit(), true)} - - )} - - - {loc.wallets.list.latest_transaction} - - - {loc.transactionTimeToReadable(item.getLatestTransactionTime())} - - - - - ); - } - - render() { - return ( - { - WalletsCarousel.carousel = c; - }} - renderItem={this._renderItem} - sliderWidth={sliderWidth} - sliderHeight={sliderHeight} - itemWidth={itemWidth} - inactiveSlideScale={1} - inactiveSlideOpacity={0.7} - contentContainerCustomStyle={{ left: -20 }} - onSnapToItem={index => { - if (this.onSnapToItem) { - this.onSnapToItem(index); - } - console.log('snapped to card #', index); - }} - /> - ); - } -} - -export class BlueAddressInput extends Component { - static propTypes = { - isLoading: PropTypes.bool, - onChangeText: PropTypes.func, - onBarScanned: PropTypes.func, - address: PropTypes.string, - placeholder: PropTypes.string, - }; - - static defaultProps = { - isLoading: false, - address: '', - placeholder: loc.send.details.address, - }; - - render() { - return ( - - { - this.props.onChangeText(text); - }} - placeholder={this.props.placeholder} - numberOfLines={1} - value={this.props.address} - style={{ flex: 1, marginHorizontal: 8, minHeight: 33 }} - editable={!this.props.isLoading} - onSubmitEditing={() => Keyboard.dismiss()} - {...this.props} - /> - { - NavigationService.navigate('ScanQrAddress', { onBarScanned: this.props.onBarScanned }); - Keyboard.dismiss(); - }} - style={{ - height: 36, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - backgroundColor: '#9AA0AA', - borderRadius: 4, - paddingVertical: 4, - paddingHorizontal: 8, - marginHorizontal: 4, - }} - > - - {loc.send.details.scan} - - - ); - } -} - -export class BlueReplaceFeeSuggestions extends Component { - static propTypes = { - onFeeSelected: PropTypes.func.isRequired, - transactionMinimum: PropTypes.number.isRequired, - }; - - static defaultProps = { - onFeeSelected: undefined, - transactionMinimum: 1, - }; - - state = { networkFees: undefined, selectedFeeType: NetworkTransactionFeeType.FAST, customFeeValue: 0 }; - - async componentDidMount() { - const networkFees = await NetworkTransactionFees.recommendedFees(); - this.setState({ networkFees }, () => this.onFeeSelected(NetworkTransactionFeeType.FAST)); - } - - onFeeSelected = selectedFeeType => { - if (selectedFeeType !== NetworkTransactionFeeType.CUSTOM) { - Keyboard.dismiss(); - } - if (selectedFeeType === NetworkTransactionFeeType.FAST) { - this.props.onFeeSelected(this.state.networkFees.fastestFee); - this.setState({ selectedFeeType }, () => this.props.onFeeSelected(this.state.networkFees.fastestFee)); - } else if (selectedFeeType === NetworkTransactionFeeType.MEDIUM) { - this.setState({ selectedFeeType }, () => this.props.onFeeSelected(this.state.networkFees.halfHourFee)); - } else if (selectedFeeType === NetworkTransactionFeeType.SLOW) { - this.setState({ selectedFeeType }, () => this.props.onFeeSelected(this.state.networkFees.hourFee)); - } else if (selectedFeeType === NetworkTransactionFeeType.CUSTOM) { - this.props.onFeeSelected(this.state.customFeeValue); - } - }; - - onCustomFeeTextChange = customFee => { - this.setState({ customFeeValue: Number(customFee), selectedFeeType: NetworkTransactionFeeType.CUSTOM }, () => { - this.onFeeSelected(NetworkTransactionFeeType.CUSTOM); - }); - }; - - render() { - return ( - - {this.state.networkFees && ( - <> - Suggestions - this.onFeeSelected(NetworkTransactionFeeType.FAST)}> - } - : { hideChevron: true })} - /> - - this.onFeeSelected(NetworkTransactionFeeType.MEDIUM)}> - } - : { hideChevron: true })} - /> - - this.onFeeSelected(NetworkTransactionFeeType.SLOW)}> - } - : { hideChevron: true })} - /> - - - )} - this.customTextInput.focus()}> - - Custom - - (this.customTextInput = ref)} - maxLength={9} - style={{ - borderColor: '#d2d2d2', - borderBottomColor: '#d2d2d2', - borderWidth: 1.0, - borderBottomWidth: 0.5, - borderRadius: 4, - minHeight: 33, - maxWidth: 100, - minWidth: 44, - backgroundColor: '#f5f5f5', - textAlign: 'right', - }} - onFocus={() => this.onCustomFeeTextChange(this.state.customFeeValue)} - defaultValue={`${this.props.transactionMinimum}`} - placeholder="Custom sat/b" - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - sat/b - {this.state.selectedFeeType === NetworkTransactionFeeType.CUSTOM && } - - - - - - The total fee rate (satoshi per byte) you want to pay should be higher than {this.props.transactionMinimum} sat/byte - - - ); - } -} - -export class BlueBitcoinAmount extends Component { - static propTypes = { - isLoading: PropTypes.bool, - amount: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - onChangeText: PropTypes.func, - disabled: PropTypes.bool, - unit: PropTypes.string, - }; - - static defaultProps = { - unit: BitcoinUnit.BTC, - }; - - render() { - const amount = this.props.amount || 0; - let localCurrency = loc.formatBalanceWithoutSuffix(amount, BitcoinUnit.LOCAL_CURRENCY, false); - if (this.props.unit === BitcoinUnit.BTC) { - let sat = new BigNumber(amount); - sat = sat.multipliedBy(100000000).toString(); - localCurrency = loc.formatBalanceWithoutSuffix(sat, BitcoinUnit.LOCAL_CURRENCY, false); - } else { - localCurrency = loc.formatBalanceWithoutSuffix(amount.toString(), BitcoinUnit.LOCAL_CURRENCY, false); - } - if (amount === BitcoinUnit.MAX) localCurrency = ''; // we dont want to display NaN - return ( - this.textInput.focus()}> - - - { - text = text.trim(); - text = text.replace(',', '.'); - const split = text.split('.'); - if (split.length >= 2) { - text = `${parseInt(split[0], 10)}.${split[1]}`; - } else { - text = `${parseInt(split[0], 10)}`; - } - text = this.props.unit === BitcoinUnit.BTC ? text.replace(/[^0-9.]/g, '') : text.replace(/[^0-9]/g, ''); - text = text.replace(/(\..*)\./g, '$1'); - - if (text.startsWith('.')) { - text = '0.'; - } - text = text.replace(/(0{1,}.)\./g, '$1'); - if (this.props.unit !== BitcoinUnit.BTC) { - text = text.replace(/[^0-9.]/g, ''); - } - this.props.onChangeText(text); - }} - onBlur={() => { - if (this.props.onBlur) this.props.onBlur(); - }} - onFocus={() => { - if (this.props.onFocus) this.props.onFocus(); - }} - placeholder="0" - maxLength={10} - ref={textInput => (this.textInput = textInput)} - editable={!this.props.isLoading && !this.props.disabled} - value={amount} - placeholderTextColor={this.props.disabled ? BlueApp.settings.buttonDisabledTextColor : BlueApp.settings.alternativeTextColor2} - style={{ - color: this.props.disabled ? BlueApp.settings.buttonDisabledTextColor : BlueApp.settings.alternativeTextColor2, - fontSize: 36, - fontWeight: '600', - }} - /> - - {' ' + this.props.unit} - - - - {localCurrency} - - - - ); - } -} - -const styles = StyleSheet.create({ - balanceBlur: { - height: 30, - width: 100, - marginRight: 16, - }, -}); diff --git a/BlueElectrum.js b/BlueElectrum.js index ada501a699..62919994f9 100644 --- a/BlueElectrum.js +++ b/BlueElectrum.js @@ -1,26 +1,17 @@ import AsyncStorage from '@react-native-community/async-storage'; + import { AppStorage } from './class'; + +//import { AppStorage } from './class/app-storage'; +const BigNumber = require('bignumber.js'); const bitcoin = require('bitcoinjs-lib'); +const reverse = require('buffer-reverse'); const ElectrumClient = require('electrum-client'); -let reverse = require('buffer-reverse'); -let BigNumber = require('bignumber.js'); const storageKey = 'ELECTRUM_PEERS'; -const defaultPeer = { host: 'electrum1.bluewallet.io', tcp: '50001' }; +export const defaultPeer = { host: 'electrum.veles.network', tcp: '50001' }; const hardcodedPeers = [ - // { host: 'noveltybobble.coinjoined.com', tcp: '50001' }, // down - // { host: 'electrum.be', tcp: '50001' }, - // { host: 'node.ispol.sk', tcp: '50001' }, // down - // { host: '139.162.14.142', tcp: '50001' }, - // { host: 'electrum.coinucopia.io', tcp: '50001' }, // SLOW - // { host: 'Bitkoins.nl', tcp: '50001' }, // down - // { host: 'fullnode.coinkite.com', tcp: '50001' }, - // { host: 'preperfect.eleCTruMioUS.com', tcp: '50001' }, // down - { host: 'electrum1.bluewallet.io', tcp: '50001' }, - { host: 'electrum1.bluewallet.io', tcp: '50001' }, // 2x weight - { host: 'electrum2.bluewallet.io', tcp: '50001' }, - { host: 'electrum3.bluewallet.io', tcp: '50001' }, - { host: 'electrum3.bluewallet.io', tcp: '50001' }, // 2x weight + { host: 'electrum.veles.network', tcp: '50001' }, ]; let mainClient = false; @@ -28,11 +19,9 @@ let mainConnected = false; let wasConnectedAtLeastOnce = false; async function connectMain() { - let usingPeer = await getRandomHardcodedPeer(); - let savedPeer = await getSavedPeer(); - if (savedPeer && savedPeer.host && savedPeer.tcp) { - usingPeer = savedPeer; - } + const host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST); + const tcp = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT); + const usingPeer = !!host && !!tcp ? { host, tcp } : await getRandomHardcodedPeer(); try { console.log('begin connection:', JSON.stringify(usingPeer)); @@ -42,6 +31,10 @@ async function connectMain() { mainConnected = false; }; await mainClient.connect(); + if (host !== usingPeer.host || tcp !== usingPeer.tcp) { + await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, usingPeer.host); + await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, usingPeer.tcp); + } const ver = await mainClient.server_version('2.7.11', '1.4'); if (ver && ver[0]) { console.log('connected to ', ver); @@ -75,11 +68,11 @@ async function getRandomHardcodedPeer() { return hardcodedPeers[(hardcodedPeers.length * Math.random()) | 0]; } -async function getSavedPeer() { - let host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST); - let port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT); - return { host, tcp: port }; -} +//async function getSavedPeer() { +//let host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST); +//let port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT); +//return { host, tcp: port }; +//} /** * Returns random electrum server out of list of servers @@ -94,10 +87,10 @@ async function getRandomDynamicPeer() { try { let peers = JSON.parse(await AsyncStorage.getItem(storageKey)); peers = peers.sort(() => Math.random() - 0.5); // shuffle - for (let peer of peers) { - let ret = {}; + for (const peer of peers) { + const ret = {}; ret.host = peer[1]; - for (let item of peer[2]) { + for (const item of peer[2]) { if (item.startsWith('t')) { ret.tcp = item.replace('t', ''); } @@ -118,10 +111,10 @@ async function getRandomDynamicPeer() { */ module.exports.getBalanceByAddress = async function(address) { if (!mainClient) throw new Error('Electrum client is not connected'); - let script = bitcoin.address.toOutputScript(address); - let hash = bitcoin.crypto.sha256(script); - let reversedHash = Buffer.from(reverse(hash)); - let balance = await mainClient.blockchainScripthash_getBalance(reversedHash.toString('hex')); + const script = bitcoin.address.toOutputScript(address); + const hash = bitcoin.crypto.sha256(script); + const reversedHash = Buffer.from(reverse(hash)); + const balance = await mainClient.blockchainScripthash_getBalance(reversedHash.toString('hex')); balance.addr = address; return balance; }; @@ -142,10 +135,10 @@ module.exports.getConfig = async function() { */ module.exports.getTransactionsByAddress = async function(address) { if (!mainClient) throw new Error('Electrum client is not connected'); - let script = bitcoin.address.toOutputScript(address); - let hash = bitcoin.crypto.sha256(script); - let reversedHash = Buffer.from(reverse(hash)); - let history = await mainClient.blockchainScripthash_getHistory(reversedHash.toString('hex')); + const script = bitcoin.address.toOutputScript(address); + const hash = bitcoin.crypto.sha256(script); + const reversedHash = Buffer.from(reverse(hash)); + const history = await mainClient.blockchainScripthash_getHistory(reversedHash.toString('hex')); return history; }; @@ -159,15 +152,22 @@ module.exports.ping = async function() { return true; }; -module.exports.getTransactionsFullByAddress = async function(address) { - let txs = await this.getTransactionsByAddress(address); - let ret = []; - for (let tx of txs) { - let full = await mainClient.blockchainTransaction_get(tx.tx_hash, true); - full.address = address; - for (let input of full.vin) { +module.exports.multiGetTransactionsFullByAddress = async function(addresses) { + const addrTxMap = await this.multiGetHistoryByAddress(addresses); + const txList = []; + const ret = []; + for (const addr in addrTxMap) { + for (const tx of addrTxMap[addr]) { + txList.push(tx.tx_hash); + } + } + const txfull = await this.multiGetTransactionByTxid(txList); + for (const txid in txfull) { + const full = txfull[txid]; + for (const input of full.vin) { + if (!input.txid) continue; // now we need to fetch previous TX where this VIN became an output, so we can see its amount - let prevTxForVin = await mainClient.blockchainTransaction_get(input.txid, true); + const prevTxForVin = await mainClient.blockchainTransaction_get(input.txid, true); if (prevTxForVin && prevTxForVin.vout && prevTxForVin.vout[input.vout]) { input.value = prevTxForVin.vout[input.vout].value; // also, we extract destination address from prev output: @@ -176,19 +176,46 @@ module.exports.getTransactionsFullByAddress = async function(address) { } } } - - for (let output of full.vout) { + for (const output of full.vout) { if (output.scriptPubKey && output.scriptPubKey.addresses) output.addresses = output.scriptPubKey.addresses; } full.inputs = full.vin; full.outputs = full.vout; delete full.vin; delete full.vout; - delete full.hex; // compact - delete full.hash; // compact + delete full.hex; ret.push(full); } + return ret; +}; +module.exports.multiGetTransactionsFullByTxid = async function(txid_list) { + const ret = []; + const txfull = await this.multiGetTransactionByTxid(txid_list); + for (const txid in txfull) { + const full = txfull[txid]; + for (const input of full.vin) { + if (!input.txid) continue; + // now we need to fetch previous TX where this VIN became an output, so we can see its amount + const prevTxForVin = await mainClient.blockchainTransaction_get(input.txid, true); + if (prevTxForVin && prevTxForVin.vout && prevTxForVin.vout[input.vout]) { + input.value = prevTxForVin.vout[input.vout].value; + // also, we extract destination address from prev output: + if (prevTxForVin.vout[input.vout].scriptPubKey && prevTxForVin.vout[input.vout].scriptPubKey.addresses) { + input.addresses = prevTxForVin.vout[input.vout].scriptPubKey.addresses; + } + } + } + for (const output of full.vout) { + if (output.scriptPubKey && output.scriptPubKey.addresses) output.addresses = output.scriptPubKey.addresses; + } + full.inputs = full.vin; + full.outputs = full.vout; + delete full.vin; + delete full.vout; + delete full.hex; + ret.push(full); + } return ret; }; @@ -201,24 +228,24 @@ module.exports.getTransactionsFullByAddress = async function(address) { module.exports.multiGetBalanceByAddress = async function(addresses, batchsize) { batchsize = batchsize || 100; if (!mainClient) throw new Error('Electrum client is not connected'); - let ret = { balance: 0, unconfirmed_balance: 0, addresses: {} }; - - let chunks = splitIntoChunks(addresses, batchsize); - for (let chunk of chunks) { - let scripthashes = []; - let scripthash2addr = {}; - for (let addr of chunk) { - let script = bitcoin.address.toOutputScript(addr); - let hash = bitcoin.crypto.sha256(script); + const ret = { balance: 0, unconfirmed_balance: 0, addresses: {} }; + + const chunks = splitIntoChunks(addresses, batchsize); + for (const chunk of chunks) { + const scripthashes = []; + const scripthash2addr = {}; + for (const addr of chunk) { + const script = bitcoin.address.toOutputScript(addr); + const hash = bitcoin.crypto.sha256(script); let reversedHash = Buffer.from(reverse(hash)); reversedHash = reversedHash.toString('hex'); scripthashes.push(reversedHash); scripthash2addr[reversedHash] = addr; } - let balances = await mainClient.blockchainScripthash_getBalanceBatch(scripthashes); + const balances = await mainClient.blockchainScripthash_getBalanceBatch(scripthashes); - for (let bal of balances) { + for (const bal of balances) { ret.balance += +bal.result.confirmed; ret.unconfirmed_balance += +bal.result.unconfirmed; ret.addresses[scripthash2addr[bal.param]] = bal.result; @@ -231,61 +258,61 @@ module.exports.multiGetBalanceByAddress = async function(addresses, batchsize) { module.exports.multiGetUtxoByAddress = async function(addresses, batchsize) { batchsize = batchsize || 100; if (!mainClient) throw new Error('Electrum client is not connected'); - let ret = {}; - - let chunks = splitIntoChunks(addresses, batchsize); - for (let chunk of chunks) { - let scripthashes = []; - let scripthash2addr = {}; - for (let addr of chunk) { - let script = bitcoin.address.toOutputScript(addr); - let hash = bitcoin.crypto.sha256(script); + const ret = {}; + const res = []; + const uniq = {}; + const chunks = splitIntoChunks(addresses, batchsize); + for (const chunk of chunks) { + const scripthashes = []; + const scripthash2addr = {}; + for (const addr of chunk) { + const script = bitcoin.address.toOutputScript(addr); + const hash = bitcoin.crypto.sha256(script); let reversedHash = Buffer.from(reverse(hash)); reversedHash = reversedHash.toString('hex'); scripthashes.push(reversedHash); scripthash2addr[reversedHash] = addr; } - let results = await mainClient.blockchainScripthash_listunspentBatch(scripthashes); + const results = await mainClient.blockchainScripthash_listunspentBatch(scripthashes); - for (let utxos of results) { + for (const utxos of results) { ret[scripthash2addr[utxos.param]] = utxos.result; - for (let utxo of ret[scripthash2addr[utxos.param]]) { + for (const utxo of ret[scripthash2addr[utxos.param]]) { utxo.address = scripthash2addr[utxos.param]; - utxo.txId = utxo.tx_hash; + utxo.txid = utxo.tx_hash; utxo.vout = utxo.tx_pos; - delete utxo.tx_pos; - delete utxo.tx_hash; + res.push(utxo); } } } - return ret; + return res; }; module.exports.multiGetHistoryByAddress = async function(addresses, batchsize) { batchsize = batchsize || 100; if (!mainClient) throw new Error('Electrum client is not connected'); - let ret = {}; - - let chunks = splitIntoChunks(addresses, batchsize); - for (let chunk of chunks) { - let scripthashes = []; - let scripthash2addr = {}; - for (let addr of chunk) { - let script = bitcoin.address.toOutputScript(addr); - let hash = bitcoin.crypto.sha256(script); + const ret = {}; + + const chunks = splitIntoChunks(addresses, batchsize); + for (const chunk of chunks) { + const scripthashes = []; + const scripthash2addr = {}; + for (const addr of chunk) { + const script = bitcoin.address.toOutputScript(addr); + const hash = bitcoin.crypto.sha256(script); let reversedHash = Buffer.from(reverse(hash)); reversedHash = reversedHash.toString('hex'); scripthashes.push(reversedHash); scripthash2addr[reversedHash] = addr; } - let results = await mainClient.blockchainScripthash_getHistoryBatch(scripthashes); + const results = await mainClient.blockchainScripthash_getHistoryBatch(scripthashes); - for (let history of results) { + for (const history of results) { ret[scripthash2addr[history.param]] = history.result; - for (let hist of ret[scripthash2addr[history.param]]) { + for (const hist of ret[scripthash2addr[history.param]]) { hist.address = scripthash2addr[history.param]; } } @@ -298,13 +325,12 @@ module.exports.multiGetTransactionByTxid = async function(txids, batchsize, verb batchsize = batchsize || 100; verbose = verbose !== false; if (!mainClient) throw new Error('Electrum client is not connected'); - let ret = {}; - - let chunks = splitIntoChunks(txids, batchsize); - for (let chunk of chunks) { - let results = await mainClient.blockchainTransaction_getBatch(chunk, verbose); + const ret = {}; - for (let txdata of results) { + const chunks = splitIntoChunks(txids, batchsize); + for (const chunk of chunks) { + const results = await mainClient.blockchainTransaction_getBatch(chunk, verbose); + for (const txdata of results) { ret[txdata.param] = txdata.result; } } @@ -345,9 +371,12 @@ module.exports.waitTillConnected = async function() { module.exports.estimateFees = async function() { if (!mainClient) throw new Error('Electrum client is not connected'); - const fast = await mainClient.blockchainEstimatefee(1); - const medium = await mainClient.blockchainEstimatefee(5); - const slow = await mainClient.blockchainEstimatefee(10); + let fast = await mainClient.blockchainEstimatefee(1); + let medium = await mainClient.blockchainEstimatefee(5); + let slow = await mainClient.blockchainEstimatefee(10); + if (fast < 1) fast = 1; + if (medium < 1) medium = 1; + if (slow < 1) slow = 1; return { fast, medium, slow }; }; @@ -360,8 +389,8 @@ module.exports.estimateFees = async function() { module.exports.estimateFee = async function(numberOfBlocks) { if (!mainClient) throw new Error('Electrum client is not connected'); numberOfBlocks = numberOfBlocks || 1; - let coinUnitsPerKilobyte = await mainClient.blockchainEstimatefee(numberOfBlocks); - if (coinUnitsPerKilobyte === -1) return 1; + const coinUnitsPerKilobyte = await mainClient.blockchainEstimatefee(numberOfBlocks); + if (coinUnitsPerKilobyte < 1) return 1; return Math.round( new BigNumber(coinUnitsPerKilobyte) .dividedBy(1024) @@ -392,7 +421,7 @@ module.exports.broadcastV2 = async function(hex) { * @returns {Promise} Whether provided host:port is a valid electrum server */ module.exports.testConnection = async function(host, tcpPort) { - let client = new ElectrumClient(tcpPort, host, 'tcp'); + const client = new ElectrumClient(tcpPort, host, 'tcp'); try { await client.connect(); await client.server_version('2.7.11', '1.4'); @@ -415,8 +444,8 @@ module.exports.forceDisconnect = () => { module.exports.hardcodedPeers = hardcodedPeers; -let splitIntoChunks = function(arr, chunkSize) { - let groups = []; +const splitIntoChunks = function(arr, chunkSize) { + const groups = []; let i; for (i = 0; i < arr.length; i += chunkSize) { groups.push(arr.slice(i, i + chunkSize)); diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..d0e83dacf5 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +Do what you wish, that is the law diff --git a/MainBottomTabs.js b/MainBottomTabs.js deleted file mode 100644 index 38e54f68c9..0000000000 --- a/MainBottomTabs.js +++ /dev/null @@ -1,318 +0,0 @@ -import { createStackNavigator, createAppContainer } from 'react-navigation'; - -import SettingsContainer from './screen/settings/settings'; -import About from './screen/settings/about'; -import ReleaseNotes from './screen/settings/releasenotes'; -import Selftest from './screen/selftest'; -import Language from './screen/settings/language'; -import Currency from './screen/settings/currency'; -import EncryptStorage from './screen/settings/encryptStorage'; -import PlausibleDeniability from './screen/plausibledeniability'; -import LightningSettings from './screen/settings/lightningSettings'; -import ElectrumSettings from './screen/settings/electrumSettings'; -import DefaultView from './screen/settings/defaultView'; - -import WalletsList from './screen/wallets/list'; -import WalletTransactions from './screen/wallets/transactions'; -import AddWallet from './screen/wallets/add'; -import PleaseBackup from './screen/wallets/pleaseBackup'; -import ImportWallet from './screen/wallets/import'; -import WalletDetails from './screen/wallets/details'; -import WalletExport from './screen/wallets/export'; -import WalletXpub from './screen/wallets/xpub'; -import BuyBitcoin from './screen/wallets/buyBitcoin'; -import Marketplace from './screen/wallets/marketplace'; -import scanQrWif from './screen/wallets/scanQrWif'; -import ReorderWallets from './screen/wallets/reorderWallets'; -import SelectWallet from './screen/wallets/selectWallet'; - -import details from './screen/transactions/details'; -import TransactionStatus from './screen/transactions/transactionStatus'; -import rbf from './screen/transactions/RBF'; -import createrbf from './screen/transactions/RBF-create'; -import cpfp from './screen/transactions/CPFP'; -import rbfBumpFee from './screen/transactions/RBFBumpFee'; -import rbfCancel from './screen/transactions/RBFCancel'; - -import receiveDetails from './screen/receive/details'; -import setReceiveAmount from './screen/receive/receiveAmount'; - -import sendDetails from './screen/send/details'; -import ScanQRCode from './screen/send/scanQrAddress'; -import sendCreate from './screen/send/create'; -import Confirm from './screen/send/confirm'; -import PsbtWithHardwareWallet from './screen/send/psbtWithHardwareWallet'; -import Success from './screen/send/success'; - -import ScanLndInvoice from './screen/lnd/scanLndInvoice'; -import LappBrowser from './screen/lnd/browser'; -import LNDCreateInvoice from './screen/lnd/lndCreateInvoice'; -import LNDViewInvoice from './screen/lnd/lndViewInvoice'; -import LNDViewAdditionalInvoiceInformation from './screen/lnd/lndViewAdditionalInvoiceInformation'; - -const ReorderWalletsStackNavigator = createStackNavigator({ - ReorderWallets: { - screen: ReorderWallets, - }, -}); - -const WalletsStackNavigator = createStackNavigator( - { - Wallets: { - screen: WalletsList, - path: 'wallets', - }, - WalletTransactions: { - screen: WalletTransactions, - }, - TransactionStatus: { - screen: TransactionStatus, - }, - TransactionDetails: { - screen: details, - }, - WalletDetails: { - screen: WalletDetails, - }, - RBF: { - screen: rbf, - }, - CreateRBF: { - screen: createrbf, - }, - CPFP: { - screen: cpfp, - }, - RBFBumpFee: { - screen: rbfBumpFee, - }, - RBFCancel: { - screen: rbfCancel, - }, - Settings: { - screen: SettingsContainer, - path: 'Settings', - navigationOptions: { - headerStyle: { - backgroundColor: '#FFFFFF', - borderBottomWidth: 0, - elevation: 0, - }, - headerTintColor: '#0c2550', - }, - }, - SelectWallet: { - screen: SelectWallet, - }, - Currency: { - screen: Currency, - }, - About: { - screen: About, - path: 'About', - }, - ReleaseNotes: { - screen: ReleaseNotes, - path: 'ReleaseNotes', - }, - Selftest: { - screen: Selftest, - }, - DefaultView: { - screen: DefaultView, - path: 'DefaultView', - }, - Language: { - screen: Language, - path: 'Language', - }, - EncryptStorage: { - screen: EncryptStorage, - path: 'EncryptStorage', - }, - PlausibleDeniability: { - screen: PlausibleDeniability, - path: 'PlausibleDeniability', - }, - LightningSettings: { - screen: LightningSettings, - path: 'LightningSettings', - }, - ElectrumSettings: { - screen: ElectrumSettings, - path: 'ElectrumSettings', - }, - LNDViewInvoice: { - screen: LNDViewInvoice, - swipeEnabled: false, - gesturesEnabled: false, - }, - LNDViewAdditionalInvoiceInformation: { - screen: LNDViewAdditionalInvoiceInformation, - }, - }, - { headerBackTitleVisible: false }, -); - -const CreateTransactionStackNavigator = createStackNavigator({ - SendDetails: { - screen: sendDetails, - }, - Confirm: { - screen: Confirm, - }, - PsbtWithHardwareWallet: { - screen: PsbtWithHardwareWallet, - }, - CreateTransaction: { - screen: sendCreate, - navigationOptions: { - headerStyle: { - backgroundColor: '#FFFFFF', - borderBottomWidth: 0, - }, - headerTintColor: '#0c2550', - }, - }, - Success: { - screen: Success, - }, - SelectWallet: { - screen: SelectWallet, - navigationOptions: { - headerRight: null, - }, - }, -}); - -const LNDCreateInvoiceStackNavigator = createStackNavigator({ - LNDCreateInvoice: { - screen: LNDCreateInvoice, - }, - LNDViewInvoice: { - screen: LNDViewInvoice, - swipeEnabled: false, - gesturesEnabled: false, - }, - LNDViewAdditionalInvoiceInformation: { - screen: LNDViewAdditionalInvoiceInformation, - }, -}); - -const CreateWalletStackNavigator = createStackNavigator({ - AddWallet: { - screen: AddWallet, - }, - ImportWallet: { - screen: ImportWallet, - }, - PleaseBackup: { - screen: PleaseBackup, - }, -}); - -const LightningScanInvoiceStackNavigator = createStackNavigator({ - ScanLndInvoice: { - screen: ScanLndInvoice, - }, - SelectWallet: { - screen: SelectWallet, - navigationOptions: { - headerRight: null, - }, - }, - Success: { - screen: Success, - }, -}); - -const MainBottomTabs = createStackNavigator( - { - Wallets: { - screen: WalletsStackNavigator, - path: 'wallets', - navigationOptions: { - header: null, - }, - }, - AddWallet: { - screen: CreateWalletStackNavigator, - navigationOptions: { - header: null, - }, - }, - ScanQrWif: { - screen: scanQrWif, - }, - WalletExport: { - screen: WalletExport, - }, - WalletXpub: { - screen: WalletXpub, - }, - BuyBitcoin: { - screen: BuyBitcoin, - }, - Marketplace: { - screen: Marketplace, - }, - // - SendDetails: { - screen: CreateTransactionStackNavigator, - navigationOptions: { - header: null, - }, - }, - SelectWallet: { - screen: SelectWallet, - navigationOptions: { - headerLeft: null, - }, - }, - - // - - ReceiveDetails: { - screen: receiveDetails, - }, - - ReceiveAmount: { - screen: setReceiveAmount, - }, - - // - - // LND: - - ScanLndInvoice: { - screen: LightningScanInvoiceStackNavigator, - navigationOptions: { - header: null, - }, - }, - ScanQrAddress: { - screen: ScanQRCode, - }, - LappBrowser: { - screen: LappBrowser, - }, - - ReorderWallets: { - screen: ReorderWalletsStackNavigator, - navigationOptions: { - header: null, - }, - }, - LNDCreateInvoice: { - screen: LNDCreateInvoiceStackNavigator, - navigationOptions: { - header: null, - }, - }, - }, - { - mode: 'modal', - }, -); - -export default createAppContainer(MainBottomTabs); diff --git a/MockStorage.js b/MockStorage.js index cc461bf5f0..93a1169398 100644 --- a/MockStorage.js +++ b/MockStorage.js @@ -20,7 +20,9 @@ export default class MockStorage { removeItem = jest.fn(key => { return new Promise((resolve, reject) => { - return this.storageCache.hasOwnProperty(key) ? resolve(delete this.storageCache[key]) : reject(new Error('No such key!')); + return this.storageCache.hasOwnProperty(key) + ? resolve(delete this.storageCache[key]) + : reject(new Error('No such key!')); }); }); diff --git a/Privacy.js b/Privacy.js index 38bce5cb81..99dc1d092b 100644 --- a/Privacy.js +++ b/Privacy.js @@ -1,5 +1,6 @@ -import Obscure from 'react-native-obscure'; import { Platform } from 'react-native'; +import Obscure from 'react-native-obscure'; + const PrivacySnapshot = require('react-native-privacy-snapshot'); export default class Privacy { diff --git a/README.md b/README.md index 19a66f461c..6f3f2464b6 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,8 @@ -# BlueWallet - A Bitcoin & Lightning Wallet - -[![GitHub tag](https://img.shields.io/badge/dynamic/json.svg?url=https://raw.githubusercontent.com/BlueWallet/BlueWallet/master/package.json&query=$.version&label=Version)](https://github.com/BlueWallet/BlueWallet) -[![CircleCI](https://circleci.com/gh/BlueWallet/BlueWallet.svg?style=svg)](https://circleci.com/gh/BlueWallet/BlueWallet) -[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) -![](https://img.shields.io/github/license/BlueWallet/BlueWallet.svg) - -Thin Bitcoin Wallet. -Built with React Native and BlockCypher API. - -[![Appstore](https://bluewallet.io/img/app-store-badge.svg)](https://itunes.apple.com/us/app/bluewallet-bitcoin-wallet/id1376878040?l=ru&ls=1&mt=8) -[![Playstore](https://bluewallet.io/img/play-store-badge.svg)](https://play.google.com/store/apps/details?id=io.bluewallet.bluewallet) - -Website: [bluewallet.io](http://bluewallet.io) - -Community: [telegram group](https://t.me/bluewallet) - -* Private keys never leave your device -* Lightning Network supported -* SegWit-first. Replace-By-Fee support -* Encryption. Plausible deniability -* And many more [features...](https://bluewallet.io/features.html) - - - - +# VelesWallet - A Cortez Vault mobile wallet +The first ever Cortez Vault wallet. +[![Playstore](https://bluewallet.io/img/play-store-badge.svg)](https://play.google.com/store/apps/details?id=network.veles.wallet) ## BUILD & RUN IT @@ -33,10 +10,18 @@ Community: [telegram group](https://t.me/bluewallet) * In your console: ``` -git clone https://github.com/BlueWallet/BlueWallet.git -cd BlueWallet +git clone https://github.com/bitcoinvault/VelesWallet.git +cd VelesWallet npm install -``` +``` + +* Add files for firebase: + +For iOS: +GoogleService-Info.plist into directory /ios/ + +For android: +google-services.json into directory /android/app/ * To run on Android: @@ -60,33 +45,7 @@ npm start ios npm run test ``` -## QA - -Builds automated and tested with BrowserStack - - - - - - -## MOTIVATION TO BUILD IT - -I was not satisfied with existing iOS Bitcoin apps, especially with BreadWallet (the one I mainly used) where development stalled and they could not even deliver such features as SegWit, RBF and custom fees (at the times where custom fees were especially needed). -So I knew I could create one to use myself and let others use it. -I had experience with awesome bitcoin-js lib (javascript), and since I dont own any Macs, don't plan to and not going to learn ObjC/Swift - ReactNative (where you also write in javascript) was an obvious choice. - ## LICENSE MIT - -## WANT TO CONTRIBUTE? - -Grab an issue from [the backlog](https://github.com/BlueWallet/BlueWallet/projects/1), try to start or submit a PR, any doubts we will try to guide you. - -Join us at our [telegram group](https://t.me/bluewallet) where we hangout :+1: - -## Responsible disclosure - -Found critical bugs/vulnerabilities? Please email them bluewallet@bluewallet.io -Thanks! diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000000..56d607ed3e --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,27 @@ +# How to make a release + +## Apple + +* test the build on real device. its imperative that you run selftest and it gives you OK +* if necessary, up version number in all relevant files (you can use `./edit-version-number.sh`) +* run `./release-notes.sh` - it prints changelog between latest tag and now, put this output under +new version in file `ios/fastlane/metadata/en-US/release_notes.txt` (on top); if file got too big +delete the oldest version from the bottom of the file +* now is a good time to commit ver bump and release notes changes +* create this release version in App Store Connect (iTunes) and attach appropriate build. note +last 4 digits of the build and announce it - this is now a RC. no need to fill release notes yet +* `cd ios/` and then run `DELIVER_USERNAME="my_itunes_email@example.com" DELIVER_PASSWORD="my_itunes_password" fastlane deliver --force --skip_binary_upload --skip_screenshots --ignore_language_directory_validation -a io.bluewallet.bluewallet --app_version "6.6.6"` +but replace `6.6.6` with your version number - this will upload release notes to all locales in itunes +* go back to App Store Connect and press `Submit for Review`. choose Yes, we use identifiers - for installs tracking +* once its approved and released it is safe to cut a release tag: run `git tag -m "REL v6.6.6: 76ed479" v6.6.6` +where `76ed479` is a latest commit in this version. replace the version as well. then run `git push origin --tags` +* you are awesome! + +## Android + +* do android after ios usually +* test the build on real device. its imperative that you run selftest and it gives you OK. note which build you are testing +* go to appcenter.ms, find this exact build under `master` builds, and press `Distribute` -> `Store` -> `Production`. +in `Release notes` write `Bug fixes and performance improvements`, this field is to small to include actual changelog +* wait till appcenter displays message that it is succesfully distributed +* noice! \ No newline at end of file diff --git a/UnlockWith.js b/UnlockWith.js index ea12935783..2484e851b7 100644 --- a/UnlockWith.js +++ b/UnlockWith.js @@ -1,15 +1,20 @@ +import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { View, Image, TouchableOpacity } from 'react-native'; import { Icon } from 'react-native-elements'; -import Biometric from './class/biometrics'; -import PropTypes from 'prop-types'; import { SafeAreaView } from 'react-navigation'; + +import Biometric from './class/biometrics'; /** @type {AppStorage} */ const BlueApp = require('./BlueApp'); export default class UnlockWith extends Component { - state = { biometricType: false, isStorageEncrypted: false, isAuthenticating: false }; + state = { + biometricType: false, + isStorageEncrypted: false, + isAuthenticating: false, + }; async componentDidMount() { let biometricType = false; @@ -54,19 +59,26 @@ export default class UnlockWith extends Component { } return ( - + - {this.state.biometricType === Biometric.TouchID && !this.state.isStorageEncrypted && ( - <> - - - - - )} + {(this.state.biometricType === Biometric.TouchID || this.state.biometricType === Biometric.Biometrics) && + !this.state.isStorageEncrypted && ( + <> + + + + + )} {this.state.biometricType === Biometric.FaceID && !this.state.isStorageEncrypted && ( <> @@ -75,7 +87,14 @@ export default class UnlockWith extends Component { )} {this.state.biometricType !== false && this.state.isStorageEncrypted && ( - + )} {this.state.isStorageEncrypted && ( <> diff --git a/WatchConnectivity.android.js b/WatchConnectivity.android.js new file mode 100644 index 0000000000..837f54b823 --- /dev/null +++ b/WatchConnectivity.android.js @@ -0,0 +1,12 @@ +export default class WatchConnectivity { + isAppInstalled = false; + static shared = new WatchConnectivity(); + wallets; + fetchTransactionsFunction = () => {}; + + getIsWatchAppInstalled() {} + + async handleLightningInvoiceCreateRequest(_walletIndex, _amount, _description) {} + + async sendWalletsToWatch() {} +} diff --git a/WatchConnectivity.js b/WatchConnectivity.ios.js similarity index 55% rename from WatchConnectivity.js rename to WatchConnectivity.ios.js index 1e6a18348c..04a4cd98b7 100644 --- a/WatchConnectivity.js +++ b/WatchConnectivity.ios.js @@ -1,42 +1,53 @@ +import { InteractionManager } from 'react-native'; import * as Watch from 'react-native-watch-connectivity'; -import { InteractionManager, Platform } from 'react-native'; + const loc = require('./loc'); + export default class WatchConnectivity { isAppInstalled = false; - BlueApp = require('./BlueApp'); + static shared = new WatchConnectivity(); + wallets; + fetchTransactionsFunction = () => {}; constructor() { - if (Platform.OS === 'ios') { - this.getIsWatchAppInstalled(); - } + this.getIsWatchAppInstalled(); } getIsWatchAppInstalled() { - if (Platform.OS !== 'ios') return; Watch.getIsWatchAppInstalled((err, isAppInstalled) => { if (!err) { - this.isAppInstalled = isAppInstalled; - this.sendWalletsToWatch(); - } - }); - Watch.subscribeToMessages(async (err, message, reply) => { - if (!err) { - if (message.request === 'createInvoice') { - const createInvoiceRequest = await this.handleLightningInvoiceCreateRequest( - message.walletIndex, - message.amount, - message.description, - ); - reply({ invoicePaymentRequest: createInvoiceRequest }); - } - } else { - reply(err); + WatchConnectivity.shared.isAppInstalled = isAppInstalled; + Watch.subscribeToWatchState((err, watchState) => { + if (!err) { + if (watchState === 'Activated') { + WatchConnectivity.shared.sendWalletsToWatch(); + } + } + }); + Watch.subscribeToMessages(async (err, message, reply) => { + if (!err) { + if (message.request === 'createInvoice') { + const createInvoiceRequest = await this.handleLightningInvoiceCreateRequest( + message.walletIndex, + message.amount, + message.description, + ); + reply({ invoicePaymentRequest: createInvoiceRequest }); + } else if (message.message === 'sendApplicationContext') { + await WatchConnectivity.shared.sendWalletsToWatch(WatchConnectivity.shared.wallets); + } else if (message.message === 'fetchTransactions') { + await WatchConnectivity.shared.fetchTransactionsFunction(); + } + } else { + reply(err); + } + }); } }); } async handleLightningInvoiceCreateRequest(walletIndex, amount, description) { - const wallet = this.BlueApp.getWallets()[walletIndex]; + const wallet = WatchConnectivity.shared.wallets[walletIndex]; if (wallet.allowReceive() && amount > 0 && description.trim().length > 0) { try { const invoiceRequest = await wallet.addInvoice(amount, description); @@ -47,30 +58,41 @@ export default class WatchConnectivity { } } - async sendWalletsToWatch() { - if (Platform.OS !== 'ios') return; - InteractionManager.runAfterInteractions(async () => { - if (this.isAppInstalled) { - const allWallets = this.BlueApp.getWallets(); - let wallets = []; + async sendWalletsToWatch(allWallets) { + if (allWallets === undefined && WatchConnectivity.shared.wallets !== undefined) { + allWallets = WatchConnectivity.shared.wallets; + } + if (allWallets && allWallets.length === 0) { + return; + } + + return InteractionManager.runAfterInteractions(async () => { + if (WatchConnectivity.shared.isAppInstalled) { + const wallets = []; + for (const wallet of allWallets) { let receiveAddress = ''; if (wallet.allowReceive()) { if (wallet.getAddressAsync) { - await wallet.getAddressAsync(); - receiveAddress = wallet.getAddress(); + try { + await wallet.getAddressAsync(); + receiveAddress = wallet.getAddress(); + } catch (error) { + console.log(error); + receiveAddress = wallet.getAddress(); + } } else { receiveAddress = wallet.getAddress(); } } - let transactions = wallet.getTransactions(10); - let watchTransactions = []; + const transactions = wallet.getTransactions(10); + const watchTransactions = []; for (const transaction of transactions) { let type = 'pendingConfirmation'; let memo = ''; let amount = 0; - if (transaction.hasOwnProperty('confirmations') && !transaction.confirmations > 0) { + if (transaction.hasOwnProperty('confirmations') && !(transaction.confirmations > 0)) { type = 'pendingConfirmation'; } else if (transaction.type === 'user_invoice' || transaction.type === 'payment_request') { const currentDate = new Date(); @@ -92,9 +114,7 @@ export default class WatchConnectivity { type = 'received'; } if (transaction.type === 'user_invoice' || transaction.type === 'payment_request') { - if (isNaN(transaction.value)) { - amount = '0'; - } + amount = isNaN(transaction.value) ? '0' : amount; const currentDate = new Date(); const now = (currentDate.getTime() / 1000) | 0; const invoiceExpiration = transaction.timestamp + transaction.expire_time; @@ -113,12 +133,20 @@ export default class WatchConnectivity { } else { amount = loc.formatBalance(transaction.value, wallet.getPreferredBalanceUnit(), true).toString(); } - if (this.BlueApp.tx_metadata[transaction.hash] && this.BlueApp.tx_metadata[transaction.hash]['memo']) { - memo = this.BlueApp.tx_metadata[transaction.hash]['memo']; + if ( + WatchConnectivity.shared.tx_metadata[transaction.hash] && + WatchConnectivity.shared.tx_metadata[transaction.hash]['memo'] + ) { + memo = WatchConnectivity.shared.tx_metadata[transaction.hash]['memo']; } else if (transaction.memo) { memo = transaction.memo; } - const watchTX = { type, amount, memo, time: loc.transactionTimeToReadable(transaction.received) }; + const watchTX = { + type, + amount, + memo, + time: loc.transactionTimeToReadable(transaction.received), + }; watchTransactions.push(watchTX); } wallets.push({ @@ -126,18 +154,16 @@ export default class WatchConnectivity { balance: loc.formatBalance(Number(wallet.getBalance()), wallet.getPreferredBalanceUnit(), true), type: wallet.type, preferredBalanceUnit: wallet.getPreferredBalanceUnit(), - receiveAddress: receiveAddress, + receiveAddress, transactions: watchTransactions, }); } - - Watch.updateApplicationContext({ wallets }); + Watch.updateApplicationContext({ + wallets, + randomID: Math.floor(Math.random() * 11), + }); + return { wallets }; } }); } } - -WatchConnectivity.init = function() { - if (WatchConnectivity.shared || Platform.OS !== 'ios') return; - WatchConnectivity.shared = new WatchConnectivity(); -}; diff --git a/__mocks__/@react-native-community/async-storage.js b/__mocks__/@react-native-community/async-storage.js deleted file mode 100644 index 272ea598bb..0000000000 --- a/__mocks__/@react-native-community/async-storage.js +++ /dev/null @@ -1 +0,0 @@ -export default from '@react-native-community/async-storage/jest/async-storage-mock' diff --git a/analytics.js b/analytics.js deleted file mode 100644 index 7ce36ffff6..0000000000 --- a/analytics.js +++ /dev/null @@ -1,24 +0,0 @@ -import amplitude from 'amplitude-js'; -import Analytics from 'appcenter-analytics'; - -amplitude.getInstance().init('8b7cf19e8eea3cdcf16340f5fbf16330', null, { - useNativeDeviceInfo: true, -}); - -let A = async event => { - amplitude.getInstance().logEvent(event, {}); - try { - Analytics.trackEvent(event); - } catch (err) { - console.log(err); - } -}; - -A.ENUM = { - INIT: 'INIT', - GOT_NONZERO_BALANCE: 'GOT_NONZERO_BALANCE', - CREATED_WALLET: 'CREATED_WALLET', - CREATED_LIGHTNING_WALLET: 'CREATED_LIGHTNING_WALLET', -}; - -module.exports = A; diff --git a/android/.project b/android/.project new file mode 100644 index 0000000000..5fc697c0d3 --- /dev/null +++ b/android/.project @@ -0,0 +1,17 @@ + + + VelesWallet + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/android/app/BUCK b/android/app/BUCK index fe5970bf3c..4b95558e4f 100644 --- a/android/app/BUCK +++ b/android/app/BUCK @@ -35,12 +35,12 @@ android_library( android_build_config( name = "build_config", - package = "io.bluewallet.bluewallet", + package = "network.veles.wallet", ) android_resource( name = "res", - package = "io.bluewallet.bluewallet", + package = "network.veles.wallet", res = "src/main/res", ) diff --git a/android/app/build.gradle b/android/app/build.gradle index 2d48aebaa6..00060ffdd7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,5 +1,10 @@ apply plugin: "com.android.application" + + + + + import com.android.build.OutputFile /** @@ -80,7 +85,6 @@ project.ext.react = [ ] apply from: "../../node_modules/react-native/react.gradle" -apply from: "../../node_modules/@sentry/react-native/sentry.gradle" /** * Set this to true to create two separate APKs instead of one: @@ -115,14 +119,24 @@ android { } defaultConfig { - applicationId "io.bluewallet.bluewallet" + applicationId "io.veles.wallet" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "4.7.4" + versionCode 5 + versionName "5.1.1" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' } + signingConfigs { + release { + if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) { + storeFile file(MYAPP_UPLOAD_STORE_FILE) + storePassword MYAPP_UPLOAD_STORE_PASSWORD + keyAlias MYAPP_UPLOAD_KEY_ALIAS + keyPassword MYAPP_UPLOAD_KEY_PASSWORD + } + } + } splits { abi { reset() @@ -135,6 +149,7 @@ android { release { minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + signingConfig signingConfigs.release } } // applicationVariants are e.g. debug, release @@ -155,6 +170,7 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "com.facebook.react:react-native:+" // From node_modules + // JSC from node_modules if (useIntlJsc) { implementation 'org.webkit:android-jsc-intl:+' @@ -170,4 +186,4 @@ task copyDownloadableDepsToLibs(type: Copy) { into 'libs' } -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) \ No newline at end of file diff --git a/android/app/gradle/wrapper/gradle-wrapper.jar b/android/app/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..f6b961fd5a Binary files /dev/null and b/android/app/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/app/gradle/wrapper/gradle-wrapper.properties b/android/app/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..634c7bf9ca --- /dev/null +++ b/android/app/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Apr 02 14:06:56 CEST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/android/app/gradlew b/android/app/gradlew new file mode 100644 index 0000000000..cccdd3d517 --- /dev/null +++ b/android/app/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/app/gradlew.bat b/android/app/gradlew.bat new file mode 100644 index 0000000000..e95643d6a2 --- /dev/null +++ b/android/app/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a73ac22155..e213161b3b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="io.veles.wallet"> @@ -13,10 +13,16 @@ android:allowBackup="false" android:usesCleartextTraffic="true" android:theme="@style/AppTheme"> + + @@ -28,7 +34,7 @@ - + diff --git a/android/app/src/main/assets/fonts/Feather.ttf b/android/app/src/main/assets/fonts/Feather.ttf index fc963dfe22..852c7135a3 100755 Binary files a/android/app/src/main/assets/fonts/Feather.ttf and b/android/app/src/main/assets/fonts/Feather.ttf differ diff --git a/android/app/src/main/assets/fonts/Fontisto.ttf b/android/app/src/main/assets/fonts/Fontisto.ttf new file mode 100755 index 0000000000..96e2e81a3d Binary files /dev/null and b/android/app/src/main/assets/fonts/Fontisto.ttf differ diff --git a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf index 3219fca04a..9cc8db1666 100644 Binary files a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf and b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Ubuntu-Bold.ttf b/android/app/src/main/assets/fonts/Ubuntu-Bold.ttf new file mode 100644 index 0000000000..b173da2741 Binary files /dev/null and b/android/app/src/main/assets/fonts/Ubuntu-Bold.ttf differ diff --git a/android/app/src/main/assets/fonts/Ubuntu-Light.ttf b/android/app/src/main/assets/fonts/Ubuntu-Light.ttf new file mode 100644 index 0000000000..ed0f5bce87 Binary files /dev/null and b/android/app/src/main/assets/fonts/Ubuntu-Light.ttf differ diff --git a/android/app/src/main/assets/fonts/Ubuntu-Medium.ttf b/android/app/src/main/assets/fonts/Ubuntu-Medium.ttf new file mode 100644 index 0000000000..ca9c03a476 Binary files /dev/null and b/android/app/src/main/assets/fonts/Ubuntu-Medium.ttf differ diff --git a/android/app/src/main/assets/fonts/Ubuntu-Regular.ttf b/android/app/src/main/assets/fonts/Ubuntu-Regular.ttf new file mode 100644 index 0000000000..d748728a20 Binary files /dev/null and b/android/app/src/main/assets/fonts/Ubuntu-Regular.ttf differ diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000..87a5ecb3ac Binary files /dev/null and b/android/app/src/main/ic_launcher-playstore.png differ diff --git a/android/app/src/main/java/io/bluewallet/bluewallet/MainActivity.java b/android/app/src/main/java/io/veles/wallet/MainActivity.java similarity index 52% rename from android/app/src/main/java/io/bluewallet/bluewallet/MainActivity.java rename to android/app/src/main/java/io/veles/wallet/MainActivity.java index 160e4ff9a3..bd418af4f4 100644 --- a/android/app/src/main/java/io/bluewallet/bluewallet/MainActivity.java +++ b/android/app/src/main/java/io/veles/wallet/MainActivity.java @@ -1,8 +1,15 @@ -package io.bluewallet.bluewallet; +package io.veles.wallet; import com.facebook.react.ReactActivity; +import org.devio.rn.splashscreen.SplashScreen; +import android.os.Bundle; public class MainActivity extends ReactActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + SplashScreen.show(this); + super.onCreate(savedInstanceState); + } /** * Returns the name of the main component registered from JavaScript. @@ -10,6 +17,6 @@ public class MainActivity extends ReactActivity { */ @Override protected String getMainComponentName() { - return "BlueWallet"; + return "VelesWallet"; } } diff --git a/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java b/android/app/src/main/java/io/veles/wallet/MainApplication.java similarity index 94% rename from android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java rename to android/app/src/main/java/io/veles/wallet/MainApplication.java index 70d18eabed..5a67af7f02 100644 --- a/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java +++ b/android/app/src/main/java/io/veles/wallet/MainApplication.java @@ -1,9 +1,10 @@ -package io.bluewallet.bluewallet; +package io.veles.wallet; import android.app.Application; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; +import com.reactnativerestart.RestartPackage; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.soloader.SoLoader; diff --git a/android/app/src/main/java/io/veles/wallet/SplashActivity.java b/android/app/src/main/java/io/veles/wallet/SplashActivity.java new file mode 100644 index 0000000000..927396a603 --- /dev/null +++ b/android/app/src/main/java/io/veles/wallet/SplashActivity.java @@ -0,0 +1,17 @@ + +package io.veles.wallet; + +import android.content.Intent; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; + +public class SplashActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = new Intent(this, MainActivity.class); + startActivity(intent); + finish(); + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable/background_splash.xml b/android/app/src/main/res/drawable/background_splash.xml new file mode 100644 index 0000000000..4a375c774c --- /dev/null +++ b/android/app/src/main/res/drawable/background_splash.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/quickactions.png b/android/app/src/main/res/drawable/quickactions.png new file mode 100644 index 0000000000..147d063e83 Binary files /dev/null and b/android/app/src/main/res/drawable/quickactions.png differ diff --git a/android/app/src/main/res/layout/launch_screen.xml b/android/app/src/main/res/layout/launch_screen.xml new file mode 100644 index 0000000000..32cd519f5a --- /dev/null +++ b/android/app/src/main/res/layout/launch_screen.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..036d09bc5f --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index a9f1311182..5743c2f611 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..56b6293d3d Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index a9f1311182..9ead881036 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/splash.png b/android/app/src/main/res/mipmap-hdpi/splash.png new file mode 100644 index 0000000000..f34388168f Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/splash.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 6a294aa8a8..1c49d13583 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..d967c2e1e9 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 6a294aa8a8..33444a3834 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/splash.png b/android/app/src/main/res/mipmap-mdpi/splash.png new file mode 100644 index 0000000000..22421e524a Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/splash.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 3166c802f3..b3245760ed 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..ce0f23ff08 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 3166c802f3..155fd53981 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/splash.png b/android/app/src/main/res/mipmap-xhdpi/splash.png new file mode 100644 index 0000000000..df3f941ded Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/splash.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 2d00b392c5..b892da840b 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..c7bfd2b0c9 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 2d00b392c5..cab4f7671b 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/splash.png b/android/app/src/main/res/mipmap-xxhdpi/splash.png new file mode 100644 index 0000000000..66c302fc19 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index fe4a66ea54..d2b55ccb0c 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..513ddcdd2c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index fe4a66ea54..f5027f2d94 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/splash.png b/android/app/src/main/res/mipmap-xxxhdpi/splash.png new file mode 100644 index 0000000000..94db854ab4 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000000..25d0e6471c --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000000..c5d5899fdf --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 4eb14ee18f..809abaa9b7 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - BlueWallet + VelesWallet ASK_JAVASCRIPT ALWAYS_SEND diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 62fe59fa48..c636945a22 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -5,5 +5,14 @@ #000000 - + + + diff --git a/android/build.gradle b/android/build.gradle index a0881b02b4..9fab4c54f5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,9 +3,9 @@ buildscript { ext { buildToolsVersion = "28.0.3" - minSdkVersion = 16 - compileSdkVersion = 28 - targetSdkVersion = 28 + minSdkVersion = 21 + compileSdkVersion = 29 + targetSdkVersion = 29 supportLibVersion = "28.0.0" googlePlayServicesVersion = "16.+" firebaseVersion = "17.3.4" @@ -13,9 +13,14 @@ buildscript { repositories { google() jcenter() + maven { + url 'https://maven.fabric.io/public' + } } dependencies { - classpath("com.android.tools.build:gradle:3.4.1") + classpath("com.android.tools.build:gradle:3.4.2") + classpath 'com.google.gms:google-services:4.2.0' + classpath 'io.fabric.tools:gradle:1.28.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -33,6 +38,7 @@ allprojects { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } + maven { url 'https://jitpack.io' } google() jcenter() diff --git a/android/gradle.properties b/android/gradle.properties index 027ef9db8a..cfec41e5f0 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -19,3 +19,5 @@ android.useAndroidX=true android.enableJetifier=true +#org.gradle.daemon=true +#org.gradle.jvmargs=-Xmx2560m \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index ee69dd68d1..e0c4de36dd 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/sentry.properties b/android/sentry.properties index 4e8977a718..8afeec6dfb 100644 --- a/android/sentry.properties +++ b/android/sentry.properties @@ -1,5 +1,5 @@ defaults.url=https://sentry.io/ -defaults.org=bluewallet -defaults.project=bluewallet -auth.token=8020b31b54e94e7b86b4a69f60869f3d5a1320f44efe4f22bb9fa27e0b371448 +defaults.org=velescore +defaults.project=veleswallet +auth.token=12ea7223af134bc188cac392adecf796365b5585f9f144028672a6e51452d8c5 cli.executable=node_modules/@sentry/cli/bin/sentry-cli diff --git a/android/settings.gradle b/android/settings.gradle index fe99524581..609b47e6a5 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,3 +1,5 @@ -rootProject.name = 'BlueWallet' +rootProject.name = 'VelesWallet' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' +//include ':@react-native-firebase_analytics' +//project(':@react-native-firebase_analytics').projectDir = new File(rootProject.projectDir, './../node_modules/@react-native-firebase/analytics/android') diff --git a/app.json b/app.json index c501a12bb3..26d844d480 100644 --- a/app.json +++ b/app.json @@ -1,4 +1,4 @@ { - "name": "BlueWallet", - "displayName": "BlueWallet" + "name": "VelesWallet", + "displayName": "VelesWallet" } \ No newline at end of file diff --git a/appcenter-post-build-get-pr-number.js b/appcenter-post-build-get-pr-number.js deleted file mode 100755 index 8e87b55328..0000000000 --- a/appcenter-post-build-get-pr-number.js +++ /dev/null @@ -1,45 +0,0 @@ -const https = require('https'); - -const auth = 'Basic ' + Buffer.from(process.env.GITHUB).toString('base64'); - -const branch = require('child_process') - .execSync('git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3') - .toString() - .trim(); - -const req = https.request( - { - hostname: 'api.github.com', - port: 443, - path: '/repos/BlueWallet/BlueWallet/pulls', - method: 'GET', - headers: { 'User-Agent': 'BlueWallet bot', Authorization: auth }, - }, - resp => { - let data = ''; - - resp.on('data', chunk => { - data += chunk; - }); - - resp.on('end', () => { - try { - const prs = JSON.parse(data); - for (let pr of prs) { - if (branch === pr.head.ref) { - console.log(pr.number); - } - } - } catch (err) { - console.log(err); - console.log('got json: ', data); - } - }); - }, -); - -req.on('error', e => { - console.error(e); -}); - -req.end(); diff --git a/appcenter-post-build.sh b/appcenter-post-build.sh deleted file mode 100755 index 62513d89cc..0000000000 --- a/appcenter-post-build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -echo Uploading to Appetize and publishing link to Github... -echo -n "Branch " -git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3 -echo -n "Branch 2 " -git log -n 1 --pretty=%d HEAD | awk '{print $2}' | sed 's/origin\///' | sed 's/)//' - -FILENAME="$APPCENTER_OUTPUT_DIRECTORY/app-release.apk" - -if [ -f $FILENAME ]; then - APTZ=`curl "https://$APPETIZE@api.appetize.io/v1/apps" -F "file=@$FILENAME" -F "platform=android"` - echo Apptezize response: - echo $APTZ - APPURL=`node -e "let e = JSON.parse('$APTZ'); console.log(e.publicURL);"` - echo App url: $APPURL - PR=`node appcenter-post-build-get-pr-number.js` - echo PR: $PR - curl -X POST --data "{\"body\":\"This was a triumph. I'm making a note here: HUGE SUCCESS.\n\n [android] $APPURL\"}" -u "$GITHUB" "https://api.github.com/repos/BlueWallet/BlueWallet/issues/$PR/comments" -fi diff --git a/babel.config.js b/babel.config.js index f842b77fcf..9efa30ce26 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ['module:metro-react-native-babel-preset'], + presets: ['@babel/preset-typescript', 'module:metro-react-native-babel-preset'], }; diff --git a/bip38/index.js b/bip38/index.js index 2253d5db4f..c15c5458c6 100644 --- a/bip38/index.js +++ b/bip38/index.js @@ -1,239 +1,250 @@ -var aes = require('browserify-aes') -var assert = require('assert') -var Buffer = require('safe-buffer').Buffer -var bs58check = require('bs58check') -var createHash = require('create-hash') -var scrypt = require('./scryptsy') -var xor = require('buffer-xor/inplace') +/* eslint-disable import/order */ +const assert = require('assert'); +const aes = require('browserify-aes'); +const Buffer = require('safe-buffer').Buffer; +const bs58check = require('bs58check'); +const createHash = require('create-hash'); -var ecurve = require('ecurve') -var curve = ecurve.getCurveByName('secp256k1') +const scrypt = require('./scryptsy'); -var BigInteger = require('bigi') +const xor = require('buffer-xor/inplace'); +const ecurve = require('ecurve'); + +const curve = ecurve.getCurveByName('secp256k1'); + +const BigInteger = require('bigi'); // constants -var SCRYPT_PARAMS = { +const SCRYPT_PARAMS = { N: 16384, // specified by BIP38 r: 8, - p: 8 -} -var NULL = Buffer.alloc(0) - -function hash160 (buffer) { - return createHash('rmd160').update( - createHash('sha256').update(buffer).digest() - ).digest() + p: 8, +}; +const NULL = Buffer.alloc(0); + +function hash160(buffer) { + return createHash('rmd160') + .update( + createHash('sha256') + .update(buffer) + .digest(), + ) + .digest(); } -function hash256 (buffer) { - return createHash('sha256').update( - createHash('sha256').update(buffer).digest() - ).digest() +function hash256(buffer) { + return createHash('sha256') + .update( + createHash('sha256') + .update(buffer) + .digest(), + ) + .digest(); } -function getAddress (d, compressed) { - var Q = curve.G.multiply(d).getEncoded(compressed) - var hash = hash160(Q) - var payload = Buffer.allocUnsafe(21) - payload.writeUInt8(0x00, 0) // XXX TODO FIXME bitcoin only??? damn you BIP38 - hash.copy(payload, 1) +function getAddress(d, compressed) { + const Q = curve.G.multiply(d).getEncoded(compressed); + const hash = hash160(Q); + const payload = Buffer.allocUnsafe(21); + payload.writeUInt8(0x00, 0); // XXX TODO FIXME bitcoin only??? damn you BIP38 + hash.copy(payload, 1); - return bs58check.encode(payload) + return bs58check.encode(payload); } -async function encryptRaw (buffer, compressed, passphrase, progressCallback, scryptParams) { - if (buffer.length !== 32) throw new Error('Invalid private key length') - scryptParams = scryptParams || SCRYPT_PARAMS +async function encryptRaw(buffer, compressed, passphrase, progressCallback, scryptParams) { + if (buffer.length !== 32) throw new Error('Invalid private key length'); + scryptParams = scryptParams || SCRYPT_PARAMS; - var d = BigInteger.fromBuffer(buffer) - var address = getAddress(d, compressed) - var secret = Buffer.from(passphrase, 'utf8') - var salt = hash256(address).slice(0, 4) + const d = BigInteger.fromBuffer(buffer); + const address = getAddress(d, compressed); + const secret = Buffer.from(passphrase, 'utf8'); + const salt = hash256(address).slice(0, 4); - var N = scryptParams.N - var r = scryptParams.r - var p = scryptParams.p + const N = scryptParams.N; + const r = scryptParams.r; + const p = scryptParams.p; - var scryptBuf = await scrypt(secret, salt, N, r, p, 64, progressCallback) - var derivedHalf1 = scryptBuf.slice(0, 32) - var derivedHalf2 = scryptBuf.slice(32, 64) + const scryptBuf = await scrypt(secret, salt, N, r, p, 64, progressCallback); + const derivedHalf1 = scryptBuf.slice(0, 32); + const derivedHalf2 = scryptBuf.slice(32, 64); - var xorBuf = xor(derivedHalf1, buffer) - var cipher = aes.createCipheriv('aes-256-ecb', derivedHalf2, NULL) - cipher.setAutoPadding(false) - cipher.end(xorBuf) + const xorBuf = xor(derivedHalf1, buffer); + const cipher = aes.createCipheriv('aes-256-ecb', derivedHalf2, NULL); + cipher.setAutoPadding(false); + cipher.end(xorBuf); - var cipherText = cipher.read() + const cipherText = cipher.read(); // 0x01 | 0x42 | flagByte | salt (4) | cipherText (32) - var result = Buffer.allocUnsafe(7 + 32) - result.writeUInt8(0x01, 0) - result.writeUInt8(0x42, 1) - result.writeUInt8(compressed ? 0xe0 : 0xc0, 2) - salt.copy(result, 3) - cipherText.copy(result, 7) - - return result + const result = Buffer.allocUnsafe(7 + 32); + result.writeUInt8(0x01, 0); + result.writeUInt8(0x42, 1); + result.writeUInt8(compressed ? 0xe0 : 0xc0, 2); + salt.copy(result, 3); + cipherText.copy(result, 7); + + return result; } -function encrypt (buffer, compressed, passphrase, progressCallback, scryptParams) { - return bs58check.encode(encryptRaw(buffer, compressed, passphrase, progressCallback, scryptParams)) +function encrypt(buffer, compressed, passphrase, progressCallback, scryptParams) { + return bs58check.encode(encryptRaw(buffer, compressed, passphrase, progressCallback, scryptParams)); } // some of the techniques borrowed from: https://github.com/pointbiz/bitaddress.org -async function decryptRaw (buffer, passphrase, progressCallback, scryptParams) { +async function decryptRaw(buffer, passphrase, progressCallback, scryptParams) { // 39 bytes: 2 bytes prefix, 37 bytes payload - if (buffer.length !== 39) throw new Error('Invalid BIP38 data length') - if (buffer.readUInt8(0) !== 0x01) throw new Error('Invalid BIP38 prefix') - scryptParams = scryptParams || SCRYPT_PARAMS + if (buffer.length !== 39) throw new Error('Invalid BIP38 data length'); + if (buffer.readUInt8(0) !== 0x01) throw new Error('Invalid BIP38 prefix'); + scryptParams = scryptParams || SCRYPT_PARAMS; // check if BIP38 EC multiply - var type = buffer.readUInt8(1) - if (type === 0x43) return await decryptECMult(buffer, passphrase, progressCallback, scryptParams) - if (type !== 0x42) throw new Error('Invalid BIP38 type') + const type = buffer.readUInt8(1); + if (type === 0x43) return await decryptECMult(buffer, passphrase, progressCallback, scryptParams); + if (type !== 0x42) throw new Error('Invalid BIP38 type'); - passphrase = Buffer.from(passphrase, 'utf8') + passphrase = Buffer.from(passphrase, 'utf8'); - var flagByte = buffer.readUInt8(2) - var compressed = flagByte === 0xe0 - if (!compressed && flagByte !== 0xc0) throw new Error('Invalid BIP38 compression flag') + const flagByte = buffer.readUInt8(2); + const compressed = flagByte === 0xe0; + if (!compressed && flagByte !== 0xc0) throw new Error('Invalid BIP38 compression flag'); - var N = scryptParams.N - var r = scryptParams.r - var p = scryptParams.p + const N = scryptParams.N; + const r = scryptParams.r; + const p = scryptParams.p; - var salt = buffer.slice(3, 7) - var scryptBuf = await scrypt(passphrase, salt, N, r, p, 64, progressCallback) - var derivedHalf1 = scryptBuf.slice(0, 32) - var derivedHalf2 = scryptBuf.slice(32, 64) + const salt = buffer.slice(3, 7); + const scryptBuf = await scrypt(passphrase, salt, N, r, p, 64, progressCallback); + const derivedHalf1 = scryptBuf.slice(0, 32); + const derivedHalf2 = scryptBuf.slice(32, 64); - var privKeyBuf = buffer.slice(7, 7 + 32) - var decipher = aes.createDecipheriv('aes-256-ecb', derivedHalf2, NULL) - decipher.setAutoPadding(false) - decipher.end(privKeyBuf) + const privKeyBuf = buffer.slice(7, 7 + 32); + const decipher = aes.createDecipheriv('aes-256-ecb', derivedHalf2, NULL); + decipher.setAutoPadding(false); + decipher.end(privKeyBuf); - var plainText = decipher.read() - var privateKey = xor(derivedHalf1, plainText) + const plainText = decipher.read(); + const privateKey = xor(derivedHalf1, plainText); // verify salt matches address - var d = BigInteger.fromBuffer(privateKey) - var address = getAddress(d, compressed) - var checksum = hash256(address).slice(0, 4) - assert.deepEqual(salt, checksum) + const d = BigInteger.fromBuffer(privateKey); + const address = getAddress(d, compressed); + const checksum = hash256(address).slice(0, 4); + assert.deepEqual(salt, checksum); return { - privateKey: privateKey, - compressed: compressed - } + privateKey, + compressed, + }; } -async function decrypt (string, passphrase, progressCallback, scryptParams) { - return await decryptRaw(bs58check.decode(string), passphrase, progressCallback, scryptParams) +async function decrypt(string, passphrase, progressCallback, scryptParams) { + return await decryptRaw(bs58check.decode(string), passphrase, progressCallback, scryptParams); } -async function decryptECMult (buffer, passphrase, progressCallback, scryptParams) { - passphrase = Buffer.from(passphrase, 'utf8') - buffer = buffer.slice(1) // FIXME: we can avoid this - scryptParams = scryptParams || SCRYPT_PARAMS +async function decryptECMult(buffer, passphrase, progressCallback, scryptParams) { + passphrase = Buffer.from(passphrase, 'utf8'); + buffer = buffer.slice(1); // FIXME: we can avoid this + scryptParams = scryptParams || SCRYPT_PARAMS; - var flag = buffer.readUInt8(1) - var compressed = (flag & 0x20) !== 0 - var hasLotSeq = (flag & 0x04) !== 0 + const flag = buffer.readUInt8(1); + const compressed = (flag & 0x20) !== 0; + const hasLotSeq = (flag & 0x04) !== 0; - assert.equal((flag & 0x24), flag, 'Invalid private key.') + assert.equal(flag & 0x24, flag, 'Invalid private key.'); - var addressHash = buffer.slice(2, 6) - var ownerEntropy = buffer.slice(6, 14) - var ownerSalt + const addressHash = buffer.slice(2, 6); + const ownerEntropy = buffer.slice(6, 14); + let ownerSalt; // 4 bytes ownerSalt if 4 bytes lot/sequence if (hasLotSeq) { - ownerSalt = ownerEntropy.slice(0, 4) + ownerSalt = ownerEntropy.slice(0, 4); - // else, 8 bytes ownerSalt + // else, 8 bytes ownerSalt } else { - ownerSalt = ownerEntropy + ownerSalt = ownerEntropy; } - var encryptedPart1 = buffer.slice(14, 22) // First 8 bytes - var encryptedPart2 = buffer.slice(22, 38) // 16 bytes + const encryptedPart1 = buffer.slice(14, 22); // First 8 bytes + const encryptedPart2 = buffer.slice(22, 38); // 16 bytes - var N = scryptParams.N - var r = scryptParams.r - var p = scryptParams.p - var preFactor = await scrypt(passphrase, ownerSalt, N, r, p, 32, progressCallback) + const N = scryptParams.N; + const r = scryptParams.r; + const p = scryptParams.p; + const preFactor = await scrypt(passphrase, ownerSalt, N, r, p, 32, progressCallback); - var passFactor + let passFactor; if (hasLotSeq) { - var hashTarget = Buffer.concat([preFactor, ownerEntropy]) - passFactor = hash256(hashTarget) + const hashTarget = Buffer.concat([preFactor, ownerEntropy]); + passFactor = hash256(hashTarget); } else { - passFactor = preFactor + passFactor = preFactor; } - var passInt = BigInteger.fromBuffer(passFactor) - var passPoint = curve.G.multiply(passInt).getEncoded(true) + const passInt = BigInteger.fromBuffer(passFactor); + const passPoint = curve.G.multiply(passInt).getEncoded(true); - var seedBPass = await scrypt(passPoint, Buffer.concat([addressHash, ownerEntropy]), 1024, 1, 1, 64) + const seedBPass = await scrypt(passPoint, Buffer.concat([addressHash, ownerEntropy]), 1024, 1, 1, 64); - var derivedHalf1 = seedBPass.slice(0, 32) - var derivedHalf2 = seedBPass.slice(32, 64) + const derivedHalf1 = seedBPass.slice(0, 32); + const derivedHalf2 = seedBPass.slice(32, 64); - var decipher = aes.createDecipheriv('aes-256-ecb', derivedHalf2, Buffer.alloc(0)) - decipher.setAutoPadding(false) - decipher.end(encryptedPart2) + const decipher = aes.createDecipheriv('aes-256-ecb', derivedHalf2, Buffer.alloc(0)); + decipher.setAutoPadding(false); + decipher.end(encryptedPart2); - var decryptedPart2 = decipher.read() - var tmp = xor(decryptedPart2, derivedHalf1.slice(16, 32)) - var seedBPart2 = tmp.slice(8, 16) + const decryptedPart2 = decipher.read(); + const tmp = xor(decryptedPart2, derivedHalf1.slice(16, 32)); + const seedBPart2 = tmp.slice(8, 16); - var decipher2 = aes.createDecipheriv('aes-256-ecb', derivedHalf2, Buffer.alloc(0)) - decipher2.setAutoPadding(false) - decipher2.write(encryptedPart1) // first 8 bytes - decipher2.end(tmp.slice(0, 8)) // last 8 bytes + const decipher2 = aes.createDecipheriv('aes-256-ecb', derivedHalf2, Buffer.alloc(0)); + decipher2.setAutoPadding(false); + decipher2.write(encryptedPart1); // first 8 bytes + decipher2.end(tmp.slice(0, 8)); // last 8 bytes - var seedBPart1 = xor(decipher2.read(), derivedHalf1.slice(0, 16)) - var seedB = Buffer.concat([seedBPart1, seedBPart2], 24) - var factorB = BigInteger.fromBuffer(hash256(seedB)) + const seedBPart1 = xor(decipher2.read(), derivedHalf1.slice(0, 16)); + const seedB = Buffer.concat([seedBPart1, seedBPart2], 24); + const factorB = BigInteger.fromBuffer(hash256(seedB)); // d = passFactor * factorB (mod n) - var d = passInt.multiply(factorB).mod(curve.n) + const d = passInt.multiply(factorB).mod(curve.n); return { privateKey: d.toBuffer(32), - compressed: compressed - } + compressed, + }; } -function verify (string) { - var decoded = bs58check.decodeUnsafe(string) - if (!decoded) return false +function verify(string) { + const decoded = bs58check.decodeUnsafe(string); + if (!decoded) return false; - if (decoded.length !== 39) return false - if (decoded.readUInt8(0) !== 0x01) return false + if (decoded.length !== 39) return false; + if (decoded.readUInt8(0) !== 0x01) return false; - var type = decoded.readUInt8(1) - var flag = decoded.readUInt8(2) + const type = decoded.readUInt8(1); + const flag = decoded.readUInt8(2); // encrypted WIF if (type === 0x42) { - if (flag !== 0xc0 && flag !== 0xe0) return false + if (flag !== 0xc0 && flag !== 0xe0) return false; - // EC mult + // EC mult } else if (type === 0x43) { - if ((flag & ~0x24)) return false + if (flag & ~0x24) return false; } else { - return false + return false; } - return true + return true; } module.exports = { - decrypt: decrypt, - decryptECMult: decryptECMult, - decryptRaw: decryptRaw, - encrypt: encrypt, - encryptRaw: encryptRaw, - verify: verify -} + decrypt, + decryptECMult, + decryptRaw, + encrypt, + encryptRaw, + verify, +}; diff --git a/bip38/scryptsy/lib/scrypt.js b/bip38/scryptsy/lib/scrypt.js index 42a167fdde..4a9375460e 100644 --- a/bip38/scryptsy/lib/scrypt.js +++ b/bip38/scryptsy/lib/scrypt.js @@ -1,195 +1,192 @@ /* eslint-disable camelcase */ -let pbkdf2 = require('pbkdf2') +const pbkdf2 = require('pbkdf2'); -var MAX_VALUE = 0x7fffffff +const MAX_VALUE = 0x7fffffff; // N = Cpu cost, r = Memory cost, p = parallelization cost -async function scrypt (key, salt, N, r, p, dkLen, progressCallback) { - if (N === 0 || (N & (N - 1)) !== 0) throw Error('N must be > 0 and a power of 2') +async function scrypt(key, salt, N, r, p, dkLen, progressCallback) { + if (N === 0 || (N & (N - 1)) !== 0) throw Error('N must be > 0 and a power of 2'); - if (N > MAX_VALUE / 128 / r) throw Error('Parameter N is too large') - if (r > MAX_VALUE / 128 / p) throw Error('Parameter r is too large') + if (N > MAX_VALUE / 128 / r) throw Error('Parameter N is too large'); + if (r > MAX_VALUE / 128 / p) throw Error('Parameter r is too large'); - var XY = new Buffer(256 * r) - var V = new Buffer(128 * r * N) + const XY = new Buffer(256 * r); + const V = new Buffer(128 * r * N); // pseudo global - var B32 = new Int32Array(16) // salsa20_8 - var x = new Int32Array(16) // salsa20_8 - var _X = new Buffer(64) // blockmix_salsa8 + const B32 = new Int32Array(16); // salsa20_8 + const x = new Int32Array(16); // salsa20_8 + const _X = new Buffer(64); // blockmix_salsa8 // pseudo global - var B = pbkdf2.pbkdf2Sync(key, salt, 1, p * 128 * r, 'sha256') + const B = pbkdf2.pbkdf2Sync(key, salt, 1, p * 128 * r, 'sha256'); - var tickCallback + let tickCallback; if (progressCallback) { - var totalOps = p * N * 2 - var currentOp = 0 + const totalOps = p * N * 2; + let currentOp = 0; - tickCallback = function () { + tickCallback = function() { return new Promise(function(resolve, reject) { - ++currentOp + ++currentOp; // send progress notifications once every 1,000 ops if (currentOp % 1000 === 0) { progressCallback({ current: currentOp, total: totalOps, - percent: (currentOp / totalOps) * 100.0 - }) - setTimeout(resolve, 10) + percent: (currentOp / totalOps) * 100.0, + }); + setTimeout(resolve, 10); } else { - resolve() + resolve(); } - }) - - - - } + }); + }; } - for (var i = 0; i < p; i++) { - await smix(B, i * 128 * r, r, N, V, XY) + for (let i = 0; i < p; i++) { + await smix(B, i * 128 * r, r, N, V, XY); if (typeof shold_stop_bip38 !== 'undefined') break; } - return pbkdf2.pbkdf2Sync(key, B, 1, dkLen, 'sha256') + return pbkdf2.pbkdf2Sync(key, B, 1, dkLen, 'sha256'); // all of these functions are actually moved to the top // due to function hoisting - async function smix (B, Bi, r, N, V, XY) { - var Xi = 0 - var Yi = 128 * r - var i + async function smix(B, Bi, r, N, V, XY) { + const Xi = 0; + const Yi = 128 * r; + let i; - B.copy(XY, Xi, Bi, Bi + Yi) + B.copy(XY, Xi, Bi, Bi + Yi); for (i = 0; i < N; i++) { - XY.copy(V, i * Yi, Xi, Xi + Yi) - blockmix_salsa8(XY, Xi, Yi, r) + XY.copy(V, i * Yi, Xi, Xi + Yi); + blockmix_salsa8(XY, Xi, Yi, r); if (tickCallback) { - await tickCallback() + await tickCallback(); if (typeof shold_stop_bip38 !== 'undefined') break; } } for (i = 0; i < N; i++) { - var offset = Xi + (2 * r - 1) * 64 - var j = XY.readUInt32LE(offset) & (N - 1) - blockxor(V, j * Yi, XY, Xi, Yi) - blockmix_salsa8(XY, Xi, Yi, r) + const offset = Xi + (2 * r - 1) * 64; + const j = XY.readUInt32LE(offset) & (N - 1); + blockxor(V, j * Yi, XY, Xi, Yi); + blockmix_salsa8(XY, Xi, Yi, r); if (tickCallback) { - await tickCallback() + await tickCallback(); if (typeof shold_stop_bip38 !== 'undefined') break; } } - XY.copy(B, Bi, Xi, Xi + Yi) + XY.copy(B, Bi, Xi, Xi + Yi); } - function blockmix_salsa8 (BY, Bi, Yi, r) { - var i + function blockmix_salsa8(BY, Bi, Yi, r) { + let i; - arraycopy(BY, Bi + (2 * r - 1) * 64, _X, 0, 64) + arraycopy(BY, Bi + (2 * r - 1) * 64, _X, 0, 64); for (i = 0; i < 2 * r; i++) { - blockxor(BY, i * 64, _X, 0, 64) - salsa20_8(_X) - arraycopy(_X, 0, BY, Yi + (i * 64), 64) + blockxor(BY, i * 64, _X, 0, 64); + salsa20_8(_X); + arraycopy(_X, 0, BY, Yi + i * 64, 64); } for (i = 0; i < r; i++) { - arraycopy(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64) + arraycopy(BY, Yi + i * 2 * 64, BY, Bi + i * 64, 64); } for (i = 0; i < r; i++) { - arraycopy(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64) + arraycopy(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64); } } - function R (a, b) { - return (a << b) | (a >>> (32 - b)) + function R(a, b) { + return (a << b) | (a >>> (32 - b)); } - function salsa20_8 (B) { - var i + function salsa20_8(B) { + let i; for (i = 0; i < 16; i++) { - B32[i] = (B[i * 4 + 0] & 0xff) << 0 - B32[i] |= (B[i * 4 + 1] & 0xff) << 8 - B32[i] |= (B[i * 4 + 2] & 0xff) << 16 - B32[i] |= (B[i * 4 + 3] & 0xff) << 24 + B32[i] = (B[i * 4 + 0] & 0xff) << 0; + B32[i] |= (B[i * 4 + 1] & 0xff) << 8; + B32[i] |= (B[i * 4 + 2] & 0xff) << 16; + B32[i] |= (B[i * 4 + 3] & 0xff) << 24; // B32[i] = B.readUInt32LE(i*4) <--- this is signficantly slower even in Node.js } - arraycopy(B32, 0, x, 0, 16) + arraycopy(B32, 0, x, 0, 16); for (i = 8; i > 0; i -= 2) { - x[4] ^= R(x[0] + x[12], 7) - x[8] ^= R(x[4] + x[0], 9) - x[12] ^= R(x[8] + x[4], 13) - x[0] ^= R(x[12] + x[8], 18) - x[9] ^= R(x[5] + x[1], 7) - x[13] ^= R(x[9] + x[5], 9) - x[1] ^= R(x[13] + x[9], 13) - x[5] ^= R(x[1] + x[13], 18) - x[14] ^= R(x[10] + x[6], 7) - x[2] ^= R(x[14] + x[10], 9) - x[6] ^= R(x[2] + x[14], 13) - x[10] ^= R(x[6] + x[2], 18) - x[3] ^= R(x[15] + x[11], 7) - x[7] ^= R(x[3] + x[15], 9) - x[11] ^= R(x[7] + x[3], 13) - x[15] ^= R(x[11] + x[7], 18) - x[1] ^= R(x[0] + x[3], 7) - x[2] ^= R(x[1] + x[0], 9) - x[3] ^= R(x[2] + x[1], 13) - x[0] ^= R(x[3] + x[2], 18) - x[6] ^= R(x[5] + x[4], 7) - x[7] ^= R(x[6] + x[5], 9) - x[4] ^= R(x[7] + x[6], 13) - x[5] ^= R(x[4] + x[7], 18) - x[11] ^= R(x[10] + x[9], 7) - x[8] ^= R(x[11] + x[10], 9) - x[9] ^= R(x[8] + x[11], 13) - x[10] ^= R(x[9] + x[8], 18) - x[12] ^= R(x[15] + x[14], 7) - x[13] ^= R(x[12] + x[15], 9) - x[14] ^= R(x[13] + x[12], 13) - x[15] ^= R(x[14] + x[13], 18) + x[4] ^= R(x[0] + x[12], 7); + x[8] ^= R(x[4] + x[0], 9); + x[12] ^= R(x[8] + x[4], 13); + x[0] ^= R(x[12] + x[8], 18); + x[9] ^= R(x[5] + x[1], 7); + x[13] ^= R(x[9] + x[5], 9); + x[1] ^= R(x[13] + x[9], 13); + x[5] ^= R(x[1] + x[13], 18); + x[14] ^= R(x[10] + x[6], 7); + x[2] ^= R(x[14] + x[10], 9); + x[6] ^= R(x[2] + x[14], 13); + x[10] ^= R(x[6] + x[2], 18); + x[3] ^= R(x[15] + x[11], 7); + x[7] ^= R(x[3] + x[15], 9); + x[11] ^= R(x[7] + x[3], 13); + x[15] ^= R(x[11] + x[7], 18); + x[1] ^= R(x[0] + x[3], 7); + x[2] ^= R(x[1] + x[0], 9); + x[3] ^= R(x[2] + x[1], 13); + x[0] ^= R(x[3] + x[2], 18); + x[6] ^= R(x[5] + x[4], 7); + x[7] ^= R(x[6] + x[5], 9); + x[4] ^= R(x[7] + x[6], 13); + x[5] ^= R(x[4] + x[7], 18); + x[11] ^= R(x[10] + x[9], 7); + x[8] ^= R(x[11] + x[10], 9); + x[9] ^= R(x[8] + x[11], 13); + x[10] ^= R(x[9] + x[8], 18); + x[12] ^= R(x[15] + x[14], 7); + x[13] ^= R(x[12] + x[15], 9); + x[14] ^= R(x[13] + x[12], 13); + x[15] ^= R(x[14] + x[13], 18); } - for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i] + for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i]; for (i = 0; i < 16; i++) { - var bi = i * 4 - B[bi + 0] = (B32[i] >> 0 & 0xff) - B[bi + 1] = (B32[i] >> 8 & 0xff) - B[bi + 2] = (B32[i] >> 16 & 0xff) - B[bi + 3] = (B32[i] >> 24 & 0xff) + const bi = i * 4; + B[bi + 0] = (B32[i] >> 0) & 0xff; + B[bi + 1] = (B32[i] >> 8) & 0xff; + B[bi + 2] = (B32[i] >> 16) & 0xff; + B[bi + 3] = (B32[i] >> 24) & 0xff; // B.writeInt32LE(B32[i], i*4) //<--- this is signficantly slower even in Node.js } } // naive approach... going back to loop unrolling may yield additional performance - function blockxor (S, Si, D, Di, len) { - for (var i = 0; i < len; i++) { - D[Di + i] ^= S[Si + i] + function blockxor(S, Si, D, Di, len) { + for (let i = 0; i < len; i++) { + D[Di + i] ^= S[Si + i]; } } } -function arraycopy (src, srcPos, dest, destPos, length) { +function arraycopy(src, srcPos, dest, destPos, length) { if (Buffer.isBuffer(src) && Buffer.isBuffer(dest)) { - src.copy(dest, destPos, srcPos, srcPos + length) + src.copy(dest, destPos, srcPos, srcPos + length); } else { while (length--) { - dest[destPos++] = src[srcPos++] + dest[destPos++] = src[srcPos++]; } } } -module.exports = scrypt +module.exports = scrypt; diff --git a/bip70/bip70.js b/bip70/bip70.js index daec0ce43a..28410a4b97 100644 --- a/bip70/bip70.js +++ b/bip70/bip70.js @@ -32,7 +32,7 @@ export default class BitcoinBIP70TransactionDecode { Accept: 'application/payment-request', }, }); - let response = await api.get(); + const response = await api.get(); if (response && response.body) { const parsedJSON = JSON.parse(response.body); @@ -55,7 +55,9 @@ export default class BitcoinBIP70TransactionDecode { resolve(decodedTransaction); } else { console.log('Could not fetch transaction details: ' + response.err); - throw new BitcoinBIP70TransactionError('Unable to fetch transaction details. Please, make sure the provided link is valid.'); + throw new BitcoinBIP70TransactionError( + 'Unable to fetch transaction details. Please, make sure the provided link is valid.', + ); } } catch (err) { console.warn(err); @@ -74,6 +76,11 @@ export default class BitcoinBIP70TransactionDecode { } static matchesPaymentURL(data) { - return data !== null && (data.match(/bitcoin:\?r=https?:\/\/\S+/gi) !== null || data.startsWith('https://bitpay.com/i/') || data.startsWith('https://www.bitpay.com/i/')); + return ( + data !== null && + (data.match(/bitcoin:\?r=https?:\/\/\S+/gi) !== null || + data.startsWith('https://bitpay.com/i/') || + data.startsWith('https://www.bitpay.com/i/')) + ); } } diff --git a/class/abstract-hd-wallet.js b/class/abstract-hd-wallet.js index 1d140f54e5..00362a950a 100644 --- a/class/abstract-hd-wallet.js +++ b/class/abstract-hd-wallet.js @@ -1,7 +1,7 @@ +import * as bip39 from 'bip39'; + import { LegacyWallet } from './legacy-wallet'; -import Frisbee from 'frisbee'; -const bitcoin = require('bitcoinjs-lib'); -const bip39 = require('bip39'); + const BlueElectrum = require('../BlueElectrum'); export class AbstractHDWallet extends LegacyWallet { @@ -10,14 +10,11 @@ export class AbstractHDWallet extends LegacyWallet { constructor() { super(); - this.next_free_address_index = 0; - this.next_free_change_address_index = 0; - this.internal_addresses_cache = {}; // index => address - this.external_addresses_cache = {}; // index => address this._xpub = ''; // cache - this.usedAddresses = []; + this._address = []; this._address_to_wif_cache = {}; - this.gap_limit = 20; + this._addr_balances = {}; + this.num_addresses = 10; } prepareForSerialization() { @@ -35,61 +32,14 @@ export class AbstractHDWallet extends LegacyWallet { } getTransactions() { - // need to reformat txs, as we are expected to return them in blockcypher format, - // but they are from blockchain.info actually (for all hd wallets) - - let uniq = {}; - let txs = []; - for (let tx of this.transactions) { - if (uniq[tx.hash]) continue; - uniq[tx.hash] = 1; - txs.push(AbstractHDWallet.convertTx(tx)); - } - - return txs; - } - - static convertTx(tx) { - // console.log('converting', tx); - var clone = Object.assign({}, tx); - clone.received = new Date(clone.time * 1000).toISOString(); - clone.outputs = clone.out; - if (clone.confirmations === undefined) { - clone.confirmations = 0; - } - for (let o of clone.outputs) { - o.addresses = [o.addr]; - } - for (let i of clone.inputs) { - if (i.prev_out && i.prev_out.addr) { - i.addresses = [i.prev_out.addr]; - } - } - - if (!clone.value) { - let value = 0; - for (let inp of clone.inputs) { - if (inp.prev_out && inp.prev_out.xpub) { - // our owned - value -= inp.prev_out.value; - } - } - - for (let out of clone.out) { - if (out.xpub) { - // to us - value += out.value; - } - } - clone.value = value; - } - - return clone; + return super.getTransactions(); } - setSecret(newSecret) { + async setSecret(newSecret) { this.secret = newSecret.trim().toLowerCase(); this.secret = this.secret.replace(/[^a-zA-Z0-9]/g, ' ').replace(/\s+/g, ' '); + this._address = []; + await this.generateAddresses(); return this; } @@ -100,94 +50,28 @@ export class AbstractHDWallet extends LegacyWallet { return bip39.validateMnemonic(this.secret); } - getMnemonicToSeedHex() { - return bip39.mnemonicToSeedHex(this.secret); - } - - /** - * Derives from hierarchy, returns next free address - * (the one that has no transactions). Looks for several, - * gives up if none found, and returns the used one - * - * @return {Promise.} - */ - async getAddressAsync() { - // looking for free external address - let freeAddress = ''; - let c; - for (c = 0; c < this.gap_limit + 1; c++) { - if (this.next_free_address_index + c < 0) continue; - let address = this._getExternalAddressByIndex(this.next_free_address_index + c); - this.external_addresses_cache[this.next_free_address_index + c] = address; // updating cache just for any case - let txs = []; - try { - txs = await BlueElectrum.getTransactionsByAddress(address); - } catch (Err) { - console.warn('BlueElectrum.getTransactionsByAddress()', Err.message); - } - if (txs.length === 0) { - // found free address - freeAddress = address; - this.next_free_address_index += c; // now points to _this one_ - break; - } - } + async getMnemonicToSeedHex() { + const seed = await bip39.mnemonicToSeed(this.secret); - if (!freeAddress) { - // could not find in cycle above, give up - freeAddress = this._getExternalAddressByIndex(this.next_free_address_index + c); // we didnt check this one, maybe its free - this.next_free_address_index += c + 1; // now points to the one _after_ - } + return seed.toString('hex'); + } - return freeAddress; + getAddressForTransaction() { + return this._getAddressWithLowestBalance(); } - /** - * Derives from hierarchy, returns next free CHANGE address - * (the one that has no transactions). Looks for several, - * gives up if none found, and returns the used one - * - * @return {Promise.} - */ - async getChangeAddressAsync() { - // looking for free internal address - let freeAddress = ''; - let c; - for (c = 0; c < this.gap_limit + 1; c++) { - if (this.next_free_change_address_index + c < 0) continue; - let address = this._getInternalAddressByIndex(this.next_free_change_address_index + c); - this.internal_addresses_cache[this.next_free_change_address_index + c] = address; // updating cache just for any case - let txs = []; - try { - txs = await BlueElectrum.getTransactionsByAddress(address); - } catch (Err) { - console.warn('BlueElectrum.getTransactionsByAddress()', Err.message); + _getAddressWithLowestBalance() { + let min = 1e6; + let addr_min = false; + for (const addr in this._addr_balances) { + const balance = this._addr_balances[addr].total; + if (balance === 0) return addr; + if (balance < min) { + min = balance; + addr_min = addr; } - if (txs.length === 0) { - // found free address - freeAddress = address; - this.next_free_change_address_index += c; // now points to _this one_ - break; - } - } - - if (!freeAddress) { - // could not find in cycle above, give up - freeAddress = this._getExternalAddressByIndex(this.next_free_address_index + c); // we didnt check this one, maybe its free - this.next_free_address_index += c + 1; // now points to the one _after_ } - - return freeAddress; - } - - /** - * Should not be used in HD wallets - * - * @deprecated - * @return {string} - */ - getAddress() { - return ''; + return addr_min; } _getExternalWIFByIndex(index) { @@ -210,110 +94,28 @@ export class AbstractHDWallet extends LegacyWallet { throw new Error('Not implemented'); } - /** - * Async function to fetch all transactions. Use getter to get actual txs. - * Also, sets internals: - * `this.internal_addresses_cache` - * `this.external_addresses_cache` - * - * @returns {Promise} - */ async fetchTransactions() { + const txids_to_update = []; try { - const api = new Frisbee({ baseURI: 'https://blockchain.info' }); - this.transactions = []; - let offset = 0; - - while (1) { - let response = await api.get('/multiaddr?active=' + this.getXpub() + '&n=100&offset=' + offset); - - if (response && response.body) { - if (response.body.txs && response.body.txs.length === 0) { - break; - } - - let latestBlock = false; - if (response.body.info && response.body.info.latest_block) { - latestBlock = response.body.info.latest_block.height; - } - - this._lastTxFetch = +new Date(); - - // processing TXs and adding to internal memory - if (response.body.txs) { - for (let tx of response.body.txs) { - let value = 0; - - for (let input of tx.inputs) { - // ----- INPUTS - if (input.prev_out.xpub) { - // sent FROM US - value -= input.prev_out.value; - - // setting internal caches to help ourselves in future... - let path = input.prev_out.xpub.path.split('/'); - if (path[path.length - 2] === '1') { - // change address - this.next_free_change_address_index = Math.max(path[path.length - 1] * 1 + 1, this.next_free_change_address_index); - // setting to point to last maximum known change address + 1 - } - if (path[path.length - 2] === '0') { - // main (aka external) address - this.next_free_address_index = Math.max(path[path.length - 1] * 1 + 1, this.next_free_address_index); - // setting to point to last maximum known main address + 1 - } - // done with cache - } - } - - for (let output of tx.out) { - // ----- OUTPUTS - if (output.xpub) { - // sent TO US (change) - value += output.value; - - // setting internal caches to help ourselves in future... - let path = output.xpub.path.split('/'); - if (path[path.length - 2] === '1') { - // change address - this.next_free_change_address_index = Math.max(path[path.length - 1] * 1 + 1, this.next_free_change_address_index); - // setting to point to last maximum known change address + 1 - } - if (path[path.length - 2] === '0') { - // main (aka external) address - this.next_free_address_index = Math.max(path[path.length - 1] * 1 + 1, this.next_free_address_index); - // setting to point to last maximum known main address + 1 - } - // done with cache - } - } - - tx.value = value; // new BigNumber(value).div(100000000).toString() * 1; - if (!tx.confirmations && latestBlock) { - tx.confirmations = latestBlock - tx.block_height + 1; - } - - this.transactions.push(tx); - } - - if (response.body.txs.length < 100) { - // this fetch yilded less than page size, thus requesting next batch makes no sense - break; - } - } else { - break; // error ? - } - } else { - throw new Error('Could not fetch transactions from API: ' + response.err); // breaks here + this._lastTxFetch = +new Date(); + const tx_addr_dict = await BlueElectrum.multiGetHistoryByAddress(this.getAddress()); + for (const addr in tx_addr_dict) { + for (const tx of tx_addr_dict[addr]) { + if (!this.transactionConfirmed(tx.tx_hash)) txids_to_update.push(tx.tx_hash); } - - offset += 100; } + if (txids_to_update) await this._update_unconfirmed_tx(txids_to_update); } catch (err) { - console.warn(err); + console.warn(err.message); } } + getAddress() { + if (!this._address) { + this.generateAddresses(); + } + return this._address; + } /** * Given that `address` is in our HD hierarchy, try to find * corresponding WIF @@ -322,36 +124,7 @@ export class AbstractHDWallet extends LegacyWallet { * @return {String} WIF if found */ _getWifForAddress(address) { - if (this._address_to_wif_cache[address]) return this._address_to_wif_cache[address]; // cache hit - - // fast approach, first lets iterate over all addressess we have in cache - for (let index of Object.keys(this.internal_addresses_cache)) { - if (this._getInternalAddressByIndex(index) === address) { - return (this._address_to_wif_cache[address] = this._getInternalWIFByIndex(index)); - } - } - - for (let index of Object.keys(this.external_addresses_cache)) { - if (this._getExternalAddressByIndex(index) === address) { - return (this._address_to_wif_cache[address] = this._getExternalWIFByIndex(index)); - } - } - - // no luck - lets iterate over all addresses we have up to first unused address index - for (let c = 0; c <= this.next_free_change_address_index + this.gap_limit; c++) { - let possibleAddress = this._getInternalAddressByIndex(c); - if (possibleAddress === address) { - return (this._address_to_wif_cache[address] = this._getInternalWIFByIndex(c)); - } - } - - for (let c = 0; c <= this.next_free_address_index + this.gap_limit; c++) { - let possibleAddress = this._getExternalAddressByIndex(c); - if (possibleAddress === address) { - return (this._address_to_wif_cache[address] = this._getExternalWIFByIndex(c)); - } - } - + if (this._address_to_wif_cache[address]) return this._address_to_wif_cache[address]; throw new Error('Could not find WIF for ' + address); } @@ -361,205 +134,34 @@ export class AbstractHDWallet extends LegacyWallet { async fetchBalance() { try { - let that = this; - - // refactor me - // eslint-disable-next-line - async function binarySearchIterationForInternalAddress(index, maxUsedIndex = 0, minUnusedIndex = 100500100, depth = 0) { - if (depth >= 20) return maxUsedIndex + 1; // fail - let txs = await BlueElectrum.getTransactionsByAddress(that._getInternalAddressByIndex(index)); - if (txs.length === 0) { - if (index === 0) return 0; - minUnusedIndex = Math.min(minUnusedIndex, index); // set - index = Math.floor((index - maxUsedIndex) / 2 + maxUsedIndex); - } else { - maxUsedIndex = Math.max(maxUsedIndex, index); // set - let txs2 = await BlueElectrum.getTransactionsByAddress(that._getInternalAddressByIndex(index + 1)); - if (txs2.length === 0) return index + 1; // thats our next free address - - index = Math.round((minUnusedIndex - index) / 2 + index); - } - - return binarySearchIterationForInternalAddress(index, maxUsedIndex, minUnusedIndex, depth + 1); - } - - // refactor me - // eslint-disable-next-line - async function binarySearchIterationForExternalAddress(index, maxUsedIndex = 0, minUnusedIndex = 100500100, depth = 0) { - if (depth >= 20) return maxUsedIndex + 1; // fail - let txs = await BlueElectrum.getTransactionsByAddress(that._getExternalAddressByIndex(index)); - if (txs.length === 0) { - if (index === 0) return 0; - minUnusedIndex = Math.min(minUnusedIndex, index); // set - index = Math.floor((index - maxUsedIndex) / 2 + maxUsedIndex); - } else { - maxUsedIndex = Math.max(maxUsedIndex, index); // set - let txs2 = await BlueElectrum.getTransactionsByAddress(that._getExternalAddressByIndex(index + 1)); - if (txs2.length === 0) return index + 1; // thats our next free address - - index = Math.round((minUnusedIndex - index) / 2 + index); - } - - return binarySearchIterationForExternalAddress(index, maxUsedIndex, minUnusedIndex, depth + 1); + const balance = await BlueElectrum.multiGetBalanceByAddress(this.getAddress()); + this.balance = balance.balance + balance.unconfirmed_balance; + this.unconfirmed_balance = balance.unconfirmed_balance; + this._lastBalanceFetch = +new Date(); + for (const address in balance.addresses) { + this._addr_balances[address] = { + total: balance.addresses[address].unconfirmed + balance.addresses[address].confirmed, + c: balance.addresses[address].confirmed, + u: balance.addresses[address].unconfirmed, + }; } - - if (this.next_free_change_address_index === 0 && this.next_free_address_index === 0) { - // assuming that this is freshly imported/created wallet, with no internal variables set - // wild guess - its completely empty wallet: - let completelyEmptyWallet = false; - let txs = await BlueElectrum.getTransactionsByAddress(that._getInternalAddressByIndex(0)); - if (txs.length === 0) { - let txs2 = await BlueElectrum.getTransactionsByAddress(that._getExternalAddressByIndex(0)); - if (txs2.length === 0) { - // yep, completely empty wallet - completelyEmptyWallet = true; - } - } - - // wrong guess. will have to rescan - if (!completelyEmptyWallet) { - // so doing binary search for last used address: - this.next_free_change_address_index = await binarySearchIterationForInternalAddress(1000); - this.next_free_address_index = await binarySearchIterationForExternalAddress(1000); - } - } // end rescanning fresh wallet - - // finally fetching balance - await this._fetchBalance(); } catch (err) { - console.warn(err); - } - } - - async _fetchBalance() { - // probing future addressess in hierarchy whether they have any transactions, in case - // our 'next free addr' pointers are lagging behind - let tryAgain = false; - let txs = await BlueElectrum.getTransactionsByAddress( - this._getExternalAddressByIndex(this.next_free_address_index + this.gap_limit - 1), - ); - if (txs.length > 0) { - // whoa, someone uses our wallet outside! better catch up - this.next_free_address_index += this.gap_limit; - tryAgain = true; - } - - txs = await BlueElectrum.getTransactionsByAddress( - this._getInternalAddressByIndex(this.next_free_change_address_index + this.gap_limit - 1), - ); - if (txs.length > 0) { - this.next_free_change_address_index += this.gap_limit; - tryAgain = true; - } - - // FIXME: refactor me ^^^ can be batched in single call - - if (tryAgain) return this._fetchBalance(); - - // next, business as usuall. fetch balances - - this.usedAddresses = []; - // generating all involved addresses: - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - this.usedAddresses.push(this._getExternalAddressByIndex(c)); + console.warn(err.message); } - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - this.usedAddresses.push(this._getInternalAddressByIndex(c)); - } - let balance = await BlueElectrum.multiGetBalanceByAddress(this.usedAddresses); - this.balance = balance.balance; - this.unconfirmed_balance = balance.unconfirmed_balance; - this._lastBalanceFetch = +new Date(); } - async _fetchUtxoBatch(addresses) { - const api = new Frisbee({ - baseURI: 'https://blockchain.info', - }); - - addresses = addresses.join('|'); - let utxos = []; - - let response; - let uri; + async fetchUtxo() { try { - uri = 'https://blockchain.info' + '/unspent?active=' + addresses + '&limit=1000'; - response = await api.get('/unspent?active=' + addresses + '&limit=1000'); - // this endpoint does not support offset of some kind o_O - // so doing only one call - let json = response.body; - if (typeof json === 'undefined' || typeof json.unspent_outputs === 'undefined') { - throw new Error('Could not fetch UTXO from API ' + response.err); - } - - for (let unspent of json.unspent_outputs) { - // a lil transform for signer module - unspent.txid = unspent.tx_hash_big_endian; - unspent.vout = unspent.tx_output_n; - unspent.amount = unspent.value; - - unspent.address = bitcoin.address.fromOutputScript(Buffer.from(unspent.script, 'hex')); - utxos.push(unspent); - } + this.utxo = []; + const utxos = await BlueElectrum.multiGetUtxoByAddress(this.getAddress()); + this.utxo = utxos; } catch (err) { - console.warn(err, { uri }); - } - - return utxos; - } - - /** - * @inheritDoc - */ - async fetchUtxo() { - if (this.usedAddresses.length === 0) { - // just for any case, refresh balance (it refreshes internal `this.usedAddresses`) - await this.fetchBalance(); - } - - this.utxo = []; - let addresses = this.usedAddresses; - addresses.push(this._getExternalAddressByIndex(this.next_free_address_index)); - addresses.push(this._getInternalAddressByIndex(this.next_free_change_address_index)); - - let duplicateUtxos = {}; - - let batch = []; - for (let addr of addresses) { - batch.push(addr); - if (batch.length >= 75) { - let utxos = await this._fetchUtxoBatch(batch); - for (let utxo of utxos) { - let key = utxo.txid + utxo.vout; - if (!duplicateUtxos[key]) { - this.utxo.push(utxo); - duplicateUtxos[key] = 1; - } - } - batch = []; - } - } - - // final batch - if (batch.length > 0) { - let utxos = await this._fetchUtxoBatch(batch); - for (let utxo of utxos) { - let key = utxo.txid + utxo.vout; - if (!duplicateUtxos[key]) { - this.utxo.push(utxo); - duplicateUtxos[key] = 1; - } - } + console.warn(err.message); } } weOwnAddress(addr) { - let hashmap = {}; - for (let a of this.usedAddresses) { - hashmap[a] = 1; - } - - return hashmap[addr] === 1; + return this._address.includes(addr); } _getDerivationPathByAddress(address) { @@ -569,4 +171,8 @@ export class AbstractHDWallet extends LegacyWallet { _getNodePubkeyByIndex(address) { throw new Error('Not implemented'); } + + generateAddresses() { + throw new Error('Not implemented'); + } } diff --git a/class/abstract-wallet.js b/class/abstract-wallet.js index 21f22a8334..cd0a05bfd9 100644 --- a/class/abstract-wallet.js +++ b/class/abstract-wallet.js @@ -1,13 +1,15 @@ import { BitcoinUnit, Chain } from '../models/bitcoinUnits'; + const createHash = require('create-hash'); + export class AbstractWallet { static type = 'abstract'; static typeReadable = 'abstract'; static fromJson(obj) { - let obj2 = JSON.parse(obj); - let temp = new this(); - for (let key2 of Object.keys(obj2)) { + const obj2 = JSON.parse(obj); + const temp = new this(); + for (const key2 of Object.keys(obj2)) { temp[key2] = obj2[key2]; } @@ -19,10 +21,11 @@ export class AbstractWallet { this.typeReadable = this.constructor.typeReadable; this.label = ''; this.secret = ''; // private key or recovery phrase - this.balance = 0; - this.unconfirmed_balance = 0; + this.balance = 0; // SAT + this.unconfirmed_balance = 0; // SAT this.transactions = []; - this._address = false; // cache + this.unconfirmed_transactions = []; + this._address = false; this.utxo = []; this._lastTxFetch = 0; this._lastBalanceFetch = 0; @@ -39,7 +42,7 @@ export class AbstractWallet { } getTransactions() { - return this.transactions; + return this.unconfirmed_transactions.concat(this.transactions); } /** @@ -59,11 +62,11 @@ export class AbstractWallet { * @returns {number} Available to spend amount, int, in sats */ getBalance() { - return this.balance; + return this.balance + this.unconfirmed_balance; } getPreferredBalanceUnit() { - for (let value of Object.values(BitcoinUnit)) { + for (const value of Object.values(BitcoinUnit)) { if (value === this.preferredBalanceUnit) { return this.preferredBalanceUnit; } @@ -79,7 +82,7 @@ export class AbstractWallet { return true; } - allowSendMax(): boolean { + allowSendMax() { return false; } @@ -92,7 +95,7 @@ export class AbstractWallet { } weOwnAddress(address) { - return this._address === address; + return this.getAddress() === address; } /** @@ -132,4 +135,8 @@ export class AbstractWallet { getAddressAsync() { return new Promise(resolve => resolve(this.getAddress())); } + + getUtxo() { + return this.utxo; + } } diff --git a/class/app-storage.js b/class/app-storage.js index a4e67836de..68cb49d289 100644 --- a/class/app-storage.js +++ b/class/app-storage.js @@ -1,7 +1,8 @@ import AsyncStorage from '@react-native-community/async-storage'; import RNSecureKeyStore, { ACCESSIBLE } from 'react-native-secure-key-store'; + +import WatchConnectivity from '../WatchConnectivity'; import { - HDLegacyBreadwalletWallet, HDSegwitP2SHWallet, HDLegacyP2PKHWallet, WatchOnlyWallet, @@ -10,8 +11,8 @@ import { SegwitBech32Wallet, HDSegwitBech32Wallet, } from './'; -import { LightningCustodianWallet } from './lightning-custodian-wallet'; -import WatchConnectivity from '../WatchConnectivity'; +import DeviceQuickActions from './quickActions'; + const encryption = require('../encryption'); export class AppStorage { @@ -67,7 +68,9 @@ export class AppStorage { */ setItem(key, value) { if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - return RNSecureKeyStore.set(key, value, { accessible: ACCESSIBLE.WHEN_UNLOCKED }); + return RNSecureKeyStore.set(key, value, { + accessible: ACCESSIBLE.WHEN_UNLOCKED, + }); } else { return AsyncStorage.setItem(key, value); } @@ -109,7 +112,7 @@ export class AppStorage { decryptData(data, password) { data = JSON.parse(data); let decrypted; - for (let value of data) { + for (const value of data) { try { decrypted = encryption.decrypt(value, password); } catch (e) { @@ -130,13 +133,15 @@ export class AppStorage { let data = await this.getItem('data'); // TODO: refactor ^^^ (should not save & load to fetch data) - let encrypted = encryption.encrypt(data, password); + const encrypted = encryption.encrypt(data, password); data = []; data.push(encrypted); // putting in array as we might have many buckets with storages data = JSON.stringify(data); this.cachedPassword = password; await this.setItem('data', data); await this.setItem(AppStorage.FLAG_ENCRYPTED, '1'); + DeviceQuickActions.clearShortcutItems(); + DeviceQuickActions.removeAllWallets(); } /** @@ -149,7 +154,7 @@ export class AppStorage { this.wallets = []; this.tx_metadata = {}; - let data = { + const data = { wallets: [], tx_metadata: {}, }; @@ -183,10 +188,10 @@ export class AppStorage { if (data !== null) { data = JSON.parse(data); if (!data.wallets) return false; - let wallets = data.wallets; - for (let key of wallets) { + const wallets = data.wallets; + for (const key of wallets) { // deciding which type is wallet and instatiating correct object - let tempObj = JSON.parse(key); + const tempObj = JSON.parse(key); let unserializedWallet; switch (tempObj.type) { case SegwitBech32Wallet.type: @@ -208,31 +213,6 @@ export class AppStorage { case HDSegwitBech32Wallet.type: unserializedWallet = HDSegwitBech32Wallet.fromJson(key); break; - case HDLegacyBreadwalletWallet.type: - unserializedWallet = HDLegacyBreadwalletWallet.fromJson(key); - break; - case LightningCustodianWallet.type: - /** @type {LightningCustodianWallet} */ - unserializedWallet = LightningCustodianWallet.fromJson(key); - let lndhub = false; - try { - lndhub = await AsyncStorage.getItem(AppStorage.LNDHUB); - } catch (Error) { - console.warn(Error); - } - - if (unserializedWallet.baseURI) { - unserializedWallet.setBaseURI(unserializedWallet.baseURI); // not really necessary, just for the sake of readability - console.log('using saved uri for for ln wallet:', unserializedWallet.baseURI); - } else if (lndhub) { - console.log('using wallet-wide settings ', lndhub, 'for ln wallet'); - unserializedWallet.setBaseURI(lndhub); - } else { - console.log('using default', LightningCustodianWallet.defaultBaseUri, 'for ln wallet'); - unserializedWallet.setBaseURI(LightningCustodianWallet.defaultBaseUri); - } - unserializedWallet.init(); - break; case LegacyWallet.type: default: unserializedWallet = LegacyWallet.fromJson(key); @@ -244,8 +224,15 @@ export class AppStorage { this.tx_metadata = data.tx_metadata; } } - WatchConnectivity.init(); - WatchConnectivity.shared && (await WatchConnectivity.shared.sendWalletsToWatch()); + WatchConnectivity.shared.wallets = this.wallets; + WatchConnectivity.shared.tx_metadata = this.tx_metadata; + WatchConnectivity.shared.fetchTransactionsFunction = async () => { + await this.fetchWalletTransactions(); + await this.saveToDisk(); + }; + await WatchConnectivity.shared.sendWalletsToWatch(this.wallets); + DeviceQuickActions.setWallets(this.wallets); + DeviceQuickActions.setQuickActions(); return true; } else { return false; // failed loading data or loading/decryptin data @@ -263,9 +250,10 @@ export class AppStorage { * @param wallet {AbstractWallet} */ deleteWallet(wallet) { - let secret = wallet.getSecret(); - let tempWallets = []; - for (let value of this.wallets) { + const secret = wallet.getSecret(); + const tempWallets = []; + + for (const value of this.wallets) { if (value.getSecret() === secret) { // the one we should delete // nop @@ -285,8 +273,8 @@ export class AppStorage { * @returns {Promise} Result of storage save */ async saveToDisk() { - let walletsToSave = []; - for (let key of this.wallets) { + const walletsToSave = []; + for (const key of this.wallets) { if (typeof key === 'boolean') continue; if (key.prepareForSerialization) key.prepareForSerialization(); walletsToSave.push(JSON.stringify({ ...key, type: key.type })); @@ -301,9 +289,9 @@ export class AppStorage { // should find the correct bucket, encrypt and then save let buckets = await this.getItem('data'); buckets = JSON.parse(buckets); - let newData = []; - for (let bucket of buckets) { - let decrypted = encryption.decrypt(bucket, this.cachedPassword); + const newData = []; + for (const bucket of buckets) { + const decrypted = encryption.decrypt(bucket, this.cachedPassword); if (!decrypted) { // no luck decrypting, its not our bucket newData.push(bucket); @@ -318,8 +306,11 @@ export class AppStorage { } else { await this.setItem(AppStorage.FLAG_ENCRYPTED, ''); // drop the flag } - WatchConnectivity.init(); - WatchConnectivity.shared && WatchConnectivity.shared.sendWalletsToWatch(); + WatchConnectivity.shared.wallets = this.wallets; + WatchConnectivity.shared.tx_metadata = this.tx_metadata; + WatchConnectivity.shared.sendWalletsToWatch(); + DeviceQuickActions.setWallets(this.wallets); + DeviceQuickActions.setQuickActions(); return this.setItem('data', JSON.stringify(data)); } @@ -335,13 +326,13 @@ export class AppStorage { console.log('fetchWalletBalances for wallet#', index); if (index || index === 0) { let c = 0; - for (let wallet of this.wallets) { + for (const wallet of this.wallets) { if (c++ === index) { await wallet.fetchBalance(); } } } else { - for (let wallet of this.wallets) { + for (const wallet of this.wallets) { await wallet.fetchBalance(); } } @@ -353,7 +344,7 @@ export class AppStorage { * To access transactions - get them from each respective wallet. * If index is present then fetch only from this specific wallet. * - * @param index {Integer} Index of the wallet in this.wallets array, + * @param index {Integer=} Index of the wallet in this.wallets array, * blank to fetch from all wallets * @return {Promise.} */ @@ -361,7 +352,7 @@ export class AppStorage { console.log('fetchWalletTransactions for wallet#', index); if (index || index === 0) { let c = 0; - for (let wallet of this.wallets) { + for (const wallet of this.wallets) { if (c++ === index) { await wallet.fetchTransactions(); if (wallet.fetchPendingTransactions) { @@ -373,7 +364,7 @@ export class AppStorage { } } } else { - for (let wallet of this.wallets) { + for (const wallet of this.wallets) { await wallet.fetchTransactions(); if (wallet.fetchPendingTransactions) { await wallet.fetchPendingTransactions(); @@ -405,7 +396,7 @@ export class AppStorage { if (index || index === 0) { let txs = []; let c = 0; - for (let wallet of this.wallets) { + for (const wallet of this.wallets) { if (c++ === index) { txs = txs.concat(wallet.getTransactions()); } @@ -414,15 +405,15 @@ export class AppStorage { } let txs = []; - for (let wallet of this.wallets) { - let walletTransactions = wallet.getTransactions(); - for (let t of walletTransactions) { + for (const wallet of this.wallets) { + const walletTransactions = wallet.getTransactions(); + for (const t of walletTransactions) { t.walletPreferredBalanceUnit = wallet.getPreferredBalanceUnit(); } txs = txs.concat(walletTransactions); } - for (let t of txs) { + for (const t of txs) { t.sort_ts = +new Date(t.received); } @@ -440,8 +431,8 @@ export class AppStorage { */ getBalance() { let finalBalance = 0; - for (let wal of this.wallets) { - finalBalance += wal.balance; + for (const wal of this.wallets) { + finalBalance += wal.getBalance(); } return finalBalance; } @@ -455,4 +446,4 @@ export class AppStorage { async sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } -} \ No newline at end of file +} diff --git a/class/biometrics.js b/class/biometrics.js index d2e9d58f31..d002900406 100644 --- a/class/biometrics.js +++ b/class/biometrics.js @@ -1,15 +1,17 @@ import Biometrics from 'react-native-biometrics'; + const BlueApp = require('../BlueApp'); export default class Biometric { static STORAGEKEY = 'Biometrics'; static FaceID = Biometrics.FaceID; static TouchID = Biometrics.TouchID; + static Biometrics = Biometrics.Biometrics; static async isDeviceBiometricCapable() { - const isDeviceBiometricCapable = await Biometric.biometricType(); - if (typeof isDeviceBiometricCapable === 'string') { - return isDeviceBiometricCapable; + const isDeviceBiometricCapable = await Biometrics.isSensorAvailable(); + if (isDeviceBiometricCapable.available) { + return true; } Biometric.setBiometricUseEnabled(false); return false; @@ -18,7 +20,7 @@ export default class Biometric { static async biometricType() { try { const isSensorAvailable = await Biometrics.isSensorAvailable(); - return isSensorAvailable; + return isSensorAvailable.biometryType; } catch (e) { console.log(e); } @@ -49,8 +51,10 @@ export default class Biometric { const isDeviceBiometricCapable = await Biometric.isDeviceBiometricCapable(); if (isDeviceBiometricCapable) { try { - await Biometrics.simplePrompt('Please confirm your identity.'); - return true; + const isConfirmed = await Biometrics.simplePrompt({ + promptMessage: 'Please confirm your identity.', + }); + return isConfirmed.success; } catch (_e) { return false; } diff --git a/class/hd-legacy-breadwallet-wallet.js b/class/hd-legacy-breadwallet-wallet.js deleted file mode 100644 index 943746b66c..0000000000 --- a/class/hd-legacy-breadwallet-wallet.js +++ /dev/null @@ -1,115 +0,0 @@ -import { AbstractHDWallet } from './abstract-hd-wallet'; -import Frisbee from 'frisbee'; -import bip39 from 'bip39'; -const bip32 = require('bip32'); -const bitcoinjs = require('bitcoinjs-lib'); - -/** - * HD Wallet (BIP39). - * In particular, Breadwallet-compatible (Legacy addresses) - */ -export class HDLegacyBreadwalletWallet extends AbstractHDWallet { - static type = 'HDLegacyBreadwallet'; - static typeReadable = 'HD Legacy Breadwallet (P2PKH)'; - - /** - * @see https://github.com/bitcoinjs/bitcoinjs-lib/issues/584 - * @see https://github.com/bitcoinjs/bitcoinjs-lib/issues/914 - * @see https://github.com/bitcoinjs/bitcoinjs-lib/issues/997 - */ - getXpub() { - if (this._xpub) { - return this._xpub; // cache hit - } - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = bip32.fromSeed(seed); - - const path = "m/0'"; - const child = root.derivePath(path).neutered(); - this._xpub = child.toBase58(); - - return this._xpub; - } - - _getExternalAddressByIndex(index) { - index = index * 1; // cast to int - if (this.external_addresses_cache[index]) return this.external_addresses_cache[index]; // cache hit - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = bip32.fromSeed(seed); - - const path = "m/0'/0/" + index; - const child = root.derivePath(path); - - const address = bitcoinjs.payments.p2pkh({ - pubkey: child.publicKey, - }).address; - - return (this.external_addresses_cache[index] = address); - } - - _getInternalAddressByIndex(index) { - index = index * 1; // cast to int - if (this.internal_addresses_cache[index]) return this.internal_addresses_cache[index]; // cache hit - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = bip32.fromSeed(seed); - - const path = "m/0'/1/" + index; - const child = root.derivePath(path); - - const address = bitcoinjs.payments.p2pkh({ - pubkey: child.publicKey, - }).address; - - return (this.internal_addresses_cache[index] = address); - } - - _getExternalWIFByIndex(index) { - return this._getWIFByIndex(false, index); - } - - _getInternalWIFByIndex(index) { - return this._getWIFByIndex(true, index); - } - - /** - * Get internal/external WIF by wallet index - * @param {Boolean} internal - * @param {Number} index - * @returns {*} - * @private - */ - _getWIFByIndex(internal, index) { - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = bitcoinjs.bip32.fromSeed(seed); - const path = `m/0'/${internal ? 1 : 0}/${index}`; - const child = root.derivePath(path); - - return child.keyPair.toWIF(); - } - - /** - * @inheritDoc - */ - async fetchBalance() { - try { - const api = new Frisbee({ baseURI: 'https://blockchain.info' }); - - let response = await api.get('/balance?active=' + this.getXpub()); - - if (response && response.body) { - for (let xpub of Object.keys(response.body)) { - this.balance = response.body[xpub].final_balance / 100000000; - } - this._lastBalanceFetch = +new Date(); - } else { - throw new Error('Could not fetch balance from API: ' + response.err); - } - } catch (err) { - console.warn(err); - } - } -} diff --git a/class/hd-legacy-p2pkh-wallet.js b/class/hd-legacy-p2pkh-wallet.js index 3eb4b2702a..0823f02c77 100644 --- a/class/hd-legacy-p2pkh-wallet.js +++ b/class/hd-legacy-p2pkh-wallet.js @@ -1,10 +1,18 @@ -import { AbstractHDWallet } from './abstract-hd-wallet'; -import bip39 from 'bip39'; import BigNumber from 'bignumber.js'; +import * as bip39 from 'bip39'; +import b58 from 'bs58check'; +import { NativeModules } from 'react-native'; + +import { BitcoinUnit } from '../models/bitcoinUnits'; import signer from '../models/signer'; -const bitcoin = require('bitcoinjs-lib'); +import { AbstractHDWallet } from './abstract-hd-wallet'; + const HDNode = require('bip32'); +const bitcoin = require('bitcoinjs-lib'); + +const BlueElectrum = require('../BlueElectrum'); +const { RNRandomBytes } = NativeModules; /** * HD Wallet (BIP39). * In particular, BIP44 (P2PKH legacy addressess) @@ -18,18 +26,21 @@ export class HDLegacyP2PKHWallet extends AbstractHDWallet { return true; } - getXpub() { + allowSendMax() { + return true; + } + + async getXpub() { if (this._xpub) { return this._xpub; // cache hit } const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = bitcoin.bip32.fromSeed(seed); + this.seed = await bip39.mnemonicToSeed(mnemonic); + const root = bitcoin.bip32.fromSeed(this.seed); const path = "m/44'/0'/0'"; const child = root.derivePath(path).neutered(); this._xpub = child.toBase58(); - return this._xpub; } @@ -48,53 +59,64 @@ export class HDLegacyP2PKHWallet extends AbstractHDWallet { * @returns {*} * @private */ - _getWIFByIndex(internal, index) { - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); + async _getWIFByIndex(index) { + if (!this.seed) { + this.seed = await bip39.mnemonicToSeed(this.secret); + } - const root = HDNode.fromSeed(seed); - const path = `m/44'/0'/0'/${internal ? 1 : 0}/${index}`; + const root = HDNode.fromSeed(this.seed); + const path = `m/44'/0'/0'/0/${index}`; const child = root.derivePath(path); return child.toWIF(); } - _getExternalAddressByIndex(index) { - index = index * 1; // cast to int - if (this.external_addresses_cache[index]) return this.external_addresses_cache[index]; // cache hit - - const node = bitcoin.bip32.fromBase58(this.getXpub()); - const address = bitcoin.payments.p2pkh({ - pubkey: node.derive(0).derive(index).publicKey, - }).address; - - return (this.external_addresses_cache[index] = address); + async generate() { + const that = this; + return new Promise(function(resolve) { + if (typeof RNRandomBytes === 'undefined') { + // CLI/CI environment + // crypto should be provided globally by test launcher + return crypto.randomBytes(32, (err, buf) => { // eslint-disable-line + if (err) throw err; + that.setSecret(bip39.entropyToMnemonic(buf.toString('hex'))); + resolve(); + }); + } + + // RN environment + RNRandomBytes.randomBytes(32, (err, bytes) => { + if (err) throw new Error(err); + const b = Buffer.from(bytes, 'base64').toString('hex'); + that.setSecret(bip39.entropyToMnemonic(b)); + resolve(); + }); + }); } - _getInternalAddressByIndex(index) { - index = index * 1; // cast to int - if (this.internal_addresses_cache[index]) return this.internal_addresses_cache[index]; // cache hit - - const node = bitcoin.bip32.fromBase58(this.getXpub()); - const address = bitcoin.payments.p2pkh({ - pubkey: node.derive(1).derive(index).publicKey, - }).address; - - return (this.internal_addresses_cache[index] = address); + async generateAddresses() { + const node = bitcoin.bip32.fromBase58(await this.getXpub()); + for (let index = 0; index < this.num_addresses; index++) { + const address = bitcoin.payments.p2pkh({ + pubkey: node.derive(0).derive(index).publicKey, + }).address; + this._address.push(address); + this._address_to_wif_cache[address] = await this._getWIFByIndex(index); + this._addr_balances[address] = { + total: 0, + c: 0, + u: 0, + }; + } + console.warn(this._address); } createTx(utxos, amount, fee, address) { - for (let utxo of utxos) { + for (const utxo of utxos) { utxo.wif = this._getWifForAddress(utxo.address); } - let amountPlusFee = parseFloat(new BigNumber(amount).plus(fee).toString(10)); - return signer.createHDTransaction( - utxos, - address, - amountPlusFee, - fee, - this._getInternalAddressByIndex(this.next_free_change_address_index), - ); + const amountPlusFee = parseFloat(new BigNumber(amount).plus(fee).toString(10)); + return signer.createHDTransaction(utxos, address, amountPlusFee, fee, this.getAddressForTransaction()); } } diff --git a/class/hd-segwit-bech32-transaction.js b/class/hd-segwit-bech32-transaction.js index 69998667a1..d28b9fadd1 100644 --- a/class/hd-segwit-bech32-transaction.js +++ b/class/hd-segwit-bech32-transaction.js @@ -1,8 +1,10 @@ import { HDSegwitBech32Wallet, SegwitBech32Wallet } from './'; + +const BigNumber = require('bignumber.js'); const bitcoin = require('bitcoinjs-lib'); -const BlueElectrum = require('../BlueElectrum'); const reverse = require('buffer-reverse'); -const BigNumber = require('bignumber.js'); + +const BlueElectrum = require('../BlueElectrum'); /** * Represents transaction of a BIP84 wallet. @@ -39,7 +41,7 @@ export class HDSegwitBech32Transaction { * @private */ async _fetchTxhexAndDecode() { - let hexes = await BlueElectrum.multiGetTransactionByTxid([this._txid], 10, false); + const hexes = await BlueElectrum.multiGetTransactionByTxid([this._txid], 10, false); this._txhex = hexes[this._txid]; if (!this._txhex) throw new Error("Transaction can't be found in mempool"); this._txDecoded = bitcoin.Transaction.fromHex(this._txhex); @@ -55,7 +57,7 @@ export class HDSegwitBech32Transaction { if (!this._txDecoded) await this._fetchTxhexAndDecode(); let max = 0; - for (let inp of this._txDecoded.ins) { + for (const inp of this._txDecoded.ins) { max = Math.max(inp.sequence, max); } @@ -80,7 +82,7 @@ export class HDSegwitBech32Transaction { * @private */ async _fetchRemoteTx() { - let result = await BlueElectrum.multiGetTransactionByTxid([this._txid || this._txDecoded.getId()]); + const result = await BlueElectrum.multiGetTransactionByTxid([this._txid || this._txDecoded.getId()]); this._remoteTx = Object.values(result)[0]; } @@ -104,7 +106,7 @@ export class HDSegwitBech32Transaction { async isOurTransaction() { if (!this._wallet) throw new Error('Wallet required for this method'); let found = false; - for (let tx of this._wallet.getTransactions()) { + for (const tx of this._wallet.getTransactions()) { if (tx.txid === (this._txid || this._txDecoded.getId())) { // its our transaction, and its spending transaction, which means we initiated it if (tx.value < 0) found = true; @@ -123,7 +125,7 @@ export class HDSegwitBech32Transaction { async isToUsTransaction() { if (!this._wallet) throw new Error('Wallet required for this method'); let found = false; - for (let tx of this._wallet.getTransactions()) { + for (const tx of this._wallet.getTransactions()) { if (tx.txid === (this._txid || this._txDecoded.getId())) { if (tx.value > 0) found = true; } @@ -147,66 +149,75 @@ export class HDSegwitBech32Transaction { if (!this._remoteTx) await this._fetchRemoteTx(); if (!this._txDecoded) await this._fetchTxhexAndDecode(); - let prevInputs = []; - for (let inp of this._txDecoded.ins) { + const prevInputs = []; + for (const inp of this._txDecoded.ins) { let reversedHash = Buffer.from(reverse(inp.hash)); reversedHash = reversedHash.toString('hex'); prevInputs.push(reversedHash); } - let prevTransactions = await BlueElectrum.multiGetTransactionByTxid(prevInputs); + const prevTransactions = await BlueElectrum.multiGetTransactionByTxid(prevInputs); // fetched, now lets count how much satoshis went in let wentIn = 0; - let utxos = []; - for (let inp of this._txDecoded.ins) { + const utxos = []; + for (const inp of this._txDecoded.ins) { let reversedHash = Buffer.from(reverse(inp.hash)); reversedHash = reversedHash.toString('hex'); - if (prevTransactions[reversedHash] && prevTransactions[reversedHash].vout && prevTransactions[reversedHash].vout[inp.index]) { + if ( + prevTransactions[reversedHash] && + prevTransactions[reversedHash].vout && + prevTransactions[reversedHash].vout[inp.index] + ) { let value = prevTransactions[reversedHash].vout[inp.index].value; value = new BigNumber(value).multipliedBy(100000000).toNumber(); wentIn += value; - let address = SegwitBech32Wallet.witnessToAddress(inp.witness[inp.witness.length - 1]); - utxos.push({ vout: inp.index, value: value, txId: reversedHash, address: address }); + const address = SegwitBech32Wallet.witnessToAddress(inp.witness[inp.witness.length - 1]); + utxos.push({ + vout: inp.index, + value, + txId: reversedHash, + address, + }); } } // counting how much went into actual outputs let wasSpent = 0; - for (let outp of this._txDecoded.outs) { + for (const outp of this._txDecoded.outs) { wasSpent += +outp.value; } - let fee = wentIn - wasSpent; + const fee = wentIn - wasSpent; let feeRate = Math.floor(fee / (this._txhex.length / 2)); if (feeRate === 0) feeRate = 1; // lets take a look at change let changeAmount = 0; - let targets = []; - for (let outp of this._remoteTx.vout) { - let address = outp.scriptPubKey.addresses[0]; - let value = new BigNumber(outp.value).multipliedBy(100000000).toNumber(); + const targets = []; + for (const outp of this._remoteTx.vout) { + const address = outp.scriptPubKey.addresses[0]; + const value = new BigNumber(outp.value).multipliedBy(100000000).toNumber(); if (this._wallet.weOwnAddress(address)) { changeAmount += value; } else { // this is target - targets.push({ value: value, address: address }); + targets.push({ value, address }); } } // lets find outputs we own that current transaction creates. can be used in CPFP - let unconfirmedUtxos = []; - for (let outp of this._remoteTx.vout) { - let address = outp.scriptPubKey.addresses[0]; - let value = new BigNumber(outp.value).multipliedBy(100000000).toNumber(); + const unconfirmedUtxos = []; + for (const outp of this._remoteTx.vout) { + const address = outp.scriptPubKey.addresses[0]; + const value = new BigNumber(outp.value).multipliedBy(100000000).toNumber(); if (this._wallet.weOwnAddress(address)) { unconfirmedUtxos.push({ vout: outp.n, - value: value, + value, txId: this._txid || this._txDecoded.getId(), - address: address, + address, }); } } @@ -225,7 +236,7 @@ export class HDSegwitBech32Transaction { if (!this._txDecoded) await this._fetchTxhexAndDecode(); // if theres at least one output we dont own - we can cancel this transaction! - for (let outp of this._txDecoded.outs) { + for (const outp of this._txDecoded.outs) { if (!this._wallet.weOwnAddress(SegwitBech32Wallet.scriptPubKeyToAddress(outp.script))) return true; } @@ -244,10 +255,10 @@ export class HDSegwitBech32Transaction { if (!this._wallet) throw new Error('Wallet required for this method'); if (!this._remoteTx) await this._fetchRemoteTx(); - let { feeRate, utxos } = await this.getInfo(); + const { feeRate, utxos } = await this.getInfo(); if (newFeerate <= feeRate) throw new Error('New feerate should be bigger than the old one'); - let myAddress = await this._wallet.getChangeAddressAsync(); + const myAddress = await this._wallet.getAddressForTransaction(); return this._wallet.createTransaction( utxos, @@ -269,10 +280,10 @@ export class HDSegwitBech32Transaction { if (!this._wallet) throw new Error('Wallet required for this method'); if (!this._remoteTx) await this._fetchRemoteTx(); - let { feeRate, targets, changeAmount, utxos } = await this.getInfo(); + const { feeRate, targets, changeAmount, utxos } = await this.getInfo(); if (newFeerate <= feeRate) throw new Error('New feerate should be bigger than the old one'); - let myAddress = await this._wallet.getChangeAddressAsync(); + const myAddress = await this._wallet.getAddressForTransaction(); if (changeAmount === 0) delete targets[0].value; // looks like this was sendMAX transaction (because there was no change), so we cant reuse amount in this @@ -281,7 +292,7 @@ export class HDSegwitBech32Transaction { if (targets.length === 0) { // looks like this was cancelled tx with single change output, so it wasnt included in `this.getInfo()` targets // so we add output paying ourselves: - targets.push({ address: this._wallet._getInternalAddressByIndex(this._wallet.next_free_change_address_index) }); + targets.push({ address: this._wallet.getAddressForTransaction() }); // not checking emptiness on purpose: it could unpredictably generate too far address because of unconfirmed tx. } @@ -299,10 +310,10 @@ export class HDSegwitBech32Transaction { if (!this._wallet) throw new Error('Wallet required for this method'); if (!this._remoteTx) await this._fetchRemoteTx(); - let { feeRate, fee: oldFee, unconfirmedUtxos } = await this.getInfo(); + const { feeRate, fee: oldFee, unconfirmedUtxos } = await this.getInfo(); if (newFeerate <= feeRate) throw new Error('New feerate should be bigger than the old one'); - let myAddress = await this._wallet.getChangeAddressAsync(); + const myAddress = await this._wallet.getAddressForTransaction(); // calculating feerate for CPFP tx so that average between current and CPFP tx will equal newFeerate. // this works well if both txs are +/- equal size in bytes @@ -317,7 +328,7 @@ export class HDSegwitBech32Transaction { myAddress, HDSegwitBech32Wallet.defaultRBFSequence, ); - let combinedFeeRate = (oldFee + fee) / (this._txhex.length / 2 + tx.toHex().length / 2); // avg + const combinedFeeRate = (oldFee + fee) / (this._txhex.length / 2 + tx.toHex().length / 2); // avg if (Math.round(combinedFeeRate) < newFeerate) { add *= 2; if (!add) add = 2; diff --git a/class/hd-segwit-bech32-wallet.js b/class/hd-segwit-bech32-wallet.js index 1dc0b894da..b3b79e8f3c 100644 --- a/class/hd-segwit-bech32-wallet.js +++ b/class/hd-segwit-bech32-wallet.js @@ -1,14 +1,16 @@ -import { AbstractHDWallet } from './abstract-hd-wallet'; -import { NativeModules } from 'react-native'; -import bip39 from 'bip39'; -import BigNumber from 'bignumber.js'; +import * as bip39 from 'bip39'; import b58 from 'bs58check'; -const bitcoin = require('bitcoinjs-lib'); -const BlueElectrum = require('../BlueElectrum'); +import { NativeModules } from 'react-native'; + +import { AbstractHDWallet } from './abstract-hd-wallet'; + const HDNode = require('bip32'); +const bitcoin = require('bitcoinjs-lib'); const coinSelectAccumulative = require('coinselect/accumulative'); const coinSelectSplit = require('coinselect/split'); +const BlueElectrum = require('../BlueElectrum'); + const { RNRandomBytes } = NativeModules; /** @@ -18,16 +20,13 @@ const { RNRandomBytes } = NativeModules; */ export class HDSegwitBech32Wallet extends AbstractHDWallet { static type = 'HDsegwitBech32'; - static typeReadable = 'HD SegWit (BIP84 Bech32 Native)'; + static typeReadable = 'HD SegWit'; static defaultRBFSequence = 2147483648; // 1 << 31, minimum for replaceable transactions as per BIP68 + static randomBytesSize = 32; + static basePath = "m/84'/0'/0'"; constructor() { super(); - this._balances_by_external_index = {}; // 0 => { c: 0, u: 0 } // confirmed/unconfirmed - this._balances_by_internal_index = {}; - - this._txs_by_external_index = {}; - this._txs_by_internal_index = {}; this._utxo = []; } @@ -36,78 +35,48 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { return true; } - allowSendMax(): boolean { + allowSendMax() { return true; } - /** - * @inheritDoc - */ - getBalance() { - let ret = 0; - for (let bal of Object.values(this._balances_by_external_index)) { - ret += bal.c; - } - for (let bal of Object.values(this._balances_by_internal_index)) { - ret += bal.c; - } - return ret + (this.getUnconfirmedBalance() < 0 ? this.getUnconfirmedBalance() : 0); - } - /** * @inheritDoc */ timeToRefreshTransaction() { - for (let tx of this.getTransactions()) { + for (const tx of this.getTransactions()) { if (tx.confirmations < 7) return true; } return false; } - getUnconfirmedBalance() { - let ret = 0; - for (let bal of Object.values(this._balances_by_external_index)) { - ret += bal.u; - } - for (let bal of Object.values(this._balances_by_internal_index)) { - ret += bal.u; - } - return ret; - } - allowSend() { return true; } async generate() { - let that = this; - return new Promise(function(resolve) { + return new Promise(resolve => { if (typeof RNRandomBytes === 'undefined') { // CLI/CI environment // crypto should be provided globally by test launcher - return crypto.randomBytes(32, (err, buf) => { // eslint-disable-line + return crypto.randomBytes(HDSegwitBech32Wallet.randomBytesSize, async (err, buf) => { if (err) throw err; - that.secret = bip39.entropyToMnemonic(buf.toString('hex')); + await this.setSecret(bip39.entropyToMnemonic(buf.toString('hex'))); resolve(); }); } // RN environment - RNRandomBytes.randomBytes(32, (err, bytes) => { + RNRandomBytes.randomBytes(HDSegwitBech32Wallet.randomBytesSize, async (err, bytes) => { if (err) throw new Error(err); - let b = Buffer.from(bytes, 'base64').toString('hex'); - that.secret = bip39.entropyToMnemonic(b); + const b = Buffer.from(bytes, 'base64').toString('hex'); + await this.setSecret(bip39.entropyToMnemonic(b)); resolve(); }); }); } - _getExternalWIFByIndex(index) { - return this._getWIFByIndex(false, index); - } - - _getInternalWIFByIndex(index) { - return this._getWIFByIndex(true, index); + _getPath(path = '') { + return `${HDSegwitBech32Wallet.basePath}${path}`; } /** @@ -117,87 +86,51 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { * @returns {string|false} Either string WIF or FALSE if error happened * @private */ - _getWIFByIndex(internal, index) { - if (!this.secret) return false; - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = HDNode.fromSeed(seed); - const path = `m/84'/0'/0'/${internal ? 1 : 0}/${index}`; - const child = root.derivePath(path); + async _getWIFByIndex(index) { + if (!this.seed) { + this.seed = await bip39.mnemonicToSeed(this.secret); + } + const root = HDNode.fromSeed(this.seed); + const path = this._getPath(`/0/${index}`); + const child = root.derivePath(path); return child.toWIF(); } - _getNodeAddressByIndex(node, index) { + _getNodeAddressByIndex(index) { index = index * 1; // cast to int - if (node === 0) { - if (this.external_addresses_cache[index]) return this.external_addresses_cache[index]; // cache hit - } - - if (node === 1) { - if (this.internal_addresses_cache[index]) return this.internal_addresses_cache[index]; // cache hit - } - - if (node === 0 && !this._node0) { - const xpub = this.constructor._zpubToXpub(this.getXpub()); - const hdNode = HDNode.fromBase58(xpub); - this._node0 = hdNode.derive(node); - } + return this._address[index]; + } - if (node === 1 && !this._node1) { - const xpub = this.constructor._zpubToXpub(this.getXpub()); + async generateAddresses() { + if (!this._node0) { + const xpub = this.constructor._zpubToXpub(await this.getXpub()); const hdNode = HDNode.fromBase58(xpub); - this._node1 = hdNode.derive(node); - } - - let address; - if (node === 0) { - address = this.constructor._nodeToBech32SegwitAddress(this._node0.derive(index)); - } - - if (node === 1) { - address = this.constructor._nodeToBech32SegwitAddress(this._node1.derive(index)); - } - - if (node === 0) { - return (this.external_addresses_cache[index] = address); - } - - if (node === 1) { - return (this.internal_addresses_cache[index] = address); + this._node0 = hdNode.derive(0); + } + for (let index = 0; index < this.num_addresses; index++) { + const address = this.constructor._nodeToBech32SegwitAddress(this._node0.derive(index)); + this._address.push(address); + this._address_to_wif_cache[address] = await this._getWIFByIndex(index); + this._addr_balances[address] = { + total: 0, + c: 0, + u: 0, + }; } } - _getNodePubkeyByIndex(node, index) { + async _getNodePubkeyByIndex(index) { index = index * 1; // cast to int - if (node === 0 && !this._node0) { - const xpub = this.constructor._zpubToXpub(this.getXpub()); - const hdNode = HDNode.fromBase58(xpub); - this._node0 = hdNode.derive(node); - } - - if (node === 1 && !this._node1) { - const xpub = this.constructor._zpubToXpub(this.getXpub()); + if (!this._node0) { + const xpub = this.constructor._zpubToXpub(await this.getXpub()); const hdNode = HDNode.fromBase58(xpub); - this._node1 = hdNode.derive(node); - } - - if (node === 0) { - return this._node0.derive(index).publicKey; + this._node0 = hdNode.derive(0); } - - if (node === 1) { - return this._node1.derive(index).publicKey; - } - } - - _getExternalAddressByIndex(index) { - return this._getNodeAddressByIndex(0, index); - } - - _getInternalAddressByIndex(index) { - return this._getNodeAddressByIndex(1, index); + console.warn(this._node0.derive(index).publicKey); + console.warn(this.constructor._nodeToBech32SegwitAddress(this._node0.derive(index))); + return this._node0.derive(index).publicKey; } /** @@ -206,16 +139,16 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { * * @return {String} zpub */ - getXpub() { + async getXpub() { if (this._xpub) { return this._xpub; // cache hit } // first, getting xpub const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = HDNode.fromSeed(seed); + this.seed = await bip39.mnemonicToSeed(mnemonic); + const root = HDNode.fromSeed(this.seed); - const path = "m/84'/0'/0'"; + const path = this._getPath(); const child = root.derivePath(path).neutered(); const xpub = child.toBase58(); @@ -228,484 +161,18 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { return this._xpub; } - /** - * @inheritDoc - */ - async fetchTransactions() { - // if txs are absent for some internal address in hierarchy - this is a sign - // we should fetch txs for that address - // OR if some address has unconfirmed balance - should fetch it's txs - // OR some tx for address is unconfirmed - // OR some tx has < 7 confirmations - - // fetching transactions in batch: first, getting batch history for all addresses, - // then batch fetching all involved txids - // finally, batch fetching txids of all inputs (needed to see amounts & addresses of those inputs) - // then we combine it all together - - let addresses2fetch = []; - - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - // external addresses first - let hasUnconfirmed = false; - this._txs_by_external_index[c] = this._txs_by_external_index[c] || []; - for (let tx of this._txs_by_external_index[c]) hasUnconfirmed = hasUnconfirmed || !tx.confirmations || tx.confirmations < 7; - - if (hasUnconfirmed || this._txs_by_external_index[c].length === 0 || this._balances_by_external_index[c].u !== 0) { - addresses2fetch.push(this._getExternalAddressByIndex(c)); - } - } - - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - // next, internal addresses - let hasUnconfirmed = false; - this._txs_by_internal_index[c] = this._txs_by_internal_index[c] || []; - for (let tx of this._txs_by_internal_index[c]) hasUnconfirmed = hasUnconfirmed || !tx.confirmations || tx.confirmations < 7; - - if (hasUnconfirmed || this._txs_by_internal_index[c].length === 0 || this._balances_by_internal_index[c].u !== 0) { - addresses2fetch.push(this._getInternalAddressByIndex(c)); - } - } - - // first: batch fetch for all addresses histories - let histories = await BlueElectrum.multiGetHistoryByAddress(addresses2fetch); - let txs = {}; - for (let history of Object.values(histories)) { - for (let tx of history) { - txs[tx.tx_hash] = tx; - } - } - - // next, batch fetching each txid we got - let txdatas = await BlueElectrum.multiGetTransactionByTxid(Object.keys(txs)); - - // now, tricky part. we collect all transactions from inputs (vin), and batch fetch them too. - // then we combine all this data (we need inputs to see source addresses and amounts) - let vinTxids = []; - for (let txdata of Object.values(txdatas)) { - for (let vin of txdata.vin) { - vinTxids.push(vin.txid); - } - } - let vintxdatas = await BlueElectrum.multiGetTransactionByTxid(vinTxids); - - // fetched all transactions from our inputs. now we need to combine it. - // iterating all _our_ transactions: - for (let txid of Object.keys(txdatas)) { - // iterating all inputs our our single transaction: - for (let inpNum = 0; inpNum < txdatas[txid].vin.length; inpNum++) { - let inpTxid = txdatas[txid].vin[inpNum].txid; - let inpVout = txdatas[txid].vin[inpNum].vout; - // got txid and output number of _previous_ transaction we shoud look into - if (vintxdatas[inpTxid] && vintxdatas[inpTxid].vout[inpVout]) { - // extracting amount & addresses from previous output and adding it to _our_ input: - txdatas[txid].vin[inpNum].addresses = vintxdatas[inpTxid].vout[inpVout].scriptPubKey.addresses; - txdatas[txid].vin[inpNum].value = vintxdatas[inpTxid].vout[inpVout].value; - } - } - } - - // now purge all unconfirmed txs from internal hashmaps, since some may be evicted from mempool because they became invalid - // or replaced. hashmaps are going to be re-populated anyways, since we fetched TXs for addresses with unconfirmed TXs - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - this._txs_by_external_index[c] = this._txs_by_external_index[c].filter(tx => !!tx.confirmations); - } - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - this._txs_by_internal_index[c] = this._txs_by_internal_index[c].filter(tx => !!tx.confirmations); - } - - // now, we need to put transactions in all relevant `cells` of internal hashmaps: this._txs_by_internal_index && this._txs_by_external_index - - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - for (let tx of Object.values(txdatas)) { - for (let vin of tx.vin) { - if (vin.addresses && vin.addresses.indexOf(this._getExternalAddressByIndex(c)) !== -1) { - // this TX is related to our address - this._txs_by_external_index[c] = this._txs_by_external_index[c] || []; - let clonedTx = Object.assign({}, tx); - clonedTx.inputs = tx.vin.slice(0); - clonedTx.outputs = tx.vout.slice(0); - delete clonedTx.vin; - delete clonedTx.vout; - - // trying to replace tx if it exists already (because it has lower confirmations, for example) - let replaced = false; - for (let cc = 0; cc < this._txs_by_external_index[c].length; cc++) { - if (this._txs_by_external_index[c][cc].txid === clonedTx.txid) { - replaced = true; - this._txs_by_external_index[c][cc] = clonedTx; - } - } - if (!replaced) this._txs_by_external_index[c].push(clonedTx); - } - } - for (let vout of tx.vout) { - if (vout.scriptPubKey.addresses.indexOf(this._getExternalAddressByIndex(c)) !== -1) { - // this TX is related to our address - this._txs_by_external_index[c] = this._txs_by_external_index[c] || []; - let clonedTx = Object.assign({}, tx); - clonedTx.inputs = tx.vin.slice(0); - clonedTx.outputs = tx.vout.slice(0); - delete clonedTx.vin; - delete clonedTx.vout; - - // trying to replace tx if it exists already (because it has lower confirmations, for example) - let replaced = false; - for (let cc = 0; cc < this._txs_by_external_index[c].length; cc++) { - if (this._txs_by_external_index[c][cc].txid === clonedTx.txid) { - replaced = true; - this._txs_by_external_index[c][cc] = clonedTx; - } - } - if (!replaced) this._txs_by_external_index[c].push(clonedTx); - } - } - } - } - - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - for (let tx of Object.values(txdatas)) { - for (let vin of tx.vin) { - if (vin.addresses && vin.addresses.indexOf(this._getInternalAddressByIndex(c)) !== -1) { - // this TX is related to our address - this._txs_by_internal_index[c] = this._txs_by_internal_index[c] || []; - let clonedTx = Object.assign({}, tx); - clonedTx.inputs = tx.vin.slice(0); - clonedTx.outputs = tx.vout.slice(0); - delete clonedTx.vin; - delete clonedTx.vout; - - // trying to replace tx if it exists already (because it has lower confirmations, for example) - let replaced = false; - for (let cc = 0; cc < this._txs_by_internal_index[c].length; cc++) { - if (this._txs_by_internal_index[c][cc].txid === clonedTx.txid) { - replaced = true; - this._txs_by_internal_index[c][cc] = clonedTx; - } - } - if (!replaced) this._txs_by_internal_index[c].push(clonedTx); - } - } - for (let vout of tx.vout) { - if (vout.scriptPubKey.addresses.indexOf(this._getInternalAddressByIndex(c)) !== -1) { - // this TX is related to our address - this._txs_by_internal_index[c] = this._txs_by_internal_index[c] || []; - let clonedTx = Object.assign({}, tx); - clonedTx.inputs = tx.vin.slice(0); - clonedTx.outputs = tx.vout.slice(0); - delete clonedTx.vin; - delete clonedTx.vout; - - // trying to replace tx if it exists already (because it has lower confirmations, for example) - let replaced = false; - for (let cc = 0; cc < this._txs_by_internal_index[c].length; cc++) { - if (this._txs_by_internal_index[c][cc].txid === clonedTx.txid) { - replaced = true; - this._txs_by_internal_index[c][cc] = clonedTx; - } - } - if (!replaced) this._txs_by_internal_index[c].push(clonedTx); - } - } - } - } - - this._lastTxFetch = +new Date(); - } - - getTransactions() { - let txs = []; - - for (let addressTxs of Object.values(this._txs_by_external_index)) { - txs = txs.concat(addressTxs); - } - for (let addressTxs of Object.values(this._txs_by_internal_index)) { - txs = txs.concat(addressTxs); - } - - let ret = []; - for (let tx of txs) { - tx.received = tx.blocktime * 1000; - if (!tx.blocktime) tx.received = +new Date() - 30 * 1000; // unconfirmed - tx.confirmations = tx.confirmations || 0; // unconfirmed - tx.hash = tx.txid; - tx.value = 0; - - for (let vin of tx.inputs) { - // if input (spending) goes from our address - we are loosing! - if ((vin.address && this.weOwnAddress(vin.address)) || (vin.addresses && vin.addresses[0] && this.weOwnAddress(vin.addresses[0]))) { - tx.value -= new BigNumber(vin.value).multipliedBy(100000000).toNumber(); - } - } - - for (let vout of tx.outputs) { - // when output goes to our address - this means we are gaining! - if (vout.scriptPubKey.addresses && vout.scriptPubKey.addresses[0] && this.weOwnAddress(vout.scriptPubKey.addresses[0])) { - tx.value += new BigNumber(vout.value).multipliedBy(100000000).toNumber(); - } - } - ret.push(tx); - } - - // now, deduplication: - let usedTxIds = {}; - let ret2 = []; - for (let tx of ret) { - if (!usedTxIds[tx.txid]) ret2.push(tx); - usedTxIds[tx.txid] = 1; - } - - return ret2.sort(function(a, b) { - return b.received - a.received; - }); - } - - async _binarySearchIterationForInternalAddress(index) { - const gerenateChunkAddresses = chunkNum => { - let ret = []; - for (let c = this.gap_limit * chunkNum; c < this.gap_limit * (chunkNum + 1); c++) { - ret.push(this._getInternalAddressByIndex(c)); - } - return ret; - }; - - let lastChunkWithUsedAddressesNum = null; - let lastHistoriesWithUsedAddresses = null; - for (let c = 0; c < Math.round(index / this.gap_limit); c++) { - let histories = await BlueElectrum.multiGetHistoryByAddress(gerenateChunkAddresses(c)); - if (this.constructor._getTransactionsFromHistories(histories).length > 0) { - // in this particular chunk we have used addresses - lastChunkWithUsedAddressesNum = c; - lastHistoriesWithUsedAddresses = histories; - } else { - // empty chunk. no sense searching more chunks - break; - } - } - - let lastUsedIndex = 0; - - if (lastHistoriesWithUsedAddresses) { - // now searching for last used address in batch lastChunkWithUsedAddressesNum - for ( - let c = lastChunkWithUsedAddressesNum * this.gap_limit; - c < lastChunkWithUsedAddressesNum * this.gap_limit + this.gap_limit; - c++ - ) { - let address = this._getInternalAddressByIndex(c); - if (lastHistoriesWithUsedAddresses[address] && lastHistoriesWithUsedAddresses[address].length > 0) { - lastUsedIndex = Math.max(c, lastUsedIndex) + 1; // point to next, which is supposed to be unsued - } - } - } - - return lastUsedIndex; - } - - async _binarySearchIterationForExternalAddress(index) { - const gerenateChunkAddresses = chunkNum => { - let ret = []; - for (let c = this.gap_limit * chunkNum; c < this.gap_limit * (chunkNum + 1); c++) { - ret.push(this._getExternalAddressByIndex(c)); - } - return ret; - }; - - let lastChunkWithUsedAddressesNum = null; - let lastHistoriesWithUsedAddresses = null; - for (let c = 0; c < Math.round(index / this.gap_limit); c++) { - let histories = await BlueElectrum.multiGetHistoryByAddress(gerenateChunkAddresses(c)); - if (this.constructor._getTransactionsFromHistories(histories).length > 0) { - // in this particular chunk we have used addresses - lastChunkWithUsedAddressesNum = c; - lastHistoriesWithUsedAddresses = histories; - } else { - // empty chunk. no sense searching more chunks - break; - } - } - - let lastUsedIndex = 0; - - if (lastHistoriesWithUsedAddresses) { - // now searching for last used address in batch lastChunkWithUsedAddressesNum - for ( - let c = lastChunkWithUsedAddressesNum * this.gap_limit; - c < lastChunkWithUsedAddressesNum * this.gap_limit + this.gap_limit; - c++ - ) { - let address = this._getExternalAddressByIndex(c); - if (lastHistoriesWithUsedAddresses[address] && lastHistoriesWithUsedAddresses[address].length > 0) { - lastUsedIndex = Math.max(c, lastUsedIndex) + 1; // point to next, which is supposed to be unsued - } - } - } - - return lastUsedIndex; - } - - async fetchBalance() { - try { - if (this.next_free_change_address_index === 0 && this.next_free_address_index === 0) { - // doing binary search for last used address: - this.next_free_change_address_index = await this._binarySearchIterationForInternalAddress(1000); - this.next_free_address_index = await this._binarySearchIterationForExternalAddress(1000); - } // end rescanning fresh wallet - - // finally fetching balance - await this._fetchBalance(); - } catch (err) { - console.warn(err); - } - } - - async _fetchBalance() { - // probing future addressess in hierarchy whether they have any transactions, in case - // our 'next free addr' pointers are lagging behind - let tryAgain = false; - let txs = await BlueElectrum.getTransactionsByAddress( - this._getExternalAddressByIndex(this.next_free_address_index + this.gap_limit - 1), - ); - if (txs.length > 0) { - // whoa, someone uses our wallet outside! better catch up - this.next_free_address_index += this.gap_limit; - tryAgain = true; - } - - txs = await BlueElectrum.getTransactionsByAddress( - this._getInternalAddressByIndex(this.next_free_change_address_index + this.gap_limit - 1), - ); - if (txs.length > 0) { - this.next_free_change_address_index += this.gap_limit; - tryAgain = true; - } - - // FIXME: refactor me ^^^ can be batched in single call. plus not just couple of addresses, but all between [ next_free .. (next_free + gap_limit) ] - - if (tryAgain) return this._fetchBalance(); - - // next, business as usuall. fetch balances - - let addresses2fetch = []; - - // generating all involved addresses. - // basically, refetch all from index zero to maximum. doesnt matter - // since we batch them 100 per call - - // external - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - addresses2fetch.push(this._getExternalAddressByIndex(c)); - } - - // internal - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - addresses2fetch.push(this._getInternalAddressByIndex(c)); - } - - let balances = await BlueElectrum.multiGetBalanceByAddress(addresses2fetch); - - // converting to a more compact internal format - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - let addr = this._getExternalAddressByIndex(c); - if (balances.addresses[addr]) { - // first, if balances differ from what we store - we delete transactions for that - // address so next fetchTransactions() will refetch everything - if (this._balances_by_external_index[c]) { - if ( - this._balances_by_external_index[c].c !== balances.addresses[addr].confirmed || - this._balances_by_external_index[c].u !== balances.addresses[addr].unconfirmed - ) { - delete this._txs_by_external_index[c]; - } - } - // update local representation of balances on that address: - this._balances_by_external_index[c] = { - c: balances.addresses[addr].confirmed, - u: balances.addresses[addr].unconfirmed, - }; - } - } - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - let addr = this._getInternalAddressByIndex(c); - if (balances.addresses[addr]) { - // first, if balances differ from what we store - we delete transactions for that - // address so next fetchTransactions() will refetch everything - if (this._balances_by_internal_index[c]) { - if ( - this._balances_by_internal_index[c].c !== balances.addresses[addr].confirmed || - this._balances_by_internal_index[c].u !== balances.addresses[addr].unconfirmed - ) { - delete this._txs_by_internal_index[c]; - } - } - // update local representation of balances on that address: - this._balances_by_internal_index[c] = { - c: balances.addresses[addr].confirmed, - u: balances.addresses[addr].unconfirmed, - }; - } - } - - this._lastBalanceFetch = +new Date(); - } - - async fetchUtxo() { - // considering only confirmed balance - let addressess = []; - - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - if (this._balances_by_external_index[c] && this._balances_by_external_index[c].c && this._balances_by_external_index[c].c > 0) { - addressess.push(this._getExternalAddressByIndex(c)); - } - } - - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - if (this._balances_by_internal_index[c] && this._balances_by_internal_index[c].c && this._balances_by_internal_index[c].c > 0) { - addressess.push(this._getInternalAddressByIndex(c)); - } - } - - this._utxo = []; - for (let arr of Object.values(await BlueElectrum.multiGetUtxoByAddress(addressess))) { - this._utxo = this._utxo.concat(arr); - } - } - - getUtxo() { - return this._utxo; - } - _getDerivationPathByAddress(address) { - const path = "m/84'/0'/0'"; - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - if (this._getExternalAddressByIndex(c) === address) return path + '/0/' + c; - } - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - if (this._getInternalAddressByIndex(c) === address) return path + '/1/' + c; - } + const path = this._getPath('/0/'); - return false; + const index = this._address.indexOf(address); + if (index === -1) return false; + return path + index; } _getPubkeyByAddress(address) { - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - if (this._getExternalAddressByIndex(c) === address) return this._getNodePubkeyByIndex(0, c); - } - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - if (this._getInternalAddressByIndex(c) === address) return this._getNodePubkeyByIndex(1, c); - } - - return false; - } - - weOwnAddress(address) { - for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - if (this._getExternalAddressByIndex(c) === address) return true; - } - for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - if (this._getInternalAddressByIndex(c) === address) return true; - } - return false; + const index = this._address.indexOf(address); + if (index === -1) return false; + return this._getNodePubkeyByIndex(index); } /** @@ -725,30 +192,29 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { * @param skipSigning {boolean} Whether we should skip signing, use returned `psbt` in that case * @returns {{outputs: Array, tx: Transaction, inputs: Array, fee: Number, psbt: Psbt}} */ - createTransaction(utxos, targets, feeRate, changeAddress, sequence, skipSigning = false) { + async createTransaction(utxos, targets, feeRate, changeAddress, sequence, skipSigning = false) { if (!changeAddress) throw new Error('No change address provided'); sequence = sequence || HDSegwitBech32Wallet.defaultRBFSequence; - let algo = coinSelectAccumulative; if (targets.length === 1 && targets[0] && !targets[0].value) { // we want to send MAX algo = coinSelectSplit; } - - let { inputs, outputs, fee } = algo(utxos, targets, feeRate); + const { inputs, outputs, fee } = algo(utxos, targets, feeRate); // .inputs and .outputs will be undefined if no solution was found if (!inputs || !outputs) { throw new Error('Not enough balance. Try sending smaller amount'); } - let psbt = new bitcoin.Psbt(); + const psbt = new bitcoin.Psbt(); let c = 0; - let keypairs = {}; - let values = {}; + const keypairs = {}; + const values = {}; - inputs.forEach(input => { + for (let i = 0; i < inputs.length; i++) { + const input = inputs[i]; let keyPair; if (!skipSigning) { // skiping signing related stuff @@ -759,16 +225,17 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { c++; if (!skipSigning) { // skiping signing related stuff - if (!input.address || !this._getWifForAddress(input.address)) throw new Error('Internal error: no address or WIF to sign input'); + if (!input.address || !this._getWifForAddress(input.address)) + throw new Error('Internal error: no address or WIF to sign input'); } - let pubkey = this._getPubkeyByAddress(input.address); - let masterFingerprint = Buffer.from([0x00, 0x00, 0x00, 0x00]); + const pubkey = await this._getPubkeyByAddress(input.address); + const masterFingerprint = Buffer.from([0x00, 0x00, 0x00, 0x00]); // this is not correct fingerprint, as we dont know real fingerprint - we got zpub with 84/0, but fingerpting // should be from root. basically, fingerprint should be provided from outside by user when importing zpub - let path = this._getDerivationPathByAddress(input.address); + const path = this._getDerivationPathByAddress(input.address); const p2wpkh = bitcoin.payments.p2wpkh({ pubkey }); psbt.addInput({ - hash: input.txId, + hash: input.txid, index: input.vout, sequence, bip32Derivation: [ @@ -783,9 +250,10 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { value: input.value, }, }); - }); + } - outputs.forEach(output => { + for (let k = 0; k < outputs.length; k++) { + const output = outputs[k]; // if output has no address - this is change output let change = false; if (!output.address) { @@ -793,13 +261,13 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { output.address = changeAddress; } - let path = this._getDerivationPathByAddress(output.address); - let pubkey = this._getPubkeyByAddress(output.address); - let masterFingerprint = Buffer.from([0x00, 0x00, 0x00, 0x00]); + const path = this._getDerivationPathByAddress(output.address); + const pubkey = await this._getPubkeyByAddress(output.address); + const masterFingerprint = Buffer.from([0x00, 0x00, 0x00, 0x00]); // this is not correct fingerprint, as we dont know realfingerprint - we got zpub with 84/0, but fingerpting // should be from root. basically, fingerprint should be provided from outside by user when importing zpub - let outputData = { + const outputData = { address: output.address, value: output.value, }; @@ -815,7 +283,7 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { } psbt.addOutput(outputData); - }); + } if (!skipSigning) { // skiping signing related stuff @@ -867,21 +335,11 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { static _zpubToXpub(zpub) { let data = b58.decode(zpub); data = data.slice(4); - data = Buffer.concat([Buffer.from('0488b21e', 'hex'), data]); + data = Buffer.concat([Buffer.from('a40c86fa', 'hex'), data]); return b58.encode(data); } - static _getTransactionsFromHistories(histories) { - let txs = []; - for (let history of Object.values(histories)) { - for (let tx of history) { - txs.push(tx); - } - } - return txs; - } - /** * Broadcast txhex. Can throw an exception if failed * @@ -889,7 +347,7 @@ export class HDSegwitBech32Wallet extends AbstractHDWallet { * @returns {Promise} */ async broadcastTx(txhex) { - let broadcast = await BlueElectrum.broadcastV2(txhex); + const broadcast = await BlueElectrum.broadcastV2(txhex); console.log({ broadcast }); if (broadcast.indexOf('successfully') !== -1) return true; return broadcast.length === 64; // this means return string is txid (precise length), so it was broadcasted ok diff --git a/class/hd-segwit-p2sh-wallet.js b/class/hd-segwit-p2sh-wallet.js index 0205c1d375..c13fa97434 100644 --- a/class/hd-segwit-p2sh-wallet.js +++ b/class/hd-segwit-p2sh-wallet.js @@ -1,13 +1,14 @@ -import { AbstractHDWallet } from './abstract-hd-wallet'; -import Frisbee from 'frisbee'; -import { NativeModules } from 'react-native'; -import bip39 from 'bip39'; import BigNumber from 'bignumber.js'; +import * as bip39 from 'bip39'; import b58 from 'bs58check'; -import signer from '../models/signer'; +import { NativeModules } from 'react-native'; + import { BitcoinUnit } from '../models/bitcoinUnits'; -const bitcoin = require('bitcoinjs-lib'); +import signer from '../models/signer'; +import { AbstractHDWallet } from './abstract-hd-wallet'; + const HDNode = require('bip32'); +const bitcoin = require('bitcoinjs-lib'); const { RNRandomBytes } = NativeModules; @@ -20,7 +21,7 @@ function ypubToXpub(ypub) { let data = b58.decode(ypub); if (data.readUInt32BE() !== 0x049d7cb2) throw new Error('Not a valid ypub extended key!'); data = data.slice(4); - data = Buffer.concat([Buffer.from('0488b21e', 'hex'), data]); + data = Buffer.concat([Buffer.from('a40c86fa', 'hex'), data]); return b58.encode(data); } @@ -42,47 +43,46 @@ function nodeToP2shSegwitAddress(hdNode) { * In particular, BIP49 (P2SH Segwit) * @see https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki */ + export class HDSegwitP2SHWallet extends AbstractHDWallet { static type = 'HDsegwitP2SH'; - static typeReadable = 'HD SegWit (BIP49 P2SH)'; + static typeReadable = 'HD P2SH'; + static randomBytesSize = 32; + static basePath = "m/49'/0'/0'"; allowSend() { return true; } - allowSendMax(): boolean { + allowSendMax() { return true; } async generate() { - let that = this; - return new Promise(function(resolve) { + return new Promise(resolve => { if (typeof RNRandomBytes === 'undefined') { // CLI/CI environment // crypto should be provided globally by test launcher - return crypto.randomBytes(32, (err, buf) => { // eslint-disable-line + return crypto.randomBytes(HDSegwitP2SHWallet.randomBytesSize, async (err, buf) => { if (err) throw err; - that.secret = bip39.entropyToMnemonic(buf.toString('hex')); + await this.setSecret(bip39.entropyToMnemonic(buf.toString('hex'))); resolve(); }); } // RN environment - RNRandomBytes.randomBytes(32, (err, bytes) => { + RNRandomBytes.randomBytes(HDSegwitP2SHWallet.randomBytesSize, async (err, bytes) => { if (err) throw new Error(err); - let b = Buffer.from(bytes, 'base64').toString('hex'); - that.secret = bip39.entropyToMnemonic(b); + const b = Buffer.from(bytes, 'base64').toString('hex'); + console.log('SET'); + await this.setSecret(bip39.entropyToMnemonic(b)); resolve(); }); }); } - _getExternalWIFByIndex(index) { - return this._getWIFByIndex(false, index); - } - - _getInternalWIFByIndex(index) { - return this._getWIFByIndex(true, index); + _getPath(path = '') { + return `${HDSegwitP2SHWallet.basePath}${path}`; } /** @@ -92,60 +92,31 @@ export class HDSegwitP2SHWallet extends AbstractHDWallet { * @returns {*} * @private */ - _getWIFByIndex(internal, index) { - const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = bitcoin.bip32.fromSeed(seed); - const path = `m/49'/0'/0'/${internal ? 1 : 0}/${index}`; + async _getWIFByIndex(index) { + if (!this.seed) { + this.seed = await bip39.mnemonicToSeed(this.secret); + } + const root = bitcoin.bip32.fromSeed(this.seed); + const path = this._getPath(`/0/${index}`); const child = root.derivePath(path); - return bitcoin.ECPair.fromPrivateKey(child.privateKey).toWIF(); } - _getExternalAddressByIndex(index) { - index = index * 1; // cast to int - if (this.external_addresses_cache[index]) return this.external_addresses_cache[index]; // cache hit - - if (!this._node0) { - const xpub = ypubToXpub(this.getXpub()); - const hdNode = HDNode.fromBase58(xpub); - this._node0 = hdNode.derive(0); - } - const address = nodeToP2shSegwitAddress(this._node0.derive(index)); - - return (this.external_addresses_cache[index] = address); - } - - _getInternalAddressByIndex(index) { - index = index * 1; // cast to int - if (this.internal_addresses_cache[index]) return this.internal_addresses_cache[index]; // cache hit - - if (!this._node1) { - const xpub = ypubToXpub(this.getXpub()); - const hdNode = HDNode.fromBase58(xpub); - this._node1 = hdNode.derive(1); - } - const address = nodeToP2shSegwitAddress(this._node1.derive(index)); - - return (this.internal_addresses_cache[index] = address); - } - /** * Returning ypub actually, not xpub. Keeping same method name * for compatibility. * * @return {String} ypub */ - getXpub() { + async getXpub() { if (this._xpub) { return this._xpub; // cache hit } // first, getting xpub const mnemonic = this.secret; - const seed = bip39.mnemonicToSeed(mnemonic); - const root = HDNode.fromSeed(seed); - - const path = "m/49'/0'/0'"; + this.seed = await bip39.mnemonicToSeed(mnemonic); + const root = HDNode.fromSeed(this.seed); + const path = this._getPath(); const child = root.derivePath(path).neutered(); const xpub = child.toBase58(); @@ -158,105 +129,21 @@ export class HDSegwitP2SHWallet extends AbstractHDWallet { return this._xpub; } - async _getTransactionsBatch(addresses) { - const api = new Frisbee({ baseURI: 'https://blockchain.info' }); - let transactions = []; - let offset = 0; - - while (1) { - let response = await api.get('/multiaddr?active=' + addresses + '&n=100&offset=' + offset); - - if (response && response.body) { - if (response.body.txs && response.body.txs.length === 0) { - break; - } - - this._lastTxFetch = +new Date(); - - // processing TXs and adding to internal memory - if (response.body.txs) { - for (let tx of response.body.txs) { - let value = 0; - - for (let input of tx.inputs) { - // ----- INPUTS - - if (input.prev_out && input.prev_out.addr && this.weOwnAddress(input.prev_out.addr)) { - // this is outgoing from us - value -= input.prev_out.value; - } - } - - for (let output of tx.out) { - // ----- OUTPUTS - - if (output.addr && this.weOwnAddress(output.addr)) { - // this is incoming to us - value += output.value; - } - } - - tx.value = value; // new BigNumber(value).div(100000000).toString() * 1; - if (response.body.hasOwnProperty('info')) { - if (response.body.info.latest_block.height && tx.block_height) { - tx.confirmations = response.body.info.latest_block.height - tx.block_height + 1; - } else { - tx.confirmations = 0; - } - } else { - tx.confirmations = 0; - } - transactions.push(tx); - } - - if (response.body.txs.length < 100) { - // this fetch yilded less than page size, thus requesting next batch makes no sense - break; - } - } else { - break; // error ? - } - } else { - throw new Error('Could not fetch transactions from API: ' + response.err); // breaks here - } - - offset += 100; + async generateAddresses() { + if (!this._node0) { + const xpub = ypubToXpub(await this.getXpub()); + const hdNode = HDNode.fromBase58(xpub); + this._node0 = hdNode.derive(0); } - return transactions; - } - - /** - * @inheritDoc - */ - async fetchTransactions() { - try { - if (this.usedAddresses.length === 0) { - // just for any case, refresh balance (it refreshes internal `this.usedAddresses`) - await this.fetchBalance(); - } - - this.transactions = []; - - let addresses4batch = []; - for (let addr of this.usedAddresses) { - addresses4batch.push(addr); - if (addresses4batch.length >= 45) { - let addresses = addresses4batch.join('|'); - let transactions = await this._getTransactionsBatch(addresses); - this.transactions = this.transactions.concat(transactions); - addresses4batch = []; - } - } - // final batch - for (let c = 0; c <= this.gap_limit; c++) { - addresses4batch.push(this._getExternalAddressByIndex(this.next_free_address_index + c)); - addresses4batch.push(this._getInternalAddressByIndex(this.next_free_change_address_index + c)); - } - let addresses = addresses4batch.join('|'); - let transactions = await this._getTransactionsBatch(addresses); - this.transactions = this.transactions.concat(transactions); - } catch (err) { - console.warn(err); + for (let index = 0; index < this.num_addresses; index++) { + const address = nodeToP2shSegwitAddress(this._node0.derive(index)); + this._address.push(address); + this._address_to_wif_cache[address] = await this._getWIFByIndex(index); + this._addr_balances[address] = { + total: 0, + c: 0, + u: 0, + }; } } @@ -269,7 +156,7 @@ export class HDSegwitP2SHWallet extends AbstractHDWallet { * @returns {string} */ createTx(utxos, amount, fee, address) { - for (let utxo of utxos) { + for (const utxo of utxos) { utxo.wif = this._getWifForAddress(utxo.address); } @@ -277,18 +164,12 @@ export class HDSegwitP2SHWallet extends AbstractHDWallet { if (amount === BitcoinUnit.MAX) { amountPlusFee = new BigNumber(0); - for (let utxo of utxos) { - amountPlusFee = amountPlusFee.plus(utxo.amount); + for (const utxo of utxos) { + amountPlusFee = amountPlusFee.plus(utxo.value); } amountPlusFee = amountPlusFee.dividedBy(100000000).toString(10); } - return signer.createHDSegwitTransaction( - utxos, - address, - amountPlusFee, - fee, - this._getInternalAddressByIndex(this.next_free_change_address_index), - ); + return signer.createHDSegwitTransaction(utxos, address, amountPlusFee, fee, this.getAddressForTransaction()); } } diff --git a/class/index.js b/class/index.js index c6add4c073..ab3c6a57f5 100644 --- a/class/index.js +++ b/class/index.js @@ -5,10 +5,8 @@ export * from './legacy-wallet'; export * from './segwit-bech-wallet'; export * from './segwit-p2sh-wallet'; export * from './hd-segwit-p2sh-wallet'; -export * from './hd-legacy-breadwallet-wallet'; export * from './hd-legacy-p2pkh-wallet'; export * from './watch-only-wallet'; -export * from './lightning-custodian-wallet'; export * from './abstract-hd-wallet'; export * from './hd-segwit-bech32-wallet'; export * from './hd-segwit-bech32-transaction'; diff --git a/class/legacy-wallet.js b/class/legacy-wallet.js index ee9afcb21c..25624fc437 100644 --- a/class/legacy-wallet.js +++ b/class/legacy-wallet.js @@ -1,13 +1,13 @@ -import { AbstractWallet } from './abstract-wallet'; -import { SegwitBech32Wallet } from './'; -import { useBlockcypherTokens } from './constants'; -import Frisbee from 'frisbee'; import { NativeModules } from 'react-native'; -const bitcoin = require('bitcoinjs-lib'); + +import { AbstractWallet } from './abstract-wallet'; + const { RNRandomBytes } = NativeModules; const BigNumber = require('bignumber.js'); -const signer = require('../models/signer'); +const bitcoin = require('bitcoinjs-lib'); + const BlueElectrum = require('../BlueElectrum'); +const signer = require('../models/signer'); /** * Has private key and single address like "1ABCD....." @@ -37,24 +37,23 @@ export class LegacyWallet extends AbstractWallet { * @return {boolean} */ timeToRefreshTransaction() { - for (let tx of this.transactions) { - if (tx.confirmations < 7) { - return true; - } + if (this.unconfirmed_transactions) { + return true; } return false; } async generate() { - let that = this; + const that = this; return new Promise(function(resolve) { if (typeof RNRandomBytes === 'undefined') { // CLI/CI environment // crypto should be provided globally by test launcher - return crypto.randomBytes(32, (err, buf) => { // eslint-disable-line + return crypto.randomBytes(32, (err, buf) => { + // eslint-disable-line if (err) throw err; that.secret = bitcoin.ECPair.makeRandom({ - rng: function(length) { + rng(length) { return buf; }, }).toWIF(); @@ -66,8 +65,8 @@ export class LegacyWallet extends AbstractWallet { RNRandomBytes.randomBytes(32, (err, bytes) => { if (err) throw new Error(err); that.secret = bitcoin.ECPair.makeRandom({ - rng: function(length) { - let b = Buffer.from(bytes, 'base64'); + rng(length) { + const b = Buffer.from(bytes, 'base64'); return b; }, }).toWIF(); @@ -76,15 +75,11 @@ export class LegacyWallet extends AbstractWallet { }); } - /** - * - * @returns {string} - */ getAddress() { if (this._address) return this._address; let address; try { - let keyPair = bitcoin.ECPair.fromWIF(this.secret); + const keyPair = bitcoin.ECPair.fromWIF(this.secret); address = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey, }).address; @@ -104,24 +99,12 @@ export class LegacyWallet extends AbstractWallet { */ async fetchBalance() { try { - const api = new Frisbee({ - baseURI: 'https://api.blockcypher.com/v1/btc/main/addrs/', - }); - - let response = await api.get( - this.getAddress() + '/balance' + ((useBlockcypherTokens && '?token=' + this.getRandomBlockcypherToken()) || ''), - ); - let json = response.body; - if (typeof json === 'undefined' || typeof json.final_balance === 'undefined') { - throw new Error('Could not fetch balance from API: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - this.balance = Number(json.final_balance); - this.unconfirmed_balance = new BigNumber(json.unconfirmed_balance); - this.unconfirmed_balance = this.unconfirmed_balance.dividedBy(100000000).toString() * 1; + const balance = await BlueElectrum.getBalanceByAddress(this.getAddress()); + this.balance = balance.confirmed + balance.unconfirmed; + this.unconfirmed_balance = balance.unconfirmed; this._lastBalanceFetch = +new Date(); } catch (err) { - console.warn(err); + console.warn(err.message); } } @@ -131,41 +114,12 @@ export class LegacyWallet extends AbstractWallet { * @return {Promise.} */ async fetchUtxo() { - const api = new Frisbee({ - baseURI: 'https://api.blockcypher.com/v1/btc/main/addrs/', - }); - - let response; try { - let maxHeight = 0; this.utxo = []; - let json; - - do { - response = await api.get( - this.getAddress() + - '?limit=2000&after=' + - maxHeight + - ((useBlockcypherTokens && '&token=' + this.getRandomBlockcypherToken()) || ''), - ); - json = response.body; - if (typeof json === 'undefined' || typeof json.final_balance === 'undefined') { - throw new Error('Could not fetch UTXO from API' + response.err); - } - json.txrefs = json.txrefs || []; // case when source address is empty (or maxheight too high, no txs) - - for (let txref of json.txrefs) { - maxHeight = Math.max(maxHeight, txref.block_height) + 1; - if (typeof txref.spent !== 'undefined' && txref.spent === false) { - this.utxo.push(txref); - } - } - } while (json.txrefs.length); - - json.unconfirmed_txrefs = json.unconfirmed_txrefs || []; - this.utxo = this.utxo.concat(json.unconfirmed_txrefs); + const utxos = await BlueElectrum.multiGetUtxoByAddress([this.getAddress()]); + this.utxo = utxos; } catch (err) { - console.warn(err); + console.warn(err.message); } } @@ -176,187 +130,19 @@ export class LegacyWallet extends AbstractWallet { * @return {Promise.} */ async fetchTransactions() { + const txids_to_update = []; try { - const api = new Frisbee({ - baseURI: 'https://api.blockcypher.com/', - }); - - let after = 0; - let before = 100500100; - - for (let oldTx of this.getTransactions()) { - if (oldTx.block_height && oldTx.confirmations < 7) { - after = Math.max(after, oldTx.block_height); - } - } - - while (1) { - let response = await api.get( - 'v1/btc/main/addrs/' + - this.getAddress() + - '/full?after=' + - after + - '&before=' + - before + - '&limit=50' + - ((useBlockcypherTokens && '&token=' + this.getRandomBlockcypherToken()) || ''), - ); - let json = response.body; - if (typeof json === 'undefined' || !json.txs) { - throw new Error('Could not fetch transactions from API:' + response.err); - } - - let alreadyFetchedTransactions = this.transactions; - this.transactions = json.txs; - this._lastTxFetch = +new Date(); - - // now, calculating value per each transaction... - for (let tx of this.transactions) { - if (tx.block_height) { - before = Math.min(before, tx.block_height); // so next time we fetch older TXs - } - - // now, if we dont have enough outputs or inputs in response we should collect them from API: - if (tx.next_outputs) { - let newOutputs = await this._fetchAdditionalOutputs(tx.next_outputs); - tx.outputs = tx.outputs.concat(newOutputs); - } - if (tx.next_inputs) { - let newInputs = await this._fetchAdditionalInputs(tx.next_inputs); - tx.inputs = tx.inputs.concat(newInputs); - } - - // how much came in... - let value = 0; - for (let out of tx.outputs) { - if (out && out.addresses && out.addresses.indexOf(this.getAddress()) !== -1) { - // found our address in outs of this TX - value += out.value; - } - } - tx.value = value; - // end - - // how much came out - value = 0; - for (let inp of tx.inputs) { - if (!inp.addresses) { - // console.log('inp.addresses empty'); - // console.log('got witness', inp.witness); // TODO - - inp.addresses = []; - if (inp.witness && inp.witness[1]) { - let address = SegwitBech32Wallet.witnessToAddress(inp.witness[1]); - inp.addresses.push(address); - } else { - inp.addresses.push('???'); - } - } - if (inp && inp.addresses && inp.addresses.indexOf(this.getAddress()) !== -1) { - // found our address in outs of this TX - value -= inp.output_value; - } - } - tx.value += value; - // end - } - - this.transactions = alreadyFetchedTransactions.concat(this.transactions); - - let txsUnconf = []; - let txs = []; - let hashPresent = {}; - // now, rearranging TXs. unconfirmed go first: - for (let tx of this.transactions.reverse()) { - if (hashPresent[tx.hash]) continue; - hashPresent[tx.hash] = 1; - if (tx.block_height && tx.block_height === -1) { - // unconfirmed - console.log(tx); - if (+new Date(tx.received) < +new Date() - 3600 * 24 * 1000) { - // nop, too old unconfirmed tx - skipping it - } else { - txsUnconf.push(tx); - } - } else { - txs.push(tx); - } - } - this.transactions = txsUnconf.reverse().concat(txs.reverse()); - // all reverses needed so freshly fetched TXs replace same old TXs - - this.transactions = this.transactions.sort((a, b) => { - return a.received < b.received; - }); - - if (json.txs.length < 50) { - // final batch, so it has les than max txs - break; - } + this._lastTxFetch = +new Date(); + const txids = await BlueElectrum.getTransactionsByAddress(this.getAddress()); + for (const tx of txids) { + if (!this.transactionConfirmed(tx.tx_hash)) txids_to_update.push(tx.tx_hash); } - } catch (err) { - console.warn(err); + await this._update_unconfirmed_tx(txids_to_update); + } catch (Err) { + console.warn(Err.message); } } - async _fetchAdditionalOutputs(nextOutputs) { - let outputs = []; - let baseURI = nextOutputs.split('/'); - baseURI = baseURI[0] + '/' + baseURI[1] + '/' + baseURI[2] + '/'; - const api = new Frisbee({ - baseURI: baseURI, - }); - - do { - await (() => new Promise(resolve => setTimeout(resolve, 1000)))(); - nextOutputs = nextOutputs.replace(baseURI, ''); - - let response = await api.get(nextOutputs + ((useBlockcypherTokens && '&token=' + this.getRandomBlockcypherToken()) || '')); - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('Could not fetch transactions from API:' + response.err); - } - - if (json.outputs && json.outputs.length) { - outputs = outputs.concat(json.outputs); - nextOutputs = json.next_outputs; - } else { - break; - } - } while (1); - - return outputs; - } - - async _fetchAdditionalInputs(nextInputs) { - let inputs = []; - let baseURI = nextInputs.split('/'); - baseURI = baseURI[0] + '/' + baseURI[1] + '/' + baseURI[2] + '/'; - const api = new Frisbee({ - baseURI: baseURI, - }); - - do { - await (() => new Promise(resolve => setTimeout(resolve, 1000)))(); - nextInputs = nextInputs.replace(baseURI, ''); - - let response = await api.get(nextInputs + ((useBlockcypherTokens && '&token=' + this.getRandomBlockcypherToken()) || '')); - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('Could not fetch transactions from API:' + response.err); - } - - if (json.inputs && json.inputs.length) { - inputs = inputs.concat(json.inputs); - nextInputs = json.next_inputs; - } else { - break; - } - } while (1); - - return inputs; - } - async broadcastTx(txhex) { try { const broadcast = await BlueElectrum.broadcast(txhex); @@ -366,64 +152,6 @@ export class LegacyWallet extends AbstractWallet { } } - async _broadcastTxBtczen(txhex) { - const api = new Frisbee({ - baseURI: 'https://btczen.com', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - }); - - let res = await api.get('/broadcast/' + txhex); - console.log('response btczen', res.body); - return res.body; - } - - async _broadcastTxChainso(txhex) { - const api = new Frisbee({ - baseURI: 'https://chain.so', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - }); - - let res = await api.post('/api/v2/send_tx/BTC', { - body: { tx_hex: txhex }, - }); - return res.body; - } - - async _broadcastTxSmartbit(txhex) { - const api = new Frisbee({ - baseURI: 'https://api.smartbit.com.au', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - }); - - let res = await api.post('/v1/blockchain/pushtx', { - body: { hex: txhex }, - }); - return res.body; - } - - async _broadcastTxBlockcypher(txhex) { - const api = new Frisbee({ - baseURI: 'https://api.blockcypher.com', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - }); - - let res = await api.post('/v1/btc/main/txs/push', { body: { tx: txhex } }); - // console.log('blockcypher response', res); - return res.body; - } - /** * Takes UTXOs (as presented by blockcypher api), transforms them into * format expected by signer module, creates tx and returns signed string txhex. @@ -437,16 +165,15 @@ export class LegacyWallet extends AbstractWallet { */ createTx(utxos, amount, fee, toAddress, memo) { // transforming UTXOs fields to how module expects it - for (let u of utxos) { - u.confirmations = 6; // hack to make module accept 0 confirmations - u.txid = u.tx_hash; - u.vout = u.tx_output_n; - u.amount = new BigNumber(u.value); - u.amount = u.amount.dividedBy(100000000); - u.amount = u.amount.toString(10); + for (const u of utxos) { + u.confirmations = 6; // hack to make module accept 0 confirmation + if (fee <= 0.000001) { + u.value = u.value / 100000000; + u.value = u.value.toString(10); + } } - // console.log('creating legacy tx ', amount, ' with fee ', fee, 'secret=', this.getSecret(), 'from address', this.getAddress()); - let amountPlusFee = parseFloat(new BigNumber(amount).plus(fee).toString(10)); + console.log('creating legacy tx ', amount, ' with fee ', fee, 'secret=', this.getSecret(), 'from address', this.getAddress()); + const amountPlusFee = parseFloat(new BigNumber(amount).plus(fee).toString(10)); return signer.createTransaction(utxos, toAddress, amountPlusFee, fee, this.getSecret(), this.getAddress()); } @@ -455,7 +182,7 @@ export class LegacyWallet extends AbstractWallet { return 0; } let max = 0; - for (let tx of this.getTransactions()) { + for (const tx of this.getTransactions()) { max = Math.max(new Date(tx.received) * 1, max); } @@ -465,7 +192,7 @@ export class LegacyWallet extends AbstractWallet { getRandomBlockcypherToken() { return (array => { for (let i = array.length - 1; i > 0; i--) { - let j = Math.floor(Math.random() * (i + 1)); + const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } return array[0]; @@ -486,4 +213,43 @@ export class LegacyWallet extends AbstractWallet { return false; } } + + transactionConfirmed(txid) { + for (const transaction of this.transactions) { + if (txid === transaction.txid) return true; + } + return false; + } + + getBalance() { + return this.balance; + } + + async _update_unconfirmed_tx(txid_list) { + try { + const txs_full = await BlueElectrum.multiGetTransactionsFullByTxid(txid_list); + const unconfirmed_transactions = []; + for (const tx of txs_full) { + let value = 0; + for (const input of tx.inputs) { + if (!input.txid) continue; // coinbase + if (this.weOwnAddress(input.addresses[0])) value -= input.value; + } + for (const output of tx.outputs) { + if (!output.addresses) continue; // OP_RETURN + if (this.weOwnAddress(output.addresses[0])) value += output.value; + } + tx.value = new BigNumber(value).multipliedBy(100000000).toNumber(); + if (tx.time) tx.received = new Date(tx.time * 1000).toISOString(); + else tx.received = new Date().toISOString(); + tx.walletLabel = this.label; + if (!tx.confirmations) tx.confirmations = 0; + if (tx.confirmations < 6) unconfirmed_transactions.push(tx); + else this.transactions.push(tx); + } + this.unconfirmed_transactions = unconfirmed_transactions; // all unconfirmed transactions will be updated + } catch (err) { + console.warn(err.message); + } + } } diff --git a/class/lightning-custodian-wallet.js b/class/lightning-custodian-wallet.js deleted file mode 100644 index fcac7ca793..0000000000 --- a/class/lightning-custodian-wallet.js +++ /dev/null @@ -1,633 +0,0 @@ -import { LegacyWallet } from './legacy-wallet'; -import Frisbee from 'frisbee'; -import { BitcoinUnit, Chain } from '../models/bitcoinUnits'; - -export class LightningCustodianWallet extends LegacyWallet { - static type = 'lightningCustodianWallet'; - static typeReadable = 'Lightning'; - static defaultBaseUri = 'https://lndhub.herokuapp.com/'; - constructor(props) { - super(props); - this.setBaseURI(); // no args to init with default value - this.init(); - this.refresh_token = ''; - this.access_token = ''; - this._refresh_token_created_ts = 0; - this._access_token_created_ts = 0; - this.refill_addressess = []; - this.pending_transactions_raw = []; - this.user_invoices_raw = []; - this.info_raw = false; - this.preferredBalanceUnit = BitcoinUnit.SATS; - this.chain = Chain.OFFCHAIN; - } - - /** - * requires calling init() after setting - * - * @param URI - */ - setBaseURI(URI) { - if (URI) { - this.baseURI = URI; - } else { - this.baseURI = LightningCustodianWallet.defaultBaseUri; - } - } - - getBaseURI() { - return this.baseURI; - } - - allowSend() { - return true; - } - - getAddress() { - if (this.refill_addressess.length > 0) { - return this.refill_addressess[0]; - } else { - return undefined; - } - } - - getSecret() { - if (this.baseURI === LightningCustodianWallet.defaultBaseUri) { - return this.secret; - } - return this.secret + '@' + this.baseURI; - } - - timeToRefreshBalance() { - return (+new Date() - this._lastBalanceFetch) / 1000 > 300; // 5 min - } - - timeToRefreshTransaction() { - return (+new Date() - this._lastTxFetch) / 1000 > 300; // 5 min - } - - static fromJson(param) { - let obj = super.fromJson(param); - obj.init(); - return obj; - } - - init() { - this._api = new Frisbee({ - baseURI: this.baseURI, - }); - } - - accessTokenExpired() { - return (+new Date() - this._access_token_created_ts) / 1000 >= 3600 * 2; // 2h - } - - refreshTokenExpired() { - return (+new Date() - this._refresh_token_created_ts) / 1000 >= 3600 * 24 * 7; // 7d - } - - generate() { - // nop - } - - async createAccount(isTest) { - let response = await this._api.post('/create', { - body: { partnerid: 'bluewallet', accounttype: (isTest && 'test') || 'common' }, - headers: { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json' }, - }); - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + (json.message ? json.message : json.error) + ' (code ' + json.code + ')'); - } - - if (!json.login || !json.password) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - this.secret = 'lndhub://' + json.login + ':' + json.password; - } - - async payInvoice(invoice, freeAmount = 0) { - let response = await this._api.post('/payinvoice', { - body: { invoice: invoice, amount: freeAmount }, - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - if (response.originalResponse && typeof response.originalResponse === 'string') { - try { - response.originalResponse = JSON.parse(response.originalResponse); - } catch (_) {} - } - - if (response.originalResponse && response.originalResponse.status && response.originalResponse.status === 503) { - throw new Error('Payment is in transit'); - } - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.originalResponse)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - this.last_paid_invoice_result = json; - } - - /** - * Returns list of LND invoices created by user - * - * @return {Promise.} - */ - async getUserInvoices(limit = false) { - let limitString = ''; - if (limit) limitString = '?limit=' + parseInt(limit); - let response = await this._api.get('/getuserinvoices' + limitString, { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.originalResponse)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (limit) { - // need to merge existing invoices with the ones that arrived - // but the ones received later should overwrite older ones - - for (let oldInvoice of this.user_invoices_raw) { - // iterate all OLD invoices - let found = false; - for (let newInvoice of json) { - // iterate all NEW invoices - if (newInvoice.payment_request === oldInvoice.payment_request) found = true; - } - - if (!found) { - // if old invoice is not found in NEW array, we simply add it: - json.push(oldInvoice); - } - } - } - - this.user_invoices_raw = json.sort(function(a, b) { - return a.timestamp - b.timestamp; - }); - - return this.user_invoices_raw; - } - - /** - * Basically the same as this.getUserInvoices() but saves invoices list - * to internal variable - * - * @returns {Promise} - */ - async fetchUserInvoices() { - await this.getUserInvoices(); - } - - isInvoiceGeneratedByWallet(paymentRequest) { - return this.user_invoices_raw.some(invoice => invoice.payment_request === paymentRequest); - } - - async addInvoice(amt, memo) { - let response = await this._api.post('/addinvoice', { - body: { amt: amt + '', memo: memo }, - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.originalResponse)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!json.r_hash || !json.pay_req) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - return json.pay_req; - } - - async checkRouteInvoice(invoice) { - let response = await this._api.get('/checkrouteinvoice?invoice=' + invoice, { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - } - - /** - * Uses login & pass stored in `this.secret` to authorize - * and set internal `access_token` & `refresh_token` - * - * @return {Promise.} - */ - async authorize() { - let login, password; - if (this.secret.indexOf('blitzhub://') !== -1) { - login = this.secret.replace('blitzhub://', '').split(':')[0]; - password = this.secret.replace('blitzhub://', '').split(':')[1]; - } else { - login = this.secret.replace('lndhub://', '').split(':')[0]; - password = this.secret.replace('lndhub://', '').split(':')[1]; - } - let response = await this._api.post('/auth?type=auth', { - body: { login: login, password: password }, - headers: { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json' }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!json.access_token || !json.refresh_token) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - this.refresh_token = json.refresh_token; - this.access_token = json.access_token; - this._refresh_token_created_ts = +new Date(); - this._access_token_created_ts = +new Date(); - } - - async checkLogin() { - if (this.accessTokenExpired() && this.refreshTokenExpired()) { - // all tokens expired, only option is to login with login and password - return this.authorize(); - } - - if (this.accessTokenExpired()) { - // only access token expired, so only refreshing it - let refreshedOk = true; - try { - await this.refreshAcessToken(); - } catch (Err) { - refreshedOk = false; - } - - if (!refreshedOk) { - // something went wrong, lets try to login regularly - return this.authorize(); - } - } - } - - async refreshAcessToken() { - let response = await this._api.post('/auth?type=refresh_token', { - body: { refresh_token: this.refresh_token }, - headers: { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json' }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!json.access_token || !json.refresh_token) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - this.refresh_token = json.refresh_token; - this.access_token = json.access_token; - this._refresh_token_created_ts = +new Date(); - this._access_token_created_ts = +new Date(); - } - - async fetchBtcAddress() { - let response = await this._api.get('/getbtc', { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - this.refill_addressess = []; - - for (let arr of json) { - this.refill_addressess.push(arr.address); - } - } - - async getAddressAsync() { - return this.fetchBtcAddress(); - } - - getTransactions() { - let txs = []; - this.pending_transactions_raw = this.pending_transactions_raw || []; - this.user_invoices_raw = this.user_invoices_raw || []; - this.transactions_raw = this.transactions_raw || []; - txs = txs.concat(this.pending_transactions_raw.slice(), this.transactions_raw.slice().reverse(), this.user_invoices_raw.slice()); // slice so array is cloned - // transforming to how wallets/list screen expects it - for (let tx of txs) { - tx.fromWallet = this.getSecret(); - if (tx.amount) { - // pending tx - tx.amt = tx.amount * -100000000; - tx.fee = 0; - tx.timestamp = tx.time; - tx.memo = 'On-chain transaction'; - } - - if (typeof tx.amt !== 'undefined' && typeof tx.fee !== 'undefined') { - // lnd tx outgoing - tx.value = parseInt((tx.amt * 1 + tx.fee * 1) * -1); - } - - if (tx.type === 'paid_invoice') { - tx.memo = tx.memo || 'Lightning payment'; - if (tx.value > 0) tx.value = tx.value * -1; // value already includes fee in it (see lndhub) - // outer code expects spending transactions to of negative value - } - - if (tx.type === 'bitcoind_tx') { - tx.memo = 'On-chain transaction'; - } - - if (tx.type === 'user_invoice') { - // incoming ln tx - tx.value = parseInt(tx.amt); - tx.memo = tx.description || 'Lightning invoice'; - } - - tx.received = new Date(tx.timestamp * 1000).toString(); - } - return txs.sort(function(a, b) { - return b.timestamp - a.timestamp; - }); - } - - async fetchPendingTransactions() { - let response = await this._api.get('/getpending', { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - this.pending_transactions_raw = json; - } - - async fetchTransactions() { - // TODO: iterate over all available pages - const limit = 10; - let queryRes = ''; - let offset = 0; - queryRes += '?limit=' + limit; - queryRes += '&offset=' + offset; - - let response = await this._api.get('/gettxs' + queryRes, { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!Array.isArray(json)) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - this._lastTxFetch = +new Date(); - this.transactions_raw = json; - } - - getBalance() { - return this.balance; - } - - async fetchBalance(noRetry) { - await this.checkLogin(); - - let response = await this._api.get('/balance', { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - if (json.code * 1 === 1 && !noRetry) { - await this.authorize(); - return this.fetchBalance(true); - } - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!json.BTC || typeof json.BTC.AvailableBalance === 'undefined') { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - this.balance_raw = json; - this.balance = json.BTC.AvailableBalance; - this._lastBalanceFetch = +new Date(); - } - - /** - * Example return: - * { destination: '03864ef025fde8fb587d989186ce6a4a186895ee44a926bfc370e2c366597a3f8f', - * payment_hash: 'faf996300a468b668c58ca0702a12096475a0dd2c3dde8e812f954463966bcf4', - * num_satoshisnum_satoshis: '100', - * timestamp: '1535116657', - * expiry: '3600', - * description: 'hundredSatoshis blitzhub', - * description_hash: '', - * fallback_addr: '', - * cltv_expiry: '10', - * route_hints: [] } - * - * @param invoice BOLT invoice string - * @return {Promise.} - */ - async decodeInvoice(invoice) { - await this.checkLogin(); - - let response = await this._api.get('/decodeinvoice?invoice=' + invoice, { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!json.payment_hash) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - - return (this.decoded_invoice_raw = json); - } - - async fetchInfo() { - let response = await this._api.get('/getinfo', { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - Authorization: 'Bearer' + ' ' + this.access_token, - }, - }); - - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.error) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - - if (!json.identity_pubkey) { - throw new Error('API unexpected response: ' + JSON.stringify(response.body)); - } - this.info_raw = json; - } - - static async isValidNodeAddress(address) { - let apiCall = new Frisbee({ - baseURI: address, - }); - let response = await apiCall.get('/getinfo', { - headers: { - 'Access-Control-Allow-Origin': '*', - 'Content-Type': 'application/json', - }, - }); - let json = response.body; - if (typeof json === 'undefined') { - throw new Error('API failure: ' + response.err + ' ' + JSON.stringify(response.body)); - } - - if (json && json.code && json.code !== 1) { - throw new Error('API error: ' + json.message + ' (code ' + json.code + ')'); - } - return true; - } - - allowReceive() { - return true; - } -} - -/* - - - -pending tx: - - [ { amount: 0.00078061, - account: '521172', - address: '3F9seBGCJZQ4WJJHwGhrxeGXCGbrm5SNpF', - category: 'receive', - confirmations: 0, - blockhash: '', - blockindex: 0, - blocktime: 0, - txid: '28a74277e47c2d772ee8a40464209c90dce084f3b5de38a2f41b14c79e3bfc62', - walletconflicts: [], - time: 1535024434, - timereceived: 1535024434 } ] - - -tx: - - [ { amount: 0.00078061, - account: '521172', - address: '3F9seBGCJZQ4WJJHwGhrxeGXCGbrm5SNpF', - category: 'receive', - confirmations: 5, - blockhash: '0000000000000000000edf18e9ece18e449c6d8eed1f729946b3531c32ee9f57', - blockindex: 693, - blocktime: 1535024914, - txid: '28a74277e47c2d772ee8a40464209c90dce084f3b5de38a2f41b14c79e3bfc62', - walletconflicts: [], - time: 1535024434, - timereceived: 1535024434 } ] - - */ diff --git a/class/onAppLaunch.js b/class/onAppLaunch.js index f257422ce6..03d7a755eb 100644 --- a/class/onAppLaunch.js +++ b/class/onAppLaunch.js @@ -1,4 +1,5 @@ import AsyncStorage from '@react-native-community/async-storage'; + const BlueApp = require('../BlueApp'); export default class OnAppLaunch { diff --git a/class/quickActions.js b/class/quickActions.js new file mode 100644 index 0000000000..92833d593c --- /dev/null +++ b/class/quickActions.js @@ -0,0 +1,46 @@ +import { Platform } from 'react-native'; +import QuickActions from 'react-native-quick-actions'; + +export default class DeviceQuickActions { + static shared = new DeviceQuickActions(); + wallets; + + static setWallets(wallets) { + DeviceQuickActions.shared.wallets = wallets.slice(0, 4); + } + + static removeAllWallets() { + DeviceQuickActions.shared.wallets = undefined; + } + + static setQuickActions() { + if (DeviceQuickActions.shared.wallets === undefined) { + return; + } + QuickActions.isSupported((error, supported) => { + if (supported && error === null) { + const shortcutItems = []; + const loc = require('../loc/'); + for (const wallet of DeviceQuickActions.shared.wallets) { + shortcutItems.push({ + type: 'Wallets', // Required + title: wallet.getLabel(), // Optional, if empty, `type` will be used instead + subtitle: + wallet.hideBalance || wallet.getBalance() <= 0 + ? '' + : loc.formatBalance(Number(wallet.getBalance()), wallet.getPreferredBalanceUnit(), true), + userInfo: { + url: `veleswallet://wallet/${wallet.getID()}`, // Provide any custom data like deep linking URL + }, + icon: Platform.select({ android: 'quickactions', ios: 'bookmark' }), + }); + } + QuickActions.setShortcutItems(shortcutItems); + } + }); + } + + static clearShortcutItems() { + QuickActions.clearShortcutItems(); + } +} diff --git a/class/segwit-bech-wallet.js b/class/segwit-bech-wallet.js index a2db477bd4..b004775362 100644 --- a/class/segwit-bech-wallet.js +++ b/class/segwit-bech-wallet.js @@ -1,4 +1,5 @@ import { LegacyWallet } from './legacy-wallet'; + const bitcoin = require('bitcoinjs-lib'); export class SegwitBech32Wallet extends LegacyWallet { @@ -9,7 +10,7 @@ export class SegwitBech32Wallet extends LegacyWallet { if (this._address) return this._address; let address; try { - let keyPair = bitcoin.ECPair.fromWIF(this.secret); + const keyPair = bitcoin.ECPair.fromWIF(this.secret); address = bitcoin.payments.p2wpkh({ pubkey: keyPair.publicKey, }).address; diff --git a/class/segwit-p2sh-wallet.js b/class/segwit-p2sh-wallet.js index 4469c6f48b..83465be8a5 100644 --- a/class/segwit-p2sh-wallet.js +++ b/class/segwit-p2sh-wallet.js @@ -1,7 +1,9 @@ import { LegacyWallet } from './legacy-wallet'; + +const BigNumber = require('bignumber.js'); const bitcoin = require('bitcoinjs-lib'); + const signer = require('../models/signer'); -const BigNumber = require('bignumber.js'); /** * Creates Segwit P2SH Bitcoin address @@ -20,7 +22,7 @@ function pubkeyToP2shSegwitAddress(pubkey, network) { export class SegwitP2SHWallet extends LegacyWallet { static type = 'segwitP2SH'; - static typeReadable = 'SegWit (P2SH)'; + static typeReadable = 'P2SH'; allowRBF() { return true; @@ -55,8 +57,8 @@ export class SegwitP2SHWallet extends LegacyWallet { if (this._address) return this._address; let address; try { - let keyPair = bitcoin.ECPair.fromWIF(this.secret); - let pubKey = keyPair.publicKey; + const keyPair = bitcoin.ECPair.fromWIF(this.secret); + const pubKey = keyPair.publicKey; if (!keyPair.compressed) { console.warn('only compressed public keys are good for segwit'); return false; @@ -88,17 +90,21 @@ export class SegwitP2SHWallet extends LegacyWallet { sequence = 0; } // transforming UTXOs fields to how module expects it - for (let u of utxos) { - u.confirmations = 6; // hack to make module accept 0 confirmations - u.txid = u.tx_hash; - u.vout = u.tx_output_n; - u.amount = new BigNumber(u.value); - u.amount = u.amount.dividedBy(100000000); - u.amount = u.amount.toString(10); + for (const u of utxos) { + //u.value = u.value / 100000000; + //u.value = u.value.toString(10); } - // console.log('creating tx ', amount, ' with fee ', fee, 'secret=', this.getSecret(), 'from address', this.getAddress()); - let amountPlusFee = parseFloat(new BigNumber(amount).plus(fee).toString(10)); + const amountPlusFee = parseFloat(new BigNumber(amount).plus(fee).toString(10)); + //console.log('creating segwit-p2sh tx ', amount, ' with fee ', fee, ' amountPlusFee ', amountPlusFee, 'secret=', this.getSecret(), 'from address', this.getAddress()); // to compensate that module substracts fee from amount - return signer.createSegwitTransaction(utxos, address, amountPlusFee, fee, this.getSecret(), this.getAddress(), sequence); + return signer.createSegwitTransaction( + utxos, + address, + amountPlusFee, + fee, + this.getSecret(), + this.getAddress(), + sequence, + ); } } diff --git a/class/walletGradient.js b/class/walletGradient.js index 46c4d2ef89..137cc8aa30 100644 --- a/class/walletGradient.js +++ b/class/walletGradient.js @@ -1,20 +1,16 @@ -import { LegacyWallet } from './legacy-wallet'; -import { HDSegwitP2SHWallet } from './hd-segwit-p2sh-wallet'; -import { LightningCustodianWallet } from './lightning-custodian-wallet'; -import { HDLegacyBreadwalletWallet } from './hd-legacy-breadwallet-wallet'; +// import { LegacyWallet } from './legacy-wallet'; import { HDLegacyP2PKHWallet } from './hd-legacy-p2pkh-wallet'; -import { WatchOnlyWallet } from './watch-only-wallet'; import { HDSegwitBech32Wallet } from './hd-segwit-bech32-wallet'; +import { HDSegwitP2SHWallet } from './hd-segwit-p2sh-wallet'; +import { WatchOnlyWallet } from './watch-only-wallet'; export default class WalletGradient { - static hdSegwitP2SHWallet = ['#65ceef', '#68bbe1']; + static hdSegwitP2SHWallet = ['#FFD700', '#8E7B00']; static hdSegwitBech32Wallet = ['#68bbe1', '#3b73d4']; static watchOnlyWallet = ['#7d7d7d', '#4a4a4a']; static legacyWallet = ['#40fad1', '#15be98']; - static hdLegacyP2PKHWallet = ['#e36dfa', '#bd10e0']; - static hdLegacyBreadWallet = ['#fe6381', '#f99c42']; + // static hdLegacyP2PKHWallet = ['#e36dfa', '#bd10e0']; static defaultGradients = ['#c65afb', '#9053fe']; - static lightningCustodianWallet = ['#f1be07', '#f79056']; static createWallet = ['#eef0f4', '#eef0f4']; static gradientsFor(type) { @@ -23,24 +19,15 @@ export default class WalletGradient { case WatchOnlyWallet.type: gradient = WalletGradient.watchOnlyWallet; break; - case LegacyWallet.type: - gradient = WalletGradient.legacyWallet; - break; case HDLegacyP2PKHWallet.type: gradient = WalletGradient.hdLegacyP2PKHWallet; break; - case HDLegacyBreadwalletWallet.type: - gradient = WalletGradient.hdLegacyBreadWallet; - break; case HDSegwitP2SHWallet.type: gradient = WalletGradient.hdSegwitP2SHWallet; break; case HDSegwitBech32Wallet.type: gradient = WalletGradient.hdSegwitBech32Wallet; break; - case LightningCustodianWallet.type: - gradient = WalletGradient.lightningCustodianWallet; - break; case 'CreateWallet': gradient = WalletGradient.createWallet; break; @@ -57,24 +44,18 @@ export default class WalletGradient { case WatchOnlyWallet.type: gradient = WalletGradient.watchOnlyWallet; break; - case LegacyWallet.type: - gradient = WalletGradient.legacyWallet; - break; + //case LegacyWallet.type: + // gradient = WalletGradient.legacyWallet; + // break; case HDLegacyP2PKHWallet.type: gradient = WalletGradient.hdLegacyP2PKHWallet; break; - case HDLegacyBreadwalletWallet.type: - gradient = WalletGradient.hdLegacyBreadWallet; - break; case HDSegwitP2SHWallet.type: gradient = WalletGradient.hdSegwitP2SHWallet; break; case HDSegwitBech32Wallet.type: gradient = WalletGradient.hdSegwitBech32Wallet; break; - case LightningCustodianWallet.type: - gradient = WalletGradient.lightningCustodianWallet; - break; case 'CreateWallet': gradient = WalletGradient.createWallet; break; diff --git a/class/watch-only-wallet.js b/class/watch-only-wallet.js index dedd613c1e..cc285e7e9f 100644 --- a/class/watch-only-wallet.js +++ b/class/watch-only-wallet.js @@ -1,7 +1,8 @@ -import { LegacyWallet } from './legacy-wallet'; -import { HDSegwitP2SHWallet } from './hd-segwit-p2sh-wallet'; import { HDLegacyP2PKHWallet } from './hd-legacy-p2pkh-wallet'; import { HDSegwitBech32Wallet } from './hd-segwit-bech32-wallet'; +import { HDSegwitP2SHWallet } from './hd-segwit-p2sh-wallet'; +import { LegacyWallet } from './legacy-wallet'; + const bitcoin = require('bitcoinjs-lib'); export class WatchOnlyWallet extends LegacyWallet { @@ -14,36 +15,41 @@ export class WatchOnlyWallet extends LegacyWallet { } allowSend() { - return !!this.use_with_hardware_wallet && this._hdWalletInstance instanceof HDSegwitBech32Wallet && this._hdWalletInstance.allowSend(); + return ( + !!this.use_with_hardware_wallet && + this._hdWalletInstance instanceof HDSegwitBech32Wallet && + this._hdWalletInstance.allowSend() + ); } allowBatchSend() { return ( - !!this.use_with_hardware_wallet && this._hdWalletInstance instanceof HDSegwitBech32Wallet && this._hdWalletInstance.allowBatchSend() + !!this.use_with_hardware_wallet && + this._hdWalletInstance instanceof HDSegwitBech32Wallet && + this._hdWalletInstance.allowBatchSend() ); } allowSendMax() { return ( - !!this.use_with_hardware_wallet && this._hdWalletInstance instanceof HDSegwitBech32Wallet && this._hdWalletInstance.allowSendMax() + !!this.use_with_hardware_wallet && + this._hdWalletInstance instanceof HDSegwitBech32Wallet && + this._hdWalletInstance.allowSendMax() ); } - getAddress() { - return this.secret; - } - createTx(utxos, amount, fee, toAddress, memo) { throw new Error('Not supported'); } valid() { - if (this.secret.startsWith('xpub') || this.secret.startsWith('ypub') || this.secret.startsWith('zpub')) return true; + if (this.secret.startsWith('xpub') || this.secret.startsWith('ypub') || this.secret.startsWith('zpub')) return true; // xpubs unsupported due to path mixing try { - bitcoin.address.toOutputScript(this.getAddress()); + bitcoin.address.toOutputScript(this.secret); return true; } catch (e) { + console.warn(e.message); return false; } } @@ -53,7 +59,7 @@ export class WatchOnlyWallet extends LegacyWallet { * as a property of `this`, and in case such property exists - it recreates it and copies data from old one. * this is needed after serialization/save/load/deserialization procedure. */ - init() { + async init() { let hdWalletInstance; if (this.secret.startsWith('xpub')) hdWalletInstance = new HDLegacyP2PKHWallet(); else if (this.secret.startsWith('ypub')) hdWalletInstance = new HDSegwitP2SHWallet(); @@ -62,17 +68,27 @@ export class WatchOnlyWallet extends LegacyWallet { hdWalletInstance._xpub = this.secret; if (this._hdWalletInstance) { // now, porting all properties from old object to new one - for (let k of Object.keys(this._hdWalletInstance)) { + for (const k of Object.keys(this._hdWalletInstance)) { hdWalletInstance[k] = this._hdWalletInstance[k]; } - // deleting properties that cant survive serialization/deserialization: delete hdWalletInstance._node1; delete hdWalletInstance._node0; } + await hdWalletInstance.generateAddresses(); this._hdWalletInstance = hdWalletInstance; } + getAddress() { + if (this._hdWalletInstance) return this._hdWalletInstance.getAddress(); + return this.secret; + } + + getAddressForTransaction() { + if (this._hdWalletInstance) return this._hdWalletInstance.getAddressForTransaction(); + return this.secret; + } + getBalance() { if (this._hdWalletInstance) return this._hdWalletInstance.getBalance(); return super.getBalance(); @@ -103,22 +119,6 @@ export class WatchOnlyWallet extends LegacyWallet { } } - async getAddressAsync() { - if (this.isAddressValid(this.secret)) return new Promise(resolve => resolve(this.secret)); - if (this._hdWalletInstance) return this._hdWalletInstance.getAddressAsync(); - throw new Error('Not initialized'); - } - - async _getExternalAddressByIndex(index) { - if (this._hdWalletInstance) return this._hdWalletInstance._getExternalAddressByIndex(index); - throw new Error('Not initialized'); - } - - async getChangeAddressAsync() { - if (this._hdWalletInstance) return this._hdWalletInstance.getChangeAddressAsync(); - throw new Error('Not initialized'); - } - async fetchUtxo() { if (this._hdWalletInstance) return this._hdWalletInstance.fetchUtxo(); throw new Error('Not initialized'); diff --git a/currency.js b/currency.js index 8f687d4ecf..6c96133a38 100644 --- a/currency.js +++ b/currency.js @@ -1,10 +1,15 @@ -import Frisbee from 'frisbee'; import AsyncStorage from '@react-native-community/async-storage'; +import Frisbee from 'frisbee'; +import DefaultPreference from 'react-native-default-preference'; + import { AppStorage } from './class'; +import DeviceQuickActions from './class/quickActions'; import { FiatUnit } from './models/fiatUnit'; -let BigNumber = require('bignumber.js'); + +const BigNumber = require('bignumber.js'); + let preferredFiatCurrency = FiatUnit.USD; -let exchangeRates = {}; +const exchangeRates = {}; const STRUCT = { LAST_UPDATED: 'LAST_UPDATED', @@ -19,10 +24,17 @@ const STRUCT = { */ async function setPrefferedCurrency(item) { await AsyncStorage.setItem(AppStorage.PREFERRED_CURRENCY, JSON.stringify(item)); + await DefaultPreference.setName('group.network.veles.wallet'); + await DefaultPreference.set('preferredCurrency', item.endPointKey); + await DefaultPreference.set('preferredCurrencyLocale', item.locale.replace('-', '_')); + DeviceQuickActions.setQuickActions(); } async function getPreferredCurrency() { - return JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERRED_CURRENCY)); + const preferredCurrency = await JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERRED_CURRENCY)); + await DefaultPreference.set('preferredCurrency', preferredCurrency.endPointKey); + await DefaultPreference.set('preferredCurrencyLocale', preferredCurrency.locale.replace('-', '_')); + return preferredCurrency; } async function updateExchangeRate() { @@ -41,22 +53,30 @@ async function updateExchangeRate() { const api = new Frisbee({ baseURI: 'https://api.coindesk.com', }); - let response = await api.get('/v1/bpi/currentprice/' + preferredFiatCurrency.endPointKey + '.json'); + const response = await api.get('/v1/bpi/currentprice/' + preferredFiatCurrency.endPointKey + '.json'); json = JSON.parse(response.body); - if (!json || !json.bpi || !json.bpi[preferredFiatCurrency.endPointKey] || !json.bpi[preferredFiatCurrency.endPointKey].rate_float) { + if ( + !json || + !json.bpi || + !json.bpi[preferredFiatCurrency.endPointKey] || + !json.bpi[preferredFiatCurrency.endPointKey].rate_float + ) { throw new Error('Could not update currency rate: ' + response.err); } } catch (Err) { console.warn(Err); const lastSavedExchangeRate = JSON.parse(await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES)); - exchangeRates['BTC_' + preferredFiatCurrency.endPointKey] = lastSavedExchangeRate['BTC_' + preferredFiatCurrency.endPointKey] * 1; + exchangeRates['BTC_' + preferredFiatCurrency.endPointKey] = + lastSavedExchangeRate['BTC_' + preferredFiatCurrency.endPointKey] * 1; return; } exchangeRates[STRUCT.LAST_UPDATED] = +new Date(); - exchangeRates['BTC_' + preferredFiatCurrency.endPointKey] = json.bpi[preferredFiatCurrency.endPointKey].rate_float * 1; + exchangeRates['BTC_' + preferredFiatCurrency.endPointKey] = + json.bpi[preferredFiatCurrency.endPointKey].rate_float * 1; await AsyncStorage.setItem(AppStorage.EXCHANGE_RATES, JSON.stringify(exchangeRates)); await AsyncStorage.setItem(AppStorage.PREFERRED_CURRENCY, JSON.stringify(preferredFiatCurrency)); + DeviceQuickActions.setQuickActions(); } let interval = false; @@ -71,7 +91,10 @@ async function startUpdater() { } function satoshiToLocalCurrency(satoshi) { - if (!exchangeRates['BTC_' + preferredFiatCurrency.endPointKey]) return '...'; + if (!exchangeRates['BTC_' + preferredFiatCurrency.endPointKey]) { + startUpdater(); + return '...'; + } let b = new BigNumber(satoshi); b = b diff --git a/edit-version-number.sh b/edit-version-number.sh index 95e5af05f8..4cd1fbceab 100755 --- a/edit-version-number.sh +++ b/edit-version-number.sh @@ -1,6 +1,7 @@ vim ios/BlueWallet/Info.plist vim ios/BlueWalletWatch/Info.plist vim "ios/BlueWalletWatch Extension/Info.plist" +vim "ios/TodayExtension/Info.plist" vim android/app/build.gradle vim package.json vim package-lock.json diff --git a/encryption.js b/encryption.js index 1a0df24624..632d60b5c1 100644 --- a/encryption.js +++ b/encryption.js @@ -1,12 +1,12 @@ -let CryptoJS = require('crypto-js'); +const CryptoJS = require('crypto-js'); module.exports.encrypt = function(data, password) { - let ciphertext = CryptoJS.AES.encrypt(data, password); + const ciphertext = CryptoJS.AES.encrypt(data, password); return ciphertext.toString(); }; module.exports.decrypt = function(data, password) { - let bytes = CryptoJS.AES.decrypt(data, password); + const bytes = CryptoJS.AES.decrypt(data, password); let str = false; try { str = bytes.toString(CryptoJS.enc.Utf8); diff --git a/events.js b/events.js index 92f46a9ef0..1060a1d48e 100644 --- a/events.js +++ b/events.js @@ -8,7 +8,7 @@ function EV(eventName, arg, isExclusive) { if (typeof arg !== 'function') { // then its an argument console.log('got event', eventName, '...'); - for (let cc of EV.callbacks[eventName]) { + for (const cc of EV.callbacks[eventName]) { console.log('dispatching event', eventName); cc(arg); } @@ -40,3 +40,4 @@ EV.enum = { }; module.exports = EV; +export default EV; diff --git a/img/2.json b/img/2.json new file mode 100644 index 0000000000..a39e7a6e79 --- /dev/null +++ b/img/2.json @@ -0,0 +1 @@ +{"ip":0,"fr":60,"v":"5.1.20","assets":[],"layers":[{"ty":4,"nm":"blue","ip":0,"st":0,"ind":5,"hix":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":88,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":132}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[21.5,8.5,0]},"p":{"s":true,"x":{"a":0,"k":294},"y":{"a":0,"k":231}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100]}},"shapes":[{"ty":"gr","nm":"blue shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[69.1831055, 96.1743164], [72.6694337, 94.2260742], [72.854004, 94.2260742], [72.854004, 96], [75.7456055, 96], [75.7456055, 80.3730469], [72.7617188, 80.3730469], [72.7617188, 86.4946289], [72.5771485, 86.4946289], [69.1831055, 84.5053711], [64.5996094, 90.3398438]],"i":[[2.8403319999999894,0],[0.6049804999999964,1.230468799999997],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.548339900000002,0],[0,-3.6503907000000027]],"o":[[-1.5996094000000056,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.5742188000000112,-1.240722699999992],[2.8608397999999937,0],[0,3.6298828000000043]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[70.1264648,87.0073242],[67.5527344,90.3500977],[70.1264648,93.6826172],[72.6796875,90.3398438]],"i":[[1.5791016000000013,0],[0.010253899999995042,-2.0610352000000063],[-1.579101499999993,0],[0,2.0712890000000073]],"o":[[-1.568847599999998,0],[0.010253899999995042,2.0507811999999888],[1.5893555000000106,0],[0,-2.061035199999992]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[77.7401952,96],[77.7401952,80.3730469],[80.7240819,80.3730469],[80.7240819,96]],"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[93.5160349,84.6899414],[93.5160349,96],[90.6244333,96],[90.6244333,94.1850586],[90.439863,94.1850586],[87.1381052,96.2460938],[83.1800974,92.0625],[83.1800974,84.6899414],[86.1639841,84.6899414],[86.1639841,91.293457],[88.245527,93.6518555],[90.5321481,91.2114258],[90.5321481,84.6899414]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.712402300000008,0],[0,2.625],[0,0],[0,0],[0,0],[-1.3740233999999987,0],[0,1.5073241999999993],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.5332031000000086,1.3125],[-2.4404296999999957,0],[0,0],[0,0],[0,0],[0,1.558593799999997],[1.4868165000000033,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[100.863164,86.7304688],[98.4022261,89.1606445],[103.221562,89.1606445]],"i":[[1.3945310000000006,0],[0.10253910000000133,-1.466308600000005],[0,0]],"o":[[-1.3842776999999984,0],[0,0],[-0.06152300000000821,-1.4970703000000043]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[103.283085,92.7802734],[106.061894,92.7802734],[100.893925,96.2460938],[95.4183394,90.4013672],[100.85291,84.4438477],[106.154179,90.1552734],[106.154179,91.0678711],[98.3919722,91.0678711],[98.3919722,91.2216797],[100.975957,93.9492188]],"i":[[-0.3178709999999967,0.7485352000000063],[0,0],[2.7685550000000063,0],[0,3.6708983999999987],[-3.3632814999999994,0],[0,-3.5888671999999957],[0,0],[0,0],[0,0],[-1.5585941999999875,0]],"o":[[0,0],[-0.4511719999999997,2.1328125],[-3.4453121999999894,0],[0,-3.681152400000002],[3.332519000000005,0],[0,0],[0,0],[0,0],[0.04101560000000859,1.6816406000000086],[1.1791990000000112,0]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"fl","o":{"a":0,"k":100},"r":1,"c":{"a":0,"k":[1,1,1,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-64,-80]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"wallet","ip":0,"st":0,"ind":4,"hix":2,"ks":{"o":{"a":0,"k":0},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[29.5,8.5,0]},"p":{"s":true,"x":{"a":0,"k":291},"y":{"a":0,"k":235.5}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[],"op":132},{"ty":4,"nm":"small","ip":0,"st":0,"ind":3,"hix":3,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":40}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,32,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[267.5],"e":[228],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":40}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"small shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[30.3055543,56.484375],[89.6944457,56.484375],[106.331298,60.053101],[116.431274,70.1530769],[120,86.7899293],[120,89.6944457],[116.431274,106.331298],[106.331298,116.431274],[89.6944457,120],[30.3055543,120],[13.6687019,116.431274],[3.56872596,106.331298],[-4.39256841e-16,89.6944457],[4.39256841e-16,86.7899293],[3.56872596,70.1530769],[13.6687019,60.053101]],"i":[[-7.174513700000002,0],[0,0],[-4.354167000000004,-2.3286339],[-2.328634000000008,-4.354166599999999],[0,-7.1745136999999914],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[7.1745136999999914,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[8.78624526e-16,7.1745136999999914],[0,0],[-2.3286338100000004,4.354166699999993],[-4.354166640000001,2.3286337999999986]],"o":[[0,0],[7.1745136999999914,0],[4.35416699999999,2.3286337999999986],[2.328633999999994,4.354166699999993],[0,0],[0,7.1745136999999914],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-7.174513700000002,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-8.78624526e-16,-7.1745136999999914],[2.3286338200000003,-4.354166599999999],[4.354166699999999,-2.3286339]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k": [0,1,0.86,0.45,1,1,0.8,0.35] }},"t":1,"s":{"a":0,"k":[60,3.2704118520000005]},"e":{"a":0,"k":[60,120]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,-56]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"medium","ip":0,"st":0,"ind":2,"hix":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":27,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":64}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,47,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[274],"e":[274],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":27,"s":[274],"e":[213],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":64}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"medium shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[34.2519038,26.484375],[85.7480962,26.484375],[106.331298,30.053101],[116.431274,40.1530769],[120,60.7362788],[120,85.7480962],[116.431274,106.331298],[106.331298,116.431274],[85.7480962,120],[34.2519038,120],[13.6687019,116.431274],[3.56872596,106.331298],[-9.22545274e-16,85.7480962],[9.22545274e-16,60.7362788],[3.56872596,40.1530769],[13.6687019,30.053101]],"i":[[-11.9101331,0],[0,0],[-4.354167000000004,-2.3286339000000034],[-2.328634000000008,-4.354166599999999],[0,-11.910133100000003],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[11.910133099999996,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[1.458570646e-15,11.910133099999996],[0,0],[-2.3286338100000004,4.3541667],[-4.354166640000001,2.328633799999995]],"o":[[0,0],[11.910133099999996,0],[4.35416699999999,2.328633799999995],[2.328633999999994,4.3541667],[0,0],[0,11.910133099999996],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-11.9101331,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-1.458570646e-15,-11.910133100000003],[2.3286338200000003,-4.354166599999999],[4.354166699999999,-2.3286339000000034]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k": [0, 1, 0.74, 0 , 1, 1, 0.7, 0]}} ,"t":1,"s":{"a":0,"k":[60,0]},"e":{"a":0,"k":[60,117.46116324]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,-26]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"big","ip":0,"st":0,"ind":1,"hix":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":49,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":88}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,60,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[287],"e":[287],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":49,"s":[287],"e":[200],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":88}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"big shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[34.2519038,-1.38381791e-15],[85.7480962,1.38381791e-15],[106.331298,3.56872596],[116.431274,13.6687019],[120,34.2519038],[120,85.7480962],[116.431274,106.331298],[106.331298,116.431274],[85.7480962,120],[34.2519038,120],[13.6687019,116.431274],[3.56872596,106.331298],[-9.22545274e-16,85.7480962],[9.22545274e-16,34.2519038],[3.56872596,13.6687019],[13.6687019,3.56872596]],"i":[[-11.9101331,2.187855967e-15],[0,0],[-4.354167000000004,-2.3286338100000004],[-2.328634000000008,-4.354166640000001],[0,-11.9101331],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[11.910133099999996,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[1.458570646e-15,11.910133099999996],[0,0],[-2.3286338100000004,4.354166699999999],[-4.354166640000001,2.3286338200000003]],"o":[[0,0],[11.910133099999996,-2.187855967e-15],[4.35416699999999,2.3286338200000003],[2.328633999999994,4.354166699999999],[0,0],[0,11.910133099999996],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-11.9101331,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-1.458570646e-15,-11.9101331],[2.3286338200000003,-4.354166640000001],[4.354166699999999,-2.3286338100000004]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k": [0,0.65, 0.48 ,0.0, 1, 0.65, 0.42 ,0]}}, "t":1,"s":{"a":0,"k":[60,3.405888732]},"e":{"a":0,"k":[60,120]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0}}]}],"op":132}],"op":132,"w":550,"h":400} diff --git a/img/addWallet/bitcoin.png b/img/addWallet/bitcoin.png index 1ed114d3c7..bfd3eb2579 100755 Binary files a/img/addWallet/bitcoin.png and b/img/addWallet/bitcoin.png differ diff --git a/img/addWallet/bitcoin@2x.png b/img/addWallet/bitcoin@2x.png index fb9f96e253..22f9193987 100755 Binary files a/img/addWallet/bitcoin@2x.png and b/img/addWallet/bitcoin@2x.png differ diff --git a/img/addWallet/bitcoin@3x.png b/img/addWallet/bitcoin@3x.png index 4d1629325d..b4849ec14e 100755 Binary files a/img/addWallet/bitcoin@3x.png and b/img/addWallet/bitcoin@3x.png differ diff --git a/img/bluewalletsplash.json b/img/bluewalletsplash.json index a4b85e2fa4..1d43387982 100644 --- a/img/bluewalletsplash.json +++ b/img/bluewalletsplash.json @@ -1 +1 @@ -{"ip":0,"fr":60,"v":"5.1.20","assets":[],"layers":[{"ty":4,"nm":"blue","ip":0,"st":0,"ind":5,"hix":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":88,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":132}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[21.5,8.5,0]},"p":{"s":true,"x":{"a":0,"k":294},"y":{"a":0,"k":231}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100]}},"shapes":[{"ty":"gr","nm":"blue shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[71.1621094,96.1743164],[67.6757812,94.2260742],[67.4912109,94.2260742],[67.4912109,96],[64.5996094,96],[64.5996094,80.3730469],[67.5834961,80.3730469],[67.5834961,86.4946289],[67.7680664,86.4946289],[71.1621094,84.5053711],[75.7456055,90.3398438]],"i":[[2.8403319999999894,0],[0.6049804999999964,1.230468799999997],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.548339900000002,0],[0,-3.6503907000000027]],"o":[[-1.5996094000000056,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.5742188000000112,-1.240722699999992],[2.8608397999999937,0],[0,3.6298828000000043]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[70.1264648,87.0073242],[67.5527344,90.3500977],[70.1264648,93.6826172],[72.6796875,90.3398438]],"i":[[1.5791016000000013,0],[0.010253899999995042,-2.0610352000000063],[-1.579101499999993,0],[0,2.0712890000000073]],"o":[[-1.568847599999998,0],[0.010253899999995042,2.0507811999999888],[1.5893555000000106,0],[0,-2.061035199999992]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[77.7401952,96],[77.7401952,80.3730469],[80.7240819,80.3730469],[80.7240819,96]],"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[93.5160349,84.6899414],[93.5160349,96],[90.6244333,96],[90.6244333,94.1850586],[90.439863,94.1850586],[87.1381052,96.2460938],[83.1800974,92.0625],[83.1800974,84.6899414],[86.1639841,84.6899414],[86.1639841,91.293457],[88.245527,93.6518555],[90.5321481,91.2114258],[90.5321481,84.6899414]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.712402300000008,0],[0,2.625],[0,0],[0,0],[0,0],[-1.3740233999999987,0],[0,1.5073241999999993],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.5332031000000086,1.3125],[-2.4404296999999957,0],[0,0],[0,0],[0,0],[0,1.558593799999997],[1.4868165000000033,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[100.863164,86.7304688],[98.4022261,89.1606445],[103.221562,89.1606445]],"i":[[1.3945310000000006,0],[0.10253910000000133,-1.466308600000005],[0,0]],"o":[[-1.3842776999999984,0],[0,0],[-0.06152300000000821,-1.4970703000000043]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[103.283085,92.7802734],[106.061894,92.7802734],[100.893925,96.2460938],[95.4183394,90.4013672],[100.85291,84.4438477],[106.154179,90.1552734],[106.154179,91.0678711],[98.3919722,91.0678711],[98.3919722,91.2216797],[100.975957,93.9492188]],"i":[[-0.3178709999999967,0.7485352000000063],[0,0],[2.7685550000000063,0],[0,3.6708983999999987],[-3.3632814999999994,0],[0,-3.5888671999999957],[0,0],[0,0],[0,0],[-1.5585941999999875,0]],"o":[[0,0],[-0.4511719999999997,2.1328125],[-3.4453121999999894,0],[0,-3.681152400000002],[3.332519000000005,0],[0,0],[0,0],[0,0],[0.04101560000000859,1.6816406000000086],[1.1791990000000112,0]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"fl","o":{"a":0,"k":100},"r":1,"c":{"a":0,"k":[1,1,1,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-64,-80]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"wallet","ip":0,"st":0,"ind":4,"hix":2,"ks":{"o":{"a":0,"k":0},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[29.5,8.5,0]},"p":{"s":true,"x":{"a":0,"k":291},"y":{"a":0,"k":235.5}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[],"op":132},{"ty":4,"nm":"small","ip":0,"st":0,"ind":3,"hix":3,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":40}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,32,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[267.5],"e":[228],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":40}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"small shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[30.3055543,56.484375],[89.6944457,56.484375],[106.331298,60.053101],[116.431274,70.1530769],[120,86.7899293],[120,89.6944457],[116.431274,106.331298],[106.331298,116.431274],[89.6944457,120],[30.3055543,120],[13.6687019,116.431274],[3.56872596,106.331298],[-4.39256841e-16,89.6944457],[4.39256841e-16,86.7899293],[3.56872596,70.1530769],[13.6687019,60.053101]],"i":[[-7.174513700000002,0],[0,0],[-4.354167000000004,-2.3286339],[-2.328634000000008,-4.354166599999999],[0,-7.1745136999999914],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[7.1745136999999914,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[8.78624526e-16,7.1745136999999914],[0,0],[-2.3286338100000004,4.354166699999993],[-4.354166640000001,2.3286337999999986]],"o":[[0,0],[7.1745136999999914,0],[4.35416699999999,2.3286337999999986],[2.328633999999994,4.354166699999993],[0,0],[0,7.1745136999999914],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-7.174513700000002,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-8.78624526e-16,-7.1745136999999914],[2.3286338200000003,-4.354166599999999],[4.354166699999999,-2.3286339]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.5450980392156862,0.8431372549019608,0.9764705882352941,1,0.40784313725490196,0.7333333333333333,0.8823529411764706]}},"t":1,"s":{"a":0,"k":[60,3.2704118520000005]},"e":{"a":0,"k":[60,120]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,-56]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"medium","ip":0,"st":0,"ind":2,"hix":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":27,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":64}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,47,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[274],"e":[274],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":27,"s":[274],"e":[213],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":64}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"medium shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[34.2519038,26.484375],[85.7480962,26.484375],[106.331298,30.053101],[116.431274,40.1530769],[120,60.7362788],[120,85.7480962],[116.431274,106.331298],[106.331298,116.431274],[85.7480962,120],[34.2519038,120],[13.6687019,116.431274],[3.56872596,106.331298],[-9.22545274e-16,85.7480962],[9.22545274e-16,60.7362788],[3.56872596,40.1530769],[13.6687019,30.053101]],"i":[[-11.9101331,0],[0,0],[-4.354167000000004,-2.3286339000000034],[-2.328634000000008,-4.354166599999999],[0,-11.910133100000003],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[11.910133099999996,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[1.458570646e-15,11.910133099999996],[0,0],[-2.3286338100000004,4.3541667],[-4.354166640000001,2.328633799999995]],"o":[[0,0],[11.910133099999996,0],[4.35416699999999,2.328633799999995],[2.328633999999994,4.3541667],[0,0],[0,11.910133099999996],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-11.9101331,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-1.458570646e-15,-11.910133100000003],[2.3286338200000003,-4.354166599999999],[4.354166699999999,-2.3286339000000034]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.24705882352941178,0.47058823529411764,0.8627450980392157,1,0.1843137254901961,0.37254901960784315,0.7019607843137254]}},"t":1,"s":{"a":0,"k":[60,0]},"e":{"a":0,"k":[60,117.46116324]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,-26]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"big","ip":0,"st":0,"ind":1,"hix":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":49,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":88}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,60,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[287],"e":[287],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":49,"s":[287],"e":[200],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":88}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"big shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[34.2519038,-1.38381791e-15],[85.7480962,1.38381791e-15],[106.331298,3.56872596],[116.431274,13.6687019],[120,34.2519038],[120,85.7480962],[116.431274,106.331298],[106.331298,116.431274],[85.7480962,120],[34.2519038,120],[13.6687019,116.431274],[3.56872596,106.331298],[-9.22545274e-16,85.7480962],[9.22545274e-16,34.2519038],[3.56872596,13.6687019],[13.6687019,3.56872596]],"i":[[-11.9101331,2.187855967e-15],[0,0],[-4.354167000000004,-2.3286338100000004],[-2.328634000000008,-4.354166640000001],[0,-11.9101331],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[11.910133099999996,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[1.458570646e-15,11.910133099999996],[0,0],[-2.3286338100000004,4.354166699999999],[-4.354166640000001,2.3286338200000003]],"o":[[0,0],[11.910133099999996,-2.187855967e-15],[4.35416699999999,2.3286338200000003],[2.328633999999994,4.354166699999999],[0,0],[0,11.910133099999996],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-11.9101331,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-1.458570646e-15,-11.9101331],[2.3286338200000003,-4.354166640000001],[4.354166699999999,-2.3286338100000004]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.09019607843137255,0.27450980392156865,0.592156862745098,1,0.047058823529411764,0.1450980392156863,0.3137254901960784]}},"t":1,"s":{"a":0,"k":[60,3.405888732]},"e":{"a":0,"k":[60,120]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0}}]}],"op":132}],"op":132,"w":550,"h":400} \ No newline at end of file +{"ip":0,"fr":60,"v":"5.1.20","assets":[],"layers":[{"ty":4,"nm":"blue","ip":132,"st":0,"ind":5,"hix":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":88,"s":[0],"e":[100],"i":{"x":[0.515],"y":[0.955]},"o":{"x":[0.455],"y":[0.03]}},{"t":132}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[21.5,8.5,0]},"p":{"s":true,"x":{"a":0,"k":294},"y":{"a":0,"k":231}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100]}},"shapes":[{"ty":"gr","nm":"blue shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[69.1831055,96.1743164],[72.6694337,94.2260742],[72.854004,94.2260742],[72.854004,96],[75.7456055,96],[75.7456055,80.3730469],[72.7617188,80.3730469],[72.7617188,86.4946289],[72.5771485,86.4946289],[69.1831055,84.5053711],[64.5996094,90.3398438]],"i":[[2.8403319999999894,0],[0.6049804999999964,1.230468799999997],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.548339900000002,0],[0,-3.6503907000000027]],"o":[[-1.5996094000000056,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.5742188000000112,-1.240722699999992],[2.8608397999999937,0],[0,3.6298828000000043]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[70.1264648,87.0073242],[67.5527344,90.3500977],[70.1264648,93.6826172],[72.6796875,90.3398438]],"i":[[1.5791016000000013,0],[0.010253899999995042,-2.0610352000000063],[-1.579101499999993,0],[0,2.0712890000000073]],"o":[[-1.568847599999998,0],[0.010253899999995042,2.0507811999999888],[1.5893555000000106,0],[0,-2.061035199999992]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[77.7401952,96],[77.7401952,80.3730469],[80.7240819,80.3730469],[80.7240819,96]],"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[93.5160349,84.6899414],[93.5160349,96],[90.6244333,96],[90.6244333,94.1850586],[90.439863,94.1850586],[87.1381052,96.2460938],[83.1800974,92.0625],[83.1800974,84.6899414],[86.1639841,84.6899414],[86.1639841,91.293457],[88.245527,93.6518555],[90.5321481,91.2114258],[90.5321481,84.6899414]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.712402300000008,0],[0,2.625],[0,0],[0,0],[0,0],[-1.3740233999999987,0],[0,1.5073241999999993],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.5332031000000086,1.3125],[-2.4404296999999957,0],[0,0],[0,0],[0,0],[0,1.558593799999997],[1.4868165000000033,0],[0,0],[0,0]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[100.863164,86.7304688],[98.4022261,89.1606445],[103.221562,89.1606445]],"i":[[1.3945310000000006,0],[0.10253910000000133,-1.466308600000005],[0,0]],"o":[[-1.3842776999999984,0],[0,0],[-0.06152300000000821,-1.4970703000000043]]}}},{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[103.283085,92.7802734],[106.061894,92.7802734],[100.893925,96.2460938],[95.4183394,90.4013672],[100.85291,84.4438477],[106.154179,90.1552734],[106.154179,91.0678711],[98.3919722,91.0678711],[98.3919722,91.2216797],[100.975957,93.9492188]],"i":[[-0.3178709999999967,0.7485352000000063],[0,0],[2.7685550000000063,0],[0,3.6708983999999987],[-3.3632814999999994,0],[0,-3.5888671999999957],[0,0],[0,0],[0,0],[-1.5585941999999875,0]],"o":[[0,0],[-0.4511719999999997,2.1328125],[-3.4453121999999894,0],[0,-3.681152400000002],[3.332519000000005,0],[0,0],[0,0],[0,0],[0.04101560000000859,1.6816406000000086],[1.1791990000000112,0]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"fl","o":{"a":0,"k":100},"r":1,"c":{"a":0,"k":[1,1,1,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-64,-80]},"r":{"a":0,"k":0}}]}],"op":132,"hidden":0},{"ty":4,"nm":"wallet","ip":0,"st":0,"ind":4,"hix":2,"ks":{"o":{"a":0,"k":0},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[29.5,8.5,0]},"p":{"s":true,"x":{"a":0,"k":291},"y":{"a":0,"k":235.5}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[],"op":132},{"ty":4,"nm":"small","ip":0,"st":0,"ind":3,"hix":3,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":40}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,32,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[267.5],"e":[228],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":40}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"small shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[30.3055543,56.484375],[89.6944457,56.484375],[106.331298,60.053101],[116.431274,70.1530769],[120,86.7899293],[120,89.6944457],[116.431274,106.331298],[106.331298,116.431274],[89.6944457,120],[30.3055543,120],[13.6687019,116.431274],[3.56872596,106.331298],[-4.39256841e-16,89.6944457],[4.39256841e-16,86.7899293],[3.56872596,70.1530769],[13.6687019,60.053101]],"i":[[-7.174513700000002,0],[0,0],[-4.354167000000004,-2.3286339],[-2.328634000000008,-4.354166599999999],[0,-7.1745136999999914],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[7.1745136999999914,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[8.78624526e-16,7.1745136999999914],[0,0],[-2.3286338100000004,4.354166699999993],[-4.354166640000001,2.3286337999999986]],"o":[[0,0],[7.1745136999999914,0],[4.35416699999999,2.3286337999999986],[2.328633999999994,4.354166699999993],[0,0],[0,7.1745136999999914],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-7.174513700000002,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-8.78624526e-16,-7.1745136999999914],[2.3286338200000003,-4.354166599999999],[4.354166699999999,-2.3286339]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,1,0.86,0.45,1,1,0.8,0.35]}},"t":1,"s":{"a":0,"k":[60,3.2704118520000005]},"e":{"a":0,"k":[60,120]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,-56]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"medium","ip":0,"st":0,"ind":2,"hix":4,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":27,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":64}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,47,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[274],"e":[274],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":27,"s":[274],"e":[213],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":64}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"medium shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[34.2519038,26.484375],[85.7480962,26.484375],[106.331298,30.053101],[116.431274,40.1530769],[120,60.7362788],[120,85.7480962],[116.431274,106.331298],[106.331298,116.431274],[85.7480962,120],[34.2519038,120],[13.6687019,116.431274],[3.56872596,106.331298],[-9.22545274e-16,85.7480962],[9.22545274e-16,60.7362788],[3.56872596,40.1530769],[13.6687019,30.053101]],"i":[[-11.9101331,0],[0,0],[-4.354167000000004,-2.3286339000000034],[-2.328634000000008,-4.354166599999999],[0,-11.910133100000003],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[11.910133099999996,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[1.458570646e-15,11.910133099999996],[0,0],[-2.3286338100000004,4.3541667],[-4.354166640000001,2.328633799999995]],"o":[[0,0],[11.910133099999996,0],[4.35416699999999,2.328633799999995],[2.328633999999994,4.3541667],[0,0],[0,11.910133099999996],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-11.9101331,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-1.458570646e-15,-11.910133100000003],[2.3286338200000003,-4.354166599999999],[4.354166699999999,-2.3286339000000034]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,1,0.74,0,1,1,0.7,0]}},"t":1,"s":{"a":0,"k":[60,0]},"e":{"a":0,"k":[60,117.46116324]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,-26]},"r":{"a":0,"k":0}}]}],"op":132},{"ty":4,"nm":"big","ip":0,"st":0,"ind":1,"hix":5,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":49,"s":[0],"e":[100],"i":{"x":[0.675],"y":[0.19]},"o":{"x":[0.55],"y":[0.055]}},{"t":88}]},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[60,60,0]},"p":{"s":true,"x":{"a":0,"k":275},"y":{"a":1,"k":[{"t":0,"s":[287],"e":[287],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":49,"s":[287],"e":[200],"i":{"x":[0.265],"y":[1.5]},"o":{"x":[0.68],"y":[-0.55]}},{"t":88}]}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":0,"k":0},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","nm":"big shape group","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"v":[[34.2519038,-1.38381791e-15],[85.7480962,1.38381791e-15],[106.331298,3.56872596],[116.431274,13.6687019],[120,34.2519038],[120,85.7480962],[116.431274,106.331298],[106.331298,116.431274],[85.7480962,120],[34.2519038,120],[13.6687019,116.431274],[3.56872596,106.331298],[-9.22545274e-16,85.7480962],[9.22545274e-16,34.2519038],[3.56872596,13.6687019],[13.6687019,3.56872596]],"i":[[-11.9101331,2.187855967e-15],[0,0],[-4.354167000000004,-2.3286338100000004],[-2.328634000000008,-4.354166640000001],[0,-11.9101331],[0,0],[2.328633999999994,-4.354167000000004],[4.35416699999999,-2.328634000000008],[11.910133099999996,0],[0,0],[4.354166699999999,2.328633999999994],[2.3286338200000003,4.35416699999999],[1.458570646e-15,11.910133099999996],[0,0],[-2.3286338100000004,4.354166699999999],[-4.354166640000001,2.3286338200000003]],"o":[[0,0],[11.910133099999996,-2.187855967e-15],[4.35416699999999,2.3286338200000003],[2.328633999999994,4.354166699999999],[0,0],[0,11.910133099999996],[-2.328634000000008,4.35416699999999],[-4.354167000000004,2.328633999999994],[0,0],[-11.9101331,0],[-4.354166640000001,-2.328634000000008],[-2.3286338100000004,-4.354167000000004],[0,0],[-1.458570646e-15,-11.9101331],[2.3286338200000003,-4.354166640000001],[4.354166699999999,-2.3286338100000004]]}}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1,"ml":1},{"ty":"gf","o":{"a":0,"k":100},"r":2,"g":{"p":2,"k":{"a":0,"k":[0,0.65,0.48,0,1,0.65,0.42,0]}},"t":1,"s":{"a":0,"k":[60,3.405888732]},"e":{"a":0,"k":[60,120]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0}}]}],"op":132}],"op":132,"w":550,"h":400} \ No newline at end of file diff --git a/img/btc-shape.png b/img/btc-shape.png index e631478472..dd57cbd7be 100644 Binary files a/img/btc-shape.png and b/img/btc-shape.png differ diff --git a/img/icon.png b/img/icon.png old mode 100755 new mode 100644 index 2386be35b5..984896c9c9 Binary files a/img/icon.png and b/img/icon.png differ diff --git a/img/icon@2x.png b/img/icon@2x.png old mode 100755 new mode 100644 index d734de25ec..85e164e6f6 Binary files a/img/icon@2x.png and b/img/icon@2x.png differ diff --git a/img/icon@3x.png b/img/icon@3x.png old mode 100755 new mode 100644 index 10fba23c79..091b4b6c9d Binary files a/img/icon@3x.png and b/img/icon@3x.png differ diff --git a/img/qr-code.png b/img/qr-code.png index 12aa04de66..4753cdc79e 100644 Binary files a/img/qr-code.png and b/img/qr-code.png differ diff --git a/img/qr-code@2x.png b/img/qr-code@2x.png index e584ca854b..ad39007d29 100644 Binary files a/img/qr-code@2x.png and b/img/qr-code@2x.png differ diff --git a/img/qr-code@3x.png b/img/qr-code@3x.png index b55d46bd7d..0a8b814051 100644 Binary files a/img/qr-code@3x.png and b/img/qr-code@3x.png differ diff --git a/img/splash/splash.png b/img/splash/splash.png index 5eba61c716..3e9549d5e3 100644 Binary files a/img/splash/splash.png and b/img/splash/splash.png differ diff --git a/img/splash/splash@2x.png b/img/splash/splash@2x.png index 5eba61c716..ea3e710822 100644 Binary files a/img/splash/splash@2x.png and b/img/splash/splash@2x.png differ diff --git a/img/splash/splash@3x.png b/img/splash/splash@3x.png index b07a7934f7..edf1047c5e 100644 Binary files a/img/splash/splash@3x.png and b/img/splash/splash@3x.png differ diff --git a/index.js b/index.js index 763c49b7e6..ccceed1bb2 100644 --- a/index.js +++ b/index.js @@ -1,16 +1,15 @@ +import 'react-native-gesture-handler'; + import 'intl'; import 'intl/locale-data/jsonp/en'; -import React from 'react'; import './shim.js'; -import { AppRegistry } from 'react-native'; -import WalletMigrate from './screen/wallets/walletMigrate'; -import { name as appName } from './app.json'; -import App from './App'; -import LottieView from 'lottie-react-native'; -import UnlockWith from './UnlockWith.js'; -/** @type {AppStorage} */ -const A = require('./analytics'); +import React from 'react'; +import { AppRegistry, StatusBar } from 'react-native'; +import SplashScreen from 'react-native-splash-screen'; + +import App from './App'; +import WalletMigrate from './walletMigrate'; if (!Error.captureStackTrace) { // captureStackTrace is only available when debugging @@ -18,64 +17,41 @@ if (!Error.captureStackTrace) { } class BlueAppComponent extends React.Component { - constructor(props) { - super(props); - this.state = { isMigratingData: true, onAnimationFinished: false, successfullyAuthenticated: false }; - } + state = { + isMigratingData: true, + }; componentDidMount() { const walletMigrate = new WalletMigrate(this.setIsMigratingData); + walletMigrate.start(); } setIsMigratingData = async () => { - A(A.ENUM.INIT); - this.setState({ isMigratingData: false }); - }; - - onAnimationFinish = () => { - if (this.state.isMigratingData) { - this.loadingSplash.play(0); - } else { - this.setState({ onAnimationFinished: true }); - } + SplashScreen.hide(); + this.setState({ + isMigratingData: false, + }); }; onSuccessfullyAuthenticated = () => { - this.setState({ successfullyAuthenticated: true }); + this.setState({ + successfullyAuthenticated: true, + }); }; render() { if (this.state.isMigratingData) { - return ( - (this.loadingSplash = ref)} - onAnimationFinish={this.onAnimationFinish} - source={require('./img/bluewalletsplash.json')} - autoPlay - loop={false} - /> - ); + return null; } else { - if (this.state.onAnimationFinished) { - return this.state.successfullyAuthenticated ? ( + return ( + <> + - ) : ( - - ); - } else { - return ( - (this.loadingSplash = ref)} - onAnimationFinish={this.onAnimationFinish} - source={require('./img/bluewalletsplash.json')} - autoPlay - loop={false} - /> - ); - } + + ); } } } -AppRegistry.registerComponent(appName, () => BlueAppComponent); +AppRegistry.registerComponent('VelesWallet', () => BlueAppComponent); diff --git a/ios/BlueWallet-tvOS/Info.plist b/ios/BlueWallet-tvOS/Info.plist deleted file mode 100644 index 2fb6a11c2c..0000000000 --- a/ios/BlueWallet-tvOS/Info.plist +++ /dev/null @@ -1,54 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - NSLocationWhenInUseUsageDescription - - NSAppTransportSecurity - - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - - diff --git a/ios/BlueWallet-tvOSTests/Info.plist b/ios/BlueWallet-tvOSTests/Info.plist deleted file mode 100644 index 886825ccc9..0000000000 --- a/ios/BlueWallet-tvOSTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj deleted file mode 100644 index 199d2f1f0c..0000000000 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1695 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 00E356F31AD99517003FC87E /* BlueWalletTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* BlueWalletTests.m */; }; - 036397B3AA70DD314F31661C /* libPods-BlueWalletWatch Extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 154B05BEF3C3512F67A08374 /* libPods-BlueWalletWatch Extension.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 267263A381F944A9AAB0FA0A /* libRNSentry-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F11DD40F6E9A4F13B3410B94 /* libRNSentry-tvOS.a */; }; - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; - 2DCD954D1E0B4F2C00145EB5 /* BlueWalletTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* BlueWalletTests.m */; }; - 3208E93922F63279007F5A27 /* AppCenter-Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3208E93822F63279007F5A27 /* AppCenter-Config.plist */; }; - 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; - 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F0A2992311DBB20095C559 /* ComplicationController.swift */; }; - 398DED6337DF58F0ECFD8F2E /* libPods-BlueWalletTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 70089FECE936F9A0AC45B7CE /* libPods-BlueWalletTests.a */; }; - 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; - 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; - 906451CAD44154C2950030EC /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 731973BA0AC6EA78962CE5B6 /* libPods-BlueWallet.a */; }; - B058E2132B704E9E874BDB29 /* libRNRandomBytes-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */; }; - B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E32225841EC00428FCC /* Interface.storyboard */; }; - B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; - B40D4E3D225841ED00428FCC /* BlueWalletWatch Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - B40D4E44225841ED00428FCC /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E43225841ED00428FCC /* ExtensionDelegate.swift */; }; - B40D4E46225841ED00428FCC /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E45225841ED00428FCC /* NotificationController.swift */; }; - B40D4E4D225841ED00428FCC /* BlueWalletWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; }; - B40D4E5D2258425500428FCC /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E552258425400428FCC /* InterfaceController.swift */; }; - B40D4E5E2258425500428FCC /* NumericKeypadInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E562258425400428FCC /* NumericKeypadInterfaceController.swift */; }; - B40D4E602258425500428FCC /* SpecifyInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E582258425400428FCC /* SpecifyInterfaceController.swift */; }; - B40D4E632258425500428FCC /* ReceiveInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E5B2258425500428FCC /* ReceiveInterfaceController.swift */; }; - B40D4E642258425500428FCC /* WalletDetailsInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E5C2258425500428FCC /* WalletDetailsInterfaceController.swift */; }; - B40D4E682258426B00428FCC /* KeychainSwiftDistrib.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E672258426B00428FCC /* KeychainSwiftDistrib.swift */; }; - B43D0378225847C500FBAA95 /* WalletGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0372225847C500FBAA95 /* WalletGradient.swift */; }; - B43D0379225847C500FBAA95 /* WatchDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0373225847C500FBAA95 /* WatchDataSource.swift */; }; - B43D037A225847C500FBAA95 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0374225847C500FBAA95 /* Transaction.swift */; }; - B43D037B225847C500FBAA95 /* TransactionTableRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0375225847C500FBAA95 /* TransactionTableRow.swift */; }; - B43D037C225847C500FBAA95 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0376225847C500FBAA95 /* Wallet.swift */; }; - B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0377225847C500FBAA95 /* WalletInformation.swift */; }; - B44D665E562B4F289F09D327 /* libRNSVG-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */; }; - B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; - CE21ACFC6EE18FE5B91A0212 /* libPods-BlueWalletWatch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BB0B98D8054B95DEE18B907F /* libPods-BlueWalletWatch.a */; }; - D6ED210441144516A0355B4A /* libRNVectorIcons-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */; }; - ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; - FBB34FB8F9B248A89346FE61 /* libRNDeviceInfo-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6EB3338E347F4AFAA8C85C04 /* libRNDeviceInfo-tvOS.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = BlueWallet; - }; - 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; - remoteInfo = "BlueWallet-tvOS"; - }; - B40D4E3E225841ED00428FCC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B40D4E3B225841ED00428FCC; - remoteInfo = "BlueWalletWatch Extension"; - }; - B40D4E4B225841ED00428FCC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B40D4E2F225841EC00428FCC; - remoteInfo = BlueWalletWatch; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - B40D4E2D225841C300428FCC /* Embed Watch Content */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; - dstSubfolderSpec = 16; - files = ( - B40D4E4D225841ED00428FCC /* BlueWalletWatch.app in Embed Watch Content */, - ); - name = "Embed Watch Content"; - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E51225841ED00428FCC /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - B40D4E3D225841ED00428FCC /* BlueWalletWatch Extension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* BlueWalletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BlueWalletTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* BlueWalletTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BlueWalletTests.m; sourceTree = ""; }; - 04466491BA2D4876A71222FC /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; - 088886638C6267895C91FFF1 /* Pods-BlueWalletWatch Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWalletWatch Extension.release.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWalletWatch Extension/Pods-BlueWalletWatch Extension.release.xcconfig"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = BlueWallet/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = BlueWallet/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = BlueWallet/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = BlueWallet/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = BlueWallet/main.m; sourceTree = ""; }; - 154B05BEF3C3512F67A08374 /* libPods-BlueWalletWatch Extension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWalletWatch Extension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativePermissions.a; sourceTree = ""; }; - 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNRandomBytes-tvOS.a"; sourceTree = ""; }; - 2654894D4DE44A4C8F71773D /* CoreData.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - 2D02E47B1E0B4A5D006451C7 /* BlueWallet-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "BlueWallet-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D02E4901E0B4A5D006451C7 /* BlueWallet-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BlueWallet-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 2FCC2CD6FF4448229D0CE0F3 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; - 3208E93822F63279007F5A27 /* AppCenter-Config.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AppCenter-Config.plist"; sourceTree = ""; }; - 32B5A3282334450100F8D608 /* BlueWallet-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BlueWallet-Bridging-Header.h"; sourceTree = ""; }; - 32B5A3292334450100F8D608 /* Bridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bridge.swift; sourceTree = ""; }; - 32F0A24F2310B0700095C559 /* BlueWalletWatch Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "BlueWalletWatch Extension.entitlements"; sourceTree = ""; }; - 32F0A2502310B0910095C559 /* BlueWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = BlueWallet.entitlements; path = BlueWallet/BlueWallet.entitlements; sourceTree = ""; }; - 32F0A2992311DBB20095C559 /* ComplicationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; - 334051161886419EA186F4BA /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; - 3703B10AAB374CF896CCC2EA /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; - 3F7F1B8332C6439793D55B45 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; - 44BC9E3EE0E9476A830CCCB9 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; - 47564776A7A3427DB36C087D /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = ""; }; - 47C436B1EF23484B8181DBEA /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; - 4D746BBE67E84684848246E2 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; - 4E1F367C901694701E7BAB77 /* Pods-BlueWalletWatch.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWalletWatch.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWalletWatch/Pods-BlueWalletWatch.debug.xcconfig"; sourceTree = ""; }; - 4F12F501B686459183E0BE0D /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; - 50C1C9332FCD3F4DB88A0BB0 /* Pods-BlueWalletWatch.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWalletWatch.release.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWalletWatch/Pods-BlueWalletWatch.release.xcconfig"; sourceTree = ""; }; - 5A8F67CF29564E41882ECEF8 /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Brands.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"; sourceTree = ""; }; - 6A65D81712444D37BA152B06 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = ""; }; - 6AB6574CC4ECAAA359683D0F /* Pods-BlueWalletTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWalletTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWalletTests/Pods-BlueWalletTests.release.xcconfig"; sourceTree = ""; }; - 6EB3338E347F4AFAA8C85C04 /* libRNDeviceInfo-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNDeviceInfo-tvOS.a"; sourceTree = ""; }; - 70089FECE936F9A0AC45B7CE /* libPods-BlueWalletTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWalletTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 70C9C17A3F52430B99582AF4 /* libRNCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCamera.a; sourceTree = ""; }; - 71F73CBD557D8D7D24C51906 /* Pods-BlueWalletWatch Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWalletWatch Extension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWalletWatch Extension/Pods-BlueWalletWatch Extension.debug.xcconfig"; sourceTree = ""; }; - 731973BA0AC6EA78962CE5B6 /* libPods-BlueWallet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWallet.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 78A87E7251D94144A71A2F67 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = ""; }; - 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; }; - 8448882949434D41A054C0B2 /* ToolTipMenuTests.xctest */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = ToolTipMenuTests.xctest; sourceTree = ""; }; - 8637D4B5E14D443A9031DA95 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = ""; }; - 90F86BC5194548CA87D729A9 /* libToolTipMenu.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libToolTipMenu.a; sourceTree = ""; }; - 94565BFC6A0C4235B3EC7B01 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; - 95208B2A05884A76B5BB99C0 /* libRCTGoogleAnalyticsBridge.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTGoogleAnalyticsBridge.a; sourceTree = ""; }; - 9B3A324B70BC8C6D9314FD4F /* Pods-BlueWallet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWallet/Pods-BlueWallet.debug.xcconfig"; sourceTree = ""; }; - 9DF4E6C040764E4BA1ACC1EB /* libTcpSockets.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libTcpSockets.a; sourceTree = ""; }; - 9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = ""; }; - A1B6AA2DE9A6E425682F4F3C /* Pods-BlueWalletTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWalletTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWalletTests/Pods-BlueWalletTests.debug.xcconfig"; sourceTree = ""; }; - A7C4B1FDAD264618BAF8C335 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = ""; }; - A9166D490AEF4938BD6621CF /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; }; - AB2325650CE04F018697ACFE /* libRNReactNativeHapticFeedback.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNReactNativeHapticFeedback.a; sourceTree = ""; }; - B40D4E30225841EC00428FCC /* BlueWalletWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWalletWatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; - B40D4E33225841EC00428FCC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; - B40D4E35225841ED00428FCC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - B40D4E37225841ED00428FCC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BlueWalletWatch Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - B40D4E43225841ED00428FCC /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; - B40D4E45225841ED00428FCC /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; - B40D4E49225841ED00428FCC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B40D4E4A225841ED00428FCC /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; - B40D4E552258425400428FCC /* InterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = ""; }; - B40D4E562258425400428FCC /* NumericKeypadInterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumericKeypadInterfaceController.swift; sourceTree = ""; }; - B40D4E582258425400428FCC /* SpecifyInterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpecifyInterfaceController.swift; sourceTree = ""; }; - B40D4E5B2258425500428FCC /* ReceiveInterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReceiveInterfaceController.swift; sourceTree = ""; }; - B40D4E5C2258425500428FCC /* WalletDetailsInterfaceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletDetailsInterfaceController.swift; sourceTree = ""; }; - B40D4E672258426B00428FCC /* KeychainSwiftDistrib.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeychainSwiftDistrib.swift; sourceTree = SOURCE_ROOT; }; - B43B69B8225C462E00925B1E /* libPods-RCTLinking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libPods-RCTLinking.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - B43B69BA225C46D800925B1E /* libRCTLinking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libRCTLinking.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B43D0372225847C500FBAA95 /* WalletGradient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletGradient.swift; sourceTree = ""; }; - B43D0373225847C500FBAA95 /* WatchDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchDataSource.swift; sourceTree = ""; }; - B43D0374225847C500FBAA95 /* Transaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Transaction.swift; sourceTree = ""; }; - B43D0375225847C500FBAA95 /* TransactionTableRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionTableRow.swift; sourceTree = ""; }; - B43D0376225847C500FBAA95 /* Wallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = ""; }; - B43D0377225847C500FBAA95 /* WalletInformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletInformation.swift; sourceTree = ""; }; - B43D046E22584C1B00FBAA95 /* libRNWatch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libRNWatch.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B459EE96941AE09BCB547DC0 /* Pods-BlueWallet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet.release.xcconfig"; path = "Pods/Target Support Files/Pods-BlueWallet/Pods-BlueWallet.release.xcconfig"; sourceTree = ""; }; - B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCSlider.a; sourceTree = ""; }; - B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTQRCodeLocalImage.a; sourceTree = ""; }; - B9D9B3A7B2CB4255876B67AF /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; - BB0B98D8054B95DEE18B907F /* libPods-BlueWalletWatch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWalletWatch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - BBA99996E6FA4B49ACE0BEFA /* libRNRate.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRate.a; sourceTree = ""; }; - C4496FB303574862B40A878A /* AntDesign.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = AntDesign.ttf; path = "../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf"; sourceTree = ""; }; - CA741BA794714D3F80251AC9 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; - CD746B955C55410793BB72C0 /* libRNGestureHandler.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNGestureHandler.a; sourceTree = ""; }; - CF4A4D7AAD974D67A2D62B3E /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; - D6EC5B694E664FD7B02EDD2F /* libRNSentry.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSentry.a; sourceTree = ""; }; - E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = ""; }; - E8E8CE89B3D142C6A8A56C34 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - F11DD40F6E9A4F13B3410B94 /* libRNSentry-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSentry-tvOS.a"; sourceTree = ""; }; - F6F53AFC25FB422485CB22D6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - FC63C7054F1C4FDFB7A830E5 /* libRCTPrivacySnapshot.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTPrivacySnapshot.a; sourceTree = ""; }; - FC98DC24A81A463AB8B2E6B1 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = ""; }; - FD7977067E1A496F94D8B1B7 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 398DED6337DF58F0ECFD8F2E /* libPods-BlueWalletTests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 906451CAD44154C2950030EC /* libPods-BlueWallet.a in Frameworks */, - 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */, - 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, - 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */, - FBB34FB8F9B248A89346FE61 /* libRNDeviceInfo-tvOS.a in Frameworks */, - B058E2132B704E9E874BDB29 /* libRNRandomBytes-tvOS.a in Frameworks */, - 267263A381F944A9AAB0FA0A /* libRNSentry-tvOS.a in Frameworks */, - D6ED210441144516A0355B4A /* libRNVectorIcons-tvOS.a in Frameworks */, - B44D665E562B4F289F09D327 /* libRNSVG-tvOS.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 421830728822A20A50D8A07C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CE21ACFC6EE18FE5B91A0212 /* libPods-BlueWalletWatch.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E39225841ED00428FCC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 036397B3AA70DD314F31661C /* libPods-BlueWalletWatch Extension.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* BlueWalletTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* BlueWalletTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = BlueWalletTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* BlueWallet */ = { - isa = PBXGroup; - children = ( - 32F0A2502310B0910095C559 /* BlueWallet.entitlements */, - 3208E93822F63279007F5A27 /* AppCenter-Config.plist */, - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 13B07FB71A68108700A75B9A /* main.m */, - 32B5A3292334450100F8D608 /* Bridge.swift */, - 32B5A3282334450100F8D608 /* BlueWallet-Bridging-Header.h */, - ); - name = BlueWallet; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - B43B69BA225C46D800925B1E /* libRCTLinking.a */, - B43B69B8225C462E00925B1E /* libPods-RCTLinking.a */, - B43D046E22584C1B00FBAA95 /* libRNWatch.a */, - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 2D16E6891FA4F8E400B85C8A /* libReact.a */, - 2654894D4DE44A4C8F71773D /* CoreData.framework */, - F6F53AFC25FB422485CB22D6 /* SystemConfiguration.framework */, - B9D9B3A7B2CB4255876B67AF /* libz.tbd */, - 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */, - BB0B98D8054B95DEE18B907F /* libPods-BlueWalletWatch.a */, - 154B05BEF3C3512F67A08374 /* libPods-BlueWalletWatch Extension.a */, - 70089FECE936F9A0AC45B7CE /* libPods-BlueWalletTests.a */, - 731973BA0AC6EA78962CE5B6 /* libPods-BlueWallet.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4B0CACE36C3348E1BCEA92C8 /* Resources */ = { - isa = PBXGroup; - children = ( - C4496FB303574862B40A878A /* AntDesign.ttf */, - 44BC9E3EE0E9476A830CCCB9 /* Entypo.ttf */, - 3F7F1B8332C6439793D55B45 /* EvilIcons.ttf */, - A9166D490AEF4938BD6621CF /* Feather.ttf */, - 334051161886419EA186F4BA /* FontAwesome.ttf */, - 5A8F67CF29564E41882ECEF8 /* FontAwesome5_Brands.ttf */, - 47564776A7A3427DB36C087D /* FontAwesome5_Regular.ttf */, - 78A87E7251D94144A71A2F67 /* FontAwesome5_Solid.ttf */, - 04466491BA2D4876A71222FC /* Foundation.ttf */, - CA741BA794714D3F80251AC9 /* Ionicons.ttf */, - 2FCC2CD6FF4448229D0CE0F3 /* MaterialCommunityIcons.ttf */, - CF4A4D7AAD974D67A2D62B3E /* MaterialIcons.ttf */, - E8E8CE89B3D142C6A8A56C34 /* Octicons.ttf */, - 4D746BBE67E84684848246E2 /* SimpleLineIcons.ttf */, - 47C436B1EF23484B8181DBEA /* Zocial.ttf */, - ); - name = Resources; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* BlueWallet */, - 00E356EF1AD99517003FC87E /* BlueWalletTests */, - B40D4E31225841EC00428FCC /* BlueWalletWatch */, - B40D4E40225841ED00428FCC /* BlueWalletWatch Extension */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - B40FE50A21FAD228005D5578 /* Recovered References */, - 4B0CACE36C3348E1BCEA92C8 /* Resources */, - A9B365F08E5E8EADC056DBC4 /* Pods */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* BlueWallet.app */, - 00E356EE1AD99517003FC87E /* BlueWalletTests.xctest */, - 2D02E47B1E0B4A5D006451C7 /* BlueWallet-tvOS.app */, - 2D02E4901E0B4A5D006451C7 /* BlueWallet-tvOSTests.xctest */, - B40D4E30225841EC00428FCC /* BlueWalletWatch.app */, - B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */, - ); - name = Products; - sourceTree = ""; - }; - A9B365F08E5E8EADC056DBC4 /* Pods */ = { - isa = PBXGroup; - children = ( - 9B3A324B70BC8C6D9314FD4F /* Pods-BlueWallet.debug.xcconfig */, - B459EE96941AE09BCB547DC0 /* Pods-BlueWallet.release.xcconfig */, - A1B6AA2DE9A6E425682F4F3C /* Pods-BlueWalletTests.debug.xcconfig */, - 6AB6574CC4ECAAA359683D0F /* Pods-BlueWalletTests.release.xcconfig */, - 4E1F367C901694701E7BAB77 /* Pods-BlueWalletWatch.debug.xcconfig */, - 50C1C9332FCD3F4DB88A0BB0 /* Pods-BlueWalletWatch.release.xcconfig */, - 71F73CBD557D8D7D24C51906 /* Pods-BlueWalletWatch Extension.debug.xcconfig */, - 088886638C6267895C91FFF1 /* Pods-BlueWalletWatch Extension.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - B40D4E31225841EC00428FCC /* BlueWalletWatch */ = { - isa = PBXGroup; - children = ( - B40D4E32225841EC00428FCC /* Interface.storyboard */, - B40D4E35225841ED00428FCC /* Assets.xcassets */, - B40D4E37225841ED00428FCC /* Info.plist */, - ); - path = BlueWalletWatch; - sourceTree = ""; - }; - B40D4E40225841ED00428FCC /* BlueWalletWatch Extension */ = { - isa = PBXGroup; - children = ( - 32F0A24F2310B0700095C559 /* BlueWalletWatch Extension.entitlements */, - B43D03242258474500FBAA95 /* Objects */, - B40D4E672258426B00428FCC /* KeychainSwiftDistrib.swift */, - 32F0A2992311DBB20095C559 /* ComplicationController.swift */, - B40D4E43225841ED00428FCC /* ExtensionDelegate.swift */, - B40D4E45225841ED00428FCC /* NotificationController.swift */, - B40D4E552258425400428FCC /* InterfaceController.swift */, - B40D4E562258425400428FCC /* NumericKeypadInterfaceController.swift */, - B40D4E5B2258425500428FCC /* ReceiveInterfaceController.swift */, - B40D4E582258425400428FCC /* SpecifyInterfaceController.swift */, - B40D4E5C2258425500428FCC /* WalletDetailsInterfaceController.swift */, - B40D4E49225841ED00428FCC /* Info.plist */, - B40D4E4A225841ED00428FCC /* PushNotificationPayload.apns */, - ); - path = "BlueWalletWatch Extension"; - sourceTree = ""; - }; - B40FE50A21FAD228005D5578 /* Recovered References */ = { - isa = PBXGroup; - children = ( - 70C9C17A3F52430B99582AF4 /* libRNCamera.a */, - FD7977067E1A496F94D8B1B7 /* libRNDeviceInfo.a */, - 8637D4B5E14D443A9031DA95 /* libRNFS.a */, - CD746B955C55410793BB72C0 /* libRNGestureHandler.a */, - 95208B2A05884A76B5BB99C0 /* libRCTGoogleAnalyticsBridge.a */, - AB2325650CE04F018697ACFE /* libRNReactNativeHapticFeedback.a */, - 3703B10AAB374CF896CCC2EA /* libBVLinearGradient.a */, - 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */, - 6A65D81712444D37BA152B06 /* libRNRandomBytes.a */, - BBA99996E6FA4B49ACE0BEFA /* libRNRate.a */, - D6EC5B694E664FD7B02EDD2F /* libRNSentry.a */, - 6EB3338E347F4AFAA8C85C04 /* libRNDeviceInfo-tvOS.a */, - 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */, - F11DD40F6E9A4F13B3410B94 /* libRNSentry-tvOS.a */, - 4F12F501B686459183E0BE0D /* libRNVectorIcons.a */, - E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */, - 94565BFC6A0C4235B3EC7B01 /* libRNSVG.a */, - 9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */, - A7C4B1FDAD264618BAF8C335 /* libRNCWebView.a */, - FC98DC24A81A463AB8B2E6B1 /* libRNImagePicker.a */, - B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */, - 9DF4E6C040764E4BA1ACC1EB /* libTcpSockets.a */, - 90F86BC5194548CA87D729A9 /* libToolTipMenu.a */, - 8448882949434D41A054C0B2 /* ToolTipMenuTests.xctest */, - FC63C7054F1C4FDFB7A830E5 /* libRCTPrivacySnapshot.a */, - B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */, - ); - name = "Recovered References"; - sourceTree = ""; - }; - B43D03242258474500FBAA95 /* Objects */ = { - isa = PBXGroup; - children = ( - B43D0374225847C500FBAA95 /* Transaction.swift */, - B43D0375225847C500FBAA95 /* TransactionTableRow.swift */, - B43D0376225847C500FBAA95 /* Wallet.swift */, - B43D0372225847C500FBAA95 /* WalletGradient.swift */, - B43D0377225847C500FBAA95 /* WalletInformation.swift */, - B43D0373225847C500FBAA95 /* WatchDataSource.swift */, - ); - path = Objects; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* BlueWalletTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "BlueWalletTests" */; - buildPhases = ( - 0E6D0FA885BDBE9988699506 /* [CP] Check Pods Manifest.lock */, - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = BlueWalletTests; - productName = BlueWalletTests; - productReference = 00E356EE1AD99517003FC87E /* BlueWalletTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* BlueWallet */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BlueWallet" */; - buildPhases = ( - 6F7747C31A9EE6DDC5108476 /* [CP] Check Pods Manifest.lock */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - B40D4E2D225841C300428FCC /* Embed Watch Content */, - 791C03B6EF06B63A39F55115 /* [CP] Copy Pods Resources */, - 2130DE983D1D45AC8FC45F7E /* Upload Debug Symbols to Sentry */, - ); - buildRules = ( - ); - dependencies = ( - B40D4E4C225841ED00428FCC /* PBXTargetDependency */, - ); - name = BlueWallet; - productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* BlueWallet.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E47A1E0B4A5D006451C7 /* BlueWallet-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "BlueWallet-tvOS" */; - buildPhases = ( - 2D02E4771E0B4A5D006451C7 /* Sources */, - 2D02E4781E0B4A5D006451C7 /* Frameworks */, - 2D02E4791E0B4A5D006451C7 /* Resources */, - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BlueWallet-tvOS"; - productName = "BlueWallet-tvOS"; - productReference = 2D02E47B1E0B4A5D006451C7 /* BlueWallet-tvOS.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E48F1E0B4A5D006451C7 /* BlueWallet-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "BlueWallet-tvOSTests" */; - buildPhases = ( - 2D02E48C1E0B4A5D006451C7 /* Sources */, - 2D02E48D1E0B4A5D006451C7 /* Frameworks */, - 2D02E48E1E0B4A5D006451C7 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, - ); - name = "BlueWallet-tvOSTests"; - productName = "BlueWallet-tvOSTests"; - productReference = 2D02E4901E0B4A5D006451C7 /* BlueWallet-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - B40D4E2F225841EC00428FCC /* BlueWalletWatch */ = { - isa = PBXNativeTarget; - buildConfigurationList = B40D4E52225841ED00428FCC /* Build configuration list for PBXNativeTarget "BlueWalletWatch" */; - buildPhases = ( - 310D9B5C1860199135C315EC /* [CP] Check Pods Manifest.lock */, - B40D4E2E225841EC00428FCC /* Resources */, - B40D4E51225841ED00428FCC /* Embed App Extensions */, - 421830728822A20A50D8A07C /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - B40D4E3F225841ED00428FCC /* PBXTargetDependency */, - ); - name = BlueWalletWatch; - productName = BlueWalletWatch; - productReference = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; - productType = "com.apple.product-type.application.watchapp2"; - }; - B40D4E3B225841ED00428FCC /* BlueWalletWatch Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = B40D4E4E225841ED00428FCC /* Build configuration list for PBXNativeTarget "BlueWalletWatch Extension" */; - buildPhases = ( - 910F5F6DC7F7ADF3C6EE8653 /* [CP] Check Pods Manifest.lock */, - B40D4E38225841ED00428FCC /* Sources */, - B40D4E39225841ED00428FCC /* Frameworks */, - B40D4E3A225841ED00428FCC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "BlueWalletWatch Extension"; - productName = "BlueWalletWatch Extension"; - productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; - productType = "com.apple.product-type.watchkit2-extension"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - DevelopmentTeam = A7W54YZ4WU; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 13B07F861A680F5B00A75B9A = { - DevelopmentTeam = A7W54YZ4WU; - LastSwiftMigration = 1030; - ProvisioningStyle = Manual; - SystemCapabilities = { - com.apple.Keychain = { - enabled = 0; - }; - }; - }; - 2D02E47A1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = A7W54YZ4WU; - ProvisioningStyle = Automatic; - }; - 2D02E48F1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = A7W54YZ4WU; - ProvisioningStyle = Automatic; - TestTargetID = 2D02E47A1E0B4A5D006451C7; - }; - B40D4E2F225841EC00428FCC = { - CreatedOnToolsVersion = 10.2; - DevelopmentTeam = A7W54YZ4WU; - ProvisioningStyle = Manual; - }; - B40D4E3B225841ED00428FCC = { - CreatedOnToolsVersion = 10.2; - DevelopmentTeam = A7W54YZ4WU; - ProvisioningStyle = Manual; - SystemCapabilities = { - com.apple.Keychain = { - enabled = 0; - }; - }; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BlueWallet" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - English, - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* BlueWallet */, - 00E356ED1AD99517003FC87E /* BlueWalletTests */, - 2D02E47A1E0B4A5D006451C7 /* BlueWallet-tvOS */, - 2D02E48F1E0B4A5D006451C7 /* BlueWallet-tvOSTests */, - B40D4E2F225841EC00428FCC /* BlueWalletWatch */, - B40D4E3B225841ED00428FCC /* BlueWalletWatch Extension */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - 3208E93922F63279007F5A27 /* AppCenter-Config.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4791E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48E1E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E2E225841EC00428FCC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */, - B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E3A225841ED00428FCC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B4EE583C226703320003363C /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport NODE_BINARY=node\n../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ../node_modules/react-native/scripts/react-native-xcode.sh\n"; - }; - 0E6D0FA885BDBE9988699506 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-BlueWalletTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 2130DE983D1D45AC8FC45F7E /* Upload Debug Symbols to Sentry */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Upload Debug Symbols to Sentry"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym"; - }; - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native Code And Images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport NODE_BINARY=node\n../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ../node_modules/react-native/scripts/react-native-xcode.sh"; - }; - 310D9B5C1860199135C315EC /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-BlueWalletWatch-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 6F7747C31A9EE6DDC5108476 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-BlueWallet-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 791C03B6EF06B63A39F55115 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources.sh", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 910F5F6DC7F7ADF3C6EE8653 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-BlueWalletWatch Extension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* BlueWalletTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4771E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48C1E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2DCD954D1E0B4F2C00145EB5 /* BlueWalletTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E38225841ED00428FCC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B43D037C225847C500FBAA95 /* Wallet.swift in Sources */, - B43D037A225847C500FBAA95 /* Transaction.swift in Sources */, - 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */, - B40D4E602258425500428FCC /* SpecifyInterfaceController.swift in Sources */, - B43D0379225847C500FBAA95 /* WatchDataSource.swift in Sources */, - B40D4E46225841ED00428FCC /* NotificationController.swift in Sources */, - B40D4E5D2258425500428FCC /* InterfaceController.swift in Sources */, - B43D037B225847C500FBAA95 /* TransactionTableRow.swift in Sources */, - B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */, - B40D4E642258425500428FCC /* WalletDetailsInterfaceController.swift in Sources */, - B40D4E44225841ED00428FCC /* ExtensionDelegate.swift in Sources */, - B40D4E682258426B00428FCC /* KeychainSwiftDistrib.swift in Sources */, - B40D4E632258425500428FCC /* ReceiveInterfaceController.swift in Sources */, - B43D0378225847C500FBAA95 /* WalletGradient.swift in Sources */, - B40D4E5E2258425500428FCC /* NumericKeypadInterfaceController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* BlueWallet */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 2D02E47A1E0B4A5D006451C7 /* BlueWallet-tvOS */; - targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; - }; - B40D4E3F225841ED00428FCC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = B40D4E3B225841ED00428FCC /* BlueWalletWatch Extension */; - targetProxy = B40D4E3E225841ED00428FCC /* PBXContainerItemProxy */; - }; - B40D4E4C225841ED00428FCC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = B40D4E2F225841EC00428FCC /* BlueWalletWatch */; - targetProxy = B40D4E4B225841ED00428FCC /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = BlueWallet; - sourceTree = ""; - }; - B40D4E32225841EC00428FCC /* Interface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - B40D4E33225841EC00428FCC /* Base */, - ); - name = Interface.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A1B6AA2DE9A6E425682F4F3C /* Pods-BlueWalletTests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", - "$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", - "$(SRCROOT)/../node_modules/react-native-fs/**", - "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", - "$(SRCROOT)/../node_modules/react-native-google-analytics-bridge/ios/RCTGoogleAnalyticsBridge/**", - "$(SRCROOT)/../node_modules/react-native-haptic-feedback/ios", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", - "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", - "$(SRCROOT)/../node_modules/react-native-randombytes", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-sentry/ios/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-webview/ios", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", - "$(SRCROOT)/../node_modules/@remobile/react-native-qrcode-local-image/ios/RCTQRCodeLocalImage", - "$(SRCROOT)/../node_modules/react-native-tcp/ios/**", - "$(SRCROOT)/../node_modules/react-native-tooltip/ToolTipMenu", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - "$(SRCROOT)/../node_modules/@react-native-community/slider/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - ); - INFOPLIST_FILE = BlueWalletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BlueWallet.app/BlueWallet"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6AB6574CC4ECAAA359683D0F /* Pods-BlueWalletTests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = A7W54YZ4WU; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", - "$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", - "$(SRCROOT)/../node_modules/react-native-fs/**", - "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", - "$(SRCROOT)/../node_modules/react-native-google-analytics-bridge/ios/RCTGoogleAnalyticsBridge/**", - "$(SRCROOT)/../node_modules/react-native-haptic-feedback/ios", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", - "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", - "$(SRCROOT)/../node_modules/react-native-randombytes", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-sentry/ios/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-webview/ios", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", - "$(SRCROOT)/../node_modules/@remobile/react-native-qrcode-local-image/ios/RCTQRCodeLocalImage", - "$(SRCROOT)/../node_modules/react-native-tcp/ios/**", - "$(SRCROOT)/../node_modules/react-native-tooltip/ToolTipMenu", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - "$(SRCROOT)/../node_modules/@react-native-community/slider/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - ); - INFOPLIST_FILE = BlueWalletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BlueWallet.app/BlueWallet"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9B3A324B70BC8C6D9314FD4F /* Pods-BlueWallet.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = NO; - DEVELOPMENT_TEAM = A7W54YZ4WU; - HEADER_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = BlueWallet/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet; - PRODUCT_NAME = BlueWallet; - PROVISIONING_PROFILE_SPECIFIER = "io.bluewallet.bluewallet AppStore"; - SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B459EE96941AE09BCB547DC0 /* Pods-BlueWallet.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - HEADER_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = BlueWallet/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet; - PRODUCT_NAME = BlueWallet; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 2D02E4971E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", - "$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", - "$(SRCROOT)/../node_modules/react-native-fs/**", - "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", - "$(SRCROOT)/../node_modules/react-native-google-analytics-bridge/ios/RCTGoogleAnalyticsBridge/**", - "$(SRCROOT)/../node_modules/react-native-haptic-feedback/ios", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", - "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", - "$(SRCROOT)/../node_modules/react-native-randombytes", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-sentry/ios/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-webview/ios", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", - "$(SRCROOT)/../node_modules/@remobile/react-native-qrcode-local-image/ios/RCTQRCodeLocalImage", - "$(SRCROOT)/../node_modules/react-native-tcp/ios/**", - "$(SRCROOT)/../node_modules/react-native-tooltip/ToolTipMenu", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - "$(SRCROOT)/../node_modules/@react-native-community/slider/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - ); - INFOPLIST_FILE = "BlueWallet-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.BlueWallet-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Debug; - }; - 2D02E4981E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_NO_COMMON_BLOCKS = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", - "$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", - "$(SRCROOT)/../node_modules/react-native-fs/**", - "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", - "$(SRCROOT)/../node_modules/react-native-google-analytics-bridge/ios/RCTGoogleAnalyticsBridge/**", - "$(SRCROOT)/../node_modules/react-native-haptic-feedback/ios", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", - "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", - "$(SRCROOT)/../node_modules/react-native-randombytes", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-sentry/ios/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-webview/ios", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", - "$(SRCROOT)/../node_modules/@remobile/react-native-qrcode-local-image/ios/RCTQRCodeLocalImage", - "$(SRCROOT)/../node_modules/react-native-tcp/ios/**", - "$(SRCROOT)/../node_modules/react-native-tooltip/ToolTipMenu", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - "$(SRCROOT)/../node_modules/@react-native-community/slider/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - ); - INFOPLIST_FILE = "BlueWallet-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.BlueWallet-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Release; - }; - 2D02E4991E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", - "$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", - "$(SRCROOT)/../node_modules/react-native-fs/**", - "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", - "$(SRCROOT)/../node_modules/react-native-google-analytics-bridge/ios/RCTGoogleAnalyticsBridge/**", - "$(SRCROOT)/../node_modules/react-native-haptic-feedback/ios", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", - "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", - "$(SRCROOT)/../node_modules/react-native-randombytes", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-sentry/ios/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-webview/ios", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", - "$(SRCROOT)/../node_modules/@remobile/react-native-qrcode-local-image/ios/RCTQRCodeLocalImage", - "$(SRCROOT)/../node_modules/react-native-tcp/ios/**", - "$(SRCROOT)/../node_modules/react-native-tooltip/ToolTipMenu", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - "$(SRCROOT)/../node_modules/@react-native-community/slider/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - ); - INFOPLIST_FILE = "BlueWallet-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.BlueWallet-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BlueWallet-tvOS.app/BlueWallet-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Debug; - }; - 2D02E49A1E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_NO_COMMON_BLOCKS = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", - "$(SRCROOT)/../node_modules/react-native-device-info/ios/RNDeviceInfo", - "$(SRCROOT)/../node_modules/react-native-fs/**", - "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", - "$(SRCROOT)/../node_modules/react-native-google-analytics-bridge/ios/RCTGoogleAnalyticsBridge/**", - "$(SRCROOT)/../node_modules/react-native-haptic-feedback/ios", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient", - "$(SRCROOT)/../node_modules/react-native-permissions/ios/**", - "$(SRCROOT)/../node_modules/react-native-randombytes", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-sentry/ios/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-webview/ios", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", - "$(SRCROOT)/../node_modules/@remobile/react-native-qrcode-local-image/ios/RCTQRCodeLocalImage", - "$(SRCROOT)/../node_modules/react-native-tcp/ios/**", - "$(SRCROOT)/../node_modules/react-native-tooltip/ToolTipMenu", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - "$(SRCROOT)/../node_modules/@react-native-community/slider/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-rate/ios", - "$(SRCROOT)/../node_modules/react-native-privacy-snapshot/RCTPrivacySnapshot", - ); - INFOPLIST_FILE = "BlueWallet-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.BlueWallet-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BlueWallet-tvOS.app/BlueWallet-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_VERSION = 5.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - B40D4E4F225841ED00428FCC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 71F73CBD557D8D7D24C51906 /* Pods-BlueWalletWatch Extension.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "BlueWalletWatch Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; - PRODUCT_NAME = "${TARGET_NAME}"; - PROVISIONING_PROFILE_SPECIFIER = "BlueWallet for Apple Watch Extension Dist"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 5.0; - }; - name = Debug; - }; - B40D4E50225841ED00428FCC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 088886638C6267895C91FFF1 /* Pods-BlueWalletWatch Extension.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "BlueWalletWatch Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; - PRODUCT_NAME = "${TARGET_NAME}"; - PROVISIONING_PROFILE_SPECIFIER = "BlueWallet for Apple Watch Extension Dist"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 5.0; - }; - name = Release; - }; - B40D4E53225841ED00428FCC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4E1F367C901694701E7BAB77 /* Pods-BlueWalletWatch.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - IBSC_MODULE = BlueWalletWatch_Extension; - INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "BlueWallet for Apple Watch Distribution"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 5.0; - }; - name = Debug; - }; - B40D4E54225841ED00428FCC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 50C1C9332FCD3F4DB88A0BB0 /* Pods-BlueWalletWatch.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - IBSC_MODULE = BlueWalletWatch_Extension; - INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "BlueWallet for Apple Watch Distribution"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 5.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "BlueWalletTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BlueWallet" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "BlueWallet-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4971E0B4A5E006451C7 /* Debug */, - 2D02E4981E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "BlueWallet-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4991E0B4A5E006451C7 /* Debug */, - 2D02E49A1E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BlueWallet" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B40D4E4E225841ED00428FCC /* Build configuration list for PBXNativeTarget "BlueWalletWatch Extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B40D4E4F225841ED00428FCC /* Debug */, - B40D4E50225841ED00428FCC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B40D4E52225841ED00428FCC /* Build configuration list for PBXNativeTarget "BlueWalletWatch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B40D4E53225841ED00428FCC /* Debug */, - B40D4E54225841ED00428FCC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/ios/BlueWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/BlueWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a625..0000000000 --- a/ios/BlueWallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios/BlueWallet.xcodeproj/project.xcworkspace/xcuserdata/marcosrodriguez.xcuserdatad/IDEFindNavigatorScopes.plist b/ios/BlueWallet.xcodeproj/project.xcworkspace/xcuserdata/marcosrodriguez.xcuserdatad/IDEFindNavigatorScopes.plist deleted file mode 100644 index 5dd5da85fd..0000000000 --- a/ios/BlueWallet.xcodeproj/project.xcworkspace/xcuserdata/marcosrodriguez.xcuserdatad/IDEFindNavigatorScopes.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet-tvOS.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet-tvOS.xcscheme deleted file mode 100644 index 147e3b955e..0000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet-tvOS.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme deleted file mode 100644 index 916f6d7f95..0000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme deleted file mode 100644 index a3d81b8815..0000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcuserdata/marcosrodriguez.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/BlueWallet.xcodeproj/xcuserdata/marcosrodriguez.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 532d534410..0000000000 --- a/ios/BlueWallet.xcodeproj/xcuserdata/marcosrodriguez.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,62 +0,0 @@ - - - - - SchemeUserState - - BlueWallet for Apple Watch (Notification).xcscheme_^#shared#^_ - - orderHint - 78 - - BlueWallet for Apple Watch.xcscheme_^#shared#^_ - - orderHint - 71 - - BlueWallet-tvOS.xcscheme_^#shared#^_ - - orderHint - 0 - - BlueWallet.xcscheme_^#shared#^_ - - orderHint - 1 - - BlueWalletWatch (Glance).xcscheme_^#shared#^_ - - orderHint - 14 - - BlueWalletWatch (Notification).xcscheme_^#shared#^_ - - orderHint - 3 - - BlueWalletWatch.xcscheme_^#shared#^_ - - orderHint - 2 - - - SuppressBuildableAutocreation - - 00E356ED1AD99517003FC87E - - primary - - - 13B07F861A680F5B00A75B9A - - primary - - - B40D4E2F225841EC00428FCC - - primary - - - - - diff --git a/ios/BlueWallet.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/BlueWallet.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/ios/BlueWallet.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 6cbb23bb8d..0000000000 --- a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-40.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-60.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-58.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-87.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-80.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-121.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-120.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-180.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-20.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-41.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-29.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-59.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-42.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-81.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-152.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-167.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-1024.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-1024.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-1024.png deleted file mode 100644 index e3a3d2bd11..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-1024.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-120.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-120.png deleted file mode 100644 index aef6cad889..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-120.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-121.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-121.png deleted file mode 100644 index aef6cad889..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-121.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-152.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-152.png deleted file mode 100644 index 6f8bb452d6..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-152.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-167.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-167.png deleted file mode 100644 index 1a2c3e5ae1..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-167.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-180.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-180.png deleted file mode 100644 index 7ccf645442..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-180.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-20.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-20.png deleted file mode 100644 index 85df10b62f..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-20.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-29.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-29.png deleted file mode 100644 index c88bc13fed..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-29.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-40.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-40.png deleted file mode 100644 index e863025da1..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-40.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-41.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-41.png deleted file mode 100644 index e863025da1..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-41.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-42.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-42.png deleted file mode 100644 index e863025da1..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-42.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-58.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-58.png deleted file mode 100644 index 7632b4b301..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-58.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-59.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-59.png deleted file mode 100644 index 7632b4b301..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-59.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-60.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-60.png deleted file mode 100644 index b86ef89c2a..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-60.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-76.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-76.png deleted file mode 100644 index 95cefa40ff..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-76.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-80.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-80.png deleted file mode 100644 index 37c8faf7d6..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-80.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-81.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-81.png deleted file mode 100644 index 37c8faf7d6..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-81.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-87.png b/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-87.png deleted file mode 100644 index ae8a02142d..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/AppIcon.appiconset/Icon-87.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/icon.imageset/Contents.json b/ios/BlueWallet/Images.xcassets/icon.imageset/Contents.json deleted file mode 100644 index 3c81c9f86f..0000000000 --- a/ios/BlueWallet/Images.xcassets/icon.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "icon.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "icon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "icon@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWallet/Images.xcassets/icon.imageset/icon.png b/ios/BlueWallet/Images.xcassets/icon.imageset/icon.png deleted file mode 100644 index 2386be35b5..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/icon.imageset/icon.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/icon.imageset/icon@2x.png b/ios/BlueWallet/Images.xcassets/icon.imageset/icon@2x.png deleted file mode 100644 index d734de25ec..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/icon.imageset/icon@2x.png and /dev/null differ diff --git a/ios/BlueWallet/Images.xcassets/icon.imageset/icon@3x.png b/ios/BlueWallet/Images.xcassets/icon.imageset/icon@3x.png deleted file mode 100644 index 10fba23c79..0000000000 Binary files a/ios/BlueWallet/Images.xcassets/icon.imageset/icon@3x.png and /dev/null differ diff --git a/ios/BlueWalletTests/BlueWalletTests.m b/ios/BlueWalletTests/BlueWalletTests.m deleted file mode 100644 index d7ee43a8d7..0000000000 --- a/ios/BlueWalletTests/BlueWalletTests.m +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" - -@interface BlueWalletTests : XCTestCase - -@end - -@implementation BlueWalletTests - -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test -{ - if (test(view)) { - return YES; - } - for (UIView *subview in [view subviews]) { - if ([self findSubviewInView:subview matching:test]) { - return YES; - } - } - return NO; -} - -- (void)testRendersWelcomeScreen -{ - UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; - RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - - RCTSetLogFunction(RCTDefaultLogFunction); - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - - -@end diff --git a/ios/BlueWalletTests/Info.plist b/ios/BlueWalletTests/Info.plist deleted file mode 100644 index ba72822e87..0000000000 --- a/ios/BlueWalletTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ios/BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements b/ios/BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements deleted file mode 100644 index 0c67376eba..0000000000 --- a/ios/BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ios/BlueWalletWatch Extension/ComplicationController.swift b/ios/BlueWalletWatch Extension/ComplicationController.swift deleted file mode 100644 index b697706dc7..0000000000 --- a/ios/BlueWalletWatch Extension/ComplicationController.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// ComplicationController.swift -// T WatchKit Extension -// -// Created by Marcos Rodriguez on 8/24/19. -// Copyright © 2019 Marcos Rodriguez. All rights reserved. -// - -import ClockKit - - -class ComplicationController: NSObject, CLKComplicationDataSource { - - // MARK: - Timeline Configuration - - func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) { - handler([.forward, .backward]) - } - - func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { - handler(nil) - } - - func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { - handler(nil) - } - - func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) { - handler(.showOnLockScreen) - } - - // MARK: - Timeline Population - - func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { - // Call the handler with the current timeline entry - handler(nil) - } - - func getTimelineEntries(for complication: CLKComplication, before date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { - // Call the handler with the timeline entries prior to the given date - handler(nil) - } - - func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { - // Call the handler with the timeline entries after to the given date - handler(nil) - } - - // MARK: - Placeholder Templates - - func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { - // This method will be called once per supported complication, and the results will be cached - handler(nil) - } - -} diff --git a/ios/BlueWalletWatch Extension/ExtensionDelegate.swift b/ios/BlueWalletWatch Extension/ExtensionDelegate.swift deleted file mode 100644 index ae69644aac..0000000000 --- a/ios/BlueWalletWatch Extension/ExtensionDelegate.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// ExtensionDelegate.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/6/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit - -class ExtensionDelegate: NSObject, WKExtensionDelegate { - - func applicationDidFinishLaunching() { - // Perform any final initialization of your application. - } - - func applicationDidBecomeActive() { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillResignActive() { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, etc. - } - - func handle(_ backgroundTasks: Set) { - // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one. - for task in backgroundTasks { - // Use a switch statement to check the task type - switch task { - case let backgroundTask as WKApplicationRefreshBackgroundTask: - // Be sure to complete the background task once you’re done. - backgroundTask.setTaskCompletedWithSnapshot(false) - case let snapshotTask as WKSnapshotRefreshBackgroundTask: - // Snapshot tasks have a unique completion call, make sure to set your expiration date - snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil) - case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask: - // Be sure to complete the connectivity task once you’re done. - connectivityTask.setTaskCompletedWithSnapshot(false) - case let urlSessionTask as WKURLSessionRefreshBackgroundTask: - // Be sure to complete the URL session task once you’re done. - urlSessionTask.setTaskCompletedWithSnapshot(false) - case let relevantShortcutTask as WKRelevantShortcutRefreshBackgroundTask: - // Be sure to complete the relevant-shortcut task once you're done. - relevantShortcutTask.setTaskCompletedWithSnapshot(false) - case let intentDidRunTask as WKIntentDidRunRefreshBackgroundTask: - // Be sure to complete the intent-did-run task once you're done. - intentDidRunTask.setTaskCompletedWithSnapshot(false) - default: - // make sure to complete unhandled task types - task.setTaskCompletedWithSnapshot(false) - } - } - } - -} diff --git a/ios/BlueWalletWatch Extension/Info.plist b/ios/BlueWalletWatch Extension/Info.plist deleted file mode 100644 index a40df35678..0000000000 --- a/ios/BlueWalletWatch Extension/Info.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - BlueWalletWatch Extension - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - XPC! - CFBundleShortVersionString - 4.7.4 - CFBundleVersion - 239 - CLKComplicationPrincipalClass - $(PRODUCT_MODULE_NAME).ComplicationController - CLKComplicationSupportedFamilies - - CLKComplicationFamilyCircularSmall - CLKComplicationFamilyExtraLarge - CLKComplicationFamilyGraphicBezel - CLKComplicationFamilyGraphicCircular - CLKComplicationFamilyGraphicCorner - CLKComplicationFamilyModularLarge - CLKComplicationFamilyModularSmall - CLKComplicationFamilyUtilitarianLarge - CLKComplicationFamilyUtilitarianSmall - CLKComplicationFamilyUtilitarianSmallFlat - - LSApplicationCategoryType - - NSExtension - - NSExtensionAttributes - - WKAppBundleIdentifier - io.bluewallet.bluewallet.watch - - NSExtensionPointIdentifier - com.apple.watchkit - - WKExtensionDelegateClassName - $(PRODUCT_MODULE_NAME).ExtensionDelegate - - diff --git a/ios/BlueWalletWatch Extension/InterfaceController.swift b/ios/BlueWalletWatch Extension/InterfaceController.swift deleted file mode 100644 index ce715a16f7..0000000000 --- a/ios/BlueWalletWatch Extension/InterfaceController.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// InterfaceController.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/6/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit -import WatchConnectivity -import Foundation - -class InterfaceController: WKInterfaceController { - - @IBOutlet weak var walletsTable: WKInterfaceTable! - @IBOutlet weak var loadingIndicatorGroup: WKInterfaceGroup! - @IBOutlet weak var noWalletsAvailableLabel: WKInterfaceLabel! - - override func willActivate() { - // This method is called when watch view controller is about to be visible to user - super.willActivate() - WCSession.default.sendMessage(["message" : "sendApplicationContext"], replyHandler: nil, errorHandler: nil) - - if (WatchDataSource.shared.wallets.isEmpty) { - loadingIndicatorGroup.setHidden(true) - noWalletsAvailableLabel.setHidden(false) - } else { - processWalletsTable() - } - NotificationCenter.default.addObserver(self, selector: #selector(processWalletsTable), name: WatchDataSource.NotificationName.dataUpdated, object: nil) - } - - @objc private func processWalletsTable() { - loadingIndicatorGroup.setHidden(false) - walletsTable.setHidden(true) - walletsTable.setNumberOfRows(WatchDataSource.shared.wallets.count, withRowType: WalletInformation.identifier) - - for index in 0.. Any? { - return rowIndex; - } - -} diff --git a/ios/BlueWalletWatch Extension/NotificationController.swift b/ios/BlueWalletWatch Extension/NotificationController.swift deleted file mode 100644 index c9b649e1ca..0000000000 --- a/ios/BlueWalletWatch Extension/NotificationController.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// NotificationController.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/6/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit -import Foundation -import UserNotifications - - -class NotificationController: WKUserNotificationInterfaceController { - - override init() { - // Initialize variables here. - super.init() - - // Configure interface objects here. - } - - override func willActivate() { - // This method is called when watch view controller is about to be visible to user - super.willActivate() - } - - override func didDeactivate() { - // This method is called when watch view controller is no longer visible - super.didDeactivate() - } - - override func didReceive(_ notification: UNNotification) { - // This method is called when a notification needs to be presented. - // Implement it if you use a dynamic notification interface. - // Populate your dynamic notification interface as quickly as possible. - } -} diff --git a/ios/BlueWalletWatch Extension/NumericKeypadInterfaceController.swift b/ios/BlueWalletWatch Extension/NumericKeypadInterfaceController.swift deleted file mode 100644 index 1a78fddf3f..0000000000 --- a/ios/BlueWalletWatch Extension/NumericKeypadInterfaceController.swift +++ /dev/null @@ -1,155 +0,0 @@ -// -// NumericKeypadInterfaceController.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/23/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit -import Foundation - - -class NumericKeypadInterfaceController: WKInterfaceController { - - static let identifier = "NumericKeypadInterfaceController" - private var amount: [String] = ["0"] - var keyPadType: NumericKeypadType = .BTC - struct NotificationName { - static let keypadDataChanged = Notification.Name(rawValue: "Notification.NumericKeypadInterfaceController.keypadDataChanged") - } - struct Notifications { - static let keypadDataChanged = Notification(name: NotificationName.keypadDataChanged) - } - enum NumericKeypadType: String { - case BTC = "BTC" - case SATS = "sats" - } - - @IBOutlet weak var periodButton: WKInterfaceButton! - - override func awake(withContext context: Any?) { - super.awake(withContext: context) - if let context = context as? SpecifyInterfaceController.SpecificQRCodeContent { - amount = context.amountStringArray - keyPadType = context.bitcoinUnit - } - periodButton.setEnabled(keyPadType == .SATS) - } - - override func willActivate() { - // This method is called when watch view controller is about to be visible to user - super.willActivate() - updateTitle() - } - - private func updateTitle() { - var title = "" - for amount in self.amount { - let isValid = Double(amount) - if amount == "." || isValid != nil { - title.append(String(amount)) - } - } - if title.isEmpty { - title = "0" - } - setTitle("< \(title) \(keyPadType)") - NotificationCenter.default.post(name: NotificationName.keypadDataChanged, object: amount) - } - - private func append(value: String) { - guard amount.filter({$0 != "."}).count <= 9 && !(amount.contains(".") && value == ".") else { - return - } - switch keyPadType { - case .SATS: - if amount.first == "0" { - if value == "0" { - return - } - amount[0] = value - } else { - amount.append(value) - } - case .BTC: - if amount.isEmpty { - if (value == "0") { - amount.append("0") - } else if value == "." && !amount.contains(".") { - amount.append("0") - amount.append(".") - } else { - amount.append(value) - } - } else if let first = amount.first, first == "0" { - if amount.count > 1, amount[1] != "." { - amount.insert(".", at: 1) - } else if amount.count == 1, amount.first == "0" && value != "." { - amount.append(".") - amount.append(value) - } else { - amount.append(value) - } - } else { - amount.append(value) - } - } - updateTitle() - } - - @IBAction func keypadNumberOneTapped() { - append(value: "1") - } - - @IBAction func keypadNumberTwoTapped() { - append(value: "2") - } - - @IBAction func keypadNumberThreeTapped() { - append(value: "3") - } - - @IBAction func keypadNumberFourTapped() { - append(value: "4") - } - - @IBAction func keypadNumberFiveTapped() { - append(value: "5") - } - - @IBAction func keypadNumberSixTapped() { - append(value: "6") - } - - @IBAction func keypadNumberSevenTapped() { - append(value: "7") - } - - @IBAction func keypadNumberEightTapped() { - append(value: "8") - } - - @IBAction func keypadNumberNineTapped() { - append(value: "9") - } - - @IBAction func keypadNumberZeroTapped() { - append(value: "0") - } - - @IBAction func keypadNumberDotTapped() { - guard !amount.contains("."), keyPadType == .BTC else { return } - append(value: ".") - } - - @IBAction func keypadNumberRemoveTapped() { - guard !amount.isEmpty else { - setTitle("< 0 \(keyPadType)") - return - } - amount.removeLast() - updateTitle() - } - -} diff --git a/ios/BlueWalletWatch Extension/Objects/Transaction.swift b/ios/BlueWalletWatch Extension/Objects/Transaction.swift deleted file mode 100644 index d7fca13af6..0000000000 --- a/ios/BlueWalletWatch Extension/Objects/Transaction.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// Wallet.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/13/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import Foundation - -class Transaction: NSObject, NSCoding { - static let identifier: String = "Transaction" - - let time: String - let memo: String - let amount: String - let type: String - - init(time: String, memo: String, type: String, amount: String) { - self.time = time - self.memo = memo - self.type = type - self.amount = amount - } - - func encode(with aCoder: NSCoder) { - aCoder.encode(time, forKey: "time") - aCoder.encode(memo, forKey: "memo") - aCoder.encode(type, forKey: "type") - aCoder.encode(amount, forKey: "amount") - } - - required init?(coder aDecoder: NSCoder) { - time = aDecoder.decodeObject(forKey: "time") as! String - memo = aDecoder.decodeObject(forKey: "memo") as! String - amount = aDecoder.decodeObject(forKey: "amount") as! String - type = aDecoder.decodeObject(forKey: "type") as! String - } -} diff --git a/ios/BlueWalletWatch Extension/Objects/TransactionTableRow.swift b/ios/BlueWalletWatch Extension/Objects/TransactionTableRow.swift deleted file mode 100644 index ca79890168..0000000000 --- a/ios/BlueWalletWatch Extension/Objects/TransactionTableRow.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// TransactionTableRow.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/10/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit - -class TransactionTableRow: NSObject { - - @IBOutlet private weak var transactionAmountLabel: WKInterfaceLabel! - @IBOutlet private weak var transactionMemoLabel: WKInterfaceLabel! - @IBOutlet private weak var transactionTimeLabel: WKInterfaceLabel! - @IBOutlet private weak var transactionTypeImage: WKInterfaceImage! - - static let identifier: String = "TransactionTableRow" - - var amount: String = "" { - willSet { - transactionAmountLabel.setText(newValue) - } - } - - var memo: String = "" { - willSet { - transactionMemoLabel.setText(newValue) - } - } - - var time: String = "" { - willSet { - transactionTimeLabel.setText(newValue) - } - } - - var type: String = "" { - willSet { - if (newValue == "pendingConfirmation") { - transactionTypeImage.setImage(UIImage(named: "pendingConfirmation")) - } else if (newValue == "received") { - transactionTypeImage.setImage(UIImage(named: "receivedArrow")) - } else if (newValue == "sent") { - transactionTypeImage.setImage(UIImage(named: "sentArrow")) - } else { - transactionTypeImage.setImage(nil) - } - } - } - -} diff --git a/ios/BlueWalletWatch Extension/Objects/Wallet.swift b/ios/BlueWalletWatch Extension/Objects/Wallet.swift deleted file mode 100644 index cbbea850bd..0000000000 --- a/ios/BlueWalletWatch Extension/Objects/Wallet.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// Wallet.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/13/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import Foundation - -class Wallet: NSObject, NSCoding { - static let identifier: String = "Wallet" - - var identifier: Int? - let label: String - let balance: String - let type: String - let preferredBalanceUnit: String - let receiveAddress: String - let transactions: [Transaction] - - init(label: String, balance: String, type: String, preferredBalanceUnit: String, receiveAddress: String, transactions: [Transaction], identifier: Int) { - self.label = label - self.balance = balance - self.type = type - self.preferredBalanceUnit = preferredBalanceUnit - self.receiveAddress = receiveAddress - self.transactions = transactions - self.identifier = identifier - } - - func encode(with aCoder: NSCoder) { - aCoder.encode(label, forKey: "label") - aCoder.encode(balance, forKey: "balance") - aCoder.encode(type, forKey: "type") - aCoder.encode(receiveAddress, forKey: "receiveAddress") - aCoder.encode(preferredBalanceUnit, forKey: "preferredBalanceUnit") - aCoder.encode(transactions, forKey: "transactions") - aCoder.encode(identifier, forKey: "identifier") - } - - required init?(coder aDecoder: NSCoder) { - label = aDecoder.decodeObject(forKey: "label") as! String - balance = aDecoder.decodeObject(forKey: "balance") as! String - type = aDecoder.decodeObject(forKey: "type") as! String - preferredBalanceUnit = aDecoder.decodeObject(forKey: "preferredBalanceUnit") as! String - receiveAddress = aDecoder.decodeObject(forKey: "receiveAddress") as! String - transactions = aDecoder.decodeObject(forKey: "transactions") as? [Transaction] ?? [Transaction]() - } - -} diff --git a/ios/BlueWalletWatch Extension/Objects/WalletGradient.swift b/ios/BlueWalletWatch Extension/Objects/WalletGradient.swift deleted file mode 100644 index bf54ed9dfc..0000000000 --- a/ios/BlueWalletWatch Extension/Objects/WalletGradient.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// WalletGradient.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/23/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import Foundation - -enum WalletGradient: String { - case SegwitHD = "HDsegwitP2SH" - case Segwit = "segwitP2SH" - case LightningCustodial = "lightningCustodianWallet" - case SegwitNative = "HDsegwitBech32" - case WatchOnly = "watchOnly" - - var imageString: String{ - switch self { - case .Segwit: - return "wallet" - case .SegwitNative: - return "walletHDSegwitNative" - case .SegwitHD: - return "walletHD" - case .WatchOnly: - return "walletWatchOnly" - case .LightningCustodial: - return "walletLightningCustodial" - } - } -} diff --git a/ios/BlueWalletWatch Extension/Objects/WalletInformation.swift b/ios/BlueWalletWatch Extension/Objects/WalletInformation.swift deleted file mode 100644 index fd30d99a8d..0000000000 --- a/ios/BlueWalletWatch Extension/Objects/WalletInformation.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// WalletInformation.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/10/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit - -class WalletInformation: NSObject { - - @IBOutlet private weak var walletBalanceLabel: WKInterfaceLabel! - @IBOutlet private weak var walletNameLabel: WKInterfaceLabel! - @IBOutlet private weak var walletGroup: WKInterfaceGroup! - static let identifier: String = "WalletInformation" - - var name: String = "" { - willSet { - walletNameLabel.setText(newValue) - } - } - - var balance: String = "" { - willSet { - walletBalanceLabel.setText(newValue) - } - } - - var type: WalletGradient = .SegwitHD { - willSet { - walletGroup.setBackgroundImageNamed(newValue.imageString) - } - } - -} diff --git a/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift b/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift deleted file mode 100644 index 357ca6f68d..0000000000 --- a/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift +++ /dev/null @@ -1,103 +0,0 @@ -// -// WatchDataSource.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/20/19. -// Copyright © 2019 Facebook. All rights reserved. -// - - -import Foundation -import WatchConnectivity - -class WatchDataSource: NSObject, WCSessionDelegate { - struct NotificationName { - static let dataUpdated = Notification.Name(rawValue: "Notification.WalletDataSource.Updated") - } - struct Notifications { - static let dataUpdated = Notification(name: NotificationName.dataUpdated) - } - - static let shared = WatchDataSource() - var wallets: [Wallet] = [Wallet]() - private let keychain = KeychainSwift() - - override init() { - super.init() - if WCSession.isSupported() { - print("Activating watch session") - WCSession.default.delegate = self - WCSession.default.activate() - } - } - - func processWalletsData(walletsInfo: [String: Any]) { - if let walletsToProcess = walletsInfo["wallets"] as? [[String: Any]] { - wallets.removeAll(); - for (index, entry) in walletsToProcess.enumerated() { - guard let label = entry["label"] as? String, let balance = entry["balance"] as? String, let type = entry["type"] as? String, let preferredBalanceUnit = entry["preferredBalanceUnit"] as? String, let receiveAddress = entry["receiveAddress"] as? String, let transactions = entry["transactions"] as? [[String: Any]] else { - continue - } - var transactionsProcessed = [Transaction]() - for transactionEntry in transactions { - guard let time = transactionEntry["time"] as? String, let memo = transactionEntry["memo"] as? String, let amount = transactionEntry["amount"] as? String, let type = transactionEntry["type"] as? String else { continue } - let transaction = Transaction(time: time, memo: memo, type: type, amount: amount) - transactionsProcessed.append(transaction) - } - let wallet = Wallet(label: label, balance: balance, type: type, preferredBalanceUnit: preferredBalanceUnit, receiveAddress: receiveAddress, transactions: transactionsProcessed, identifier: index) - wallets.append(wallet) - } - - if let walletsArchived = try? NSKeyedArchiver.archivedData(withRootObject: wallets, requiringSecureCoding: false) { - keychain.set(walletsArchived, forKey: Wallet.identifier) - } - WatchDataSource.postDataUpdatedNotification() - } - } - - static func postDataUpdatedNotification() { - NotificationCenter.default.post(Notifications.dataUpdated) - } - - static func requestLightningInvoice(walletIdentifier: Int, amount: Double, description: String?, responseHandler: @escaping (_ invoice: String) -> Void) { - guard WatchDataSource.shared.wallets.count > walletIdentifier else { - responseHandler("") - return - } - WCSession.default.sendMessage(["request": "createInvoice", "walletIndex": walletIdentifier, "amount": amount, "description": description ?? ""], replyHandler: { (reply: [String : Any]) in - if let invoicePaymentRequest = reply["invoicePaymentRequest"] as? String, !invoicePaymentRequest.isEmpty { - responseHandler(invoicePaymentRequest) - } else { - responseHandler("") - } - }) { (error) in - print(error) - responseHandler("") - - } - } - - func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) { - WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext) - } - - func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { - WatchDataSource.shared.processWalletsData(walletsInfo: applicationContext) - } - - func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) { - // WatchDataSource.shared.processWalletsData(walletsInfo: userInfo) - } - - func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { - if activationState == .activated { - WCSession.default.sendMessage([:], replyHandler: nil, errorHandler: nil) - if let existingData = keychain.getData(Wallet.identifier), let walletData = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(existingData) as? [Wallet] { - guard let walletData = walletData, walletData != self.wallets else { return } - wallets = walletData - WatchDataSource.postDataUpdatedNotification() - } - } - } - -} diff --git a/ios/BlueWalletWatch Extension/PushNotificationPayload.apns b/ios/BlueWalletWatch Extension/PushNotificationPayload.apns deleted file mode 100644 index 5ac55268af..0000000000 --- a/ios/BlueWalletWatch Extension/PushNotificationPayload.apns +++ /dev/null @@ -1,20 +0,0 @@ -{ - "aps": { - "alert": { - "body": "Test message", - "title": "Optional title", - "subtitle": "Optional subtitle" - }, - "category": "myCategory", - "thread-id":"5280" - }, - - "WatchKit Simulator Actions": [ - { - "title": "First Button", - "identifier": "firstButtonAction" - } - ], - - "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." -} diff --git a/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift b/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift deleted file mode 100644 index 542ba1084b..0000000000 --- a/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift +++ /dev/null @@ -1,115 +0,0 @@ -// -// ReceiveInterfaceController.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/12/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit -import Foundation -import EFQRCode - -class ReceiveInterfaceController: WKInterfaceController { - - static let identifier = "ReceiveInterfaceController" - @IBOutlet weak var imageInterface: WKInterfaceImage! - private var wallet: Wallet? - private var isRenderingQRCode: Bool? - @IBOutlet weak var loadingIndicator: WKInterfaceGroup! - - override func awake(withContext context: Any?) { - super.awake(withContext: context) - guard let identifier = context as? Int, WatchDataSource.shared.wallets.count > identifier else { - pop() - return - } - let wallet = WatchDataSource.shared.wallets[identifier] - self.wallet = wallet - NotificationCenter.default.addObserver(forName: SpecifyInterfaceController.NotificationName.createQRCode, object: nil, queue: nil) { [weak self] (notification) in - self?.isRenderingQRCode = true - if let wallet = self?.wallet, wallet.type == "lightningCustodianWallet", let object = notification.object as? SpecifyInterfaceController.SpecificQRCodeContent, let amount = object.amount { - self?.imageInterface.setHidden(true) - self?.loadingIndicator.setHidden(false) - WatchDataSource.requestLightningInvoice(walletIdentifier: identifier, amount: amount, description: object.description, responseHandler: { (invoice) in - DispatchQueue.main.async { - if (!invoice.isEmpty) { - guard let cgImage = EFQRCode.generate( - content: "lightning:\(invoice)", inputCorrectionLevel: .h, pointShape: .circle) else { - return - } - let image = UIImage(cgImage: cgImage) - self?.loadingIndicator.setHidden(true) - self?.imageInterface.setHidden(false) - self?.imageInterface.setImage(nil) - self?.imageInterface.setImage(image) - } else { - self?.pop() - self?.presentAlert(withTitle: "Error", message: "Unable to create invoice. Please, make sure your iPhone is paired and nearby.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in - self?.dismiss() - })]) - } - } - }) - } else { - guard let notificationObject = notification.object as? SpecifyInterfaceController.SpecificQRCodeContent, let walletContext = self?.wallet, !walletContext.receiveAddress.isEmpty, let receiveAddress = self?.wallet?.receiveAddress else { return } - var address = "bitcoin:\(receiveAddress)" - - var hasAmount = false - if let amount = notificationObject.amount { - address.append("?amount=\(amount)&") - hasAmount = true - } - if let description = notificationObject.description { - if (!hasAmount) { - address.append("?") - } - address.append("label=\(description)") - } - - DispatchQueue.main.async { - guard let cgImage = EFQRCode.generate( - content: address) else { - return - } - let image = UIImage(cgImage: cgImage) - self?.imageInterface.setImage(nil) - self?.imageInterface.setImage(image) - self?.imageInterface.setHidden(false) - self?.loadingIndicator.setHidden(true) - self?.isRenderingQRCode = false - } - } - } - - guard !wallet.receiveAddress.isEmpty, let cgImage = EFQRCode.generate( - content: wallet.receiveAddress) else { - return - } - - let image = UIImage(cgImage: cgImage) - imageInterface.setImage(image) - } - - override func didAppear() { - super.didAppear() - if wallet?.type == "lightningCustodianWallet" { - if isRenderingQRCode == nil { - presentController(withName: SpecifyInterfaceController.identifier, context: wallet?.identifier) - isRenderingQRCode = false - } else if isRenderingQRCode == false { - pop() - } - } - } - - override func didDeactivate() { - super.didDeactivate() - NotificationCenter.default.removeObserver(self, name: SpecifyInterfaceController.NotificationName.createQRCode, object: nil) - } - - @IBAction func specifyMenuItemTapped() { - presentController(withName: SpecifyInterfaceController.identifier, context: wallet?.identifier) - } - -} diff --git a/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift b/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift deleted file mode 100644 index 50c4faccfa..0000000000 --- a/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift +++ /dev/null @@ -1,90 +0,0 @@ -// -// SpecifyInterfaceController.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/23/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit -import Foundation - -class SpecifyInterfaceController: WKInterfaceController { - - static let identifier = "SpecifyInterfaceController" - @IBOutlet weak var descriptionButton: WKInterfaceButton! - @IBOutlet weak var amountButton: WKInterfaceButton! - struct SpecificQRCodeContent { - var amount: Double? - var description: String? - var amountStringArray: [String] = ["0"] - var bitcoinUnit: NumericKeypadInterfaceController.NumericKeypadType = .BTC - } - var specifiedQRContent: SpecificQRCodeContent = SpecificQRCodeContent(amount: nil, description: nil, amountStringArray: ["0"], bitcoinUnit: .BTC) - var wallet: Wallet? - struct NotificationName { - static let createQRCode = Notification.Name(rawValue: "Notification.SpecifyInterfaceController.createQRCode") - } - struct Notifications { - static let createQRCode = Notification(name: NotificationName.createQRCode) - } - - override func awake(withContext context: Any?) { - super.awake(withContext: context) - guard let identifier = context as? Int, WatchDataSource.shared.wallets.count > identifier else { - return - } - let wallet = WatchDataSource.shared.wallets[identifier] - self.wallet = wallet - self.specifiedQRContent.bitcoinUnit = wallet.type == "lightningCustodianWallet" ? .SATS : .BTC - NotificationCenter.default.addObserver(forName: NumericKeypadInterfaceController.NotificationName.keypadDataChanged, object: nil, queue: nil) { [weak self] (notification) in - guard let amountObject = notification.object as? [String], !amountObject.isEmpty else { return } - if amountObject.count == 1 && (amountObject.first == "." || amountObject.first == "0") { - return - } - var title = "" - for amount in amountObject { - let isValid = Double(amount) - if amount == "." || isValid != nil { - title.append(String(amount)) - } - } - self?.specifiedQRContent.amountStringArray = amountObject - if let amountDouble = Double(title), let keyPadType = self?.specifiedQRContent.bitcoinUnit { - self?.specifiedQRContent.amount = amountDouble - self?.amountButton.setTitle("\(title) \(keyPadType)") - } - } - } - - override func didDeactivate() { - // This method is called when watch view controller is no longer visible - super.didDeactivate() - NotificationCenter.default.removeObserver(self, name: NumericKeypadInterfaceController.NotificationName.keypadDataChanged, object: nil) - } - - @IBAction func descriptionButtonTapped() { - presentTextInputController(withSuggestions: nil, allowedInputMode: .allowEmoji) { [weak self] (result: [Any]?) in - DispatchQueue.main.async { - if let result = result, let text = result.first as? String { - self?.specifiedQRContent.description = text - self?.descriptionButton.setTitle(nil) - self?.descriptionButton.setTitle(text) - } - } - } - } - - @IBAction func createButtonTapped() { - NotificationCenter.default.post(name: NotificationName.createQRCode, object: specifiedQRContent) - dismiss() - } - - override func contextForSegue(withIdentifier segueIdentifier: String) -> Any? { - if segueIdentifier == NumericKeypadInterfaceController.identifier { - return specifiedQRContent - } - return nil - } - -} diff --git a/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift b/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift deleted file mode 100644 index aedd0107fb..0000000000 --- a/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// WalletDetailsInterfaceController.swift -// BlueWalletWatch Extension -// -// Created by Marcos Rodriguez on 3/11/19. -// Copyright © 2019 Facebook. All rights reserved. -// - -import WatchKit -import Foundation - - -class WalletDetailsInterfaceController: WKInterfaceController { - - var wallet: Wallet? - static let identifier = "WalletDetailsInterfaceController" - @IBOutlet weak var walletBasicsGroup: WKInterfaceGroup! - @IBOutlet weak var walletBalanceLabel: WKInterfaceLabel! - @IBOutlet weak var walletNameLabel: WKInterfaceLabel! - @IBOutlet weak var receiveButton: WKInterfaceButton! - @IBOutlet weak var noTransactionsLabel: WKInterfaceLabel! - @IBOutlet weak var transactionsTable: WKInterfaceTable! - - override func awake(withContext context: Any?) { - super.awake(withContext: context) - guard let identifier = context as? Int else { - pop() - return - } - let wallet = WatchDataSource.shared.wallets[identifier] - self.wallet = wallet - walletBalanceLabel.setText(wallet.balance) - walletNameLabel.setText(wallet.label) - walletBasicsGroup.setBackgroundImageNamed(WalletGradient(rawValue: wallet.type)?.imageString) - - processWalletsTable() - } - - override func willActivate() { - super.willActivate() - transactionsTable.setHidden(wallet?.transactions.isEmpty ?? true) - noTransactionsLabel.setHidden(!(wallet?.transactions.isEmpty ?? false)) - } - - @IBAction func receiveMenuItemTapped() { - presentController(withName: ReceiveInterfaceController.identifier, context: wallet) - } - - @objc private func processWalletsTable() { - transactionsTable.setNumberOfRows(wallet?.transactions.count ?? 0, withRowType: TransactionTableRow.identifier) - - for index in 0.. Any? { - return wallet?.identifier - } - -} diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/1024.png deleted file mode 100644 index 94ff21813d..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/58.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/58.png deleted file mode 100644 index daedd5ceea..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/87.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/87.png deleted file mode 100644 index 1689795ed4..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 4bc9134642..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "images" : [ - { - "size" : "24x24", - "idiom" : "watch", - "filename" : "Icon-48.png", - "scale" : "2x", - "role" : "notificationCenter", - "subtype" : "38mm" - }, - { - "size" : "27.5x27.5", - "idiom" : "watch", - "filename" : "Icon-55.png", - "scale" : "2x", - "role" : "notificationCenter", - "subtype" : "42mm" - }, - { - "size" : "29x29", - "idiom" : "watch", - "filename" : "58.png", - "role" : "companionSettings", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "watch", - "filename" : "87.png", - "role" : "companionSettings", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "watch", - "filename" : "watch.png", - "scale" : "2x", - "role" : "appLauncher", - "subtype" : "38mm" - }, - { - "size" : "44x44", - "idiom" : "watch", - "filename" : "Icon-88.png", - "scale" : "2x", - "role" : "appLauncher", - "subtype" : "40mm" - }, - { - "size" : "50x50", - "idiom" : "watch", - "filename" : "Icon-173.png", - "scale" : "2x", - "role" : "appLauncher", - "subtype" : "44mm" - }, - { - "size" : "86x86", - "idiom" : "watch", - "filename" : "Icon-172.png", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "38mm" - }, - { - "size" : "98x98", - "idiom" : "watch", - "filename" : "Icon-196.png", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "42mm" - }, - { - "size" : "108x108", - "idiom" : "watch", - "filename" : "group-copy-2@3x.png", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "44mm" - }, - { - "size" : "1024x1024", - "idiom" : "watch-marketing", - "filename" : "1024.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-172.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-172.png deleted file mode 100644 index 3b0c5fc72f..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-172.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-173.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-173.png deleted file mode 100644 index 7d500f2450..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-173.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-196.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-196.png deleted file mode 100644 index fae20c7e84..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-196.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-48.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-48.png deleted file mode 100644 index 8aad31886a..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-48.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-55.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-55.png deleted file mode 100644 index fb277c8cd9..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-55.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-88.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-88.png deleted file mode 100644 index 57e7263723..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/Icon-88.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/group-copy-2@3x.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/group-copy-2@3x.png deleted file mode 100644 index e09536ad6f..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/group-copy-2@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/watch.png b/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/watch.png deleted file mode 100644 index 996e08eda4..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/AppIcon.appiconset/watch.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json deleted file mode 100644 index ca2af8cca5..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "screen-width" : "<=145", - "filename" : "circular38mm@2x.png", - "scale" : "2x" - }, - { - "screen-width" : ">161", - "scale" : "2x", - "idiom" : "watch", - "filename" : "circular40mm@2x.png" - }, - { - "scale" : "2x", - "idiom" : "watch", - "filename" : "circular42mm@2x.png", - "screen-width" : ">145" - }, - { - "filename" : "circular44mm@2x.png", - "scale" : "2x", - "idiom" : "watch", - "screen-width" : ">183" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular38mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular38mm@2x.png deleted file mode 100644 index bb02df600c..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular38mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular40mm@2x.png deleted file mode 100644 index 48c33e2ce1..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular42mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular42mm@2x.png deleted file mode 100644 index 48c33e2ce1..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular42mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular44mm@2x.png deleted file mode 100644 index 8613f83313..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Circular.imageset/circular44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Contents.json deleted file mode 100644 index 20caaf896e..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Contents.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "assets" : [ - { - "idiom" : "watch", - "role" : "circular", - "filename" : "Circular.imageset" - }, - { - "idiom" : "watch", - "filename" : "Modular.imageset", - "role" : "modular" - }, - { - "idiom" : "watch", - "filename" : "Utilitarian.imageset", - "role" : "utilitarian" - }, - { - "idiom" : "watch", - "role" : "extra-large", - "filename" : "Extra Large.imageset" - }, - { - "role" : "graphic-corner", - "idiom" : "watch", - "filename" : "Graphic Corner.imageset" - }, - { - "filename" : "Graphic Circular.imageset", - "role" : "graphic-circular", - "idiom" : "watch" - }, - { - "idiom" : "watch", - "filename" : "Graphic Bezel.imageset", - "role" : "graphic-bezel" - }, - { - "idiom" : "watch", - "role" : "graphic-large-rectangular", - "filename" : "Graphic Large Rectangular.imageset" - } - ] -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json deleted file mode 100644 index dbe01b0d67..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "images" : [ - { - "filename" : "extra-large38mm@2x.png", - "screen-width" : "<=145", - "idiom" : "watch", - "scale" : "2x" - }, - { - "screen-width" : ">161", - "filename" : "extra-large40mm@2x.png", - "idiom" : "watch", - "scale" : "2x" - }, - { - "screen-width" : ">145", - "idiom" : "watch", - "filename" : "extra-large42mm@2x.png", - "scale" : "2x" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183", - "filename" : "extra-large44mm@2x.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large38mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large38mm@2x.png deleted file mode 100644 index a20b089b31..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large38mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large40mm@2x.png deleted file mode 100644 index 8265dff09c..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large42mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large42mm@2x.png deleted file mode 100644 index 8265dff09c..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large42mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large44mm@2x.png deleted file mode 100644 index 1250239527..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Extra Large.imageset/extra-large44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json deleted file mode 100644 index 5ae9586870..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "filename" : "graphic-bezel40mm@2x.png", - "screen-width" : ">161", - "scale" : "2x" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "filename" : "graphic-bezel44mm@2x.png", - "screen-width" : ">183", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/graphic-bezel40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/graphic-bezel40mm@2x.png deleted file mode 100644 index 83d73e88ab..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/graphic-bezel40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/graphic-bezel44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/graphic-bezel44mm@2x.png deleted file mode 100644 index 26779ade18..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/graphic-bezel44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json deleted file mode 100644 index eeb81cb27d..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "filename" : "graphic-circular40mm@2x.png", - "screen-width" : ">161", - "scale" : "2x" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "filename" : "graphic-circular44mm@2x.png", - "screen-width" : ">183", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/graphic-circular40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/graphic-circular40mm@2x.png deleted file mode 100644 index 83d73e88ab..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/graphic-circular40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/graphic-circular44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/graphic-circular44mm@2x.png deleted file mode 100644 index 26779ade18..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/graphic-circular44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json deleted file mode 100644 index af8a3953bb..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "filename" : "graphic-corner40mm@2x.png", - "screen-width" : ">161", - "scale" : "2x" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "filename" : "graphic-corner44mm@2x.png", - "screen-width" : ">183", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/graphic-corner40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/graphic-corner40mm@2x.png deleted file mode 100644 index 8613f83313..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/graphic-corner40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/graphic-corner44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/graphic-corner44mm@2x.png deleted file mode 100644 index 24743f07c2..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/graphic-corner44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json deleted file mode 100644 index aefef2914e..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : "<=145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">183" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json deleted file mode 100644 index d419e61e82..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "images" : [ - { - "screen-width" : "<=145", - "scale" : "2x", - "idiom" : "watch", - "filename" : "modular38mm@2x.png" - }, - { - "screen-width" : ">161", - "scale" : "2x", - "filename" : "modular40mm@2x.png", - "idiom" : "watch" - }, - { - "scale" : "2x", - "idiom" : "watch", - "filename" : "modular42mm@2x.png", - "screen-width" : ">145" - }, - { - "filename" : "modular44mm@2x.png", - "screen-width" : ">183", - "idiom" : "watch", - "scale" : "2x" - } - ] -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular38mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular38mm@2x.png deleted file mode 100644 index e269254c28..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular38mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular40mm@2x.png deleted file mode 100644 index c9179c3002..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular42mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular42mm@2x.png deleted file mode 100644 index c9179c3002..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular42mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular44mm@2x.png deleted file mode 100644 index 839e09ca1c..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Modular.imageset/modular44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json deleted file mode 100644 index 57102e7efa..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "images" : [ - { - "scale" : "2x", - "filename" : "utility38mm@2x.png", - "screen-width" : "<=145", - "idiom" : "watch" - }, - { - "idiom" : "watch", - "scale" : "2x", - "screen-width" : ">161", - "filename" : "utility40mm@2x.png" - }, - { - "scale" : "2x", - "idiom" : "watch", - "filename" : "utility42mm@2x.png", - "screen-width" : ">145" - }, - { - "idiom" : "watch", - "screen-width" : ">183", - "filename" : "utility44mm@2x.png", - "scale" : "2x" - } - ] -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility38mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility38mm@2x.png deleted file mode 100644 index 8613f83313..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility38mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility40mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility40mm@2x.png deleted file mode 100644 index 24743f07c2..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility40mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility42mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility42mm@2x.png deleted file mode 100644 index 24743f07c2..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility42mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility44mm@2x.png b/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility44mm@2x.png deleted file mode 100644 index 15e843a61d..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/utility44mm@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c91..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/loadingIndicator.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/loadingIndicator.imageset/Contents.json deleted file mode 100644 index 9bf9642ba9..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/loadingIndicator.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "group-copy-2@3x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/loadingIndicator.imageset/group-copy-2@3x.png b/ios/BlueWalletWatch/Assets.xcassets/loadingIndicator.imageset/group-copy-2@3x.png deleted file mode 100644 index 6fd7d4f988..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/loadingIndicator.imageset/group-copy-2@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/pendingConfirmation.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/pendingConfirmation.imageset/Contents.json deleted file mode 100644 index 44952fef45..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/pendingConfirmation.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "shape@3x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/pendingConfirmation.imageset/shape@3x.png b/ios/BlueWalletWatch/Assets.xcassets/pendingConfirmation.imageset/shape@3x.png deleted file mode 100644 index 331ce40da8..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/pendingConfirmation.imageset/shape@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/qr-code.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/qr-code.imageset/Contents.json deleted file mode 100644 index d0bec2ab81..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/qr-code.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "qr-code@3x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/qr-code.imageset/qr-code@3x.png b/ios/BlueWalletWatch/Assets.xcassets/qr-code.imageset/qr-code@3x.png deleted file mode 100644 index b55d46bd7d..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/qr-code.imageset/qr-code@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/receivedArrow.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/receivedArrow.imageset/Contents.json deleted file mode 100644 index 873216a574..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/receivedArrow.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "path-copy-3@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/receivedArrow.imageset/path-copy-3@2x.png b/ios/BlueWalletWatch/Assets.xcassets/receivedArrow.imageset/path-copy-3@2x.png deleted file mode 100644 index c7bc367c4d..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/receivedArrow.imageset/path-copy-3@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/sentArrow.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/sentArrow.imageset/Contents.json deleted file mode 100644 index f7c919b94e..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/sentArrow.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "path-copy@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/sentArrow.imageset/path-copy@2x.png b/ios/BlueWalletWatch/Assets.xcassets/sentArrow.imageset/path-copy@2x.png deleted file mode 100644 index 1c8f0424ef..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/sentArrow.imageset/path-copy@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/Contents.json deleted file mode 100644 index f392699966..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "mask.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "mask@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "mask@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask.png b/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask.png deleted file mode 100644 index e3ee0e7af6..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask@2x.png b/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask@2x.png deleted file mode 100644 index 3a50d0f53c..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask@3x.png b/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask@3x.png deleted file mode 100644 index 08c8699a38..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/wallet.imageset/mask@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletHD.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/walletHD.imageset/Contents.json deleted file mode 100644 index 5ebd7347fc..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/walletHD.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "mask@3x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletHD.imageset/mask@3x.png b/ios/BlueWalletWatch/Assets.xcassets/walletHD.imageset/mask@3x.png deleted file mode 100644 index 49a027f79d..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletHD.imageset/mask@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/Contents.json deleted file mode 100644 index f392699966..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "mask.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "mask@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "mask@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask.png b/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask.png deleted file mode 100644 index 0433aa4186..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask@2x.png b/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask@2x.png deleted file mode 100644 index 3507ef171d..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask@3x.png b/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask@3x.png deleted file mode 100644 index 0101ff35b0..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletHDSegwitNative.imageset/mask@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletLightningCustodial.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/walletLightningCustodial.imageset/Contents.json deleted file mode 100644 index 5ebd7347fc..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/walletLightningCustodial.imageset/Contents.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "images" : [ - { - "idiom" : "watch", - "filename" : "mask@3x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletLightningCustodial.imageset/mask@3x.png b/ios/BlueWalletWatch/Assets.xcassets/walletLightningCustodial.imageset/mask@3x.png deleted file mode 100644 index 6a68178f45..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletLightningCustodial.imageset/mask@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/Contents.json b/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/Contents.json deleted file mode 100644 index f392699966..0000000000 --- a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "mask.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "mask@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "mask@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask.png b/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask.png deleted file mode 100644 index 02589174e9..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask@2x.png b/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask@2x.png deleted file mode 100644 index e6e7199b29..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask@2x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask@3x.png b/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask@3x.png deleted file mode 100644 index 819609051f..0000000000 Binary files a/ios/BlueWalletWatch/Assets.xcassets/walletWatchOnly.imageset/mask@3x.png and /dev/null differ diff --git a/ios/BlueWalletWatch/Base.lproj/Interface.storyboard b/ios/BlueWalletWatch/Base.lproj/Interface.storyboard deleted file mode 100644 index 14d93cbc8f..0000000000 --- a/ios/BlueWalletWatch/Base.lproj/Interface.storyboard +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
diff --git a/ios/BlueWalletWatch/Info.plist b/ios/BlueWalletWatch/Info.plist deleted file mode 100644 index fc60a83b22..0000000000 --- a/ios/BlueWalletWatch/Info.plist +++ /dev/null @@ -1,33 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - BlueWallet - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 4.7.4 - CFBundleVersion - 239 - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - WKCompanionAppBundleIdentifier - io.bluewallet.bluewallet - WKWatchKitApp - - - diff --git a/ios/Bridge.swift b/ios/Bridge.swift index 87c7573dc5..b5cf053d48 100644 --- a/ios/Bridge.swift +++ b/ios/Bridge.swift @@ -1,6 +1,6 @@ // // Bridge.swift -// BlueWallet +// VelesWallet // // Created by Marcos Rodriguez on 9/19/19. // Copyright © 2019 Facebook. All rights reserved. diff --git a/ios/KeychainSwiftDistrib.swift b/ios/KeychainSwiftDistrib.swift deleted file mode 100644 index 6287bcf828..0000000000 --- a/ios/KeychainSwiftDistrib.swift +++ /dev/null @@ -1,454 +0,0 @@ -// -// Keychain helper for iOS/Swift. -// -// https://github.com/evgenyneu/keychain-swift -// -// This file was automatically generated by combining multiple Swift source files. -// - - -// ---------------------------- -// -// KeychainSwift.swift -// -// ---------------------------- - -import Security -import Foundation - -/** - -A collection of helper functions for saving text and data in the keychain. - -*/ -open class KeychainSwift { - - var lastQueryParameters: [String: Any]? // Used by the unit tests - - /// Contains result code from the last operation. Value is noErr (0) for a successful result. - open var lastResultCode: OSStatus = noErr - - var keyPrefix = "" // Can be useful in test. - - /** - - Specify an access group that will be used to access keychain items. Access groups can be used to share keychain items between applications. When access group value is nil all application access groups are being accessed. Access group name is used by all functions: set, get, delete and clear. - - */ - open var accessGroup: String? - - - /** - - Specifies whether the items can be synchronized with other devices through iCloud. Setting this property to true will - add the item to other devices with the `set` method and obtain synchronizable items with the `get` command. Deleting synchronizable items will remove them from all devices. In order for keychain synchronization to work the user must enable "Keychain" in iCloud settings. - - Does not work on macOS. - - */ - open var synchronizable: Bool = false - - private let readLock = NSLock() - - /// Instantiate a KeychainSwift object - public init() { } - - /** - - - parameter keyPrefix: a prefix that is added before the key in get/set methods. Note that `clear` method still clears everything from the Keychain. - - */ - public init(keyPrefix: String) { - self.keyPrefix = keyPrefix - } - - /** - - Stores the text value in the keychain item under the given key. - - - parameter key: Key under which the text value is stored in the keychain. - - parameter value: Text string to be written to the keychain. - - parameter withAccess: Value that indicates when your app needs access to the text in the keychain item. By default the .AccessibleWhenUnlocked option is used that permits the data to be accessed only while the device is unlocked by the user. - - - returns: True if the text was successfully written to the keychain. - - */ - @discardableResult - open func set(_ value: String, forKey key: String, - withAccess access: KeychainSwiftAccessOptions? = nil) -> Bool { - - if let value = value.data(using: String.Encoding.utf8) { - return set(value, forKey: key, withAccess: access) - } - - return false - } - - /** - - Stores the data in the keychain item under the given key. - - - parameter key: Key under which the data is stored in the keychain. - - parameter value: Data to be written to the keychain. - - parameter withAccess: Value that indicates when your app needs access to the text in the keychain item. By default the .AccessibleWhenUnlocked option is used that permits the data to be accessed only while the device is unlocked by the user. - - - returns: True if the text was successfully written to the keychain. - - */ - @discardableResult - open func set(_ value: Data, forKey key: String, - withAccess access: KeychainSwiftAccessOptions? = nil) -> Bool { - - delete(key) // Delete any existing key before saving it - - let accessible = access?.value ?? KeychainSwiftAccessOptions.defaultOption.value - - let prefixedKey = keyWithPrefix(key) - - var query: [String : Any] = [ - KeychainSwiftConstants.klass : kSecClassGenericPassword, - KeychainSwiftConstants.attrAccount : prefixedKey, - KeychainSwiftConstants.valueData : value, - KeychainSwiftConstants.accessible : accessible - ] - - query = addAccessGroupWhenPresent(query) - query = addSynchronizableIfRequired(query, addingItems: true) - lastQueryParameters = query - - lastResultCode = SecItemAdd(query as CFDictionary, nil) - - return lastResultCode == noErr - } - - /** - - Stores the boolean value in the keychain item under the given key. - - - parameter key: Key under which the value is stored in the keychain. - - parameter value: Boolean to be written to the keychain. - - parameter withAccess: Value that indicates when your app needs access to the value in the keychain item. By default the .AccessibleWhenUnlocked option is used that permits the data to be accessed only while the device is unlocked by the user. - - - returns: True if the value was successfully written to the keychain. - - */ - @discardableResult - open func set(_ value: Bool, forKey key: String, - withAccess access: KeychainSwiftAccessOptions? = nil) -> Bool { - - let bytes: [UInt8] = value ? [1] : [0] - let data = Data(bytes) - - return set(data, forKey: key, withAccess: access) - } - - /** - - Retrieves the text value from the keychain that corresponds to the given key. - - - parameter key: The key that is used to read the keychain item. - - returns: The text value from the keychain. Returns nil if unable to read the item. - - */ - open func get(_ key: String) -> String? { - if let data = getData(key) { - - if let currentString = String(data: data, encoding: .utf8) { - return currentString - } - - lastResultCode = -67853 // errSecInvalidEncoding - } - - return nil - } - - /** - - Retrieves the data from the keychain that corresponds to the given key. - - - parameter key: The key that is used to read the keychain item. - - returns: The text value from the keychain. Returns nil if unable to read the item. - - */ - open func getData(_ key: String) -> Data? { - // The lock prevents the code to be run simlultaneously - // from multiple threads which may result in crashing - readLock.lock() - defer { readLock.unlock() } - - let prefixedKey = keyWithPrefix(key) - - var query: [String: Any] = [ - KeychainSwiftConstants.klass : kSecClassGenericPassword, - KeychainSwiftConstants.attrAccount : prefixedKey, - KeychainSwiftConstants.returnData : kCFBooleanTrue!, - KeychainSwiftConstants.matchLimit : kSecMatchLimitOne - ] - - query = addAccessGroupWhenPresent(query) - query = addSynchronizableIfRequired(query, addingItems: false) - lastQueryParameters = query - - var result: AnyObject? - - lastResultCode = withUnsafeMutablePointer(to: &result) { - SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) - } - - if lastResultCode == noErr { return result as? Data } - - return nil - } - - /** - - Retrieves the boolean value from the keychain that corresponds to the given key. - - - parameter key: The key that is used to read the keychain item. - - returns: The boolean value from the keychain. Returns nil if unable to read the item. - - */ - open func getBool(_ key: String) -> Bool? { - guard let data = getData(key) else { return nil } - guard let firstBit = data.first else { return nil } - return firstBit == 1 - } - - /** - - Deletes the single keychain item specified by the key. - - - parameter key: The key that is used to delete the keychain item. - - returns: True if the item was successfully deleted. - - */ - @discardableResult - open func delete(_ key: String) -> Bool { - let prefixedKey = keyWithPrefix(key) - - var query: [String: Any] = [ - KeychainSwiftConstants.klass : kSecClassGenericPassword, - KeychainSwiftConstants.attrAccount : prefixedKey - ] - - query = addAccessGroupWhenPresent(query) - query = addSynchronizableIfRequired(query, addingItems: false) - lastQueryParameters = query - - lastResultCode = SecItemDelete(query as CFDictionary) - - return lastResultCode == noErr - } - - /** - - Deletes all Keychain items used by the app. Note that this method deletes all items regardless of the prefix settings used for initializing the class. - - - returns: True if the keychain items were successfully deleted. - - */ - @discardableResult - open func clear() -> Bool { - var query: [String: Any] = [ kSecClass as String : kSecClassGenericPassword ] - query = addAccessGroupWhenPresent(query) - query = addSynchronizableIfRequired(query, addingItems: false) - lastQueryParameters = query - - lastResultCode = SecItemDelete(query as CFDictionary) - - return lastResultCode == noErr - } - - /// Returns the key with currently set prefix. - func keyWithPrefix(_ key: String) -> String { - return "\(keyPrefix)\(key)" - } - - func addAccessGroupWhenPresent(_ items: [String: Any]) -> [String: Any] { - guard let accessGroup = accessGroup else { return items } - - var result: [String: Any] = items - result[KeychainSwiftConstants.accessGroup] = accessGroup - return result - } - - /** - - Adds kSecAttrSynchronizable: kSecAttrSynchronizableAny` item to the dictionary when the `synchronizable` property is true. - - - parameter items: The dictionary where the kSecAttrSynchronizable items will be added when requested. - - parameter addingItems: Use `true` when the dictionary will be used with `SecItemAdd` method (adding a keychain item). For getting and deleting items, use `false`. - - - returns: the dictionary with kSecAttrSynchronizable item added if it was requested. Otherwise, it returns the original dictionary. - - */ - func addSynchronizableIfRequired(_ items: [String: Any], addingItems: Bool) -> [String: Any] { - if !synchronizable { return items } - var result: [String: Any] = items - result[KeychainSwiftConstants.attrSynchronizable] = addingItems == true ? true : kSecAttrSynchronizableAny - return result - } -} - - -// ---------------------------- -// -// TegKeychainConstants.swift -// -// ---------------------------- - -import Foundation -import Security - -/// Constants used by the library -public struct KeychainSwiftConstants { - /// Specifies a Keychain access group. Used for sharing Keychain items between apps. - public static var accessGroup: String { return toString(kSecAttrAccessGroup) } - - /** - - A value that indicates when your app needs access to the data in a keychain item. The default value is AccessibleWhenUnlocked. For a list of possible values, see KeychainSwiftAccessOptions. - - */ - public static var accessible: String { return toString(kSecAttrAccessible) } - - /// Used for specifying a String key when setting/getting a Keychain value. - public static var attrAccount: String { return toString(kSecAttrAccount) } - - /// Used for specifying synchronization of keychain items between devices. - public static var attrSynchronizable: String { return toString(kSecAttrSynchronizable) } - - /// An item class key used to construct a Keychain search dictionary. - public static var klass: String { return toString(kSecClass) } - - /// Specifies the number of values returned from the keychain. The library only supports single values. - public static var matchLimit: String { return toString(kSecMatchLimit) } - - /// A return data type used to get the data from the Keychain. - public static var returnData: String { return toString(kSecReturnData) } - - /// Used for specifying a value when setting a Keychain value. - public static var valueData: String { return toString(kSecValueData) } - - static func toString(_ value: CFString) -> String { - return value as String - } -} - - -// ---------------------------- -// -// KeychainSwiftAccessOptions.swift -// -// ---------------------------- - -import Security - -/** - -These options are used to determine when a keychain item should be readable. The default value is AccessibleWhenUnlocked. - -*/ -public enum KeychainSwiftAccessOptions { - - /** - - The data in the keychain item can be accessed only while the device is unlocked by the user. - - This is recommended for items that need to be accessible only while the application is in the foreground. Items with this attribute migrate to a new device when using encrypted backups. - - This is the default value for keychain items added without explicitly setting an accessibility constant. - - */ - case accessibleWhenUnlocked - - /** - - The data in the keychain item can be accessed only while the device is unlocked by the user. - - This is recommended for items that need to be accessible only while the application is in the foreground. Items with this attribute do not migrate to a new device. Thus, after restoring from a backup of a different device, these items will not be present. - - */ - case accessibleWhenUnlockedThisDeviceOnly - - /** - - The data in the keychain item cannot be accessed after a restart until the device has been unlocked once by the user. - - After the first unlock, the data remains accessible until the next restart. This is recommended for items that need to be accessed by background applications. Items with this attribute migrate to a new device when using encrypted backups. - - */ - case accessibleAfterFirstUnlock - - /** - - The data in the keychain item cannot be accessed after a restart until the device has been unlocked once by the user. - - After the first unlock, the data remains accessible until the next restart. This is recommended for items that need to be accessed by background applications. Items with this attribute do not migrate to a new device. Thus, after restoring from a backup of a different device, these items will not be present. - - */ - case accessibleAfterFirstUnlockThisDeviceOnly - - /** - - The data in the keychain item can always be accessed regardless of whether the device is locked. - - This is not recommended for application use. Items with this attribute migrate to a new device when using encrypted backups. - - */ - case accessibleAlways - - /** - - The data in the keychain can only be accessed when the device is unlocked. Only available if a passcode is set on the device. - - This is recommended for items that only need to be accessible while the application is in the foreground. Items with this attribute never migrate to a new device. After a backup is restored to a new device, these items are missing. No items can be stored in this class on devices without a passcode. Disabling the device passcode causes all items in this class to be deleted. - - */ - case accessibleWhenPasscodeSetThisDeviceOnly - - /** - - The data in the keychain item can always be accessed regardless of whether the device is locked. - - This is not recommended for application use. Items with this attribute do not migrate to a new device. Thus, after restoring from a backup of a different device, these items will not be present. - - */ - case accessibleAlwaysThisDeviceOnly - - static var defaultOption: KeychainSwiftAccessOptions { - return .accessibleWhenUnlocked - } - - var value: String { - switch self { - case .accessibleWhenUnlocked: - return toString(kSecAttrAccessibleWhenUnlocked) - - case .accessibleWhenUnlockedThisDeviceOnly: - return toString(kSecAttrAccessibleWhenUnlockedThisDeviceOnly) - - case .accessibleAfterFirstUnlock: - return toString(kSecAttrAccessibleAfterFirstUnlock) - - case .accessibleAfterFirstUnlockThisDeviceOnly: - return toString(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly) - - case .accessibleAlways: - return toString(kSecAttrAccessibleAlways) - - case .accessibleWhenPasscodeSetThisDeviceOnly: - return toString(kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly) - - case .accessibleAlwaysThisDeviceOnly: - return toString(kSecAttrAccessibleAlwaysThisDeviceOnly) - } - } - - func toString(_ value: CFString) -> String { - return KeychainSwiftConstants.toString(value) - } -} - - diff --git a/ios/Podfile b/ios/Podfile index 00757d6268..8e827f2d79 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,73 +1,61 @@ # Uncomment the next line to define a global platform for your project -platform :ios, '9.0' +platform :ios, '10.0' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -workspace 'BlueWallet' +workspace 'VelesWallet' post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| puts "Setting Swift Version and deployment target setting for #{target.name}..." config.build_settings['SWIFT_VERSION'] = '4.2' - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0' end end end def sharedPods - pod 'React', :path => '../node_modules/react-native/' - pod 'React-Core', :path => '../node_modules/react-native/React' - pod 'React-DevSupport', :path => '../node_modules/react-native/React' - pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' - pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' - pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' - pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' - pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' - pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' - pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' - pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' - pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' - pod 'React-RCTWebSocket', :path => '../node_modules/react-native/Libraries/WebSocket' - - pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' - pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' - pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' - pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' - pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga' - - pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' - pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' - pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' + pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" + pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" + pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" + pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" + pod 'React', :path => '../node_modules/react-native/' + pod 'React-Core', :path => '../node_modules/react-native/' + pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' + pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' + pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' + pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' + pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' + pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' + pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' + pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' + pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' + pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' + pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' + pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' + pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' + pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' + pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' + pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' + pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon" + pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" + pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga' + + pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' + pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' + pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' use_native_modules! end -target 'BlueWallet' do +target 'VelesWallet' do # Uncomment the next line if you're using Swift or would like to use dynamic frameworks # use_frameworks! - project 'BlueWallet.xcodeproj' - platform :ios, '9.0' - # Pods for BlueWallet + project 'VelesWallet.xcodeproj' + platform :ios, '10.0' + # Pods for VelesWallet # React Native requirements sharedPods -end - -target 'BlueWalletTests' do - inherit! :search_paths - # Pods for testing - -end + pod 'react-native-splash-screen', :path => '../node_modules/react-native-splash-screen' + pod 'react-native-restart', :path => '../node_modules/react-native-restart' -target 'BlueWalletWatch' do - # Comment the next line if you're not using Swift and don't want to use dynamic frameworks - # use_frameworks! - # Pods for BlueWalletWatch - platform :watchos, '5.0' end - -target 'BlueWalletWatch Extension' do - # Comment the next line if you're not using Swift and don't want to use dynamic frameworks - # use_frameworks! - platform :watchos, '5.0' - pod 'EFQRCode', '5.1.0' - # Pods for BlueWalletWatch Extension -end \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9db899e90e..71bb84f1b9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,28 +1,17 @@ PODS: - - appcenter (2.5.0): - - AppCenterReactNativeShared - - React - - appcenter-analytics (2.5.0): - - AppCenter/Analytics - - AppCenterReactNativeShared - - React - - appcenter-crashes (2.5.0): - - AppCenter/Crashes - - AppCenterReactNativeShared - - React - - AppCenter/Analytics (2.5.0): - - AppCenter/Core - - AppCenter/Core (2.5.0) - - AppCenter/Crashes (2.5.0): - - AppCenter/Core - - AppCenterReactNativeShared (2.5.0): - - AppCenter/Core (= 2.5.0) - boost-for-react-native (1.63.0) - - BVLinearGradient (2.5.4): + - BVLinearGradient (2.5.6): - React + - CocoaAsyncSocket (7.6.4) - DoubleConversion (1.1.6) - - EFQRCode (5.1.0): - - swift_qrcodejs (~> 1.1.1) + - FBLazyVector (0.61.5) + - FBReactNativeSpec (0.61.5): + - Folly (= 2018.10.22.00) + - RCTRequired (= 0.61.5) + - RCTTypeSafety (= 0.61.5) + - React-Core (= 0.61.5) + - React-jsi (= 0.61.5) + - ReactCommon/turbomodule/core (= 0.61.5) - Folly (2018.10.22.00): - boost-for-react-native - DoubleConversion @@ -33,56 +22,183 @@ PODS: - DoubleConversion - glog - glog (0.3.5) + - libwebp (1.1.0): + - libwebp/demux (= 1.1.0) + - libwebp/mux (= 1.1.0) + - libwebp/webp (= 1.1.0) + - libwebp/demux (1.1.0): + - libwebp/webp + - libwebp/mux (1.1.0): + - libwebp/demux + - libwebp/webp (1.1.0) - lottie-ios (3.0.7) - lottie-react-native (3.1.1): - lottie-ios (~> 3.0.3) - React - - React (0.60.5): - - React-Core (= 0.60.5) - - React-DevSupport (= 0.60.5) - - React-RCTActionSheet (= 0.60.5) - - React-RCTAnimation (= 0.60.5) - - React-RCTBlob (= 0.60.5) - - React-RCTImage (= 0.60.5) - - React-RCTLinking (= 0.60.5) - - React-RCTNetwork (= 0.60.5) - - React-RCTSettings (= 0.60.5) - - React-RCTText (= 0.60.5) - - React-RCTVibration (= 0.60.5) - - React-RCTWebSocket (= 0.60.5) - - React-Core (0.60.5): + - RCTRequired (0.61.5) + - RCTTypeSafety (0.61.5): + - FBLazyVector (= 0.61.5) + - Folly (= 2018.10.22.00) + - RCTRequired (= 0.61.5) + - React-Core (= 0.61.5) + - React (0.61.5): + - React-Core (= 0.61.5) + - React-Core/DevSupport (= 0.61.5) + - React-Core/RCTWebSocket (= 0.61.5) + - React-RCTActionSheet (= 0.61.5) + - React-RCTAnimation (= 0.61.5) + - React-RCTBlob (= 0.61.5) + - React-RCTImage (= 0.61.5) + - React-RCTLinking (= 0.61.5) + - React-RCTNetwork (= 0.61.5) + - React-RCTSettings (= 0.61.5) + - React-RCTText (= 0.61.5) + - React-RCTVibration (= 0.61.5) + - React-Core (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/CoreModulesHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/Default (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/DevSupport (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.5) + - React-Core/RCTWebSocket (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - React-jsinspector (= 0.61.5) + - Yoga + - React-Core/RCTActionSheetHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTAnimationHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTBlobHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTImageHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTLinkingHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTNetworkHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTSettingsHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTTextHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTVibrationHeaders (0.61.5): - Folly (= 2018.10.22.00) - - React-cxxreact (= 0.60.5) - - React-jsiexecutor (= 0.60.5) - - yoga (= 0.60.5.React) - - React-cxxreact (0.60.5): + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTWebSocket (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-CoreModules (0.61.5): + - FBReactNativeSpec (= 0.61.5) + - Folly (= 2018.10.22.00) + - RCTTypeSafety (= 0.61.5) + - React-Core/CoreModulesHeaders (= 0.61.5) + - React-RCTImage (= 0.61.5) + - ReactCommon/turbomodule/core (= 0.61.5) + - React-cxxreact (0.61.5): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2018.10.22.00) - glog - - React-jsinspector (= 0.60.5) - - React-DevSupport (0.60.5): - - React-Core (= 0.60.5) - - React-RCTWebSocket (= 0.60.5) - - React-jsi (0.60.5): + - React-jsinspector (= 0.61.5) + - React-jsi (0.61.5): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2018.10.22.00) - glog - - React-jsi/Default (= 0.60.5) - - React-jsi/Default (0.60.5): + - React-jsi/Default (= 0.61.5) + - React-jsi/Default (0.61.5): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2018.10.22.00) - glog - - React-jsiexecutor (0.60.5): + - React-jsiexecutor (0.61.5): - DoubleConversion - Folly (= 2018.10.22.00) - glog - - React-cxxreact (= 0.60.5) - - React-jsi (= 0.60.5) - - React-jsinspector (0.60.5) - - react-native-biometrics (1.6.1): + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsinspector (0.61.5) + - react-native-biometrics (2.1.4): - React - react-native-blur (0.8.0): - React @@ -100,51 +216,83 @@ PODS: - React - react-native-randombytes (3.5.3): - React + - react-native-restart (0.0.15): + - React + - react-native-safe-area-context (3.1.1): + - React - react-native-slider (2.0.0-rc.1): - React - - react-native-watch-connectivity (0.3.2): - - React - - react-native-webview (6.9.0): - - React - - React-RCTActionSheet (0.60.5): - - React-Core (= 0.60.5) - - React-RCTAnimation (0.60.5): - - React-Core (= 0.60.5) - - React-RCTBlob (0.60.5): - - React-Core (= 0.60.5) - - React-RCTNetwork (= 0.60.5) - - React-RCTWebSocket (= 0.60.5) - - React-RCTImage (0.60.5): - - React-Core (= 0.60.5) - - React-RCTNetwork (= 0.60.5) - - React-RCTLinking (0.60.5): - - React-Core (= 0.60.5) - - React-RCTNetwork (0.60.5): - - React-Core (= 0.60.5) - - React-RCTSettings (0.60.5): - - React-Core (= 0.60.5) - - React-RCTText (0.60.5): - - React-Core (= 0.60.5) - - React-RCTVibration (0.60.5): - - React-Core (= 0.60.5) - - React-RCTWebSocket (0.60.5): - - React-Core (= 0.60.5) + - react-native-splash-screen (3.2.0): + - React + - React-RCTActionSheet (0.61.5): + - React-Core/RCTActionSheetHeaders (= 0.61.5) + - React-RCTAnimation (0.61.5): + - React-Core/RCTAnimationHeaders (= 0.61.5) + - React-RCTBlob (0.61.5): + - React-Core/RCTBlobHeaders (= 0.61.5) + - React-Core/RCTWebSocket (= 0.61.5) + - React-jsi (= 0.61.5) + - React-RCTNetwork (= 0.61.5) + - React-RCTImage (0.61.5): + - React-Core/RCTImageHeaders (= 0.61.5) + - React-RCTNetwork (= 0.61.5) + - React-RCTLinking (0.61.5): + - React-Core/RCTLinkingHeaders (= 0.61.5) + - React-RCTNetwork (0.61.5): + - React-Core/RCTNetworkHeaders (= 0.61.5) + - React-RCTSettings (0.61.5): + - React-Core/RCTSettingsHeaders (= 0.61.5) + - React-RCTText (0.61.5): + - React-Core/RCTTextHeaders (= 0.61.5) + - React-RCTVibration (0.61.5): + - React-Core/RCTVibrationHeaders (= 0.61.5) + - ReactCommon/jscallinvoker (0.61.5): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.5) + - ReactCommon/turbomodule/core (0.61.5): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-Core (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - ReactCommon/jscallinvoker (= 0.61.5) - ReactNativePrivacySnapshot (1.0.0): - React - RemobileReactNativeQrcodeLocalImage (1.0.4): - React - - RNCAsyncStorage (1.6.2): + - RNCAsyncStorage (1.9.0): - React - - RNDeviceInfo (4.0.1): + - RNCClipboard (1.2.3): - React + - RNCMaskedView (0.1.10): + - React + - RNDefaultPreference (1.4.1): + - React + - RNDeviceInfo (5.5.6): + - React + - RNFastImage (8.3.2): + - React + - SDWebImage (~> 5.8) + - SDWebImageWebPCoder (~> 0.6.1) - RNFS (2.13.3): - React - - RNGestureHandler (1.3.0): + - RNGestureHandler (1.6.1): - React - RNHandoff (0.0.3): - React + - RNLocalize (1.4.0): + - React + - RNQuickAction (0.3.12): + - React - RNRate (1.0.1): - React + - RNReanimated (1.9.0): + - React + - RNScreens (2.9.0): + - React - RNSecureKeyStore (1.0.0): - React - RNSentry (1.0.9): @@ -156,30 +304,40 @@ PODS: - React - RNVectorIcons (6.6.0): - React - - Sentry (4.4.1): - - Sentry/Core (= 4.4.1) - - Sentry/Core (4.4.1) - - swift_qrcodejs (1.1.2) - - TcpSockets (3.3.2): + - RNWatch (0.4.1): + - React + - SDWebImage (5.8.4): + - SDWebImage/Core (= 5.8.4) + - SDWebImage/Core (5.8.4) + - SDWebImageWebPCoder (0.6.1): + - libwebp (~> 1.0) + - SDWebImage/Core (~> 5.7) + - Sentry (4.4.3): + - Sentry/Core (= 4.4.3) + - Sentry/Core (4.4.3) + - TcpSockets (4.0.0): + - CocoaAsyncSocket - React - ToolTipMenu (5.2.1): - React - - yoga (0.60.5.React) + - Yoga (1.14.0) DEPENDENCIES: - - appcenter (from `../node_modules/appcenter/ios`) - - appcenter-analytics (from `../node_modules/appcenter-analytics/ios`) - - appcenter-crashes (from `../node_modules/appcenter-crashes/ios`) - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - EFQRCode (= 5.1.0) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - lottie-react-native (from `../node_modules/lottie-react-native`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) - - React-Core (from `../node_modules/react-native/React`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-DevSupport (from `../node_modules/react-native/React`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) @@ -189,9 +347,10 @@ DEPENDENCIES: - react-native-haptic-feedback (from `../node_modules/react-native-haptic-feedback`) - react-native-image-picker (from `../node_modules/react-native-image-picker`) - react-native-randombytes (from `../node_modules/react-native-randombytes`) + - react-native-restart (from `../node_modules/react-native-restart`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - "react-native-slider (from `../node_modules/@react-native-community/slider`)" - - react-native-watch-connectivity (from `../node_modules/react-native-watch-connectivity`) - - react-native-webview (from `../node_modules/react-native-webview`) + - react-native-splash-screen (from `../node_modules/react-native-splash-screen`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -201,59 +360,71 @@ DEPENDENCIES: - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-RCTWebSocket (from `../node_modules/react-native/Libraries/WebSocket`) + - ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - ReactNativePrivacySnapshot (from `../node_modules/react-native-privacy-snapshot`) - "RemobileReactNativeQrcodeLocalImage (from `../node_modules/@remobile/react-native-qrcode-local-image`)" - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" + - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" + - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" + - RNDefaultPreference (from `../node_modules/react-native-default-preference`) - RNDeviceInfo (from `../node_modules/react-native-device-info`) + - RNFastImage (from `../node_modules/react-native-fast-image`) - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNHandoff (from `../node_modules/react-native-handoff`) + - RNLocalize (from `../node_modules/react-native-localize`) + - RNQuickAction (from `../node_modules/react-native-quick-actions`) - RNRate (from `../node_modules/react-native-rate/ios`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) - RNSecureKeyStore (from `../node_modules/react-native-secure-key-store/ios`) - "RNSentry (from `../node_modules/@sentry/react-native`)" - RNShare (from `../node_modules/react-native-share`) - RNSVG (from `../node_modules/react-native-svg`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - RNWatch (from `../node_modules/react-native-watch-connectivity`) - TcpSockets (from `../node_modules/react-native-tcp`) - ToolTipMenu (from `../node_modules/react-native-tooltip`) - - yoga (from `../node_modules/react-native/ReactCommon/yoga`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: - https://github.com/cocoapods/specs.git: - - AppCenter - - AppCenterReactNativeShared + trunk: - boost-for-react-native - - EFQRCode + - CocoaAsyncSocket + - libwebp - lottie-ios + - SDWebImage + - SDWebImageWebPCoder - Sentry - - swift_qrcodejs EXTERNAL SOURCES: - appcenter: - :path: "../node_modules/appcenter/ios" - appcenter-analytics: - :path: "../node_modules/appcenter-analytics/ios" - appcenter-crashes: - :path: "../node_modules/appcenter-crashes/ios" BVLinearGradient: :path: "../node_modules/react-native-linear-gradient" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" Folly: :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" lottie-react-native: :path: "../node_modules/lottie-react-native" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" React: :path: "../node_modules/react-native/" React-Core: - :path: "../node_modules/react-native/React" + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" - React-DevSupport: - :path: "../node_modules/react-native/React" React-jsi: :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: @@ -272,12 +443,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-image-picker" react-native-randombytes: :path: "../node_modules/react-native-randombytes" + react-native-restart: + :path: "../node_modules/react-native-restart" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" react-native-slider: :path: "../node_modules/@react-native-community/slider" - react-native-watch-connectivity: - :path: "../node_modules/react-native-watch-connectivity" - react-native-webview: - :path: "../node_modules/react-native-webview" + react-native-splash-screen: + :path: "../node_modules/react-native-splash-screen" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -296,24 +469,40 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" - React-RCTWebSocket: - :path: "../node_modules/react-native/Libraries/WebSocket" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" ReactNativePrivacySnapshot: :path: "../node_modules/react-native-privacy-snapshot" RemobileReactNativeQrcodeLocalImage: :path: "../node_modules/@remobile/react-native-qrcode-local-image" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" + RNCClipboard: + :path: "../node_modules/@react-native-community/clipboard" + RNCMaskedView: + :path: "../node_modules/@react-native-community/masked-view" + RNDefaultPreference: + :path: "../node_modules/react-native-default-preference" RNDeviceInfo: :path: "../node_modules/react-native-device-info" + RNFastImage: + :path: "../node_modules/react-native-fast-image" RNFS: :path: "../node_modules/react-native-fs" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNHandoff: :path: "../node_modules/react-native-handoff" + RNLocalize: + :path: "../node_modules/react-native-localize" + RNQuickAction: + :path: "../node_modules/react-native-quick-actions" RNRate: :path: "../node_modules/react-native-rate/ios" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" RNSecureKeyStore: :path: "../node_modules/react-native-secure-key-store/ios" RNSentry: @@ -324,72 +513,85 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-svg" RNVectorIcons: :path: "../node_modules/react-native-vector-icons" + RNWatch: + :path: "../node_modules/react-native-watch-connectivity" TcpSockets: :path: "../node_modules/react-native-tcp" ToolTipMenu: :path: "../node_modules/react-native-tooltip" - yoga: + Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - AppCenter: 637f180deefc61e8ab3f94223869ee50f61dabea - appcenter: bde9923b687332a25607fc1aa9577c9361cfed85 - appcenter-analytics: 0ee7a35def715d4bce58ec435f54161770195166 - appcenter-crashes: 9f9c5647dba19026ff09509576fb7233f69697ff - AppCenterReactNativeShared: 99e7f662ec66b1cb41306ecf357aabac35931c08 boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - BVLinearGradient: 8cbc5155c978f2e43098818c91d206d07aae6d30 + BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 + CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845 DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2 - EFQRCode: 07ee69f29196329e974b9bffa5381240cc09ea4c + FBLazyVector: aaeaf388755e4f29cd74acbc9e3b8da6d807c37f + FBReactNativeSpec: 118d0d177724c2d67f08a59136eb29ef5943ec75 Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51 glog: 1f3da668190260b06b429bb211bfbee5cd790c28 + libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3 lottie-ios: c38c3178ae8c4a8f200661aa5f80b9f1ca7f56b3 lottie-react-native: d8caf2aa9ab8bb76312e44997c1c91804a23d44d - React: 53c53c4d99097af47cf60594b8706b4e3321e722 - React-Core: ba421f6b4f4cbe2fb17c0b6fc675f87622e78a64 - React-cxxreact: 8384287780c4999351ad9b6e7a149d9ed10a2395 - React-DevSupport: 197fb409737cff2c4f9986e77c220d7452cb9f9f - React-jsi: 4d8c9efb6312a9725b18d6fc818ffc103f60fec2 - React-jsiexecutor: 90ad2f9db09513fc763bc757fdc3c4ff8bde2a30 - React-jsinspector: e08662d1bf5b129a3d556eb9ea343a3f40353ae4 - react-native-biometrics: 4aaf49f9f8bd28c6aa3ec53534ca1b6b00486f6a + RCTRequired: b153add4da6e7dbc44aebf93f3cf4fcae392ddf1 + RCTTypeSafety: 9aa1b91d7f9310fc6eadc3cf95126ffe818af320 + React: b6a59ef847b2b40bb6e0180a97d0ca716969ac78 + React-Core: 688b451f7d616cc1134ac95295b593d1b5158a04 + React-CoreModules: d04f8494c1a328b69ec11db9d1137d667f916dcb + React-cxxreact: d0f7bcafa196ae410e5300736b424455e7fb7ba7 + React-jsi: cb2cd74d7ccf4cffb071a46833613edc79cdf8f7 + React-jsiexecutor: d5525f9ed5f782fdbacb64b9b01a43a9323d2386 + React-jsinspector: fa0ecc501688c3c4c34f28834a76302233e29dc0 + react-native-biometrics: 9d3306e5d29c3bc4e6a3c912d759a94e76a2f683 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 203091b4bf99d48b788a0682ad573e8718724893 + react-native-camera: f4f2144140ae1e808cad97cc7caf013767c11f1b react-native-haptic-feedback: 22c9dc85fd8059f83bf9edd9212ac4bd4ae6074d - react-native-image-picker: 3637d63fef7e32a230141ab4660d3ceb773c824f - react-native-randombytes: 991545e6eaaf700b4ee384c291ef3d572e0b2ca8 - react-native-slider: 6d83f7b8076a84e965a43fbdcfcf9dac19cea42e - react-native-watch-connectivity: 5333c7054ff667130fd93f504a3d6bb35e87cabd - react-native-webview: f72ac4078e115dfa741cc588acb1cca25566457d - React-RCTActionSheet: b0f1ea83f4bf75fb966eae9bfc47b78c8d3efd90 - React-RCTAnimation: 359ba1b5690b1e87cc173558a78e82d35919333e - React-RCTBlob: 5e2b55f76e9a1c7ae52b826923502ddc3238df24 - React-RCTImage: f5f1c50922164e89bdda67bcd0153952a5cfe719 - React-RCTLinking: d0ecbd791e9ddddc41fa1f66b0255de90e8ee1e9 - React-RCTNetwork: e26946300b0ab7bb6c4a6348090e93fa21f33a9d - React-RCTSettings: d0d37cb521b7470c998595a44f05847777cc3f42 - React-RCTText: b074d89033583d4f2eb5faf7ea2db3a13c7553a2 - React-RCTVibration: 2105b2e0e2b66a6408fc69a46c8a7fb5b2fdade0 - React-RCTWebSocket: cd932a16b7214898b6b7f788c8bddb3637246ac4 + react-native-image-picker: 7a85cf7b0a53845f03ae52fb4592a2748ded069b + react-native-randombytes: 3638d24759d67c68f6ccba60c52a7a8a8faa6a23 + react-native-restart: fff228304625f55de2ebd4de43938110f4c888ed + react-native-safe-area-context: 344b969c45af3d8464d36e8dea264942992ef033 + react-native-slider: 884693dd50f84745baa511ecdcde4c16f32182fb + react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865 + React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76 + React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360 + React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72 + React-RCTImage: 6b8e8df449eb7c814c99a92d6b52de6fe39dea4e + React-RCTLinking: 121bb231c7503cf9094f4d8461b96a130fabf4a5 + React-RCTNetwork: fb353640aafcee84ca8b78957297bd395f065c9a + React-RCTSettings: 8db258ea2a5efee381fcf7a6d5044e2f8b68b640 + React-RCTText: 9ccc88273e9a3aacff5094d2175a605efa854dbe + React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad + ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd ReactNativePrivacySnapshot: cc295e45dc22810e9ff2c93380d643de20a77015 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa - RNCAsyncStorage: 5ae4d57458804e99f73d427214442a6b10a53856 - RNDeviceInfo: 12faae605ba42a1a5041c3c41a77834bc23f049d + RNCAsyncStorage: 453cd7c335ec9ba3b877e27d02238956b76f3268 + RNCClipboard: 48eaf27bea3de7c9a265529725434268d47a2ee9 + RNCMaskedView: 5a8ec07677aa885546a0d98da336457e2bea557f + RNDefaultPreference: 628cb35719f2fe4111c000ccfa7e186400bbc47e + RNDeviceInfo: 722dc13c269b9dbf305aa4b790d36731602e99b7 + RNFastImage: e19ba191922e7dab9d932a4d59d62d76660aa222 RNFS: c9bbde46b0d59619f8e7b735991c60e0f73d22c1 - RNGestureHandler: 5329a942fce3d41c68b84c2c2276ce06a696d8b0 + RNGestureHandler: 8f09cd560f8d533eb36da5a6c5a843af9f056b38 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa + RNLocalize: b6df30cc25ae736d37874f9bce13351db2f56796 + RNQuickAction: eca9a5dd04b5cdf8a0dd32d8be8844dc33aba2bd RNRate: 29be49c24b314c4e8ec09d848c3965f61cb0be47 + RNReanimated: b5ccb50650ba06f6e749c7c329a1bc3ae0c88b43 + RNScreens: c526239bbe0e957b988dacc8d75ac94ec9cb19da RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 2803ba8c8129dcf26b79e9b4d8c80168be6e4390 RNShare: 8b171d4b43c1d886917fdd303bf7a4b87167b05c RNSVG: 0eb087cfb5d7937be93c45b163b26352a647e681 RNVectorIcons: 0bb4def82230be1333ddaeee9fcba45f0b288ed4 - Sentry: 5d312a04e369154aeac616214f4dfc3cbcc8b296 - swift_qrcodejs: 4d024fc98b0778b804ec6a5c810880fd092aec9d - TcpSockets: 8d839b9b14f6f344d98e4642ded13ab3112b462d - ToolTipMenu: bdcaa0e888bcf44778a67fe34639b094352e904e - yoga: 312528f5bbbba37b4dcea5ef00e8b4033fdd9411 + RNWatch: a14e378448e187cc12f307f61d41fe8a65400e86 + SDWebImage: cf6922231e95550934da2ada0f20f2becf2ceba9 + SDWebImageWebPCoder: d0dac55073088d24b2ac1b191a71a8f8d0adac21 + Sentry: 14bdd673870e8cf64932b149fad5bbbf39a9b390 + TcpSockets: a8eb6b5867fe643e6cfed5db2e4de62f4d1e8fd0 + ToolTipMenu: 8ac61aded0fbc4acfe7e84a7d0c9479d15a9a382 + Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b -PODFILE CHECKSUM: 4ac476f363ad99e4ad854f97a5c1854ea0423bf6 +PODFILE CHECKSUM: f708eddb7bb6b7e7bfacaa787b3c1a97c45870fb -COCOAPODS: 1.7.5 +COCOAPODS: 1.9.3 diff --git a/ios/BlueWallet-Bridging-Header.h b/ios/VelesWallet-Bridging-Header.h similarity index 100% rename from ios/BlueWallet-Bridging-Header.h rename to ios/VelesWallet-Bridging-Header.h diff --git a/ios/VelesWallet.xcodeproj/project.pbxproj b/ios/VelesWallet.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..3f7e6e168f --- /dev/null +++ b/ios/VelesWallet.xcodeproj/project.pbxproj @@ -0,0 +1,656 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 3208E93922F63279007F5A27 /* AppCenter-Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3208E93822F63279007F5A27 /* AppCenter-Config.plist */; }; + 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; + 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; + 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; + 906451CAD44154C2950030EC /* libPods-VelesWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 731973BA0AC6EA78962CE5B6 /* libPods-VelesWallet.a */; }; + A298644F243B5FDD00A8F351 /* Ubuntu-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A298644B243B5FDD00A8F351 /* Ubuntu-Medium.ttf */; }; + A2986450243B5FDD00A8F351 /* Ubuntu-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A298644C243B5FDD00A8F351 /* Ubuntu-Light.ttf */; }; + A2986451243B5FDD00A8F351 /* Ubuntu-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A298644D243B5FDD00A8F351 /* Ubuntu-Bold.ttf */; }; + A2986452243B5FDD00A8F351 /* Ubuntu-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A298644E243B5FDD00A8F351 /* Ubuntu-Regular.ttf */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 3271B0B6236E2E0700DA766F /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + B40D4E2D225841C300428FCC /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 04466491BA2D4876A71222FC /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* VelesWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VelesWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = VelesWallet/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = VelesWallet/AppDelegate.m; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = VelesWallet/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = VelesWallet/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = VelesWallet/main.m; sourceTree = ""; }; + 154B05BEF3C3512F67A08374 /* libPods-VelesWalletWatch Extension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VelesWalletWatch Extension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativePermissions.a; sourceTree = ""; }; + 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNRandomBytes-tvOS.a"; sourceTree = ""; }; + 2654894D4DE44A4C8F71773D /* CoreData.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 2FCC2CD6FF4448229D0CE0F3 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; + 3208E93822F63279007F5A27 /* AppCenter-Config.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AppCenter-Config.plist"; sourceTree = ""; }; + 3271B0AA236E2E0700DA766F /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; + 32B5A3282334450100F8D608 /* VelesWallet-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "VelesWallet-Bridging-Header.h"; sourceTree = ""; }; + 32B5A3292334450100F8D608 /* Bridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bridge.swift; sourceTree = ""; }; + 32F0A2502310B0910095C559 /* VelesWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = VelesWallet.entitlements; path = VelesWallet/VelesWallet.entitlements; sourceTree = ""; }; + 334051161886419EA186F4BA /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; + 3703B10AAB374CF896CCC2EA /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; + 3F7F1B8332C6439793D55B45 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; + 44BC9E3EE0E9476A830CCCB9 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; + 47564776A7A3427DB36C087D /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = ""; }; + 47C436B1EF23484B8181DBEA /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; + 4D746BBE67E84684848246E2 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; + 4F12F501B686459183E0BE0D /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; + 5A8F67CF29564E41882ECEF8 /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Brands.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"; sourceTree = ""; }; + 6A65D81712444D37BA152B06 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = ""; }; + 6EB3338E347F4AFAA8C85C04 /* libRNDeviceInfo-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNDeviceInfo-tvOS.a"; sourceTree = ""; }; + 70089FECE936F9A0AC45B7CE /* libPods-VelesWalletTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VelesWalletTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 70C9C17A3F52430B99582AF4 /* libRNCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCamera.a; sourceTree = ""; }; + 731973BA0AC6EA78962CE5B6 /* libPods-VelesWallet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VelesWallet.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 78A87E7251D94144A71A2F67 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = ""; }; + 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; }; + 8448882949434D41A054C0B2 /* ToolTipMenuTests.xctest */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = ToolTipMenuTests.xctest; sourceTree = ""; }; + 8637D4B5E14D443A9031DA95 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = ""; }; + 90F86BC5194548CA87D729A9 /* libToolTipMenu.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libToolTipMenu.a; sourceTree = ""; }; + 94565BFC6A0C4235B3EC7B01 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; + 9B3A324B70BC8C6D9314FD4F /* Pods-VelesWallet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VelesWallet.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VelesWallet/Pods-VelesWallet.debug.xcconfig"; sourceTree = ""; }; + 9DF4E6C040764E4BA1ACC1EB /* libTcpSockets.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libTcpSockets.a; sourceTree = ""; }; + 9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = ""; }; + A298644B243B5FDD00A8F351 /* Ubuntu-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Ubuntu-Medium.ttf"; path = "../src/assets/fonts/Ubuntu-Medium.ttf"; sourceTree = ""; }; + A298644C243B5FDD00A8F351 /* Ubuntu-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Ubuntu-Light.ttf"; path = "../src/assets/fonts/Ubuntu-Light.ttf"; sourceTree = ""; }; + A298644D243B5FDD00A8F351 /* Ubuntu-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Ubuntu-Bold.ttf"; path = "../src/assets/fonts/Ubuntu-Bold.ttf"; sourceTree = ""; }; + A298644E243B5FDD00A8F351 /* Ubuntu-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Ubuntu-Regular.ttf"; path = "../src/assets/fonts/Ubuntu-Regular.ttf"; sourceTree = ""; }; + A7C4B1FDAD264618BAF8C335 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = ""; }; + A9166D490AEF4938BD6621CF /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; }; + AB2325650CE04F018697ACFE /* libRNReactNativeHapticFeedback.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNReactNativeHapticFeedback.a; sourceTree = ""; }; + B43B69B8225C462E00925B1E /* libPods-RCTLinking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libPods-RCTLinking.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B43B69BA225C46D800925B1E /* libRCTLinking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libRCTLinking.a; sourceTree = BUILT_PRODUCTS_DIR; }; + B43D046E22584C1B00FBAA95 /* libRNWatch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libRNWatch.a; sourceTree = BUILT_PRODUCTS_DIR; }; + B459EE96941AE09BCB547DC0 /* Pods-VelesWallet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VelesWallet.release.xcconfig"; path = "Pods/Target Support Files/Pods-VelesWallet/Pods-VelesWallet.release.xcconfig"; sourceTree = ""; }; + B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCSlider.a; sourceTree = ""; }; + B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTQRCodeLocalImage.a; sourceTree = ""; }; + B9D9B3A7B2CB4255876B67AF /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + BB0B98D8054B95DEE18B907F /* libPods-VelesWalletWatch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VelesWalletWatch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + BBA99996E6FA4B49ACE0BEFA /* libRNRate.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRate.a; sourceTree = ""; }; + C4496FB303574862B40A878A /* AntDesign.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = AntDesign.ttf; path = "../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf"; sourceTree = ""; }; + CA741BA794714D3F80251AC9 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; + CD746B955C55410793BB72C0 /* libRNGestureHandler.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNGestureHandler.a; sourceTree = ""; }; + CF4A4D7AAD974D67A2D62B3E /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; + D6EC5B694E664FD7B02EDD2F /* libRNSentry.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSentry.a; sourceTree = ""; }; + E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = ""; }; + E8E8CE89B3D142C6A8A56C34 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; + F11DD40F6E9A4F13B3410B94 /* libRNSentry-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSentry-tvOS.a"; sourceTree = ""; }; + F6F53AFC25FB422485CB22D6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + FC63C7054F1C4FDFB7A830E5 /* libRCTPrivacySnapshot.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTPrivacySnapshot.a; sourceTree = ""; }; + FC98DC24A81A463AB8B2E6B1 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = ""; }; + FD7977067E1A496F94D8B1B7 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 906451CAD44154C2950030EC /* libPods-VelesWallet.a in Frameworks */, + 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */, + 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* VelesWallet */ = { + isa = PBXGroup; + children = ( + 32F0A2502310B0910095C559 /* VelesWallet.entitlements */, + 3208E93822F63279007F5A27 /* AppCenter-Config.plist */, + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB71A68108700A75B9A /* main.m */, + 32B5A3292334450100F8D608 /* Bridge.swift */, + 32B5A3282334450100F8D608 /* VelesWallet-Bridging-Header.h */, + ); + name = VelesWallet; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + B43B69BA225C46D800925B1E /* libRCTLinking.a */, + B43B69B8225C462E00925B1E /* libPods-RCTLinking.a */, + B43D046E22584C1B00FBAA95 /* libRNWatch.a */, + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + ED2971642150620600B7C4FE /* JavaScriptCore.framework */, + 2D16E6891FA4F8E400B85C8A /* libReact.a */, + 2654894D4DE44A4C8F71773D /* CoreData.framework */, + F6F53AFC25FB422485CB22D6 /* SystemConfiguration.framework */, + B9D9B3A7B2CB4255876B67AF /* libz.tbd */, + 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */, + BB0B98D8054B95DEE18B907F /* libPods-VelesWalletWatch.a */, + 154B05BEF3C3512F67A08374 /* libPods-VelesWalletWatch Extension.a */, + 70089FECE936F9A0AC45B7CE /* libPods-VelesWalletTests.a */, + 731973BA0AC6EA78962CE5B6 /* libPods-VelesWallet.a */, + 3271B0AA236E2E0700DA766F /* NotificationCenter.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 4B0CACE36C3348E1BCEA92C8 /* Resources */ = { + isa = PBXGroup; + children = ( + C4496FB303574862B40A878A /* AntDesign.ttf */, + 44BC9E3EE0E9476A830CCCB9 /* Entypo.ttf */, + 3F7F1B8332C6439793D55B45 /* EvilIcons.ttf */, + A9166D490AEF4938BD6621CF /* Feather.ttf */, + 334051161886419EA186F4BA /* FontAwesome.ttf */, + 5A8F67CF29564E41882ECEF8 /* FontAwesome5_Brands.ttf */, + 47564776A7A3427DB36C087D /* FontAwesome5_Regular.ttf */, + 78A87E7251D94144A71A2F67 /* FontAwesome5_Solid.ttf */, + 04466491BA2D4876A71222FC /* Foundation.ttf */, + CA741BA794714D3F80251AC9 /* Ionicons.ttf */, + 2FCC2CD6FF4448229D0CE0F3 /* MaterialCommunityIcons.ttf */, + CF4A4D7AAD974D67A2D62B3E /* MaterialIcons.ttf */, + E8E8CE89B3D142C6A8A56C34 /* Octicons.ttf */, + 4D746BBE67E84684848246E2 /* SimpleLineIcons.ttf */, + 47C436B1EF23484B8181DBEA /* Zocial.ttf */, + A298644D243B5FDD00A8F351 /* Ubuntu-Bold.ttf */, + A298644C243B5FDD00A8F351 /* Ubuntu-Light.ttf */, + A298644B243B5FDD00A8F351 /* Ubuntu-Medium.ttf */, + A298644E243B5FDD00A8F351 /* Ubuntu-Regular.ttf */, + ); + name = Resources; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* VelesWallet */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + B40FE50A21FAD228005D5578 /* Recovered References */, + 4B0CACE36C3348E1BCEA92C8 /* Resources */, + A9B365F08E5E8EADC056DBC4 /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* VelesWallet.app */, + ); + name = Products; + sourceTree = ""; + }; + A9B365F08E5E8EADC056DBC4 /* Pods */ = { + isa = PBXGroup; + children = ( + 9B3A324B70BC8C6D9314FD4F /* Pods-VelesWallet.debug.xcconfig */, + B459EE96941AE09BCB547DC0 /* Pods-VelesWallet.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + B40FE50A21FAD228005D5578 /* Recovered References */ = { + isa = PBXGroup; + children = ( + 70C9C17A3F52430B99582AF4 /* libRNCamera.a */, + FD7977067E1A496F94D8B1B7 /* libRNDeviceInfo.a */, + 8637D4B5E14D443A9031DA95 /* libRNFS.a */, + CD746B955C55410793BB72C0 /* libRNGestureHandler.a */, + AB2325650CE04F018697ACFE /* libRNReactNativeHapticFeedback.a */, + 3703B10AAB374CF896CCC2EA /* libBVLinearGradient.a */, + 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */, + 6A65D81712444D37BA152B06 /* libRNRandomBytes.a */, + BBA99996E6FA4B49ACE0BEFA /* libRNRate.a */, + D6EC5B694E664FD7B02EDD2F /* libRNSentry.a */, + 6EB3338E347F4AFAA8C85C04 /* libRNDeviceInfo-tvOS.a */, + 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */, + F11DD40F6E9A4F13B3410B94 /* libRNSentry-tvOS.a */, + 4F12F501B686459183E0BE0D /* libRNVectorIcons.a */, + E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */, + 94565BFC6A0C4235B3EC7B01 /* libRNSVG.a */, + 9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */, + A7C4B1FDAD264618BAF8C335 /* libRNCWebView.a */, + FC98DC24A81A463AB8B2E6B1 /* libRNImagePicker.a */, + B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */, + 9DF4E6C040764E4BA1ACC1EB /* libTcpSockets.a */, + 90F86BC5194548CA87D729A9 /* libToolTipMenu.a */, + 8448882949434D41A054C0B2 /* ToolTipMenuTests.xctest */, + FC63C7054F1C4FDFB7A830E5 /* libRCTPrivacySnapshot.a */, + B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */, + ); + name = "Recovered References"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* VelesWallet */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "VelesWallet" */; + buildPhases = ( + 6F7747C31A9EE6DDC5108476 /* [CP] Check Pods Manifest.lock */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + B40D4E2D225841C300428FCC /* Embed Watch Content */, + 791C03B6EF06B63A39F55115 /* [CP] Copy Pods Resources */, + 3271B0B6236E2E0700DA766F /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = VelesWallet; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* VelesWallet.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1120; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + DevelopmentTeam = M3A8VW38MH; + LastSwiftMigration = 1030; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Keychain = { + enabled = 0; + }; + }; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "VelesWallet" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* VelesWallet */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + A2986451243B5FDD00A8F351 /* Ubuntu-Bold.ttf in Resources */, + A2986450243B5FDD00A8F351 /* Ubuntu-Light.ttf in Resources */, + A298644F243B5FDD00A8F351 /* Ubuntu-Medium.ttf in Resources */, + A2986452243B5FDD00A8F351 /* Ubuntu-Regular.ttf in Resources */, + 3208E93922F63279007F5A27 /* AppCenter-Config.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; + }; + 6F7747C31A9EE6DDC5108476 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-VelesWallet-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 791C03B6EF06B63A39F55115 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-VelesWallet/Pods-VelesWallet-resources.sh", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-VelesWallet/Pods-VelesWallet-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9B3A324B70BC8C6D9314FD4F /* Pods-VelesWallet.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = VelesWallet/VelesWallet.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = NO; + DEVELOPMENT_TEAM = ZBGV64T58H; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", + ); + INFOPLIST_FILE = VelesWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = network.veles.wallet; + PRODUCT_NAME = VelesWallet; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "VelesWallet-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B459EE96941AE09BCB547DC0 /* Pods-VelesWallet.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = VelesWallet/VelesWallet.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = P869R6AYRW; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-splash-screen/ios", + ); + INFOPLIST_FILE = VelesWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = network.veles.wallet; + PRODUCT_NAME = VelesWallet; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "VelesWallet-Bridging-Header.h"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_VERSION = 4.2; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "VelesWallet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "VelesWallet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme b/ios/VelesWallet.xcodeproj/xcshareddata/xcschemes/VelesWallet.xcscheme similarity index 77% rename from ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme rename to ios/VelesWallet.xcodeproj/xcshareddata/xcschemes/VelesWallet.xcscheme index def473827b..7bc55b77f7 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme +++ b/ios/VelesWallet.xcodeproj/xcshareddata/xcschemes/VelesWallet.xcscheme @@ -15,9 +15,9 @@ + BuildableName = "VelesWallet.app" + BlueprintName = "VelesWallet" + ReferencedContainer = "container:VelesWallet.xcodeproj"> @@ -31,9 +31,9 @@ + BuildableName = "VelesWallet.app" + BlueprintName = "VelesWallet" + ReferencedContainer = "container:VelesWallet.xcodeproj"> @@ -42,9 +42,9 @@ + BuildableName = "VelesWalletTests.xctest" + BlueprintName = "VelesWalletTests" + ReferencedContainer = "container:VelesWallet.xcodeproj"> @@ -64,9 +64,9 @@ + BuildableName = "VelesWallet.app" + BlueprintName = "VelesWallet" + ReferencedContainer = "container:VelesWallet.xcodeproj"> @@ -81,9 +81,9 @@ + BuildableName = "VelesWallet.app" + BlueprintName = "VelesWallet" + ReferencedContainer = "container:VelesWallet.xcodeproj"> diff --git a/ios/BlueWallet.xcworkspace/contents.xcworkspacedata b/ios/VelesWallet.xcworkspace/contents.xcworkspacedata similarity index 79% rename from ios/BlueWallet.xcworkspace/contents.xcworkspacedata rename to ios/VelesWallet.xcworkspace/contents.xcworkspacedata index 2fa43bba7b..e6800d1590 100644 --- a/ios/BlueWallet.xcworkspace/contents.xcworkspacedata +++ b/ios/VelesWallet.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:VelesWallet.xcodeproj"> diff --git a/ios/BlueWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/VelesWallet.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/BlueWallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to ios/VelesWallet.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/ios/BlueWallet.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/VelesWallet.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from ios/BlueWallet.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to ios/VelesWallet.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/ios/BlueWallet/AppDelegate.h b/ios/VelesWallet/AppDelegate.h similarity index 100% rename from ios/BlueWallet/AppDelegate.h rename to ios/VelesWallet/AppDelegate.h diff --git a/ios/BlueWallet/AppDelegate.m b/ios/VelesWallet/AppDelegate.m similarity index 80% rename from ios/BlueWallet/AppDelegate.m rename to ios/VelesWallet/AppDelegate.m index d82671770c..e7754d907f 100644 --- a/ios/BlueWallet/AppDelegate.m +++ b/ios/VelesWallet/AppDelegate.m @@ -10,25 +10,19 @@ #import #import #import -#import -#import -#import -#import +#import "RNQuickActionManager.h" +#import "RNSplashScreen.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [AppCenterReactNative register]; - [AppCenterReactNativeAnalytics registerWithInitiallyEnabled:true]; - [AppCenterReactNativeCrashes registerWithAutomaticProcessing]; - NSURL *jsCodeLocation; jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation - moduleName:@"BlueWallet" + moduleName:@"VelesWallet" initialProperties:nil launchOptions:launchOptions]; rootView.backgroundColor = [UIColor whiteColor]; @@ -38,6 +32,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; + [RNSplashScreen show]; return YES; } @@ -49,4 +44,8 @@ - (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdenti return NO; } +- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL succeeded)) completionHandler { + [RNQuickActionManager onQuickActionPress:shortcutItem completionHandler:completionHandler]; +} + @end diff --git a/ios/BlueWallet/Base.lproj/LaunchScreen.xib b/ios/VelesWallet/Base.lproj/LaunchScreen.xib similarity index 61% rename from ios/BlueWallet/Base.lproj/LaunchScreen.xib rename to ios/VelesWallet/Base.lproj/LaunchScreen.xib index 5012a0afc4..611b334edd 100644 --- a/ios/BlueWallet/Base.lproj/LaunchScreen.xib +++ b/ios/VelesWallet/Base.lproj/LaunchScreen.xib @@ -1,11 +1,9 @@ - - - - + + - + @@ -14,6 +12,12 @@ + + + + + + diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d63ba32bad --- /dev/null +++ b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "filename" : "Icon-20x20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-20x20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "Icon-29x29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-29x29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "Icon-40x40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-40x40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "Icon-60x60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "Icon-60x60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "Icon-20x20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "Icon-20x20@2x-1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-29x29@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "Icon-29x29@2x-1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-20x20@2x-2.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "Icon-40x40@2x-1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-76x76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "Icon-76x76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "Icon-83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "Icon-marketing-1024x1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@1x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@1x.png new file mode 100644 index 0000000000..e66d9c6bc4 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@1x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x-1.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x-1.png new file mode 100644 index 0000000000..51df7e5832 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x-2.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x-2.png new file mode 100644 index 0000000000..6737ad7e5c Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x-2.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png new file mode 100644 index 0000000000..1d894d8306 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@2x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png new file mode 100644 index 0000000000..b63f6bcc93 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-20x20@3x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@1x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@1x.png new file mode 100644 index 0000000000..8084bd9110 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@1x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x-1.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x-1.png new file mode 100644 index 0000000000..2ed2681563 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png new file mode 100644 index 0000000000..bf6c5f0586 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@2x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png new file mode 100644 index 0000000000..b5b676ca06 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-29x29@3x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x-1.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x-1.png new file mode 100644 index 0000000000..e8b5348ba1 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png new file mode 100644 index 0000000000..081b97e582 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@2x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png new file mode 100644 index 0000000000..6a15fa7b2d Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-40x40@3x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png new file mode 100644 index 0000000000..3d0864be80 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-60x60@2x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png new file mode 100644 index 0000000000..82166f4626 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-60x60@3x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-76x76@1x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-76x76@1x.png new file mode 100644 index 0000000000..2a628a8ce1 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-76x76@1x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-76x76@2x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-76x76@2x.png new file mode 100644 index 0000000000..aad12dcba1 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-76x76@2x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png new file mode 100644 index 0000000000..f5a6d630bd Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png differ diff --git a/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png new file mode 100644 index 0000000000..d4cedc3598 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/AppIcon.appiconset/Icon-marketing-1024x1024.png differ diff --git a/ios/BlueWallet/Images.xcassets/Contents.json b/ios/VelesWallet/Images.xcassets/Contents.json similarity index 100% rename from ios/BlueWallet/Images.xcassets/Contents.json rename to ios/VelesWallet/Images.xcassets/Contents.json diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/Contents.json b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..43b979ee5e --- /dev/null +++ b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,216 @@ +{ + "images" : [ + { + "extent" : "full-screen", + "filename" : "LaunchImage-1242@3x~iphoneXsMax-portrait_1242x2688.png", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "portrait", + "scale" : "3x", + "subtype" : "2688h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-2688@3x~iphoneXsMax-landscape_2688x1242.png", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "landscape", + "scale" : "3x", + "subtype" : "2688h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-828@2x~iphoneXr-portrait_828x1792.png", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "1792h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-1792@2x~iphoneXr-landscape_1792x828.png", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "landscape", + "scale" : "2x", + "subtype" : "1792h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-1125@3x~iphoneX-portrait_1125x2436.png", + "idiom" : "iphone", + "minimum-system-version" : "11.0", + "orientation" : "portrait", + "scale" : "3x", + "subtype" : "2436h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-2436@3x~iphoneX-landscape_2436x1125.png", + "idiom" : "iphone", + "minimum-system-version" : "11.0", + "orientation" : "landscape", + "scale" : "3x", + "subtype" : "2436h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-1242@3x~iphone6s-portrait_1242x2208.png", + "idiom" : "iphone", + "minimum-system-version" : "8.0", + "orientation" : "portrait", + "scale" : "3x", + "subtype" : "736h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-1242@3x~iphone6s-landscape_2208x1242.png", + "idiom" : "iphone", + "minimum-system-version" : "8.0", + "orientation" : "landscape", + "scale" : "3x", + "subtype" : "736h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-750@2x~iphone6-portrait_750x1334.png", + "idiom" : "iphone", + "minimum-system-version" : "8.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "667h" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage~iphone_640x960.png", + "idiom" : "iphone", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-568h@2x~iphone_640x1136.png", + "idiom" : "iphone", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "retina4" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Portrait~ipad_768x1024.png", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Landscape~ipad_1024x768.png", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "landscape", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Portrait@2x~ipad_1536x2048.png", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Landscape@2x~ipad_2048x1536.png", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "landscape", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage~iphone-320x480.png", + "idiom" : "iphone", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage~iphone_640x960-1.png", + "idiom" : "iphone", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-568h@2x~iphone_640x1136-1.png", + "idiom" : "iphone", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "retina4" + }, + { + "extent" : "to-status-bar", + "filename" : "LaunchImage-Portrait~ipad_768x1024-1.png", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Portrait~ipad_768x1024-2.png", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "to-status-bar", + "filename" : "LaunchImage-Landscape~ipad_1024x748.png", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Landscape~ipad_1024x768-1.png", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "1x" + }, + { + "extent" : "to-status-bar", + "filename" : "LaunchImage-Portrait@2x~ipad_1536x2008.png", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Portrait@2x~ipad_1536x2048-1.png", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "to-status-bar", + "filename" : "LaunchImage-Landscape@2x~ipad_2048x1496.png", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "filename" : "LaunchImage-Landscape@2x~ipad_2048x1536-1.png", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1125@3x~iphoneX-portrait_1125x2436.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1125@3x~iphoneX-portrait_1125x2436.png new file mode 100644 index 0000000000..5f16990976 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1125@3x~iphoneX-portrait_1125x2436.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphone6s-landscape_2208x1242.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphone6s-landscape_2208x1242.png new file mode 100644 index 0000000000..f1d0feac98 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphone6s-landscape_2208x1242.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphone6s-portrait_1242x2208.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphone6s-portrait_1242x2208.png new file mode 100644 index 0000000000..a17ae1bbec Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphone6s-portrait_1242x2208.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphoneXsMax-portrait_1242x2688.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphoneXsMax-portrait_1242x2688.png new file mode 100644 index 0000000000..9eb4c2f38a Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1242@3x~iphoneXsMax-portrait_1242x2688.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1792@2x~iphoneXr-landscape_1792x828.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1792@2x~iphoneXr-landscape_1792x828.png new file mode 100644 index 0000000000..25e13e52a2 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-1792@2x~iphoneXr-landscape_1792x828.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-2436@3x~iphoneX-landscape_2436x1125.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-2436@3x~iphoneX-landscape_2436x1125.png new file mode 100644 index 0000000000..21c0916be5 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-2436@3x~iphoneX-landscape_2436x1125.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-2688@3x~iphoneXsMax-landscape_2688x1242.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-2688@3x~iphoneXsMax-landscape_2688x1242.png new file mode 100644 index 0000000000..305580f69f Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-2688@3x~iphoneXsMax-landscape_2688x1242.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-568h@2x~iphone_640x1136-1.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-568h@2x~iphone_640x1136-1.png new file mode 100644 index 0000000000..57277cca0e Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-568h@2x~iphone_640x1136-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-568h@2x~iphone_640x1136.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-568h@2x~iphone_640x1136.png new file mode 100644 index 0000000000..578e01f12d Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-568h@2x~iphone_640x1136.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-750@2x~iphone6-portrait_750x1334.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-750@2x~iphone6-portrait_750x1334.png new file mode 100644 index 0000000000..04f367e4c0 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-750@2x~iphone6-portrait_750x1334.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-828@2x~iphoneXr-portrait_828x1792.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-828@2x~iphoneXr-portrait_828x1792.png new file mode 100644 index 0000000000..aaf2971469 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-828@2x~iphoneXr-portrait_828x1792.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1496.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1496.png new file mode 100644 index 0000000000..fc51d22b15 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1496.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1536-1.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1536-1.png new file mode 100644 index 0000000000..c473472bdb Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1536-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1536.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1536.png new file mode 100644 index 0000000000..6a55a8a060 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape@2x~ipad_2048x1536.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x748.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x748.png new file mode 100644 index 0000000000..726044d5d2 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x748.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x768-1.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x768-1.png new file mode 100644 index 0000000000..d1b3d61e6a Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x768-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x768.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x768.png new file mode 100644 index 0000000000..73ca16ae60 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Landscape~ipad_1024x768.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2008.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2008.png new file mode 100644 index 0000000000..d0a38cf917 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2008.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2048-1.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2048-1.png new file mode 100644 index 0000000000..d2792d2852 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2048-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2048.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2048.png new file mode 100644 index 0000000000..30c7677976 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait@2x~ipad_1536x2048.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024-1.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024-1.png new file mode 100644 index 0000000000..c862eb8a9d Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024-2.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024-2.png new file mode 100644 index 0000000000..8ea71787bf Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024-2.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024.png new file mode 100644 index 0000000000..abe0cabf6f Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage-Portrait~ipad_768x1024.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone-320x480.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone-320x480.png new file mode 100644 index 0000000000..efae7131d6 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone-320x480.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone_640x960-1.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone_640x960-1.png new file mode 100644 index 0000000000..33ff21dfdd Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone_640x960-1.png differ diff --git a/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone_640x960.png b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone_640x960.png new file mode 100644 index 0000000000..0f5d88b208 Binary files /dev/null and b/ios/VelesWallet/Images.xcassets/LaunchImage.launchimage/LaunchImage~iphone_640x960.png differ diff --git a/ios/BlueWallet/Info.plist b/ios/VelesWallet/Info.plist similarity index 87% rename from ios/BlueWallet/Info.plist rename to ios/VelesWallet/Info.plist index 0ec27310fb..044eab28df 100644 --- a/ios/BlueWallet/Info.plist +++ b/ios/VelesWallet/Info.plist @@ -5,9 +5,15 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - BlueWallet + VelesWallet CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleGetInfoString + + CFBundleIcons + + CFBundleIcons~ipad + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -17,7 +23,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.7.4 + 5.1.1 CFBundleSignature ???? CFBundleURLTypes @@ -29,16 +35,18 @@ bitcoin lightning - bluewallet + veleswallet lapp blue CFBundleVersion - 232 + $(CURRENT_PROJECT_VERSION) ITSAppUsesNonExemptEncryption + LSApplicationCategoryType + LSRequiresIPhoneOS NSAppTransportSecurity @@ -56,18 +64,18 @@ NSAppleMusicUsageDescription This alert should not show up as we do not require this data - NSFaceIDUsageDescription - In order to confirm your identity, we need your permission to use FaceID. NSBluetoothPeripheralUsageDescription This alert should not show up as we do not require this data NSCalendarsUsageDescription This alert should not show up as we do not require this data NSCameraUsageDescription - In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. - NSLocationWhenInUseUsageDescription - This alert should not show up as we do not require this data + In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. + NSFaceIDUsageDescription + In order to confirm your identity, we need your permission to use FaceID. NSLocationAlwaysUsageDescription This alert should not show up as we do not require this data + NSLocationWhenInUseUsageDescription + This alert should not show up as we do not require this data NSMicrophoneUsageDescription This alert should not show up as we do not require this data NSMotionUsageDescription @@ -95,9 +103,11 @@ Octicons.ttf SimpleLineIcons.ttf Zocial.ttf + Ubuntu-Bold.ttf + Ubuntu-Light.ttf + Ubuntu-Medium.ttf + Ubuntu-Regular.ttf - UILaunchStoryboardName - LaunchScreen UIRequiredDeviceCapabilities armv7 diff --git a/ios/BlueWallet/BlueWallet.entitlements b/ios/VelesWallet/VelesWallet.entitlements similarity index 100% rename from ios/BlueWallet/BlueWallet.entitlements rename to ios/VelesWallet/VelesWallet.entitlements diff --git a/ios/BlueWallet/main.m b/ios/VelesWallet/main.m similarity index 100% rename from ios/BlueWallet/main.m rename to ios/VelesWallet/main.m diff --git a/ios/fastlane/metadata/copyright.txt b/ios/fastlane/metadata/copyright.txt index ddacfeeffb..a73d39bebc 100644 --- a/ios/fastlane/metadata/copyright.txt +++ b/ios/fastlane/metadata/copyright.txt @@ -1 +1 @@ -2019 BlueWallet Services S.R.L. +2019 VelesWallet Services S.R.L. diff --git a/ios/fastlane/metadata/da/description.txt b/ios/fastlane/metadata/da/description.txt index 74a13afbdb..e5e76afc6e 100644 --- a/ios/fastlane/metadata/da/description.txt +++ b/ios/fastlane/metadata/da/description.txt @@ -1,6 +1,6 @@ Store, send and receive bitcoin with the wallet focus on security and simplicity. -On BlueWallet you own you private keys. A Bitcoin wallet focused on us the users. +On VelesWallet you own you private keys. A Bitcoin wallet focused on us the users. You can instantly transact with anyone in the world and transform the financial system right from your pocket. diff --git a/ios/fastlane/metadata/da/name.txt b/ios/fastlane/metadata/da/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/da/name.txt +++ b/ios/fastlane/metadata/da/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/da/privacy_url.txt b/ios/fastlane/metadata/da/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/da/privacy_url.txt +++ b/ios/fastlane/metadata/da/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/da/support_url.txt b/ios/fastlane/metadata/da/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/da/support_url.txt +++ b/ios/fastlane/metadata/da/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/en-US/description.txt b/ios/fastlane/metadata/en-US/description.txt index a60eece66f..ba2b93f80f 100644 --- a/ios/fastlane/metadata/en-US/description.txt +++ b/ios/fastlane/metadata/en-US/description.txt @@ -1,6 +1,6 @@ Store, send and receive bitcoin with the wallet focus on security and simplicity. -On BlueWallet you own you private keys. A Bitcoin wallet focused on us the users. +On VelesWallet you own you private keys. A Bitcoin wallet focused on us the users. You can instantly transact with anyone in the world and transform the financial system right from your pocket. diff --git a/ios/fastlane/metadata/en-US/name.txt b/ios/fastlane/metadata/en-US/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/en-US/name.txt +++ b/ios/fastlane/metadata/en-US/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/en-US/privacy_url.txt b/ios/fastlane/metadata/en-US/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/en-US/privacy_url.txt +++ b/ios/fastlane/metadata/en-US/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/en-US/release_notes.txt b/ios/fastlane/metadata/en-US/release_notes.txt index fd751c6271..46aa75559c 100644 --- a/ios/fastlane/metadata/en-US/release_notes.txt +++ b/ios/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,24 @@ +v4.8.1 +====== + +* FIX: Updated biometrics +* FIX: Import QR Code from screenshot not working + +v4.8.0 +====== + +* ADD: Today Extension and Quick Actions +* ADD: Send max option on advanced menu +* ADD: Add Onchain address view for Lightning +* FIX: Allow textfield to be visible above keyboard +* FIX: lapp browser when typing URL without https scheme it doesnt work +* ADD: Value and memo to the success screen fix logic for both sent and receive +* FIX: layout for small devices with flexbox +* FIX: Dont allow zero invoices to enable create invoice button +* FIX: Change create button on Receive LN payment should be create invoice +* FIX: Update for watch + + v4.7.1 ====== @@ -31,10 +52,4 @@ v4.6.0 * FIX: typo on NL language * FIX: better wallet export QR readability * FIX: RBF tx memo porting -* REF: better initial HD rescan - -v4.5.2 -====== - -* FIX: NaN when sending onchain -* FIX: RBF tx memo porting \ No newline at end of file +* REF: better initial HD rescan \ No newline at end of file diff --git a/ios/fastlane/metadata/en-US/support_url.txt b/ios/fastlane/metadata/en-US/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/en-US/support_url.txt +++ b/ios/fastlane/metadata/en-US/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/es-ES/description.txt b/ios/fastlane/metadata/es-ES/description.txt index a60eece66f..ba2b93f80f 100644 --- a/ios/fastlane/metadata/es-ES/description.txt +++ b/ios/fastlane/metadata/es-ES/description.txt @@ -1,6 +1,6 @@ Store, send and receive bitcoin with the wallet focus on security and simplicity. -On BlueWallet you own you private keys. A Bitcoin wallet focused on us the users. +On VelesWallet you own you private keys. A Bitcoin wallet focused on us the users. You can instantly transact with anyone in the world and transform the financial system right from your pocket. diff --git a/ios/fastlane/metadata/es-ES/name.txt b/ios/fastlane/metadata/es-ES/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/es-ES/name.txt +++ b/ios/fastlane/metadata/es-ES/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/es-ES/privacy_url.txt b/ios/fastlane/metadata/es-ES/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/es-ES/privacy_url.txt +++ b/ios/fastlane/metadata/es-ES/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/es-ES/support_url.txt b/ios/fastlane/metadata/es-ES/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/es-ES/support_url.txt +++ b/ios/fastlane/metadata/es-ES/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/no/description.txt b/ios/fastlane/metadata/no/description.txt index 74a13afbdb..e5e76afc6e 100644 --- a/ios/fastlane/metadata/no/description.txt +++ b/ios/fastlane/metadata/no/description.txt @@ -1,6 +1,6 @@ Store, send and receive bitcoin with the wallet focus on security and simplicity. -On BlueWallet you own you private keys. A Bitcoin wallet focused on us the users. +On VelesWallet you own you private keys. A Bitcoin wallet focused on us the users. You can instantly transact with anyone in the world and transform the financial system right from your pocket. diff --git a/ios/fastlane/metadata/no/name.txt b/ios/fastlane/metadata/no/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/no/name.txt +++ b/ios/fastlane/metadata/no/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/no/privacy_url.txt b/ios/fastlane/metadata/no/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/no/privacy_url.txt +++ b/ios/fastlane/metadata/no/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/no/support_url.txt b/ios/fastlane/metadata/no/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/no/support_url.txt +++ b/ios/fastlane/metadata/no/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/pt-BR/description.txt b/ios/fastlane/metadata/pt-BR/description.txt index 7142301717..94ccce0a48 100644 --- a/ios/fastlane/metadata/pt-BR/description.txt +++ b/ios/fastlane/metadata/pt-BR/description.txt @@ -1,6 +1,6 @@ Guardar, enviar e receber bitcoin com uma carteira focada na segurança e simplicidade. -Na BlueWallet você possui as suas chaves privadas. Uma carteira Bitcoin focada nos usuários. +Na VelesWallet você possui as suas chaves privadas. Uma carteira Bitcoin focada nos usuários. Você pode instantaneamente transacionar com qualquer pessoa no mundo e transformar o sistema financeiro diretamente do seu bolso. @@ -17,7 +17,7 @@ Negação plausível Senha falsa que decripta wallets falsas. Para casos especias onde possa ser obrigado a revelar a sua senha, pode revelar a senha falsa, mantenha as suas bitcoin protegidas Encriptação completa -Construída em cima da multi-camada de encritação do iOS, A BlueWallet encripta tudo com uma adicional senha de usuário +Construída em cima da multi-camada de encritação do iOS, A VelesWallet encripta tudo com uma adicional senha de usuário Carteiras SegWit e HD SegWit suportado (Ajuda a diminuir os fees ainda mais) e carteiras HD activadas diff --git a/ios/fastlane/metadata/pt-BR/name.txt b/ios/fastlane/metadata/pt-BR/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/pt-BR/name.txt +++ b/ios/fastlane/metadata/pt-BR/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/pt-BR/privacy_url.txt b/ios/fastlane/metadata/pt-BR/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/pt-BR/privacy_url.txt +++ b/ios/fastlane/metadata/pt-BR/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/pt-BR/support_url.txt b/ios/fastlane/metadata/pt-BR/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/pt-BR/support_url.txt +++ b/ios/fastlane/metadata/pt-BR/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/pt-PT/description.txt b/ios/fastlane/metadata/pt-PT/description.txt index 7142301717..94ccce0a48 100644 --- a/ios/fastlane/metadata/pt-PT/description.txt +++ b/ios/fastlane/metadata/pt-PT/description.txt @@ -1,6 +1,6 @@ Guardar, enviar e receber bitcoin com uma carteira focada na segurança e simplicidade. -Na BlueWallet você possui as suas chaves privadas. Uma carteira Bitcoin focada nos usuários. +Na VelesWallet você possui as suas chaves privadas. Uma carteira Bitcoin focada nos usuários. Você pode instantaneamente transacionar com qualquer pessoa no mundo e transformar o sistema financeiro diretamente do seu bolso. @@ -17,7 +17,7 @@ Negação plausível Senha falsa que decripta wallets falsas. Para casos especias onde possa ser obrigado a revelar a sua senha, pode revelar a senha falsa, mantenha as suas bitcoin protegidas Encriptação completa -Construída em cima da multi-camada de encritação do iOS, A BlueWallet encripta tudo com uma adicional senha de usuário +Construída em cima da multi-camada de encritação do iOS, A VelesWallet encripta tudo com uma adicional senha de usuário Carteiras SegWit e HD SegWit suportado (Ajuda a diminuir os fees ainda mais) e carteiras HD activadas diff --git a/ios/fastlane/metadata/pt-PT/name.txt b/ios/fastlane/metadata/pt-PT/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/pt-PT/name.txt +++ b/ios/fastlane/metadata/pt-PT/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/pt-PT/privacy_url.txt b/ios/fastlane/metadata/pt-PT/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/pt-PT/privacy_url.txt +++ b/ios/fastlane/metadata/pt-PT/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/pt-PT/support_url.txt b/ios/fastlane/metadata/pt-PT/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/pt-PT/support_url.txt +++ b/ios/fastlane/metadata/pt-PT/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/ru/description.txt b/ios/fastlane/metadata/ru/description.txt index c481a292b0..9950cbae76 100644 --- a/ios/fastlane/metadata/ru/description.txt +++ b/ios/fastlane/metadata/ru/description.txt @@ -22,7 +22,7 @@ Полное шифрование ---------------- -Поверх родного многослойного шифрования iOS, BlueWallet дополнительно шифрует все данные пользовательским паролем. +Поверх родного многослойного шифрования iOS, VelesWallet дополнительно шифрует все данные пользовательским паролем. Не стоит доверять биометрической безопасности Правдопободное отрицание diff --git a/ios/fastlane/metadata/ru/name.txt b/ios/fastlane/metadata/ru/name.txt index cee5ae68d6..4217431753 100644 --- a/ios/fastlane/metadata/ru/name.txt +++ b/ios/fastlane/metadata/ru/name.txt @@ -1 +1 @@ -BlueWallet - Биткоин кошелек +VelesWallet - Биткоин кошелек diff --git a/ios/fastlane/metadata/ru/privacy_url.txt b/ios/fastlane/metadata/ru/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/ru/privacy_url.txt +++ b/ios/fastlane/metadata/ru/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/ru/support_url.txt b/ios/fastlane/metadata/ru/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/ru/support_url.txt +++ b/ios/fastlane/metadata/ru/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/fastlane/metadata/sv/description.txt b/ios/fastlane/metadata/sv/description.txt index 74a13afbdb..e5e76afc6e 100644 --- a/ios/fastlane/metadata/sv/description.txt +++ b/ios/fastlane/metadata/sv/description.txt @@ -1,6 +1,6 @@ Store, send and receive bitcoin with the wallet focus on security and simplicity. -On BlueWallet you own you private keys. A Bitcoin wallet focused on us the users. +On VelesWallet you own you private keys. A Bitcoin wallet focused on us the users. You can instantly transact with anyone in the world and transform the financial system right from your pocket. diff --git a/ios/fastlane/metadata/sv/name.txt b/ios/fastlane/metadata/sv/name.txt index 1cdc33df3f..d9d2e60aef 100644 --- a/ios/fastlane/metadata/sv/name.txt +++ b/ios/fastlane/metadata/sv/name.txt @@ -1 +1 @@ -BlueWallet - Bitcoin wallet +VelesWallet - Bitcoin wallet diff --git a/ios/fastlane/metadata/sv/privacy_url.txt b/ios/fastlane/metadata/sv/privacy_url.txt index 849468985f..8dbe581579 100644 --- a/ios/fastlane/metadata/sv/privacy_url.txt +++ b/ios/fastlane/metadata/sv/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +http://veles.network/privacy.html \ No newline at end of file diff --git a/ios/fastlane/metadata/sv/support_url.txt b/ios/fastlane/metadata/sv/support_url.txt index 0369559b27..ed753c7230 100644 --- a/ios/fastlane/metadata/sv/support_url.txt +++ b/ios/fastlane/metadata/sv/support_url.txt @@ -1 +1 @@ -https://github.com/BlueWallet/BlueWallet/issues +https://github.com/VelesWallet/VelesWallet/issues diff --git a/ios/sentry.properties b/ios/sentry.properties index 4e8977a718..8afeec6dfb 100644 --- a/ios/sentry.properties +++ b/ios/sentry.properties @@ -1,5 +1,5 @@ defaults.url=https://sentry.io/ -defaults.org=bluewallet -defaults.project=bluewallet -auth.token=8020b31b54e94e7b86b4a69f60869f3d5a1320f44efe4f22bb9fa27e0b371448 +defaults.org=velescore +defaults.project=veleswallet +auth.token=12ea7223af134bc188cac392adecf796365b5585f9f144028672a6e51452d8c5 cli.executable=node_modules/@sentry/cli/bin/sentry-cli diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000000..92eff7e537 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,11 @@ +module.exports = { + moduleDirectories: ['node_modules', 'src'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + preset: 'react-native', + setupFilesAfterEnv: ['/tests/setup.js'], + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + transformIgnorePatterns: ['node_modules/(?!(jest-)?react-native|react-navigation|@react-native-community)'], + coveragePathIgnorePatterns: ['/node_modules/'], +}; diff --git a/loc/ZAR_Afr.js b/loc/ZAR_Afr.js deleted file mode 100644 index 7b18a3b62e..0000000000 --- a/loc/ZAR_Afr.js +++ /dev/null @@ -1,236 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'U geheue spasie is nou ge-enkripteer. ‘n Wagwoord word benodig om toegang te verkry. ', - enter_password: 'Sleutel wagwoord in', - bad_password: 'Verkeerde wagwoord, probeer weer', - never: 'nooit', - continue: 'Gaan voort', - ok: 'OK', - }, - wallets: { - select_wallet: 'Kies Beursie', - options: 'opsies', - createBitcoinWallet: - 'U het nie huidiglik `n geldige Bitcoin Beursie nie. Skep of voer eers ‘n Bitcoin Beursie in, sodat ‘n Bitcoin Lightning Beursie geskep en bevonds mag word. Wil U voortgaan?', - list: { - app_name: 'BlueWallet', - title: 'beursies', - header: - 'U beursie verteenwoordig ‘n sleutelkombinasie, bestaande uit geheims (privaat sleutel) en address' + - 'wat u kan gebruik om fondse te ontvang.', - add: 'Skep Beursie', - create_a_wallet: 'Skep ‘n beursie', - create_a_wallet1: 'Dit is gratis so skep', - create_a_wallet2: 'soveel as wat u benodig', - latest_transaction: 'laaste transaksie', - empty_txs1: 'U transaksies is hier beskikbaar,', - empty_txs2: 'huidiglik geen transaksies', - tap_here_to_buy: 'Raak hier om Bitcoin te koop', - }, - reorder: { - title: 'Herorganiseer Beursies', - }, - add: { - title: 'skep beursie', - description: - 'U kan ‘n beursie invoer (in WIF - Wallet Import Format), of ‘n nuwe beursie skep. Beursies ondersteun Segwit as standaard.', - scan: 'Skandeer', - create: 'Skep', - label_new_segwit: 'Nuwe SegWit', - label_new_lightning: 'Nuwe Lightning', - wallet_name: 'beursie naam', - wallet_type: 'tipe', - or: 'of', - import_wallet: 'Beursie Invoer', - imported: 'Ingevoer', - coming_soon: 'In die toekoms', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Beursiet', - address: 'AdresAddress', - type: 'Tipe', - label: 'Etiket', - destination: 'bestemming', - description: 'beskrywing', - are_you_sure: 'Is u Seker?', - yes_delete: 'Ja, vernietig', - no_cancel: 'Nee, kanseleerl', - delete: 'Vernietig', - save: 'Berg', - delete_this_wallet: 'Vernietig hierdie beursie', - export_backup: 'voer uit / kopieer', - buy_bitcoin: 'Koop Bitcoin', - show_xpub: 'Wys beursie XPUB', - }, - export: { - title: 'beursie uitvoer', - }, - xpub: { - title: 'beursie XPUB', - copiedToClipboard: 'Gestuur na klipbord.', - }, - import: { - title: 'Invoer', - explanation: - 'Sleutel mnemonic, privaat sleutel, WIF, of enige text verwysing. BlueWallet sal die korrekte formaat kies en u beursie importeer ', - imported: 'Invoer suksesvol', - error: 'U invoer het misluk. Maak asseblief seker u data is korrek en geldig.', - success: 'Suksesvol', - do_import: 'Invoer', - scan_qr: 'of skandeer QR kode?', - }, - scanQrWif: { - go_back: 'Gaan Terug', - cancel: 'Kanseleer', - decoding: 'Decoding', - input_password: 'Input password', - password_explain: 'Hierdie is ‘n BIP38 ge-enkripteerde privaat sleutel', - bad_password: 'Wagwoord verkeerd', - wallet_already_exists: 'Hierdie beursie bestaan alreeds', - bad_wif: 'WIF verkeerd', - imported_wif: 'WIF invoer suksesvol ', - with_address: ' met adres ', - imported_segwit: 'Segwit Invoer Suksesvol', - imported_legacy: 'Legacy Invoer', - imported_watchonly: 'Kyk Slegs invoer suksesvol', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transaksies', - title: 'transaksies', - description: 'Lys met inkomende en uitgaande transaksies van u beursies', - conf: 'bev.', - }, - details: { - title: 'Transaksie', - from: 'Inset', - to: 'Resultaat', - copy: 'Kopieer', - transaction_details: 'Transaksie besonderhede', - show_in_block_explorer: 'Wys in blok verkenner', - }, - }, - send: { - header: 'Stuur', - details: { - title: 'skep transaksie', - amount_field_is_not_valid: 'Bedrag is ongeldig', - fee_field_is_not_valid: 'Fooi spasie is ongeldig', - address_field_is_not_valid: 'Adres is ongeldig', - total_exceeds_balance: 'Die bedrag is meer as die beskikbare balans.', - create_tx_error: 'Daar was ‘n probleem met die skepping van die transaksie. Bevestig asseblief die adres is geldig.', - address: 'adres', - amount_placeholder: 'bedrag om te stuur (in BTC)', - fee_placeholder: 'plus transaksie fooi (in BTC)', - note_placeholder: 'persoonlike notas', - cancel: 'Kanselleer', - scan: 'Skandeer', - send: 'Stuur', - create: 'Skep', - remaining_balance: 'Oorblywende balans', - }, - confirm: { - header: 'Bevestig', - sendNow: 'Stuur nou', - }, - success: { - done: 'Klaar', - }, - create: { - details: 'Besonderhede', - title: 'skep transaksie', - error: 'Daar is ‘n probleem met die transaksie. Ongeldige adres of bedrag?', - go_back: 'Gaan Terug', - this_is_hex: 'Hierdie is die transaksie hex, geteken en gereed om na die netwerk uitgesaai te word.', - to: 'Aan', - amount: 'Bedrag', - fee: 'Fooi', - tx_size: 'TX groote', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Saai uit', - not_enough_fee: 'Fooi te laag. Vermeerder die fooi', - }, - }, - receive: { - header: 'Ontvang', - details: { - title: 'Deel adres met krediteur', - share: 'deel', - copiedToClipboard: 'Gekopieer na klipbord.', - label: 'Beskrywing', - create: 'Skep', - setAmount: 'Bedrag ontvang', - }, - }, - buyBitcoin: { - header: 'Koop Bitcoin', - tap_your_address: 'Raak aan die adres om dit na die klipbord the stuur:', - copied: 'Gekopieer na klipbord!', - }, - settings: { - header: 'instellings', - plausible_deniability: 'Geloofwaardige ontkenbaarheid...', - storage_not_encrypted: 'Berging: Nie-geenkripteer nie', - storage_encrypted: 'Berging: Ge-enkripteer', - password: 'Wagwoord', - password_explain: 'Skep die wagwoord wat u sal gebruik om u berging te de-enkripteer', - retype_password: 'Hervoer wagwoord', - passwords_do_not_match: 'Wagwoorde stem nie oor een nie', - encrypt_storage: 'Enkripteer Berging', - lightning_settings: 'Lightning Instellings', - lightning_settings_explain: - 'Om u eie LND node te konnekteer, installeer asseblief LndHub' + - ' and put its URL here in settings. Leave blank om die standaard LndHub' + - '(lndhub.io) te gebruik', - save: 'stoor', - about: 'info', - language: 'Taal', - currency: 'Geldeenheid', - }, - plausibledeniability: { - title: 'Geloofwaardige Ontkenbaarheid', - help: - 'Onder sekere omstandighede mag u dalk geforseer word om u ' + - 'wagwoord te deel teen u wil. Om u te beskerm kan Bluewallet ‘n ' + - 'tweede “fantasie” beursie skep wat as skerm kan dien. Indien u ' + - 'hierdie wagwoord deel sal die 3de party nie toegang tot u hoof fondse kry nie.', - help2: 'Fantasie berging is heeltemal funksioneel', - create_fake_storage: 'Skep fantasie berging wagwoord', - go_back: 'Gaan terug', - create_password: 'Skep ‘n wagwoord', - create_password_explanation: 'Die wagwoord vir fantasie berging moet verskil van die wagwoord vir hoof berging', - password_should_not_match: 'Die wagwoord vir fantasie berging moet verskil van die wagwoord vir hoof berging.', - retype_password: 'Hervoer wagwoord', - passwords_do_not_match: 'Wagwoorde vergelyk nie, probeer weer', - success: 'Sukses', - }, - lnd: { - title: 'bestuur fondse', - choose_source_wallet: 'Kies ‘n bron beursie', - refill_lnd_balance: 'Herlaai Lightning beursie', - refill: 'Herlaai', - withdraw: 'Ontrek', - expired: 'Verval', - placeholder: 'Faktuur', - sameWalletAsInvoiceError: 'U kan nie ‘n faktuur betaal met die selfde beursie waarmee die faktuur geksep is nie.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/ZAR_Xho.js b/loc/ZAR_Xho.js deleted file mode 100644 index b31c1deb6c..0000000000 --- a/loc/ZAR_Xho.js +++ /dev/null @@ -1,239 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Ukugcinwa kwakho kubhaliwe. Inombolo yokuvula iyadingeka ukuba ichithwe', - enter_password: 'Faka inombolo yokuvula', - bad_password: 'Iphasiwedi engalunganga, zama kwakhona', - never: 'Ungalingi', - continue: 'Qhubeka', - ok: 'OK', - }, - wallets: { - select_wallet: 'Khetha ingxowa', - options: 'Ukhetho', - createBitcoinWallet: - 'Okwangoku awunayo ingxowa yebitcoin. Ukuze kuxhaswe ingxowa ekhawulezayo, Ingxowa yeBitcoin kufuneka idalwe okanye ikhutshelwe. Ungathanda ukuqhubeka ?', - list: { - app_name: 'BlueWallet', - title: 'Ingxowa', - header: 'Ingxowa imele ukuba nemfihlelo yokuyivula nekheli kwaye unokuyisebenzisa ukwamkela imali.', - add: 'Yongeza Ingxowa', - create_a_wallet: 'Yenza ingxowa', - create_a_wallet1: 'Ayihlawulelwa kwaye ungayenza', - create_a_wallet2: 'Ungenza zibeninzi indlela zokuhlawula', - latest_transaction: 'Utshintsho olutsha', - empty_txs1: 'Intengiso yakho iya kubonakala apha,', - empty_txs2: 'akuho nanye okwangoku', - tap_here_to_buy: 'Cofa apha ukuthenga ibitcoin', - }, - reorder: { - title: 'Yenza kwakhona ingxowa', - }, - add: { - title: 'yongeza ingxowa', - description: - 'Unokukhangela ingxowa yephepha yokugcinwa kwephepha ( kwi-WIF – indlela lokungenisa ingxowa), okanye wenze ingxowa entsha. Ingxowa yeSegwit exhaswa yi-default.', - scan: 'Ukuqondisa', - create: 'Yakha', - label_new_segwit: 'SegWit entsha', - label_new_lightning: 'Umbane omtsha', - wallet_name: 'igama lengxowa', - wallet_type: 'uhlobo', - or: 'okanye', - import_wallet: 'Ukungenisa ingxowa', - imported: 'ngeniswa', - coming_soon: 'Kuza ngokukhawuleza', - lightning: 'Umbane', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Ingxowa', - address: 'Ikheli', - type: 'Uhlobo', - label: 'Igama', - destination: 'ukuya kuyo', - description: 'ukuya kuyo', - are_you_sure: 'Ingaba uqinisekile?', - yes_delete: 'Ewe, yisuse', - no_cancel: 'Hayi, rhoxisa', - delete: 'Cima', - save: 'Gcina', - delete_this_wallet: 'Cima le ngxowa', - export_backup: 'Ukuthumela ngaphandle / yokugcina', - buy_bitcoin: 'Thenga ibitcoin', - show_xpub: 'Bonise ingxowa XPUB', - }, - export: { - title: 'ukuthunyelwa kweebhanki ', - }, - xpub: { - title: 'ingxowa XPUB', - copiedToClipboard: 'Ikopishwe kwi-clipboard', - }, - import: { - title: 'ukungenisa', - explanation: - 'Bhale apha imnemonic yakho, ngundoqo, WIF , okanye nantoni na onayo. BlueWallet uya kwenza konke okusemandleni ukuqiqa ifomathi efanelekileyo kwaye ingenise ingxowa yakho', - imported: 'Ngenisiwe', - error: 'Ayiphumelelanga ukungenisa. Nceda, uqiniseka ukuba idata ehlinzekiweyo iyasebenza.', - success: 'Iphumelele', - do_import: 'Ngeniswe', - scan_qr: 'okanye ukukhangela iQR code?', - }, - scanQrWif: { - go_back: 'Buya Umva', - cancel: 'Rhoxisa', - decoding: 'Ukumisela', - input_password: 'Igama lokungena', - password_explain: 'Yi le BIP38 ikhifidi yangasese itsixe', - bad_password: 'Inombolo yokuvula eli ngalunganga ', - wallet_already_exists: 'Ikhredithi enjalo sele ikhona', - bad_wif: 'Ezimbi WIF', - imported_wif: 'Ngeniswa WIF ', - with_address: ' Nge dilesi ', - imported_segwit: 'Ngeniswa SegWit', - imported_legacy: 'Ngeniswa ilifa', - imported_watchonly: 'Ngeniswa bukele-kuphela', - }, - }, - transactions: { - list: { - tabBarLabel: 'Ngeniswa', - title: 'ngeniswa', - description: 'Uluhlu lokungena okanye ukuphuma kweekhredithi zakho', - conf: 'conf', - }, - details: { - title: 'Ngeniswa', - from: 'Negalelo', - to: 'Mveliso', - copy: 'Ikopi', - transaction_details: 'Iinkcukacha zentengiselwano', - show_in_block_explorer: 'Bonisa ibhloko umhloi', - }, - }, - send: { - header: 'Thumela', - details: { - title: 'ukudala ukuthenga', - amount_field_is_not_valid: 'intsimi yexabiso ayivumelekanga', - fee_field_is_not_valid: 'Intsimi yentlawulo ayivumelekanga ', - address_field_is_not_valid: 'Intsimi yeedilesi ayivumelekanga', - total_exceeds_balance: 'Imali yokuthumela idlula imali ekhoyo.', - create_tx_error: 'Kukho impazamo yokudala ukuthengiselana. Nceda, qinisekisa ukuba idilesi iyasebenza.', - address: 'idilesi', - amount_placeholder: 'inani lokuthumela (nge BTC)', - fee_placeholder: 'kunye nentlawulo yokuthengiswa (nge BTC)', - note_placeholder: 'inqaku kumntu', - cancel: 'Rhoxisa', - scan: 'Ukutshekisha', - send: 'Thumela', - create: 'Yenza', - remaining_balance: 'Ibhalansi eseleyo', - }, - confirm: { - header: 'Qiniseka', - sendNow: 'Thumela ngoku', - }, - success: { - done: 'Kwenzekile', - }, - create: { - details: 'Iinkcukacha', - title: 'ukudala ukuthenga', - error: 'Impazamo yokudala ukuthengiselana. Idilesi engavumelekanga okanye imali yokuthumela?', - go_back: 'Buya umva', - this_is_hex: 'Le yi ntengo hex, ityikityiwe ilungele ukukhutshelwa kumnatha.', - to: 'Iya ku', - amount: 'Isixa', - fee: 'Ntlawulo', - tx_size: 'TX ubungakanani', - satoshi_per_byte: 'Satoshi nge-byte', - memo: 'Memo', - broadcast: 'Sasazwa', - not_enough_fee: 'Akukho mali e neleyo. UKwandisa intlawulo ', - }, - }, - receive: { - header: 'Fumana', - details: { - title: 'Wabelane ngale dilesi nomhlawuli', - share: 'yabelana', - copiedToClipboard: 'Ikhutshelwe kwi-clipboard', - label: 'Inkcazo', - create: 'Yenza', - setAmount: 'Fumana ngexabiso', - }, - }, - buyBitcoin: { - header: 'Thenga Ibitcoin', - tap_your_address: 'Thepha idilesi yakho ukuyikopisha kwi-clipboard:', - copied: 'Ikhutshelwe kwi-clipboard!', - }, - settings: { - header: 'Izicwangciso', - plausible_deniability: 'Ukuphika...', - storage_not_encrypted: 'Ukugciwa: hayi ngekhodi', - storage_encrypted: 'Ukugciwa: ngekhodi', - password: 'Inombolo yokuvula', - password_explain: 'Ukudala iinombolo yokuvula oyisebenzisayo ukucima ukugcina', - retype_password: 'Phina inombolo yokuvula', - passwords_do_not_match: 'Inombolo yokuvula azifani', - encrypt_storage: 'Kubhala u kubhala', - lightning_settings: 'Izixhobo zokukhanyisa', - lightning_settings_explain: - 'Ukuxhuma kwi-node yakho ye-LND nceda ufake iLndHub' + - ' kwaye ufake iURL apha izicwangciso. Shiya kungenanto yokusebenzisa iLndHub (Indhub.io)', - save: 'ndoloza', - about: 'Malunga', - language: 'Ulwimi', - currency: 'Lwemali', - }, - plausibledeniability: { - title: 'Ukuphika', - help: - 'Phantsi kweemeko unokunyaneliswa ukuba uchaze a ' + - 'inombolo yokuvula. BlueWallet ukugcina imali yakho ikhuselekile, unokudala enye ' + - 'ukugcinwa kwekhowudi, ngegama eligqithisiweyo. Phantsi kwefuthe, ' + - 'unako ukutyhila le phasiwedi kumntu wesithatu. Ukuba ungenayo ' + - 'BlueWallet, iya kuvula ukugcinwa kwetyala ‘entsha’. Oku kuya kubonakala ' + - 'Umlenze kumntu wesithathu kodwa uza kugcina ngasese ukugcinwa kwakho ' + - 'ngemali ekhuselekile..', - help2: - 'Igumbi lokugcina elitsha liza kusebenza ngokupheleleyo, kwaye unako ukugcina okunye ‘ + ‘lxabiso elincinci apho likhangeleka ngakumbi.', - create_fake_storage: 'Ukudala igumbi lokugcina elifihlakeleyo', - go_back: 'Buya Umva', - create_password: 'Yenza inombolo yokuvula', - create_password_explanation: - 'Inombolo yakho yokuvula igumbi lokugcina inkohliso akumele ifane ne nombolo yokuvula igumbi lakho elinyanisekileyo', - password_should_not_match: - 'Inombolo yakho yokuvula igumbi lokugcina inkohliso akumele ifane ne nombolo yokuvula igumbi lakho elinyanisekileyo', - retype_password: 'Phinda inombolo yokuvula', - passwords_do_not_match: 'Inombolo yokuvula ayihambelani, zama kwakhona', - success: 'Iphumelele', - }, - lnd: { - title: 'lawula imali', - choose_source_wallet: 'Ukhethe ingxowa yomthombo', - refill_lnd_balance: 'Gcwalisa ingxowa yakho yemali', - refill: 'Gcwalisa', - withdraw: 'Khupha imali', - expired: 'Iphelewe lixesha', - placeholder: 'Invoyisi', - sameWalletAsInvoiceError: ': Awukwazi ukuhlawula i-invoyisi kunye ngengxowa oyisebenzisile ukudala leyo invoyisi.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/cs_CZ.js b/loc/cs_CZ.js deleted file mode 100644 index bb7a41b88b..0000000000 --- a/loc/cs_CZ.js +++ /dev/null @@ -1,243 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Vaše úložiště je zašifrované. Zadejte heslo k odemčení', - enter_password: 'Zadejte heslo', - bad_password: 'Špatné heslo, prosím zkuste to znovu', - never: 'nikdy', - continue: 'Continue', - ok: 'OK', - }, - wallets: { - select_wallet: 'Vyberte peněženku', - options: 'možnosti', - createBitcoinWallet: 'In order to use a Lightning wallet, a Bitcoin wallet is needed to fund it. Would you like to continue anyway?', - list: { - app_name: 'BlueWallet', - title: 'peněženky', - header: 'Peněženka reprezentuje pár tajného (privátního) klíče a adresy' + 'kterou můžete sdílet, abyste získali mince', - add: 'Přidat peněženku', - create_a_wallet: 'Vytvořit peněženku', - create_a_wallet1: 'Je to zdarma a můžete vytvořit', - create_a_wallet2: 'tolik, kolik budete chtít', - latest_transaction: 'poslední transakce', - empty_txs1: 'Zde budou zobrazeny vaše transakce,', - empty_txs2: 'zatím žádné', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Klikněte zde pro zakoupení Bitcoinu', - }, - reorder: { - title: 'Seřadit peěženky', - }, - add: { - title: 'přidat peněženku', - description: - 'Můžete naskenovat zálohovoanou papírovou peněženku (WIF - Wallet Import Format), nevo vytvořit novou peněženku. Segwit peněženky jsou podporovány standardně.', - scan: 'Skenovat', - create: 'Vytvořit', - label_new_segwit: 'Nová SegWit', - label_new_lightning: 'Nová Lightning', - wallet_name: 'název peněženky', - wallet_type: 'typ', - or: 'nebo', - import_wallet: 'Importovat peněženku', - imported: 'Importována', - coming_soon: 'Již brzy', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Peněženka', - address: 'Adresa', - type: 'Typ', - label: 'Popisek', - destination: 'cíl', - description: 'Popis', - are_you_sure: 'Jste si jistý?', - yes_delete: 'Ano, smazat', - no_cancel: 'Ne, zrušit', - delete: 'Smazat', - save: 'Uložit', - delete_this_wallet: 'Smazat peněženku', - export_backup: 'Exportovat / zálohovat', - buy_bitcoin: 'Koupit Bitcoin', - show_xpub: 'Ukázat XPUB', - }, - export: { - title: 'exportovat peněženku', - }, - xpub: { - title: 'XPUB peněženky', - copiedToClipboard: 'Zkopírováno do schránky.', - }, - import: { - title: 'importovat', - explanation: - 'Zadejte zde svůj mnemonic seed, privátní klíč, WIF, nebo cokoliv co máte. BlueWallet se pokusí uhodnout správný formát a naimportovat vaší peněženku', - imported: 'Importováno', - error: 'Chyba při importu. Prosím ujistěte se, že poskytnutá data jsou správná.', - success: 'Úspěch', - do_import: 'Importovat', - scan_qr: 'nebo raději naskenovat QR kód?', - }, - scanQrWif: { - go_back: 'Zpět', - cancel: 'Zrušit', - decoding: 'Dekóduji', - input_password: 'Vložte heslo', - password_explain: 'Toto je BIP38 zašifrovaný privátní klíč', - bad_password: 'Špatné heslo', - wallet_already_exists: 'Tato peněženka již existuje', - bad_wif: 'Špatný WIF', - imported_wif: 'Importovaný WIF ', - with_address: ' s adresou ', - imported_segwit: 'Importovaná SegWit', - imported_legacy: 'Importovaná Legacy', - imported_watchonly: 'Importovaná Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transakce', - title: 'transakce', - description: 'Seznam příchozích a odchozích transakcí vašich peněženek', - conf: 'potvrzení', - }, - details: { - title: 'Transakce', - from: 'Input', - to: 'Output', - copy: 'Kopírovat', - transaction_details: 'Detaily transakce', - show_in_block_explorer: 'Ukázat v block exploreru', - }, - }, - send: { - header: 'Poslat', - details: { - title: 'vytvořit transakci', - amount_field_is_not_valid: 'Čáskta není správně vyplněna', - fee_field_is_not_valid: 'Poplatek není správně vyplněn', - address_field_is_not_valid: 'Adresa není správně vyplněna', - total_exceeds_balance: 'Částka, kterou se snažíte poslat, přesahuje dostupný zůstatek.', - create_tx_error: 'Nastala chyba při vytváření transakce. Prosím ujistěte se, že adresa je platná.', - address: 'adresa', - amount_placeholder: 'částka k odeslání (v BTC)', - fee_placeholder: 'plus transakční poplatek (v BTC)', - note_placeholder: 'poznámka pro sebe', - cancel: 'Zrušit', - scan: 'Skenovat', - send: 'Poslat', - create: 'Vytvořit', - remaining_balance: 'Zbývající zůstatek', - }, - confirm: { - header: 'Potvrdit', - sendNow: 'Poslat hned', - }, - success: { - done: 'Hotovo', - }, - create: { - details: 'Detaily', - title: 'vytvořit transakci', - error: 'Chyba při vytváření transakce. Nesprávná adresa nebo částka?', - go_back: 'Zpět', - this_is_hex: 'Toto je vaše transakce, podepsána a připravena k odeslání do sítě.', - to: 'To', - amount: 'Částka', - fee: 'Poplatek', - tx_size: 'velikost transakce', - satoshi_per_byte: 'Satoshi/byte', - memo: 'Popisek', - broadcast: 'Odeslat do sítě', - not_enough_fee: 'Nedostatečný poplatek. Zvyšte poplatek.', - }, - }, - receive: { - header: 'Přijmout', - details: { - title: 'Sdílejte tuto adresu s plátcem', - share: 'sdílet', - copiedToClipboard: 'Zkopírováno do schránky.', - label: 'Popis', - create: 'Create', - setAmount: 'Přijmout částku...', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Koupit Bitcoin', - tap_your_address: 'Klikněte na svojí adresu pro zkopírování do schránky:', - copied: 'Zkopírováno do schránky.', - }, - settings: { - header: 'nastavení', - plausible_deniability: 'Plausible deniability...', - storage_not_encrypted: 'Uložiště: nezašifrováno', - storage_encrypted: 'Úložiště: zašifrováno', - password: 'Heslo', - password_explain: 'Vytořte si heslo k zašifrování úložiště.', - retype_password: 'Heslo znovu', - passwords_do_not_match: 'Hesla se neshodují', - encrypt_storage: 'Zašifrovat úložiště', - lightning_settings: 'Lightning settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - ' and put its URL here in settings. Leave blank to use default ' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'save', - about: 'O BlueWallet', - language: 'Jazyk', - currency: 'Měna', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Plausible Deniability', - help: - 'Za určitých okolností můžete být donuceni k prozrazení vašeho hesla.' + - 'K zajištění bezpečností vašich prostředků, BlueWallet může vytvořit' + - 'další zašifrované úložiště s rozdílný heslem. V případě potřeby' + - 'můžete toto heslo dát třetí straně. Pokud bude zadáno do BlueWallet,' + - 'odemkne nové "falešné" úložiště. Toto bude vypadat legitimně, ale' + - 'udrží vaše pravé hlavní úložiště v bezpečí.', - help2: 'Nové úložiště bude plně funkční, můžete na něj uložit minimální částku, aby vypadalo více uvěřitelně.', - create_fake_storage: 'Vytvořit falešné zašifrované úložiště', - go_back: 'Zpět', - create_password: 'Vytvořit heslo', - create_password_explanation: 'Heslo k falešnému úložišti nesmí být stejné jako heslo k hlavnímu úložišti', - password_should_not_match: 'Heslo k falešnému úložišti nesmí být stejné jako heslo k hlavnímu úložišti', - retype_password: 'Heslo znovu', - passwords_do_not_match: 'Hesla se neshodují, zkuste to znovu', - success: 'Úspěch', - }, - lnd: { - title: 'spravovat zůstatek', - choose_source_wallet: 'Vyberte zdrojovou peněženku', - refill_lnd_balance: 'Doplnit zůstatek na Lightning peněžence', - refill: 'Doplnit', - withdraw: 'Vybrat', - expired: 'Expirováno', - placeholder: 'Invoice', - sameWalletAsInvoiceError: 'You can not pay an invoice with the same wallet used to create it.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/da_DK.js b/loc/da_DK.js deleted file mode 100644 index 1fb863e2c6..0000000000 --- a/loc/da_DK.js +++ /dev/null @@ -1,242 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Lageret er krypteret. Indtast adgangskode for at dekryptere', - enter_password: 'Indtast adgangskode', - bad_password: 'Forkert adgangskode, prøv igen', - never: 'aldrig', - continue: 'Continue', - ok: 'OK', - }, - wallets: { - select_wallet: 'Vælg wallet', - options: 'valgmuligheder', - createBitcoinWallet: 'In order to use a Lightning wallet, a Bitcoin wallet is needed to fund it. Would you like to continue anyway?', - list: { - app_name: 'BlueWallet', - title: 'wallets', - header: 'En wallet består af par af hemmelige (private nøgler) og en adresse' + 'som du kan dele med andre for at modtage coins.', - add: 'Tilføj Wallet', - create_a_wallet: 'Opret en wallet', - create_a_wallet1: 'Det er helt gratis og du kan oprette', - create_a_wallet2: 'lige så mange du vil', - latest_transaction: 'seneste transaktion', - empty_txs1: 'Dine transaktioner vil blive vist her,', - empty_txs2: 'ingen endnu', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Tryk her for at købe Bitcoin', - }, - reorder: { - title: 'Ændre rækkefølgen af wallets', - }, - add: { - title: 'Tilføj wallet', - description: - 'Du kan enten scanne en backup papir wallet (i et WIF - Wallet Import Format), eller oprette en ny wallet. Segwit wallets er understøttet som standard.', - scan: 'Scan', - create: 'Opret', - label_new_segwit: 'Ny SegWit', - label_new_lightning: 'Ny Lightning', - wallet_name: 'wallet navn', - wallet_type: 'type', - or: 'eller', - import_wallet: 'Importer wallet', - imported: 'Importeret', - coming_soon: 'Kommer snart', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Wallet', - address: 'Adresse', - type: 'Type', - label: 'Etiket', - destination: 'destination', - description: 'bskrivelse', - are_you_sure: 'Er du sikker?', - yes_delete: 'Ja, slet', - no_cancel: 'Nej, annuller', - delete: 'Slet', - save: 'Gem', - delete_this_wallet: 'Slet denne wallet', - export_backup: 'Eksporter / backup', - buy_bitcoin: 'Køb Bitcoin', - show_xpub: 'Vis wallet XPUB', - }, - export: { - title: 'wallet eksport', - }, - xpub: { - title: 'wallet XPUB', - copiedToClipboard: 'Kopieret til udklipsholder.', - }, - import: { - title: 'importer', - explanation: - 'Indtast din huskeregel, private nøgle, WIF, eller hvad du end har. BlueWallet vil forsøge at gætte det rigtige format og importere din wallet', - imported: 'Importeret', - error: 'Importen lykkedes ikke. Er det en gyldig nøgle?', - success: 'Succes', - do_import: 'Importer', - scan_qr: 'eller scan QR kode istedet?', - }, - scanQrWif: { - go_back: 'Tilbage', - cancel: 'Annuller', - decoding: 'Afkoder', - input_password: 'Indtast adgangskode', - password_explain: 'Dette er en BIP38 krypteret privat nøgle', - bad_password: 'Forkert adgangkode', - wallet_already_exists: 'En sådan wallet eksisterer allerede', - bad_wif: 'Forkert WIF', - imported_wif: 'Importeret WIF ', - with_address: ' med adresse ', - imported_segwit: 'Importeret SegWit', - imported_legacy: 'Importeret Legacy', - imported_watchonly: 'Importeret Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transaktioner', - title: 'transaktioner', - description: 'En liste af indgåeende og udgående transaktioner i dine wallets', - conf: 'conf', - }, - details: { - title: 'Transaktion', - from: 'Fra', - to: 'Til', - copy: 'Kopier', - transaction_details: 'Transaktions detaljer', - show_in_block_explorer: 'Vis i block-explorer', - }, - }, - send: { - header: 'Send', - details: { - title: 'opret transaktion', - amount_field_is_not_valid: 'Beløbsfeltet er ikke gyldigt', - fee_field_is_not_valid: 'Gebyr feltet er ikke gyldigt', - address_field_is_not_valid: 'Adresse felt er ikke gyldigt', - total_exceeds_balance: 'Beløbet du prøver at sende er større end din kontosaldo.', - create_tx_error: 'Der skete en fejl ved oprettelse af transaktionen. Check om addressen er gyldig.', - address: 'adresse', - amount_placeholder: 'beløb der skal sendes (i BTC)', - fee_placeholder: 'plus transaktionsgebyr (i BTC)', - note_placeholder: 'Notat til eget brug', - cancel: 'Annuller', - scan: 'Scan', - send: 'Send', - create: 'Opret', - remaining_balance: 'Resterende saldo', - }, - confirm: { - header: 'Bekræft', - sendNow: 'Send nu', - }, - success: { - done: 'Udført', - }, - create: { - details: 'Detaljer', - title: 'opret transaktion', - error: 'Der skete en fejl ved oprettelse af transaktionen. Er addresssen og beløbet korrekt?', - go_back: 'Tilbage', - this_is_hex: 'Dette er transaktion hex, klar til at sende ud til netværket.', - to: 'Til', - amount: 'Beløb', - fee: 'Gebyr', - tx_size: 'TX størrelse', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Notat', - broadcast: 'Transmitter', - not_enough_fee: 'Gebyret er ikke højt nok. Forhøj gebyret.', - }, - }, - receive: { - header: 'Modtag', - details: { - title: 'Del denne adresse med betaleren', - share: 'del', - copiedToClipboard: 'Kopieret til udklipsholder.', - label: 'Beskrivelse', - create: 'Create', - setAmount: 'Modtag med beløb', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Køb Bitcoin', - tap_your_address: 'Tryk på addressen og kopier den til udklipsholder:', - copied: 'Kopieret til udklipsholder!', - }, - settings: { - header: 'indstillinger', - plausible_deniability: 'Sandsynlig benægtelse...', - storage_not_encrypted: 'Lager: ikke krypteret', - storage_encrypted: 'Lager: krypteret', - password: 'Adgangskode', - password_explain: 'Indtast den adgangskode du vil bruge til at kryptere lageret', - retype_password: 'Gentag adgangskoden', - passwords_do_not_match: 'Adgangskoden er ikke den samme', - encrypt_storage: 'Krypter lager', - lightning_settings: 'Lightning settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - ' and put its URL here in settings. Leave blank to use default ' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'save', - about: 'Andet', - language: 'Sprog', - currency: 'Valuta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Sandsynlig benægtelse', - help: - 'Under visse omstændighder, kan du blive tvunget til at give din ' + - 'adgangskode. For at beskytte dine coins kan du med Bluewallet lave ' + - 'et falsk krypteret lager, med en anden kode. I en presset situation, ' + - 'kan du give denne adgangskode istedet. Hvis denne kode indtastes i ' + - 'BlueWallet, vil brugeren se den alternative wallet. Det vil se helt' + - 'legitimt ud for andre, og dermed beskytte din originale wallet og ' + - 'dine coins.', - help2: 'Det nye lager vil være fuldt funktionsdygtigt, og du kan evt have nogle ' + 'småbeløb så det ser troværdigt ud.', - create_fake_storage: 'Opret falsk kryopteret lager', - go_back: 'tilbage', - create_password: 'Opret adgangskode', - create_password_explanation: 'Adgangskoden til det falske lager må ikke være den samme som den du bruger til det rigtige lager', - password_should_not_match: 'Adgangskoden til det falske lager må ikke være den samme som den du bruger til det rigtige lager', - retype_password: 'Indtast adgangskoden igen', - passwords_do_not_match: 'Adgangskoden er ikke den samme, prøv igen', - success: 'Succes', - }, - lnd: { - title: 'Administration', - placeholder: 'Invoice', - choose_source_wallet: 'Vælge en wallet', - refill_lnd_balance: 'Genopfyld Lightning wallet', - refill: 'Genopfyld', - withdraw: 'Træk coins tilbage', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/de_DE.js b/loc/de_DE.js deleted file mode 100644 index a330646b39..0000000000 --- a/loc/de_DE.js +++ /dev/null @@ -1,247 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Dein Speicher ist verschlüsselt. Zum Entschlüsseln wird ein Passwort benötigt.', - enter_password: 'Gib das Passwort ein', - bad_password: 'Fasches Passwort, nächster Versuch', - never: 'nie', - continue: 'Weiter', - ok: 'OK', - }, - wallets: { - select_wallet: 'Wähle eine Wallet', - options: 'Einstellungen', - createBitcoinWallet: - 'Um eine Lightning wallet zu verwenden, muss erstmal eine Bitcoin Wallet eingerichtet werden. Bitte erstell oder importier eine Bitcoin Wallet.', - list: { - app_name: 'BlueWallet', - title: 'Wallets', - header: - 'Eine Wallet spiegelt ein Paar kryptographische Schlüssel wider. Einen geheimen Schlüseel und eine Adresse als öffentlichen Schlüssel. Den öffentlichen Schlüssel kann man zum Empfang von Bitcoin teilen.', - add: 'Wallet hinzufügen', - create_a_wallet: 'Wallet erstellen', - create_a_wallet1: 'Es ist kostenlos und du kannst', - create_a_wallet2: 'so viele Wallets erstellen, wie du möchtest', - latest_transaction: 'Lezte Transaktion', - empty_txs1: 'Deine Transaktionen erscheinen hier', - empty_txs2: 'Noch keine Transaktionen', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Klicke hier, um Bitcoin zu kaufen', - }, - reorder: { - title: 'Wallets neu ordnen', - }, - add: { - title: 'Wallet hinzufügen', - description: - 'Du kannst entweder ein Backup einer Paper-Wallet einscannen (im WIF - Wallet Import Format) oder eine neue Wallet erstellen. SegWit Wallets werden standardmäßig unterstützt.', - scan: 'Scannen', - create: 'Erstellen', - label_new_segwit: 'Neue SegWit Wallet', - label_new_lightning: 'Neue Lightning Wallet', - wallet_name: 'Wallet Name', - wallet_type: 'Typ', - or: 'oder', - import_wallet: 'Wallet importieren', - imported: 'Importiert', - coming_soon: 'Demnächst verfügbar', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Wallet', - address: 'Adresse', - type: 'Typ', - label: 'Bezeichnung', - destination: 'Zieladresse', - description: 'Beschreibung', - are_you_sure: 'Bist du dir sicher??', - yes_delete: 'Ja, löschen', - no_cancel: 'Nein, abbrechnen', - delete: 'Löschen', - save: 'Sichern', - delete_this_wallet: 'Lösche diese Wallet', - export_backup: 'Exportieren / Backup', - buy_bitcoin: 'Bitcoin kaufen', - show_xpub: 'Wallet XPUB zeigen', - }, - export: { - title: 'Wallet exportieren', - }, - xpub: { - title: 'Wallet XPUB', - copiedToClipboard: 'In die Zwischenablage kopiert.', - }, - import: { - title: 'Importieren', - explanation: - 'Gib hier deine mnemonische Phrase, deinen privaten Schlüssel, WIF oder worüber du auch immer verfügst ein. BlueWallet wird bestmöglich dein Format interpretieren und die Wallet importieren', - imported: 'Importiert', - error: 'Fehler beim Import. Ist die Eingabe korrekt?', - success: 'Erfolg', - do_import: 'Importieren', - scan_qr: 'oder QR-Code scannen?', - }, - scanQrWif: { - go_back: 'Zurück', - cancel: 'Abbrechen', - decoding: 'Entschlüsseln', - input_password: 'Passwort eingeben', - password_explain: 'Das ist ein mit BIP38 verschlüsselter geheimer Schlüssel', - bad_password: 'Falsches Passwort', - wallet_already_exists: 'Diese Wallet existiert bereits', - bad_wif: 'Falsches WIF', - imported_wif: 'WIF importiert', - with_address: ' mit Adresse ', - imported_segwit: 'SegWit importiert', - imported_legacy: 'Legacy importiert', - imported_watchonly: 'Watch-Only importiert', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transaktionen', - title: 'Transaktionen', - description: 'Eine Liste eingehender oder ausgehender Transaktionen deiner Wallets', - conf: 'conf', - }, - details: { - title: 'Transaktionen', - from: 'Eingehend', - to: 'Ausgehend', - copy: 'Kopieren', - transaction_details: 'Details', - show_in_block_explorer: 'Im Block-Explorer zeigen', - }, - }, - send: { - header: 'Senden', - details: { - title: 'Transaktion erstellen', - amount_field_is_not_valid: 'Betrageingabe ist nicht korrekt', - fee_field_is_not_valid: 'Gebühreingabe ist nicht korrekt', - address_field_is_not_valid: 'Adresseingabe ist nicht korrekt', - total_exceeds_balance: 'Der zu sendende Betrag ist größer als der verfügbare Betrag.', - create_tx_error: 'Fehler beim Erstellen der Transaktion. Bitte stelle sicher, dass die Adresse korrekt ist.', - address: 'Adresse', - amount_placeholder: 'Betrag (in BTC)', - fee_placeholder: 'plus Gebühr (in BTC)', - note_placeholder: 'Notiz', - cancel: 'Abbrechen', - scan: 'Scan', - send: 'Senden', - create: 'Erstellen', - remaining_balance: 'Verfügbarer Betrag', - }, - confirm: { - header: 'Bestätigen', - sendNow: 'Jetzt senden', - }, - success: { - done: 'Fertig', - }, - create: { - details: 'Details', - title: 'Transaktion erstellen', - error: 'Fehler beim Erstellen der Transaktion. Falsche Adresse oder Betrag?', - go_back: 'Zurück', - this_is_hex: 'Das ist die hexadezimale Darstellung der signierten Transaktion und bereit zum Übertragen an das Netzwerk', - to: 'An', - amount: 'Betrag', - fee: 'Gebühr', - tx_size: 'Größe', - satoshi_per_byte: 'Satoshi pro Byte', - memo: 'Memo', - broadcast: 'Übertragen', - not_enough_fee: 'Gebühr zu gering. Erhöhe die Gebühr', - }, - }, - receive: { - header: 'Erhalten', - details: { - title: 'Teile diese Adresse mit dem Zahlenden', - share: 'Teilen', - copiedToClipboard: 'In die Zwischenablage kopiert.', - label: 'Beschreibung', - create: 'Create', - setAmount: 'Zu erhaltender Betrag', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Kaufe Bitcoin', - tap_your_address: 'Adresse antippen, um sie in die Zwischenablage zu kopieren:', - copied: 'In die Zwischenablage kopiert!', - }, - settings: { - header: 'Einstellungen', - plausible_deniability: 'Glaubhafte Täuschung...', - storage_not_encrypted: 'Speicher nicht verschlüsselt', - storage_encrypted: 'Speicher verschlüsselt', - password: 'Passwort', - password_explain: 'Erstelle das Passwort zum Entschlüsseln des Speichers', - retype_password: 'Passwort wiederholen', - passwords_do_not_match: 'Passwörter stimmen nicht überein', - encrypt_storage: 'Speicher verschlüsseln', - lightning_settings: 'Lightning Einstellungen', - lightning_settings_explain: - 'Bitte installier Lndhub, um mit deiner eigenen LND Node zu verbinden' + - ' und setz seine URL hier in den Einstellungen. Lass das Feld leer, um Standard- ' + - 'LndHub\n (lndhub.io) zu verwenden', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Speichern', - about: 'Über', - language: 'Sprache', - currency: 'Währung', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Glaubhafte Täuschung', - help: - 'Unter bestimmten Umständen könntest du dazu gezwungen werden, ' + - 'dein Passwort preiszugeben. Um deine Bitcoins zu sichern, kann ' + - 'BlueWallet einen weiteren verschlüsselten Speicher mit einem ' + - 'anderen Passwort erstellen. Unter Druck kannst du das ' + - 'zweite Passwort an Fremde weitergeben. Wenn eingegeben, öffnet ' + - 'BlueWallet einen anderen Speicher zur Täuschung. Dies wirkt ' + - 'auf Fremde täuschend echt und dein Hauptspeicher bleibt geheim ' + - 'und sicher.', - help2: 'Der andere Speicher ist voll funktional und man kann einen Minimalbetrag für die Glaubhaftigkeit hinterlegen.', - create_fake_storage: 'Erstelle verschlüsselten Speicher zur Täuschung', - go_back: 'Zurück', - create_password: 'Erstelle ein Passwort', - create_password_explanation: 'Das Passwort für den täuschenden Speicher darf nicht mit dem deines Hauptspeichers übereinstimmen', - password_should_not_match: 'Das Passwort für den täuschenden Speicher darf nicht mit dem deines Hauptspeichers übereinstimmen', - retype_password: 'Passwort wiederholen', - passwords_do_not_match: 'Passwörter stimmen nicht überein. Neuer Versuch', - success: 'Erfolg!', - }, - lnd: { - title: 'Beträge verwalten', - choose_source_wallet: 'Wähle eine Wallet als Zahlungsquelle', - refill_lnd_balance: 'Lade deine Lightning Wallet auf', - refill: 'Aufladen', - withdraw: 'Abheben', - placeholder: 'Invoice', - sameWalletAsInvoiceError: - 'Du kannst nicht die Rechnung mit der Wallet begleichen, die du für die Erstellung dieser Rechnung verwendet hast.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/el.js b/loc/el.js deleted file mode 100644 index 1036bd7609..0000000000 --- a/loc/el.js +++ /dev/null @@ -1,246 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Το αρχείο σου είναι κρυπτογραφημένο. Χρειάζεται ένας κωδικός για να αποκρυπτογραφηθεί.', - enter_password: 'Εισήγαγε κωδικό', - bad_password: 'Λάθος κωδικός, δοκίμασε ξανά', - never: 'ποτέ', - continue: 'Συνέχισε', - ok: 'Εντάξει', - }, - wallets: { - select_wallet: 'Διάλεξε Πορτοφόλι', - options: 'επιλογές', - createBitcoinWallet: - 'Δεν έχεις πορτοφόλι Bitcoin. Για να βάλεις χρήματα στο πορτοφόλι Lightning, πρέπει πρώτα να δημιουργήσεις ή να εισάγεις ένα πορτοφόλι Bitcoin. Θα ήθελες να προχωρήσεις ούτως ή άλλως;', - list: { - app_name: 'BlueWallet', - title: 'πορτοφόλια', - header: - 'Ένα πορτοφόλι αποτελείται από ένα μυστικό (το ιδιωτικό κλειδί) και μια διεύθυνση' + - 'την οποία μπορείς να δώσεις σε άλλους για να σε πληρώσουν σε αυτήν.', - add: 'Πρόσθεσε Πορτοφόλι', - create_a_wallet: 'Δημιούργησε ένα πορτοφόλι', - create_a_wallet1: 'Είναι δωρεάν και μπορείς να', - create_a_wallet2: 'δημιουργήσεις όσα θέλεις', - latest_transaction: 'τελευταία συναλλαγή', - empty_txs1: 'Οι συναλλαγές θα εμφανιστούν εδώ,', - empty_txs2: 'καμία συναλλαγή', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Πάτησε εδώ για να αγοράσεις Bitcoin', - }, - reorder: { - title: 'Άλλαξε την σειρά των Πορτοφολιών', - }, - add: { - title: 'Πρόσθεσε πορτοφόλι', - description: - 'Μπορείς να σκανάρεις ένα χάρτινο πορτοφόλι (σε WIF - Wallet Import Format), ή να δημιουργήσεις ένα νέο πορτοφόλι. Υποστηρίζουμε πορτοφόλια τύπου Segwit.', - scan: 'Σκάναρε', - create: 'Δημιούργησε', - label_new_segwit: 'Νεό πορτοφόλι τύπου SegWit', - label_new_lightning: 'Νέο πορτοφόλι Lightning', - wallet_name: 'όνομα', - wallet_type: 'τύπος', - or: 'ή', - import_wallet: 'Εισήγαγε πορτοφόλι', - imported: 'Εισήχθηκε', - coming_soon: 'Σύντομα', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Πορτοφόλι', - address: 'Διεύθυνση', - type: 'Τύπος', - label: 'Ετικέτα', - destination: 'προορισμός', - description: 'περιγραφή', - are_you_sure: 'Είσαι σίγουρος;', - yes_delete: 'Ναι, διέγραψε', - no_cancel: 'Όχι, ακύρωσε', - delete: 'Διέγραψε', - save: 'Σώσε', - delete_this_wallet: 'Διέγραψε το πορτοφόλι', - export_backup: 'Εξήγαγε / δημιούργησε αντίγραφο ασφαλείας', - buy_bitcoin: 'Αγόρασε Bitcoin', - show_xpub: 'Δείξε το XPUB του πορτοφολιού', - }, - export: { - title: 'Εξαγωγή πορτοφολιού', - }, - xpub: { - title: 'XPUB του πορτοφολιού', - copiedToClipboard: 'Αντιγράφηκε στο clipboard.', - }, - import: { - title: 'Εισαγωγή', - explanation: - 'Γράψε εδώ το μνημονικό (φράση), το ιδιωτικό κλειδί, το WIF, ή ό,τι άλλο έχεις. Το BlueWallet θα προσπαθήσει να μαντέψει το σωστό format και να εισάγει το πορτοφόλι', - imported: 'Εισήχθη', - error: 'Η εισαγωγή απέτυχε. Παρακαλούμε σιγουρευτείτε ότι τα δεδομένα που εισάγετε είναι σωστά.', - success: 'Επιτυχία', - do_import: 'Εισήγαγε', - scan_qr: 'ή θέλεις θα σκανάρεις ένα QR code;', - }, - scanQrWif: { - go_back: 'Πίσω', - cancel: 'Ακύρωσε', - decoding: 'Αποκωδικοποίηση', - input_password: 'Βάλε τον κωδικό', - password_explain: 'Αυτό είναι ένα κρυπτογραφημένο ιδιωτικό κλειδί τύπου BIP38', - bad_password: 'Λάθος κωδικός', - wallet_already_exists: 'Αυτό το πορτοφόλι υπάρχει ήδη', - bad_wif: 'Λάθος WIF', - imported_wif: 'Εισήχθη το WIF ', - with_address: ' με διεύθυνση ', - imported_segwit: 'Εισήχθη SegWit', - imported_legacy: 'Εισήχθη πορτοφόλιο παλαιού τύπου (Legacy)', - imported_watchonly: 'Εισήχθη πορτοφόλι παρακολούθησης (Watch-only)', - }, - }, - transactions: { - list: { - tabBarLabel: 'Συναλλαγές', - title: 'συναλλαγές', - description: 'Λίστα των εισερχόμενων και εξερχόμενων συναλλαγών όλων των πορτοφολιών σου', - conf: 'conf', - }, - details: { - title: 'Συναλλαγή', - from: 'Εισερχόμενες διευθύνσεις', - to: 'Εξερχόμενες διευθύνσεις', - copy: 'Αντέγραψε', - transaction_details: 'Λεπτομέρειες συναλλαγής', - show_in_block_explorer: 'Δείξε στον block explorer', - }, - }, - send: { - header: 'Στείλε', - details: { - title: 'δημιούργησε συναλλαγή', - amount_field_is_not_valid: 'Το ποσό δεν είναι σωστό', - fee_field_is_not_valid: 'Τα έξοδα συναλλαγής δεν είναι σωστά', - address_field_is_not_valid: 'Η διεύθυνση δεν είναι σωστή', - total_exceeds_balance: 'Δεν έχετε αρκετό υπόλοιπο για να στείλετε αυτό το ποσό.', - create_tx_error: 'Σφάλμα στην δημιουργία της συναλλαγής. Σιγουρευτείτε ότι η διεύθυνση είναι σωστή.', - address: 'διεύθυνση', - amount_placeholder: 'ποσό πληρωμής (σε BTC)', - fee_placeholder: 'συν έξοδα συναλλαγής (σε BTC)', - note_placeholder: 'Σημείωση', - cancel: 'Ακύρωση', - scan: 'Σκάναρε', - send: 'Στείλε', - create: 'Δημιούργησε', - remaining_balance: 'Υπόλοιπο', - }, - confirm: { - header: 'Επικύρωση', - sendNow: 'Στείλε τώρα', - }, - success: { - done: 'Ολοκληρώθηκε', - }, - create: { - details: 'Λεπτομέρειες', - title: 'δημιούργησε συναλλαγή', - error: 'Σφάλμα στη δημιουργία συναλλαγής. Λάθος διεύθυνση ή ποσό συναλλαγής;', - go_back: 'Πίσω', - this_is_hex: 'Αυτή είναι η υπογεγραμμένη συναλλαγή σε μορφή hex και είναι έτοιμη για αποστολή στο δίκτυο.', - to: 'Προς', - amount: 'Ποσό', - fee: 'Έξοδα', - tx_size: 'Μέγεθος συναλλαγής', - satoshi_per_byte: 'Satoshi ανά byte', - memo: 'Σημείωση', - broadcast: 'Στείλε στο δίκτυο', - not_enough_fee: 'Τα έξοδα συναλλαγής δεν είναι αρκετά. Αυξήστε τα.', - }, - }, - receive: { - header: 'Λήψη', - details: { - title: 'Δώσε αυτήν τη διεύθυνση στον πληρωτή', - share: 'Δώσε', - copiedToClipboard: 'Αντιγράφηκε στο clipboard.', - label: 'Περιγραφή', - create: 'Δημιούργησε', - setAmount: 'Λάβε με ποσό', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Αγόρασε Bitcoin', - tap_your_address: 'Πάτησε στην διεύθυνσή σου για να αντιγραφεί στο clipboard:', - copied: 'Αντιγράφηκε στο Clipboard!', - }, - settings: { - header: 'ρυθμίσεις', - plausible_deniability: 'Εύλογη δυνατότητα άρνησης...', - storage_not_encrypted: 'Το αρχείο δεν είναι κρυπτογραφημένο', - storage_encrypted: 'Το αρχείο είναι κρυπτογραφημένο', - password: 'Κωδικός', - password_explain: 'Δώσε ένα κωδικό για την κρυπτογράφηση του αρχείου', - retype_password: 'Ξαναδώσε τον κωδικό', - passwords_do_not_match: 'Οι κωδικοί δεν είναι ίδιοι', - encrypt_storage: 'Κρυπτογράφησε το αρχείο', - lightning_settings: 'Ρυθμίσεις Lightning', - lightning_settings_explain: - 'Για να συνδεθείτε στον δικό σας κόμβο LND παρακαλούμε εγκαταστήστε το LndHub' + - ' και βάλτε το URL του εδώ. Αφήστε το κενό για να χρησιμοποιήσετε το LNDHub της BlueWallet (lndhub.io). Αφού σώσετε τις ρυθμίσεις τυχόν νέα πορτοφόλια που θα δημιουργήσετε θα συνδεθούν στο LNDHub που επιλέξατε.', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Σώσε', - about: 'Σχετικά', - language: 'Γλώσσα', - currency: 'Νόμισμα', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Εύλογη δυνατότητα άρνησης', - help: - 'Μπορεί κάποια στιγμή να υποχρεωθείτε να αποκαλύψετε τον ' + - 'κωδικό σας. Για να προστατέψετε τα χρήματά σας, το BlueWallet μπορεί να δημιουργήσει ένα εναλλακτικό ' + - 'κρυπτογραφημένο αρχείο με διαφορετικό κωδικό. Εάν σας υποχρεώσουν, ' + - 'μπορείτε να αποκαλύψετε αυτόν τον δεύτερο κωδικό. Κάποιος που θα τον ' + - 'βάλει στο BlueWallet θα δει ένα μόνο ένα ψεύτικο αρχείο που μοιάζει ' + - 'κανονικό, προστατεύοντας έτσι το κανονικό σας αρχείο και ' + - 'τα χρήματά σας.', - help2: 'Το νέο αρχείο θα είναι πλήρως λειτουργικό, και μπορείτε να βάλετε εκεί ' + 'κάποια ελάχιστα χρήματα για να μοιάζει αληθινό.', - create_fake_storage: 'Δημιούργησε ένα ψεύτικο κρυπτογραφημένο αρχείο', - go_back: 'Πίσω', - create_password: 'Δώσε έναν κωδικό', - create_password_explanation: 'Ο κωδικός του ψεύτικου αρχείου δεν πρέπει να είναι ίδιος με τον κωδικό του πραγματικού αρχείου', - password_should_not_match: 'Ο κωδικός του ψεύτικου αρχείου δεν πρέπει να είναι ίδιος με τον κωδικό του πραγματικού αρχείου', - retype_password: 'Ξαναδώσε τον κωδικό', - passwords_do_not_match: 'Οι κωδικοί δεν είναι ίδιοι, δοκίμασε ξανά', - success: 'Επιτυχία', - }, - lnd: { - title: 'Διαχείριση χρημάτων', - choose_source_wallet: 'Διάλεξε ένα πορτοφόλι', - refill_lnd_balance: 'Γέμισε το πορτοφόλι Lightning', - refill: 'Γέμισμα πορτοφολιού', - withdraw: 'Ανάληψη', - expired: 'Έληξε', - placeholder: 'Τιμολόγιο', - sameWalletAsInvoiceError: 'Δεν μπορείς να εξοφλήσεις ένα τιμολόγιο από το ίδιο πορτοφόλι με το οποίο δημιουργήθηκε.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/en.js b/loc/en.js index 92ecfdb81a..6c04a81888 100644 --- a/loc/en.js +++ b/loc/en.js @@ -1,81 +1,152 @@ module.exports = { _: { + languageCode: 'en', storage_is_encrypted: 'Your storage is encrypted. Password is required to decrypt it', enter_password: 'Enter password', bad_password: 'Bad password, try again', never: 'never', continue: 'Continue', ok: 'OK', + click: 'Click', + here: 'here', + save: 'Save', + confirm: 'Confirm', + copy: 'Copy', + copied: 'Copied!', + }, + tabNavigator: { + dashboard: 'Dashboard', + settings: 'Settings', + addressBook: 'Address book', + }, + message: { + somethingWentWrong: 'Something went wrong', + somethingWentWrongWhileCreatingWallet: + 'Something went wrong while we were creating your wallet. Please return to Dashboard and try again.', + success: 'Success', + successfullWalletImport: 'Your wallet has been successfully imported. You can now return to Dashboard.', + successfullWalletDelete: 'Your wallet has been successfully deleted. You can now return to Dashboard.', + returnToDashboard: 'Return to Dashboard', + creatingWallet: 'Creating your wallet', + creatingWalletDescription: 'Please be patient while we create your wallet. It may take a while.', + }, + onboarding: { + onboarding: 'Onboarding', + pin: 'PIN', + createPin: 'Create PIN', + createNewPin: 'New PIN', + createPassword: 'Create transaction password', + createPinDescription: + 'Your PIN will be used to log in to the application. You can change it later in the Settings section.', + confirmPin: 'Confirm PIN', + confirmNewPin: 'Confirm new PIN', + confirmPassword: 'Confirm transaction password', + passwordDoesNotMatch: 'Password does not match. Please enter a valid password.', + createPasswordDescription: + 'Your Transaction Password will be used to verify all of the transactions. You cannot change it later. Transaction Password must contain at least 8 alphanumerical characters.', + changePin: 'Change PIN', + currentPin: 'Current PIN', + pinDoesNotMatch: 'PIN does not match. Please enter a valid PIN.', + successDescription: 'Hooray! \n You have successfully created your PIN.', + successDescriptionChangedPin: 'Hooray! \n You have successfully changed your PIN.', + successButton: 'Go to Dashboard', + successButtonChangedPin: 'Go back to Settings', + }, + unlock: { + title: 'Unlock', + touchID: 'Touch ID for "Veles Wallet"', + confirmButton: 'Confirm fingerprint to continue.', + enter: 'Enter PIN', + }, + unlockTransaction: { + headerText: 'Confirm transaction', + title: 'Confirm Transaction Password', + description: 'Confirm Transaction Password in order to proceed the transaction.', }, wallets: { - select_wallet: 'Select Wallet', - options: 'options', - createBitcoinWallet: - 'You currently do not have a Bitcoin wallet. In order to fund a Lightning wallet, a Bitcoin wallet needs to be created or imported. Would you like to continue anyway?', - list: { - app_name: 'BlueWallet', - title: 'wallets', - header: 'A wallet represents a pair of a secret (private key) and an address' + 'you can share to receive coins.', - add: 'Add Wallet', - create_a_wallet: 'Create a wallet', - create_a_wallet1: "It's free and you can create", - create_a_wallet2: 'as many as you like', - latest_transaction: 'latest transaction', - empty_txs1: 'Your transactions will appear here,', - empty_txs2: 'none at the moment', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Tap here to buy Bitcoin', - }, - reorder: { - title: 'Reorder Wallets', + dashboard: { + title: 'Wallets', + allWallets: 'All wallets', + noWallets: 'No wallets', + noWalletsDesc1: 'No wallets to show.', + noWalletsDesc2: 'to add your first wallet.', + send: 'Send coins', + receive: 'Receive coins', + noTransactions: 'No transactions to show.', + }, + walletModal: { + btcv: 'VLS', + wallets: 'Wallets', + }, + importWallet: { + title: 'Import your wallet', + header: 'Import wallet', + subtitle: + "Write here your mnemonic, private key, WIF or anything you've got. VelesWallet will do its best to guess the correct format and import you wallet.", + placeholder: 'Mnemonic, private key, WIF', + import: 'Import', + scanQrCode: 'or scan QR code', + walletInUseValidationError: 'Wallet is already in use. Please enter a valid wallet.', + }, + exportWallet: { + title: 'Mnemonic phrase', + header: 'Export wallet', + }, + exportWalletXpub: { + header: 'Wallet XPUB', + }, + deleteWallet: { + title: 'Delete your wallet', + header: 'Delete wallet', + description1: 'Are you sure you want to delete', + description2: "? You can't undone it.", + no: 'No', + yes: 'Yes', }, + wallet: { + none: 'None', + latest: 'Latest transaction', + }, + add: { - title: 'add wallet', + title: 'Add new wallet', + subtitle: 'Name your wallet', + description: 'Please enter name for your new wallet.', + inputLabel: 'Name', + addWalletButton: 'Add new wallet', + importWalletButton: 'Import wallet', + advancedOptions: 'Advanced options', + multipleAddresses: 'It contains a tree of P2SH addresses generated from a single 24-word seed', + singleAddress: 'It contains a single P2SH address', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: 'It contains a tree of native segwit addresses, generated from a single 24-word seed', + }, + addSuccess: { + title: 'Add new wallet', + subtitle: 'Success', description: - 'You can either scan backup paper wallet (in WIF - Wallet Import Format), or create a new wallet. Segwit wallets supported by default.', - scan: 'Scan', - create: 'Create', - label_new_segwit: 'New SegWit', - label_new_lightning: 'New Lightning', - wallet_name: 'name', - wallet_type: 'type', - or: 'or', - import_wallet: 'Import wallet', - imported: 'Imported', - coming_soon: 'Coming soon', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'Your wallet has been created. Please take a moment to write down this mnemonic phrase on a piece of paper. It’s your backup. You can use it to restore the wallet on other devices.', + okButton: 'OK, I wrote this down!', }, details: { - title: 'Wallet', - address: 'Address', - type: 'Type', - label: 'Label', - destination: 'destination', - description: 'description', - are_you_sure: 'Are you sure?', - yes_delete: 'Yes, delete', - no_cancel: 'No, cancel', - delete: 'Delete', - save: 'Save', - delete_this_wallet: 'Delete this wallet', - export_backup: 'Export / backup', - buy_bitcoin: 'Buy Bitcoin', - show_xpub: 'Show wallet XPUB', + edit: 'Edit', + latestTransaction: 'Latest transaction', + typeLabel: 'Type', + nameLabel: 'Name', + exportWallet: 'Export wallet', + showWalletXPUB: 'Show wallet XPUB', + deleteWallet: 'Delete wallet', + nameEdit: 'Edit name', }, export: { title: 'wallet export', }, - xpub: { - title: 'wallet XPUB', - copiedToClipboard: 'Copied to clipboard.', - }, import: { title: 'import', explanation: - "Write here your mnemonic, private key, WIF, or anything you've got. BlueWallet will do its best to guess the correct format and import your wallet", + "Write here your mnemonic, private key, WIF, or anything you've got. VelesWallet will do its best to guess the correct format and import your wallet", imported: 'Imported', error: 'Failed to import. Please, make sure that the provided data is valid.', success: 'Success', @@ -91,8 +162,8 @@ module.exports = { bad_password: 'Bad password', wallet_already_exists: 'Such wallet already exists', bad_wif: 'Bad WIF', - imported_wif: 'Imported WIF ', - with_address: ' with address ', + imported_wif: 'Imported WIF', + with_address: 'with address', imported_segwit: 'Imported SegWit', imported_legacy: 'Imported Legacy', imported_watchonly: 'Imported Watch-only', @@ -100,145 +171,194 @@ module.exports = { }, transactions: { list: { - tabBarLabel: 'Transactions', - title: 'transactions', - description: 'A list of ingoing or outgoing transactions of your wallets', - conf: 'conf', + conf: 'Confirmations', }, details: { title: 'Transaction', - from: 'Input', - to: 'Output', + detailTitle: 'Transaction details', + transactionHex: 'Transaction hex', + transactionHexDescription: 'This is transaction hex, signed and ready to be broadcast to the network', + copyAndBoriadcast: 'Copy and broadcast later', + verify: 'Verify on coinb.in', + amount: 'Amount', + fee: 'Fee', + txSize: 'TX size', + satoshiPerByte: 'Satoshi per byte', + from: 'From', + to: 'To', + bytes: 'bytes', copy: 'Copy', - transaction_details: 'Transaction details', - show_in_block_explorer: 'View in block explorer', + noLabel: 'No label', + details: 'Details', + transactionId: 'Transaction ID', + confirmations: 'confirmations', + transactionDetails: 'Transaction details', + viewInBlockRxplorer: 'View in block explorer', + addNote: 'Add note', + note: 'Note', + inputs: 'Inputs', + ouputs: 'Outputs', + sendCoins: 'Send coins', }, }, send: { - header: 'Send', + header: 'Send coins', + success: { + title: 'Success', + description: 'Hooray! You have successfully finished the transaction.', + done: 'Done', + return: 'Return to Dashboard', + }, details: { title: 'create transaction', amount_field_is_not_valid: 'Amount field is not valid', fee_field_is_not_valid: 'Fee field is not valid', address_field_is_not_valid: 'Address field is not valid', - total_exceeds_balance: 'The sending amount exceeds the available balance.', create_tx_error: 'There was an error creating the transaction. Please, make sure the address is valid.', address: 'address', - amount_placeholder: 'amount to send (in BTC)', - fee_placeholder: 'plus transaction fee (in BTC)', + amount_placeholder: 'amount to send (in VLS)', + fee_placeholder: 'plus transaction fee (in VLS)', note_placeholder: 'note to self', cancel: 'Cancel', scan: 'Scan', send: 'Send', - create: 'Create', + next: 'Next', + note: 'Note (optional)', + to: 'to', + feeUnit: 'Sat/B', + fee: 'Fee:', + create: 'Create Invoice', remaining_balance: 'Remaining balance', + total_exceeds_balance: 'The sending amount exceeds the available balance.', }, confirm: { - header: 'Confirm', sendNow: 'Send now', }, - success: { - done: 'Done', - }, create: { - details: 'Details', - title: 'create transaction', - error: 'Error creating transaction. Invalid address or send amount?', - go_back: 'Go Back', - this_is_hex: 'This is transaction hex, signed and ready to be broadcast to the network.', - to: 'To', amount: 'Amount', fee: 'Fee', - tx_size: 'TX size', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Broadcast', - not_enough_fee: 'Not enough fee. Increase the fee', + setTransactionFee: 'Set a transaction fee', + headerText: + 'When there is a large number of pending transaction on the network (>1500), the higher fee will result in your transaction being processed faster. The typical values are 1-500 sat/b', }, }, receive: { - header: 'Receive', + header: 'Receive coins', details: { - title: 'Share this address with payer', - share: 'share', - copiedToClipboard: 'Copied to clipboard.', - label: 'Description', - create: 'Create', - setAmount: 'Receive with amount', + amount: 'Amount', + share: 'Share', + receiveWithAmount: 'Receive with amount', }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Buy Bitcoin', - tap_your_address: 'Tap your address to copy it to clipboard:', - copied: 'Copied to Clipboard!', }, settings: { - header: 'settings', - plausible_deniability: 'Plausible deniability...', - storage_not_encrypted: 'Storage: not encrypted', - storage_encrypted: 'Storage: encrypted', - password: 'Password', - password_explain: 'Create the password you will use to decrypt the storage', - retype_password: 'Re-type password', - passwords_do_not_match: 'Passwords do not match', - encrypt_storage: 'Encrypt storage', - lightning_settings: 'Lightning Settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - " and put its URL here in settings. Leave blank to use BlueWallet's LNDHub (lndhub.io). Wallets created after saving changes will connect to the specified LNDHub.", - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Save', - about: 'About', language: 'Language', - currency: 'Currency', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Plausible Deniability', - help: - 'Under certain circumstances, you might be forced to disclose a ' + - 'password. To keep your coins safe, BlueWallet can create another ' + - 'encrypted storage, with a different password. Under pressure, ' + - 'you can disclose this password to a 3rd party. If entered in ' + - "BlueWallet, it will unlock new 'fake' storage. This will seem " + - 'legit to a 3rd party, but will secretly keep your main storage ' + - 'with coins safe.', - help2: 'New storage will be fully functional, and you can store some ' + 'minimum amounts there so it looks more believable.', - create_fake_storage: 'Create fake encrypted storage', - go_back: 'Go Back', - create_password: 'Create a password', - create_password_explanation: 'Password for fake storage should not match password for your main storage', - password_should_not_match: 'Password for fake storage should not match password for your main storage', - retype_password: 'Retype password', - passwords_do_not_match: 'Passwords do not match, try again', + general: 'General', + security: 'Security', + about: 'About', + electrumServer: 'Electrum server', + advancedOptions: 'Advanced options', + changePin: 'Change PIN', + fingerprintLogin: 'Fingerprint login', + aboutUs: 'About us', + header: 'Settings', + notSupportedFingerPrint: 'Your device does not support fingerprint', + TouchID: 'Allow fingerprint', + FaceID: 'Allow FaceID', + Biometrics: 'Allow biometrics', + }, + aboutUs: { + header: 'About us', + releaseNotes: 'Release notes', + runSelfTest: 'Run self test', + buildWithAwesome: 'Build with awesome:', + rateVelesWallet: 'Rate VelesWallet', + goToOurGithub: 'Go to our Github', + alwaysBackupYourKeys: 'Always backup your keys', + title: 'Veles wallet is a free and open source Cortez Vault wallet. Licensed MIT.', + }, + electrumServer: { + header: 'Electrum server', + title: 'Change electrum server', + description: + 'You can change the address of the server your application will connect to. Default address is recommended.', + save: 'Save', + useDefault: 'Use default', + host: 'host', + port: 'port', + successfullSave: 'Your changes have been saved successfully. Restart may be required for changes to take effect.', + connectionError: "Can't connect to provided Electrum server", + }, + advancedOptions: { + title: 'Configure advanced options', + description: + 'Enabling Advanced options will allow you to choose from wallet types listed below: \nP2SH, HD P2SH, HD segwit.', + }, + selectLanguage: { + header: 'Language', + restartInfo: 'When selecting a new language, restarting VelesWallet may be required for the change to take effect', + confirmation: 'Confirmation', + confirm: 'Confirm', + alertDescription: 'Select language and restart the application?', + cancel: 'Cancel', + }, + contactList: { + cancel: 'Cancel', + search: 'Search', + screenTitle: 'Address book', + noContacts: 'No contacts', + noContactsDesc1: 'No contacts to show. \n Click', + noContactsDesc2: 'to add your first contact.', + noResults: 'No results for', + }, + contactCreate: { + screenTitle: 'Add new contact', + subtitle: 'New contact', + description: 'Please enter name and address\nfor your new contact.', + nameLabel: 'Name', + addressLabel: 'Address', + buttonLabel: 'Add new contact', + successTitle: 'Success', + successDescription: 'Hooray! You have successfully\nadded your contact.', + successButton: 'Return to Address book', + }, + contactDetails: { + nameLabel: 'Name', + addressLabel: 'Address', + editName: 'Edit name', + editAddress: 'Edit address', + sendCoinsButton: 'Send coins', + showQRCodeButton: 'Show QR code', + deleteButton: 'Delete contact', + share: 'Share', + }, + contactDelete: { + title: 'Delete your contact', + header: 'Delete contact', + description1: 'Are you sure you want to delete', + description2: "?\nYou can't undone it.", + no: 'No', + yes: 'Yes', success: 'Success', + successDescription: 'Your contact has been successfully deleted.\nYou can now return to Address book.', + successButton: 'Return to Address book', + }, + scanQrCode: { + permissionTitle: 'Permission to use camera', + permissionMessage: 'We need your permission to use your camera', + ok: 'Ok', + cancel: 'Cancel', }, - lnd: { - title: 'manage funds', - choose_source_wallet: 'Choose a source wallet', - refill_lnd_balance: 'Refill Lightning wallet balance', - refill: 'Refill', - withdraw: 'Withdraw', - expired: 'Expired', - placeholder: 'Invoice', - sameWalletAsInvoiceError: 'You can not pay an invoice with the same wallet used to create it.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', + filterTransactions: { + header: 'Filter transactions', + receive: 'Receive', + send: 'Send', + filter: 'Filter', + to: 'To', + toAmount: 'To amount', + toDate: 'To date', + from: 'From', + fromAmount: 'From amount', + fromDate: 'From date', + clearFilters: 'Clear filters', }, }; diff --git a/loc/es.js b/loc/es.js index edaa2bde3a..76672fc486 100644 --- a/loc/es.js +++ b/loc/es.js @@ -1,247 +1,351 @@ module.exports = { _: { - storage_is_encrypted: 'Su almacenamiento está cifrado. Se requiere contraseña para descifrarla.', - enter_password: 'Inserte contraseña', - bad_password: 'Contraseña incorrecta. Intente nuevamente.', + languageCode: 'es', + storage_is_encrypted: 'Su almacenamiento está cifrado. Se requiere contraseña para descifrarlo', + enter_password: 'Escribir contraseña', + bad_password: 'Contraseña incorrecta, inténtelo nuevamente', never: 'nunca', - continue: 'Continua', - ok: 'OK', + continue: 'Continuar', + ok: 'Aceptar', + click: 'Clic', + here: 'aquí', + save: 'Guardar', + confirm: 'Confirmar', + copy: 'Copiar', + copied: '¡Copiado!', + }, + tabNavigator: { + dashboard: 'Panel', + settings: 'Configuración', + addressBook: 'Libreta de direcciones', + }, + message: { + somethingWentWrong: 'Algo salió mal', + somethingWentWrongWhileCreatingWallet: + 'Algo salió mal mientras estábamos creando su monedero. Vuelva al Panel e inténtelo nuevamente.', + success: 'Completado', + successfullWalletImport: 'Su monedero ha sido importado correctamente. Ahora puede volver al Panel.', + successfullWalletDelete: 'Su monedero ha sido eliminado correctamente. Ahora puede volver al Panel.', + returnToDashboard: 'Volver al Panel', + creatingWallet: 'Creación de su monedero', + creatingWalletDescription: 'Tenga paciencia mientras creamos su monedero. Puede que lleve un tiempo.', + }, + onboarding: { + onboarding: 'Configuración inicial', + pin: 'PIN', + createPin: 'Crear PIN', + createNewPin: 'Nuevo PIN', + createPassword: 'Crear contraseña de transacción', + createPinDescription: + 'Su PIN se utilizará para acceder a la aplicación. Puede cambiarlo más tarde en la sección de Configuración.', + confirmPin: 'Confirmar PIN', + confirmNewPin: 'Confirmar nuevo PIN', + confirmPassword: 'Confirmar contraseña de transacción', + passwordDoesNotMatch: 'La contraseña no coincide. Por favor, introduzca una contraseña válida.', + createPasswordDescription: + 'Su contraseña de transacción se utilizará para verificar todas las transacciones. No podrá cambiarla más tarde. La contraseña de transacción debe contener al menos 8 caracteres alfanuméricos.', + changePin: 'Cambiar PIN', + currentPin: 'PIN actual', + pinDoesNotMatch: 'El PIN no coincide. Por favor, introduzca un PIN válido.', + successDescription: '¡Bravo! \n Ha creado con éxito su PIN.', + successDescriptionChangedPin: '¡Bravo! \n Ha cambiado con éxito su PIN.', + successButton: 'Ir al Panel', + successButtonChangedPin: 'Volver a Configuración', + }, + unlock: { + title: 'Desbloquear', + touchID: 'Touch ID para «Veles Wallet»', + confirmButton: 'Confirmar la huella digital para continuar.', + enter: 'Introducir PIN', + }, + unlockTransaction: { + headerText: 'Confirmar transacción', + title: 'Confirmar la contraseña de transacción', + description: 'Confirmar la contraseña de transacción para proceder a la transacción.', }, wallets: { - options: 'opciones', - select_wallet: 'Selecciona billetera', - createBitcoinWallet: - 'In order to use a Lightning wallet, a Bitcoin wallet is needed in order to fund it. Would you like to continue anyway?', - list: { - app_name: 'BlueWallet', - title: 'billeteras', - header: 'Un Monedero esta representado con secreto (clave privada) y una dirección' + 'que puedes compartir para recibir monedas.', - add: 'Añadir Carterqa', - create_a_wallet: 'Crear una billetera', - create_a_wallet1: 'Es gratis y puedes crear cuantas deseas', - create_a_wallet2: 'cuantas usted quiera', - latest_transaction: 'última transacción', - empty_txs1: 'Sus transacciones aparecerán aquí,', - empty_txs2: 'ninguno por el momento.', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Tap here to buy Bitcoin', + dashboard: { + title: 'Monederos', + allWallets: 'Todas las carteras', + noWallets: 'No hay monederos', + noWalletsDesc1: 'No hay monederos para mostrar.', + noWalletsDesc2: 'para agregar su primer monedero.', + send: 'Enviar monedas', + receive: 'Recibir monedas', + noTransactions: 'No hay transacciones para mostrar.', + }, + walletModal: { btcv: 'VLS', wallets: 'Monederos' }, + importWallet: { + title: 'Importe su monedero', + header: 'Importar monedero', + subtitle: + 'Escriba aquí su frase mnemotécnica, clave privada, WIF o cualquier dato que tenga. VelesWallet hará todo lo posible para adivinar el formato correcto e importar su monedero.', + placeholder: 'Frase mnemotécnica, clave privada, WIF', + import: 'Importar', + scanQrCode: 'o escanear el código QR', + walletInUseValidationError: 'El monedero ya está en uso. Introduzca un monedero válido.', }, - reorder: { - title: 'Reorganizar Billetera', + exportWallet: { title: 'Frase mnemotécnica', header: 'Exportar monedero' }, + exportWalletXpub: { header: 'Monedero XPUB' }, + deleteWallet: { + title: 'Elimine su monedero', + header: 'Eliminar monedero', + description1: '¿Está seguro que quiere eliminarlo', + description2: '? No podrá deshacer esta operación.', + no: 'No', + yes: 'Sí', }, + wallet: { none: 'Ninguna', latest: 'Última transacción' }, add: { - title: 'Añadir billetera', + title: 'Añadir nuevo monedero', + subtitle: 'Ponga un nombre a su monedero', + description: 'Introduzca un nombre para su nuevo monedero.', + inputLabel: 'Nombre', + addWalletButton: 'Añadir nuevo monedero', + importWalletButton: 'Importar monedero', + advancedOptions: 'Opciones avanzadas', + multipleAddresses: 'Múltiples direcciones', + singleAddress: 'Dirección única', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: + 'Contiene un árbol de direcciones SegWit nativas, generadas a partir de una única semilla de 24 palabras', + }, + addSuccess: { + title: 'Añadir nuevo monedero', + subtitle: 'Completado', description: - 'Puedes escanear la billetera de papel (en WIF - Formato de importación de billeteras) o crear una nueva billetera. Las billeteras SegWit estan compatibles por defecto.', - scan: 'Escaniar', - create: 'Crear', - label_new_segwit: 'Nuevo SegWit', - label_new_lightning: 'Nuevo Lightning', - wallet_name: 'nombre de billetera', - wallet_type: 'tipo de billetera', - or: 'o', - import_wallet: 'Importar billetera', - imported: 'Importado', - coming_soon: 'Viene pronto', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'Su monedero ha sido creado. Tómese un momento para escribir esta frase mnemotécnica en una hoja de papel. Es su copia de seguridad. Puede usarlo para restaurar el monedero en otros dispositivos.', + okButton: 'De acuerdo, ¡ya lo he escrito!', }, details: { - title: 'Detalles de la billetera', - address: 'Dirección', - type: 'Tipo', - label: 'Etiqueta', - delete: 'Eliminar', - save: 'Guardar', - destination: 'destino', - description: 'descripcion', - are_you_sure: '¿Estás seguro?', - yes_delete: 'Si, eliminar', - no_cancel: 'No, cancelar', - delete_this_wallet: 'Eliminar esta carterqa', - export_backup: 'Exportar / Guardar', - buy_bitcoin: 'Buy Bitcoin', - show_xpub: 'Show wallet XPUB', - }, - export: { - title: 'Exportacion de billetera', - }, - xpub: { - title: 'wallet XPUB', - copiedToClipboard: 'Copiado a portapapeles.', + edit: 'Editar', + latestTransaction: 'Última transacción', + typeLabel: 'Tipo', + nameLabel: 'Nombre', + exportWallet: 'Exportar monedero', + showWalletXPUB: 'Mostrar monedero XPUB', + deleteWallet: 'Eliminar monedero', + nameEdit: 'Editar nombre', }, + export: { title: 'exportar monedero' }, import: { title: 'importar', explanation: - 'Escriba aquí mnemotécnica, clave privada, WIF o cualquier cosa que tenga. BlueWallet hará todo lo posible para adivinar el formato correcto e importar su billetera.', + 'Escriba aquí su clave mnemotécnica privada, WIF o cualquier cosa que tenga. VelesWallet hará todo lo posible para adivinar el formato correcto e importar su monedero', imported: 'Importado', - error: 'No se pudo importar. ¿Es valido?', - success: 'Exito', - do_import: 'Importar', - scan_qr: 'o escanear codigo QR?', + error: 'Error al importar. Asegúrese de que los datos proporcionados sean válidos.', + success: 'Completado', + do_import: '¿Importar', + scan_qr: 'o escanear el código QR en su lugar?', }, scanQrWif: { - go_back: 'Regresar', + go_back: 'Volver', cancel: 'Cancelar', - decoding: 'Descodificación', - input_password: 'Ingrese su contraseña', - password_explain: 'Eso es BIP38 clave privada encriptada', - bad_password: 'Contraseña equivocada', - wallet_already_exists: 'Esa billetera ya existe', - bad_wif: 'WIF equivocado', - imported_wif: 'WIF importado ', - with_address: ' con dirección ', + decoding: 'Descifrando', + input_password: 'Introduzca la contraseña', + password_explain: 'Esta es la clave privada cifrada BIP38', + bad_password: 'Contraseña incorrecta', + wallet_already_exists: 'Este monedero ya existe', + bad_wif: 'WIF incorrecto', + imported_wif: 'WIF importado', + with_address: 'con direccion', imported_segwit: 'SegWit importado', - imported_legacy: 'Legado importado', - imported_watchonly: 'Watch-only importado', + imported_legacy: 'Legacy importado', + imported_watchonly: 'Versión de solo lectura importada', }, }, transactions: { - list: { - tabBarLabel: 'Transacciónes', - title: 'transacciónes', - description: 'Una lista de las transacciones entrantes o salientes de sus billeteras', - conf: 'conf', - }, + list: { conf: 'Confirmaciones' }, details: { - title: 'Transaccion', + title: 'Transacción', + detailTitle: 'Detalles de la transacción', + transactionHex: 'Transacción en hexadecimal', + transactionHexDescription: 'Esta es una transacción hexadecimal, firmada y lista para ser transmitida a la red', + copyAndBoriadcast: 'Copiar y transmitir más tarde', + verify: 'Verificar en coinb.in', + amount: 'Cantidad', + fee: 'Comisión', + txSize: 'Tamaño TX', + satoshiPerByte: 'Satoshi por byte', from: 'De', - to: 'A', + to: 'Para', + bytes: 'bytes', copy: 'Copiar', - transaction_details: 'Detalles de la transacción', - show_in_block_explorer: 'Mostrar en explorador de bloques', + noLabel: 'Sin etiqueta', + details: 'Detalles', + transactionId: 'ID de transacción', + confirmations: 'confirmaciones', + transactionDetails: 'Detalles de la transacción', + viewInBlockRxplorer: 'Ver en el explorador de bloques', + addNote: 'Añadir nota', + note: 'Nota', + inputs: 'Inputs', + ouputs: 'Outputs', + sendCoins: 'Enviar monedas', }, }, send: { - header: 'enviar', - confirm: { - header: 'Confirm', - sendNow: 'Send now', - }, + header: 'Enviar monedas', success: { - done: 'Done', + title: 'Completado', + description: '¡Bravo! Ha finalizado la transacción correctamente.', + done: 'Hecho', + return: 'Volver al Panel', }, details: { - title: 'Crear Transaccion', - amount_field_is_not_valid: 'La cantidad no es válida', - fee_field_is_not_valid: 'La tasa no es válida', - address_field_is_not_valid: 'La dirección no es válida', - receiver_placeholder: 'La dirección de recipiente', - amount_placeholder: 'cantidad para enviar (in BTC)', - fee_placeholder: 'más tasa de transaccion (in BTC)', - note_placeholder: 'comentario (para ti mismo)', - create_tx_error: 'Se ha producido un error al crear la transacción. Por favor, asegúrese de que la dirección es válida.', + title: 'crear transacción', + amount_field_is_not_valid: 'El campo de cantidad no es válido', + fee_field_is_not_valid: 'El campo de comisión no es válido', + address_field_is_not_valid: 'El campo de dirección no es válido', + create_tx_error: 'Se produjo un error al crear la transacción. Asegúrese de que la dirección sea válida.', + address: 'dirección', + amount_placeholder: 'cantidad a enviar (en VLS)', + fee_placeholder: 'más la comisión de transacción (en VLS)', + note_placeholder: 'nota personal', cancel: 'Cancelar', - scan: 'Escaniar', - address: 'Direccion', - create: 'Crear', - send: 'Envíar', - remaining_balance: 'Balance disponible', - total_exceeds_balance: 'El monto excede el balance disponible.', + scan: 'Escanear', + send: 'Enviar', + next: 'Siguiente', + note: 'Nota (opcional)', + to: 'para', + feeUnit: 'Sat/B', + fee: 'Comisión:', + create: 'Crear factura', + remaining_balance: 'Saldo restante', + total_exceeds_balance: 'El monto de envío excede el saldo disponible.', }, + confirm: { sendNow: 'Enviar ahora' }, create: { - title: 'Crear una Transaccion', - details: 'Detalles', - error: 'Error al crear una transacción. ¿Dirección o cantidad estan invalidas?', - go_back: 'Regresar', - this_is_hex: 'Este es representacion hex de transacción, firmado y listo para ser transmitido a la red. ¿Continuar?', - to: 'A', amount: 'Cantidad', - fee: 'Tasa', - tx_size: 'tamaño de TX', - satoshi_per_byte: 'satoshiPorByte', - memo: 'Comentario', - broadcast: 'Transmitir', - not_enough_fee: 'Tasa no es suficiente. Incremente la tasa', + fee: 'Comisión', + setTransactionFee: 'Establezca una comisión de transacción', + headerText: + 'Cuando hay una gran cantidad de transacciones pendientes en la red (> 1500), la tarifa más alta dará como resultado que su transacción se procese más rápido. Los valores típicos son 1-500 sat/b', }, }, receive: { - header: 'Recibir', + header: 'Recibir monedas', details: { - title: 'Comparte esta dirección con el pagador', + amount: 'Cantidad', share: 'Compartir', - copiedToClipboard: 'Copiado a portapapeles.', - label: 'Description', - create: 'Create', - setAmount: 'Receive with amount', + receiveWithAmount: 'Recibir con cantidad', }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Buy Bitcoin', - tap_your_address: 'Tap your address to copy it to clipboard:', - copied: 'Copied to Clipboard!', }, settings: { - tabBarLabel: 'Ajustes', - header: 'Ajustes', - plausible_deniability: 'Negación plausible...', - storage_not_encrypted: 'Almacenamiento: no esta cifrado', - storage_encrypted: 'Almacenamiento: cifrado', - password: 'Contraseña', - password_explain: 'Crea la contraseña que usarás para descifrar el almacenamiento', - retype_password: 'Ingresa la contraseña nuevamente', - passwords_do_not_match: 'Contraseñas deben ser iguales', - encrypt_storage: 'Cifrar almacenamiento', - lightning_settings: 'Lightning settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - ' and put its URL here in settings. Leave blank to use default ' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'save', - about: 'Sobre nosotros', language: 'Idioma', - currency: 'Moneda', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Negación plausible', - help: - 'Bajo ciertas circunstancias, usted podría verse obligado a revelar un ' + - 'contraseña. Para mantener sus monedas seguras, BlueWallet puede crear otro ' + - 'almacenamiento cifrado, con una contraseña diferente. Bajo la presión' + - 'puede revelar esta contraseña a un tercero. Si se ingresa en ' + - 'BlueWallet, desbloqueará un nuevo almacenamiento `falso`. Esto parecerá ' + - 'legítimo para un tercero, pero en secreto mantendrá su almacenamiento principal ' + - 'con monedas seguras.', - help2: 'El nuevo almacen sera completamente funcional, y puedes almacenar ' + 'cantidades minimas para que sea mas creible.', - create_fake_storage: 'Crear un almacen cifrado falso', - go_back: 'Regresar', - create_password: 'Crear una contraseña', - create_password_explanation: 'La contraseña para el almacen falso no puede ser el mismo para su almacen principal.', - password_should_not_match: 'La contraseña para el almacen falso no puede ser el mismo para su almacen principal.', - retype_password: 'Volver a escribir contraseña', - passwords_do_not_match: 'Las contraseñas no coinciden, intente nuevamente', - success: 'Exitoso', - }, - lnd: { - title: 'manejar fondos', - choose_source_wallet: 'Elija una billetera de fuente', - refill_lnd_balance: 'Rellenar el balance de la billetera Lightning', - refill: 'Rellenar', - withdraw: 'Retirar', - placeholder: 'Invoice', - expired: 'Expirado', - sameWalletAsInvoiceError: 'You can not pay an invoice with the same wallet used to create it.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', + general: 'General', + security: 'Seguridad', + about: 'Acerca de', + electrumServer: 'Servidor Electrum', + advancedOptions: 'Opciones avanzadas', + changePin: 'Cambiar PIN', + fingerprintLogin: 'Inicio de sesión con huella digital', + aboutUs: 'Sobre nosotros', + header: 'Configuración', + notSupportedFingerPrint: 'Su dispositivo no admite huellas digitales', + TouchID: 'Permitir huella digital', + FaceID: 'Permitir FaceID', + Biometrics: 'Permitir biometría', + }, + aboutUs: { + header: 'Sobre nosotros', + releaseNotes: 'Notas de la versión', + runSelfTest: 'Ejecutar autocomprobación', + buildWithAwesome: 'Construido con genialidad:', + rateVelesWallet: 'Valorar VelesWallet', + goToOurGithub: 'Acceda a nuestro Github', + alwaysBackupYourKeys: 'Siempre guarde una copia de seguridad de sus claves', + title: 'Veles Wallet es un monedero de Cortez Vault gratuito y de código abierto. Con licencia MIT.', + }, + electrumServer: { + header: 'Servidor Electrum', + title: 'Cambiar servidor electrum', + description: + 'Puede cambiar la dirección del servidor al que se conectará su aplicación. Se recomienda la dirección por defecto.', + save: 'Guardar', + useDefault: 'Usar predeterminado', + host: 'host', + port: 'puerto', + successfullSave: + 'Sus cambios se han guardado correctamente. Puede ser necesario reiniciar para que los cambios surtan efecto.', + connectionError: 'No se puede conectar al servidor Electrum proporcionado', + }, + advancedOptions: { + title: 'Configurar opciones avanzadas', + description: + 'Al activar las opciones avanzadas, podrá elegir entre los tipos de cartera enumerados a continuación: \n' + + 'P2SH, HD P2SH, HD segwit.', + }, + selectLanguage: { + header: 'Idioma', + restartInfo: + 'Al seleccionar un nuevo idioma, puede ser necesario reiniciar VelesWallet para que el cambio surta efecto', + confirmation: 'Confirmación', + confirm: 'Confirmar', + alertDescription: '¿Seleccionar idioma y reiniciar la aplicación?', + cancel: 'Cancelar', + }, + contactList: { + cancel: 'Cancelar', + search: 'Buscar', + screenTitle: 'Libreta de direcciones', + noContacts: 'No hay contactos', + noContactsDesc1: 'No hay contactos para mostrar.\nHaga clic', + noContactsDesc2: 'para añadir su primer contacto.', + noResults: 'No hay resultados para', + }, + contactCreate: { + screenTitle: 'Añadir nuevo contacto', + subtitle: 'Nuevo contacto', + description: 'Escriba nombre y dirección\npara su nuevo contacto.', + nameLabel: 'Nombre', + addressLabel: 'Dirección', + buttonLabel: 'Añadir nuevo contacto', + successTitle: 'Completado', + successDescription: '¡Bravo! Ha añadido su contacto correctamente.', + successButton: 'Volver a la libreta de direcciones', + }, + contactDetails: { + nameLabel: 'Nombre', + addressLabel: 'Dirección', + editName: 'Editar nombre', + editAddress: 'Editar dirección', + sendCoinsButton: 'Enviar monedas', + showQRCodeButton: 'Mostrar código QR', + deleteButton: 'Borrar contacto', + share: 'Compartir', + }, + contactDelete: { + title: 'Eliminar su contacto', + header: 'Borrar contacto', + description1: '¿Está seguro que quiere eliminarlo', + description2: '?\nNo podrá deshacer esta operación.', + no: 'No', + yes: 'Sí', + success: 'Completado', + successDescription: + 'Su contacto ha sido eliminado correctamente.\n' + 'Ahora puede volver a la libreta de direcciones.', + successButton: 'Volver a la libreta de direcciones', + }, + scanQrCode: { + permissionTitle: 'Permiso para usar la cámara', + permissionMessage: 'Necesitamos su permiso para usar su cámara', + ok: 'Aceptar', + cancel: 'Cancelar', + }, + filterTransactions: { + header: 'filtrar transacciones', + receive: 'recibir', + send: 'enviar', + filter: 'filtrar', + to: 'para', + toAmount: 'monto máximo', + toDate: 'fecha de finalización', + from: 'de', + fromAmount: 'monto mínimo', + fromDate: 'fecha de inicio', + clearFilters: 'borrar filtros', }, }; diff --git a/loc/fi_FI.js b/loc/fi_FI.js deleted file mode 100644 index e1d4c21574..0000000000 --- a/loc/fi_FI.js +++ /dev/null @@ -1,246 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Tallennustilasi on salattu. Salasana vaaditaan sen purkamiseksi', - enter_password: 'Anna salasana', - bad_password: 'Väärä salasana, yritä uudelleen', - never: 'ei koskaan', - continue: 'Jatka', - ok: 'OK', - }, - wallets: { - select_wallet: 'Valitse Lompakko', - options: 'valinnat', - createBitcoinWallet: - 'Sinulla ei tällä hetkellä ole Bitcoin lompakkoa. Rahoittaaksesi Lightning lompakkoa, Bitcoin lompakko tulee tuoda tai luoda. Haluatko kuitenkin jatkaa?', - list: { - app_name: 'BlueWallet', - title: 'lompakot', - header: - 'Lompakko koostuu salaisesta avaimesta (private key) sekä julkisesta osoitteesta' + - ',jonka voit jakaa vastaanottaaksesi kolikoita.', - add: 'Lisää Lompakko', - create_a_wallet: 'Luo lompakko', - create_a_wallet1: 'Se on ilmaista ja voit luoda', - create_a_wallet2: 'niin monta kuin haluat', - latest_transaction: 'viimeisin siirto', - empty_txs1: 'Siirtosi näkyvät tässä,', - empty_txs2: 'ei siirtoja', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Napsauta tästä ostaaksesi Bitcoinia', - }, - reorder: { - title: 'Järjestele Lompakot', - }, - add: { - title: 'lisää lompakko', - description: - 'Voit joko skannata paperisen lompakon (WIF - Wallet Import Format), tai luoda uuden. Segwit lompakkoja tuetaan oletuksena.', - scan: 'Skannaa', - create: 'Luo', - label_new_segwit: 'Uusi SegWit', - label_new_lightning: 'Uusi Lightning', - wallet_name: 'nimi', - wallet_type: 'tyyppi', - or: 'tai', - import_wallet: 'Tuo lompakko', - imported: 'Tuotu', - coming_soon: 'Tulossa', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Lompakko', - address: 'Osoite', - type: 'Tyyppi', - label: 'Etiketti', - destination: 'määränpää', - description: 'kuvaus', - are_you_sure: 'Oletko varma?', - yes_delete: 'Kyllä, poista', - no_cancel: 'En, peruuta', - delete: 'Poista', - save: 'Tallenna', - delete_this_wallet: 'Poista tämä lompakko', - export_backup: 'Vie / varmuuskopioi', - buy_bitcoin: 'Osta Bitcoinia', - show_xpub: 'Näytä lompakon XPUB', - }, - export: { - title: 'lompakon vienti', - }, - xpub: { - title: 'lompakon XPUB', - copiedToClipboard: 'Kopioitu leikepöydälle.', - }, - import: { - title: 'tuo', - explanation: - 'Kirjoita tähän muistisanasi, private key, WIF tai jotain mitä sinulla on. BlueWallet tekee parhaansa arvatakseen oikean muodon ja tuo lompakkosi', - imported: 'Tuotu', - error: 'Tuonti epäonnistui. Varmista, että annettu tieto on oikein', - success: 'Onnistui', - do_import: 'Tuo', - scan_qr: 'tai skannaa QR-koodi?', - }, - scanQrWif: { - go_back: 'Mene Takaisin', - cancel: 'Peruuta', - decoding: 'Dekoodataan', - input_password: 'Anna salasana', - password_explain: 'Tämä on BIP38 salattu private key', - bad_password: 'Väärä salasana', - wallet_already_exists: 'Lompakko on jo olemassa', - bad_wif: 'Väärä WIF', - imported_wif: 'WIF tuotu ', - with_address: ' osoitteella ', - imported_segwit: 'SegWit tuotu', - imported_legacy: 'Legacy tuotu', - imported_watchonly: 'Watch-only tuotu', - }, - }, - transactions: { - list: { - tabBarLabel: 'Siirrot', - title: 'siirrot', - description: 'Lompakkojesi saapuvat ja lähtevät siirrot', - conf: 'conf', - }, - details: { - title: 'Siirto', - from: 'Input', - to: 'Output', - copy: 'Kopioi', - transaction_details: 'Siirron tiedot', - show_in_block_explorer: 'Näytä lohkoketjuselaimessa', - }, - }, - send: { - header: 'Lähetä', - details: { - title: 'luo siirto', - amount_field_is_not_valid: 'Määrä ei kelpaa', - fee_field_is_not_valid: 'Siirtokulu ei kelpaa', - address_field_is_not_valid: 'Osoite ei kelpaa', - total_exceeds_balance: 'Lähetettävä summa ylittää katteen', - create_tx_error: 'Virhe siirron luonnissa. Varmista, että osoite on oikein.', - address: 'osoite', - amount_placeholder: 'lähetettävä summa (BTC)', - fee_placeholder: 'plus siirtokulu (BTC)', - note_placeholder: 'muistiinpano', - cancel: 'Peruuta', - scan: 'Skannaa', - send: 'Lähetä', - create: 'Luo', - remaining_balance: 'Jäljellä oleva kate', - }, - confirm: { - header: 'Vahvista', - sendNow: 'Lähetä nyt', - }, - success: { - done: 'Valmis', - }, - create: { - details: 'Tiedot', - title: 'luo siirto', - error: 'Virhe siirron luonnissa. Väärä osoite tai lähetettävä summa?', - go_back: 'Mene Takaisin', - this_is_hex: 'Tämä on siirron hex, allekirjoitettu ja valmis kuulutettavaksi verkkoon.', - to: 'Vastaanottaja', - amount: 'Summa', - fee: 'Kulu', - tx_size: 'TX koko', - satoshi_per_byte: 'Satoshia per tavu', - memo: 'Memo', - broadcast: 'Kuuluta', - not_enough_fee: 'Kulu ei riitä. Korota kulua.', - }, - }, - receive: { - header: 'Vastaanota', - details: { - title: 'Jaa tämä osoite maksajalle', - share: 'jaa', - copiedToClipboard: 'Kopioitu leikepöydälle.', - label: 'Selite', - create: 'Luo', - setAmount: 'Vastaanotettava summa', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Osta Bitcoinia', - tap_your_address: 'Napsauta osoitettasi kopioidaksesi sen leikepöydälle:', - copied: 'Kopioitu leikepöydälle!', - }, - settings: { - header: 'asetukset', - plausible_deniability: 'Uskottava kiistettävyys...', - storage_not_encrypted: 'Tallennustila: salaamaton', - storage_encrypted: 'Tallennustila: salattu', - password: 'Salasana', - password_explain: 'Luo salasana, jota käytät tallennustilan salauksen purkamiseen', - retype_password: 'Salasana uudelleen', - passwords_do_not_match: 'Salasanat eivät täsmää', - encrypt_storage: 'Salaa tallennustila', - lightning_settings: 'Lightning asetukset', - lightning_settings_explain: - 'Yhdistääksesi omaan LND noodiin, asenna LndHub' + - ' ja laita sen URL tänne. Jätä tyhjäksi käyttääksesi BlueWalletin LNDHubia (lndhub.io). Muutosten tallentamisen jälkeen luodut lompakot yhdistävät annettuun LNDHubiin.', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Tallenna', - about: 'Tietoa', - language: 'Kieli', - currency: 'Valuutta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Uskottava Kiistettävyys', - help: - 'Joissain tilanteissa, saatat olla pakotettu kertomaan ' + - 'salasanasi. Pitääksesi kolikkosi turvassa, BlueWallet voi luoda toisen ' + - 'salatun tallennustilan, toisella salasanalla. Paineen alla, ' + - 'voit kertoa tämän salasanan kolmannelle osapuolelle. Annettaessa ' + - 'BlueWalletiin, se avaa uuden väärennetyn tallennustilan. Se näyttää ' + - 'oikealta kolmannelle osapuolelle, mutta pitää oikean tallennustilasi ' + - 'kolikkoineen turvassa.', - help2: 'Uusi tallennustila näyttää täysin toimivalta, ja voit säilyttää ' + 'pieniä summia siellä, jotta se näyttää uskottavalta.', - create_fake_storage: 'Luo väärennetty tallennustila', - go_back: 'Mene Takaisin', - create_password: 'Luo salasana', - create_password_explanation: 'Väärennetyn tallennustilan salasanan ei tule täsmätä oikean tallennustilan salasanan kanssa', - password_should_not_match: 'Väärennetyn tallennustilan salasanan ei tule täsmätä oikean tallennustilan salasanan kanssa', - retype_password: 'Salasana uudelleen', - passwords_do_not_match: 'Salasanat eivät täsmää, yritä uudelleen', - success: 'Onnistui', - }, - lnd: { - title: 'hallinnoi varoja', - choose_source_wallet: 'Valitse lähdelompakko', - refill_lnd_balance: 'Täytä Lightning lompakon katetta', - refill: 'Täytä', - withdraw: 'Nosta', - expired: 'Erääntynyt', - placeholder: 'Lasku', - sameWalletAsInvoiceError: 'Et voi maksaa laskua samalla lompakolla, jolla se on luotu.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/fr_FR.js b/loc/fr_FR.js deleted file mode 100644 index 9084827bd2..0000000000 --- a/loc/fr_FR.js +++ /dev/null @@ -1,246 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: "L'espace de stockage est chiffré. Mot de passe requis pour le déchiffrer.", - enter_password: 'Saisir mot de passe', - bad_password: 'Mauvais mot de passe, ré-essayer', - never: 'jamais', - continue: 'Continue', - ok: 'OK', - }, - wallets: { - select_wallet: 'Choix du portefeuille', - options: 'options', - createBitcoinWallet: 'In order to use a Lightning wallet, a Bitcoin wallet is needed to fund it. Would you like to continue anyway?', - - list: { - app_name: 'BlueWallet', - title: 'portefeuilles', - header: - 'Un portefeuille represente une paire de clées (publique/privée) et une adresse que vous pouvez partager pour recevoir des transactions.', - add: 'Ajouter un portefeuille', - create_a_wallet: 'Créer un portefeuille', - create_a_wallet1: "C'est gratuit et vous pouvez en créer", - create_a_wallet2: 'autant que vous souhaitez', - latest_transaction: 'dernière transaction', - empty_txs1: 'Vos transactions apparaîtront ici,', - empty_txs2: 'Aucune pour le moment', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Cliquez ici pour acheter du Bitcoin', - }, - reorder: { - title: 'Trier vos portefeuilles', - }, - add: { - title: 'ajouter un portefeuille', - description: - 'Vous pouvez soit scanner et importer un paper wallet (au format WIF - Wallet Import Format), ou créer un nouveau portefeuille. Compatible avec Segwit par defaut.', - scan: 'Scanner', - create: 'Créer', - label_new_segwit: 'Nouveau SegWit', - label_new_lightning: 'Nouveau Lightning', - wallet_name: 'nom du portefeuille', - wallet_type: 'type', - or: 'ou', - import_wallet: 'Importer un portefeuille', - imported: 'Importé', - coming_soon: 'Bientôt', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Portefeuille', - address: 'Adresse', - type: 'Type', - label: 'Libelé', - destination: 'destination', - description: 'description', - are_you_sure: 'Êtes vous sur?', - yes_delete: 'Oui, supprimer', - no_cancel: 'Non, annuler', - delete: 'Supprimer', - save: 'Sauvegarder', - delete_this_wallet: 'Supprimer ce portefeuille', - export_backup: 'Exporter / sauvegarder', - buy_bitcoin: 'Acheter du Bitcoin', - show_xpub: 'Afficher XPUB du portefeuille', - }, - export: { - title: 'export du portefeuille', - }, - xpub: { - title: 'XPUB portefeuille', - copiedToClipboard: 'Copié dans le presse-papiers.', - }, - import: { - title: 'importer', - explanation: - "Write here your mnemonic, private key, WIF, or anything you've got. BlueWallet will do its best to guess the correct format and import your wallet", - imported: 'Importé', - error: "Échec de l'import. Merci, de vérifier que les données saisies sont valides.", - success: 'Succès', - do_import: 'Importer', - scan_qr: 'ou scaner un QR code', - }, - scanQrWif: { - go_back: 'Retour', - cancel: 'Annuler', - decoding: 'Déchiffrage', - input_password: 'Saisir mot de passe', - password_explain: 'Ceci est une clée privée chiffrée avec BIP38', - bad_password: 'Mauvais mot de passe', - wallet_already_exists: 'Ce portefeuille existe déjà', - bad_wif: 'Mauvais WIF', - imported_wif: 'WIF Importé', - with_address: ' avec adresse ', - imported_segwit: 'SegWit Importé', - imported_legacy: 'Legacy Importé', - imported_watchonly: 'Monitoring Importé', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transactions', - title: 'transactions', - description: 'Une liste des transactions entrentes et sortantes de vos portefeuilles', - conf: 'conf', - }, - details: { - title: 'Transaction', - from: 'De', - to: 'À', - copy: 'Copier', - transaction_details: 'Détails de la transaction', - show_in_block_explorer: 'Afficher dans le "block explorer"', - }, - }, - send: { - header: 'Envoyer', - details: { - title: 'créer une transaction', - amount_field_is_not_valid: 'Champ montant invalide', - fee_field_is_not_valid: 'Champ frais invalide', - address_field_is_not_valid: 'Champ adresse invalide', - total_exceeds_balance: 'Le montant à envoyer excède le montant disponible.', - create_tx_error: 'There was an error creating the transaction. Please, make sure the address is valid.', - address: 'adresse', - amount_placeholder: 'montant à envoyer (en BTC)', - fee_placeholder: 'plus frais de transaction (en BTC)', - note_placeholder: 'note (optionnelle)', - cancel: 'Annuler', - scan: 'Scanner', - send: 'Envoyer', - create: 'Créer', - remaining_balance: 'Balance restante', - }, - confirm: { - header: 'Confirmer', - sendNow: 'Envoyer maintenant', - }, - success: { - done: 'Terminé', - }, - create: { - details: 'Details', - title: 'créer une transaction', - error: 'Erreur creating transaction. Invalid address or send amount?', - go_back: 'Retour', - this_is_hex: 'This is transaction hex, signed and ready to be broadcast to the network.', - to: 'À', - amount: 'Montant', - fee: 'Frais', - tx_size: 'Taille de la Transaction (TX size)', - satoshi_per_byte: 'Satoshi par byte', - memo: 'Memo', - broadcast: 'Broadcast', - not_enough_fee: 'Frais insufisants. Veuillez augmenter les frais', - }, - }, - receive: { - header: 'Recevoir', - details: { - title: 'Partager cette adresse avec le destinataire', - share: 'partager', - copiedToClipboard: 'Copier dans le presse-papiers.', - label: 'Description', - create: 'Create', - setAmount: 'Revevoir avec montant', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Acheter du Bitcoin', - tap_your_address: 'Cliquez votre adresse pour la copier:', - copied: 'Copié dans le presse-papiers!', - }, - settings: { - header: 'réglages', - plausible_deniability: 'Déni plausible...', - storage_not_encrypted: 'Stockage: non chiffré', - storage_encrypted: 'Stockage: chiffré', - password: 'Mot de passe', - password_explain: "Créer le mot de passe utilisé pour déchiffrer l'espace de stockage principal", - retype_password: 'Re-saisir votre mot de passe', - passwords_do_not_match: 'Les mots de passe ne correspondent pas', - encrypt_storage: 'Chiffrer le stockage', - lightning_settings: 'Lightning settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - ' and put its URL here in settings. Leave blank to use default ' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'save', - about: 'À propos', - language: 'Langue', - currency: 'Devise', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Déni plausible', - help: - 'Dans certaines circonstances, vous serez peut-être forcé par un tiers à communiquer ' + - 'votre mot de passe. Pour protéger vos biens, BlueWallet permet de créer un autre ' + - 'espace de stockage, avec un mot de passe différent. Sous la contrainte, ' + - 'vous pourrez divulger ce mot de passe au tier. Quand il est saisi ' + - "BlueWallet, débloquera se 'faux' espace de stockage. Le tiers pourra " + - 'confondre ces données avec des données légitimes, votre espace de stockage ' + - "principal restera sécurisé et hors d'atteinte.", - help2: 'New storage will be fully functional, and you can store some ' + 'minimum amounts there so it looks more believable.', - create_fake_storage: 'Créer un faux espace de stockage chiffré', - go_back: 'Retour', - create_password: 'Créer un mot de passe', - create_password_explanation: 'Le mot de passe pour le faux espace de stockage ne doit pas être le même que celui du stockage principal', - password_should_not_match: 'Le mot de passe pour le faux espace de stockage ne doit pas être le même que celui du stockage principal', - retype_password: 'Confirmation du mot de passe', - passwords_do_not_match: 'Vos mot de passe ne sont pas identiques, veillez ré-essayer', - success: 'Succès', - }, - lnd: { - title: 'gérer vos fonds', - choose_source_wallet: 'Choisir un portefeuille source', - refill_lnd_balance: 'Déposer des fonds dans votre portfeuille Lightning', - refill: 'Déposer des fonds', - withdraw: 'Retirer des fonds', - placeholder: 'Invoice', - expired: 'Expiré', - sameWalletAsInvoiceError: 'Vous ne pouvez pas payer une facture avec le même portefeuille utilisé pour la créer.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/hr_HR.js b/loc/hr_HR.js deleted file mode 100644 index e3aa5e47cd..0000000000 --- a/loc/hr_HR.js +++ /dev/null @@ -1,241 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Vaš spremnik je kriptiran. Za dekripcoju je potrebna lozinka.', - enter_password: 'Unesi lozinku', - bad_password: 'Kriva lozinka, pokušaj ponovo', - never: 'nikad', - continue: 'Nastavi', - ok: 'U redu', - }, - wallets: { - select_wallet: 'Odaberi volet', - options: 'opcije', - list: { - app_name: 'BlueWallet', - title: 'Voleti', - header: 'Volet je par privatnog ključa (tajna!) i javne adrese ' + 'koju slobodno možete dijeliti kada primate novce.', - add: 'Dodaj volet', - create_a_wallet: 'Stvori novi volet', - create_a_wallet1: 'Ne košta ništa i možete', - create_a_wallet2: 'ih stvoriti moliko želite', - latest_transaction: 'posljednja transakcija', - empty_txs1: 'Vaše transakcije će se pojaviti ovdje', - empty_txs2: 'trenutno nema nijedne', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Klikni ovdje za kupnju Bitkoina', - }, - reorder: { - title: 'Uredi volete', - }, - add: { - title: 'Dodaj volet', - description: 'Možete ili skenirati bekap papirnati volet (u WIF - Wallet Import Format), ili stvoriti novi volet. Segwit je podržan.', - scan: 'Skeniraj', - create: 'Stvori', - label_new_segwit: 'Novi SegWit', - label_new_lightning: 'Novi Lightning', - wallet_name: 'ime voleta:', - wallet_type: 'tip:', - or: 'ili', - import_wallet: 'Unesi vanjski volet', - imported: 'Unešeno', - coming_soon: 'Dolazi uskoro', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Volet', - address: 'Adresa', - type: 'Tip', - label: 'Oznaka', - destination: 'odredište', - description: 'opis', - are_you_sure: 'Jesi li ziher?', - yes_delete: 'Da, briši', - no_cancel: 'Ne, otiaži', - delete: 'Obriši', - save: 'Spremi', - delete_this_wallet: 'Obriši ovaj volet', - export_backup: 'Izvoz / bekap', - buy_bitcoin: 'Kupovina Bitcoina', - show_xpub: 'Prikaži voletov XPUB', - }, - export: { - title: 'izvoz voleta', - }, - xpub: { - title: 'volet XPUB', - copiedToClipboard: 'Kopirano u međuspremnik.', - }, - import: { - title: 'unesi', - explanation: - 'Ovdje upiši svoj mnemonik slijed riječi, privatni ključ, WIF, ili što već imaš. BlueWallet će pokušati porocijeniti format i unesti tvoj volet.', - imported: 'Uneseno', - error: 'Neuspješan unos. Molimo pažljivo provjerite ispravnost unesenih podataka.', - success: 'Uspjeh', - do_import: 'Unesi', - scan_qr: 'ili skeniraj QR kod?', - }, - scanQrWif: { - go_back: 'Povratak', - cancel: 'Otkaži', - decoding: 'Dekodiranje', - input_password: 'Unesi lozinku', - password_explain: 'Ovo je BIP38 enkriptiran privatni ključ', - bad_password: 'Pogrešna lozinka', - wallet_already_exists: 'Ovaj volet već postoji', - bad_wif: 'Pogrešan WIF', - imported_wif: 'Unesen WIF ', - with_address: ' sa adresom ', - imported_segwit: 'Unesen SegWit', - imported_legacy: 'Unesen Legacy', - imported_watchonly: 'Unesen samo za pregled', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transakcije', - title: 'transakcije', - description: 'Popis dolaznih i odlaznih transakcija vašeg voleta.', - conf: 'konf.', - }, - details: { - title: 'Transakcija', - from: 'Od', - to: 'Za', - copy: 'Kopiraj', - transaction_details: 'Detalji transakcije', - show_in_block_explorer: 'Prikaži u blok eksploreru', - }, - }, - send: { - header: 'Šalji', - details: { - title: 'Stvori transakciju', - amount_field_is_not_valid: 'Iznos nije ispravan', - fee_field_is_not_valid: 'Ovo polje nije ispravno', - address_field_is_not_valid: 'Polje adrese nije ispravno', - total_exceeds_balance: 'Iznos je veći od raspoloživog.', - create_tx_error: 'Pogreška prilikom stvaranja transakcije. Molimo provijeri da je adresa ispravna.', - address: 'adresa', - amount_placeholder: 'iznos za slanje (u BTC)', - fee_placeholder: 'plus trošak transakcije (u BTC)', - note_placeholder: 'bilješka za evidenciju', - cancel: 'Otkaži', - scan: 'Skeniraj', - send: 'Šalji', - create: 'Stvori', - remaining_balance: 'Preostali saldo', - }, - confirm: { - header: 'Potvrdi', - sendNow: 'Pošalji sad', - }, - success: { - done: 'U redu', - }, - create: { - details: 'Detalji', - title: 'stvori transakciju', - error: 'Pogreška. Neispravna adresa ili iznos slanja?', - go_back: 'Nazad', - this_is_hex: 'Ovoj je hex transakcije, potpisan i spreman za objavljivanje na mrežu.', - to: 'Za', - amount: 'Iznos', - fee: 'Trošak slanja', - tx_size: 'TX veličina', - satoshi_per_byte: 'Satoshi / byte', - memo: 'Bilješka', - broadcast: 'Objavi', - not_enough_fee: 'Trošak slanja je premalen. Povećaj ga.', - }, - }, - receive: { - header: 'Primi', - details: { - title: 'Pokaži ovu adresu platitelju', - share: 'podijeli', - copiedToClipboard: 'Kopirano u međuspremnik.', - label: 'Opis', - create: 'Stvori', - setAmount: 'Odredi iznos za primiti', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Kupovina Bitcoina', - tap_your_address: 'Klikni na adresu za spremanje u međuspremnik:', - copied: 'Spremljeno u međuspremnik!', - }, - settings: { - header: 'Postavke', - plausible_deniability: 'Fejk volet...', - storage_not_encrypted: 'Spremnik: nije kriptiran', - storage_encrypted: 'Spremnik: je kriptiran', - password: 'Lozinka', - password_explain: 'Upiši lozinku koja će dekriptirati spremnik.', - retype_password: 'Ponovi lozinku', - passwords_do_not_match: 'Lozinke su različite', - encrypt_storage: 'Kriptiraj spremnik', - lightning_settings: 'Lightning postavke', - lightning_settings_explain: - 'Za spajanje na tvoj vlastiti LND čvor trebaš instalirati LndHub' + - ' i upisati njegov URL ovdje. Ostavi prazno za standardni ' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Spremi', - about: 'Informacije', - language: 'Jezik', - currency: 'Valuta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Fejk volet', - help: - 'Pazi. Netko gadan te može u iznimnim okolnostima (pljačka, prijevremeni izbori, itd.) ' + - 'brutalno pritisnuti da mu otkriješ lozinku za svoj volet. ' + - 'BlueWallet ti čuva leđa buraz. Nemaš brige. Gledaj, ' + - 'stvoriti ćemo fejk volet sa drugačijom lozinkom. Haha, žišku? ' + - 'Pa kad se ovaj počne pjeniti, a ti vidiš da je vrag odnio šalu, ' + - 'samo mu podvali lozinku za ovaj drugi volet. Eto mu ga. Nek si cucla. ', - help2: 'Novi spremnik će biti posve funkcionalan, možeš pohraniti koliko ' + 'misliš da je potrebno da izgleda uvjerljivo.', - create_fake_storage: 'Stvori fejk enkriptirani spremnik', - go_back: 'Povratak', - create_password: 'Unesi lozinku', - create_password_explanation: 'Lozinka za fejk spremnik treba biti drugačija od lozinke za oriđi spremnik', - password_should_not_match: 'Lozinka za fejk spremnik treba biti drugačija od lozinke za oriđi spremnik', - retype_password: 'Ponovi lozinku', - passwords_do_not_match: 'Lozinke ne pašu, pokušaj ponovo', - success: 'Uspjeh', - }, - lnd: { - title: 'Uredi novčeke', - choose_source_wallet: 'Odaberi izvor', - refill_lnd_balance: 'Dopuni Lightning volet saldo', - refill: 'Dopuni', - withdraw: 'Isprazni', - placeholder: 'Invoice', - expired: 'Isteklo', - sameWalletAsInvoiceError: 'Buraz! Ne možeš platiti račun s istim voletom s kojim si račun stvorio, ono.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/hu_HU.js b/loc/hu_HU.js deleted file mode 100644 index e2b6689772..0000000000 --- a/loc/hu_HU.js +++ /dev/null @@ -1,243 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'A Tárhely titkosítva. Jelszó szükséges a dekódoláshoz', - enter_password: 'Írd be a jelszót', - bad_password: 'Hibás jelszó, próbáld újra', - never: 'soha', - continue: 'Folytat', - ok: 'OK', - }, - wallets: { - select_wallet: 'Válassz tárcát', - options: 'beállítások', - createBitcoinWallet: - 'Jelenleg még nincsen Bitcoin tárcád. Lightning tárca létrehozásához először készíts egy Bitcoin tárcát, vagy importálj egy már meglévő tárcát. Mindenképp folytatod?', - list: { - app_name: 'BlueWallet', - title: 'tárcák', - header: 'Egy tárca nem más, mint egy kulcspár, és egy cím. A cím nyilvános, és megoszhatod másokkal, ha szeretnél Bitcoint fogadni', - add: 'Új Tárca', - create_a_wallet: 'Új tárca', - create_a_wallet1: 'Ingyenes, és annyit hozhatsz létre', - create_a_wallet2: 'amennyit szeretnél', - latest_transaction: 'utolsó tranzakció', - empty_txs1: 'A tranzakcióid itt fognak megjelenni', - empty_txs2: 'de még nem volt tranzakciód!', - empty_txs1_lightning: - 'A Lightning tárcát a mindennapi tranzakcióidhoz használhatod. A tranzakciók azonnal végrehajtódnak, minimális átutalási díjjal.', - empty_txs2_lightning: '\nA kezdéshez kattints a "Kezelés"-re, és töltsd fel az egyenleged.', - tap_here_to_buy: 'Bitcoin vásárláshoz kattints ide', - }, - reorder: { - title: 'Tárcák rendezése', - }, - add: { - title: 'új tárca', - description: - 'Beszkennelhetsz egy már meglévő tárcát (WIF formátumban - Wallet Import Format) vagy készíthetsz egy új tárcát. A Segwit tárcák alapból támogatottak.', - scan: 'Scan', - create: 'Létrehoz', - label_new_segwit: 'Új SegWit', - label_new_lightning: 'Új Lightning', - wallet_name: 'név', - wallet_type: 'típus', - or: 'vagy', - import_wallet: 'Tárca importálása', - imported: 'Importálva', - coming_soon: 'Hamarosan', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Tárca', - address: 'Cím', - type: 'Típus', - label: 'Cimke', - description: 'leírás', - are_you_sure: 'Biztos vagy benne?', - yes_delete: 'Igen, töröld', - no_cancel: 'Nem, megszakít', - delete: 'Törlés', - save: 'Ment', - delete_this_wallet: 'Töröld ezt a tárcát', - export_backup: 'Exportálás / Biztonsági mentés', - buy_bitcoin: 'Bitcoin vásáslás', - show_xpub: 'Mutasd a tárca XPUB kulcsát', - }, - export: { - title: 'tárca exportálása', - }, - xpub: { - title: 'a tárca XPUB kulcsa', - copiedToClipboard: 'Vágólapra másolva', - }, - import: { - title: 'importálás', - explanation: - 'Írd be a kulcsszavaidat, a titkos kulcsodat, WIF-et, vagy bármi mást. A BlueWallet megpróbálja kitalálni a helyes formátumot, és importálja a tárcádat', - imported: 'Importálva', - error: 'Importálás sikertelen. Ellenőrizd, hogy helyes adatokat adtál-e meg.', - success: 'Sikeres importálás!', - do_import: 'Importálás', - scan_qr: 'vagy QR-kód szkennelése?', - }, - scanQrWif: { - go_back: 'Vissza', - cancel: 'Megszakít', - decoding: 'Dekódolás', - input_password: 'Add meg a jelszavad', - password_explain: 'Ez egy BIP38-titkosított titkos kulcs', - bad_password: 'Hibás jelszó', - wallet_already_exists: 'Egy ilyen tárca már létezik', - bad_wif: 'Hibás WIF', - imported_wif: 'Importált WIF ', - with_address: ' címmel ', - imported_segwit: 'Importált SegWit', - imported_legacy: 'Importált Legacy', - imported_watchonly: 'Importált Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Tranzakciók', - title: 'tranzakciók', - description: 'Lista a tárcáid bejövő és kimenő tranzakcióiról', - conf: 'jóvá', - }, - details: { - title: 'Tranzakció', - from: 'Input', - to: 'Output', - copy: 'Másolás', - transaction_details: 'Tranzakció részletei', - show_in_block_explorer: 'Mutasd a block explorerben', - }, - }, - send: { - header: 'Küldés', - details: { - title: 'tranzakció létrehozása', - amount_field_is_not_valid: 'Érvénytelen összeg', - fee_field_is_not_valid: 'Èrvénytelen tranzakciós díj', - address_field_is_not_valid: 'Érvénytelen cím', - total_exceeds_balance: 'A megadott összeg nagyobb, mint a tárca elérhető egyenlege', - create_tx_error: 'Hiba történt a tranzakció létrehozásakor. Ellenőrizd a megadott cím érvényességét.', - address: 'cím', - amount_placeholder: 'küldendő összeg (BTC)', - fee_placeholder: 'tranzakciós díj (BTC)', - note_placeholder: 'saját megjegyzés', - cancel: 'Megszakít', - scan: 'Scan', - send: 'Küldés', - create: 'Létrehoz', - remaining_balance: 'Fennmaradó egyenleg', - }, - confirm: { - header: 'Megerősítés', - sendNow: 'Küldés most', - }, - success: { - done: 'Kész!', - }, - create: { - details: 'Részletek', - title: 'tranzakció létrehozása', - error: 'Hiba történt a tranzakció létrehozásakor. Hibás cím vagy összeg?', - go_back: 'Vissza', - this_is_hex: 'Tranzakció hexadecimális formátumban, aláírva és küldésre készen.', - to: 'Címzett', - amount: 'Összeg', - fee: 'Díj', - tx_size: 'Tranzakció mérete', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Küldés', - not_enough_fee: 'Díj túl alacsony. Növeld a megadott díjat', - }, - }, - receive: { - header: 'Fogadás', - details: { - title: 'Cím megosztása a fizető féllel', - share: 'megosztás', - copiedToClipboard: 'Vágólapra másolva.', - label: 'Leírás', - create: 'Létrehoz', - setAmount: 'Fogadandó összeg', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Bitcoin vásárlása', - tap_your_address: 'Kattints a címre a vágólapra másoláshoz:', - copied: 'Vágólapra másolva!', - }, - settings: { - header: 'beállítások', - plausible_deniability: 'Elfogadható tagadhatóság...', - storage_not_encrypted: 'Tárhely: nincs titkosítva', - storage_encrypted: 'Tárhely: titkosítva', - password: 'Jelszó', - password_explain: 'Add meg a jelszót, amivel majd dekódolhatod a tárhelyet', - retype_password: 'Jelszó megerősítése', - passwords_do_not_match: 'A megadott jelszavak különböznek!', - encrypt_storage: 'Tárhely titkosítása', - lightning_settings: 'Lightning Beállítások', - lightning_settings_explain: - 'Saját LND-csomóponthoz való csatlakozáshoz telepítsd az LndHub-ot' + - ' és írd be az URL-ét alul. Hagyd üresen, ha a BlueWallet saját LNDHub-jához (lndhub.io) szeretnél csatlakozni.' + - ' A beállítások mentése után, minden újonnan létrehozott tárca a megadott LDNHubot fogja használni.', - save: 'Ment', - about: 'Egyéb', - language: 'Nyelv', - currency: 'Valuta', - advanced_options: 'Haladó Beállítások', - enable_advanced_mode: 'Halandó mód bekapcsolása', - }, - plausibledeniability: { - title: 'Elfogadható tagadhatóság', - help: - 'Bizonyos körülmények között arra kényszerülhetsz, hogy megadd' + - 'a jelszavadat. A pénzed biztonsága érdekében a BlueWallettel létrehozhatsz egy ' + - 'alternatív titkosított tárhelyet, alternatív jelszóval. Kényszer hatása alatt ' + - 'megadhatod az alternatív jelszavadat, ami után a BlueWallet az alternatív ' + - 'tárhelyedet fogja megnyitni. Ez ugyanúgy fog kinézni, mint egy igazi tárhely, ' + - 'azzal a különbséggel, hogy a pénzed teljes biztonságban lesz az elsődleges ' + - 'tárhelyen.', - help2: 'Az alternatív tárhely teljesen működőképes, és akár egy kisebb összeget is elhelyezhetsz rajta, hogy hitelesebbnek tűnjön.', - create_fake_storage: 'Hamis tárhely létrehozása', - go_back: 'Vissza', - create_password: 'Jelszó létrehozása', - create_password_explanation: 'A hamis tárhely jelszava nem lehet ugyanaz, mint az igazi tárhelyé', - password_should_not_match: 'A hamis tárhely jelszava nem lehet ugyanaz, mint az igazi tárhelyé', - retype_password: 'Jelszó megerősítése', - passwords_do_not_match: 'A megadott jelszavak különböznek!', - success: 'Hamis tárhely létrehozva!', - }, - lnd: { - title: 'kezelés', - choose_source_wallet: 'Válassz forrás tárcát', - refill_lnd_balance: 'Lightning egyenleg feltöltése', - refill: 'Feltölt', - withdraw: 'Pénzkivétel', - expired: 'Lejárt', - placeholder: 'Számla', - sameWalletAsInvoiceError: 'Számlát nem fizethesz be ugyanarról a tárcáról, mint amellyel létrehoztad.', - }, - pleasebackup: { - title: 'A tárcád elkészült...', - text: - 'Kérlek írd le az alábbi emlékeztető szavakat egy papírlapra, és tedd el egy biztonságos helyre. ' + - 'Ez egy biztonsági mentés, amellyel helyreállíthatod a tárcádat egy másik eszközön.', - ok: 'Rendben, leírtam!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'Ezt a számlát nem fizették ki és lejárt', - has_been_paid: 'Ezt a számlát kifizették', - please_pay: 'Kérlek fizess', - sats: 'sats', - for: 'Cím:', - additional_info: 'További információk', - open_direct_channel: 'Közvetlen csatorna nyitása erre a csomópontra:', - }, -}; diff --git a/loc/id_ID.js b/loc/id_ID.js index 3aaa9df681..1cbd72b422 100644 --- a/loc/id_ID.js +++ b/loc/id_ID.js @@ -1,243 +1,349 @@ module.exports = { _: { - storage_is_encrypted: 'Penyimpanan dienkripsi. Masukkan kata sandi untuk dekripsi:', + languageCode: 'id', + storage_is_encrypted: 'Penyimpanan Anda dienkripsi. Perlu kata sandi untuk mendekripsinya', enter_password: 'Masukkan kata sandi', - bad_password: 'kata sandi salah, coba lagi', + bad_password: 'Kata sandi buruk, coba lagi', never: 'tidak pernah', continue: 'Lanjutkan', ok: 'OK', + click: 'Klik', + here: 'Disini', + save: 'Simpan', + confirm: 'Konfirmasi', + copy: 'Salin', + copied: 'Disalin!', + }, + tabNavigator: { + dashboard: 'Dasbor', + settings: 'Pengaturan', + addressBook: 'Buku alamat', + }, + message: { + somethingWentWrong: 'Terjadi kesalahan', + somethingWentWrongWhileCreatingWallet: + 'Terjadi kesalahan saat kami membuat dompet Anda. Silakan kembali ke Dasbor dan coba lagi.', + success: 'Berhasil', + successfullWalletImport: 'Dompet Anda berhasil diimpor. Anda sekarang dapat kembali ke Dasbor.', + successfullWalletDelete: 'Dompet Anda berhasil dihapus. Anda sekarang dapat kembali ke Dasbor.', + returnToDashboard: 'Kembali ke Dasbor', + creatingWallet: 'Membuat dompet Anda', + creatingWalletDescription: + 'Mohon kesabaran Anda sementara kami membuat dompet Anda. Ini mungkin membutuhkan waktu.', + }, + onboarding: { + onboarding: 'Onboarding', + pin: 'PIN', + createPin: 'Buat PIN', + createNewPin: 'PIN Baru', + createPassword: 'Buat sandi transaksi', + createPinDescription: + 'PIN Anda kan digunakan untuk masuk ke aplikasi. Anda dapat melakukan perubahan nanti di bagian pengaturan.', + confirmPin: 'Konfirmasi PIN', + confirmNewPin: 'Konfirmasi PIN baru', + confirmPassword: 'Konfirmasi sandi transaksi', + passwordDoesNotMatch: 'Kata sandi tidak cocok. Mohon masukkan kata sandi yang valid.', + createPasswordDescription: + 'Kata Sandi Transaksi Anda akan digunakan untuk memverifikasi semua transaksi. Anda tidak dapat melakukan perubahan setelah ini. Sandi Transaksi harus paling tidak terdiri dari 8 karakter alfanumerik.', + changePin: 'Ubah PIN', + currentPin: 'PIN Sekarang', + pinDoesNotMatch: 'PIN tidak cocok. Mohon masukkan PIN yang valid.', + successDescription: 'Hore!\nPIN Anda telah berhasil dibuat.', + successDescriptionChangedPin: 'Hore!\nPIN Anda telah berhasil dirubah.', + successButton: 'Pergi ke Dasbor', + successButtonChangedPin: 'Kembali ke Pengaturan', + }, + unlock: { + title: 'Buka Kunci', + touchID: 'Touch ID untuk "Veles Wallet"', + confirmButton: 'Konfirmasi sidik jari Anda untuk melanjutkan.', + enter: 'Masukkan PIN', + }, + unlockTransaction: { + headerText: 'Konfirmasi transaksi', + title: 'Konfirmasi Kata Sandi Transaksi', + description: 'Konfirmasi Kata Sandi Transaksi untuk melanjutkan transaksi.', }, wallets: { - select_wallet: 'Pilih dompet', - options: 'Opsi', - createBitcoinWallet: - 'Belum ada dompet bitcoin. Untuk mendanai dompet Lightning, dompet Bitcoin harus dibuat atau diimpor. Yakin ingin melanjutkan?', - list: { - app_name: 'BlueWallet', + dashboard: { title: 'Dompet', - header: 'Sebuah dompet mewakili sepasang kunci rahasia dan sebuah alamat' + 'yang bisa dipilih untuk menerima koin.', - add: 'Tambah dompet', - create_a_wallet: 'Buat dompet', - create_a_wallet1: 'Gratis dan bisa buat', - create_a_wallet2: 'sebanyak yang kamu mau', - latest_transaction: 'transaksi terbaru', - empty_txs1: 'Transaksimu akan muncul di sini,', - empty_txs2: 'saat ini tidak ada transaksi', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Tap di sini untuk membeli bitcoin', + allWallets: 'Semua Dompet', + noWallets: 'Tidak ada dompet', + noWalletsDesc1: 'Tidak ada dompet untuk ditampilkan.', + noWalletsDesc2: 'untuk menambahkan dompet pertama Anda.', + send: 'Kirim koin', + receive: 'Terima koin', + noTransactions: 'Tidak ada transaksi untuk ditampilkan.', + }, + walletModal: { btcv: 'VLS', wallets: 'Dompet' }, + importWallet: { + title: 'Impor dompet Anda', + header: 'Impor dompet', + subtitle: + 'Tuliskan di sini mnemonik, kunci privat, WIF, atau apa pun yang Anda punya. VelesWallet akan berusaha sebaik mungkin untuk menebak format yang tepat dan mengimpor dompet Anda.', + placeholder: 'Mnemonik, kunci pribadi, WIF', + import: 'Impor', + scanQrCode: 'atau pindai kode QR', + walletInUseValidationError: 'Dompet sudah digunakan. Masukkan dompet yang valid.', }, - reorder: { - title: 'Susun Dompet', + exportWallet: { title: 'Frasa mnemonik', header: 'Ekspor dompet' }, + exportWalletXpub: { header: 'Dompet XPUB' }, + deleteWallet: { + title: 'Hapus dompet Anda', + header: 'Hapus dompet', + description1: 'Anda yakin ingin menghapus', + description2: '? Anda tidak dapat mengurungkannya.', + no: 'Tidak', + yes: 'Ya', }, + wallet: { none: 'Tidak ada', latest: 'Transaksi terakhir' }, add: { - title: 'tambah dompet', + title: 'Tambah dompet baru', + subtitle: 'Namai dompet Anda', + description: 'Masukkan nama untuk dompet baru Anda.', + inputLabel: 'Nama', + addWalletButton: 'Tambah dompet baru', + importWalletButton: 'Impor dompet', + advancedOptions: 'Opsi lanjutan', + multipleAddresses: 'Beberapa alamat', + singleAddress: 'Satu alamat', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: + 'Alamat ini mengandung sebuah pohon dari alamat segwit native, yang dihasilkan oleh sebuah benih tunggal 24-kata', + }, + addSuccess: { + title: 'Tambah dompet baru', + subtitle: 'Berhasil', description: - 'Kamu bisa membuat dompet atau memindai paper wallet dalam WIF (Wallet Import Format). Bluewallet mendukung dompet Segwit.', - scan: 'Pindai', - create: 'Buat', - label_new_segwit: 'Dompet SegWit baru', - label_new_lightning: 'Dompet Lightning baru', - wallet_name: 'nama dompet', - wallet_type: 'tipe', - or: 'atau', - import_wallet: 'Impor dompet', - imported: 'Diimpor', - coming_soon: 'Akan datang', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'Dompet Anda telah dibuat. Luangkan waktu sebentar untuk menulis frasa mnemonik ini di selembar kertas. Untuk berjaga-jaga. Anda dapat menggunakannya untuk memulihkan dompet di perangkat lain.', + okButton: 'Oke, saya sudah menuliskannya!', }, details: { - title: 'Dompet', - address: 'Alamat', - type: 'Tipe', - label: 'Label', - destination: 'tujuan', - description: 'deskripsi', - are_you_sure: 'Yakin?', - yes_delete: 'Ya, hapus', - no_cancel: 'Tidak, batalkan', - delete: 'Hapus', - save: 'Simpan', - delete_this_wallet: 'Hapus dompet ini', - export_backup: 'Ekspor / backup', - buy_bitcoin: 'Beli Bitcoin', - show_xpub: 'Tampilkan XPUB dompet', - }, - export: { - title: 'ekspor dompet', - }, - xpub: { - title: 'XPUB dompet', - copiedToClipboard: 'Disalin ke clipboard.', + edit: 'Ubah', + latestTransaction: 'Transaksi terakhir', + typeLabel: 'Tipe', + nameLabel: 'Nama', + exportWallet: 'Ekspor dompet', + showWalletXPUB: 'Tampilkan Dompet XPUB', + deleteWallet: 'Hapus dompet', + nameEdit: 'Edit nama', }, + export: { title: 'ekspor dompet' }, import: { title: 'impor', - explanation: 'Ketik kata mnemonic, private key, WIF, atau apapun yang kamu punya. BlueWallet akan mencoba mengimpor dompet kamu.', + explanation: + 'Tuliskan di sini mnemonik, kunci privat, WIF, atau apa pun yang Anda punya. VelesWallet akan berusaha sebaik mungkin untuk menebak format yang tepat dan mengimpor dompet Anda', imported: 'Diimpor', - error: 'Gagal mengimpor. Pastikan data yang diketik benar.', + error: 'Gagal mengimpor. Harap pastikan data yang diberikan valid.', success: 'Berhasil', do_import: 'Impor', - scan_qr: 'atau mau pindai QR code?', + scan_qr: 'atau pindai kode QR?', }, scanQrWif: { go_back: 'Kembali', cancel: 'Batal', - decoding: 'Membaca...', + decoding: 'Mendekode', input_password: 'Masukkan kata sandi', - password_explain: 'Ini adalah private key terenkripsi BIP38', - bad_password: 'kata sandi salah', - wallet_already_exists: 'Dompet sudah ada', - bad_wif: 'WIF salah', - imported_wif: 'WIF diimpor ', - with_address: ' dengan alamat ', - imported_segwit: 'Dompet SegWit diimpor', - imported_legacy: 'Dompet lawas diimpor', - imported_watchonly: 'Alamat tinjauan diimpor', + password_explain: 'Ini adalah kunci privat terenkripsi BIP38', + bad_password: 'Kata sandi buruk', + wallet_already_exists: 'Dompet tersebut sudah ada', + bad_wif: 'WIF buruk', + imported_wif: 'WIF diimpor', + with_address: 'dengan alamat', + imported_segwit: 'SegWit diimpor', + imported_legacy: 'Legacy diimpor', + imported_watchonly: 'Watch-only diimpor', }, }, transactions: { - list: { - tabBarLabel: 'Transaksi', - title: 'transaksi', - description: 'Daftar transaksi keluar dan masuk dompet', - conf: 'konfirmasi', - }, + list: { conf: 'Konfirmasi' }, details: { title: 'Transaksi', - from: 'Input', - to: 'Output', + detailTitle: 'Detail transaksi', + transactionHex: 'Hex transaksi', + transactionHexDescription: 'Ini adalah hex transaksi, ditandatangani dan siap disiarkan ke jaringan', + copyAndBoriadcast: 'Salin dan siarkan nanti', + verify: 'Verifikasi di coinb.in', + amount: 'Jumlah', + fee: 'Biaya', + txSize: 'Ukuran TX', + satoshiPerByte: 'Satoshi per byte', + from: 'Dari', + to: 'Ke', + bytes: 'byte', copy: 'Salin', - transaction_details: 'Detail transaksi', - show_in_block_explorer: 'Tampilkan di block explorer', + noLabel: 'Tidak ada label', + details: 'Detail', + transactionId: 'ID Transaksi', + confirmations: 'konfirmasi', + transactionDetails: 'Detail transaksi', + viewInBlockRxplorer: 'Lihat di block explorer', + addNote: 'Tambah catatan', + note: 'Catatan', + inputs: 'Input', + ouputs: 'Output', + sendCoins: 'Kirim koin', }, }, send: { - header: 'Kirim', + header: 'Kirim koin', + success: { + title: 'Berhasil', + description: 'Hore! Anda berhasil menyelesaikan transaksi.', + done: 'Selesai', + return: 'Kembali ke Dasbor', + }, details: { title: 'buat transaksi', - amount_field_is_not_valid: 'Jumlah tidak valid', - fee_field_is_not_valid: 'Tarif tidak valid', - address_field_is_not_valid: 'Alamat tidak valid', - total_exceeds_balance: 'Jumlah yang dikirim melebihi saldo.', - create_tx_error: 'Kesalahan dalam membuat transaksi. Cek kembali alamat tujuan.', + amount_field_is_not_valid: 'Bidang jumlah tidak valid', + fee_field_is_not_valid: 'Bidang biaya tidak valid', + address_field_is_not_valid: 'Bidang alamat tidak valid', + create_tx_error: 'Ada kesalahan saat membuat transaksi. Harap pastikan alamat valid.', address: 'alamat', - amount_placeholder: 'jumlah (dalam BTC)', - fee_placeholder: 'Tambahan biaya transaksi (dalam BTC)', - note_placeholder: 'catatan pribadi', - cancel: 'Batalkan', + amount_placeholder: 'jumlah yang dikirimkan (dalam VLS)', + fee_placeholder: 'plus biaya transaksi (dalam VLS)', + note_placeholder: 'catatan untuk diri sendiri', + cancel: 'Batal', scan: 'Pindai', send: 'Kirim', - create: 'Buat', + next: 'Berikutnya', + note: 'Catatan (opsional)', + to: 'ke', + feeUnit: 'Sat/B', + fee: 'Biaya:', + create: 'Buat Faktur', remaining_balance: 'Sisa saldo', + total_exceeds_balance: 'Jumlah pengiriman melebihi sisa saldo.', }, - confirm: { - header: 'Konfirmasi', - sendNow: 'Kirim sekarang', - }, - success: { - done: 'Selesai', - }, + confirm: { sendNow: 'Kirim sekarang' }, create: { - details: 'Detail', - title: 'buat transaksi', - error: 'Tidak bisa membuat transaksi. Cek alamat atau jumlah transfer.', - go_back: 'Kembali', - this_is_hex: 'Ini adalah hex transaksi, siap untuk disiarkan ke jaringan.', - to: 'Ke', amount: 'Jumlah', - fee: 'Tarif', - tx_size: 'Ukuran TX', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Siarkan', - not_enough_fee: 'Tarif tidak cukup. Naikkan tarif', + fee: 'Biaya', + setTransactionFee: 'Atur biaya transaksi', + headerText: + 'Jika ada sejumlah besar transaksi tertunda di jaringan (>1500), biaya lebih tinggi akan membuat transaksi Anda diproses lebih cepat. Nilai biasanya adalah 1-500 sat/b', }, }, receive: { - header: 'Terima', + header: 'Terima koin', details: { - title: 'Bagikan alamat ini ke pengirim', - share: 'bagikan', - copiedToClipboard: 'Disalin ke clipboard.', - label: 'Deskripsi', - create: 'Buat', - setAmount: 'Terima sejumlah', + amount: 'Jumlah', + share: 'Bagikan', + receiveWithAmount: 'Terima dengan jumlah', }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Beli bitcoin', - tap_your_address: 'Untuk menyalin, tap alamat:', - copied: 'Disalin ke Clipboard!', }, settings: { - header: 'setting', - plausible_deniability: 'Plausible deniability...', - storage_not_encrypted: 'Penyimpanan: tidak terenkripsi', - storage_encrypted: 'Penyimpanan: terenkripsi', - password: 'kata sandi', - password_explain: 'Buat kata sandi untuk dekripsi penyimpanan', - retype_password: 'Ulangi kata sandi', - passwords_do_not_match: 'Kata sandi tidak cocok', - encrypt_storage: 'Enkripsi penyimpanan', - lightning_settings: 'Pengaturan Lightning', - lightning_settings_explain: - 'Pasang LndHub untuk menghubungkan ke node LND kamu' + - ' dan masukkan URL di sini. Biarkan kosong untuk menghubungkan ke LndHub standar (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'simpan', - about: 'Tentang', language: 'Bahasa', - currency: 'Mata Uang', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Plausible Deniability', - help: - 'Under certain circumstances, you might be forced to disclose a ' + - 'password. To keep your coins safe, BlueWallet can create another ' + - 'encrypted storage, with a different password. Under pressure, ' + - 'you can disclose this password to a 3rd party. If entered in ' + - "BlueWallet, it will unlock new 'fake' storage. This will seem " + - 'legit to a 3rd party, but will secretly keep your main storage ' + - 'with coins safe.', - help2: 'New storage will be fully functional, and you can store some ' + 'minimum amounts there so it looks more believable.', - create_fake_storage: 'Create fake encrypted storage', - go_back: 'Go Back', - create_password: 'Create a password', - create_password_explanation: 'Password for fake storage should not match password for your main storage', - password_should_not_match: 'Password for fake storage should not match password for your main storage', - retype_password: 'Retype password', - passwords_do_not_match: 'Passwords do not match, try again', - success: 'Success', - }, - lnd: { - title: 'atur dana', - choose_source_wallet: 'Pilih dompet sumber', - refill_lnd_balance: 'Isi ulang saldo Lightning', - refill: 'Isi ulang', - withdraw: 'Tarik', - placeholder: 'Invoice', - expired: 'Kadaluarsa', - sameWalletAsInvoiceError: 'Kamu tidak bisa membayar invoice dengan dompet yang sama yang dipakai untuk membuat invoice.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', + general: 'Umum', + security: 'Keamanan', + about: 'Tentang', + electrumServer: 'Server Electrum', + advancedOptions: 'Opsi lanjutan', + changePin: 'Ubah PIN', + fingerprintLogin: 'Login sidik jari', + aboutUs: 'Tentang kami', + header: 'Pengaturan', + notSupportedFingerPrint: 'Perangkat anda tidak mendukung pemindai sidik jari', + TouchID: 'Ijinkan penggunaan sidik jari', + FaceID: 'Ijinkan penggunaan FaceID', + Biometrics: 'Ijinkan penggunaan biometrik', + }, + aboutUs: { + header: 'Tentang kami', + releaseNotes: 'Catatan rilis', + runSelfTest: 'Jalankan tes mandiri', + buildWithAwesome: 'Bangun dengan hebat:', + rateVelesWallet: 'Beri peringkat VelesWallet', + goToOurGithub: 'Masuk ke Github kami', + alwaysBackupYourKeys: 'Selalu cadangkan kunci Anda', + title: 'VelesWallet adalah dompet Cortez Vault gratis dan sumber terbuka. Dilisensi MIT.', + }, + electrumServer: { + header: 'Server Electrum', + title: 'Ubah server electrum', + description: + 'Anda dapat merubah alamat server yang akan digunakan aplikasi Anda untuk menyambungkan diri. Alamat default direkomendasikan.', + save: 'Simpan', + useDefault: 'Gunakan default', + host: 'host', + port: 'port', + successfullSave: 'Perubahan Anda berhasil disimpan. Mungkin dibutuhkan pemulaian ulang agar perubahan berlaku.', + connectionError: 'Tidak dapat terhubung ke server Electrum yang tersedia', + }, + advancedOptions: { + title: 'Konfigurasikan opsi lanjutan', + description: + 'Mengaktifkan opsi Lanjutan akan memungkinkan Anda untuk memilih dari jenis dompet yang tercantum di bawah ini:\n' + + 'P2SH, HD P2SH, HD segwit.', + }, + selectLanguage: { + header: 'Bahasa', + restartInfo: 'Saat memilih bahasa baru, mungkin dibutuhkan pemulaian ulang VelesWallet agar perubahan berlaku', + confirmation: 'Konfirmasi', + confirm: 'Konfirmasi', + alertDescription: 'Pilih bahasa dan mulai ulang aplikasi?', + cancel: 'Batal', + }, + contactList: { + cancel: 'Batal', + search: 'Cari', + screenTitle: 'Buku alamat', + noContacts: 'Tidak ada kontak', + noContactsDesc1: 'Tidak ada kontak untuk ditampilkan. \nKlik', + noContactsDesc2: 'untuk menambahkan kontak pertama Anda.', + noResults: 'Tidak ada hasil untuk', + }, + contactCreate: { + screenTitle: 'Tambah kontak baru', + subtitle: 'Kontak baru', + description: 'Masukkan nama dan alamat\nuntuk kontak baru Anda.', + nameLabel: 'Nama', + addressLabel: 'Alamat', + buttonLabel: 'Tambah kontak baru', + successTitle: 'Berhasil', + successDescription: 'Hore! Anda telah berhasil\nmenambahkan kontak.', + successButton: 'Kembali ke Buku alamat', + }, + contactDetails: { + nameLabel: 'Nama', + addressLabel: 'Alamat', + editName: 'Edit nama', + editAddress: 'Edit alamat', + sendCoinsButton: 'Kirim koin', + showQRCodeButton: 'Tampilkan kode QR', + deleteButton: 'Hapus kontak', + share: 'Bagikan', + }, + contactDelete: { + title: 'Hapus kontak Anda', + header: 'Hapus kontak', + description1: 'Anda yakin ingin menghapus', + description2: '?\nAnda tidak dapat mengurungkannya.', + no: 'Tidak', + yes: 'Ya', + success: 'Berhasil', + successDescription: 'Kontak Anda berhasil dihapus.\n' + 'Anda sekarang dapat kembali ke Buku alamat.', + successButton: 'Kembali ke Buku alamat', + }, + scanQrCode: { + permissionTitle: 'Izin untuk menggunakan kamera', + permissionMessage: 'Kami membutuhkan izin Anda untuk menggunakan kamera', + ok: 'Ok', + cancel: 'Batal', + }, + filterTransactions: { + header: 'filter transaksi', + receive: 'terima', + send: 'kirim', + filter: 'filter ', + to: 'ke', + toAmount: 'ke jumlah', + toDate: 'ke tanggal', + from: 'dari', + fromAmount: 'monto mínimo', + fromDate: 'dari tanggal', + clearFilters: 'bersihkan filter', }, }; diff --git a/loc/index.js b/loc/index.js index 6466a324aa..e7cff2e64e 100644 --- a/loc/index.js +++ b/loc/index.js @@ -1,13 +1,17 @@ -import Localization from 'react-localization'; import AsyncStorage from '@react-native-community/async-storage'; +import dayjs from 'dayjs'; +import localeData from 'dayjs/plugin/localeData'; +import relativeTime from 'dayjs/plugin/relativeTime'; +import Localization from 'react-localization'; + import { AppStorage } from '../class'; import { BitcoinUnit } from '../models/bitcoinUnits'; -import relativeTime from 'dayjs/plugin/relativeTime'; -const dayjs = require('dayjs'); -const currency = require('../currency'); + const BigNumber = require('bignumber.js'); + let strings; dayjs.extend(relativeTime); +dayjs.extend(localeData); // first-time loading sequence (async () => { @@ -18,77 +22,34 @@ dayjs.extend(relativeTime); strings.setLanguage(lang); let localeForDayJSAvailable = true; switch (lang) { - case 'el': - require('dayjs/locale/el'); - break; - case 'it': - require('dayjs/locale/it'); - break; case 'zh_cn': lang = 'zh-cn'; require('dayjs/locale/zh-cn'); break; - case 'zh_tw': - lang = 'zh-tw'; - require('dayjs/locale/zh-tw'); - break; - case 'ru': - require('dayjs/locale/ru'); - break; case 'es': require('dayjs/locale/es'); break; - case 'fi_fi': - require('dayjs/locale/fi'); - break; - case 'fr_fr': - require('dayjs/locale/fr'); - break; - case 'pt_br': - lang = 'pt-br'; - require('dayjs/locale/pt-br'); - break; case 'pt_pt': lang = 'pt'; require('dayjs/locale/pt'); break; - case 'jp_jp': + case 'ja': lang = 'ja'; require('dayjs/locale/ja'); break; - case 'de_de': - require('dayjs/locale/de'); - break; - case 'th_th': - require('dayjs/locale/th'); - break; - case 'da_dk': - require('dayjs/locale/da'); - break; - case 'nl_nl': - require('dayjs/locale/nl'); - break; - case 'hr_hr': - require('dayjs/locale/hr'); - break; - case 'hu_hu': - require('dayjs/locale/hu'); - break; case 'id_id': require('dayjs/locale/id'); break; - case 'sv_se': - require('dayjs/locale/sv'); - break; - case 'nb_no': - require('dayjs/locale/nb'); - break; case 'tr_tr': require('dayjs/locale/tr'); break; case 'vi_vn': require('dayjs/locale/vi'); break; + case 'ko_KR': + lang = 'ko'; + require('dayjs/locale/ko'); + break; default: localeForDayJSAvailable = false; break; @@ -101,32 +62,14 @@ dayjs.extend(relativeTime); strings = new Localization({ en: require('./en.js'), - ru: require('./ru.js'), - pt_br: require('./pt_BR.js'), pt_pt: require('./pt_PT.js'), es: require('./es.js'), - it: require('./it.js'), - el: require('./el.js'), - ua: require('./ua.js'), - jp_jp: require('./jp_JP.js'), - de_de: require('./de_DE.js'), - da_dk: require('./da_DK.js'), - cs_cz: require('./cs_CZ.js'), - th_th: require('./th_TH.js'), - nl_nl: require('./nl_NL.js'), - fi_fi: require('./fi_FI.js'), - fr_fr: require('./fr_FR.js'), - hr_hr: require('./hr_HR.js'), - hu_hu: require('./hu_HU.js'), + ja: require('./jp_JP.js'), id_id: require('./id_ID.js'), zh_cn: require('./zh_cn.js'), - zh_tw: require('./zh_tw.js'), - sv_se: require('./sv_SE.js'), - nb_no: require('./nb_NO.js'), tr_tr: require('./tr_TR.js'), vi_vn: require('./vi_VN.js'), - zar_xho: require('./ZAR_Xho.js'), - zar_afr: require('./ZAR_Afr.js'), + ko_kr: require('./ko_KR.js'), }); strings.saveLanguage = lang => AsyncStorage.setItem(AppStorage.LANG, lang); @@ -135,14 +78,24 @@ strings.transactionTimeToReadable = time => { if (time === 0) { return strings._.never; } - let ret; + let timejs; try { - ret = dayjs(time).fromNow(); + timejs = dayjs(time).format('YYYY-MM-DD, HH:mm:ss'); } catch (_) { console.warn('incorrect locale set for dayjs'); return time; } - return ret; + return timejs; +}; + +strings.getListOfMonthsAndWeekdays = () => { + const dayjsLocaleData = dayjs.localeData(); + return { + monthNames: dayjsLocaleData.months(), + monthNamesShort: dayjsLocaleData.monthsShort(), + dayNames: dayjsLocaleData.weekdays(), + dayNamesShort: dayjsLocaleData.weekdaysShort(), + }; }; function removeTrailingZeros(value) { @@ -165,7 +118,7 @@ function removeTrailingZeros(value) { */ strings.formatBalance = (balance, toUnit, withFormatting = false) => { if (toUnit === undefined) { - return balance + ' ' + BitcoinUnit.BTC; + return parseFloat(balance.toFixed(8)) + ' ' + BitcoinUnit.BTC; } if (toUnit === BitcoinUnit.BTC) { const value = new BigNumber(balance).dividedBy(100000000).toFixed(8); @@ -178,7 +131,8 @@ strings.formatBalance = (balance, toUnit, withFormatting = false) => { BitcoinUnit.SATS ); } else if (toUnit === BitcoinUnit.LOCAL_CURRENCY) { - return currency.satoshiToLocalCurrency(balance); + return ' '; + //return currency.satoshiToLocalCurrency(balance); } }; @@ -190,16 +144,20 @@ strings.formatBalance = (balance, toUnit, withFormatting = false) => { */ strings.formatBalanceWithoutSuffix = (balance = 0, toUnit, withFormatting = false) => { if (toUnit === undefined) { - return balance; + return parseFloat(balance.toFixed(8)); } if (balance !== 0) { if (toUnit === BitcoinUnit.BTC) { const value = new BigNumber(balance).dividedBy(100000000).toFixed(8); return removeTrailingZeros(value); } else if (toUnit === BitcoinUnit.SATS) { - return (balance < 0 ? '-' : '') + (withFormatting ? new Intl.NumberFormat().format(balance).replace(/[^0-9]/g, ' ') : balance); + return ( + (balance < 0 ? '-' : '') + + (withFormatting ? new Intl.NumberFormat().format(balance).replace(/[^0-9]/g, ' ') : balance) + ); } else if (toUnit === BitcoinUnit.LOCAL_CURRENCY) { - return currency.satoshiToLocalCurrency(balance); + return ' '; + //return currency.satoshiToLocalCurrency(balance); } } return balance.toString(); diff --git a/loc/it.js b/loc/it.js deleted file mode 100644 index 5f7ffc16d7..0000000000 --- a/loc/it.js +++ /dev/null @@ -1,246 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Il tuo archivio è criptato. È necessaria una password per decriptarlo', - enter_password: 'Inserisci password', - bad_password: 'Password errata, riprova', - never: 'mai', - continue: 'Continua', - ok: 'OK', - }, - wallets: { - select_wallet: 'Seleziona Portafoglio', - options: 'Opzioni', - createBitcoinWallet: - 'Non hai un portafoglio Bitcoin attualmente. Per ricaricare un portafoglio Lightning, è necessario creare o importare un portafoglio Bitcoin. Vuoi continuare lo stesso?', - list: { - app_name: 'BlueWallet', - title: 'Portafogli', - header: - 'Un portafoglio rappresenta la coppia fra un segreto (chiave privata) e un indirizzo' + - 'che puoi condividere per ricevere Bitcoin.', - add: 'Aggiungi Portafoglio', - create_a_wallet: 'Crea un portafoglio', - create_a_wallet1: 'È gratuito e puoi crearne', - create_a_wallet2: 'quanti ne vuoi', - latest_transaction: 'Transazioni recenti', - empty_txs1: 'Le tue transazioni appariranno qui,', - empty_txs2: 'Nessuna transazione', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Clicca qui per comprare Bitcoin', - }, - reorder: { - title: 'Riordina Portafogli', - }, - add: { - title: 'Aggiungi Portafoglio', - description: - 'Puoi scansionare il Backup di un Paper-Wallet (in WIF - Wallet Import Format), o creare un nuovo portafoglio. I portafogli Segwit sono supportati di default.', - scan: 'Scan', - create: 'Crea', - label_new_segwit: 'Nuovo SegWit', - label_new_lightning: 'Nuovo Lightning', - wallet_name: 'Nome Portafoglio', - wallet_type: 'Tipo', - or: 'o', - import_wallet: 'Importa Portafoglio', - imported: 'Importato', - coming_soon: 'In arrivo', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Portafoglio', - address: 'Indirizzo', - type: 'Tipo', - label: 'Etichetta', - destination: 'Destinazione', - description: 'Descrizione', - are_you_sure: 'Sei sicuro?', - yes_delete: 'Si, elimina', - no_cancel: 'No, annulla', - delete: 'Elimina', - save: 'Salva', - delete_this_wallet: 'Elimina questo portafoglio', - export_backup: 'Esporta / Backup', - buy_bitcoin: 'Compra Bitcoin', - show_xpub: 'Mostra XPUB del portafoglio', - }, - export: { - title: 'Esporta portafoglio', - }, - xpub: { - title: 'XPUB del Portafoglio', - copiedToClipboard: 'Copiata negli appunti.', - }, - import: { - title: 'Importa', - explanation: - 'Scrivi qui la tua frase mnemonica, chiave privata, WIF, o qualunque altra cosa tu abbia. BlueWallet tenterà di indovinare il formato corretto e importerà il tuo portafoglio', - imported: 'Importato', - error: 'Importazione fallita. Assicurati che le informazioni fornite siano valide.', - success: 'Fatto', - do_import: 'Importa', - scan_qr: 'o scansionare un codice QR?', - }, - scanQrWif: { - go_back: 'Indietro', - cancel: 'Annulla', - decoding: 'Decodifica', - input_password: 'Inserisci password', - password_explain: 'Questa è una chiave privata BIP38 criptata', - bad_password: 'Password errata', - wallet_already_exists: 'Questo portafoglio esiste già', - bad_wif: 'WIF errato', - imported_wif: 'Importa WIF ', - with_address: ' con indirizzo ', - imported_segwit: 'SegWit importato', - imported_legacy: 'Legacy importato', - imported_watchonly: 'Watch-only importato', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transazioni', - title: 'Transazioni', - description: 'Una lista delle transazioni in entrata e in uscita dei tuoi portafogli', - conf: 'conf', - }, - details: { - title: 'Transazione', - from: 'Da', - to: 'A', - copy: 'Copia', - transaction_details: 'Dettagli transazione', - show_in_block_explorer: 'Mostra sul block explorer', - }, - }, - send: { - header: 'Invia', - details: { - title: 'Crea transazione', - amount_field_is_not_valid: 'Importo non valido', - fee_field_is_not_valid: 'Commissione non valida', - address_field_is_not_valid: 'Indirizzo non valido', - total_exceeds_balance: "L'importo da inviare eccede i fondi disponibili.", - create_tx_error: "Si è verificato un errore nella creazione della transazione. Assicurati che l'indirizzo sia valido", - address: 'Indirizzo', - amount_placeholder: 'Importo da inviare (in BTC)', - fee_placeholder: 'Più commissione (in BTC)', - note_placeholder: 'Nota', - cancel: 'Annulla', - scan: 'Scansiona', - send: 'Invia', - create: 'Crea', - remaining_balance: 'Fondi rimanenti', - }, - confirm: { - header: 'Conferma', - sendNow: 'Invia ora', - }, - success: { - done: 'Fatto', - }, - create: { - details: 'Dettagli', - title: 'Crea transazione', - error: 'Errore nella creazione della transazione. Indirizzo o importo invalido', - go_back: 'Indietro', - this_is_hex: "Questo è l'hex della transazione, firmato e pronto per essere trasmesso sulla rete.", - to: 'A', - amount: 'Importo', - fee: 'Commissione', - tx_size: 'Grandezza TX', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Trasmetti', - not_enough_fee: 'Commissione non sufficiente. Aumenta la commissione', - }, - }, - receive: { - header: 'Ricevi', - details: { - title: "Condividi questo indirizzo con l'acquirente", - share: 'Condividi', - copiedToClipboard: 'Copiato negli appunti.', - label: 'Descrizione', - create: 'Crea', - setAmount: 'Ricevi con importo', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Compra Bitcoin', - tap_your_address: 'Clicca sul tuo indirizzo per copiarlo negli appunti:', - copied: 'Copiato negli appunti!', - }, - settings: { - header: 'Impostazioni', - plausible_deniability: 'Negazione plausibile...', - storage_not_encrypted: 'Archivio: non criptato', - storage_encrypted: 'Archivio: criptato', - password: 'Password', - password_explain: "Crea la password che userai per decriptare l'archivio", - retype_password: 'Reinserisci password', - passwords_do_not_match: 'Le password non corrispondono', - encrypt_storage: 'Cripta archivio', - lightning_settings: 'Impostazioni Lightning', - lightning_settings_explain: - 'Per connetterti al tuo nodo LND personale installa LndHub' + - ' e inserisci il suo URL qui nelle impostazioni. Lascialo vuoto per utilizzare il nodo LndHub di default (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Salva', - about: 'Informazioni', - language: 'Lingua', - currency: 'Valuta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Negazione Plausibile', - help: - 'In alcune circostanze, potresti essere costretto a rivelare la ' + - 'password. Per mantenere i tuoi Bitcoin al sicuro, BlueWallet può creare un altro ' + - 'archivio criptato, con una password diversa. Se costretto, ' + - 'puoi rivelare questa password alle terze parti. Se inserita in ' + - 'BlueWallet, questa sbloccherà un "falso" archivio. Esso sembrerà ' + - 'autentico alle terze parti, ma manterrà segretamente il tuo archivio principale ' + - 'con i Bitcoin al sicuro.', - help2: 'Il nuovo archivio sarà completamente funzionante, e puoi conservarci ' + 'piccole quantità così sembrerà più credibile.', - create_fake_storage: 'Crea archivio falso criptato', - go_back: 'Indietro', - create_password: 'Crea una password', - create_password_explanation: "La password per l'archivio falso non deve corrispondere a quella dell'archivio principale", - password_should_not_match: "La password per l'archivio falso non deve corrispondere a quella dell'archivio principale", - retype_password: 'Reinserisci password', - passwords_do_not_match: 'Le password non corrispondono, riprova', - success: 'Fatto', - }, - lnd: { - title: 'Gestisci fondi', - choose_source_wallet: 'Scegli un portafoglio sorgente', - refill_lnd_balance: 'Ricarica saldo del portafoglio Lightning', - refill: 'Ricarica', - withdraw: 'Preleva', - expired: 'Scaduto', - placeholder: 'Fattura', - sameWalletAsInvoiceError: 'Non puoi pagare una fattura con lo stesso portafoglio utilizzato per crearla.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/jp_JP.js b/loc/jp_JP.js index f3ceec3b05..55c96b76e5 100644 --- a/loc/jp_JP.js +++ b/loc/jp_JP.js @@ -1,245 +1,340 @@ module.exports = { _: { - storage_is_encrypted: 'ウォレットは暗号化されています。復号にはパスワードが必要です。', - enter_password: 'パスワードを入力', - bad_password: 'パスワードが間違っています。', - never: 'データなし', - continue: '続行', + languageCode: 'ja', + storage_is_encrypted: 'ストレージは暗号化されています。それを復号化するためにはパスワードが必要です。', + enter_password: 'パスワードの入力', + bad_password: 'パスワードが間違っています。再度お試しください', + never: '一度もない', + continue: '続行する', ok: 'OK', + click: 'クリック', + here: 'こちら', + save: '保存', + confirm: '確認', + copy: 'コピー', + copied: 'コピーされました!', + }, + tabNavigator: { + dashboard: 'ダッシュボード', + settings: '設定', + addressBook: 'アドレス帳', + }, + message: { + somethingWentWrong: '問題が発生しました', + somethingWentWrongWhileCreatingWallet: + 'ウォレットの作成中に問題が発生しましたダッシュボードに戻って、再度お試しください。', + success: '成功', + successfullWalletImport: 'ウォレットは適切にインポートされました。現在ダッシュボードに戻ることができます。', + successfullWalletDelete: 'ウォレットは適切に削除されました。現在ダッシュボードに戻ることができます。', + returnToDashboard: 'ダッシュボードに戻る', + creatingWallet: 'ウォレットの作成', + creatingWalletDescription: 'ウォレットを作成している間お待ちください。しばらく時間がかかる場合があります。', + }, + onboarding: { + onboarding: '設定', + pin: 'PINコード', + createPin: 'PINコードの生成', + createNewPin: '新しいPINコード', + createPassword: 'トランザクションパスワードの生成', + createPinDescription: 'PINコードはアプリケーションのログインに利用されます。設定メニューから変更可能です。', + confirmPin: 'PINコードの確認', + confirmNewPin: '新しいPINコードの確認', + confirmPassword: 'トランザクションパスワードの確認', + passwordDoesNotMatch: 'パスワードが一致しません。有効なパスワードを入力してください。', + createPasswordDescription: + 'すべてのトランザクションを確認するため、トランザクションパスワードが利用されます。設定されたパスワードの変更は不可能です。トランザクションのパスワードは8桁以上の英文字と数字で構成しなければなりません。', + changePin: 'PINコードの変更', + currentPin: '現在のPINコード', + pinDoesNotMatch: 'パスワードが一致しません。有効なパスワードを入力してください。', + successDescription: 'おめでとうございます!\nPINコード生成が正常に完了されました。', + successDescriptionChangedPin: 'おめでとうございます!\nPINコード変更が正常に完了されました。', + successButton: 'ダッシュボードに戻る', + successButtonChangedPin: '設定に戻る', + }, + unlock: { + title: '解除', + touchID: '"ゴールドウォレット" のTouch ID', + confirmButton: '指紋認証を完了してください。', + enter: 'PINコードの入力', + }, + unlockTransaction: { + headerText: 'トランザクションの確認', + title: 'トランザクションパスワードの確認', + description: 'トランザクションパスワードを確認し、トランザクションを続ける。', }, wallets: { - select_wallet: 'ウォレット選択', - options: 'オプション', - createBitcoinWallet: - 'Bitcoin ウォレットを持っていません。Lightning ウォレットへ課金する場合は Bitcoin ウォレットを新規作成するかインポートする必要があります。続行しますか?', - list: { - app_name: 'BlueWallet', + dashboard: { title: 'ウォレット', - header: 'ウォレットは秘密鍵(プライベートキー)とウォレットアドレスのペアで構成されています。' + 'コインを受信するために共有できます。', - add: 'ウォレットの追加', - create_a_wallet: 'ウォレットの作成', - create_a_wallet1: 'ウォレット作成は無料で', - create_a_wallet2: '好きなだけ複数作成できます', - latest_transaction: '最新の取引', - empty_txs1: 'ここに取引が表示されます', - empty_txs2: '現在は何もありません', - empty_txs1_lightning: 'Lightning ウォレットを日常の取引にご利用ください。手数料は安く、送金はあっという間に完了します。', - empty_txs2_lightning: '\n利用を開始するには"資金の管理"をタップしてウォレットへ送金してください。', - tap_here_to_buy: 'Bitcoin を購入するにはここをタップ', + allWallets: 'すべてのウォレット', + noWallets: 'ウォレットなし', + noWalletsDesc1: '表示するウォレットがありません。', + noWalletsDesc2: '最初のウォレットに追加する。', + send: 'コインを送金する', + receive: 'コインを受け取る', + noTransactions: '表示するトランザクションがありません。', }, - reorder: { - title: 'ウォレットの並び替え', + walletModal: { btcv: 'VLS', wallets: 'ウォレット' }, + importWallet: { + title: 'ご使用のウォレットをインポートする', + header: 'ウォレットのインポート', + subtitle: + 'ここにユーザーのニーモニック、秘密鍵、WIF、または取得したその他のものを入力してください。VelesWalletでは、最善を尽くして、正しいフォーマットを推測し、ウォレットをインポートします。', + placeholder: 'ニーモニック、秘密鍵、WIF', + import: 'QRコードをインポート', + scanQrCode: 'またはスキャン', + walletInUseValidationError: 'ウォレットはすでに使用されています。有効なウォレットを入力してください。', }, + exportWallet: { title: 'ニーモニックのフレーズ', header: 'ウォレットのエクスポート' }, + exportWalletXpub: { header: 'ウォレットXPUB' }, + deleteWallet: { + title: 'ご使用のウォレットを削除する', + header: 'ウォレットの削除', + description1: '削除してもよろしいですか', + description2: '?それを取り消すことはできません。', + no: 'いいえ', + yes: 'はい', + }, + wallet: { none: 'なし', latest: '最新のトランザクション' }, add: { - title: 'ウォレットの追加', + title: '新しいウォレットの追加', + subtitle: 'ウォレットに名前を付ける', + description: '新しいウォレットの名前を入力してください。', + inputLabel: '名前', + addWalletButton: '新しいウォレットの追加', + importWalletButton: 'ウォレットのインポート', + advancedOptions: '高度なオプション', + multipleAddresses: '複数のアドレス', + singleAddress: '単一のアドレス', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: '単一の24文字シードから生成されるsegwitアドレスのツリーを含めます。', + }, + addSuccess: { + title: '新しいウォレットの追加', + subtitle: '成功', description: - 'ペーパーウォレット(WIF 形式- Wallet Import Format)をスキャンするかウォレットを新規作成できます。既定で Segwit ウォレットが作成されます。', - scan: '読取り', - create: '作成', - label_new_segwit: '新規 SegWit', - label_new_lightning: '新規 Lightning', - wallet_name: 'ウォレット名', - wallet_type: 'タイプ', - or: '又は', - import_wallet: 'ウォレットをインポート', - imported: 'インポート完了', - coming_soon: '準備中', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'ウォレットが作成されました。時間を取って、このニーモニックのフレーズを紙に書いてください。それはバックアップです。それを使用して、他のデバイスでウォレットをリストアすることができます。', + okButton: 'OK。これを書きました!', }, details: { - title: 'ウォレット', - address: 'アドレス', - type: 'タイプ', - label: 'ラベル', - destination: '送り先', - description: '内容', - are_you_sure: '実行しますか?', - yes_delete: 'はい、削除します', - no_cancel: 'いいえ、中止します', - delete: '削除', - save: '保存', - delete_this_wallet: 'このウォレットの削除', - export_backup: 'エクスポート / バックアップ', - buy_bitcoin: 'Bitcoin の購入', - show_xpub: 'ウォレット XPUB の表示', - }, - export: { - title: 'ウォレットのエクスポート', - }, - xpub: { - title: 'ウォレット XPUB', - copiedToClipboard: 'クリップボードにコピーしました。', + edit: '編集', + latestTransaction: '最新のトランザクション', + typeLabel: '種類', + nameLabel: '名前', + exportWallet: 'ウォレットのエクスポート', + showWalletXPUB: 'ウォレットXPUBを表示する', + deleteWallet: 'ウォレットの削除', + nameEdit: '名前の変更', }, + export: { title: 'ウォレットのエクスポート' }, import: { title: 'インポート', explanation: - 'ここにニモニック、秘密鍵(プライベートキー)、WIFなどを入力してください。BlueWallet が正しい形式を推測しウォレットをインポートします。', - imported: 'インポート完了', - error: 'インポートに失敗しました。入力したデータが有効か確認してください。', + 'ここにユーザーのニーモニック、秘密鍵、WIF、または取得したその他のものを入力してください。VelesWalletでは、最善を尽くして、正しいフォーマットを推測し、ウォレットをインポートします', + imported: 'インポート済み', + error: 'インポートできませんでした。提供されたデータが有効であることを確認してください。', success: '成功', - do_import: 'インポート', - scan_qr: 'QR コードの読み取り', + do_import: '代わりにQRコードをインポート', + scan_qr: 'またはスキャンしますか?', }, scanQrWif: { go_back: '戻る', - cancel: '中止', - decoding: '解読中', - input_password: 'パスワードの入力', - password_explain: 'これは BIP38 暗号化秘密鍵です', - bad_password: 'パスワードが違います', - wallet_already_exists: '同じウォレットが既に存在します', - bad_wif: 'WIF 形式が間違っています', - imported_wif: 'WIF インポート完了 ', - with_address: ' アドレス ', - imported_segwit: 'SegWit インポート完了', - imported_legacy: 'Legacy インポート完了', - imported_watchonly: '閲覧専用 インポート完了', + cancel: 'キャンセル', + decoding: '復号', + input_password: 'パスワードを入力する', + password_explain: 'これはBIP38暗号化秘密鍵です', + bad_password: '誤っているパスワード', + wallet_already_exists: 'このウォレットはすでに存在しています', + bad_wif: '誤っているWIF', + imported_wif: 'インポート済みWIF', + with_address: 'アドレスで', + imported_segwit: 'インポート済みSegWit', + imported_legacy: 'インポート済みLegacy', + imported_watchonly: 'インポート済みWatch-only', }, }, transactions: { - list: { - tabBarLabel: '取引', - title: '取引', - description: 'ウォレットの送金または入金のリスト', - conf: '確認', - }, + list: { conf: '確認' }, details: { - title: '取引', - from: '送り主', - to: '送り先', + title: 'トランザクション', + detailTitle: 'トランザクション詳細', + transactionHex: 'トランザクションhex', + transactionHexDescription: + 'これは、署名済みで、ネットワークにブロードキャストする準備ができているトランザクションhexです', + copyAndBoriadcast: '後ほどコピーおよびブロードキャスト', + verify: 'coinb.inで確認', + amount: '金額', + fee: '料金', + txSize: 'TXサイズ', + satoshiPerByte: 'バイト当たりのSatoshi', + from: '送信元', + to: '送信先', + bytes: 'バイト', copy: 'コピー', - transaction_details: '取引詳細', - show_in_block_explorer: 'Block Explorer で表示', + noLabel: 'ラベルなし', + details: '詳細', + transactionId: 'トランザクションID', + confirmations: '確認', + transactionDetails: 'トランザクション詳細', + viewInBlockRxplorer: 'ブロックエクスプローラーの表示', + addNote: 'メモの追加', + note: 'メモ', + inputs: '入力', + ouputs: '出力', + sendCoins: 'コインを送金する', }, }, send: { - header: '送金', + header: 'コインを送金する', + success: { + title: '成功', + description: '万歳!適切にトランザクションを終了しました。', + done: '終了', + return: 'ダッシュボードに戻る', + }, details: { - title: '取引の作成', - amount_field_is_not_valid: '金額欄が正しくありません', - fee_field_is_not_valid: '手数料欄が正しくありません', - address_field_is_not_valid: 'アドレス欄が正しくありません', - total_exceeds_balance: '送金額が利用可能残額を超えています。', - create_tx_error: '取引作成中にエラーが発生しました。有効な送金アドレスか確認してください。', + title: 'トランザクションの作成', + amount_field_is_not_valid: '金額フィールドが有効ではありません', + fee_field_is_not_valid: '料金フィールドが有効ではありません', + address_field_is_not_valid: 'アドレスフィールドが有効ではありません', + create_tx_error: 'トランザクションの作成中にエラーがありました。アドレスが有効であることを確認してください。', address: 'アドレス', - amount_placeholder: '送金額 (BTC)', - fee_placeholder: '取引手数料 (BTC)', - note_placeholder: 'ラベル', - cancel: '中止', - scan: '読取り', + amount_placeholder: '(VLSの)送信する金額', + fee_placeholder: '(VLSの)追加のトランザクション料金', + note_placeholder: '自分のためのメモ', + cancel: 'キャンセル', + scan: 'スキャン', send: '送金', - create: '作成', + next: '次へ', + note: 'メモ(オプション)', + to: '送信先', + feeUnit: 'Sat/B', + fee: '料金:', + create: 'インボイスの作成', remaining_balance: '残高', + total_exceeds_balance: '送金する金額が利用可能な残高を上回っています。', }, - confirm: { - header: '確認', - sendNow: '送金実行', - }, - success: { - done: '完了', - }, + confirm: { sendNow: '今すぐ送金する' }, create: { - details: '詳細', - title: '取引の作成', - error: '取引作成でエラーが発生しました。アドレスまたは送金額を確認してください。', - go_back: '戻る', - this_is_hex: '署名されネットワークへ送信される 16 進数取引コードです', - to: '送金先', - amount: '送金額', - fee: '手数料', - tx_size: 'TX サイズ', - satoshi_per_byte: 'Satoshi/byte', - memo: 'メモ', - broadcast: '送信', - not_enough_fee: '手数料不足です。増額してください', + amount: '金額', + fee: '料金', + setTransactionFee: 'トランザクション料金の設定', + headerText: + 'ネットワークに多数の保留中のトランザクションがあるとき(1,500超)、より高い料金を支払うことにより、トランザクションの処理速度が早くなります。通常の金額は1~500 sat/bです', }, }, receive: { - header: '入金', - details: { - title: 'このアドレスを支払者と共有', - share: '共有', - copiedToClipboard: 'クリップボードにコピーしました。', - label: '概要', - create: '作成', - setAmount: '入金額', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Bitcoin の購入', - tap_your_address: 'タップしてアドレスをクリップボードにコピー:', - copied: 'クリップボードにコピーしました!', + header: 'コインを受け取る', + details: { amount: '金額', share: '共有する', receiveWithAmount: '金額とともに受け取る' }, }, settings: { + language: '言語', + general: '一般', + security: 'セキュリティ', + about: '情報', + electrumServer: 'Electrumサーバー', + advancedOptions: '高度なオプション', + changePin: 'PINの変更', + fingerprintLogin: '指紋でのログイン', + aboutUs: '当社について', header: '設定', - plausible_deniability: '隠匿設定...', - storage_not_encrypted: 'ウォレット: 暗号化されていません', - storage_encrypted: 'ウォレット: 暗号化されています', - password: 'パスワード', - password_explain: 'ウォレットの復号に使用するパスワードを作成', - retype_password: 'パスワードの再入力', - passwords_do_not_match: 'パスワードが一致しません', - encrypt_storage: 'ウォレットの暗号化', - lightning_settings: 'Lightning 設定', - lightning_settings_explain: - '他の LND ノードへ接続するには LndHub をインストール後、' + - 'URL を入力してください。既定の設定を使用するには空欄にします' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', + notSupportedFingerPrint: '該当デバイスはTouchIDをご利用いただけません。', + TouchID: 'Touch IDを許可する', + FaceID: 'Face IDを許可する', + Biometrics: '生体認証を許可する', + }, + aboutUs: { + header: '当社について', + releaseNotes: 'リリースノート', + runSelfTest: 'セルフテストの実行', + buildWithAwesome: '素晴らしいサービスを構築', + rateVelesWallet: 'VelesWalletを評価する', + goToOurGithub: '当社のGithubに進む', + alwaysBackupYourKeys: '常に鍵をバックアップする', + title: 'ゴールドウォレットは、Cortez Vaultウォレットのための無料のオープンソースです。ライセンス:MIT。', + }, + electrumServer: { + header: 'Electrumサーバー', + title: 'Electrumサーバーの変更', + description: 'アプリケーション連結のサーバー変更が可能です。基本的に提供されるアドレスのご利用をおすすめします。', save: '保存', - about: 'BlueWallet について', - language: '言語', - currency: '通貨', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: '隠匿設定', - help: - 'BuleWallet のウォレットの復号に必要なパスワードを第三者に強要される場合、' + - 'コインを安全に保護するためにメインのウォレットとは異なるパスワードで' + - '暗号化されたダミーのウォレットを作成することが可能です。' + - '第三者へ異なるパスワードを提供すれば、BlueWallet のダミーの' + - '暗号化ウォレットを復号することとなり、メインのウォレットは隠匿され' + - 'コインは安全に保護されます。', - help2: - '新規のダミーのウォレットはメインと同様に機能します。少額のコインを入金しておくことで' + - 'ダミーと疑われないようにすることが可能です。', - create_fake_storage: 'ダミーの暗号化ウォレットの作成', - go_back: '戻る', - create_password: 'パスワードの作成', - create_password_explanation: 'ダミーのウォレットのパスワードはメインのウォレットのパスワードと異なる必要があります。', - password_should_not_match: 'ダミーのウォレットのパスワードはメインのウォレットのパスワードと異なる必要があります。', - retype_password: 'パスワードの再入力', - passwords_do_not_match: 'パスワードが一致しません', + useDefault: 'デフォルトを使用', + host: 'ホスト', + port: 'ポート', + successfullSave: '変更は適切に保存されました。変更を有効にするために、再起動が必要な場合があります。', + connectionError: '提供されたElectrumサーバーに接続できません', + }, + advancedOptions: { + title: '詳細設定', + description: '詳細設定を活性化した場合、以下のウォレット設定が可能になります:P2SH, HD P2SH, HD segwit', + }, + selectLanguage: { + header: '言語', + restartInfo: '新しい言語を選択したら、変更を有効にするために、VelesWalletの再起動が必要な場合があります', + confirmation: '確認', + confirm: '確認する', + alertDescription: '言語を選択して、アプリケーションを再起動しますか?', + cancel: 'キャンセル', + }, + contactList: { + cancel: 'キャンセル', + search: '検索', + screenTitle: 'アドレス帳', + noContacts: '連絡先がありません', + noContactsDesc1: '表示する連絡先がありません。 \nクリックして、', + noContactsDesc2: '最初の連絡先を追加する。', + noResults: '結果がありません', + }, + contactCreate: { + screenTitle: '新しい連絡先を追加する', + subtitle: '新しい連絡先', + description: '新しい連絡先の名前とアドレスを入力してください。', + nameLabel: '名前', + addressLabel: 'アドレス', + buttonLabel: '新しい連絡先を追加する', + successTitle: '成功', + successDescription: '万歳!連絡先を適切に追加しました。', + successButton: 'アドレス帳に戻る', + }, + contactDetails: { + nameLabel: '名前', + addressLabel: 'アドレス', + editName: '名前の変更', + editAddress: 'アドレスの変更', + sendCoinsButton: 'コインを送金する', + showQRCodeButton: 'QRコードの表示', + deleteButton: '連絡先の削除', + share: '共有する', + }, + contactDelete: { + title: '連絡先を削除する', + header: '連絡先の削除', + description1: '削除してもよろしいですか', + description2: '?\nそれを取り消すことはできません。', + no: 'いいえ', + yes: 'はい', success: '成功', + successDescription: '連絡先は適切に削除されました。\nアドレス帳に戻ることができます。', + successButton: 'アドレス帳に戻る', + }, + scanQrCode: { + permissionTitle: 'カメラを使用する許可', + permissionMessage: 'カメラを使用する許可が必要です', + ok: 'Ok', + cancel: 'キャンセル', }, - lnd: { - title: '資金の管理', - choose_source_wallet: '送金元ウォレットを選択', - refill_lnd_balance: 'Lightning ウォレットへ送金', - refill: '送金', - withdraw: '引き出し', - placeholder: '入金依頼', - expired: '失効', - sameWalletAsInvoiceError: '以前作成したウォレットと同じウォレットへの支払いはできません。', - }, - pleasebackup: { - title: 'ウォレットを作成しています...', - text: - 'すべてのニモニックを別紙に書きとめてください。他のデバイスへウォレットをリストアする際にニモニックが必要になります。デスクトップ用ウォレットの Electrum wallet (https://electrum.org/) へニモニックを使用してウォレットをリストアすることが可能です。', - ok: 'すべてのニモニックを書きとめました', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'この請求書は支払いが行われなかったため無効になりました', - has_been_paid: 'この請求書は支払い完了しました', - please_pay: '支払う額', - sats: 'sats', - for: 'メモ:', - additional_info: '追加情報', - open_direct_channel: 'このノードの直接チャネルを作成:', + filterTransactions: { + header: 'トランザクション・フィルター', + receive: '入金', + send: '送金', + filter: 'フィルター設定', + to: '受領者', + toAmount: '最大金額', + toDate: '終了日', + from: '送金者', + fromAmount: '最小金額', + fromDate: '開始日', + clearFilters: 'フィルター解除', }, }; diff --git a/loc/ko_KR.js b/loc/ko_KR.js new file mode 100644 index 0000000000..93b6174989 --- /dev/null +++ b/loc/ko_KR.js @@ -0,0 +1,340 @@ +module.exports = { + _: { + languageCode: 'ko', + storage_is_encrypted: '저장 공간이 암호화되었습니다. 암호를 해독하려면 비밀번호가 필요합니다', + enter_password: '비밀번호를 입력하십시오', + bad_password: '잘못된 비밀번호입니다. 다시 시도하십시오', + never: '아니요', + continue: '계속', + ok: '확인', + click: '클릭', + here: '여기 클릭', + save: '저장', + confirm: '승인', + copy: '복사', + copied: '복사 완료!', + }, + tabNavigator: { + dashboard: '대시보드', + settings: '설정', + addressBook: '주소록', + }, + message: { + somethingWentWrong: '문제가 발생했습니다', + somethingWentWrongWhileCreatingWallet: + '지갑을 생성 중에 문제가 발생했습니다. 대시보드로 돌아가서 다시 시도하십시오.', + success: '성공', + successfullWalletImport: '지갑 가져오기에 성공했습니다. 이제 대시보드로 돌아갈 수 있습니다.', + successfullWalletDelete: '지갑 삭제에 성공했습니다. 이제 대시보드로 돌아갈 수 있습니다.', + returnToDashboard: '대시보드로 돌아가기', + creatingWallet: '지갑 만들기', + creatingWalletDescription: '지갑을 만드는 동안 기다려주십시오. 약간의 시간이 소요될 수 있습니다.', + }, + onboarding: { + onboarding: '설정 실행', + pin: 'PIN 코드', + createPin: 'PIN 코드 생성하기', + createNewPin: '새로운 PIF 코드', + createPassword: '트랜잭션 비밀번호 생성하기', + createPinDescription: 'PIN 코드를 이용하여 어플리케이션에 로그인 할 수 있습니다. 설정 영역에 변경 가능합니다.', + confirmPin: 'PIF 코드 확인하기', + confirmNewPin: '새로운 PIN 코드 확인하기', + confirmPassword: '트랜잭션 비밀번호 확인하기', + passwordDoesNotMatch: '비밀번호 불일치. 유효한 비밀번호를 입력하세요.', + createPasswordDescription: + '모든 트랜잭션의 확인을 위해 트랜잭션 비밀번호가 사용됩니다. 설정된 비밀번호는 변경이 불가합니다. 트랜잭션 비밀번호는 반드시 최소 8자 이상의 알파벳과 숫자가 혼용되도록 구성되어야 합니다.', + changePin: 'PIN 코드 변경', + currentPin: '현재 PIF 코드', + pinDoesNotMatch: 'PIN 코드 불일치. 유효한 PIN 코드를 입력하세요.', + successDescription: '축하드립니다!\n PIN 코드를 성공적으로 생성하였습니다.', + successDescriptionChangedPin: '축하드립니다!\n PIN 코드를 성공적으로 변경하였습니다.', + successButton: '대시보드로 이동', + successButtonChangedPin: '설정으로 되돌아가기', + }, + unlock: { + title: '해제', + touchID: '"골드 월렛" Touch ID', + confirmButton: '지문 확인 후 넘어가기', + enter: 'PIN 입력', + }, + unlockTransaction: { + headerText: '트랜잭션 승인', + title: '트래잭션 비밀번호 승인', + description: '트랜잭션 비밀번호 확인하여 트랜잭션 진행하기', + }, + wallets: { + dashboard: { + title: '지갑', + allWallets: '모든 지갑', + noWallets: '지갑 없음', + noWalletsDesc1: '표시할 지갑이 없습니다.', + noWalletsDesc2: '첫 번째 지갑을 추가합니다.', + send: '코인 보내기', + receive: '코인 받기', + noTransactions: '표시할 트랜잭션이 없습니다.', + }, + walletModal: { btcv: 'VLS', wallets: '지갑' }, + importWallet: { + title: '귀하의 지갑 가져오기', + header: '지갑 가져오기', + subtitle: + '연상 기호, 개인 키, WIF 또는 가지고 있는 것을 여기에 쓰십시오. 골드월렛(VelesWallet)은 올바른 형식을 추측하고 지갑을 가져오기 위해 최선을 다합니다.', + placeholder: '연상 기호, 개인 키, WIF', + import: '가져오기', + scanQrCode: '또는 QR 코드 스캔하기', + walletInUseValidationError: '지갑이 이미 사용 중입니다. 유효한 지갑을 입력하십시오.', + }, + exportWallet: { title: '연상 기호 문구', header: '지갑 내보내기' }, + exportWalletXpub: { header: '지갑 XPUB' }, + deleteWallet: { + title: '귀하의 지갑 삭제하기', + header: '지갑 삭제하기', + description1: '정말로 삭제하시겠습니까', + description2: '? 추후 삭제를 취소할 수 없습니다.', + no: '아니요', + yes: '예', + }, + wallet: { none: '없음', latest: '최신 트랜잭션' }, + add: { + title: '새 지갑 추가', + subtitle: '지갑 이름 짓기', + description: '새 지갑의 이름을 입력하십시오.', + inputLabel: '이름', + addWalletButton: '새 지갑 추가', + importWalletButton: '지갑 가져오기', + advancedOptions: '고급 옵션', + multipleAddresses: '여러 개의 주소', + singleAddress: '단일 주소', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: + '24개의 개별 단어로 구성된 시드 암호문으로부터 생성된 고유한 세그윗 (Segwit) 주소의 모음을 포함합니다.', + }, + addSuccess: { + title: '새 지갑 추가', + subtitle: '성공', + description: + '새 지갑을 만들었습니다. 백업을 위해 이 연상 기호 문구를 종이에 적어두십시오. 이 문구를 사용하여 다른 장치에서 지갑을 복원할 수 있습니다.', + okButton: '예, 적어두었습니다!', + }, + details: { + edit: '수정', + latestTransaction: '최신 트랜잭션', + typeLabel: '유형', + nameLabel: '이름', + exportWallet: '지갑 내보내기', + showWalletXPUB: '지갑 XPUB 표시하기', + deleteWallet: '지갑 삭제하기', + nameEdit: '이름 수정하기', + }, + export: { title: '지갑 내보내기' }, + import: { + title: '가져오기', + explanation: + '연상 기호, 개인 키, WIF 또는 가지고 있는 것을 여기에 쓰십시오. 골드월렛(VelesWallet)은 올바른 형식을 추측하고 지갑을 가져오기 위해 최선을 다합니다', + imported: '가져오기', + error: '가져오기에 실패했습니다. 제공한 데이터의 유효성을 확인하십시오.', + success: '성공', + do_import: '가져오기', + scan_qr: '또는 대신에 QR 코드를 스캔하시겠습니까?', + }, + scanQrWif: { + go_back: '돌아가기', + cancel: '취소', + decoding: '디코딩', + input_password: '비밀번호 입력', + password_explain: '이것은 BIP38 암호화 개인 키입니다', + bad_password: '잘못된 비밀번호', + wallet_already_exists: '해당 지갑은 이미 존재합니다', + bad_wif: '잘못된 WIF', + imported_wif: '가져온 WIF', + with_address: '주소로', + imported_segwit: '가져온 SegWit', + imported_legacy: '가져온 레거시', + imported_watchonly: '가져온 워치 전용', + }, + }, + transactions: { + list: { conf: '확인' }, + details: { + title: '트랜잭션', + detailTitle: '트랜잭션 상세 내역', + transactionHex: '트랜잭션 헥스(hex)', + transactionHexDescription: '서명된 트랜잭션 헥스가 네트워트에 송출 준비가 되었습니다.', + copyAndBoriadcast: '복사하여 나중에 송출하기', + verify: 'Coinb.in에서 확인하기', + amount: '금액', + fee: '수수료', + txSize: 'TX 크기', + satoshiPerByte: '바이트당 사토시(Satoshi)', + from: '발신', + to: '수신', + bytes: '바이트', + copy: '복사', + noLabel: '라벨 없음', + details: '세부 사항', + transactionId: '트랜잭션 ID', + confirmations: '확인', + transactionDetails: '트랜잭션 상세 내역', + viewInBlockRxplorer: '블록 익스플로러(block explorer)에서 보기', + addNote: '메모 추가하기', + note: '메모', + inputs: '입력', + ouputs: '출력', + sendCoins: '코인 보내기', + }, + }, + send: { + header: '코인 보내기', + success: { + title: '성공', + description: '만세! 트랜잭션 완료에 성공했습니다.', + done: '완료', + return: '대시보드로 돌아가기', + }, + details: { + title: '트랜잭션 생성하기', + amount_field_is_not_valid: '금액 입력창이 유효하지 않습니다', + fee_field_is_not_valid: '수수료 입력창이 유효하지 않습니다', + address_field_is_not_valid: '주소 입력창이 유효하지 않습니다', + create_tx_error: '트랜잭션을 생성하는 중에 오류가 발생했습니다. 주소의 유효성 여부를 확인하십시오.', + address: '주소', + amount_placeholder: '보낼 금액(VLS)', + fee_placeholder: '추가 트랜잭션 수수료(VLS)', + note_placeholder: '자기 메모', + cancel: '취소', + scan: '스캔', + send: '보내기', + next: '다음', + note: '메모 (선택)', + to: '수신', + feeUnit: 'Sat/B', + fee: '수수료:', + create: '인보이스 생성하기', + remaining_balance: '잔액', + total_exceeds_balance: '송금할 금액이 사용 가능한 잔액을 초과합니다.', + }, + confirm: { sendNow: '지금 보내기' }, + create: { + amount: '금액', + fee: '수수료', + setTransactionFee: '트랜잭션 수수료 설정하기', + headerText: + '네트워크에 보류 중인 트랜잭션이 많을 때 (>1500), 수수료가 높을수록 트랜잭션이 더 빨리 처리됩니다. 일반적인 값은 1-500 sat/b입니다', + }, + }, + receive: { + header: '코인 받기', + details: { amount: '금액', share: '공유', receiveWithAmount: '금액으로 받기' }, + }, + settings: { + language: '언어', + general: '일반', + security: '보안', + about: '소개', + electrumServer: '일렉트럼(Electrum) 서버', + advancedOptions: '고급 옵션', + changePin: '핀(PIN) 변경', + fingerprintLogin: '지문 로그인', + aboutUs: '회사 소개', + header: '설정', + notSupportedFingerPrint: '해당 기기는 지문 인식을 지원하지 않습니다.', + TouchID: '지문 인식 허용하기', + FaceID: 'FaceID 허용하기', + Biometrics: '생체 인증 허용하기', + }, + aboutUs: { + header: '회사 소개', + releaseNotes: '릴리스 노트', + runSelfTest: '자체 테스트 실행', + buildWithAwesome: '멋진 빌드:', + rateVelesWallet: '골드월렛(VelesWallet) 평가하기', + goToOurGithub: '당사의 Github로 이동하기', + alwaysBackupYourKeys: '항상 키를 백업하십시오', + title: '골드월렛(VelesWallet)은 무료이며 오픈 소스인 비트코인 볼트(Cortez Vault) 지갑입니다. 허가받은 MIT.', + }, + electrumServer: { + header: '일렉트럼(Electrum) 서버', + title: '일렉트럼(Electrum) 서버 변경', + description: '어플리케이션을 연결할 서버의 주소를 변경할 수 있습니다. 기본 주소를 사용할 것을 권장합니다.', + save: '저장하기', + useDefault: '기본값 사용', + host: '호스트', + port: '포트', + successfullSave: '변경 사항이 저장되었습니다. 변경 사항을 적용하려면 재시작이 필요할 수 있습니다.', + connectionError: '제공된 일렉트럼(Electrum) 서버에 연결할 수 없습니다', + }, + advancedOptions: { + title: '고급 옵션 설정하기', + description: '고급 옵션 설정을 통해 다음의 지갑 종류를 선택할 수 있습니다: P2SH, HD P2SH, HD segwit', + }, + selectLanguage: { + header: '언어', + restartInfo: '새로운 언어를 선택할 때 변경 사항을 적용하려면 골드월렛(VelesWallet)을 다시 시작해야 할 수 있습니다', + confirmation: '확인', + confirm: '확인', + alertDescription: '언어를 선택하고 애플리케이션을 다시 시작하시겠습니까?', + cancel: '취소', + }, + contactList: { + cancel: '취소', + search: '검색하기', + screenTitle: '주소록', + noContacts: '연락처 없음', + noContactsDesc1: '표시할 연락처가 없습니다. \n클릭해서', + noContactsDesc2: '첫 번째 연락처를 추가합니다', + noResults: '다음에 관한 결과가 없습니다.', + }, + contactCreate: { + screenTitle: '새 연락처 추가하기', + subtitle: '새 연락처', + description: '새 연락처의 이름과\n주소를 입력하십시오.', + nameLabel: '이름', + addressLabel: '주소', + buttonLabel: '새 연락처 추가하기', + successTitle: '성공', + successDescription: '만세! 새 연락처 추가에\n성공했습니다.', + successButton: '주소록으로 돌아가기', + }, + contactDetails: { + nameLabel: '이름', + addressLabel: '주소', + editName: '이름 수정', + editAddress: '주소 수정', + sendCoinsButton: '코인 보내기', + showQRCodeButton: 'QR 코드 표시하기', + deleteButton: '연락처 삭제하기', + share: '공유', + }, + contactDelete: { + title: '귀하의 연락처를 삭제하십시오', + header: '연락처 삭제하기', + description1: '삭제하시겠습니까', + description2: '?\n추후 삭제를 취소할 수 없습니다.', + no: '아니요', + yes: '예', + success: '성공', + successDescription: '연락처 삭제에 성공했습니다.\n이제 주소록으로 돌아갈 수 있습니다.', + successButton: '주소록으로 돌아가기', + }, + scanQrCode: { + permissionTitle: '카메라 사용 허용', + permissionMessage: '귀하의 카메라 사용에 대한 허용이 필요합니다', + ok: '확인', + cancel: '취소', + }, + filterTransactions: { + header: '거래 분류', + receive: '입금', + send: '송금', + filter: '필터 설정', + to: '수취인', + toAmount: '최대 금액', + toDate: '종료일', + from: '송금인', + fromAmount: '최소 금액', + fromDate: '시작일', + clearFilters: '필터 지우기', + }, +}; diff --git a/loc/nb_NO.js b/loc/nb_NO.js deleted file mode 100644 index 8eee04842b..0000000000 --- a/loc/nb_NO.js +++ /dev/null @@ -1,244 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Lagringen din er kryptert. Passord er nødvendig for å dekryptere det', - enter_password: 'Oppgi passord', - bad_password: 'Feil passord, prøv igjen', - never: 'aldri', - continue: 'Fortsett', - ok: 'OK', - }, - wallets: { - select_wallet: 'Velg Lommebok', - options: 'innstillinger', - createBitcoinWallet: - 'Du har ingen Bitcoin-lommebok. For å finansiere en Lightning-lommebok, må en Bitcoin-lommebok være opprettet eller importert. Vil du fortsette uansett?', - list: { - app_name: 'BlueWallet', - title: 'lommebøker', - header: 'En lommebok representerer en hemmelighet (privat nøkkel) og en adresse ' + ' du kan dele for å motta kryptovaluta.', - add: 'Legg til lommebok', - create_a_wallet: 'Lag en lommebok', - create_a_wallet1: 'Det er gratis, og du kan lage', - create_a_wallet2: 'så mange du vil', - latest_transaction: 'siste transaksjonen', - empty_txs1: 'Dine transaksjoner vil vises her,', - empty_txs2: 'ingen for øyeblikket', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Trykk her for å kjøpe Bitcoin', - }, - reorder: { - title: 'Omorganisere lommebøker', - }, - add: { - title: 'legg til lommebok', - description: - 'Du kan enten skanne en backup papirlommebok (i WIF - Wallet Import Format), eller opprett en ny lommebok. Segwit lommebøker støttes som standard.', - scan: 'Skann', - create: 'Lag', - label_new_segwit: 'Ny SegWit', - label_new_lightning: 'Ny Lightning', - wallet_name: 'navn', - wallet_type: 'type', - or: 'eller', - import_wallet: 'Importer lommeboken', - imported: 'Importert', - coming_soon: 'Kommer snart', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Lommebok', - address: 'Adresse', - type: 'Type', - label: 'Merkelapp', - destination: 'mål', - description: 'beskrivelse', - are_you_sure: 'Er du sikker?', - yes_delete: 'Ja, slett', - no_cancel: 'Nei, avbryt', - delete: 'Slett', - save: 'Lagre', - delete_this_wallet: 'Slett denne lommeboken', - export_backup: 'Eksporter / backup', - buy_bitcoin: 'Kjøp Bitcoin', - show_xpub: 'Vis lommebok XPUB', - }, - export: { - title: 'lommebok eksport', - }, - xpub: { - title: 'lommebok XPUB', - copiedToClipboard: 'Kopiert til utklippstavlen.', - }, - import: { - title: 'importer', - explanation: - 'Skriv her din mnemonic, private nøkkel, WIF, eller hva som helst annet. BlueWallet vil gjøre sitt beste for å gjette riktig format og importere lommeboken din', - imported: 'importert', - error: 'Kunne ikke importere. Vennligst vær sikker på at de oppgitte dataene er gyldige.', - success: 'Suksess', - do_import: 'Importer', - scan_qr: 'eller skann QR-kode i stedet?', - }, - scanQrWif: { - go_back: 'Gå tilbake', - cancel: 'Avbryt', - decoding: 'Dekoder', - input_password: 'Input passord', - password_explain: 'Dette er BIP38 kryptert privat nøkkel', - bad_password: 'Feil passord', - wallet_already_exists: 'En slik lommebok eksisterer allerede', - bad_wif: 'Dårlig WIF', - imported_wif: 'Importert WIF', - with_address: ' med adresse', - imported_segwit: 'Importert SegWit', - imported_legacy: 'Importert Legacy', - imported_watchonly: 'Importert Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transaksjoner', - title: 'transaksjoner', - description: 'En liste over inngående eller utgående transaksjoner fra lommebokene dine', - conf: 'conf', - }, - details: { - title: 'Transaksjon', - from: 'Input', - to: 'Produksjon', - copy: 'Kopiere', - transaction_details: 'Transaksjonsdetaljer', - show_in_block_explorer: 'Vis i blokkutforsker', - }, - }, - send: { - header: 'Sende', - details: { - title: 'opprett transaksjon', - amount_field_is_not_valid: 'Beløp feltet er ikke gyldig', - fee_field_is_not_valid: 'Avgiftsfeltet er ikke gyldig', - address_field_is_not_valid: 'Adressefeltet er ikke gyldig', - total_exceeds_balance: 'Sendingsbeløpet overstiger den tilgjengelige saldoen.', - create_tx_error: 'Det oppsto en feil under opprettelse av transaksjonen. Vennligst vær sikker på at adressen er gyldig.', - address: 'adresse', - amount_placeholder: 'mengde å sende (i BTC)', - fee_placeholder: 'pluss transaksjonsgebyr (i BTC)', - note_placeholder: 'notat til meg selv', - cancel: 'Avbryt', - scan: 'Skanne', - send: 'Sende', - create: 'Lag', - remaining_balance: 'Gjenværende balanse', - }, - confirm: { - header: 'Bekrefte', - sendNow: 'Send nå', - }, - success: { - done: 'Ferdig', - }, - create: { - details: 'Detaljer', - title: 'opprett transaksjon', - error: 'Feil ved å opprette transaksjon. Ugyldig adresse eller send beløp?', - go_back: 'Gå tilbake', - this_is_hex: 'Dette er transaksjonsheks, signert og klar til å sendes til nettverket.', - to: 'Til', - amount: 'Beløp', - fee: 'Avgift', - tx_size: 'TX-størrelse', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Kringkaste', - not_enough_fee: 'Ikke nok avgift. Øk avgiften', - }, - }, - receive: { - header: 'Motta', - details: { - title: 'Del denne adressen med betaleren', - share: 'dele', - copiedToClipboard: 'Kopiert til utklippstavlen.', - label: 'Beskrivelse', - create: 'Lag', - setAmount: 'Motta med beløp', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Kjøp Bitcoin', - tap_your_address: 'Trykk på adressen din for å kopiere den til utklippstavlen:', - copied: 'Kopiert til utklippstavlen!', - }, - settings: { - header: 'innstillinger', - plausible_deniability: 'Troverdig denibilitet ...', - storage_not_encrypted: 'Lagring: ikke kryptert', - storage_encrypted: 'Lagring: kryptert', - password: 'Passord', - password_explain: 'Opprett passordet du vil bruke til å dekryptere lagringen', - retype_password: 'Skriv inn passordet på nytt', - passwords_do_not_match: 'passordene er ikke like', - encrypt_storage: 'Krypter lagring', - lightning_settings: 'Lightning innstillinger', - lightning_settings_explain: - 'For å koble til din egen LND-node, vennligst installer LndHub' + - ' og legg URLen her i innstillinger. La feltet være tomt for å bruke BlueWallets LNDHub (lndhub.io). Lommebøker opprettet etter lagring av endringer, vil koble til den angitte LNDHub.', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Lagre', - about: 'Om', - language: 'Språk', - currency: 'Valuta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Troverdighet benektelse', - help: - 'Under visse omstendigheter kan du bli tvunget til å avsløre en' + - 'passord. For å holde mynten din trygg, kan BlueWallet opprette en annen' + - 'kryptert lagring, med et annet passord. Under press,' + - 'Du kan oppgi dette passordet til en tredjepart. Hvis inntastet i' + - 'BlueWallet, det vil låse opp ny "falsk" lagring. Dette vil virke' + - 'troverdig overfor en tredje part, men vil i hemmelighet beholde ' + - 'hovedlageret trygt.', - help2: 'Ny lagring vil være fullt funksjonell, og du kan lagre en mindre sum der' + ' , slik at det ser mer troverdig ut.', - create_fake_storage: 'Lag falsk kryptert lagring', - go_back: 'Gå tilbake', - create_password: 'Lag et passord', - create_password_explanation: 'Passord for falsk lagring må ikke matche passord for hovedlager', - password_should_not_match: 'Passord for falsk lagring må ikke matche passord for hovedlager', - retype_password: 'Skriv inn passordet på nytt', - passwords_do_not_match: 'Passordene stemmer ikke overens, prøv igjen', - success: 'Vellykket', - }, - lnd: { - title: 'administrere midler', - choose_source_wallet: 'Velg en kilde lommebok', - refill_lnd_balance: 'Refill Lightning lommebokbalanse', - refill: 'Fylle på', - withdraw: 'Ta ut', - expired: 'Utløpt', - placeholder: 'Faktura', - sameWalletAsInvoiceError: 'Du kan ikke betale en faktura med samme lommebok som brukes til å lage den.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/nl_NL.js b/loc/nl_NL.js deleted file mode 100644 index fdf83afef7..0000000000 --- a/loc/nl_NL.js +++ /dev/null @@ -1,247 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Uw opslag is versleuteld. Wachtwoord is vereist om het te ontcijferen', - enter_password: 'Voer wachtwoord in', - bad_password: 'Verkeerd wachtwoord, probeer opnieuw', - never: 'nooit', - continue: 'Continue', - ok: 'OK', - }, - wallets: { - select_wallet: 'Selecteer portemonnee', - options: 'opties', - createBitcoinWallet: - 'Om een Lightning-portemonnee te kunnen gebruiken, is een Bitcoin-portemonnee nodig om deze te financieren. Wil je toch doorgaan?', - list: { - app_name: 'BlueWallet', - title: 'portemonnees', - header: 'Een portemonnee vertegenwoordigt een geheime (privésleutel) en een adres' + 'dat u kunt delen om munten te ontvangen.', - add: 'Portemonnee toevoegen', - create_a_wallet: 'Portemonnee aanmaken', - create_a_wallet1: 'Het is gratis en u kunt er', - create_a_wallet2: 'zoveel maken als u wilt', - latest_transaction: 'laatste transactie', - empty_txs1: 'Uw transacties verschijnen hier,', - empty_txs2: 'geen transacties op dit moment', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Klik hier om Bitcoin te kopen', - }, - reorder: { - title: 'Portemonnees opnieuw ordenen', - }, - add: { - title: 'portemonnee toevoegen', - description: - 'U kunt een back-up papieren portemonnee scannen (in WIF - Wallet Import Format) of een nieuwe portemonnee maken. Segwit-wallets worden standaard ondersteund.', - scan: 'Scan', - create: 'Aanmaken', - label_new_segwit: 'Nieuwe SegWit', - label_new_lightning: 'Nieuwe Lightning', - wallet_name: 'portemonnee naam', - wallet_type: 'type', - or: 'of', - import_wallet: 'Portemonnee importeren', - imported: 'Geïmporteerd', - coming_soon: 'Komt binnenkort', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Portemonnee', - address: 'Adres', - type: 'Type', - label: 'Label', - destination: 'bestemming', - description: 'beschrijving', - are_you_sure: 'Weet u het zeker?', - yes_delete: 'Ja, verwijderen', - no_cancel: 'Nee, annuleren', - delete: 'Verwijderen', - save: 'Opslaan', - delete_this_wallet: 'Verwijder deze portemonnee', - export_backup: 'Exporteren / back-up maken', - buy_bitcoin: 'Koop Bitcoin', - show_xpub: 'Toon portemonnee XPUB', - }, - export: { - title: 'portemonnee exporteren', - }, - xpub: { - title: 'portemonnee XPUB', - copiedToClipboard: 'Gekopieerd naar het klembord.', - }, - import: { - title: 'importeren', - explanation: - 'Schrijf hier uw ezelsbruggetje, privésleutel, WIF, of een ander formaat. BlueWallet zal zijn best doen om het juiste formaat te raden en uw portemonnee te importeren', - imported: 'Geïmporteerd', - error: 'Importeren mislukt. Zorg ervoor dat de verstrekte gegevens geldig zijn.', - success: 'Succes', - do_import: 'Importeren', - scan_qr: 'of QR-code scannen?', - }, - scanQrWif: { - go_back: 'Ga terug', - cancel: 'Annuleren', - decoding: 'Decoderen', - input_password: 'Voer wachtwoord in', - password_explain: 'Dit is een BIP38-gecodeerde privésleutel', - bad_password: 'Verkeerd wachtwoord', - wallet_already_exists: "Zo'n portemonnee bestaat al", - bad_wif: 'Verkeerde WIF', - imported_wif: 'WIF geïmporteerd ', - with_address: ' met adres ', - imported_segwit: 'SegWit geïmporteerd', - imported_legacy: 'Legacy geïmporteerd', - imported_watchonly: 'Watch-only geïmporteerd', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transacties', - title: 'transacties', - description: 'Een lijst met ingaande of uitgaande transacties van uw portemonnee', - conf: 'conf', - }, - details: { - title: 'Transacties', - from: 'Invoer', - to: 'Uitgang', - copy: 'Kopiëren', - transaction_details: 'Transactie details', - show_in_block_explorer: 'Weergeven in blokverkenner', - }, - }, - send: { - header: 'Verstuur', - details: { - title: 'transacties aanmaken', - amount_field_is_not_valid: 'Bedrag veld is niet geldig', - fee_field_is_not_valid: 'Tarief is niet geldig', - address_field_is_not_valid: 'Adresveld is niet geldig', - total_exceeds_balance: 'Het verzendingsbedrag overschrijdt het beschikbare saldo.', - create_tx_error: 'Er is een fout opgetreden bij het maken van de transactie. Zorg ervoor dat het adres geldig is.', - address: 'adres', - amount_placeholder: 'te verzenden bedrag (in BTC)', - fee_placeholder: 'plus transactie vergoeding (in BTC)', - note_placeholder: 'notitie voor mezelf', - cancel: 'Annuleren', - scan: 'Scannen', - send: 'Verzenden', - create: 'Aanmaken', - remaining_balance: 'Resterende saldo', - }, - confirm: { - header: 'Bevestig', - sendNow: 'Nu verzenden', - }, - success: { - done: 'Klaar', - }, - create: { - details: 'Details', - title: 'transactie aanmaken', - error: 'Fout bij het maken van transactie. Ongeldig adres of bedrag?', - go_back: 'Ga terug', - this_is_hex: 'Dit is de transactie-hex, ondertekend en klaar om op het netwerk te worden uitgezonden.', - to: 'Naar', - amount: 'Bedrag', - fee: 'Vergoeding', - tx_size: 'TX grootte', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Uitzenden', - not_enough_fee: 'Niet genoeg vergoeding. Verhoog de vergoeding', - }, - }, - receive: { - header: 'Ontvang', - details: { - title: 'Deel dit adres met betaler', - share: 'delen', - copiedToClipboard: 'Gekopieerd naar het klembord.', - label: 'Omschrijving', - create: 'Create', - setAmount: 'Ontvang met bedrag', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Koop Bitcoin', - tap_your_address: 'Tik op uw adres om het naar het klembord te kopiëren:', - copied: 'Gekopieerd naar het klembord!', - }, - settings: { - header: 'instellingen', - plausible_deniability: 'Plausibele ontkenning...', - storage_not_encrypted: 'Opslag: niet versleuteld', - storage_encrypted: 'Opslag: versleuteld', - password: 'Wachtwoord', - password_explain: 'Maak een wachtwoord aan dat u wilt gebruiken om de opslag te versleutelen', - retype_password: 'Geef nogmaals het wachtwoord', - passwords_do_not_match: 'Wachtwoorden komen niet overeen', - encrypt_storage: 'Versleutel opslag', - lightning_settings: 'Lightning instellingen', - lightning_settings_explain: - 'Om verbinding te maken met uw eigen LND-knooppunt' + - ' installeert u LndHub en zet u de URL hier in de instellingen. ' + - 'Laat dit leeg om de standaard lndHub (lndhub.io) te gebruiken.', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Opslaan', - about: 'Over', - language: 'Taal', - currency: 'Valuta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Plausibele ontkenning', - help: - 'Onder bepaalde omstandigheden kunt u worden gedwongen om uw' + - ' wachtwoord te onthullen. Om uw munten veilig te houden, kan ' + - 'BlueWallet nog een versleutelde opslag aanmaken, met een ander ' + - 'wachtwoord. Onder druk kunt u dit wachtwoord bekendmaken aan ' + - 'de derde partij. Indien ingevoerd in BlueWallet, zal het nieuwe ' + - "nep'-opslagruimte worden ontgrendeld. Dit lijkt legitiem voor de " + - 'derde partij, maar zal uw hoofdopslag met munten niet bekend maken ' + - 'aan de derde partij', - help2: - 'De nieuwe opslag zal volledig functioneel zijn en u kunt er ' + 'een minimum aantal munten opslaan zodat het geloofwaardig lijkt.', - create_fake_storage: 'Nep versleutelde opslag aanmaken', - go_back: 'Ga terug', - create_password: 'Wachtwoord aanmaken', - create_password_explanation: 'Wachtwoord voor nep-opslag hoort niet overeen te komen met wachtwoord voor uw hoofdopslag', - password_should_not_match: 'Wachtwoord voor nep-opslag hoort niet overeen te komen met wachtwoord voor uw hoofdopslag', - retype_password: 'Herhaal wachtwoord', - passwords_do_not_match: 'Wachtwoorden komen niet overeen, probeer het opnieuw', - success: 'Succes', - }, - lnd: { - title: 'fondsen beheren', - choose_source_wallet: 'Kies een bron portemonnee', - refill_lnd_balance: 'Vul Lightning-portemonneesaldo bij', - refill: 'Bijvullen', - withdraw: 'Opvragen', - expired: 'Verlopen', - placeholder: 'Invoice', - sameWalletAsInvoiceError: 'U kunt geen factuur betalen met dezelfde portemonnee die is gebruikt om de factuur te maken.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/pt_BR.js b/loc/pt_BR.js deleted file mode 100644 index 428f01c63f..0000000000 --- a/loc/pt_BR.js +++ /dev/null @@ -1,250 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Os arquivos estão criptografados, uma senha é necessária', - enter_password: 'Inserir senha', - bad_password: 'Senha errada, tente outra vez', - never: 'nunca', - continue: 'Continue', - ok: 'OK', - }, - wallets: { - options: 'opções', - select_wallet: 'Escolher carteira', - createBitcoinWallet: 'Antes de criar a carteira Lightning é preciso criar uma carteira Bitcoin, tudo bem?', - - list: { - tabBarLabel: 'Carteiras', - app_name: 'BlueWallet', - title: 'carteiras', - header: 'Uma carteira representa um par composto de uma chave privada secreta e um endereço de depósito que você pode compartilhar.', - add: 'adicionar wallet', - create_a_wallet: 'Criar uma carteira', - create_a_wallet1: 'é grátis e você pode criar', - create_a_wallet2: 'quantas você quiser', - latest_transaction: 'última transação', - empty_txs1: 'Suas transações aparecerão aqui,', - empty_txs2: 'nenhuma no momento', - empty_txs1_lightning: - 'A carteira Lightning faz transações super rápidas (coisa de segundos) e tem taxas ridiculamente baratas,' + - ' ideal para transações diárias e de baixo valor.', - empty_txs2_lightning: '\nPara começar a usar clique em "administrar fundos" e recarregue o seu saldo.', - tap_here_to_buy: 'Toque aqui para comprar Bitcoin', - }, - reorder: { - title: 'Reordenar carteiras', - }, - add: { - title: 'criando carteira', - description: - 'Você pode ler o backup de uma carteira (em WIF - Wallet Import Format) ou criar uma nova. O padrão é criar uma carteira SegWit.', - scan: 'Ler backup', - create: 'Criar', - label_new_segwit: 'Nova carteira SegWit', - label_new_lightning: 'Nova carteira Lightning', - wallet_name: 'nome', - wallet_type: 'tipo', - or: 'ou', - import_wallet: 'Importar carteira', - imported: 'Importado', - coming_soon: 'Em breve', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Carteira', - address: 'Endereço', - type: 'Tipo', - destination: 'destino', - description: 'descrição', - label: 'Nome', - are_you_sure: 'Tem certeza?', - yes_delete: 'Sim, apagar', - no_cancel: 'Não, cancelar', - delete_this_wallet: 'Apagar esta carteira', - export_backup: 'Exportar / backup', - buy_bitcoin: 'Comprar Bitcoin', - show_xpub: 'Ver XPUB', - delete: 'Apagar', - save: 'Salvar', - }, - export: { - title: 'Exportar carteira', - }, - xpub: { - title: 'XPUB', - copiedToClipboard: 'Copiado para a área de transferência', - }, - import: { - title: 'importar', - explanation: - 'Escreva aqui sua frase mnemônica, chave privada, WIF, ou o que você tiver. Faremos nosso melhor para adivinhar o formato e importat sua carteira', - imported: 'Importada', - error: 'Erro. Por favor, confira se o formato que você passou é válido.', - success: 'Sucesso', - do_import: 'Importar', - scan_qr: 'ou ler um código QR?', - }, - scanQrWif: { - go_back: 'Voltar', - cancel: 'Cancelar', - decoding: 'Decodificar', - input_password: 'Inserir senha', - password_explain: 'Isto é um chave privada criptografada BIP38', - bad_password: 'Senha errada', - wallet_already_exists: 'Esta carteira já existe', - bad_wif: 'WIF errado', - imported_wif: 'WIF importado ', - with_address: ' com endereço ', - imported_segwit: 'Carteira SegWit importada', - imported_legacy: 'Carteira antiga importada', - imported_watchonly: 'Carteira somente-leitura importada', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transações', - title: 'Transações', - description: 'Uma lista de transações feitas ou recebidas nas suas carteiras', - conf: 'conf', - }, - details: { - title: 'Transação', - from: 'De', - to: 'Para', - copy: 'Copiar', - transaction_details: 'Detalhes', - show_in_block_explorer: 'Mostrar num navegador', - }, - }, - send: { - header: 'Enviar', - confirm: { - header: 'Confirmar', - sendNow: 'Enviar agora', - }, - success: { - done: 'Enviado', - }, - details: { - title: 'Criar Transacção', - amount_field_is_not_valid: 'Campo de quantia não é válido', - fee_field_is_not_valid: 'Campo de taxa não é válido', - address_field_is_not_valid: 'Campo de endereço não é válido', - receiver_placeholder: 'endereço de envio aqui', - amount_placeholder: 'quantia a enviar (em BTC)', - fee_placeholder: 'mais a taxa de transacção (em BTC)', - create_tx_error: 'Erro na criação da transação, por favor confira se o endereço é válido.', - note_placeholder: 'Nota pessoal', - cancel: 'Cancelar', - scan: 'Scanear', - create: 'Criar', - address: 'Endereço', - total_exceeds_balance: 'Valor total excede o saldo disponível', - send: 'Send', - remaining_balance: 'Saldo restante', - }, - create: { - title: 'Criar Transacção', - details: 'Detalhes', - error: 'Erro ao criar transação. Endereço ou valor inválidos?', - go_back: 'Voltar', - this_is_hex: 'Este é o hex da transação, assinado e pronto para ser divulgado para o mundo. Continuar?', - to: 'Para', - amount: 'Valor', - fee: 'Taxa', - tx_size: 'Tamanho', - satoshi_per_byte: 'satoshis por byte', - memo: 'Nota', - broadcast: 'Divulgar', - not_enough_fee: 'Taxa muito baixa. Aumente a taxa', - }, - }, - receive: { - header: 'Receber', - details: { - title: 'Envie este endereço para o pagador', - share: 'Compartilhar', - copiedToClipboard: 'Copiado para a área de trabalho', - label: 'Descrição', - create: 'Create', - setAmount: 'Valor a receber', - }, - scan_lnurl: 'Receber lendo QR', - }, - buyBitcoin: { - header: 'Comprar Bitcoin', - tap_your_address: 'Toque seu endereço para copiá-lo para a área de transferência:', - copied: 'Copiado!', - }, - settings: { - tabBarLabel: 'preferências', - header: 'definições', - plausible_deniability: 'Negação plausível...', - storage_not_encrypted: 'Arquivos: não criptografados', - storage_encrypted: 'Arquivos: criptografados', - password: 'Senha', - password_explain: 'Definir a senha para descriptografar os arquivos', - retype_password: 'Inserir senha novamente', - passwords_do_not_match: 'Senhas não coincidem', - encrypt_storage: 'Criptografar', - lightning_settings: 'Preferências Lightning', - lightning_settings_explain: - 'Para se conectar ao seu próprio ponto LND, você precisa instalar a aplicação LndHub' + - ' e copiar sua URL para cá. Deixe em branco para usar a LndHub padrão fornecida pela BlueWallet (lndhub.io).' + - ' Carteiras criadas após mudanças nestas preferências ficarão ligadas à instância LndHub que estiver especificada.', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Salvar', - about: 'Sobre', - language: 'Idioma', - currency: 'Moeda', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Negação plausível', - help: - 'Em algumas circunstâncias, você pode ser forçado a revelar uma ' + - 'senha. Para manter seus bitcoins seguros, A BlueWallet pode criar ' + - 'uma senha alternativa. Sob pressão, você pode revelar essa senha ao ' + - 'invés da senha principal. Quando inserida na BlueWallet, esta abrirá ' + - 'uma interface falsa, que parecerá legítima a um terceiro, enquanto ' + - 'suas carteiras originais continuarão à salvo em segredo.', - help2: - 'Essa nova interface é completamente funcional e você pode inclusive ' + 'manter nele um valor minímo para que pareça mais real.', - create_fake_storage: 'Criar armazenamento criptografada falsa', - go_back: 'Voltar', - create_password: 'Criar senha', - create_password_explanation: 'A senha para a interface falsa não deve coincidir com a principal', - password_should_not_match: 'A senha para a interface falsa não deve coincidir com a principal', - retype_password: 'Inserir senha novamente', - passwords_do_not_match: 'Senhas não coincidem, tente novamente', - success: 'Sucesso', - }, - lnd: { - title: 'administrar fundos', - choose_source_wallet: 'Escolha a carteira de origem', - refill_lnd_balance: 'Recarregar a carteira Lightning', - refill: 'Recarregar', - placeholder: 'Invoice', - withdraw: 'Sacar', - expired: 'Vencido', - sameWalletAsInvoiceError: 'Você não pode pagar uma fatura com a mesma carteira que a criou.', - }, - pleasebackup: { - title: 'Sua carteira foi criada...', - text: - 'Por favor anote num pedaço de papel essa seqüência de palavras, elas serão o seu backup e você as pode usar para' + - ' recuperar a sua carteira em outros dispositivos.', - ok: 'Certo, já anotei!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/pt_PT.js b/loc/pt_PT.js index 6784539b5e..180f27e793 100644 --- a/loc/pt_PT.js +++ b/loc/pt_PT.js @@ -1,248 +1,351 @@ module.exports = { _: { - storage_is_encrypted: 'O armazenamento está encriptado. Uma password é necessária para desencriptar', - enter_password: 'Inserir password', - bad_password: 'pasword errada, tente novamente', + languageCode: 'pt', + storage_is_encrypted: 'O seu armazenamento está encriptado. A palavra-passe é necessária para desencriptá-lo', + enter_password: 'Introduzir palavra-passe', + bad_password: 'Palavra-passe incorrecta, tente novamente', never: 'nunca', continue: 'Continuar', ok: 'OK', + click: 'Clique', + here: 'Aqui', + save: 'Guardar', + confirm: 'Confirmar', + copy: 'Copiar', + copied: 'Copiado!', + }, + tabNavigator: { + dashboard: 'Menu Principal', + settings: 'Definições', + addressBook: 'Lista de endereços', + }, + message: { + somethingWentWrong: 'Alguma coisa correu mal', + somethingWentWrongWhileCreatingWallet: + 'Alguma coisa correu mal enquanto criava a sua carteira. Volte ao Painel e tente novamente.', + success: 'Sucesso', + successfullWalletImport: 'A importação da sua carteira foi realizada com sucesso. Pode voltar ao Painel.', + successfullWalletDelete: 'A sua carteira foi excluída com sucesso. Pode voltar ao Painel.', + returnToDashboard: 'Voltar ao Painel', + creatingWallet: 'Criação da sua carteira', + creatingWalletDescription: + 'Estamos a criar a sua carteira. Este procedimento pode demorar um pouco. Agradecemos a sua compreensão.', + }, + onboarding: { + onboarding: 'Definir credenciais', + pin: 'PIN', + createPin: 'Definir PIN', + createNewPin: 'Novo PIN', + createPassword: 'Criar palavra-passe de transacção', + createPinDescription: + 'O seu PIN será utilizado para iniciar sessão na aplicação. Poderá alterá-lo posteriormente no menu Definições.', + confirmPin: 'Confirmar PIN', + confirmNewPin: 'Confirmar novo PIN', + confirmPassword: 'Confirmar palavra-passe de transacção', + passwordDoesNotMatch: 'As palavras-passe não correspondem. Por favor, introduza uma palavra-passe válida.', + createPasswordDescription: + 'A palavra-passe de transacção será utilizada para verificar todas as suas transacções. Informamos de que esta palavra-passe não pode ser alterada. A palavra-passe de transacção deve conter pelo menos 8 caracteres alfanuméricos.', + changePin: 'Alterar PIN', + currentPin: 'PIN actual', + pinDoesNotMatch: 'O PIN introduzido não corresponde. Por favor, introduza um PIN válido', + successDescription: 'Parabéns! \nDefiniu com sucesso o seu código PIN.', + successDescriptionChangedPin: 'Parabéns! \nAlterou com sucesso o seu código PIN.', + successButton: 'Ir ao Menu Principal', + successButtonChangedPin: 'Voltar ao menu Definições', + }, + unlock: { + title: 'Desbloquear', + touchID: 'Touch ID para "Veles Wallet"', + confirmButton: 'Introduza a sua impressão digital para continuar.', + enter: 'Introduza o PIN', + }, + unlockTransaction: { + headerText: 'Confirmar transacção', + title: 'Confirmar palavra-passe de transacção', + description: 'Confirme a palavra-passe de transacção para proceder com a transacção', }, wallets: { - options: 'opções', - select_wallet: 'Seleccione uma Wallet', - createBitcoinWallet: 'Para poder usar uma wallet Lightning, é necessária uma wallet Bitcoin para a financiar. Deseja continuar?', - - list: { - app_name: 'BlueWallet', - title: 'wallets', - header: 'Uma wallet representa um par entre um segredo (chave privada) e um endereço' + 'que pode partilhar para receber Bitcoin.', - add: 'adicionar wallet', - create_a_wallet: 'Adicionar uma wallet', - create_a_wallet1: 'É gratuito e pode', - create_a_wallet2: 'adicionar quantas quiser', - latest_transaction: 'últimas transacções', - empty_txs1: 'As suas transacções aparecerão aqui,', - empty_txs2: 'nenhuma de momento', - empty_txs1_lightning: - 'A wallet Lightning deve ser usada para as suas transações diárias. As taxas são muito baixas e a velocidade muito elevada', - empty_txs2_lightning: '\nPara começar a usar toque em "gerir fundos" e recarregue o seu saldo.', - tap_here_to_buy: 'Toque aqui para comprar Bitcoin', + dashboard: { + title: 'Carteiras', + allWallets: 'Todas as Wallets', + noWallets: 'Sem carteiras', + noWalletsDesc1: 'Nenhuma carteira para apresentar.', + noWalletsDesc2: 'adicionar a sua primeira carteira.', + send: 'Enviar moedas', + receive: 'Receber moedas', + noTransactions: 'Nenhuma transacção para apresentar.', }, - reorder: { - title: 'Reordenar Wallets', + walletModal: { btcv: 'VLS', wallets: 'Carteiras' }, + importWallet: { + title: 'Importar a sua carteira', + header: 'Importar carteira', + subtitle: + 'Anote aqui a sua mnemónica, chave privada, WIF ou o que tiver. VelesWallet fará o melhor para descobrir o formato correto e importar a sua carteira', + placeholder: 'Mnemónica, chave privada, WIF', + import: 'Importar', + scanQrCode: 'ou analisar o código de QR', + walletInUseValidationError: 'Essa carteira já está a ser usada. Introduza uma carteira válida.', }, + exportWallet: { title: 'Frase da mnemónica', header: 'Exportar carteira' }, + exportWalletXpub: { header: 'Carteira XPUB' }, + deleteWallet: { + title: 'Excluir a sua carteira', + header: 'Excluir carteira', + description1: 'Tem certeza de que deseja excluir', + description2: '? Não pode anular esta acção.', + no: 'Não', + yes: 'Sim', + }, + wallet: { none: 'Nenhum', latest: 'Transacção mais recente' }, add: { - title: 'adicionar wallet', + title: 'Adicionar nova carteira', + subtitle: 'Nome da sua carteira', + description: 'Introduza um nome para a sua nova carteira.', + inputLabel: 'Nome', + addWalletButton: 'Adicionar nova carteira', + importWalletButton: 'Importar carteira', + advancedOptions: 'Opções avançadas', + multipleAddresses: 'Múltiplos endereços', + singleAddress: 'Um endereço', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: + 'Contém uma árvore de endereços de segmento nativos, gerados a partir de uma única semente de 24 palavras', + }, + addSuccess: { + title: 'Adicionar nova carteira', + subtitle: 'Sucesso', description: - 'Pode fazer um scan de um backup de uma wallet em papel (em WIF - Wallet Import Format), ou criar uma nova wallet. Segwit suportado por defeito.', - scan: 'Scan', - create: 'Adicionar', - label_new_segwit: 'Novo SegWit', - label_new_lightning: 'Novo Lightning', - wallet_name: 'nome', - wallet_type: 'tipo', - or: 'ou', - import_wallet: 'Importar wallet', - imported: 'Importada', - coming_soon: 'Brevemente', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'A sua carteira foi criada. Tire um momento para anotar esta frase da mnemónica num papel. É a sua cópia de segurança. Pode usá-la para repor a carteira noutros dispositivos.', + okButton: 'OK, anotei-a!', }, details: { - title: 'wallet', - address: 'Endereço', - type: 'Tipo', - delete: 'Eliminar', - save: 'Guardar', - label: 'Nome', - destination: 'destino', - description: 'descrição', - are_you_sure: 'Tem a certeza?', - yes_delete: 'Sim, eliminar', - no_cancel: 'Não, cancelar', - delete_this_wallet: 'Apagar esta wallet', - export_backup: 'Exportar / backup', - buy_bitcoin: 'Comprar Bitcoin', - show_xpub: 'Mostar XPUB da wallet', - }, - export: { - title: 'Exportar Wallet', - }, - xpub: { - title: 'XPUB da wallet', - copiedToClipboard: 'copiado para o clipboard', + edit: 'Editar', + latestTransaction: 'Transacção mais recente', + typeLabel: 'Tipo', + nameLabel: 'Nome', + exportWallet: 'Exportar carteira', + showWalletXPUB: 'Apresentar carteira XPUB', + deleteWallet: 'Excluir carteira', + nameEdit: 'Editar nome', }, + export: { title: 'exportar carteira' }, import: { - title: 'importar', + title: 'Importar', explanation: - 'Escreva a sua frase mnemónica, chave privada, WIF, ou qualquer informação que disponha. Vamos tentar interpretar o formato e importar a sua wallet', + 'Anote aqui a sua mnemónica, chave privada, WIF ou o que tiver. VelesWallet fará o melhor para descobrir o formato correto e importar a sua carteira', imported: 'Importada', - error: 'Falhou. É um dado válido?', + error: 'Falha na importação. Garanta que os dados fornecidos são válidos.', success: 'Sucesso', do_import: 'Importar', - scan_qr: 'ou scan o QR code?', + scan_qr: 'ou analisar o código de QR?', }, scanQrWif: { go_back: 'Voltar', cancel: 'Cancelar', - decoding: 'Descodificar', - input_password: 'Inserir password', - password_explain: 'Isto é uma chave privada encriptada BIP38', - bad_password: 'Password errada', - wallet_already_exists: 'Esta wallet já existe', - bad_wif: 'WIF errado', - imported_wif: 'WIF transferido ', - with_address: ' com endereço ', - imported_segwit: 'SegWit transferido', - imported_legacy: 'Legacy transferido', - imported_watchonly: 'Watch-only importada', + decoding: 'Descodificação', + input_password: 'Introduzir palavra-passe', + password_explain: 'Esta é a chave privada encriptada BIP38', + bad_password: 'Palavra-passe incorrecta', + wallet_already_exists: 'Essa carteira já existe', + bad_wif: 'WIF errada', + imported_wif: 'WIF importada', + with_address: 'com endereço', + imported_segwit: 'SegWit importado', + imported_legacy: 'Legacy importado', + imported_watchonly: 'Ver apenas importado', }, }, transactions: { - list: { - tabBarLabel: 'Transacções', - title: 'transacções', - description: 'Uma lista de transacções feitas ou recebidas nas suas wallets', - conf: 'conf', - }, + list: { conf: 'Confirmações' }, details: { - title: 'detalhes', + title: 'Transacção', + detailTitle: 'Detalhes da transacção', + transactionHex: 'Transacção hexagonal', + transactionHexDescription: 'Esta é uma transacção hexagonal, assinada e preparada para transmitir à rede', + copyAndBoriadcast: 'Copiar e transmitir mais tarde', + verify: 'Verificar em coinb.in', + amount: 'Montante', + fee: 'Taxa', + txSize: 'Tamanho de TX', + satoshiPerByte: 'Satoshi por byte', from: 'De', to: 'Para', + bytes: 'bytes', copy: 'Copiar', - transaction_details: 'Detalhes da transacção', - show_in_block_explorer: 'Mostrar no block explorer', + noLabel: 'Sem etiqueta', + details: 'Detalhes', + transactionId: 'ID da Transação', + confirmations: 'confirmações', + transactionDetails: 'Detalhes da transação', + viewInBlockRxplorer: 'Ver no explorador de blocos', + addNote: 'Adicionar nota', + note: 'Nota', + inputs: 'Entradas', + ouputs: 'Saídas', + sendCoins: 'Enviar moedas', }, }, send: { - header: 'Enviar', - confirm: { - header: 'Confirmar', - sendNow: 'Enviar agora', - }, + header: 'Enviar moedas', success: { - done: 'Done', + title: 'Sucesso', + description: 'Parabéns! Terminou a transacção com sucesso.', + done: 'Pronto', + return: 'Voltar ao Painel', }, details: { - title: 'Criar Transacção', - amount_field_is_not_valid: 'Campo de quantia não é válido', - fee_field_is_not_valid: 'Campo de taxa não é válido', - address_field_is_not_valid: 'Campo de endereço não é válido', - receiver_placeholder: 'endereço de envio aqui', - amount_placeholder: 'quantia a enviar (em BTC)', - fee_placeholder: 'mais a taxa de transacção (em BTC)', - create_tx_error: 'Houve um erro na criação da transacção. Por favor verifique que o endereço é válido.', - note_placeholder: 'Nota pessoal', - total_exceeds_balance: 'O valor total excede o saldo disponível.', + title: 'criar transacção', + amount_field_is_not_valid: 'O campo do montante não é válido', + fee_field_is_not_valid: 'O campo da taxa não é válido', + address_field_is_not_valid: 'O campo do endereço não é válido', + create_tx_error: 'Houve um erro na criação da transacção. Garanta que o endereço é válido.', + address: 'endereço', + amount_placeholder: 'montante a enviar (em VLS)', + fee_placeholder: 'mais taxa da transacção (em VLS)', + note_placeholder: 'nota para si mesmo', cancel: 'Cancelar', - scan: 'Scan', - create: 'Criar', - address: 'Endereço', + scan: 'Analisar', send: 'Enviar', - remaining_balance: 'Saldo restante', + next: 'Seguinte', + note: 'Nota (opcional)', + to: 'para', + feeUnit: 'Sat/B', + fee: 'Taxa:', + create: 'Criar fatura', + remaining_balance: 'Saldo remanescente', + total_exceeds_balance: 'O montante a enviar excede o saldo disponível.', }, + confirm: { sendNow: 'Enviar agora' }, create: { - title: 'Criar Transacção', - details: 'Detalhes', - error: 'Erro ao criar transacção. Endereço inválido ou quantia?', - go_back: 'Voltar', - this_is_hex: 'Este é o hex da transacção, assinado e pronto para ser difundido para a network. Continuar?', - to: 'Para', - amount: 'Quantia', + amount: 'Montante', fee: 'Taxa', - tx_size: 'Tamanho TX', - satoshi_per_byte: 'satoshiPerByte', - memo: 'Nota pessoal', - broadcast: 'Difundir', - not_enough_fee: 'Taxa demasiado baixo. Aumente a taxa.', + setTransactionFee: 'Configurar uma taxa de transacção', + headerText: + 'Quando existe um grande número de transacções pendentes na rede (>1500), a taxa mais alta irá resultar no processamento mais rápido da sua transacção. Os valores normais são 1-500 sat/b', }, }, - buyBitcoin: { - header: 'Comprar Bitcoin', - tap_your_address: 'Toque no seu endereço para o copiar para o clipboard:', - copied: 'Copied to Clipboard!', - }, receive: { - header: 'receber', + header: 'Receber moedas', details: { - title: 'Partilhar este endereço com o pagador', - share: 'partilhar', - copiedToClipboard: 'copiado para clipboard', - label: 'Descrição', - create: 'Criar', - setAmount: 'Quantia a receber', + amount: 'Montante', + share: 'Partilhar', + receiveWithAmount: 'Receber com o montante', }, - scan_lnurl: 'Receber lendo QR', }, settings: { - tabBarLabel: 'Definições', - header: 'definições', - plausible_deniability: 'Negação plausível...', - storage_not_encrypted: 'Armazenamento: não encriptado', - storage_encrypted: 'Armazenamento: encriptado', - password: 'Password', - password_explain: 'Definir a password para desencriptar o armazenamento', - retype_password: 'Inserir password novamente', - passwords_do_not_match: 'Passwords não coincidem', - encrypt_storage: 'Encriptar', - lightning_settings: 'Definições do Lightning', - lightning_settings_explain: - 'Para se ligar ao seu próprio node LND, por favor instale o LndHub ' + - 'e coloque o seu endereço aqui nas definições. ' + - 'Deixe em branco para usar o LNDHub da BlueWallet (lndhub.io). ' + - 'Wallets criadas depois desta alteração ligar-se-ão ao LNDHub especificado.', - electrum_settings: 'Definições do Electrum', - electrum_settings_explain: 'Deixe em branco para usar o valor por omissão', - save: 'Guardar', - about: 'Sobre', language: 'Idioma', - currency: 'Moeda', - advanced_options: 'Opções Avançadas', - enable_advanced_mode: 'Ligar modo avançado', - }, - plausibledeniability: { - title: 'Negação plausível', - help: - 'Em algumas circunstâncias, pode ser forçado a relevar uma ' + - 'password. Para manter as suas moedas seguras, A BlueWallet pode criar outro ' + - 'armazenamento encriptado, com uma password diferente. Sobre pressão, ' + - 'pode revelar esta password a um terceiro. Se inserida na ' + - 'BlueWallet, esta vai abrir um armazenamento "falso". Que vai parecer ' + - 'legítimo a um terceiro, mas que secretamente vai manter o seu armazenamento principal ' + - 'com as moedas em segurança.', - help2: 'Este novo armazenamento é completamente funcional, e pode guardar ' + 'um valor minímo para parecer mais real.', - create_fake_storage: 'Criar armazenamento encriptado FALSO', - go_back: 'Voltar', - create_password: 'Criar password', - create_password_explanation: 'Password para armazenamento FALSO não deve coincidir com a password principal', - password_should_not_match: 'Password para armazenamento FALSO não deve coincidir com a password principal', - retype_password: 'Inserir password novamente', - passwords_do_not_match: 'Passwords não coincidem, tente novamente', + general: 'Geral', + security: 'Segurança', + about: 'Sobre', + electrumServer: 'Servidor Electrum', + advancedOptions: 'Opções avançadas', + changePin: 'Alterar PIN', + fingerprintLogin: 'Iniciar sessão com impressão digital', + aboutUs: 'Sobre nós', + header: 'Definições', + notSupportedFingerPrint: 'O seu dispositivo não suporta impressão digital', + TouchID: 'Permitir impressão digital', + FaceID: 'Permitir FaceID', + Biometrics: 'Permitir dados biométricos', + }, + aboutUs: { + header: 'Sobre nós', + releaseNotes: 'Notas de lançamento', + runSelfTest: 'Executar teste próprio', + buildWithAwesome: 'Construir com Awesome:', + rateVelesWallet: 'Classificar VelesWallet', + goToOurGithub: 'Ir para Github', + alwaysBackupYourKeys: 'Realizar sempre uma cópia de segurança nas suas chaves', + title: 'A Veles Wallet é grátis, tratando-se de uma carteira gratuita do Cortez Vault. Licenciada pelo MIT.', + }, + electrumServer: { + header: 'Servidor Electrum', + title: 'Alterar o Servidor Electrum', + description: + 'Poderá alterar o endereço do servidor ao qual é efectuada a ligação. O endereço padrão é recomendado.', + save: 'Guardar', + useDefault: 'Usar predefinição', + host: 'anfitrião', + port: 'porta', + successfullSave: + 'As suas alterações foram guardadas com sucesso. A reinicialização pode ser exigida para que as alterações tenham efeito.', + connectionError: 'Não está a ser possível efectuar a ligação ao servidor Electrum fornecido ', + }, + advancedOptions: { + title: 'Configurar opções avançadas', + description: + 'A activação das Opções Avançadas permitirá escolher entre os tipos de carteira listados abaixo: \n' + + 'P2SH, HD P2SH, HD segwit.', + }, + selectLanguage: { + header: 'Idioma', + restartInfo: + 'Quando um novo idioma é seleccionado, o reinício da aplicação VelesWallet pode ser exigido para esta alteração ter efeito', + confirmation: 'Confirmação', + confirm: 'Confirmar', + alertDescription: 'Seleccionar o idioma e reiniciar a aplicação?', + cancel: 'Cancelar', + }, + contactList: { + cancel: 'Cancelar', + search: 'Pesquisar', + screenTitle: 'Lista de endereços', + noContacts: 'Sem contactos', + noContactsDesc1: 'Sem contactos para apresentar. \nClicar', + noContactsDesc2: 'para adicionar o seu primeiro contacto.', + noResults: 'Sem resultados para', + }, + contactCreate: { + screenTitle: 'Adicionar novo contacto', + subtitle: 'Novo contacto', + description: 'Introduza um nome e um endereço\npara o seu novo contacto.', + nameLabel: 'Nome', + addressLabel: 'Endereço', + buttonLabel: 'Adicionar novo contacto', + successTitle: 'Sucesso', + successDescription: 'Parabéns! Adicionou o seu contacto\ncom sucesso.', + successButton: 'Voltar à Lista de endereços', + }, + contactDetails: { + nameLabel: 'Nome', + addressLabel: 'Endereço', + editName: 'Editar nome', + editAddress: 'Editar endereço', + sendCoinsButton: 'Enviar moedas', + showQRCodeButton: 'Apresentar Código QR', + deleteButton: 'Eliminar contacto', + share: 'Partilhar', + }, + contactDelete: { + title: 'Eliminar o seu contacto', + header: 'Eliminar contacto', + description1: 'Tem certeza de que deseja excluir', + description2: '?\nNão pode anular esta ação.', + no: 'Não', + yes: 'Sim', success: 'Sucesso', + successDescription: 'O seu contacto foi excluído com sucesso.\n' + 'Pode voltar à Lista de endereços.', + successButton: 'Voltar à Lista de endereços', + }, + scanQrCode: { + permissionTitle: 'Permissão para usar a câmara', + permissionMessage: 'Precisamos da sua permissão para usar a sua câmara', + ok: 'OK', + cancel: 'Cancelar', }, - lnd: { - title: 'gerir saldo', - choose_source_wallet: 'Escolha a wallet', - refill_lnd_balance: 'Carregar o saldo da Lightning wallet', - refill: 'Carregar', - placeholder: 'Factura', - withdraw: 'Transferir', - expired: 'Expirado', - sameWalletAsInvoiceError: 'Não pode pagar uma factura com a mesma wallet usada para a criar.', - }, - pleasebackup: { - title: 'A sua wallet foi criada...', - text: - 'Por favor escreva esta frase mnemónica numa folha de papel. É o seu backup e pode usá-lo para restaurar a sua wallet noutro device.', - ok: 'OK, eu escrevi-a num papel!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'Esta factura não foi paga e expirou', - has_been_paid: 'Esta factura foi paga', - please_pay: 'Por favor pague', - sats: 'sats', - for: 'Para:', - additional_info: 'Informação adicional', - open_direct_channel: 'Abrir canal directo com este node:', + filterTransactions: { + header: 'Filtrar transacções', + receive: 'receber', + send: 'enviar', + filter: 'filtrar', + to: 'para', + toAmount: 'Montante máximo', + toDate: 'Data de Fim', + from: 'de', + fromAmount: 'Montante mínimo', + fromDate: 'Data de Início', + clearFilters: 'apagar filtros', }, }; diff --git a/loc/ru.js b/loc/ru.js deleted file mode 100644 index 17b0a9b0f3..0000000000 --- a/loc/ru.js +++ /dev/null @@ -1,248 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Твоё хранилище зашифровано. Введи пароль для расшифровки', - enter_password: 'Введи пароль', - bad_password: 'Неверный пароль, попробуй еще раз', - never: 'Никогда', - continue: 'Продолжить', - ok: 'OK', - }, - wallets: { - options: 'Настройки', - select_wallet: 'Выбрать кошелек', - createBitcoinWallet: 'Чтобы воспользоватья кошельком Lightning, нужно сначала пополнить его с помощью кошелька Bitcoin. Продолжить?', - - list: { - app_name: 'BlueWallet', - title: 'Кошельки', - header: 'Кошелек - это секретный (приватный) ключ и соответствующий ему адрес на который можно получать Bitcoin', - add: 'Добавить Кошелек', - create_a_wallet: 'Создать кошелек', - create_a_wallet1: 'Это бесплатно и ты можешь создать', - create_a_wallet2: 'неограниченное количество', - latest_transaction: 'Последняя транзакция', - empty_txs1: 'Список транзакций пока пуст', - empty_txs2: ' ', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Купить Bitcoin', - }, - reorder: { - title: 'Отсортировать кошельки', - }, - add: { - title: 'Добавить кошелек', - description: - 'Ты можешь отсканировать QR код (в формате WIF - Wallet Import Format) или создать новый кошелек. Segwit поддерживается по умолчанию.', - scan: 'Отсканировать', - create: 'Создать', - label_new_segwit: 'Новый SegWit', - label_new_lightning: 'Новый Lightning', - wallet_name: 'Имя кошелька', - wallet_type: 'Тип кошелька', - or: 'или', - import_wallet: 'Импортировать кошелек', - imported: 'Кошелек импортирован', - coming_soon: 'Скоро будет', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Информация о кошельке', - address: 'Адрес', - type: 'Тип', - label: 'Метка', - delete: 'Удалить', - save: 'Сохранить', - are_you_sure: 'Точно удалить?', - yes_delete: 'Да, удалить', - destination: 'Назначение', - description: 'Описание', - no_cancel: 'Нет, отмена', - delete_this_wallet: 'Удалить этот кошелек', - export_backup: 'Экспорт / резервная копия', - buy_bitcoin: 'Купить Bitcoin', - show_xpub: 'Показать XPUB', - }, - export: { - title: 'Экспорт Кошелька', - }, - xpub: { - title: 'XPUB кошелька', - copiedToClipboard: 'Скопировано', - }, - import: { - title: 'Импорт', - explanation: 'Напиши тут свою мнемоническую фразу, приватный ключ, WIF - что угодно! BlueWallet постарается угадать верный формат', - imported: 'Импорт завершен', - error: 'Не удалось импортировать', - success: 'Успех', - do_import: 'Импортировать', - scan_qr: 'или отсканировать QR код?', - }, - scanQrWif: { - go_back: 'Назад', - cancel: 'Отмена', - decoding: 'Расшивровываю', - input_password: 'Введи пароль', - password_explain: 'Приватный ключ зашифрован по стандарту BIP38', - bad_password: 'Неверный пароль', - wallet_already_exists: 'Такой кошелек уже существует', - bad_wif: 'Некорректный WIF', - imported_wif: 'Импортирован WIF ', - with_address: ' с адресом ', - imported_segwit: 'Импортированый SegWit', - imported_legacy: 'Импортированый Legacy', - imported_watchonly: 'Импортированый Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Транзакции', - title: 'Мои транзакции', - description: 'Список входящих или исходящих транзакций ваших кошельков', - conf: 'подтв.', - }, - details: { - title: 'Детали транзакци', - from: 'От', - to: 'Кому', - copy: 'копировать', - transaction_details: 'Детали транзакции', - show_in_block_explorer: 'Показать транзакцию в блокчейне', - }, - }, - send: { - header: 'Отправить', - confirm: { - header: 'Подтвердить', - sendNow: 'Отправить', - }, - success: { - done: 'Готово', - }, - details: { - title: 'Создать Транзакцию', - amount_field_is_not_valid: 'Введенная сумма неверна', - fee_field_is_not_valid: 'Введенная комиссия неверна', - address_field_is_not_valid: 'Введенный адрес неверный', - receiver_placeholder: 'Адрес получателя', - amount_placeholder: 'сколько отправить (в BTC)', - fee_placeholder: 'плюс комиссия за перевод (в BTC)', - note_placeholder: 'примечание платежа', - create_tx_error: 'Ошибка при создании транзакции. Пожалуйста, проверь правильность адреса.', - cancel: 'Отмена', - scan: 'Отсканировать QR', - create: 'Создать', - send: 'Отправить', - address: 'Адрес', - total_exceeds_balance: 'Общая сумма превышает баланс.', - remaining_balance: 'Остаток баланса', - }, - create: { - title: 'Создать Транзакцию', - details: 'Детали', - error: 'Ошибка при создании транзакции. Неправильный адрес назначения или недостаточно средств?', - go_back: 'Назад', - this_is_hex: 'Это данные транзакции. Транзакция подписана и готова быть транслирована в сеть. Продолжить?', - to: 'Куда', - amount: 'Сколько', - fee: 'Комиссия', - tx_size: 'Размер', - satoshi_per_byte: 'Сатоши на байт', - memo: 'Примечание', - broadcast: 'Отправить', - not_enough_fee: 'Слишком маленькая комиссия. Увеличь комиссию', - }, - }, - buyBitcoin: { - header: 'Купить Bitcoin', - tap_your_address: 'Нажми на адрес, чтобы скопировать его:', - copied: 'Скопировано', - }, - receive: { - header: 'Получить', - details: { - title: 'Покажи этот адрес плательщику', - share: 'Отправить', - copiedToClipboard: 'Скопировано', - label: 'Описание', - create: 'Создать', - setAmount: 'Получить сумму', - }, - scan_lnurl: 'Scan to receive', - }, - settings: { - tabBarLabel: 'Настройки', - header: 'Настройки', - plausible_deniability: 'Правдоподобная имитация...', - storage_not_encrypted: 'Хранилище: не зашифровано', - storage_encrypted: 'Хранилище: зашифровано', - password: 'Пароль', - password_explain: 'Придумай пароль для расшифровки хранилища', - retype_password: 'Набери пароль повторно', - passwords_do_not_match: 'Пароли не совпадают', - encrypt_storage: 'Зашифровать хранилище', - lightning_settings: 'Настройки Lightning', - lightning_settings_explain: - 'Чтобы подключиться к своему узлу LND, пожалуйста, установи LndHub' + - ' и добавь его URL в настройки. Оставь поле пустым, чтобы использоавать стандартный ' + - 'LndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Сохранить', - about: 'О программе', - language: 'Язык', - currency: 'Валюта', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Правдоподобная имитация', - help: - 'При определенных обстоятельствах тебя могут вынудить раскрыть пароль. ' + - 'Чтобы сохранить свой Bitcoin в безопасности, BlueWallet может создать ' + - 'еще одно зашифрованое хранилище, с другим паролем. В случае шантажа ' + - 'ты можешь раскрыть третьим лицам этот пароль. Если ввести этот пароль в ' + - "BlueWallet, разблокируется 'фальшивое' хранилище. Это будет выглядеть " + - 'правдоподобно для третьих лиц, но при этом сохранит ваше основное хранилище ' + - 'с Bitcoin в безопасности.', - help2: - 'Новое хранилище будет полностью функциональным и ты даже можешь хранить на нем немного Bitcoin, ' + - 'чтобы это выглядело более правдоподобно.', - create_fake_storage: 'Создать фальшивое хранилище', - go_back: 'Назад', - create_password: 'Придумай пароль', - create_password_explanation: 'Пароль для фальшивого хранилища не должен быть таким же как основной пароль', - password_should_not_match: 'Пароль для фальшивого хранилища не должен быть таким же как основной пароль', - retype_password: 'Набери пароль повторно', - passwords_do_not_match: 'Пароли не совпадают, попробуй еще раз', - success: 'Готово', - }, - lnd: { - title: 'Мои средства', - choose_source_wallet: 'Выбери с какого кошелька', - refill_lnd_balance: 'Пополнить баланс Lightning кошелька', - refill: 'Пополнить', - withdraw: 'Вывести', - expired: 'Истекший', - placeholder: 'Invoice', - sameWalletAsInvoiceError: 'Ты не можешь оплатить счет тем же кошельком, который ты использовал для его создания.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/sv_SE.js b/loc/sv_SE.js deleted file mode 100644 index 35b855dda4..0000000000 --- a/loc/sv_SE.js +++ /dev/null @@ -1,244 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Lagringen är krypterad. Lösenords krävs för att dekryptera', - enter_password: 'Ange lösenord', - bad_password: 'Felaktigt lösenord, försök igen', - never: 'aldrig', - continue: 'Fortsätt', - ok: 'OK', - }, - wallets: { - select_wallet: 'Välj plånbok', - options: 'inställningar', - createBitcoinWallet: - 'Du har ännu ingen Bitcoinplånbok. För att kunna sätta in pengar i en Lightningplånbok behöver en Bitcoinplånbok skapas eller importeras. Vill du fortsätta ändå?', - list: { - app_name: 'BlueWallet', - title: 'plånböcker', - header: 'En plånbok representerar ett par av en privat nyckel samt en adress' + 'som du kan dela med andra för att ta emot coins', - add: 'Ny Plånbok', - create_a_wallet: 'Ny plånbok', - create_a_wallet1: 'Det är gratis och du kan skapa', - create_a_wallet2: 'hur många du vill', - latest_transaction: 'senaste transaktion', - empty_txs1: 'Dina transaktioner kommer att visas här', - empty_txs2: 'men än så länge finns inga!', - empty_txs1_lightning: - 'Lightningplånboken ska användas för dagliga småtransaktioner. Avgifterna är minimala och transaktioner sker direkt.', - empty_txs2_lightning: '\nFör att komma igång klicka på "sätt in / ta ut" ovan och sätt in dina första bitcoin.', - tap_here_to_buy: 'Tryck här för att köpa bitcoin', - }, - reorder: { - title: 'Sortera plånböcker', - }, - add: { - title: 'ny plånbok', - description: - 'Du kan antingen skanna in en backup (i WIF - Wallet Import Format) eller skapa en ny plånbok. Segwit-plånböcker stöds som standard.', - scan: 'Skanna', - create: 'Skapa', - label_new_segwit: 'Ny SegWit', - label_new_lightning: 'Ny Lightning', - wallet_name: 'namn', - wallet_type: 'typ', - or: 'eller', - import_wallet: 'Importera plånbok', - imported: 'Importerad', - coming_soon: 'Kommer snart', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Plånbok', - address: 'Adress', - type: 'Typ', - label: 'Etikett', - description: 'beskrivning', - are_you_sure: 'Är du säker?', - yes_delete: 'Ja, ta bort', - no_cancel: 'Nej, avbryt', - delete: 'Radera', - save: 'Spara', - delete_this_wallet: 'Radera denna plånbok', - export_backup: 'Exportera / ta backup', - buy_bitcoin: 'Köp bitcoin', - show_xpub: 'Visa plånbokens XPUB', - }, - export: { - title: 'exportera plånbok', - }, - xpub: { - title: 'plånbokens XPUB', - copiedToClipboard: 'Kopierad till urklipp', - }, - import: { - title: 'import', - explanation: - 'Skriv in dina ord, din privata nyckel, WIF, eller vad du kan tänkas ha. BlueWallet kommer att göra sitt bästa för att gissa formatet och importera plånboken', - imported: 'Importerad', - error: 'Import misslyckades. Kontrollera att informationen du matade in är korrekt.', - success: 'Import lyckad!', - do_import: 'Importera', - scan_qr: 'eller skanna QR-kod istället?', - }, - scanQrWif: { - go_back: 'Tillbaka', - cancel: 'Avbryt', - decoding: 'Avkodar', - input_password: 'Ange lösenord', - password_explain: 'Detta är BIP38-krypterad privat nyckel', - bad_password: 'Felaktigt lösenord', - wallet_already_exists: 'En sådan plånbok existerar redan', - bad_wif: 'Felaktigt WIF', - imported_wif: 'Importerade WIF ', - with_address: ' med adress ', - imported_segwit: 'Importerade SegWit', - imported_legacy: 'Importerade Legacy', - imported_watchonly: 'Importerade Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Transaktioner', - title: 'transaktioner', - description: 'Lista över dina plånböckers inkommande och utgående transaktioner', - conf: 'konf', - }, - details: { - title: 'Transaktion', - from: 'Input', - to: 'Output', - copy: 'Kopiera', - transaction_details: 'Transaktionsdetaljer', - show_in_block_explorer: 'Visa i block explorer', - }, - }, - send: { - header: 'Skicka', - details: { - title: 'skapa transaktion', - amount_field_is_not_valid: 'Angivet belopp är inte giltigt', - fee_field_is_not_valid: 'Angiven avgift är inte giltig', - address_field_is_not_valid: 'Angiven adress är inte giltig', - total_exceeds_balance: 'Beloppet överstiger plånbokens tillgängliga belopp', - create_tx_error: 'Något gick fel när transaktionen skulle skapas. Kontrollera att adressen är giltig.', - address: 'adress', - amount_placeholder: 'belopp att skicka (i BTC)', - fee_placeholder: 'plus avgift (i BTC)', - note_placeholder: 'egen notering', - cancel: 'Avbryt', - scan: 'Skanna', - send: 'Skicka', - create: 'Skapa', - remaining_balance: 'Återstående saldo', - }, - confirm: { - header: 'Bekräfta', - sendNow: 'Skicka nu', - }, - success: { - done: 'Klart!', - }, - create: { - details: 'Detaljer', - title: 'skapa transaktion', - error: 'Något gick fel när transaktionen skulle skapas. Felaktig adress eller belopp?', - go_back: 'Tillbaka', - this_is_hex: 'Detta är transaktionens hex, signerad och redo att skickas ut på nätverket.', - to: 'Till', - amount: 'Belopp', - fee: 'Avgift', - tx_size: 'Transaktionsstorlek', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Publicera', - not_enough_fee: 'För låg avgift. Öka avgiften', - }, - }, - receive: { - header: 'Ta emot', - details: { - title: 'Dela den här adressen med betalaren', - share: 'dela', - copiedToClipboard: 'Kopierad till urklipp.', - label: 'Beskrivning', - create: 'Skapa', - setAmount: 'Ta emot med belopp', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Köp bitcoin', - tap_your_address: 'Tryck på adressen för att kopiera den till urklipp:', - copied: 'Kopierad till urklipp!', - }, - settings: { - header: 'inställningar', - plausible_deniability: 'Trovärdigt förnekande...', - storage_not_encrypted: 'Lagring: ej krypterad', - storage_encrypted: 'Lagring: krypterad', - password: 'Lösenord', - password_explain: 'Skapa ett lösenord som du kommer att använda vid dekryptering', - retype_password: 'Ange lösenord igen', - passwords_do_not_match: 'Lösenorden är olika!', - encrypt_storage: 'Kryptera lagring', - lightning_settings: 'Lightning Network', - lightning_settings_explain: - 'För att ansluta till din egen LND-nod, installera LndHub' + - " och mata in dess URL nedan. Lämna blankt för att använda BlueWallet's LNDHub (lndhub.io). Plånböcker skapade efter att inställningarna sparats kommer att använda den angivna LNDHub:en", - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Spara', - about: 'Om', - language: 'Språk', - currency: 'Valuta', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Trovärdigt förnekande', - help: - 'Under vissa omständigheter kan du bli tvingad att uppge ditt ' + - 'lösenord. För att se till att dina pengar är säkra kan BlueWallet skapa ytterligare en ' + - 'krypterad lagringsyta, med ett annat lösenord. Vid tvång ' + - 'kan du uppge detta alternativa lösenord. När det matas in i ' + - "BlueWallet så kommer det att låsa upp din 'fejkade' lagringsyta. Det kommer att se " + - 'ut precis som vanligt men i själva verket är dina pengar i säkert förvar på din ' + - 'primära lagringsyta.', - help2: - 'Den alternativa lagringsytan kommer att vara fullt fungerade och du kan eventuellt spara en mindre summa där för att den ska verka mer trovärdig.', - create_fake_storage: 'Skapa fejkad lagringsyta', - go_back: 'Tillbaka', - create_password: 'Skapa ett lösenord', - create_password_explanation: 'Lösenordet för den fejkade lagringsytan får inte vara samma som ditt huvudlösenord', - password_should_not_match: 'Lösenordet för den fejkade lagringsytan får inte vara samma som ditt huvudlösenord', - retype_password: 'Ange lösenord igen', - passwords_do_not_match: 'Lösenorden är olika!', - success: 'Fejkad lagringsyta skapad!', - }, - lnd: { - title: 'sätt in / ta ut', - choose_source_wallet: 'Välj en plånbok', - refill_lnd_balance: 'Fyll på Lightning-plånbok', - refill: 'Sätt in', - withdraw: 'Ta ut', - expired: 'Förfallen', - placeholder: 'Faktura', - sameWalletAsInvoiceError: 'Du kan inte betala en faktura från samma plånbok som användes för att skapa den.', - }, - pleasebackup: { - title: 'Din plånbok har skapats...', - text: - 'Innan du går vidare, var snäll och skriv ned dessa ord på ett papper och förvara på ett säkert ställe. De är din backup och säkerställer att du kan återställa din plånbok igen om något händer.', - ok: 'OK, jag har skrivit ned orden!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'Denna faktura har ej betalats och är nu utgången', - has_been_paid: 'Denna faktura är betald', - please_pay: 'Var god betala', - sats: 'sats', - for: 'För:', - additional_info: 'Ytterligare information', - open_direct_channel: 'Öppna en direkt kanal med denna nod:', - }, -}; diff --git a/loc/th_TH.js b/loc/th_TH.js deleted file mode 100644 index 3869a4631f..0000000000 --- a/loc/th_TH.js +++ /dev/null @@ -1,243 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'ที่เก็บข้อมูลของคุณถูกเข้ารหัส. ต้องการรหัสผ่านเพื่อถอดรหัส', - enter_password: 'กรุณาใส่รหัสผ่าน', - bad_password: 'รหัสผ่านไม่ถูกต้อง กรุณาใส่รหัสผ่านอีกครั้ง', - never: 'ไม่เคย', - continue: 'ต่อไป', - ok: 'ตกลง', - }, - wallets: { - select_wallet: 'เลือกกระเป๋าสตางค์', - options: 'ทางเลือก', - createBitcoinWallet: - 'ในการใช้งานกระเป๋าสตางค์ไลท์นิง คุณจำเป็นต้องมีกระเป๋าสตางค์บิตคอยน์. คุณต้องการสร้างกระเป๋าสตางค์บิตคอยน์หรือไม่?', - list: { - app_name: 'บูลวอลเล็ต', - title: 'กระเป๋าสตางค์', - header: 'กระเป๋าสตางค์คือที่เก็บไพร์เวทคีย์และแอดเดรส' + 'ที่คุณสามารถแชร์เพื่อโอนรับเหรียญ.', - add: 'เพิ่มกระเป๋าสตางค์', - create_a_wallet: 'สร้างกระเป๋าสตางค์', - create_a_wallet1: 'ไม่มีค่าใช้จ่าย และคุณสามารถสร้างกระเป๋าสตางค์', - create_a_wallet2: 'ได้มากเท่าที่ต้องการ', - latest_transaction: 'ธุรกรรมล่าสุด', - empty_txs1: 'ธุรกรรมจะปรากฏที่นี่,', - empty_txs2: 'ไม่มี ณ ขณะนี้', - empty_txs1_lightning: 'ควรใช้ไลท์นิงเน็ตเวิร์คสำหรับธุรกรรมประจำวันเท่านั้น ธุรกรรมทันใจและมีค่าธรรมเนียมน้อยมาก', - empty_txs2_lightning: '\nแตะที่ "จัดการเงิน" เพื่อเริ่มใช้งาน และเติมเงิน', - tap_here_to_buy: 'กดที่นี่เพื่อซื้อบิตคอยน์', - }, - reorder: { - title: 'เปลี่ยนลำดับกระเป๋าสตางค์', - }, - add: { - title: 'เพิ่มกระเป๋าสตางค์', - description: - 'คุณสามรถสแกนกระเป๋าสตางค์กระดาษ(ในรูปแบบ WIF - Wallet Import Format), หรือสร้างกระเป๋าสตางค์ใหม่. กระเป๋าสตางค์ใหม่จะใช้ Segwit โดยอัตโนมัติ.', - scan: 'สแกน', - create: 'สร้าง', - label_new_segwit: 'SegWit ใหม่', - label_new_lightning: 'ไลท์นิงใหม่', - wallet_name: 'ชื่อกระเป๋าสตางค์', - wallet_type: 'ชนิด', - or: 'หรือ', - import_wallet: 'นำเข้ากระเป๋าสตางค์', - imported: 'นำเข้าแล้ว', - coming_soon: 'เร็วๆนี้', - lightning: 'ไลท์นิง', - bitcoin: 'บิตคอยน์', - }, - details: { - title: 'กระเป๋าสตางค์', - address: 'แอดเดรส', - type: 'ชนิด', - label: 'ป้าย', - destination: 'เป้าหมาย', - description: 'คำอธิบาย', - are_you_sure: 'คุณแน่ใจหรือไม่?', - yes_delete: 'ใช่, ลบเลย', - no_cancel: 'ไม่ใช่, ยกเลิก', - delete: 'ลบ', - save: 'เก็บ', - delete_this_wallet: 'ลบกระเป๋าสตางค์อันนี้', - export_backup: 'ส่งออก / สำรอง', - buy_bitcoin: 'ซื้อบิตคอยน์', - show_xpub: 'แสดง XPUB ของกระเป๋าสตางค์', - }, - export: { - title: 'ส่งออกกระเป๋าสตางค์', - }, - xpub: { - title: 'XPUB ของกระเป๋าสตางค์', - copiedToClipboard: 'ก๊อปปี้ไปที่คลิปบอร์ดแล้ว.', - }, - import: { - title: 'นำเข้า', - explanation: 'บันทึกนีโมนิค(สิ่งที่ช่วยให้จำได้), ไพร์เวทคีย์, WIF, และทุกๆอย่าง. บูลวอลเล็ทจะพยายามนำเข้ากระเป๋าสตางค์ของคุณ', - imported: 'นำเข้าแล้ว', - error: 'ไม่สามารถนำเข้าได้. กรุณาตรวจสอบข้อมูลให้ถูกต้อง.', - success: 'สำเร็จ', - do_import: 'นำเข้า', - scan_qr: 'หรือสแกนรหัสคิวอาร์แทน?', - }, - scanQrWif: { - go_back: 'กลับ', - cancel: 'ยกเลิก', - decoding: 'กำลังถอดรหัส', - input_password: 'ใส่รหัสผ่าน', - password_explain: 'นี่คือไพร์เวทคีย์ที่เข้ารหัสแบบ BIP38', - bad_password: 'รหัสไม่ถูกต้อง', - wallet_already_exists: 'กระเป๋าสตางค์นี้มีอยู่แล้ว', - bad_wif: 'WIF ไม่ถูกต้อง', - imported_wif: 'WIF ที่นำเข้า', - with_address: ' ด้วยแอดเดรส ', - imported_segwit: 'SegWit ที่นำเข้า', - imported_legacy: 'Legacy ที่นำเข้า', - imported_watchonly: 'Watch-only ที่นำเข้า', - }, - }, - transactions: { - list: { - tabBarLabel: 'ธุรกรรม', - title: 'ธุรกรรม', - description: 'รายการธุรกรรมเข้าออกของกระเป๋าสตางค์ของคุณ', - conf: 'conf', - }, - details: { - title: 'ธุรกรรม', - from: 'อินพุท', - to: 'เอ้าพุท', - copy: 'ก๊อปปี้', - transaction_details: 'รายละเอียดธุรกรรม', - show_in_block_explorer: 'แสดงด้วย block explorer', - }, - }, - send: { - header: 'ส่ง', - details: { - title: 'สร้างธุรกรรม', - amount_field_is_not_valid: 'จำนวนเงินไม่ถูกต้อง', - fee_field_is_not_valid: 'ค่าธรรมเนียมไม่ถูกต้อง', - address_field_is_not_valid: 'แอดเดรสไม่ถูกต้อง', - total_exceeds_balance: 'จำนวนเงินที่จะส่งเกินเงินที่มี.', - create_tx_error: 'ไม่สามารถสร้างธุรกรรมได้. กรุณาตรวจสอบแอดเดรสให้ถูกต้อง.', - address: 'แอดเดรส', - amount_placeholder: 'จำนวนเงินที่ส่ง (หน่วย BTC)', - fee_placeholder: 'รวมค่าธรรมเนียม (หน่วย BTC)', - note_placeholder: 'หมายเหตุถึงตัวท่านเอง', - cancel: 'ยกเลิก', - scan: 'สแกน', - send: 'ส่ง', - create: 'สร้าง', - remaining_balance: 'ยอดคงเหลือ', - }, - confirm: { - header: 'ยืนยัน', - sendNow: 'ส่งเดี๋ยวนี้', - }, - success: { - done: 'สำเร็จ', - }, - create: { - details: 'รายละเอียด', - title: 'สร้างธุรกรรม', - error: 'ไม่สามารถสร้างธุรกรรมได้. แอดเดรสไม่ถูกต้อง หรือ จำนวนเงินไม่ถูกต้อง?', - go_back: 'กลับ', - this_is_hex: 'นี่คือ hex ของธุรกรรม, signed แล้วและพร้อมที่จะบรอดคาซท์ไปยังเน็ตเวิร์ค.', - to: 'ถึง', - amount: 'จำนวนเงิน', - fee: 'ค่าธรรมเนียม', - tx_size: 'ขนาดธุรกรรม', - satoshi_per_byte: 'ซาโตชิต่อไบท์', - memo: 'บันทึกช่วยจำ', - broadcast: 'บรอดคาซท์', - not_enough_fee: 'ค่าธรรมเนียมไม่เพียงพอ. กรุณาเพิ่มค่าธรรมเนียม', - }, - }, - receive: { - header: 'รับ', - details: { - title: 'แชร์แอดเดรสนี้กับผู้จ่าย', - share: 'แชร์', - copiedToClipboard: 'ก๊อปปี้ไปที่คลิปบอร์ดแล้ว.', - label: 'คำอธิบาย', - create: 'สร้าง', - setAmount: 'รับด้วยจำนวน', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'ซื้อบิตคอยน์', - tap_your_address: 'กดที่แอดเดรสของคุณเพื่อก๊อปปี้ไปยังคลิปบอร์ด:', - copied: 'ก๊อปปี้ไปที่คลิปบอร์ดแล้ว!', - }, - settings: { - header: 'ตั้งค่า', - plausible_deniability: 'การปฏิเสธที่เป็นไปได้...', - storage_not_encrypted: 'ที่เก็บข้อมูล: ยังไม่เข้ารหัส', - storage_encrypted: 'ที่เก็บข้อมูล: เข้ารหัสแล้ว', - password: 'รหัสผ่าน', - password_explain: 'สร้างรหัสผ่านที่จะใช้ในการเข้ารหัสที่เก็บข้อมูล', - retype_password: 'ใส่รหัสผ่านอีกครั้ง', - passwords_do_not_match: 'รหัสผ่านไม่ตรงกัน', - encrypt_storage: 'เข้ารหัสที่เก็บข้อมูล', - lightning_settings: 'การตั้งค่าไลท์นิง', - lightning_settings_explain: - 'กรณีที่ต้องการต่อเชื่อมไปยังไลท์นิงโนดของท่านเอง กรุณาติดตั้ง LndHub ของท่าน' + - ' และไส่ URL ที่นี่. ระบบจะใช้ LndHub ของ lndhub.io ในกรณืที่ท่าน ' + - ' ไม่ตั้งค่าใดๆ', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'บันทึก', - about: 'เกี่ยวกับ', - language: 'ภาษา', - currency: 'เงินตรา', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'การปฏิเสธที่เป็นไปได้', - help: - 'ภายใต้บางสถานการ์ณ, คุณอาจจะจำเป็นต้องเปิดเผย' + - 'รหัสผ่าน. เพื่อเก็บเหรียญให้ปลอดถัย บูลวอลเล็ทสามารถสร้างที่เก็บข้อมูล' + - 'อีกแห่งหนึ่งโดยใช้รหัสผ่านคนละอัน. ภายใต้สถานการ์ณที่จำเป็น ' + - 'คุณสามารถเปิดเลยรหัสผ่านนี้กับบุคคลที่สาม. และเมื่อใส่รหัสผ่านนี้ใน ' + - 'บลูวอลเล็ท ที่เก็บข้อมูลเทียมจะถูกเปิด. และ' + - 'น่าจะเป็นที่ยอมรับได้ต่อบุคลที่สาม, วิธีนี้จะทำให้ที่เก็บข้อมูลหลักมีความปลอดภัย' + - 'และเป็นความลับ.', - help2: 'ที่เก็บข้อมูลอันใหม่จะทำงานได้สมบูรณ์ และคุณสามารถเก็บจำนวนเงินขั้นต่ำได้ ' + 'โดยที่มีความน่าเชื่อถือ.', - create_fake_storage: 'สร้างที่เก็บข้อมูลเทียม', - go_back: 'กลับ', - create_password: 'สร้างรหัสผ่าน', - create_password_explanation: 'รหัสผ่านสำหรับที่เก็บข้อมูลเทียมไม่ควรตรงกับรหัสผ่านที่ใช้กับที่เก็บข้อมูลเทียมจริง', - password_should_not_match: 'รหัสผ่านสำหรับที่เก็บข้อมูลเทียมไม่ควรตรงกับรหัสผ่านที่ใช้กับที่เก็บข้อมูลเทียมจริง', - retype_password: 'ใส่รหัสผ่านอีกครั้ง ใส่รหัสผ่านอีกครั้ง', - passwords_do_not_match: 'รหัสผ่านไม่ตรงกัน ', - success: 'สำเร็จ', - }, - lnd: { - title: 'จัดการเงิน', - choose_source_wallet: 'เลือกกระเป๋าสตางค์', - refill_lnd_balance: 'เติมกระเป๋าสตางค์ไลท์นิง', - refill: 'เติม', - withdraw: 'ถอน', - placeholder: 'ใบวางบิล', - expired: 'หมดอายุแล้ว', - sameWalletAsInvoiceError: 'คุณไม่สามารถจ่ายใบแจ้งหนี้นี้ด้วยกระเป๋าสตางค์อันเดียวกันกับที่ใช้สร้างมัน.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/tr_TR.js b/loc/tr_TR.js index b536c91aea..e8d6e9e6be 100644 --- a/loc/tr_TR.js +++ b/loc/tr_TR.js @@ -1,244 +1,348 @@ module.exports = { _: { - storage_is_encrypted: 'Your storage is encrypted. Password is required to decrypt it', - enter_password: 'Şifre gir', - bad_password: 'Hatalı şifre, tekrar deneyin', + languageCode: 'tr', + storage_is_encrypted: 'Kasanız şifrelidir. Açmak için parola gereklidir.', + enter_password: 'Parolayı girin', + bad_password: 'Yanlış parola, tekrar deneyin', never: 'asla', continue: 'Devam et', ok: 'Tamam', + click: 'Tıkla', + here: 'buraya', + save: 'Kaydet', + confirm: 'Onayla', + copy: 'Kopyala', + copied: 'Kopyalandı!', + }, + tabNavigator: { + dashboard: 'Pano', + settings: 'Ayarlar', + addressBook: 'Adres Defteri', + }, + message: { + somethingWentWrong: 'Bir sorun meydana geldi', + somethingWentWrongWhileCreatingWallet: + 'Cüzdanınızı oluştururken bir sorun meydana geldi Lütfen Panoya dönün ve yeniden deneyin.', + success: 'Başarılı', + successfullWalletImport: 'Cüzdanınız başarıyla içeri aktarıldı. Şimdi Panoya geri dönebilirsiniz.', + successfullWalletDelete: 'Cüzdanınız başarıyla silindi. Şimdi Panoya geri dönebilirsiniz.', + returnToDashboard: 'Panoya Geri Dön', + creatingWallet: 'Cüzdanınız oluşturuluyor', + creatingWalletDescription: 'Lütfen cüzdanınız oluşturulurken bekleyin. Biraz zaman alabilir.', + }, + onboarding: { + onboarding: 'Katılım', + pin: 'PIN', + createPin: 'PIN oluştur', + createNewPin: 'Yeni PIN', + createPassword: 'İşlem şifresi oluştur', + createPinDescription: + 'PIN’iniz uygulamaya giriş yapmak için kullanılacaktır. Daha sonra Ayarlar bölümünden değiştirebilirsiniz.', + confirmPin: 'PIN’i Onayla', + confirmNewPin: 'Yeni PIN’i Onayla', + confirmPassword: 'İşlem şifresini onayla', + passwordDoesNotMatch: 'Şifre eşleşmiyor. Lütfen geçerli bir şifre girin.', + createPasswordDescription: + 'İşlem Şifreniz tüm işlemleri doğrulamak için kullanılacak. Daha sonra değiştiremezsiniz. İşlem Şifresi en az 8 alfanümreik karakter içermelidir.', + changePin: 'PIN’i Değiştir', + currentPin: 'Mevcut PIN', + pinDoesNotMatch: 'PIN eşleşmiyor. Lütfen geçerli bir PIN girin.', + successDescription: 'Oley! PIN’inizi başarıyla oluşturdunuz.', + successDescriptionChangedPin: 'Oley! PIN’inizi başarıyla değiştirdiniz.', + successButton: 'Panoya Git', + successButtonChangedPin: 'Ayarlara Geri Dön', + }, + unlock: { + title: 'Kilidi Aç', + touchID: '"Veles Wallet" için Touch ID', + confirmButton: 'Devam etmek için parmak iziyle doğrulama yapın.', + enter: 'PIN Girin', + }, + unlockTransaction: { + headerText: 'İşlemi onayla', + title: 'İşlem Şifresini Onayla', + description: 'İşleme devam etmek için İşlem Şifresini Onaylayın.', }, wallets: { - select_wallet: 'Cüzdan Seç', - options: 'seçenekler', - createBitcoinWallet: - 'Şu anda Bitcoin cüzdanınız yok. Lightning cüzdanına yükleme yapmak için Bitcoin cüzdanı oluşturmak veya içeri yüklemek gerekir. Yine de devam etmek istiyor musunuz?', - list: { - app_name: 'BlueWallet', - title: 'cüzdanlar', - header: 'Cüzdan biri gizli, biri halka açık olan bir çift anahtar ve koin almak için' + ' paylaşabileceğiniz bir adrestir.', - add: 'Cüzdan Ekle', - create_a_wallet: 'Cüzdan oluştur', - create_a_wallet1: 'Oluşturması bedava ve', - create_a_wallet2: 'istediğiniz kadar oluşturabilirsiniz', - latest_transaction: 'en son işlem', - empty_txs1: 'İşlemleriniz burada görünür,', - empty_txs2: 'şu anda hiç yok', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Bitcoin almak için buraya dokunun', + dashboard: { + title: 'Cüzdanlar', + allWallets: 'Tüm cüzdanlar', + noWallets: 'Cüzdan yok', + noWalletsDesc1: 'Gösterilecek cüzdan yok.', + noWalletsDesc2: 'İlk cüzdanınızı eklemek için.', + send: 'Coin gönder', + receive: 'Coin al', + noTransactions: 'Gösterilecek işlem yok.', }, - reorder: { - title: 'Cüzdanları Sırala', + walletModal: { btcv: 'VLS', wallets: 'Cüzdanlar' }, + importWallet: { + title: 'Cüzdanınızı içeri aktarın', + header: 'Cüzdanı içeri aktar', + subtitle: + 'Buraya hatırlatıcı ipucunuzu, özel anahtarınızı, WIF’ı veya sahip olduğunuz başka bir şeyi yazın. VelesWallet doğru biçimi tahmin etmek ve cüzdanınızı içeri aktarmak için elinden geleni yapacak.', + placeholder: 'Özel ipucu, özel anahtar, WIF', + import: 'İçeri aktar', + scanQrCode: 'veya QR kodunu tara', + walletInUseValidationError: 'Cüzdan zaten kullanılıyor. Lütfen geçerli bir cüzdan girin.', }, + exportWallet: { title: 'Özel ipucu ifadesi', header: 'Cüzdanı dışarı aktar' }, + exportWalletXpub: { header: 'Cüzdanın XPUB’ı' }, + deleteWallet: { + title: 'Cüzdanınızı silin', + header: 'Cüzdanı sil', + description1: 'Silmek istediğinizden emin misiniz', + description2: '? Bu işlemi geri alamazsınız.', + no: 'Hayır', + yes: 'Evet', + }, + wallet: { none: 'Hiçbiri', latest: 'Son işlem' }, add: { - title: 'cüzdan ekle', + title: 'Yeni cüzdan ekle', + subtitle: 'Cüzdanınıza ad verin', + description: 'Lütfen cüzdanınız için bir ad girin.', + inputLabel: 'Ad', + addWalletButton: 'Yeni cüzdan ekle', + importWalletButton: 'Cüzdanı içeri aktar', + advancedOptions: 'Gelişmiş seçenekler', + multipleAddresses: 'Çoklu adresler', + singleAddress: 'Tek adres', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: 'Tek bir 24 kelimelik seedden oluşturulmuş yerli segwit adreslerinden oluşan ağaç içerir', + }, + addSuccess: { + title: 'Yeni cüzdan ekle', + subtitle: 'Başarılı', description: - 'Kağıt cüzdan (WIF - Wallet Import Format olarak) tarayarak içeri yükleyebilirsiniz veya cüzdan oluşturabilirsiniz. Segwit cüzdanlar standard olarak desteklenir.', - scan: 'Tara', - create: 'Oluştur', - label_new_segwit: 'Yeni SegWit', - label_new_lightning: 'Yeni Lightning', - wallet_name: 'isim', - wallet_type: 'tip', - or: 'veya', - import_wallet: 'Cüzdan İçeri Yükle', - imported: 'Yüklendi', - coming_soon: 'Yakında', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'Cüzdanınız oluşturuldu. Lütfen özel ipucu ifadesini bir kağıda not almak için zaman ayırın. Bu sizin yedeğiniz olacaktır. Diğer cihazlarda cüzdanı geri yüklemek için kullanabilirsiniz.', + okButton: 'Tamam, bunu yazdım!', }, details: { - title: 'Cüzdan', - address: 'Adres', - type: 'Tip', - label: 'Etiket', - destination: 'hedef', - description: 'tanım', - are_you_sure: 'Emin misiniz?', - yes_delete: 'Evet, sil', - no_cancel: 'Hayır, vazgeç', - delete: 'Sil', - save: 'Kaydet', - delete_this_wallet: 'Bu cüzdanı sil', - export_backup: 'Dışa yükle / yedekle', - buy_bitcoin: 'Bitcoin satın al', - show_xpub: 'Cüzdan XPUB göster', - }, - export: { - title: 'cüzdan yedekle', - }, - xpub: { - title: 'cüzdan XPUB', - copiedToClipboard: 'Panoya kopyalandı', + edit: 'Düzenle', + latestTransaction: 'Son işlem', + typeLabel: 'Tür', + nameLabel: 'Ad', + exportWallet: 'Cüzdanı dışarı aktar', + showWalletXPUB: 'Cüzdan XPUB’ını göster', + deleteWallet: 'Cüzdanı sil', + nameEdit: 'Adı düzenle', }, + export: { title: 'Cüzdanı dışarı aktarma' }, import: { - title: 'içeri yükle', + title: 'İçeri aktar', explanation: - 'Buraya cüzdan yedek cümlenizi, gizli anahtarınızı, WIF veya diğer bilginizi yazın. BlueWallet elinden gelen en iyi tahmini yaparak cüzdanınızı içeri aktarmaya çalışacak.', + 'Buraya hatırlatıcı ipucunuzu, özel anahtarınızı, WIF’ı veya sahip olduğunuz başka bir şeyi yazın. VelesWallet doğru biçimi tahmin etmek ve cüzdanınızı içeri aktarmak için elinden geleni yapacak', imported: 'İçeri aktarıldı', - error: 'İçeri aktarma başarısız oldu. Lütfen girilen bilginin doğru olduğundan emin olun.', + error: 'İçeri aktarılamadı. Lütfen sağlanan verilerin geçerli olduğundan emin olun.', success: 'Başarılı', - do_import: 'İçe Aktar', - scan_qr: 'veya QR kod tara?', + do_import: 'İçeri aktar', + scan_qr: 'veya onun yerine QR kodunu tarasın mı?', }, scanQrWif: { go_back: 'Geri Git', - cancel: 'Vazgeç', - decoding: 'Deşifre ediliyor', - input_password: 'Şifre gir', - password_explain: 'Bu BIP38 şifreli gizli anahtar', - bad_password: 'Hatalı şifre', + cancel: 'İptal Et', + decoding: 'Şifre çözülüyor', + input_password: 'Parola girin', + password_explain: 'Bu BIP38 şifrelenmiş özel anahtardır', + bad_password: 'Yanlış parola', wallet_already_exists: 'Böyle bir cüzdan zaten var', - bad_wif: 'Hatalı WIF', - imported_wif: 'İçeri aktarılmış WIF ', - with_address: ' adres ile ', - imported_segwit: 'İçeri Aktarılmış SegWit', - imported_legacy: 'İçeri Aktarılmış Eski Tip', - imported_watchonly: 'İçeri Aktarılmış Sadece-izleme', + bad_wif: 'Yanlış WIF', + imported_wif: 'WIF İçeri Aktarıldı', + with_address: 'adres ile', + imported_segwit: 'İçeri Aktarılan SegWit', + imported_legacy: 'İçeri Aktarılan Eski', + imported_watchonly: 'İçeri Aktarılan Yalnızca İzlenebilir', }, }, transactions: { - list: { - tabBarLabel: 'İşlemler', - title: 'işlemler', - description: 'Cüzdanlarınıza gelen ve giden işlemlerin bir listesi', - conf: 'onay', - }, + list: { conf: 'Onaylar' }, details: { title: 'İşlem', - from: 'Girdi', - to: 'Çıktı', - copy: 'Kopya', - transaction_details: 'İşlem detayları', - show_in_block_explorer: 'Blok gezgininde göster', + detailTitle: 'İşlem ayrıntıları', + transactionHex: 'İşlem on altılığı', + transactionHexDescription: 'Bu işlem on altılığıdır, imzalanmıştır ve ağda yayınlanmaya hazırdır', + copyAndBoriadcast: 'Kopyala ve daha sonra yayınla', + verify: 'Coinb.in üzerinde doğrula', + amount: 'Tutar', + fee: 'Ücret', + txSize: 'TX boyutu', + satoshiPerByte: 'Bayt başına Satoshi', + from: 'Gönderen', + to: 'Alıcı', + bytes: 'bayt', + copy: 'Kopyala', + noLabel: 'Etiket yok', + details: 'Ayrıntılar', + transactionId: 'İşlem Kimliği', + confirmations: 'onaylar', + transactionDetails: 'İşlem ayrıntıları', + viewInBlockRxplorer: 'Blok gezgininde görüntüle', + addNote: 'Not ekle', + note: 'Not', + inputs: 'Girdiler', + ouputs: 'Çıktılar', + sendCoins: 'Coin gönder', }, }, send: { - header: 'Gönder', + header: 'Coin gönder', + success: { + title: 'Başarılı', + description: 'Oley! İşlemi başarıyla tamamladınız.', + done: 'Tamamlandı', + return: 'Panoya Geri Dön', + }, details: { title: 'işlem oluştur', - amount_field_is_not_valid: 'Miktar alanı geçerli değil', + amount_field_is_not_valid: 'Tutar alanı geçerli değil', fee_field_is_not_valid: 'Ücret alanı geçerli değil', address_field_is_not_valid: 'Adres alanı geçerli değil', - total_exceeds_balance: 'Gönderme miktarı mevcut bakiyeyi aşıyor.', create_tx_error: 'İşlem oluşturulurken bir hata oluştu. Lütfen adresin geçerli olduğundan emin olun.', address: 'adres', - amount_placeholder: 'gönderilecek miktar (BTC cinsinden)', - fee_placeholder: 'artı işlem ücreti (BTC cinsinden)', + amount_placeholder: 'gönderilecek tutar (VLS cinsinden)', + fee_placeholder: 'artı işlem ücreti (VLS cinsinden)', note_placeholder: 'kendime not', - cancel: 'Vazgeç', + cancel: 'İptal Et', scan: 'Tara', send: 'Gönder', - create: 'Oluştur', + next: 'İleri', + note: 'Not (opsiyonel)', + to: 'Alıcı', + feeUnit: 'Sat/B', + fee: 'Ücret:', + create: 'Fatura Oluştur', remaining_balance: 'Kalan bakiye', + total_exceeds_balance: 'Gönderilen tutar kullanılabilir bakiyeyi aşıyor.', }, - confirm: { - header: 'Onayla', - sendNow: 'Şimdi gönder', - }, - success: { - done: 'Tamam', - }, + confirm: { sendNow: 'Şimdi gönder' }, create: { - details: 'Detaylar', - title: 'işlem oluştur', - error: 'İşlem yaratma hatası. Geçersiz adres veya gönderim miktarı?', - go_back: 'Geri dön', - this_is_hex: 'Bu işlemin hexi, imzalanmış ve ağa yayınlanmaya hazır.', - to: 'Kime', - amount: 'Miktar', + amount: 'Tutar', fee: 'Ücret', - tx_size: 'TX boyutu', - satoshi_per_byte: 'Bayt başına Satoshi', - memo: 'Not', - broadcast: 'Yayınla', - not_enough_fee: 'Yetersiz ücret. Ücreti arttırın', + setTransactionFee: 'Bir işlem ücreti belirle', + headerText: + 'Ağda bekleyen çok sayıda işlem olduğunda (>1500), işleminizin daha hızlı işlenmesi için gereken ücret artacaktır. Genel değerler 1-500 sat/b’dir.', }, }, receive: { - header: 'Al', + header: 'Coin al', details: { - title: 'Bu adresi ödeyenle paylaş', - share: 'paylaş', - copiedToClipboard: 'Panoya kopyalandı.', - label: 'Açıklama', - create: 'Oluştur', - setAmount: 'Miktar ile al', + amount: 'Tutar', + share: 'Paylaş', + receiveWithAmount: 'Tutarla al', }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Bitcoin Satın al', - tap_your_address: 'Panoya kopyalamak için adresinize dokunun:', - copied: 'Panoya kopyalandı!', }, settings: { - header: 'ayarlar', - plausible_deniability: 'Makul ret...', - storage_not_encrypted: 'Depolama: şifreli değil', - storage_encrypted: 'Depolama: şifreli', - password: 'Şifre', - password_explain: 'Depolamanın şifresini çözmek için kullanacağınız şifreyi oluşturun', - retype_password: 'Şifrenizi yeniden girin', - passwords_do_not_match: 'Şifreler eşleşmedi', - encrypt_storage: 'Depolamayı şifrele', - lightning_settings: 'Lightning Ayarları', - lightning_settings_explain: - 'Kendi LND düğümünüze bağlanmak için lütfen LndHubı yükleyin.' + - " ve URL’sini buraya, ayarlara yazın. BlueWallet'in LNDHub (lndhub.io) programını kullanmak için boş bırakın. Değişiklikleri kaydettikten sonra oluşturulan cüzdanlar belirtilen LNDHub'a bağlanacaktır.", - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Kaydet', - about: 'Hakkında', language: 'Dil', - currency: 'Para Birimi', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Makul Ret', - help: - 'Bazı koşullar altında, şifrenizi açıklamanız gerekebilir. ' + - 'Paralarınızı güvende tutmak için, BlueWallet başka bir şifre ile ' + - 'şifreli depolama alanı yaratabilir. Baskı altında, ' + - 'Bu şifreyi 3. bir tarafa söyleyebilirsiniz. Girilirse ' + - "BlueWallet, yeni 'sahte' bir depolamanın kilidini açacaktır. Bu 3. şahıslara " + - 'normal görünecektir, ancak paraların olduğu ana depolama alanınızı gizlice saklamaya ' + - 'devam edecektir.', - help2: 'Yeni depolama alanı tamamen işlevsel olacak ve ufak ' + 'bir miktar tutarsanız daha inanılır görünecektir.', - create_fake_storage: 'Sahte şifreli depolama oluşturun', - go_back: 'Geri Dön', - create_password: 'Şifre oluştur', - create_password_explanation: 'Sahte depolama şifreniz, ana depolama şifrenizle aynı olmamalıdır.', - password_should_not_match: 'Sahte depolama şifreniz, ana depolama şifrenizle aynı olmamalıdır', - retype_password: 'Şifrenizi yeniden yazın', - passwords_do_not_match: 'Şifreler eşleşmedi, tekrar dene', + general: 'Genel', + security: 'Güvenlik', + about: 'Hakkında', + electrumServer: 'Electrum sunucusu', + advancedOptions: 'Gelişmiş seçenekler', + changePin: 'PIN Değiştir', + fingerprintLogin: 'Parmak iziyle giriş', + aboutUs: 'Hakkımızda', + header: 'Ayarlar', + notSupportedFingerPrint: 'Cihazınız parmak izini desteklemiyor', + TouchID: 'Parmak izine izin ver', + FaceID: 'FaceID’ye izin ver', + Biometrics: 'Biometriklere izin ver', + }, + aboutUs: { + header: 'Hakkımızda', + releaseNotes: 'Sürüm notları', + runSelfTest: 'Otomatik testi çalıştır', + buildWithAwesome: 'Muhteşem özellikle oluştur:', + rateVelesWallet: 'VelesWallet’ı Puanla', + goToOurGithub: 'Github’umuza Git', + alwaysBackupYourKeys: 'Her zaman anahtarlarınızı yedekleyin', + title: 'Veles Wallet ücretsiz ve açık kaynaklı bir Cortez Vault cüzdanıdır. Lisanslı MIT.', + }, + electrumServer: { + header: 'Electrum sunucusu', + title: 'Electrum sunucusunu değiştir', + description: 'Uygulamanızın bağlanacağı sunucunun adresini değiştirebilirsiniz. Varsayılan adres önerilir.', + save: 'Kaydet', + useDefault: 'Varsayılanı kullan', + host: 'ana bilgisayar', + port: 'port', + successfullSave: + 'Değişiklikleriniz başarıyla kaydedildi. Değişikliklerin geçerli olması için yeniden başlatma gerekebilir.', + connectionError: 'Sağlanan Electrum sunucusuna bağlanılamıyor', + }, + advancedOptions: { + title: 'Gelişmiş seçenekleri yapılandır', + description: + 'Gelişmiş seçenekleri yapılandırmak aşağıda yer alan farklı cüzdan türleri arasından seçim yapmanıza imkan verir: \n' + + 'P2SH, HD P2SH, HD segwit.', + }, + selectLanguage: { + header: 'Dil', + restartInfo: + 'Yeni bir dil seçerken VelesWallet’ı yeniden başlatmak değişikliğin geçerli olması için gerekli olabilir', + confirmation: 'Onay', + confirm: 'Onayla', + alertDescription: 'Dili seçilsin ve uygulama yeniden başlatılsın mı?', + cancel: 'İptal Et', + }, + contactList: { + cancel: 'İptal Et', + search: 'Ara', + screenTitle: 'Adres Defteri', + noContacts: 'Kişi yok', + noContactsDesc1: 'Gösterilecek kişi yok. \nTıkla', + noContactsDesc2: 'İlk bağlantınızı ekleyin.', + noResults: 'Şunun için sonuç yok:', + }, + contactCreate: { + screenTitle: 'Yeni kişi ekle', + subtitle: 'Yeni kişi', + description: 'Lütfen yeni kişinizin\nadını ve adresini girin.', + nameLabel: 'Ad', + addressLabel: 'Adres', + buttonLabel: 'Yeni kişi ekle', + successTitle: 'Başarılı', + successDescription: 'Oley! Başarılı bir şekilde\nyeni kişi eklediniz.', + successButton: 'Adres defterine geri dön', + }, + contactDetails: { + nameLabel: 'Ad', + addressLabel: 'Adres', + editName: 'Adı düzenle', + editAddress: 'Adresi düzenle', + sendCoinsButton: 'Coin gönder', + showQRCodeButton: 'QR kodunu göster', + deleteButton: 'Kişiyi sil', + share: 'Paylaş', + }, + contactDelete: { + title: 'Kişinizi silin', + header: 'Kişiyi sil', + description1: 'Silmek istediğinizden emin misiniz', + description2: '?\nBu işlemi geri alamazsınız.', + no: 'Hayır', + yes: 'Evet', success: 'Başarılı', + successDescription: 'Kişiniz başarıyla silindi.\nŞimdi Adres Defterine geri dönebilirsiniz.', + successButton: 'Adres defterine geri dön', + }, + scanQrCode: { + permissionTitle: 'Kamera kullanma izni', + permissionMessage: 'Kameranızı kullanmak için izninize ihtiyacımız var.', + ok: 'Tamam', + cancel: 'İptal Et', }, - lnd: { - title: 'paraları yönet', - choose_source_wallet: 'Kaynak bir cüzdan seçin', - refill_lnd_balance: 'Lightning cüzdana bakiye yükle', - refill: 'Yükle', - withdraw: 'Çek', - expired: 'Süresi doldu', - placeholder: 'Fatura', - sameWalletAsInvoiceError: 'Bir faturayı, oluştururken kullandığınız cüzdan ile ödeyemezsiniz.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', + filterTransactions: { + header: 'işlemleri filtreleri', + receive: 'al', + send: 'gönder', + filter: 'filtrele', + to: 'alan', + toAmount: 'son tutar', + toDate: 'bitiş tarihi', + from: 'gönderen', + fromAmount: 'ilk tutar', + fromDate: 'başlangıç tarihi', + clearFilters: 'filtreleri sil', }, }; diff --git a/loc/ua.js b/loc/ua.js deleted file mode 100644 index cbce9b9f8b..0000000000 --- a/loc/ua.js +++ /dev/null @@ -1,248 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: 'Ваше сховище зашифроване. Введіть пароль для розшифровки', - enter_password: 'Введіть пароль', - bad_password: 'Невірний пароль, спробуйте ще раз', - never: 'ніколи', - continue: 'Continue', - ok: 'OK', - }, - wallets: { - options: 'options', - select_wallet: 'Select Wallet', - createBitcoinWallet: 'In order to use a Lightning wallet, a Bitcoin wallet is needed to fund it. Would you like to continue anyway?', - - list: { - app_name: 'BlueWallet', - title: 'гаманці', - header: 'Гаманець це секретний (приватний) ключ, і відповідна йому адреса на яку можна отримувати біткоїни', - add: 'Додати Гаманець', - create_a_wallet: 'Створити гаманець', - create_a_wallet1: 'Це безкоштовно і можно', - create_a_wallet2: 'створювати безліч', - latest_transaction: 'остання транзакція', - empty_txs1: "Транзакціі з'являться тут,", - empty_txs2: 'поки що жодноі', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Tap here to buy Bitcoin', - }, - reorder: { - title: 'Reorder Wallets', - }, - add: { - title: 'Додати Гаманець', - description: - 'Ви можете відсканувати QR код (у форматі WIF - Wallet Import Format), або створити новий гаманець. Segwit підтримується за умовчанням.', - scan: 'Відсканувати', - create: 'Створити', - label_new_segwit: 'Новий SegWit', - label_new_lightning: 'Новий Lightning', - wallet_name: "ім'я гаманця", - wallet_type: 'тип гаманця', - or: 'чи', - import_wallet: 'імпортувати гаманець', - imported: 'імпортовано', - coming_soon: 'Буде скоро', - lightning: 'Lightning', - bitcoin: 'Bitcoin', - }, - details: { - title: 'Інформація про Гаманець', - address: 'Адреса', - type: 'Тип', - delete: 'Delete', - save: 'Save', - label: 'Мітка', - destination: 'destination', - description: 'description', - are_you_sure: 'Ви впевнені?', - yes_delete: 'Так, видалити', - no_cancel: 'Ні, відміна', - delete_this_wallet: 'Видалити цей гаманець', - export_backup: 'Експорт / резервна копія', - buy_bitcoin: 'Buy Bitcoin', - show_xpub: 'Show wallet XPUB', - }, - export: { - title: 'Експорт Гаманця', - }, - xpub: { - title: 'wallet XPUB', - copiedToClipboard: 'Зкопіювано', - }, - import: { - title: 'імпорт', - explanation: 'Мнемоніка, приватний ключ, чи будь що. BlueWallet спробуе вгадати вірний формат', - imported: 'імпортовано', - error: 'Невдача. Це взашалі валідно?', - success: 'Успіх', - do_import: 'імпорт', - scan_qr: 'чи сканувати QR?', - }, - scanQrWif: { - go_back: 'Назад', - cancel: 'Відміна', - decoding: 'Декодую', - input_password: 'Введіть пароль', - password_explain: 'Приватний ключ зашифрований за стандартом Bip38', - bad_password: 'Невірний пароль', - wallet_already_exists: 'Такий гаманець вже існує', - bad_wif: 'Некоректний WIF', - imported_wif: 'Імпортовано WIF ', - with_address: ' з адресою ', - imported_segwit: 'Імпортований SegWit', - imported_legacy: 'Імпортований Legacy', - imported_watchonly: 'Імпортовано Watch-only', - }, - }, - transactions: { - list: { - tabBarLabel: 'Транзакції', - title: 'Мої транзакції', - description: 'Список вхідних або вихідних транзакцій ваших гаманців', - conf: 'підтв.', - }, - details: { - title: 'Деталі транзакції', - from: 'Від', - to: 'Кому', - copy: 'копія', - transaction_details: 'Transaction details', - show_in_block_explorer: 'Show in block explorer', - }, - }, - send: { - header: 'Переказ', - details: { - title: 'Створити Транзакцію', - amount_field_is_not_valid: 'Поле не валідно', - fee_field_is_not_valid: 'Поле `комісія` не валідно', - address_field_is_not_valid: 'Поле `адреса` не валідно', - receiver_placeholder: 'Адреса одержувача', - amount_placeholder: 'скільки відправити (в BTC)', - fee_placeholder: 'плюс комісія за переказ (в BTC)', - create_tx_error: 'There was an error creating the transaction. Please, make sure the address is valid.', - note_placeholder: 'примітка платежу', - cancel: 'Відміна', - scan: 'Скан QR', - send: 'Send', - total_exceeds_balance: 'total_exceeds_balance', - address: 'Address', - create: 'Створити', - remaining_balance: 'Залишок балансу', - }, - confirm: { - header: 'Confirm', - sendNow: 'Send now', - }, - success: { - done: 'Done', - }, - create: { - title: 'Створити Транзакцію', - details: 'Details', - error: 'Помилка при створенні транзакції. Невiрна адреса призначення або недостатньо коштiв?', - go_back: 'Назад', - this_is_hex: 'Це дані транзакції. Транзакція підписана і готова бути трансльована в мережу. Продовжити?', - to: 'Куди', - amount: 'Скільки', - fee: 'Комісія', - tx_size: 'Розмір', - satoshi_per_byte: 'Сатоші на байт', - memo: 'Примітка', - broadcast: 'Відправити', - not_enough_fee: 'Недостатньо комісіі. Збільште комісію', - }, - }, - receive: { - header: 'Отримати', - details: { - title: 'Покажіть цю адресу платникові', - share: 'Відправити', - copiedToClipboard: 'Зкопіювано', - label: 'Description', - create: 'Create', - setAmount: 'Receive with amount', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Buy Bitcoin', - tap_your_address: 'Tap your address to copy it to clipboard:', - copied: 'Copied to Clipboard!', - }, - settings: { - tabBarLabel: 'Налаштування', - header: 'Налаштування', - plausible_deniability: 'Правдоподібне заперечення...', - storage_not_encrypted: 'Сховище: не зашифровано', - storage_encrypted: 'Сховище: зашифровано', - password: 'Пароль', - password_explain: 'Придумайте пароль для розшифровки сховища', - retype_password: 'Наберіть пароль ще раз', - passwords_do_not_match: 'Паролі не збігаються', - encrypt_storage: 'Зашифрувати сховище', - lightning_settings: 'Lightning settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - ' and put its URL here in settings. Leave blank to use default ' + - 'ndHub\n (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'save', - about: 'Про програму', - language: 'Мова', - currency: 'Валюта', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Правдоподібне Заперечення', - help: - 'При певних обставинах вас можуть змусити розкрити пароль. ' + - 'Щоб зберегти ваші біткоїни в безпеці, Bluewallet може створити ' + - 'ще одне зашифроване сховище, з іншим паролем. Під тиском, ' + - 'ви можете розкрити третім особам цей пароль. Якщо ввести цей пароль ' + - "Bluewallet, розблоковується 'фальшиве' сховище. Це виглядатиме " + - 'правдоподібно для третіх осіб, але при цьому збереже ваше основне сховище ' + - 'з біткоїнамі в безпеці.', - help2: - 'Нове сховище буде повністю функціональним і ви навіть можете зберігати на ньому небагато біткоїнов ' + - 'щоб це виглядало правдоподібніше.', - create_fake_storage: 'Створити фальшиве сховище', - go_back: 'Назад', - create_password: 'Придумайте пароль', - create_password_explanation: 'Пароль для фальшивого сховіща не має буті таким же як основній пароль', - password_should_not_match: 'Пароль для фальшивого сховища не має бути таким же як основний пароль', - retype_password: 'Наберіть пароль ще раз', - passwords_do_not_match: 'Паролі не збігаються, спробуйте ще раз', - success: 'Операція успішна', - }, - lnd: { - title: 'мої кошти', - choose_source_wallet: 'Оберіть гаманець с якого слати', - refill_lnd_balance: 'Збільшити баланс Lightning гаманця', - refill: 'Поповнити', - placeholder: 'Invoice', - withdraw: 'Вивести', - expired: 'Expired', - sameWalletAsInvoiceError: 'You can not pay an invoice with the same wallet used to create it.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/loc/vi_VN.js b/loc/vi_VN.js index a27162b10f..19bc3649fe 100644 --- a/loc/vi_VN.js +++ b/loc/vi_VN.js @@ -1,244 +1,351 @@ module.exports = { _: { - storage_is_encrypted: 'Lưu trữ của bạn được mã hoá. Mật khẩu được yêu cầu để giải mã', - enter_password: 'Enter password', - bad_password: 'Bad password, try again', - never: 'never', - continue: 'Continue', + languageCode: 'vi', + storage_is_encrypted: 'Ví lưu trữ của quý khách đã được mã hóa. Cần có mật khẩu để giải mã', + enter_password: 'Nhập mật khẩu', + bad_password: 'Mật khẩu kém, hãy thử lại', + never: 'không bao giờ', + continue: 'Tiếp tục', ok: 'OK', + click: 'Nhấn', + here: 'tại đây', + save: 'Lưu', + confirm: 'Xác nhận', + copy: 'Sao chép ', + copied: 'Đã sao chép!', + }, + tabNavigator: { + dashboard: 'Bảng điều khiển', + settings: 'Cài đặt', + addressBook: 'Sổ địa chỉ', + }, + message: { + somethingWentWrong: 'Đã xảy ra lỗi', + somethingWentWrongWhileCreatingWallet: + 'Đã xảy ra lỗi khi chúng tôi tạo ví cho quý khách. Vui lòng quay lại Bảng điều khiển và thử lại.', + success: 'Thành công', + successfullWalletImport: + 'Ví của quý khách đã được nhập thành công. Bây giờ quý khách có thể quay lại Bảng điều khiển.', + successfullWalletDelete: + 'Ví của quý khách đã được xóa thành công. Bây giờ quý khách có thể quay lại Bảng điều khiển.', + returnToDashboard: 'Quay lại Bảng điều khiển', + creatingWallet: 'Tạo ví của quý khách', + creatingWalletDescription: + 'Vui lòng đợi trong khi chúng tôi tạo ví cho quý khách. Quá trình này có thể mất một thời gian.', + }, + onboarding: { + onboarding: 'Cài đặt ', + pin: 'PIN', + createPin: 'Tạo PIN', + createNewPin: 'PIN mới', + createPassword: 'Tạo mật khẩu cho giao dịch', + createPinDescription: + 'Mã PIN của quý khách sẽ được sử dụng để đăng nhập vào ứng dụng. Quý khách có thể thay đổi nó trong phần Cài đặt.', + confirmPin: 'Xác nhận PIN ', + confirmNewPin: 'Xác nhận PIN mới ', + confirmPassword: 'Xác nhận mật khẩu cho giao dịch', + passwordDoesNotMatch: 'Mật khẩu không khớp. Xin vui lòng nhập mật khẩu có hiệu lực.', + createPasswordDescription: + 'Mật khẩu cho giao dịch của quý khách sẽ được sử dụng để xác nhận tất cả các giao dịch. Quý khách không thể thay đổi nó. Mật khẩu giao dịch phải chứa ít nhất 8 ký tự chữ và số.', + changePin: 'Thay đổi PIN', + currentPin: 'PIN hiện tại', + pinDoesNotMatch: 'PIN không khớp. Xin vui lòng nhập PIN có hiệu lực.', + successDescription: 'Hooray! \nQuý khách đã tạo thành công PIN của mình.', + successDescriptionChangedPin: 'Hooray!\nQuý khách đã thay đổi thành công PIN của mình.', + successButton: 'Đi đến Bảng điều khiển ', + successButtonChangedPin: 'Quay về Cài đặt', + }, + unlock: { + title: 'Mở khóa ', + touchID: 'Chạm ID cho “Veles Wallet”', + confirmButton: 'Xác nhận dấu vân tay để tiếp tục.', + enter: 'Nhập PIN', + }, + unlockTransaction: { + headerText: 'Xác nhận giao dịch ', + title: 'Xác nhận mật khẩu cho giao dịch', + description: 'Xác nhận mật khẩu giao dịch để xử lý giao dịch. ', }, wallets: { - select_wallet: 'Select Wallet', - options: 'options', - createBitcoinWallet: - 'You currently do not have a Bitcoin wallet. In order to fund a Lightning wallet, a Bitcoin wallet needs to be created or imported. Would you like to continue anyway?', - list: { - app_name: 'BlueWallet', - title: 'wallets', - header: 'A wallet represents a pair of a secret (private key) and an address' + 'you can share to receive coins.', - add: 'Add Wallet', - create_a_wallet: 'Create a wallet', - create_a_wallet1: "It's free and you can create", - create_a_wallet2: 'as many as you like', - latest_transaction: 'latest transaction', - empty_txs1: 'Your transactions will appear here,', - empty_txs2: 'none at the moment', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: 'Tap here to buy Bitcoin', + dashboard: { + title: 'Ví', + allWallets: 'Tất cả ví', + noWallets: 'Không có ví', + noWalletsDesc1: 'Không có ví nào.', + noWalletsDesc2: ' thêm ví đầu tiên của quý khách.', + send: 'Gửi coin', + receive: 'Nhận coin', + noTransactions: 'Không có giao dịch nào.', + }, + walletModal: { btcv: 'VLS', wallets: 'Ví' }, + importWallet: { + title: 'Nhập ví của quý khách', + header: 'Nhập ví', + subtitle: + 'Viết ra đây những thông tin cần ghi nhớ, khóa riêng tư, WIF hoặc bất cứ thông tin gì quý khách có được. VelesWallet tìm mọi cách để đoán đúng định dạng và nhập ví của quý khách.', + placeholder: 'Thông tin ghi nhớ, khóa riêng tư, WIF', + import: 'Nhập', + scanQrCode: 'hoặc quét mã QR', + walletInUseValidationError: 'Ví đã được sử dụng. Vui lòng nhập ví hợp lệ.', }, - reorder: { - title: 'Reorder Wallets', + exportWallet: { title: 'Cụm từ ghi nhớ', header: 'Xuất ví' }, + exportWalletXpub: { header: 'Ví XPUB' }, + deleteWallet: { + title: 'Xóa ví của quý khách', + header: 'Xóa ví', + description1: 'Quý khách có chắc chắn muốn xóa không', + description2: '? Quý khách không thể hoàn tác hành động này.', + no: 'Không', + yes: 'Có', }, + wallet: { none: 'Không có', latest: 'Giao dịch mới nhất' }, add: { - title: 'add wallet', + title: 'Thêm ví mới', + subtitle: 'Đặt tên cho ví của quý khách', + description: 'Vui lòng nhập tên cho ví mới của quý khách.', + inputLabel: 'Tên', + addWalletButton: 'Thêm ví mới', + importWalletButton: 'Nhập ví', + advancedOptions: 'Tùy chọn nâng cao', + multipleAddresses: 'Nhiều địa chỉ', + singleAddress: 'Một địa chỉ', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: 'Nó chứa một cây bao gồm các địa chỉ ví segwit, được tạo từ một hạt giống 24 từ duy nhất', + }, + addSuccess: { + title: 'Thêm ví mới', + subtitle: 'Thành công', description: - 'You can either scan backup paper wallet (in WIF - Wallet Import Format), or create a new wallet. Segwit wallets supported by default.', - scan: 'Scan', - create: 'Create', - label_new_segwit: 'New SegWit', - label_new_lightning: 'New Lightning', - wallet_name: 'name', - wallet_type: 'type', - or: 'or', - import_wallet: 'Import wallet', - imported: 'Imported', - coming_soon: 'Coming soon', - lightning: 'Lightning', - bitcoin: 'Bitcoin', + 'Ví của quý khách đã được tạo. Vui lòng dành thời gian để viết cụm từ ghi nhớ này ra một tờ giấy. Đó là tờ sao lưu của quý khách. Quý khách có thể sử dụng nó để khôi phục ví trên các thiết bị khác.', + okButton: 'OK, tôi đã viết nó ra!', }, details: { - title: 'Wallet', - address: 'Address', - type: 'Type', - label: 'Label', - destination: 'destination', - description: 'description', - are_you_sure: 'Are you sure?', - yes_delete: 'Yes, delete', - no_cancel: 'No, cancel', - delete: 'Delete', - save: 'Save', - delete_this_wallet: 'Delete this wallet', - export_backup: 'Export / backup', - buy_bitcoin: 'Buy Bitcoin', - show_xpub: 'Show wallet XPUB', - }, - export: { - title: 'wallet export', - }, - xpub: { - title: 'wallet XPUB', - copiedToClipboard: 'Copied to clipboard.', + edit: 'Chỉnh sửa', + latestTransaction: 'Giao dịch mới nhất', + typeLabel: 'Loại', + nameLabel: 'Tên', + exportWallet: 'Xuất ví', + showWalletXPUB: 'Hiển thị ví XPUB', + deleteWallet: 'Xóa ví', + nameEdit: 'Chỉnh sửa tên', }, + export: { title: 'xuất ví' }, import: { - title: 'import', + title: 'nhập', explanation: - "Write here your mnemonic, private key, WIF, or anything you've got. BlueWallet will do its best to guess the correct format and import your wallet", - imported: 'Imported', - error: 'Failed to import. Please, make sure that the provided data is valid.', - success: 'Success', - do_import: 'Import', - scan_qr: 'or scan QR code instead?', + 'Viết ra đây thông tin ghi nhớ, khóa riêng tư, WIF hoặc bất cứ thông tin gì quý khách có được. VelesWallet tìm mọi cách để đoán đúng định dạng và nhập ví của quý khách.', + imported: 'Đã nhập', + error: 'Không nhập được. Vui lòng đảm bảo rằng dữ liệu được cung cấp là hợp lệ.', + success: 'Thành công', + do_import: 'Nhập', + scan_qr: 'hoặc quét mã QR?', }, scanQrWif: { - go_back: 'Go Back', - cancel: 'Cancel', - decoding: 'Decoding', - input_password: 'Input password', - password_explain: 'This is BIP38 encrypted private key', - bad_password: 'Bad password', - wallet_already_exists: 'Such wallet already exists', - bad_wif: 'Bad WIF', - imported_wif: 'Imported WIF ', - with_address: ' with address ', - imported_segwit: 'Imported SegWit', - imported_legacy: 'Imported Legacy', - imported_watchonly: 'Imported Watch-only', + go_back: 'Quay lại', + cancel: 'Hủy', + decoding: 'Giải mã', + input_password: 'Nhập mật khẩu', + password_explain: 'Đây là khóa mật được mã hóa BIP38', + bad_password: 'Mật khẩu kém', + wallet_already_exists: 'Ví này đã tồn tại', + bad_wif: 'WIF kém', + imported_wif: 'WIF đã nhập', + with_address: 'có địa chỉ', + imported_segwit: 'SegWit đã nhập', + imported_legacy: 'Legacy đã nhập', + imported_watchonly: 'Watch-only đã nhập', }, }, transactions: { - list: { - tabBarLabel: 'Transactions', - title: 'transactions', - description: 'A list of ingoing or outgoing transactions of your wallets', - conf: 'conf', - }, + list: { conf: 'Xác nhận' }, details: { - title: 'Transaction', - from: 'Input', - to: 'Output', - copy: 'Copy', - transaction_details: 'Transaction details', - show_in_block_explorer: 'View in block explorer', + title: 'Giao dịch', + detailTitle: 'Chi tiết giao dịch', + transactionHex: 'Hex giao dịch', + transactionHexDescription: 'Đây là mã hex giao dịch, đã ký và sẵn sàng để phát lên mạng', + copyAndBoriadcast: 'Sao chép và phát sau', + verify: 'Xác minh trên coinb.in', + amount: 'Số tiền', + fee: 'Phí', + txSize: 'Kích thước TX', + satoshiPerByte: 'Satoshi mỗi byte', + from: 'Từ', + to: 'Đến', + bytes: 'byte', + copy: 'Sao chép', + noLabel: 'Không có nhãn', + details: 'Chi tiết', + transactionId: 'ID giao dịch', + confirmations: 'xác nhận', + transactionDetails: 'Chi tiết giao dịch', + viewInBlockRxplorer: 'Xem trong block explorer (công cụ phân tích khối)', + addNote: 'Thêm ghi chú', + note: 'Ghi chú', + inputs: 'Đầu vào', + ouputs: 'Đầu ra', + sendCoins: 'Gửi coin', }, }, send: { - header: 'Send', - details: { - title: 'create transaction', - amount_field_is_not_valid: 'Amount field is not valid', - fee_field_is_not_valid: 'Fee field is not valid', - address_field_is_not_valid: 'Address field is not valid', - total_exceeds_balance: 'The sending amount exceeds the available balance.', - create_tx_error: 'There was an error creating the transaction. Please, make sure the address is valid.', - address: 'address', - amount_placeholder: 'amount to send (in BTC)', - fee_placeholder: 'plus transaction fee (in BTC)', - note_placeholder: 'note to self', - cancel: 'Cancel', - scan: 'Scan', - send: 'Send', - create: 'Create', - remaining_balance: 'Remaining balance', - }, - confirm: { - header: 'Confirm', - sendNow: 'Send now', - }, + header: 'Gửi coin', success: { - done: 'Done', + title: 'Thành công', + description: 'Xin chúc mừng! Quý khách đã hoàn tất giao dịch thành công.', + done: 'Xong', + return: 'Quay lại Bảng điều khiển', }, + details: { + title: 'tạo giao dịch', + amount_field_is_not_valid: 'Số tiền không hợp lệ', + fee_field_is_not_valid: 'Phí không hợp lệ', + address_field_is_not_valid: 'Địa chỉ không hợp lệ', + create_tx_error: 'Đã xảy ra lỗi khi tạo giao dịch. Vui lòng đảm bảo địa chỉ là hợp lệ.', + address: 'địa chỉ', + amount_placeholder: 'số tiền cần gửi (tính bằng VLS)', + fee_placeholder: 'cộng với phí giao dịch (tính bằng VLS)', + note_placeholder: 'ghi chú cho bản thân', + cancel: 'Hủy', + scan: 'Quét', + send: 'Gửi', + next: 'Tiếp theo', + note: 'Lưu ý (tùy chọn)', + to: 'đến', + feeUnit: 'Sat/B', + fee: 'Phí:', + create: 'Tạo hóa đơn', + remaining_balance: 'Số dư còn lại', + total_exceeds_balance: 'Số tiền gửi vượt quá số dư khả dụng.', + }, + confirm: { sendNow: 'Gửi ngay' }, create: { - details: 'Details', - title: 'create transaction', - error: 'Error creating transaction. Invalid address or send amount?', - go_back: 'Go Back', - this_is_hex: 'This is transaction hex, signed and ready to be broadcast to the network.', - to: 'To', - amount: 'Amount', - fee: 'Fee', - tx_size: 'TX size', - satoshi_per_byte: 'Satoshi per byte', - memo: 'Memo', - broadcast: 'Broadcast', - not_enough_fee: 'Not enough fee. Increase the fee', + amount: 'Số tiền', + fee: 'Phí', + setTransactionFee: 'Đặt phí giao dịch', + headerText: + 'Khi đang có một lượng lớn giao dịch đang chờ xử lý trên mạng (>1500), việc đặt phí cao hơn sẽ giúp giao dịch của quý khách được xử lý nhanh hơn. Giá trị thông thường là 1-500 sat/b', }, }, receive: { - header: 'Receive', + header: 'Nhận coin', details: { - title: 'Share this address with payer', - share: 'share', - copiedToClipboard: 'Copied to clipboard.', - label: 'Description', - create: 'Create', - setAmount: 'Receive with amount', + amount: 'Số tiền', + share: 'Chia sẻ', + receiveWithAmount: 'Nhận với số tiền', }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: 'Buy Bitcoin', - tap_your_address: 'Tap your address to copy it to clipboard:', - copied: 'Copied to Clipboard!', }, settings: { - header: 'settings', - plausible_deniability: 'Plausible deniability...', - storage_not_encrypted: 'Storage: not encrypted', - storage_encrypted: 'Storage: encrypted', - password: 'Password', - password_explain: 'Create the password you will use to decrypt the storage', - retype_password: 'Re-type password', - passwords_do_not_match: 'Passwords do not match', - encrypt_storage: 'Encrypt storage', - lightning_settings: 'Lightning Settings', - lightning_settings_explain: - 'To connect to your own LND node please install LndHub' + - " and put its URL here in settings. Leave blank to use BlueWallet's LNDHub (lndhub.io). Wallets created after saving changes will connect to the specified LNDHub.", - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', - save: 'Save', - about: 'About', - language: 'Language', - currency: 'Currency', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: 'Plausible Deniability', - help: - 'Under certain circumstances, you might be forced to disclose a ' + - 'password. To keep your coins safe, BlueWallet can create another ' + - 'encrypted storage, with a different password. Under pressure, ' + - 'you can disclose this password to a 3rd party. If entered in ' + - "BlueWallet, it will unlock new 'fake' storage. This will seem " + - 'legit to a 3rd party, but will secretly keep your main storage ' + - 'with coins safe.', - help2: 'New storage will be fully functional, and you can store some ' + 'minimum amounts there so it looks more believable.', - create_fake_storage: 'Create fake encrypted storage', - go_back: 'Go Back', - create_password: 'Create a password', - create_password_explanation: 'Password for fake storage should not match password for your main storage', - password_should_not_match: 'Password for fake storage should not match password for your main storage', - retype_password: 'Retype password', - passwords_do_not_match: 'Passwords do not match, try again', - success: 'Success', - }, - lnd: { - title: 'manage funds', - choose_source_wallet: 'Choose a source wallet', - refill_lnd_balance: 'Refill Lightning wallet balance', - refill: 'Refill', - withdraw: 'Withdraw', - expired: 'Expired', - placeholder: 'Invoice', - sameWalletAsInvoiceError: 'You can not pay an invoice with the same wallet used to create it.', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', + language: 'Ngôn ngữ', + general: 'Thông tin chung', + security: 'Bảo mật', + about: 'Khoảng', + electrumServer: 'Máy chủ Electrum', + advancedOptions: 'Tùy chọn nâng cao', + changePin: 'Thay đổi mã PIN', + fingerprintLogin: 'Đăng nhập bằng dấu vân tay', + aboutUs: 'Giới thiệu', + header: 'Cài đặt', + notSupportedFingerPrint: 'Thiết bị của quý khách không hỗ trợ vân tay', + TouchID: 'Cho phép nhận dạng vân tay', + FaceID: 'Cho phép nhận dạng ID khuôn mặt', + Biometrics: 'Cho phép sinh trắc học ', + }, + aboutUs: { + header: 'Giới thiệu', + releaseNotes: 'Thông tin về phiên bản', + runSelfTest: 'Chạy tự kiểm tra', + buildWithAwesome: 'Xây dựng với:', + rateVelesWallet: 'Đánh giá VelesWallet', + goToOurGithub: 'Chuyển đến Github của chúng tôi', + alwaysBackupYourKeys: 'Hãy luôn sao lưu mã khóa của quý khách', + title: 'VelesWallet là ví Cortez Vault miễn phí và mã nguồn mở. MIT được cấp phép.', + }, + electrumServer: { + header: 'Máy chủ Electrum', + title: 'Thay đổi máy chủ electrum', + description: + 'Quý khách có thể thay đổi địa chỉ của máy chủ mà ứng dụng của quý khách kết nối. Địa chỉ mặc định được khuyên dùng.', + save: 'Lưu', + useDefault: 'Sử dụng mặc định', + host: 'host', + port: 'cổng', + successfullSave: + 'Những thay đổi của quý khách đã được lưu thành công. Có thể cần khởi động lại để thay đổi có hiệu lực.', + connectionError: 'Không thể kết nối với máy chủ Electrum được cung cấp', + }, + advancedOptions: { + title: 'Cấu hình tùy chọn nâng cao', + description: + 'Bật tùy chọn nâng cao sẽ cho phép quý khách chọn từ các loại ví được liệt kê bên dưới: P2SH, HD P2SH, HD segwit.', + }, + selectLanguage: { + header: 'Ngôn ngữ', + restartInfo: 'Khi chọn ngôn ngữ mới, có thể cần khởi động lại VelesWallet để thay đổi có hiệu lực', + confirmation: 'Xác nhận', + confirm: 'Xác nhận', + alertDescription: 'Chọn ngôn ngữ và khởi động lại ứng dụng?', + cancel: 'Hủy', + }, + contactList: { + cancel: 'Hủy', + search: 'Tìm kiếm', + screenTitle: 'Sổ địa chỉ', + noContacts: 'Không có thông tin liên lạc', + noContactsDesc1: 'Không có thông tin liên lạc nào. \nNhấp vào', + noContactsDesc2: 'để thêm thông tin liên lạc đầu tiên của quý khách.', + noResults: 'Không có kết quả cho', + }, + contactCreate: { + screenTitle: 'Thêm thông tin liên lạc mới', + subtitle: 'Thông tin liên lạc mới', + description: 'Vui lòng nhập tên và địa chỉ\ncho thông tin liên lạc mới của quý khách.', + nameLabel: 'Tên', + addressLabel: 'Địa chỉ', + buttonLabel: 'Thêm thông tin liên lạc mới', + successTitle: 'Thành công', + successDescription: 'Xin chúc mừng! Quý khách đã thêm thông tin\nliên lạc thành công.', + successButton: 'Quay lại Sổ địa chỉ', + }, + contactDetails: { + nameLabel: 'Tên', + addressLabel: 'Địa chỉ', + editName: 'Chỉnh sửa tên', + editAddress: 'Sửa địa chỉ', + sendCoinsButton: 'Gửi coin', + showQRCodeButton: 'Hiển thị mã QR', + deleteButton: 'Xóa thông tin liên lạc', + share: 'Chia sẻ', + }, + contactDelete: { + title: 'Xóa thông tin liên lạc của quý khách', + header: 'Xóa thông tin liên lạc', + description1: 'Quý khách có chắc chắn muốn xóa không', + description2: '?\nQuý khách không thể hoàn tác hành động này.', + no: 'Không', + yes: 'Có', + success: 'Thành công', + successDescription: + 'Thông tin liên lạc của quý khách đã được xóa thành công.\n' + 'Bây giờ quý khách có thể quay lại Sổ địa chỉ.', + successButton: 'Quay lại Sổ địa chỉ', + }, + scanQrCode: { + permissionTitle: 'Quyền sử dụng máy ảnh', + permissionMessage: 'Chúng tôi cần quý khách cho phép để sử dụng máy ảnh của quý khách', + ok: 'Ok', + cancel: 'Hủy', + }, + filterTransactions: { + header: 'lọc giao dịch', + receive: 'nhận', + send: 'gửi', + filter: 'lọc ', + to: 'đến', + toAmount: 'đến số tiền ', + toDate: 'đến ngày', + from: 'từ', + fromAmount: 'từ số tiền ', + fromDate: 'từ ngày', + clearFilters: 'xóa lọc ', }, }; diff --git a/loc/zh_cn.js b/loc/zh_cn.js index 956754b2e7..b4a1a8debb 100755 --- a/loc/zh_cn.js +++ b/loc/zh_cn.js @@ -1,238 +1,331 @@ module.exports = { _: { - storage_is_encrypted: '你的信息已经被加密, 请输入密码解密', + languageCode: 'zh-cn', + storage_is_encrypted: '储存空间已加密。需要输入密码进行解密', enter_password: '输入密码', - bad_password: '密码无效,请重试', - never: '不', + bad_password: '密码错误,请重试', + never: '取消', continue: '继续', - ok: '好的', + ok: '确认', + click: '点击', + here: '这里', + save: '保存', + confirm: '确认', + copy: '负责', + copied: '已复制!', + }, + tabNavigator: { + dashboard: '仪表盘', + settings: '设置', + addressBook: '地址簿', + }, + message: { + somethingWentWrong: '出问题了', + somethingWentWrongWhileCreatingWallet: '钱包创建发生错误。请返回控制面板重新尝试。', + success: '操作成功', + successfullWalletImport: '您的钱包已成功导入。您现在可以返回控制面板。', + successfullWalletDelete: '您的钱包已成功删除。您现在可以返回控制面板。', + returnToDashboard: '返回控制面板', + creatingWallet: '创建钱包', + creatingWalletDescription: '创建钱包时请耐心等待。可能需要一些时间。', }, + onboarding: { + onboarding: '初始设置', + pin: 'PIN', + createPin: '创建PIN', + createNewPin: '新的PIN', + createPassword: '创建交易密码', + createPinDescription: '您的PIN将用于登录应用。您之后可在设置一栏更改。', + confirmPin: '确认PIN', + confirmNewPin: '确认新的PIN', + confirmPassword: '确认交易密码', + passwordDoesNotMatch: '密码不匹配,请输入有效的密码。', + createPasswordDescription: + '您的交易密码将用于验证所有交易。您之后将无法更改。交易密码必须包含至少8位字母数字字符。', + changePin: '更改PIN', + currentPin: '现用PIN', + pinDoesNotMatch: 'PIN不匹配。请输入有效的PIN。', + successDescription: '好极了!\n您已经成功创建了您的PIN。', + successDescriptionChangedPin: '好极了!\n您已经成功修改了您的PIN。', + successButton: '前往仪表盘', + successButtonChangedPin: '返回设置', + }, + unlock: { + title: '解锁', + touchID: 'Touch ID用于“Veles Wallet”', + confirmButton: '确认指纹以继续。', + enter: '输入PIN', + }, + unlockTransaction: { headerText: '确认交易', title: '确认交易密码', description: '确认交易密码以便进行交易。' }, wallets: { - select_wallet: '选择钱包', - options: '选项', - createBitcoinWallet: '您当前没有bitcoin钱包. 为了支持闪电钱包, 我们需要创建或者导入一个比特币钱包. 是否需要继续?', - list: { - app_name: 'BlueWallet', + dashboard: { title: '钱包', - header: '一个钱包代表一对的私钥和地址' + '你可以通过分享收款.', - add: '添加钱包', - create_a_wallet: '创建一个钱包', - create_a_wallet1: '创建钱包是免费的,你可以', - create_a_wallet2: '想创建多少就创建多少个', - latest_transaction: '最近的转账', - empty_txs1: '你的转账信息将展示在这里', - empty_txs2: '当前无信息', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: '点击购买比特币', + allWallets: '所有钱包', + noWallets: '无钱包', + noWalletsDesc1: '无钱包可展示。', + noWalletsDesc2: '添加首个钱包。', + send: '汇出比特币', + receive: '接收比特币', + noTransactions: '无交易可展示。', }, - reorder: { - title: '重新排列钱包', + walletModal: { btcv: '比特币Vault', wallets: '钱包' }, + importWallet: { + title: '导入您的钱包', + header: '导入钱包', + subtitle: '请在此处写下您的助记词、WIF或者私钥等。VelesWallet会尽力猜测正确的格式并导入您的钱包。', + placeholder: '助记词、私钥、WIF', + import: '导入', + scanQrCode: '或扫描二维码', + walletInUseValidationError: '钱包已使用。请输入有效的钱包。', }, - add: { - title: '添加钱包', - description: '你可以扫描你的纸质备份钱包 (WIF格式), 或者创建一个新钱包. 默认支持隔离见证钱包', - scan: '扫描', - create: '创建', - label_new_segwit: '新隔离见证(Segwit)', - label_new_lightning: '新闪电', - wallet_name: '钱包名称', - wallet_type: '类型', - or: '或', - import_wallet: '导入钱包', - imported: '已经导入', - coming_soon: '即将来临', - lightning: '闪电', - bitcoin: '比特币', + exportWallet: { title: '助记词', header: '退出钱包' }, + exportWalletXpub: { header: '钱包扩展公钥 (XPUB)' }, + deleteWallet: { + title: '删除您的钱包', + header: '删除钱包', + description1: '是否确认删除', + description2: '?删除后无法撤销。', + no: '否', + yes: '是', }, - details: { - title: '钱包', - address: '地址', - type: '类型', - label: '标签', - destination: '目的', - description: '描述', - are_you_sure: '你确认么?', - yes_delete: '是的,删除', - no_cancel: '不,取消', - delete: '删除', - save: '保存', - delete_this_wallet: '删除这个钱包', - export_backup: '导出备份', - buy_bitcoin: '购买比特币', - show_xpub: '展示钱包 XPUB', + wallet: { none: '取消', latest: '最新交易' }, + add: { + title: '添加新的钱包', + subtitle: '命名您的钱包', + description: '请为您的新钱包输入名称。', + inputLabel: '名称', + addWalletButton: '添加新的钱包', + importWalletButton: '导入钱包', + advancedOptions: '高级选项', + multipleAddresses: '多个地址', + singleAddress: '单个地址', + singleSegwitAddress: 'It contains a single native segwit address', + singleLegacyAddress: 'It cointains a single legacy address', + legacyAddress: 'It contains a tree of legacy addresses, generated from a single 24-word seed', + segwidAddress: '它包含一系列的由单一的24词种子生成的本地segwit地址', }, - export: { - title: '钱包导出', + addSuccess: { + title: '添加新的钱包', + subtitle: '操作成功', + description: + '您的钱包已创建。请花费一点时间在纸上写下这个助记词。这是您的备份。您可以在其它设备上使用备份来恢复钱包。', + okButton: '好的,我写完了!', }, - xpub: { - title: '钱包 XPUB', - copiedToClipboard: '复制到粘贴板.', + details: { + edit: '编辑', + latestTransaction: '最新交易', + typeLabel: '类型', + nameLabel: '名称', + exportWallet: '导出钱包', + showWalletXPUB: '显示钱包扩展公钥 (XPUB)', + deleteWallet: '删除钱包', + nameEdit: '编辑名称', }, + export: { title: '钱包导出' }, import: { title: '导入', - explanation: '输入你的助记词,私钥或者WIF, 或者其他格式的数据. BlueWallet将尽可能的自动识别数据格式并导入钱包', - imported: '已经导入', - error: '导入失败,请确认你提供的信息是有效的', - success: '成功', + explanation: '请在此处写下您的助记词、私钥、WIF等。VelesWallet会尽力猜测正确的格式并导入您的钱包', + imported: '已导入', + error: '导入失败。请确认提供的数据有效。', + success: '操作成功', do_import: '导入', - scan_qr: '或扫面二维码', + scan_qr: '或扫描二维码?', }, scanQrWif: { - go_back: '回退', + go_back: '返回', cancel: '取消', - decoding: '解码中', + decoding: '解码', input_password: '输入密码', - password_explain: '这是一个BIP38加密的私钥', + password_explain: '这是 BIP38 加密的私钥', bad_password: '密码错误', - wallet_already_exists: '当前钱包已经存在', - bad_wif: 'WIF格式无效', - imported_wif: 'WIF已经导入', - with_address: ' 地址为', - imported_segwit: 'SegWit已经导入', - imported_legacy: 'Legacy已经导入', - imported_watchonly: '导入只读', + wallet_already_exists: '此钱包已存在', + bad_wif: 'WIF错误', + imported_wif: '已导入WIF', + with_address: '和地址', + imported_segwit: '已导入隔离见证', + imported_legacy: '已导入Legacy', + imported_watchonly: '已导入 Watch-only 监视钱包', }, }, transactions: { - list: { - tabBarLabel: '转账', - title: '转账', - description: '当前所有钱包的转入和转出记录', - conf: '配置', - }, + list: { conf: '确认' }, details: { - title: '转账', - from: '输入', - to: '输出', + title: '交易', + detailTitle: '交易详情', + transactionHex: '十六进制字符串交易标识符', + transactionHexDescription: '这是十六进制字符串交易标识符,已签名并准备发送到网络', + copyAndBoriadcast: '稍后复制和发送', + verify: '在 coinb.in 上验证', + amount: '金额', + fee: '手续费', + txSize: '交易大小', + satoshiPerByte: '每字节聪', + from: '从', + to: '到', + bytes: '字节', copy: '复制', - transaction_details: '转账详情', - show_in_block_explorer: '区块浏览器展示', + noLabel: '无标签', + details: '详情', + transactionId: '交易 ID', + confirmations: '确认', + transactionDetails: '交易详情', + viewInBlockRxplorer: '在区块浏览器中查看', + addNote: '添加备注', + note: '备注', + inputs: '输入', + ouputs: '输出', + sendCoins: '汇出币', }, }, send: { - header: '发送', + header: '汇出币', + success: { + title: '操作成功', + description: '太好了!您已成功完成交易。', + done: '完成', + return: '返回控制面板', + }, details: { title: '创建交易', - amount_field_is_not_valid: '金额格式无效', - fee_field_is_not_valid: '费用格式无效', - address_field_is_not_valid: '地址内容无效', - total_exceeds_balance: '余额不足', - create_tx_error: '创建交易失败. 请确认地址格式正确.', + amount_field_is_not_valid: '金额字段无效', + fee_field_is_not_valid: '手续费字段无效', + address_field_is_not_valid: '地址字段无效', + create_tx_error: '交易创建出现错误。请确保地址有效。', address: '地址', - amount_placeholder: '发送金额(in BTC)', - fee_placeholder: '手续费用 (in BTC)', - note_placeholder: '消息', + amount_placeholder: '汇款金额(比特币Vault)', + fee_placeholder: '加上交易手续费(比特币Vault)', + note_placeholder: '自我备注', cancel: '取消', scan: '扫描', - send: '发送', - create: '创建', - remaining_balance: '剩余金额', - }, - confirm: { - header: '确认', - sendNow: '现在发送', - }, - success: { - done: '完成', + send: '汇款', + next: '下一个', + note: '备注(可选)', + to: '到', + feeUnit: 'Sat/B', + fee: '手续费:', + create: '创建发票', + remaining_balance: '余额', + total_exceeds_balance: '汇出额超出可用余额。', }, + confirm: { sendNow: '立即汇出' }, create: { - details: '详情', - title: '创建详情', - error: '创建交易失败. 无效地址或金额?', - go_back: '回退', - this_is_hex: '这个是交易的十六进制数据, 签名并广播到全网络.', - to: '到', amount: '金额', fee: '手续费', - tx_size: '交易大小', - satoshi_per_byte: '葱每byte', - memo: '消息', - broadcast: '广播', - not_enough_fee: '手续费不够,请增加手续费', + setTransactionFee: '设定交易手续费', + headerText: '当网络上存在大量未处理交易时 (>1500),较高的手续费可加快您的交易处理速度。典型值为 1-500 sat/b', }, }, receive: { - header: '收款', - details: { - title: '分享这个地址给付款人', - share: '分享', - copiedToClipboard: '复制到粘贴板.', - label: '描述', - create: '创建', - setAmount: '收款金额', - }, - scan_lnurl: 'Scan to receive', - }, - buyBitcoin: { - header: '购买比特币', - tap_your_address: '点击地址复制到粘贴板:', - copied: '复制到粘贴板!', + header: '接收币', + details: { amount: '金额', share: '分享', receiveWithAmount: '接收金额' }, }, settings: { + language: '语言', + general: '通用', + security: '安全', + about: '关于', + electrumServer: 'Electrum 服务器', + advancedOptions: '高级选项', + changePin: '更改 PIN', + fingerprintLogin: '指纹登录', + aboutUs: '关于我们', header: '设置', - plausible_deniability: '可否认性...', - storage_not_encrypted: '存储:未加密', - storage_encrypted: '存储:加密中', - password: '密码', - password_explain: '创建你的加密密码', - retype_password: '再次输入密码', - passwords_do_not_match: '两次输入密码不同', - encrypt_storage: '加密存储', - lightning_settings: '闪电网络设置', - lightning_settings_explain: '如要要连接你自己的闪电节点请安装LndHub' + ' 并把url地址输入到下面. 空白将使用默认的LndHub (lndhub.io)', - electrum_settings: 'Electrum Settings', - electrum_settings_explain: 'Set to blank to use default', + notSupportedFingerPrint: '您的设备不支持指纹', + TouchID: '允许指纹', + FaceID: '允许FaceID', + Biometrics: '允许生物特征', + }, + aboutUs: { + header: '关于我们', + releaseNotes: '发行说明', + runSelfTest: '运行自检', + buildWithAwesome: '绝妙的架构:', + rateVelesWallet: '为 VelesWallet 评分', + goToOurGithub: '请访问我们的 Github', + alwaysBackupYourKeys: '时刻备份您的秘钥', + title: 'Veles wallet 是免费的开源比特币Vault钱包软件。由麻省理工授权。', + }, + electrumServer: { + header: 'Electrum 服务器', + title: '更改electrum服务器', + description: '您可以更改您的应用连接的服务器地址。推荐使用默认地址。', save: '保存', - about: '关于', - language: '语言', - currency: '货币', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: '可否认性', - help: - '在某些情况下, 你不得不暴露 ' + - '密码. 为了让你的比特币更加安全, BlueWallet可以创建一些 ' + - '加密空间, 用不同的密码. 在压力之下, ' + - '你可以暴露这个钱包密码. 再次进入 ' + - 'BlueWallet, 我们会解锁一些虚拟空间. 对第三方来说看上去' + - '是合理的, 但会偷偷的帮你保证主钱包的安全 ' + - '币也就安全了.', - help2: '新的空间具备完整的功能,你可以存在 ' + '少量的金额在里面.', - create_fake_storage: '创建虚拟加密存储', - go_back: '回退', - create_password: '创建密码', - create_password_explanation: '虚拟存储空间密码不能和主存储空间密码相同', - password_should_not_match: '虚拟存储空间密码不能和主存储空间密码相同', - retype_password: '重输密码', - passwords_do_not_match: '两次输入密码不同,请重新输入', - success: '成功', - }, - lnd: { - title: '配置资金支持', - choose_source_wallet: '选择一个资金源钱包', - refill_lnd_balance: '给闪电钱包充值', - refill: '充值', - withdraw: '提取', - expired: '超时', - sameWalletAsInvoiceError: '你不能用创建账单的钱包去支付该账单', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', + useDefault: '使用默认设置', + host: '主机', + port: '端口', + successfullSave: '已成功保存更改。重启后,更改方可生效。', + connectionError: '无法连接提供的 Electrum 浏览器', + }, + advancedOptions: { + title: '设置高级选项', + description: '启用高级选项将允许您选择以下钱包类型:\nP2SH,HD P2SH,HD segwit。', + }, + selectLanguage: { + header: '语言', + restartInfo: '重新选择一门新的语言后,请重启 VelesWallet 以使更改生效', + confirmation: '确认', + confirm: '确认', + alertDescription: '选择语言并重启应用程序?', + cancel: '取消', + }, + contactList: { + cancel: '取消', + search: '查询', + screenTitle: '地址簿', + noContacts: '无联系人', + noContactsDesc1: '无联系人可展示。 \n点击', + noContactsDesc2: '以添加首位联系人。', + noResults: '无结果', + }, + contactCreate: { + screenTitle: '添加新的联系人', + subtitle: '新联系人', + description: '请输入您的新联系人姓名和地址。', + nameLabel: '姓名', + addressLabel: '地址', + buttonLabel: '添加新的联系人', + successTitle: '操作成功', + successDescription: '太好了!您已成功添加新联系人。', + successButton: '返回地址簿', + }, + contactDetails: { + nameLabel: '姓名', + addressLabel: '地址', + editName: '编辑姓名', + editAddress: '编辑地址', + sendCoinsButton: '汇出币', + showQRCodeButton: '出示二维码', + deleteButton: '删除联系人', + share: '分享', + }, + contactDelete: { + title: '删除您的联系人', + header: '删除联系人', + description1: '是否确认删除', + description2: '?\n删除后无法撤销。', + no: '否', + yes: '是', + success: '操作成功', + successDescription: '您的联系人已成功删除。\n您现在可以返回地址簿。', + successButton: '返回地址簿', + }, + scanQrCode: { + permissionTitle: '允许使用相机', + permissionMessage: '我们需要获取相机使用权限', + ok: '确认', + cancel: '取消', + }, + filterTransactions: { + header: '筛选交易', + receive: '收到', + send: '发送', + filter: '筛选设置', + to: '收款人', + toAmount: '最大金额', + toDate: '结束日期', + from: '汇款人', + fromAmount: '最小金额', + fromDate: '起始日期', + clearFilters: '清除筛选设置', }, }; diff --git a/loc/zh_tw.js b/loc/zh_tw.js deleted file mode 100644 index cc16163c2a..0000000000 --- a/loc/zh_tw.js +++ /dev/null @@ -1,235 +0,0 @@ -module.exports = { - _: { - storage_is_encrypted: '你的資訊已經被加密, 請輸入密碼解密', - enter_password: '輸入密碼', - bad_password: '密碼無效,請重試', - never: '不', - continue: '繼續', - ok: '好的', - }, - wallets: { - select_wallet: '選擇錢包', - options: '選項', - createBitcoinWallet: '您當前沒有bitcoin錢包. 為了支援閃電錢包, 我們需要建立或者匯入一個比特幣錢包. 是否需要繼續?', - list: { - app_name: 'BlueWallet', - title: '錢包', - header: '一個錢包代表一對的私鑰和地址' + '你可以通過分享收款.', - add: '新增錢包', - create_a_wallet: '建立一個錢包', - create_a_wallet1: '建立錢包是免費的,你可以', - create_a_wallet2: '想建立多少就建立多少個', - latest_transaction: '最近的轉賬', - empty_txs1: '你的轉賬資訊將展示在這裡', - empty_txs2: '當前無資訊', - empty_txs1_lightning: - 'Lightning wallet should be used for your daily transactions. Fees are unfairly cheap and speed is blazing fast.', - empty_txs2_lightning: '\nTo start using it tap on "manage funds" and topup your balance.', - tap_here_to_buy: '點選購買比特幣', - }, - reorder: { - title: '重新排列錢包', - }, - add: { - title: '新增錢包', - description: '你可以掃描你的紙質備份錢包 (WIF格式), 或者建立一個新錢包. 預設支援隔離見證錢包', - scan: '掃描', - create: '建立', - label_new_segwit: '新隔離見證(Segwit)', - label_new_lightning: '新閃電', - wallet_name: '錢包名稱', - wallet_type: '類型', - or: '或', - import_wallet: '匯入錢包', - imported: '已經匯入', - coming_soon: '即將來臨', - lightning: '閃電', - bitcoin: '比特幣', - }, - details: { - title: '錢包', - address: '地址', - type: '類型', - label: '標籤', - destination: '目的', - description: '描述', - are_you_sure: '你確認麼?', - yes_delete: '是的,刪除', - no_cancel: '不,取消', - delete: '刪除', - save: '儲存', - delete_this_wallet: '刪除這個錢包', - export_backup: '匯出備份', - buy_bitcoin: '購買比特幣', - show_xpub: '展示錢包 XPUB', - }, - export: { - title: '錢包匯出', - }, - xpub: { - title: '錢包 XPUB', - copiedToClipboard: '複製到貼上板.', - }, - import: { - title: '匯入', - explanation: '輸入你的助記詞,私鑰或者WIF, 或者其他格式的資料. BlueWallet將盡可能的自動識別資料格式並匯入錢包', - imported: '已經匯入', - error: '匯入失敗,請確認你提供的資訊是有效的', - success: '成功', - do_import: '匯入', - scan_qr: '或掃面二維碼', - }, - scanQrWif: { - go_back: '回退', - cancel: '取消', - decoding: '解碼中', - input_password: '輸入密碼', - password_explain: '這是一個BIP38加密的私鑰', - bad_password: '密碼錯誤', - wallet_already_exists: '當前錢包已經存在', - bad_wif: 'WIF格式無效', - imported_wif: 'WIF已經匯入', - with_address: ' 地址為', - imported_segwit: 'SegWit已經匯入', - imported_legacy: 'Legacy已經匯入', - imported_watchonly: '匯入只讀', - }, - }, - transactions: { - list: { - tabBarLabel: '轉賬', - title: '轉賬', - description: '當前所有錢包的轉入和轉出記錄', - conf: '配置', - }, - details: { - title: '轉賬', - from: '輸入', - to: '輸出', - copy: '複製', - transaction_details: '轉賬詳情', - show_in_block_explorer: '區塊瀏覽器展示', - }, - }, - send: { - header: '傳送', - details: { - title: '建立交易', - amount_field_is_not_valid: '金額格式無效', - fee_field_is_not_valid: '費用格式無效', - address_field_is_not_valid: '地址內容無效', - total_exceeds_balance: '餘額不足', - create_tx_error: '建立交易失敗. 請確認地址格式正確.', - address: '地址', - amount_placeholder: '傳送金額(in BTC)', - fee_placeholder: '手續費用 (in BTC)', - note_placeholder: '訊息', - cancel: '取消', - scan: '掃描', - send: '傳送', - create: '建立', - remaining_balance: '剩餘金額', - }, - confirm: { - header: '確認', - sendNow: '現在傳送', - }, - success: { - done: '完成', - }, - create: { - details: '詳情', - title: '建立詳情', - error: '建立交易失敗. 無效地址或金額?', - go_back: '回退', - this_is_hex: '這個是交易的十六進位制資料, 簽名並廣播到全網路.', - to: '到', - amount: '金額', - fee: '手續費', - tx_size: '交易大小', - satoshi_per_byte: '蔥每byte', - memo: '訊息', - broadcast: '廣播', - not_enough_fee: '手續費不夠,請增加手續費', - }, - }, - receive: { - header: '收款', - details: { - title: '分享這個地址給付款人', - share: '分享', - copiedToClipboard: '複製到貼上板.', - label: '描述', - create: '建立', - setAmount: '收款金額', - }, - }, - buyBitcoin: { - header: '購買比特幣', - tap_your_address: '點選地址複製到貼上板:', - copied: '複製到貼上板!', - }, - settings: { - header: '設定', - plausible_deniability: '可否認性...', - storage_not_encrypted: '儲存:未加密', - storage_encrypted: '儲存:加密中', - password: '密碼', - password_explain: '建立你的加密密碼', - retype_password: '再次輸入密碼', - passwords_do_not_match: '兩次輸入密碼不同', - encrypt_storage: '加密儲存', - lightning_settings: '閃電網路設定', - lightning_settings_explain: '如要要連線你自己的閃電節點請安裝LndHub' + ' 並把url地址輸入到下面. 空白將使用預設的LndHub (lndhub.io)', - save: '儲存', - about: '關於', - language: '語言', - currency: '貨幣', - advanced_options: 'Advanced Options', - enable_advanced_mode: 'Enable advanced mode', - }, - plausibledeniability: { - title: '可否認性', - help: - '在某些情況下, 你不得不暴露 ' + - '密碼. 為了讓你的比特幣更加安全, BlueWallet可以建立一些 ' + - '加密空間, 用不同的密碼. 在壓力之下, ' + - '你可以暴露這個錢包密碼. 再次進入 ' + - 'BlueWallet, 我們會解鎖一些虛擬空間. 對第三方來說看上去' + - '是合理的, 但會偷偷的幫你保證主錢包的安全 ' + - '幣也就安全了.', - help2: '新的空間具備完整的功能,你可以存在 ' + '少量的金額在裡面.', - create_fake_storage: '建立虛擬加密儲存', - go_back: '回退', - create_password: '建立密碼', - create_password_explanation: '虛擬儲存空間密碼不能和主儲存空間密碼相同', - password_should_not_match: '虛擬儲存空間密碼不能和主儲存空間密碼相同', - retype_password: '重輸密碼', - passwords_do_not_match: '兩次輸入密碼不同,請重新輸入', - success: '成功', - }, - lnd: { - title: '配置資金支援', - choose_source_wallet: '選擇一個資金源錢包', - refill_lnd_balance: '給閃電錢包充值', - refill: '充值', - withdraw: '提取', - expired: '超時', - sameWalletAsInvoiceError: '你不能用建立賬單的錢包去支付該賬單', - }, - pleasebackup: { - title: 'Your wallet is created...', - text: - "Please take a moment to write down this mnemonic phrase on a piece of paper. It's your backup you can use to restore the wallet on other device.", - ok: 'OK, I wrote this down!', - }, - lndViewInvoice: { - wasnt_paid_and_expired: 'This invoice was not paid for and has expired', - has_been_paid: 'This invoice has been paid for', - please_pay: 'Please pay', - sats: 'sats', - for: 'For:', - additional_info: 'Additional Information', - open_direct_channel: 'Open direct channel with this node:', - }, -}; diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000000..5545c02b47 --- /dev/null +++ b/metro.config.js @@ -0,0 +1,10 @@ +module.exports = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: false, + }, + }), + }, +}; diff --git a/models/bitcoinUnits.js b/models/bitcoinUnits.js index d436f27d4b..51dd4d1bc5 100644 --- a/models/bitcoinUnits.js +++ b/models/bitcoinUnits.js @@ -1,6 +1,6 @@ export const BitcoinUnit = Object.freeze({ - BTC: 'BTC', - SATS: 'sats', + BTC: 'VLS', + SATS: 'sat', LOCAL_CURRENCY: 'local_currency', MAX: 'MAX', }); diff --git a/models/networkTransactionFees.js b/models/networkTransactionFees.js index a6bb34795a..0a4b9c40c7 100644 --- a/models/networkTransactionFees.js +++ b/models/networkTransactionFees.js @@ -1,8 +1,9 @@ -import { BitcoinUnit } from './bitcoinUnits'; import BigNumber from 'bignumber.js'; -let loc = require('../loc'); + +import { BitcoinUnit } from './bitcoinUnits'; const BlueElectrum = require('../BlueElectrum'); +const loc = require('../loc'); export const NetworkTransactionFeeType = Object.freeze({ FAST: 'Fast', @@ -25,25 +26,25 @@ export default class NetworkTransactionFees { static recommendedFees() { return new Promise(async (resolve, reject) => { try { - let response = await BlueElectrum.estimateFees(); + const response = await BlueElectrum.estimateFees(); if (typeof response === 'object') { const fast = loc.formatBalanceWithoutSuffix( new BigNumber(response.fast) - .multipliedBy(100000) + .multipliedBy(1) .toNumber() .toFixed(0), BitcoinUnit.SATS, ); const medium = loc.formatBalanceWithoutSuffix( new BigNumber(response.medium) - .multipliedBy(100000) + .multipliedBy(1) .toNumber() .toFixed(0), BitcoinUnit.SATS, ); const slow = loc.formatBalanceWithoutSuffix( new BigNumber(response.slow) - .multipliedBy(100000) + .multipliedBy(1) .toNumber() .toFixed(0), BitcoinUnit.SATS, diff --git a/models/signer.js b/models/signer.js index 979fa980f3..5101a83182 100644 --- a/models/signer.js +++ b/models/signer.js @@ -7,17 +7,18 @@ * **/ const bitcoinjs = require('bitcoinjs-lib'); + const _p2wpkh = bitcoinjs.payments.p2wpkh; const _p2sh = bitcoinjs.payments.p2sh; const toSatoshi = num => parseInt((num * 100000000).toFixed(0)); exports.createHDTransaction = function(utxos, toAddress, amount, fixedFee, changeAddress) { - let feeInSatoshis = parseInt((fixedFee * 100000000).toFixed(0)); - let amountToOutputSatoshi = parseInt(((amount - fixedFee) * 100000000).toFixed(0)); // how much payee should get - let txb = new bitcoinjs.TransactionBuilder(); + const feeInSatoshis = parseInt((fixedFee * 100000000).toFixed(0)); + const amountToOutputSatoshi = parseInt(((amount - fixedFee) * 100000000).toFixed(0)); // how much payee should get + const txb = new bitcoinjs.TransactionBuilder(); txb.setVersion(1); let unspentAmountSatoshi = 0; - let ourOutputs = {}; + const ourOutputs = {}; let outputNum = 0; for (const unspent of utxos) { if (unspent.confirmations < 1) { @@ -27,7 +28,7 @@ exports.createHDTransaction = function(utxos, toAddress, amount, fixedFee, chang txb.addInput(unspent.txid, unspent.vout); ourOutputs[outputNum] = ourOutputs[outputNum] || {}; ourOutputs[outputNum].keyPair = bitcoinjs.ECPair.fromWIF(unspent.wif); - unspentAmountSatoshi += unspent.amount; + unspentAmountSatoshi += unspent.value; if (unspentAmountSatoshi >= amountToOutputSatoshi + feeInSatoshis) { // found enough inputs to satisfy payee and pay fees break; @@ -60,28 +61,28 @@ exports.createHDTransaction = function(utxos, toAddress, amount, fixedFee, chang }); } - let tx = txb.build(); + const tx = txb.build(); return tx.toHex(); }; exports.createHDSegwitTransaction = function(utxos, toAddress, amount, fixedFee, changeAddress) { - let feeInSatoshis = parseInt((fixedFee * 100000000).toFixed(0)); - let amountToOutputSatoshi = parseInt(((amount - fixedFee) * 100000000).toFixed(0)); // how much payee should get - let psbt = new bitcoinjs.Psbt(); + const feeInSatoshis = parseInt((fixedFee * 100000000).toFixed(0)); + const amountToOutputSatoshi = parseInt(((amount - fixedFee) * 100000000).toFixed(0)); // how much payee should get + const psbt = new bitcoinjs.Psbt(); psbt.setVersion(1); let unspentAmountSatoshi = 0; - let ourOutputs = []; + const ourOutputs = []; let outputNum = 0; for (const unspent of utxos) { if (unspent.confirmations < 1) { // using only confirmed outputs continue; } - let keyPair = bitcoinjs.ECPair.fromWIF(unspent.wif); - let p2wpkh = _p2wpkh({ + const keyPair = bitcoinjs.ECPair.fromWIF(unspent.wif); + const p2wpkh = _p2wpkh({ pubkey: keyPair.publicKey, }); - let p2sh = _p2sh({ + const p2sh = _p2sh({ redeem: p2wpkh, }); psbt.addInput({ @@ -89,15 +90,15 @@ exports.createHDSegwitTransaction = function(utxos, toAddress, amount, fixedFee, index: unspent.vout, witnessUtxo: { script: p2sh.output, - value: unspent.amount, + value: unspent.value, }, redeemScript: p2wpkh.output, }); ourOutputs[outputNum] = ourOutputs[outputNum] || {}; ourOutputs[outputNum].keyPair = keyPair; ourOutputs[outputNum].redeemScript = p2wpkh.output; - ourOutputs[outputNum].amount = unspent.amount; - unspentAmountSatoshi += unspent.amount; + ourOutputs[outputNum].amount = unspent.value; + unspentAmountSatoshi += unspent.value; if (unspentAmountSatoshi >= amountToOutputSatoshi + feeInSatoshis) { // found enough inputs to satisfy payee and pay fees break; @@ -133,7 +134,7 @@ exports.createHDSegwitTransaction = function(utxos, toAddress, amount, fixedFee, psbt.signInput(c, ourOutputs[c].keyPair); } - let tx = psbt.finalizeAllInputs().extractTransaction(); + const tx = psbt.finalizeAllInputs().extractTransaction(); return tx.toHex(); }; @@ -143,16 +144,16 @@ exports.createSegwitTransaction = function(utxos, toAddress, amount, fixedFee, W sequence = bitcoinjs.Transaction.DEFAULT_SEQUENCE; } - let feeInSatoshis = parseInt((fixedFee * 100000000).toFixed(0)); - let keyPair = bitcoinjs.ECPair.fromWIF(WIF); - let p2wpkh = _p2wpkh({ + const feeInSatoshis = parseInt((fixedFee * 100000000).toFixed(0)); + const keyPair = bitcoinjs.ECPair.fromWIF(WIF); + const p2wpkh = _p2wpkh({ pubkey: keyPair.publicKey, }); - let p2sh = _p2sh({ + const p2sh = _p2sh({ redeem: p2wpkh, }); - let psbt = new bitcoinjs.Psbt(); + const psbt = new bitcoinjs.Psbt(); psbt.setVersion(1); let unspentAmount = 0; for (const unspent of utxos) { @@ -160,7 +161,8 @@ exports.createSegwitTransaction = function(utxos, toAddress, amount, fixedFee, W // using only confirmed outputs continue; } - const satoshis = parseInt((unspent.amount * 100000000).toFixed(0)); + const satoshis = parseInt((unspent.value).toFixed(0)); + //const satoshis = parseInt((unspent.value * 100000000).toFixed(0)); psbt.addInput({ hash: unspent.txid, index: unspent.vout, @@ -173,7 +175,8 @@ exports.createSegwitTransaction = function(utxos, toAddress, amount, fixedFee, W }); unspentAmount += satoshis; } - let amountToOutput = parseInt(((amount - fixedFee) * 100000000).toFixed(0)); + //const amountToOutput = parseInt(((amount - fixedFee)).toFixed(0)); + const amountToOutput = parseInt(((amount - fixedFee) * 100000000).toFixed(0)); psbt.addOutput({ address: toAddress, value: amountToOutput, @@ -191,11 +194,12 @@ exports.createSegwitTransaction = function(utxos, toAddress, amount, fixedFee, W } } + console.log('amountToOutput ', amountToOutput, 'unspentAmount ', unspentAmount, 'feeInSatoshis ', feeInSatoshis); + for (let c = 0; c < utxos.length; c++) { psbt.signInput(c, keyPair); } - - let tx = psbt.finalizeAllInputs().extractTransaction(); + const tx = psbt.finalizeAllInputs().extractTransaction(); return tx.toHex(); }; @@ -204,32 +208,32 @@ exports.createRBFSegwitTransaction = function(txhex, addressReplaceMap, feeDelta throw Error('replace-by-fee requires increased fee, not decreased'); } - let tx = bitcoinjs.Transaction.fromHex(txhex); + const tx = bitcoinjs.Transaction.fromHex(txhex); // looking for latest sequence number in inputs let highestSequence = 0; - for (let i of tx.ins) { + for (const i of tx.ins) { if (i.sequence > highestSequence) { highestSequence = i.sequence; } } - let keyPair = bitcoinjs.ECPair.fromWIF(WIF); - let p2wpkh = _p2wpkh({ + const keyPair = bitcoinjs.ECPair.fromWIF(WIF); + const p2wpkh = _p2wpkh({ pubkey: keyPair.publicKey, }); - let p2sh = _p2sh({ + const p2sh = _p2sh({ redeem: p2wpkh, }); // creating TX - let psbt = new bitcoinjs.Psbt(); + const psbt = new bitcoinjs.Psbt(); psbt.setVersion(1); - for (let unspent of tx.ins) { - let txid = Buffer.from(unspent.hash) + for (const unspent of tx.ins) { + const txid = Buffer.from(unspent.hash) .reverse() .toString('hex'); - let index = unspent.index; - let amount = utxodata[txid][index]; + const index = unspent.index; + const amount = utxodata[txid][index]; psbt.addInput({ hash: txid, index, @@ -242,8 +246,8 @@ exports.createRBFSegwitTransaction = function(txhex, addressReplaceMap, feeDelta }); } - for (let o of tx.outs) { - let outAddress = bitcoinjs.address.fromOutputScript(o.script); + for (const o of tx.outs) { + const outAddress = bitcoinjs.address.fromOutputScript(o.script); if (addressReplaceMap[outAddress]) { // means this is DESTINATION address, not messing with it's amount // but replacing the address itseld @@ -253,7 +257,7 @@ exports.createRBFSegwitTransaction = function(txhex, addressReplaceMap, feeDelta }); } else { // CHANGE address, so we deduct increased fee from here - let feeDeltaInSatoshi = parseInt((feeDelta * 100000000).toFixed(0)); + const feeDeltaInSatoshi = parseInt((feeDelta * 100000000).toFixed(0)); psbt.addOutput({ address: outAddress, value: o.value - feeDeltaInSatoshi, @@ -266,20 +270,20 @@ exports.createRBFSegwitTransaction = function(txhex, addressReplaceMap, feeDelta psbt.signInput(c, keyPair); } - let newTx = psbt.finalizeAllInputs().extractTransaction(); + const newTx = psbt.finalizeAllInputs().extractTransaction(); return newTx.toHex(); }; exports.generateNewSegwitAddress = function() { - let keyPair = bitcoinjs.ECPair.makeRandom(); - let address = bitcoinjs.payments.p2sh({ + const keyPair = bitcoinjs.ECPair.makeRandom(); + const address = bitcoinjs.payments.p2sh({ redeem: bitcoinjs.payments.p2wpkh({ pubkey: keyPair.publicKey, }), }).address; return { - address: address, + address, WIF: keyPair.toWIF(), }; }; @@ -300,7 +304,7 @@ exports.URI = function(paymentInfo) { }; exports.WIF2segwitAddress = function(WIF) { - let keyPair = bitcoinjs.ECPair.fromWIF(WIF); + const keyPair = bitcoinjs.ECPair.fromWIF(WIF); return bitcoinjs.payments.p2sh({ redeem: bitcoinjs.payments.p2wpkh({ pubkey: keyPair.publicKey, @@ -309,10 +313,10 @@ exports.WIF2segwitAddress = function(WIF) { }; exports.createTransaction = function(utxos, toAddress, _amount, _fixedFee, WIF, fromAddress) { - let fixedFee = toSatoshi(_fixedFee); - let amountToOutput = toSatoshi(_amount - _fixedFee); - let pk = bitcoinjs.ECPair.fromWIF(WIF); // eslint-disable-line new-cap - let txb = new bitcoinjs.TransactionBuilder(); + const fixedFee = toSatoshi(_fixedFee); + const amountToOutput = toSatoshi(_amount - _fixedFee); + const pk = bitcoinjs.ECPair.fromWIF(WIF); // eslint-disable-line new-cap + const txb = new bitcoinjs.TransactionBuilder(); txb.setVersion(1); let unspentAmount = 0; for (const unspent of utxos) { @@ -321,10 +325,11 @@ exports.createTransaction = function(utxos, toAddress, _amount, _fixedFee, WIF, continue; } txb.addInput(unspent.txid, unspent.vout); - unspentAmount += toSatoshi(unspent.amount); + unspentAmount += toSatoshi(unspent.value); } txb.addOutput(toAddress, amountToOutput); + console.log('amountToOutput ', amountToOutput, ', fixedFee ', fixedFee, ', unspentAmount', unspentAmount) if (amountToOutput + fixedFee < unspentAmount) { // sending less than we have, so the rest should go back txb.addOutput(fromAddress, unspentAmount - amountToOutput - fixedFee); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b816b4e46c..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,15580 +0,0 @@ -{ - "name": "BlueWallet", - "version": "4.7.4", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@amplitude/ua-parser-js": { - "version": "0.7.20", - "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.20.tgz", - "integrity": "sha512-bmW++BLt1Hg+4HCExLXP+0Jhgy2eTsEevqkVc5o4yYbgwdP/gV3gEQXzyVrMVlWWNLgph/tFIkf5PVlSpCELEg==" - }, - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.2.tgz", - "integrity": "sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.2", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", - "requires": { - "@babel/types": "^7.6.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", - "requires": { - "@babel/types": "^7.3.0", - "esutils": "^2.0.0" - } - }, - "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz", - "integrity": "sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" - } - }, - "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", - "requires": { - "@babel/types": "^7.5.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" - } - }, - "@babel/helpers": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", - "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", - "requires": { - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0" - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==" - }, - "@babel/plugin-external-helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz", - "integrity": "sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" - } - }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz", - "integrity": "sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.2.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz", - "integrity": "sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.2.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz", - "integrity": "sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz", - "integrity": "sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz", - "integrity": "sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz", - "integrity": "sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz", - "integrity": "sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", - "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz", - "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", - "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", - "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", - "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", - "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", - "requires": { - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-object-assign": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz", - "integrity": "sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", - "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", - "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz", - "integrity": "sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz", - "integrity": "sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.6.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.2.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/preset-env": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.0.tgz", - "integrity": "sha512-/5oQ7cYg+6sH9Dt9yx5IiylnLPiUdyMHl5y+K0mKVNiW2wJ7FpU5bg8jKcT8PcCbxdYzfv6OuC63jLEtMuRSmQ==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.4", - "@babel/plugin-transform-classes": "^7.4.4", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.5.0", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - } - }, - "@babel/register": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.6.2.tgz", - "integrity": "sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ==", - "requires": { - "find-cache-dir": "^2.0.0", - "lodash": "^4.17.13", - "mkdirp": "^0.5.1", - "pirates": "^4.0.0", - "source-map-support": "^0.5.9" - } - }, - "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" - } - }, - "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "@hapi/address": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.2.tgz", - "integrity": "sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/hoek": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.3.0.tgz", - "integrity": "sha512-C0QL9bmgUXTSuf8nDeGrpMjtJG7tPUr8wG6/wxPbP62tGwCwQtdMSJYfESowmY4P3Hn593f+8OzNY5bckcu/LQ==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.5.tgz", - "integrity": "sha512-bi9m1jrui9LlvtVdLaHv0DqeOoe+I8dep+nEcTgW6XxJHL3xArQcilYz3tIp0cRC4gWlsVtABK7vNKg4jzEmAA==", - "requires": { - "@hapi/hoek": "8.x.x" - } - }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - } - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@react-native-community/async-storage": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.6.2.tgz", - "integrity": "sha512-EJGsbrHubK1mGxPjWB74AaHAd5m9I+Gg2RRPZzMK6org7QOU9WOBnIMFqoeVto3hKOaEPlk8NV74H6G34/2pZQ==" - }, - "@react-native-community/blur": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@react-native-community/blur/-/blur-3.3.1.tgz", - "integrity": "sha512-UfH2ut/l4GpZHeq/TGx3BrmyXSCSBBwBCVx1DhPodP3k959zJ2ajgXa3PiU/qjutftTUw6KH9Frsh2U0ax9dMQ==", - "requires": { - "prop-types": "^15.5.10" - } - }, - "@react-native-community/cli-platform-android": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-2.9.0.tgz", - "integrity": "sha512-VEQs4Q6R5tnlYFrQIFoPEWjLc43whRHC9HeH+idbFymwDqysLVUffQbb9D6PJUj+C/AvrDhBhU6S3tDjGbSsag==", - "requires": { - "@react-native-community/cli-tools": "^2.8.3", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "jetifier": "^1.6.2", - "logkitty": "^0.6.0", - "slash": "^3.0.0", - "xmldoc": "^1.1.2" - } - }, - "@react-native-community/cli-platform-ios": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-2.9.0.tgz", - "integrity": "sha512-vg6EOamtFaaQ02FiWu+jzJTfeTJ0OVjJSAoR2rhJKNye6RgJLoQlfp0Hg3waF6XrO72a7afYZsPdKSlN3ewlHg==", - "requires": { - "@react-native-community/cli-tools": "^2.8.3", - "chalk": "^2.4.2", - "xcode": "^2.0.0" - } - }, - "@react-native-community/cli-tools": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-2.8.3.tgz", - "integrity": "sha512-N5Pz+pR+GFq3JApjd0SW4jp9KC7kbKsMH65QLRh30JNsxdPvNkYox6/ZZdkvdXaI5ev3EckR7eqlcwi5gpVTYQ==", - "requires": { - "chalk": "^2.4.2", - "lodash": "^4.17.5", - "mime": "^2.4.1", - "node-fetch": "^2.5.0" - } - }, - "@react-native-community/eslint-config": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-native-community/eslint-config/-/eslint-config-0.0.5.tgz", - "integrity": "sha512-jwO2tnKaTPTLX5XYXMHGEnFdf543SU7jz98/OF5mDH3b7lP+BOaCD+jVfqqHoDRkcqyPlYiR1CgwVGWpi0vMWg==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^1.5.0", - "@typescript-eslint/parser": "^1.5.0", - "babel-eslint": "10.0.1", - "eslint-plugin-eslint-comments": "^3.1.1", - "eslint-plugin-flowtype": "2.50.3", - "eslint-plugin-jest": "22.4.1", - "eslint-plugin-prettier": "2.6.2", - "eslint-plugin-react": "7.12.4", - "eslint-plugin-react-hooks": "^1.5.1", - "eslint-plugin-react-native": "3.6.0", - "prettier": "1.16.4" - }, - "dependencies": { - "babel-eslint": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", - "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - } - }, - "eslint-plugin-prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz", - "integrity": "sha512-tGek5clmW5swrAx1mdPYM8oThrBE83ePh7LeseZHBWfHVGrHPhKn7Y5zgRMbU/9D5Td9K4CEmUPjGxA7iw98Og==", - "dev": true, - "requires": { - "fast-diff": "^1.1.1", - "jest-docblock": "^21.0.0" - } - }, - "eslint-plugin-react": { - "version": "7.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", - "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "object.fromentries": "^2.0.0", - "prop-types": "^15.6.2", - "resolve": "^1.9.0" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", - "dev": true - } - } - }, - "@react-native-community/slider": { - "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@react-native-community/slider/-/slider-2.0.0-rc.1.tgz", - "integrity": "sha512-hdqQavGovI5M9NjCj4q4SPXyYOEHpBGXLIHBFETyL0S/B96hb09MXZAhOxsPYYs8KamYSKh2IYKwZ8yEiikNSg==" - }, - "@react-navigation/core": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-3.4.2.tgz", - "integrity": "sha512-7G+iDzLSTeOUU4vVZeRZKJ+Bd7ds7ZxYNqZcB8i0KlBeQEQfR74Ounfu/p0KIEq2RiNnaE3QT7WVP3C87sebzw==", - "requires": { - "hoist-non-react-statics": "^3.3.0", - "path-to-regexp": "^1.7.0", - "query-string": "^6.4.2", - "react-is": "^16.8.6" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - }, - "query-string": { - "version": "6.8.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.3.tgz", - "integrity": "sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==", - "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" - } - } - }, - "@react-navigation/native": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-3.5.0.tgz", - "integrity": "sha512-TmGOis++ejEXG3sqNJhCSKqB0/qLu3FQgDtO959qpqif36R/diR8SQwJqeSdofoEiK3CepdhFlTCeHdS1/+MsQ==", - "requires": { - "hoist-non-react-statics": "^3.0.1", - "react-native-safe-area-view": "^0.14.1", - "react-native-screens": "^1.0.0 || ^1.0.0-alpha" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "requires": { - "react-is": "^16.7.0" - } - } - } - }, - "@remobile/react-native-qrcode-local-image": { - "version": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git#b8baa79ba3b3859c9353c9dee7f01392b989a530", - "from": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git" - }, - "@sentry/browser": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.7.1.tgz", - "integrity": "sha512-K0x1XhsHS8PPdtlVOLrKZyYvi5Vexs9WApdd214bO6KaGF296gJvH1mG8XOY0+7aA5i2A7T3ttcaJNDYS49lzw==", - "requires": { - "@sentry/core": "5.7.1", - "@sentry/types": "5.7.1", - "@sentry/utils": "5.7.1", - "tslib": "^1.9.3" - } - }, - "@sentry/cli": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.48.0.tgz", - "integrity": "sha512-Td6UpZP6BoI0R5Guctiq3NIphAfskbyeiboWx4H1yuXPA9p4F0hL+Hrz6k3NNfzkt3AQzEkeAhvpKmIfmUOkjA==", - "requires": { - "fs-copy-file-sync": "^1.1.1", - "https-proxy-agent": "^3.0.0", - "mkdirp": "^0.5.1", - "node-fetch": "^2.1.2", - "progress": "2.0.0", - "proxy-from-env": "^1.0.0" - } - }, - "@sentry/core": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.7.1.tgz", - "integrity": "sha512-AOn3k3uVWh2VyajcHbV9Ta4ieDIeLckfo7UMLM+CTk2kt7C89SayDGayJMSsIrsZlL4qxBoLB9QY4W2FgAGJrg==", - "requires": { - "@sentry/hub": "5.7.1", - "@sentry/minimal": "5.7.1", - "@sentry/types": "5.7.1", - "@sentry/utils": "5.7.1", - "tslib": "^1.9.3" - } - }, - "@sentry/hub": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.7.1.tgz", - "integrity": "sha512-evGh323WR073WSBCg/RkhlUmCQyzU0xzBzCZPscvcoy5hd4SsLE6t9Zin+WACHB9JFsRQIDwNDn+D+pj3yKsig==", - "requires": { - "@sentry/types": "5.7.1", - "@sentry/utils": "5.7.1", - "tslib": "^1.9.3" - } - }, - "@sentry/integrations": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-5.7.1.tgz", - "integrity": "sha512-LMKVVfB4VlpPE5I8OyD2soj/iNaicnpWObpBxfPDfsJAnXo5sV7zkWwEfvCia2dcXCXkpE2Xz77tiZubK7zrMQ==", - "requires": { - "@sentry/types": "5.7.1", - "@sentry/utils": "5.7.1", - "tslib": "^1.9.3" - } - }, - "@sentry/minimal": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.7.1.tgz", - "integrity": "sha512-nS/Dg+jWAZtcxQW8wKbkkw4dYvF6uyY/vDiz/jFCaux0LX0uhgXAC9gMOJmgJ/tYBLJ64l0ca5LzpZa7BMJQ0g==", - "requires": { - "@sentry/hub": "5.7.1", - "@sentry/types": "5.7.1", - "tslib": "^1.9.3" - } - }, - "@sentry/react-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-1.0.9.tgz", - "integrity": "sha512-fe1KEUJc+N4vq/k0ykqQ3el/CXxwTN7E8kBTYBCvxt9U449FdRodyFduiwz1UrkYhBsaQDC+5vQSZBZyT8EuOA==", - "requires": { - "@sentry/browser": "^5.6.3", - "@sentry/core": "^5.6.2", - "@sentry/integrations": "^5.6.1", - "@sentry/types": "^5.6.1", - "@sentry/utils": "^5.6.1", - "@sentry/wizard": "^1.0.0" - } - }, - "@sentry/types": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.7.1.tgz", - "integrity": "sha512-tbUnTYlSliXvnou5D4C8Zr+7/wJrHLbpYX1YkLXuIJRU0NSi81bHMroAuHWILcQKWhVjaV/HZzr7Y/hhWtbXVQ==" - }, - "@sentry/utils": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.7.1.tgz", - "integrity": "sha512-nhirUKj/qFLsR1i9kJ5BRvNyzdx/E2vorIsukuDrbo8e3iZ11JMgCOVrmC8Eq9YkHBqgwX4UnrPumjFyvGMZ2Q==", - "requires": { - "@sentry/types": "5.7.1", - "tslib": "^1.9.3" - } - }, - "@sentry/wizard": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.0.1.tgz", - "integrity": "sha512-rsDTXTXyKzTg1KXeTuZzsqfItjjo+xlmgTILQ+9Py5tSrU9IXWNxt4XMADBv/AfOhDQQofMKrY9OTj2dznXH+g==", - "requires": { - "@sentry/cli": "^1.44.2", - "chalk": "^2.4.1", - "glob": "^7.1.3", - "inquirer": "^6.2.0", - "lodash": "^4.17.11", - "opn": "^5.4.0", - "r2": "^2.0.1", - "read-env": "^1.3.0", - "snyk": "^1.192.3", - "xcode": "2.0.0", - "yargs": "^12.0.2" - }, - "dependencies": { - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@snyk/cli-interface": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.2.0.tgz", - "integrity": "sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@snyk/cocoapods-lockfile-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-2.0.4.tgz", - "integrity": "sha512-d57bajPjqCiNXMuyMmt9Zt98zbjABZUFw+91B705flzV6oB7OThgtA40Eoin6iatYoStIx28bC3T6b0mScy/iA==", - "requires": { - "@snyk/dep-graph": "^1.11.0", - "@snyk/ruby-semver": "^2.0.4", - "@types/js-yaml": "^3.12.1", - "core-js": "^3.2.0", - "js-yaml": "^3.13.1", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "core-js": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.5.tgz", - "integrity": "sha512-0J3K+Par/ZydhKg8pEiTcK/9d65/nqJOzY62uMkjeBmt05fDOt/khUVjDdh8TpeIuGQDy1yLDDCjiWN/8pFIuw==" - } - } - }, - "@snyk/composer-lockfile-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.0.3.tgz", - "integrity": "sha512-hb+6E7kMzWlcwfe//ILDoktBPKL2a3+RnJT/CXnzRXaiLQpsdkf5li4q2v0fmvd+4v7L3tTN8KM+//lJyviEkg==", - "requires": { - "lodash": "^4.17.13" - } - }, - "@snyk/dep-graph": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.13.1.tgz", - "integrity": "sha512-Ww2xvm5UQgrq9eV0SdTBCh+w/4oI2rCx5vn1IOSeypaR0CO4p+do1vm3IDZ2ugg4jLSfHP8+LiD6ORESZMkQ2w==", - "requires": { - "graphlib": "^2.1.5", - "lodash": "^4.7.14", - "object-hash": "^1.3.1", - "semver": "^6.0.0", - "source-map-support": "^0.5.11", - "tslib": "^1.9.3" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@snyk/gemfile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", - "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==" - }, - "@snyk/ruby-semver": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@snyk/ruby-semver/-/ruby-semver-2.0.4.tgz", - "integrity": "sha512-ceMD4CBS3qtAg+O0BUvkKdsheUNCqi+/+Rju243Ul8PsUgZnXmGiqfk/2z7DCprRQnxUTra4+IyeDQT7wAheCQ==", - "requires": { - "lodash": "^4.17.14" - } - }, - "@snyk/snyk-cocoapods-plugin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-1.0.3.tgz", - "integrity": "sha512-AHAA7z23nPi1eHODsDxeSkl73Ze3yphuqJjMl39ie323EzBDcb9g6uAACrk0Qn2K/K2D8uyxMAf2zDtc+JGQfw==", - "requires": { - "@snyk/cli-interface": "1.5.0", - "@snyk/cocoapods-lockfile-parser": "2.0.4", - "@snyk/dep-graph": "1.13.0", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-1.5.0.tgz", - "integrity": "sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@snyk/dep-graph": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.13.0.tgz", - "integrity": "sha512-e0XcLH6Kgs/lunf6iDjbxEnm9+JYFEJn6eo/PlEUW+SMWBZ2uEXHBTDNp9oxjJou48PngzWMveEkniBAN+ulOQ==", - "requires": { - "graphlib": "^2.1.5", - "lodash": "^4.7.14", - "object-hash": "^1.3.1", - "semver": "^6.0.0", - "source-map-support": "^0.5.11", - "tslib": "^1.9.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@types/agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q==", - "requires": { - "@types/events": "*", - "@types/node": "*" - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", - "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", - "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/bunyan": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.6.tgz", - "integrity": "sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==" - }, - "@types/json-schema": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", - "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", - "dev": true - }, - "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" - }, - "@types/restify": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/restify/-/restify-4.3.6.tgz", - "integrity": "sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA==", - "requires": { - "@types/bunyan": "*", - "@types/node": "*" - } - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/xml2js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.3.tgz", - "integrity": "sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g==", - "requires": { - "@types/events": "*", - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", - "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", - "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "1.13.0", - "eslint-utils": "^1.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^2.0.1", - "tsutils": "^3.7.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", - "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-scope": "^4.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", - "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.13.0", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } - } - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - }, - "abab": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", - "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "absolute-path": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", - "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" - }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "requires": { - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", - "dev": true - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amplitude-js": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-5.6.0.tgz", - "integrity": "sha512-XGaM0sTvMOrVYqfHhkKEikjQ/SzhEGbupxYopcrzEpEuNLenSOIBMyB0JycBcFI1hTWR4rGJ2TDRqIeRMmUZvg==", - "requires": { - "@amplitude/ua-parser-js": "0.7.20", - "blueimp-md5": "^2.10.0", - "query-string": "5" - } - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "requires": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "appcenter": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/appcenter/-/appcenter-2.5.0.tgz", - "integrity": "sha512-d79MJPUGM0to4fFCowBYCXAA5ayRGMvyACJikzeZfAsmI+Fkd17EyiD7hCP+sFwyWfy+/W9mwlngLiwPYzD+Ww==", - "requires": { - "appcenter-link-scripts": "2.5.0" - } - }, - "appcenter-analytics": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/appcenter-analytics/-/appcenter-analytics-2.5.0.tgz", - "integrity": "sha512-KK8px+QjYsHM/bQvsbl4dLNQtkIaToI3Lezwzq0kPVs8kJfywZrE7ZxCVHF3Diqs2EUybqUNj0TDOTo3h8kw+w==", - "requires": { - "appcenter": "2.5.0" - } - }, - "appcenter-crashes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/appcenter-crashes/-/appcenter-crashes-2.5.0.tgz", - "integrity": "sha512-VrlRtawpb44utMQnnxLMWihNVer7i17f5CCtDEiyHktYSXoP8vEl3tWqAUOQLpVGD93cSDNQGJDtnKcu9PRE5A==", - "requires": { - "appcenter": "2.5.0" - } - }, - "appcenter-link-scripts": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/appcenter-link-scripts/-/appcenter-link-scripts-2.5.0.tgz", - "integrity": "sha512-LJZVPKKFNLf7R8Sr8wXkMJp/oIImbnwULkWggAGg2/1bZ96LItDvkl6MjNjlctM+3kqel21Yw3SfU2oEOvvm+w==", - "requires": { - "debug": "4.1.1", - "glob": "5.0.15", - "mkdirp": "0.5.1", - "plist": "3.0.1", - "which": "1.2.11", - "xcode": "2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "art": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz", - "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - }, - "dependencies": { - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "requires": { - "babel-runtime": "^6.22.0", - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - } - } - }, - "babel-preset-fbjs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz", - "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base-64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", - "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" - }, - "base-x": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", - "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bech32": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", - "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==" - }, - "big-integer": { - "version": "1.6.47", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.47.tgz", - "integrity": "sha512-9t9f7X3as2XGX8b52GqG6ox0GvIdM86LyIXASJnDCFhYNgt+A+MByQZ3W2PyMRZjEvG5f8TEbSPfEotVuMJnQg==" - }, - "bigi": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", - "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" - }, - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip174": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.1.tgz", - "integrity": "sha512-Mq2aFs1TdMfxBpYPg7uzjhsiXbAtoVq44TNjEWtvuZBiBgc3m7+n55orYMtTAxdg7jWbL4DtH0MKocJER4xERQ==" - }, - "bip21": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bip21/-/bip21-2.0.2.tgz", - "integrity": "sha512-17u8+MrOE9iQWwZ5fPg656lAtBpE6MrmGBPPnJvx/AXnvfQpvT51RN3hR7qHqcd8HxXT+tueywcoXwXp+CdtdA==", - "requires": { - "qs": "^6.3.0" - } - }, - "bip32": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.3.tgz", - "integrity": "sha512-Tg4dHUXiYBkJyCQq4g++C2PqKcZRveVqy7cKxyl88Uai7MmmknFGaF88odYrXcXk5EMyrlXLuAMC3yEiLxRnNA==", - "requires": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.0", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - } - }, - "bip39": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz", - "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==", - "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bitcoin-ops": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" - }, - "bitcoinjs-lib": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.6.tgz", - "integrity": "sha512-NgvnA8XXUuzpuBnVs1plzZvVOYsuont4KPzaGcVIwjktYQbCk1hUkXnt4wujIOBscNsXuu+plVbPYvtMosZI/w==", - "requires": { - "@types/node": "10.12.18", - "bech32": "^1.1.2", - "bip174": "^1.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - }, - "dependencies": { - "bip32": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.4.tgz", - "integrity": "sha512-ioPytarPDIrWckWMuK4RNUtvwhvWEc2fvuhnO0WEwu732k5OLjUXv4rXi2c/KJHw9ZMNQMkYRJrBw81RujShGQ==", - "requires": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.0", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - } - } - } - }, - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "blueimp-md5": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.12.0.tgz", - "integrity": "sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "boolify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/boolify/-/boolify-1.0.1.tgz", - "integrity": "sha1-tcCeF8rNET0Rt7s+04TMASmU2Gs=", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } - } - }, - "bplist-creator": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", - "requires": { - "stream-buffers": "~2.2.0" - } - }, - "bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", - "requires": { - "big-integer": "^1.6.7" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", - "dev": true - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", - "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha1-SSg8jvpvkBvAH6MwTQYCeXGuL2A=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "camelcase-keys": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.0.1.tgz", - "integrity": "sha512-Pet+fVo99HMVy183qJuyTiQECQlb0dCXg89qhixcud88j4BSns+gzhSrjRT0ustEYSWJqKMO42arm1cS1VG5FA==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30000999", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz", - "integrity": "sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg==" - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "requires": { - "rsvp": "^4.8.4" - } - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinner": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", - "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==" - }, - "cli-spinners": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", - "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-deep": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", - "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.1", - "kind-of": "^3.2.2", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "coinselect": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/coinselect/-/coinselect-3.1.11.tgz", - "integrity": "sha1-4fBjvRpYgvZzXuBRm52LWsSpMJk=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "colorette": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", - "requires": { - "mime-db": ">= 1.40.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" - }, - "core-js-compat": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", - "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", - "requires": { - "browserslist": "^4.6.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-react-class": { - "version": "15.6.3", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - } - } - }, - "cross-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz", - "integrity": "sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==", - "requires": { - "node-fetch": "2.6.0", - "whatwg-fetch": "3.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "dayjs": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.14.tgz", - "integrity": "sha512-AVhDmRTe541iWirnoeFSSDDGvCT6HWaNQ4z2WmmzXMGZj6ph6ydao2teKq/eUtR43GPJXlYFD+C/SotG1P9wUQ==" - }, - "debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "dedent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz", - "integrity": "sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s=" - }, - "deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", - "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", - "requires": { - "abstract-leveldown": "~0.12.1" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dijkstrajs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", - "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "dockerfile-ast": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz", - "integrity": "sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw==", - "requires": { - "vscode-languageserver-types": "^3.5.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotnet-deps-parser": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/dotnet-deps-parser/-/dotnet-deps-parser-4.5.2.tgz", - "integrity": "sha512-bk5Q1luEwQ10rrBwZbtTxUNadaLz2dM6xzOLoTK+oUBcaq6saCeELmkIgdG+Fwkn58XRgLQvOySVS0gp4OG6RA==", - "requires": { - "@types/xml2js": "0.4.3", - "lodash": "^4.17.11", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3", - "xml2js": "0.4.19" - }, - "dependencies": { - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - } - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecurve": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.6.tgz", - "integrity": "sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w==", - "requires": { - "bigi": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.277", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.277.tgz", - "integrity": "sha512-Czmsrgng89DOgJlIknnw9bn5431QdtnUwGp5YYiPwU1DbZQUxCLF+rc1ZC09VNAdalOPcvH6AE8BaA0H5HjI/w==" - }, - "electrum-client": { - "version": "git+https://github.com/BlueWallet/rn-electrum-client.git#d194ff69195ccc86f72088ea3712179b4be9cbb4", - "from": "git+https://github.com/BlueWallet/rn-electrum-client.git" - }, - "elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "envinfo": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.4.0.tgz", - "integrity": "sha512-FdDfnWnCVjxTTpWE3d6Jgh5JDIA3Cw7LCgpM/pI7kK1ORkjaqI2r6NqQ+ln2j0dfpgxY00AWieSvtkiZQKIItA==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "requires": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - } - }, - "es-abstract": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", - "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } - } - }, - "eslint": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", - "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.2", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz", - "integrity": "sha512-vDrcCFE3+2ixNT5H83g28bO/uYAwibJxerXPj+E7op4qzBCsAV36QfvdAyVOoNxKAH2Os/e01T/2x++V0LPukA==", - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==" - }, - "eslint-config-standard-jsx": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", - "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==" - }, - "eslint-config-standard-react": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-7.0.2.tgz", - "integrity": "sha512-Zv/vubIfrwx4IbRXAggRjaswLXKdfFeuGfN365cVTaRmfpAy/7dIxMvJRZkUT99zEx8FOjTXL0KC4psfDjK/+w==", - "requires": { - "eslint-config-standard-jsx": "^6.0.1" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-babel": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.0.tgz", - "integrity": "sha512-HPuNzSPE75O+SnxHIafbW5QB45r2w78fxqwK3HmjqIUoPfPzVrq6rD+CINU3yzoDSzEhUkX07VUphbF73Lth/w==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-plugin-es": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", - "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", - "dev": true, - "requires": { - "eslint-utils": "^1.4.2", - "regexpp": "^2.0.1" - } - }, - "eslint-plugin-eslint-comments": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", - "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - } - }, - "eslint-plugin-flowtype": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz", - "integrity": "sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "22.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz", - "integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==", - "dev": true - }, - "eslint-plugin-node": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz", - "integrity": "sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==", - "dev": true, - "requires": { - "eslint-plugin-es": "^1.4.1", - "eslint-utils": "^1.4.2", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", - "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "resolve": "^1.12.0" - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", - "dev": true - }, - "eslint-plugin-react-native": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.6.0.tgz", - "integrity": "sha512-BEQcHZ06hZSBYWFVuNEq0xuui5VEsWpHDsZGBtfadHfCRqRMUrkYPgdDb3bpc60qShHE83kqIv59uKdinEg91Q==", - "dev": true, - "requires": { - "eslint-plugin-react-native-globals": "^0.1.1" - } - }, - "eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==" - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.0.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", - "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-jsx": "^5.0.2", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fbjs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", - "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", - "requires": { - "core-js": "^2.4.1", - "fbjs-css-vars": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "fbjs-scripts": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", - "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", - "requires": { - "@babel/core": "^7.0.0", - "ansi-colors": "^1.0.1", - "babel-preset-fbjs": "^3.2.0", - "core-js": "^2.4.1", - "cross-spawn": "^5.1.0", - "fancy-log": "^1.3.2", - "object-assign": "^4.0.1", - "plugin-error": "^0.1.2", - "semver": "^5.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "findit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", - "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", - "dev": true - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flow-bin": { - "version": "0.102.0", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.102.0.tgz", - "integrity": "sha512-mYon6noeLO0Q5SbiWULLQeM1L96iuXnRtYMd47j3bEWXAwUW9EnwNWcn+cZg/jC/Dg4Wj/jnkdTDEuFtbeu1ww==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "frisbee": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/frisbee/-/frisbee-2.0.9.tgz", - "integrity": "sha512-k2YrtBki5iw0p2Wsee5KW0cQBpzvDAOcAXMcunNCwM31XCj4RFpa1WGA4541JY9wFz8QhTHBQXb2rE3ERvbr9w==", - "requires": { - "caseless": "^0.12.0", - "common-tags": "^1.8.0", - "cross-fetch": "^3.0.2", - "qs": "^6.7.0", - "url-join": "^4.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-copy-file-sync": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", - "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "optional": true - } - } - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", - "requires": { - "readable-stream": "~1.0.26-4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-uri": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", - "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", - "requires": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "~3.0.2", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-up": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", - "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", - "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", - "requires": { - "git-up": "^4.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" - }, - "graphlib": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz", - "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==", - "requires": { - "lodash": "^4.17.5" - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "handlebars": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.2.tgz", - "integrity": "sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "commander": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", - "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "hermesvm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/hermesvm/-/hermesvm-0.1.1.tgz", - "integrity": "sha512-EosSDeUqTTGvlc9vQiy5Y/9GBlucEyo6lYuxg/FnukHCD/CP3NYeDAGV54TyZ19FgSqMEoPgOH9cyxvv8epQ1g==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "image-size": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", - "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==" - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "immutable": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "intl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", - "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" - }, - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "optional": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=" - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "optional": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-ssh": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", - "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - }, - "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", - "dev": true, - "requires": { - "handlebars": "^4.1.2" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "dev": true, - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", - "dev": true - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", - "dev": true - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - }, - "dependencies": { - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - } - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jetifier": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.4.tgz", - "integrity": "sha512-+f/4OLeqY8RAmXnonI1ffeY1DR8kMNJPhv5WMFehchf7U71cjMQVKkOz1n6asz6kfVoAqKNWJz1A/18i18AcXA==" - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsc-android": { - "version": "245459.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", - "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==" - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", - "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", - "requires": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", - "requires": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - }, - "dependencies": { - "xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" - } - } - }, - "level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=" - }, - "level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", - "requires": { - "string-range": "~1.2" - } - }, - "level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", - "requires": { - "level-fix-range": "~1.0.2" - } - }, - "level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", - "requires": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - }, - "dependencies": { - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=" - }, - "level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", - "requires": { - "clone": "~0.1.9" - } - }, - "object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", - "requires": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", - "requires": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - } - } - } - }, - "levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", - "requires": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "requires": { - "immediate": "~3.0.5" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "localized-strings": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/localized-strings/-/localized-strings-0.2.3.tgz", - "integrity": "sha512-uWO3E2jDynMBsJIglBMhALO3f1DnfOFzCSoCt+fPLGx94PXU1KfbgBx04J4xfjPwozRowAHk8bfaw8bgeKTTCQ==" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, - "lodash.times": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.times/-/lodash.times-4.3.2.tgz", - "integrity": "sha1-Ph8lZcQxdU1Uq1fy7RdBk5KFyh0=" - }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "logkitty": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.6.1.tgz", - "integrity": "sha512-cHuXN8qUZuzX/7kB6VyS7kB4xyD24e8gyHXIFNhIv+fjW3P+jEXNUhj0o/7qWJtv7UZpbnPgUqzu/AZQ8RAqxQ==", - "requires": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^12.0.5" - }, - "dependencies": { - "dayjs": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.16.tgz", - "integrity": "sha512-XPmqzWz/EJiaRHjBqSJ2s6hE/BUoCIHKgdS2QPtTQtKcS9E4/Qn0WomoH1lXanWCzri+g7zPcuNV4aTZ8PMORQ==" - } - } - }, - "loglevel": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", - "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", - "dev": true - }, - "loglevel-colored-level-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", - "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lottie-ios": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.1.3.tgz", - "integrity": "sha512-FKSx9l5Ekwm1Wt/ncoCwvsq8NAb1nylzMFlxrHixLYNBtO2eCQet+vwQag+74Nc/E9Lp3DKkBUCyBfz+zjtmAw==" - }, - "lottie-react-native": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-3.1.1.tgz", - "integrity": "sha512-zIHMQZoyAItPUw+42s38TwKA9+CWBaWxsTJhS8Ef7xbRWD9Gkr7UA6RrYfBJ0RZ4SKQ/V1YNnjp6200no+Rn8w==", - "requires": { - "invariant": "^2.2.2", - "lottie-ios": "^3.0.3", - "prop-types": "^15.5.10", - "react-native-safe-modules": "^1.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "macos-release": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", - "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==" - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "make-plural": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", - "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true, - "optional": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "merkle-lib": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" - }, - "messageformat": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", - "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", - "dev": true, - "requires": { - "make-plural": "^4.3.0", - "messageformat-formatters": "^2.0.1", - "messageformat-parser": "^4.1.2" - } - }, - "messageformat-formatters": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", - "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==", - "dev": true - }, - "messageformat-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz", - "integrity": "sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==", - "dev": true - }, - "metro": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.54.1.tgz", - "integrity": "sha512-6ODPT4mEo4FCpbExRNnQAcZmf1VeNvYOTMj2Na03FjGqhNODHhI2U/wF/Ul5gqTyJ2dVdkXeyvKW3gl/LrnJRg==", - "requires": { - "@babel/core": "^7.0.0", - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/plugin-external-helpers": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "absolute-path": "^0.0.0", - "async": "^2.4.0", - "babel-preset-fbjs": "^3.1.2", - "buffer-crc32": "^0.2.13", - "chalk": "^2.4.1", - "concat-stream": "^1.6.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "eventemitter3": "^3.0.0", - "fbjs": "^1.0.0", - "fs-extra": "^1.0.0", - "graceful-fs": "^4.1.3", - "image-size": "^0.6.0", - "invariant": "^2.2.4", - "jest-haste-map": "^24.7.1", - "jest-worker": "^24.6.0", - "json-stable-stringify": "^1.0.1", - "lodash.throttle": "^4.1.1", - "merge-stream": "^1.0.1", - "metro-babel-register": "0.54.1", - "metro-babel-transformer": "0.54.1", - "metro-cache": "0.54.1", - "metro-config": "0.54.1", - "metro-core": "0.54.1", - "metro-inspector-proxy": "0.54.1", - "metro-minify-uglify": "0.54.1", - "metro-react-native-babel-preset": "0.54.1", - "metro-resolver": "0.54.1", - "metro-source-map": "0.54.1", - "mime-types": "2.1.11", - "mkdirp": "^0.5.1", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.0", - "react-transform-hmr": "^1.0.4", - "resolve": "^1.5.0", - "rimraf": "^2.5.4", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "temp": "0.8.3", - "throat": "^4.1.0", - "wordwrap": "^1.0.0", - "write-file-atomic": "^1.2.0", - "ws": "^1.1.5", - "xpipe": "^1.0.5", - "yargs": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "metro-react-native-babel-preset": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz", - "integrity": "sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.0.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "metro-babel7-plugin-react-transform": "0.54.1", - "react-transform-hmr": "^1.0.4" - } - }, - "metro-source-map": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.54.1.tgz", - "integrity": "sha512-E9iSYMSUSq5qYi1R2hTQtxH4Mxjzfgr/jaSmQIWi7h3fG2P1qOZNNSzeaeUeTK+s2N/ksVlkcL5kMikol8CDrQ==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "source-map": "^0.5.6" - } - }, - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "requires": { - "mime-db": "~1.23.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "metro-babel-register": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.54.1.tgz", - "integrity": "sha512-j3VydgncUG8HP6AZala6GTIt3V01nptodnnOke3JMYLqgk8EJ1LOVOdotK9pXi80o7EmmNKFs/LyyH8z+uAJzQ==", - "requires": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/register": "^7.0.0", - "core-js": "^2.2.2", - "escape-string-regexp": "^1.0.5" - } - }, - "metro-babel-transformer": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.54.1.tgz", - "integrity": "sha512-2aiAnuYBdcLV1VINb8ENAA4keIaJIepHgR9+iRvIde+9GSjKnexqx4nNmJN392285gRDp1fVZ7uY0uQawK/A5g==", - "requires": { - "@babel/core": "^7.0.0" - } - }, - "metro-babel7-plugin-react-transform": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.54.1.tgz", - "integrity": "sha512-jWm5myuMoZAOhoPsa8ItfDxdTcOzKhTTzzhFlbZnRamE7i9qybeMdrZt8KHQpF7i2p/mKzE9Yhf4ouOz5K/jHg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0" - } - }, - "metro-cache": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.54.1.tgz", - "integrity": "sha512-RxCFoNcANHXZYi4MIQNnqh68gUnC3bMpzCFJY5pBoqqdrkkn8ibYglBweA0/DW7hx1OZTJWelwS1Dp8xxmE2CA==", - "requires": { - "jest-serializer": "^24.4.0", - "metro-core": "0.54.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4" - } - }, - "metro-config": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.54.1.tgz", - "integrity": "sha512-FpxrA+63rGkPGvGI653dvuSreJzU+eOTILItVnnhmqwn2SAK5V00N/qGTOIJe2YIuWEFXwCzw9lXmANrXbwuGg==", - "requires": { - "cosmiconfig": "^5.0.5", - "jest-validate": "^24.7.0", - "metro": "0.54.1", - "metro-cache": "0.54.1", - "metro-core": "0.54.1", - "pretty-format": "^24.7.0" - } - }, - "metro-core": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.54.1.tgz", - "integrity": "sha512-8oz3Ck7QFBzW9dG9tKFhrXHKPu2Ajx3R7eatf61Gl6Jf/tF7PNouv3wHxPsJW3oXDFiwKLszd89+OgleTGkB5g==", - "requires": { - "jest-haste-map": "^24.7.1", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.54.1", - "wordwrap": "^1.0.0" - } - }, - "metro-inspector-proxy": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.54.1.tgz", - "integrity": "sha512-sf6kNu7PgFW6U+hU7YGZfbAUKAPVvCJhY8YVu/A1RMKH9nNULrCo+jlWh0gWgmFfWRQiAPCElevROg+5somk8A==", - "requires": { - "connect": "^3.6.5", - "debug": "^2.2.0", - "rxjs": "^5.4.3", - "ws": "^1.1.5", - "yargs": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "metro-minify-uglify": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.54.1.tgz", - "integrity": "sha512-z+pOPna/8IxD4OhjW6Xo1mV2EszgqqQHqBm1FdmtdF6IpWkQp33qpDBNEi9NGZTOr7pp2bvcxZnvNJdC2lrK9Q==", - "requires": { - "uglify-es": "^3.1.9" - } - }, - "metro-react-native-babel-preset": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.0.tgz", - "integrity": "sha512-MAo1fm0dNn6MVZmylaz6k2HC1MINHLTLfE7O3a9Xz3fAtbGbApisp06rBUfK5uUqIJDmAaKgbiT34lHJSIiE6Q==", - "dev": true, - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.0.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - } - }, - "metro-react-native-babel-transformer": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.54.1.tgz", - "integrity": "sha512-ECw7xG91t8dk/PHdiyoC5SP1s9OQzfmJzG5m0YOZaKtHMe534qTDbncxaKfTI3CP99yti2maXFBRVj+xyvph/g==", - "requires": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.1.2", - "metro-babel-transformer": "0.54.1", - "metro-react-native-babel-preset": "0.54.1" - }, - "dependencies": { - "metro-react-native-babel-preset": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz", - "integrity": "sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.0.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "metro-babel7-plugin-react-transform": "0.54.1", - "react-transform-hmr": "^1.0.4" - } - } - } - }, - "metro-resolver": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.54.1.tgz", - "integrity": "sha512-Byv1LIawYAASy9CFRwzrncYnqaFGLe8vpw178EtzStqP05Hu6hXSqkNTrfoXa+3V9bPFGCrVzFx2NY3gFp2btg==", - "requires": { - "absolute-path": "^0.0.0" - } - }, - "metro-source-map": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.55.0.tgz", - "integrity": "sha512-HZODA0KPl5onJNGIztfTHHWurR2nL6Je/X8wwj+bL4ZBB/hSMVeDk7rWReCAvO3twVz7Ztp8Si0jfMmmH4Ruuw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.55.0", - "ob1": "0.55.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, - "metro-symbolicate": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.55.0.tgz", - "integrity": "sha512-3r3Gpv5L4U7rBGpIqw5S1nun5MelfUMLRiScJsPRGZVTX3WY1w+zpaQKlWBi5yuHf5dMQ+ZUVbhb02IdrfJ2Fg==", - "requires": { - "metro-source-map": "0.55.0", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", - "requires": { - "basic-auth": "~2.0.0", - "debug": "2.6.9", - "depd": "~1.1.2", - "on-finished": "~2.3.0", - "on-headers": "~1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nconf": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", - "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", - "requires": { - "async": "^1.4.0", - "ini": "^1.3.0", - "secure-keys": "^1.0.0", - "yargs": "^3.19.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-react-native": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/node-libs-react-native/-/node-libs-react-native-1.0.3.tgz", - "integrity": "sha512-2X/M/DMB4hij2L0tsnJOiDhYR2N0YtetIhb/eN5+5vksLxjXwaFgLbSXWT3XExnGJpISDn8dYuYz6yvdndjjkg==", - "requires": { - "assert": "^1.4.1", - "browserify-zlib": "^0.2.0", - "buffer": "^5.0.6", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.0", - "punycode": "^2.1.0", - "querystring-es3": "^0.2.0", - "react-native-crypto": "^2.0.1", - "react-native-randombytes": "^3.5.1", - "readable-stream": "^2.2.9", - "stream-http": "^2.3.1", - "string_decoder": "^1.0.3", - "timers-browserify": "^2.0.2", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3" - }, - "dependencies": { - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-releases": { - "version": "1.1.34", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.34.tgz", - "integrity": "sha512-fNn12JTEfniTuCqo0r9jXgl44+KxRH/huV7zM/KAGOKxDKrHr6EbT7SSs4B+DNxyBE2mks28AD+Jw6PkfY5uwA==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "ob1": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.55.0.tgz", - "integrity": "sha512-pfyiMVsUItl8WiRKMT15eCi662pCRAuYTq2+V3UpE+PpFErJI/TvRh/M/l/9TaLlbFr7krJ7gdl+FXJNcybmvw==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", - "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.15.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - } - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opencollective": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", - "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", - "requires": { - "babel-polyfill": "6.23.0", - "chalk": "1.1.3", - "inquirer": "3.0.6", - "minimist": "1.2.0", - "node-fetch": "1.6.3", - "opn": "4.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "inquirer": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", - "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", - "requires": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.1", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^2.0.0", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "node-fetch": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", - "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" - }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pac-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", - "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", - "requires": { - "agent-base": "^4.2.0", - "debug": "^4.1.1", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^4.0.1" - } - }, - "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", - "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" - }, - "parse-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", - "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-url": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", - "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.0.tgz", - "integrity": "sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", - "requires": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "prettier": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==" - }, - "prettier-eslint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-9.0.0.tgz", - "integrity": "sha512-0dael2aMpMAxAwClnLi2Coc30v3BubsTX6clqseZ8NFCJZnbZlwxZGHHESYBlqTyN9lvZDHHv+XdeHW0fKhxJQ==", - "dev": true, - "requires": { - "@typescript-eslint/parser": "^1.10.2", - "common-tags": "^1.4.0", - "core-js": "^3.1.4", - "dlv": "^1.1.0", - "eslint": "^5.0.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^1.7.0", - "pretty-format": "^23.0.1", - "require-relative": "^0.8.7", - "typescript": "^3.2.1", - "vue-eslint-parser": "^2.0.2" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "core-js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", - "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - } - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "prettier-eslint-cli": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/prettier-eslint-cli/-/prettier-eslint-cli-5.0.0.tgz", - "integrity": "sha512-cei9UbN1aTrz3sQs88CWpvY/10PYTevzd76zoG1tdJ164OhmNTFRKPTOZrutVvscoQWzbnLKkviS3gu5JXwvZg==", - "dev": true, - "requires": { - "arrify": "^2.0.1", - "boolify": "^1.0.0", - "camelcase-keys": "^6.0.0", - "chalk": "^2.4.2", - "common-tags": "^1.8.0", - "core-js": "^3.1.4", - "eslint": "^5.0.0", - "find-up": "^4.1.0", - "get-stdin": "^7.0.0", - "glob": "^7.1.4", - "ignore": "^5.1.2", - "lodash.memoize": "^4.1.2", - "loglevel-colored-level-prefix": "^1.0.0", - "messageformat": "^2.2.1", - "prettier-eslint": "^9.0.0", - "rxjs": "^6.5.2", - "yargs": "^13.2.4" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "core-js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", - "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prompts": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", - "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "protocols": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", - "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==" - }, - "proxy-agent": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", - "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", - "requires": { - "agent-base": "^4.2.0", - "debug": "4", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^3.0.1", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^4.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pushdata-bitcoin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", - "requires": { - "bitcoin-ops": "^1.3.0" - } - }, - "qrcode": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.2.tgz", - "integrity": "sha512-eR6RgxFYPDFH+zFLTJKtoNP/RlsHANQb52AUmQ2bGDPMuUw7jJb0F+DNEgx7qQGIElrbFxWYMc0/B91zLZPF9Q==", - "requires": { - "dijkstrajs": "^1.0.1", - "isarray": "^2.0.1", - "pngjs": "^3.3.0", - "yargs": "^13.2.4" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "r2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/r2/-/r2-2.0.1.tgz", - "integrity": "sha512-EEmxoxYCe3LHzAUhRIRxdCKERpeRNmlLj6KLUSORqnK6dWl/K5ShmDGZqM2lRZQeqJgF+wyqk0s1M7SWUveNOQ==", - "requires": { - "caseless": "^0.12.0", - "node-fetch": "^2.0.0-alpha.8", - "typedarray-to-buffer": "^3.1.2" - } - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "optional": true - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, - "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-addons-shallow-compare": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz", - "integrity": "sha1-GYoAuR/DdiPbZKKP0XtZa6NicC8=", - "requires": { - "fbjs": "^0.8.4", - "object-assign": "^4.1.0" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - } - } - }, - "react-deep-force-update": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz", - "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA==" - }, - "react-devtools-core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.3.tgz", - "integrity": "sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ==", - "requires": { - "shell-quote": "^1.6.1", - "ws": "^3.3.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-localization": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/react-localization/-/react-localization-1.0.13.tgz", - "integrity": "sha512-VKbcCpf6FnjhUs1QpEpxGeZCVyAGRknk58w1fG4L4CWHfju/v9A6eyPgRnw6WmKgn2A5EJZt9ewkiP1pQFEwEA==", - "requires": { - "localized-strings": "^0.2.00", - "react": "^16.0.0" - } - }, - "react-native": { - "version": "0.60.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.60.5.tgz", - "integrity": "sha512-cZwI0XzzihACN+7an1Dy46A83FRaAe2Xyd7laCalFFAppZIYeMVphZQWrVljJk5kIZBNtYG35TY1VsghQ0Oc2Q==", - "requires": { - "@babel/runtime": "^7.0.0", - "@react-native-community/cli": "^2.6.0", - "@react-native-community/cli-platform-android": "^2.6.0", - "@react-native-community/cli-platform-ios": "^2.4.1", - "abort-controller": "^3.0.0", - "art": "^0.10.0", - "base64-js": "^1.1.2", - "connect": "^3.6.5", - "create-react-class": "^15.6.3", - "escape-string-regexp": "^1.0.5", - "event-target-shim": "^5.0.1", - "fbjs": "^1.0.0", - "fbjs-scripts": "^1.1.0", - "hermesvm": "^0.1.0", - "invariant": "^2.2.4", - "jsc-android": "245459.0.0", - "metro-babel-register": "0.54.1", - "metro-react-native-babel-transformer": "0.54.1", - "metro-source-map": "^0.55.0", - "nullthrows": "^1.1.0", - "pretty-format": "^24.7.0", - "promise": "^7.1.1", - "prop-types": "^15.7.2", - "react-devtools-core": "^3.6.1", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.14.0", - "stacktrace-parser": "^0.1.3", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "@react-native-community/cli": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-2.9.0.tgz", - "integrity": "sha512-6TYkrR1pwIEPpiPZnOYscCGr5Xh8RijqBPVAOGTaEdpQQpc/J7GDPrePwbyTzwmCPtiK6XT+T5+1AiAK5bz/sw==", - "requires": { - "@hapi/joi": "^15.0.3", - "@react-native-community/cli-platform-android": "^2.9.0", - "@react-native-community/cli-platform-ios": "^2.9.0", - "@react-native-community/cli-tools": "^2.8.3", - "chalk": "^2.4.2", - "commander": "^2.19.0", - "compression": "^1.7.1", - "connect": "^3.6.5", - "cosmiconfig": "^5.1.0", - "deepmerge": "^3.2.0", - "envinfo": "^7.1.0", - "errorhandler": "^1.5.0", - "execa": "^1.0.0", - "fs-extra": "^7.0.1", - "glob": "^7.1.1", - "graceful-fs": "^4.1.3", - "inquirer": "^3.0.6", - "lodash": "^4.17.5", - "metro": "^0.54.1", - "metro-config": "^0.54.1", - "metro-core": "^0.54.1", - "metro-react-native-babel-transformer": "^0.54.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "morgan": "^1.9.0", - "node-notifier": "^5.2.1", - "open": "^6.2.0", - "ora": "^3.4.0", - "plist": "^3.0.0", - "semver": "^5.0.3", - "serve-static": "^1.13.1", - "shell-quote": "1.6.1", - "ws": "^1.1.0" - } - }, - "commander": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", - "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "scheduler": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.14.0.tgz", - "integrity": "sha512-9CgbS06Kki2f4R9FjLSITjZo5BZxPsryiRNyL3LpvrM9WxcVmhlqAOc9E+KQbeI2nqej4JIIbOsfdL51cNb4Iw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "react-native-animatable": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/react-native-animatable/-/react-native-animatable-1.3.2.tgz", - "integrity": "sha512-rmah3KQ63ft8DxkzFUwJSuZeq+oSYwldoGF4DTOR5WM2WR5wiWLgBAtrAHlI3Di3by323uOR21s+MlqPcHz2Kw==", - "requires": { - "prop-types": "^15.5.10" - } - }, - "react-native-biometrics": { - "version": "git+https://github.com/BlueWallet/react-native-biometrics.git#8901d29b3d3443b0bc280c941d879ccf45ac01da", - "from": "git+https://github.com/BlueWallet/react-native-biometrics.git" - }, - "react-native-camera": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.4.0.tgz", - "integrity": "sha512-EFaixLtQsd3Kjs2AnxPx4Qb1mNSlZRZBVoxXDUdWcSdCEE3CSvdeonTb3vWAT3ZlGMi1RTOggtBpI4StMtFNjw==", - "requires": { - "prop-types": "^15.6.2" - } - }, - "react-native-crypto": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/react-native-crypto/-/react-native-crypto-2.2.0.tgz", - "integrity": "sha512-eZu9Y8pa8BN9FU2pIex7MLRAi+Cd1Y6bsxfiufKh7sfraAACJvjQTeW7/zcQAT93WMfM+D0OVk+bubvkrbrUkw==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.4", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "3.0.8", - "public-encrypt": "^4.0.0", - "randomfill": "^1.0.3" - }, - "dependencies": { - "pbkdf2": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.8.tgz", - "integrity": "sha1-L4q/FuvsyCJ3lF10irodeHYfYeI=", - "requires": { - "create-hmac": "^1.1.2" - } - } - } - }, - "react-native-device-info": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-4.0.1.tgz", - "integrity": "sha512-a0Q/gwy1oQhu17CeMq9xMZ3Sl9foaj8hFwVuy9jieqkkoQwkHnPDI+R7bEW0MNMgUCPPrzzXvka+FLGOWVqacg==" - }, - "react-native-elements": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/react-native-elements/-/react-native-elements-0.19.0.tgz", - "integrity": "sha1-c3xRmL90h/mYbiAjgmzQvXpQA2Y=", - "requires": { - "lodash.isempty": "^4.4.0", - "lodash.times": "^4.3.2", - "opencollective": "^1.0.3", - "prop-types": "^15.5.8" - } - }, - "react-native-flexi-radio-button": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/react-native-flexi-radio-button/-/react-native-flexi-radio-button-0.2.2.tgz", - "integrity": "sha1-oBgDk8UxujR3cixuQqMc6xwRYjs=" - }, - "react-native-fs": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.13.3.tgz", - "integrity": "sha512-B62LSSAEYQGItg7KVTzTVVCxezOYFBYp4DMVFbdoZUd1mZVFdqR2sy1HY1mye1VI/Lf3IbxSyZEQ0GmrrdwLjg==", - "requires": { - "base-64": "^0.1.0", - "utf8": "^2.1.1" - } - }, - "react-native-gesture-handler": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.3.0.tgz", - "integrity": "sha512-ASRFIXBuKRvqlmwkWJhV8yP2dTpvcqVrLNpd7FKVBFHYWr6SAxjGyO9Ik8w1lAxDhMlRP2IcJ9p9eq5X2WWeLQ==", - "requires": { - "hoist-non-react-statics": "^2.3.1", - "invariant": "^2.2.2", - "prop-types": "^15.5.10" - } - }, - "react-native-handoff": { - "version": "git+https://github.com/marcosrdz/react-native-handoff.git#05fc7dee3843d8c8ae150c0def753d4a9322230e", - "from": "git+https://github.com/marcosrdz/react-native-handoff.git" - }, - "react-native-haptic-feedback": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-1.7.1.tgz", - "integrity": "sha512-iuXBEZsQbKOe5uOLXuzTEvrvUCV0a4AktAfJHlWK7Jb0t/ABUc4kUfclqx+la+yA1TKrauDp/6MjrP0OUDXA9Q==" - }, - "react-native-image-picker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-1.1.0.tgz", - "integrity": "sha512-/KjHf4NNAjl6XM7FQuqvGDz1wB9sRdLf86+2yksLW/QTRR7CitX4TLCM8ZF9CX6Y0MsCTndkZia3zWE+nt/GiA==" - }, - "react-native-level-fs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-native-level-fs/-/react-native-level-fs-3.0.1.tgz", - "integrity": "sha1-8wVGFMK8Gjedyz0+5RtqG2YSMoM=", - "requires": { - "level-filesystem": "^1.0.1", - "levelup": "^0.18.2" - } - }, - "react-native-linear-gradient": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.5.4.tgz", - "integrity": "sha512-FF1NhlerA4uBiS0gFIHa4FBp8/aftv4vPj14Y47lGNkYjSI94tnI6oYO3EfUxXjEyCUPiOVNKZOB9kScyjc5Ew==" - }, - "react-native-modal": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-11.1.0.tgz", - "integrity": "sha512-gSD21evs2m+C/vtRS+R/I1ZuIN5td+K+I9Dt04HpBzux3HyA9km2oonQy8t+EKUNN2rFYjFntfUOMmb3vj7i8A==", - "requires": { - "prop-types": "^15.6.2", - "react-native-animatable": "^1.3.1" - } - }, - "react-native-obscure": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-native-obscure/-/react-native-obscure-1.2.1.tgz", - "integrity": "sha512-zepY31U2HAWrxPP+uGhDFFa1yGdbIa06iviCYRQJcEN2K4gtcEYBCtsk+PdClaiwIREZOQ7YKscxCIlZyR1m6w==" - }, - "react-native-popup-menu-android": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-native-popup-menu-android/-/react-native-popup-menu-android-1.0.3.tgz", - "integrity": "sha512-DzEU0Ejl/kMZz6FJ7Mks8se4jceJZk9QINHILNU9GQFrjP4mxodZ9HiqVbs9F+xUE4NCOE8Ib36MxxdfLRw1OQ==" - }, - "react-native-privacy-snapshot": { - "version": "git+https://github.com/BlueWallet/react-native-privacy-snapshot.git#a7c594fb5de6d2cbbb55c2d539a37dc25eda74d8", - "from": "git+https://github.com/BlueWallet/react-native-privacy-snapshot.git" - }, - "react-native-prompt-android": { - "version": "git+https://github.com/marcosrdz/react-native-prompt-android.git#87bf3adb5f22b4d1ecaa517e93347101372398f5", - "from": "git+https://github.com/marcosrdz/react-native-prompt-android.git" - }, - "react-native-qrcode-svg": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-native-qrcode-svg/-/react-native-qrcode-svg-5.1.2.tgz", - "integrity": "sha512-nQ0x2DHQMC2XI5QDxYMGaUhqZ4UT/o/V1Wr0oet5uZwkfnc8OoPt08dae/tO7VcCG7x3plmmafm7Tsh3g67bHA==", - "requires": { - "prop-types": "^15.5.10", - "qrcode": "^1.2.0" - } - }, - "react-native-randombytes": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/react-native-randombytes/-/react-native-randombytes-3.5.3.tgz", - "integrity": "sha512-n/7QwMrRJxHr+/3mt2KxqqacGylM+ssW+FfBTgXGzvwq5KzSohooEWf6Z6MTSByuJ/izP9VbSPtwomPwzvupKQ==", - "requires": { - "buffer": "^4.9.1", - "sjcl": "^1.0.3" - }, - "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - } - } - }, - "react-native-rate": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/react-native-rate/-/react-native-rate-1.1.7.tgz", - "integrity": "sha512-wsutrWcjV0Zl7zqjyHUl6G/6MyksJS3zOhJ3dxw7mnQPDT7/jxeb3G2IsltITy7XE1b5C6fuOLwngfzIzZMF6w==" - }, - "react-native-safe-area-view": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-0.14.8.tgz", - "integrity": "sha512-MtRSIcZNstxv87Jet+UsPhEd1tpGe8cVskDXlP657x6rHpSrbrc+y13ZNXrwAgGNNhqQNX7UJT68ZIq//ZRmvw==", - "requires": { - "hoist-non-react-statics": "^2.3.1" - } - }, - "react-native-safe-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-native-safe-modules/-/react-native-safe-modules-1.0.0.tgz", - "integrity": "sha512-ShT8duWBT30W4OFcltZl+UvpPDikZFURvLDQqAsrvbyy6HzWPGJDCpdqM+6GqzPPs4DPEW31YfMNmdJcZ6zI2w==", - "requires": { - "dedent": "^0.6.0" - } - }, - "react-native-screens": { - "version": "1.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-1.0.0-alpha.23.tgz", - "integrity": "sha512-tOxHGQUN83MTmQB4ghoQkibqOdGiX4JQEmeyEv96MKWO/x8T2PJv84ECUos9hD3blPRQwVwSpAid1PPPhrVEaw==", - "requires": { - "debounce": "^1.2.0" - } - }, - "react-native-secure-key-store": { - "version": "git+https://github.com/marcosrdz/react-native-secure-key-store.git#eda78b4dd9696c8ff56569e077ccb630a2e65ac1", - "from": "git+https://github.com/marcosrdz/react-native-secure-key-store.git" - }, - "react-native-share": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-2.0.0.tgz", - "integrity": "sha512-J8Xl3mq0L9KDFtSYtKsQDAnZWw/niZIpAD1PRiNfZFHo44Rc+oS2bEIhskNnoQXKEgBNdPzCl/DenMXYAHXRYg==" - }, - "react-native-snap-carousel": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/react-native-snap-carousel/-/react-native-snap-carousel-3.8.0.tgz", - "integrity": "sha512-YtDZLv2Di77HfnH4yf+NyyYyISPNjrnjXDQLrzOkG9kkSlho/BROgHLQKGRLg3C2YSUMArFOePrb9CH3yeV5FA==", - "requires": { - "prop-types": "^15.6.1", - "react-addons-shallow-compare": "15.6.2" - } - }, - "react-native-sortable-list": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/react-native-sortable-list/-/react-native-sortable-list-0.0.23.tgz", - "integrity": "sha512-qfjTWk9878gQCc3do4cqc3MlDEFmQRd98UuvDDwMIjhAGtIFnOWozp6KTv9zTJ3QBqe9VbvtswuK0rpXFgGzew==", - "requires": { - "prop-types": "^15.5.10" - } - }, - "react-native-svg": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-9.5.1.tgz", - "integrity": "sha512-cRGfomzG/5LEwuJ6ct3m5yccckeI9aj8BNYwDPVxOeJ84LuJuvk5OqcjlYNeEzOWmWiH+QrFXfpLH1ag04bUeQ==" - }, - "react-native-tab-view": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-1.4.1.tgz", - "integrity": "sha512-Bke8KkDcDhvB/z0AS7MnQKMD2p6Kwfc1rSKlMOvg9CC5CnClQ2QEnhPSbwegKDYhUkBI92iH/BYy7hNSm5kbUQ==", - "requires": { - "prop-types": "^15.6.1" - } - }, - "react-native-tcp": { - "version": "git+https://github.com/aprock/react-native-tcp.git#c29cf0f29c14eab41182a37af54ef7b2409620b2", - "from": "git+https://github.com/aprock/react-native-tcp.git", - "requires": { - "base64-js": "0.0.8", - "buffer": "^5.0.0", - "events": "^1.0.2", - "ip-regex": "^1.0.3", - "process": "^0.11.9", - "util": "^0.10.3" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "react-native-tooltip": { - "version": "git+https://github.com/marcosrdz/react-native-tooltip.git#e0e88d212b5b7f350e5eabba87f588a32e0f2590", - "from": "git+https://github.com/marcosrdz/react-native-tooltip.git" - }, - "react-native-vector-icons": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-6.6.0.tgz", - "integrity": "sha512-MImKVx8JEvVVBnaShMr7/yTX4Y062JZMupht1T+IEgbqBj4aQeQ1z2SH4VHWKNtWtppk4kz9gYyUiMWqx6tNSw==", - "requires": { - "lodash": "^4.0.0", - "prop-types": "^15.6.2", - "yargs": "^13.2.2" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "react-native-watch-connectivity": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/react-native-watch-connectivity/-/react-native-watch-connectivity-0.3.2.tgz", - "integrity": "sha512-NA8XHZ31i7wE1MvuOiZqk93EOl/YgvXW0g0TU7/O701QPMkUhzRWlLJxOa9opcgYLLZ6VlvvhdxJ7ZMntreJKQ==" - }, - "react-native-webview": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-6.9.0.tgz", - "integrity": "sha512-pipcyQNhSjSfMyle+JugLwYXJBJ0rQCnJOgkz7EcsZbrAvGjFbQOAjDRYi86y9Ibw+h+sjdhPWcLi/kSHScc+w==", - "requires": { - "escape-string-regexp": "1.0.5", - "invariant": "2.2.4" - } - }, - "react-navigation": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-3.11.0.tgz", - "integrity": "sha512-wlPcDtNiIdPeYxNQ/MN4arY5Xe9EphD2QVpRuvvuPWW+BamF3AJaIy060r3Yz59DODAoWllscabat/yqnih8Tg==", - "requires": { - "@react-navigation/core": "~3.4.1", - "@react-navigation/native": "~3.5.0", - "react-navigation-drawer": "~1.2.1", - "react-navigation-stack": "~1.4.0", - "react-navigation-tabs": "~1.1.4" - } - }, - "react-navigation-drawer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-navigation-drawer/-/react-navigation-drawer-1.2.1.tgz", - "integrity": "sha512-T2kaBjY2c4/3I6noWFnaf/c18ntNH5DsST38i+pdc2NPxn5Yi5lkK+ZZTeKuHSFD4a7G0jWY9OGf1iRkHWLMAQ==", - "requires": { - "react-native-tab-view": "^1.2.0" - } - }, - "react-navigation-hooks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-navigation-hooks/-/react-navigation-hooks-1.1.0.tgz", - "integrity": "sha512-ZY/aiYJ88KXaOo8iOa4171O/0x6ztGhUPd2OYzdaJhLT/tP64zi5HB/RZFImuKhaBTODXjoSpFaOTA5xpePG4g==" - }, - "react-navigation-stack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-navigation-stack/-/react-navigation-stack-1.4.0.tgz", - "integrity": "sha512-zEe9wCA0Ot8agarYb//0nSWYW1GM+1R0tY/nydUV0EizeJ27At0EklYVWvYEuYU6C48va6cu8OPL7QD/CcJACw==" - }, - "react-navigation-tabs": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/react-navigation-tabs/-/react-navigation-tabs-1.1.4.tgz", - "integrity": "sha512-py2hLCRxPwXOzmY1W9XcY1rWXxdK6RGW/aXh56G9gIf8cpHNDhy/bJV4e46/JrVcse3ybFaN0liT09/DM/NdwQ==", - "requires": { - "hoist-non-react-statics": "^2.5.0", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "react-native-tab-view": "^1.4.1" - } - }, - "react-proxy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", - "integrity": "sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo=", - "requires": { - "lodash": "^4.6.1", - "react-deep-force-update": "^1.0.0" - } - }, - "react-refresh": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", - "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==", - "dev": true - }, - "react-shallow-testutils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-shallow-testutils/-/react-shallow-testutils-2.0.0.tgz", - "integrity": "sha1-kIe0CzaLEkZ0x7/Pn91q2YORSpc=" - }, - "react-test-render": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/react-test-render/-/react-test-render-1.1.2.tgz", - "integrity": "sha512-XurcR3Eh0TwFopBShDNgPny29Z8wczAFnKsxUqSSgNN6FrpsNg39Q3/13bK5oBFWOLod3enZG698HZNlJ3oRsw==", - "requires": { - "immutable": "3.7.x", - "lodash": "^4.17.15", - "react-shallow-testutils": "2.0.x" - } - }, - "react-test-renderer": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", - "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.13.6" - } - }, - "react-transform-hmr": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz", - "integrity": "sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s=", - "requires": { - "global": "^4.3.0", - "react-proxy": "^1.1.7" - } - }, - "read-env": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/read-env/-/read-env-1.3.0.tgz", - "integrity": "sha512-DbCgZ8oHwZreK/E2E27RGk3EUPapMhYGSGIt02k9sX6R3tCFc4u4tkltKvkCvzEQ3SOLUaiYHAnGb+TdsnPp0A==", - "requires": { - "camelcase": "5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - } - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "requires": { - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "^1.0.1" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==" - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rn-nodeify": { - "version": "github:tradle/rn-nodeify#580705c3ee0227298d0d12dba413f7aa3bb24ebb", - "from": "github:tradle/rn-nodeify", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.0.0", - "deep-equal": "^1.0.0", - "findit": "^2.0.0", - "fs-extra": "^0.22.1", - "minimist": "^1.1.2", - "object.pick": "^1.1.1", - "run-parallel": "^1.1.2", - "semver": "^5.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.22.1.tgz", - "integrity": "sha1-X9b4BJ3JdsoZ6yNV1lgXPKvM4FY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" - }, - "secure-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/secure-random/-/secure-random-1.1.2.tgz", - "integrity": "sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "^5.0.3" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-plist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.0.0.tgz", - "integrity": "sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g==", - "requires": { - "bplist-creator": "0.0.7", - "bplist-parser": "0.1.1", - "plist": "^3.0.1" - } - }, - "sisteransi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", - "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", - "dev": true - }, - "sjcl": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.8.tgz", - "integrity": "sha512-LzIjEQ0S0DpIgnxMEayM1rq9aGwGRG4OnZhCdjx7glTaJtf4zRfpg87ImfjSJjoW9vKpagd82McDOwbRT5kQKQ==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "snyk": { - "version": "1.239.5", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.239.5.tgz", - "integrity": "sha512-IMvGwmLG2BssJv1WwzDdKpdKWCFDWOEzmKnDgh44KIKbLuUkbjYTYarSyqHAXn1mXqFi9voDgCCjK/S7RYvm3A==", - "requires": { - "@snyk/cli-interface": "2.2.0", - "@snyk/dep-graph": "1.13.1", - "@snyk/gemfile": "1.2.0", - "@snyk/snyk-cocoapods-plugin": "1.0.3", - "@types/agent-base": "^4.2.0", - "@types/restify": "^4.3.6", - "abbrev": "^1.1.1", - "ansi-escapes": "3.2.0", - "chalk": "^2.4.2", - "cli-spinner": "0.2.10", - "configstore": "^3.1.2", - "debug": "^3.1.0", - "diff": "^4.0.1", - "git-url-parse": "11.1.2", - "glob": "^7.1.3", - "inquirer": "^6.2.2", - "lodash": "^4.17.14", - "needle": "^2.2.4", - "opn": "^5.5.0", - "os-name": "^3.0.0", - "proxy-agent": "^3.1.1", - "proxy-from-env": "^1.0.0", - "semver": "^6.0.0", - "snyk-config": "^2.2.1", - "snyk-docker-plugin": "1.33.1", - "snyk-go-plugin": "1.11.1", - "snyk-gradle-plugin": "3.1.0", - "snyk-module": "1.9.1", - "snyk-mvn-plugin": "2.4.0", - "snyk-nodejs-lockfile-parser": "1.16.0", - "snyk-nuget-plugin": "1.13.1", - "snyk-php-plugin": "1.6.4", - "snyk-policy": "1.13.5", - "snyk-python-plugin": "^1.13.3", - "snyk-resolve": "1.0.1", - "snyk-resolve-deps": "4.4.0", - "snyk-sbt-plugin": "2.8.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "1.3.1", - "source-map-support": "^0.5.11", - "strip-ansi": "^5.2.0", - "tempfile": "^2.0.0", - "then-fs": "^2.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - } - } - }, - "snyk-config": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.3.tgz", - "integrity": "sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw==", - "requires": { - "debug": "^3.1.0", - "lodash": "^4.17.15", - "nconf": "^0.10.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-docker-plugin": { - "version": "1.33.1", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.33.1.tgz", - "integrity": "sha512-xfs3DN1tPMTh6J8x2341wGK4HRr+pI5+i/YRuRmsslnBnwk/DkKYcbt8zOIWk6kzMoW8vo+9LqqXBQO/24szKg==", - "requires": { - "debug": "^4.1.1", - "dockerfile-ast": "0.0.16", - "semver": "^6.1.0", - "tar-stream": "^2.1.0", - "tslib": "^1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "snyk-go-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.3.1.tgz", - "integrity": "sha512-jrFRfIk6yGHFeipGD66WV9ei/A/w/lIiGqI80w1ndMbg6D6M5pVNbK7ngDTmo4GdHrZDYqx/VBGBsUm2bol3Rg==", - "requires": { - "toml": "^3.0.0", - "tslib": "^1.9.3" - } - }, - "snyk-go-plugin": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.11.1.tgz", - "integrity": "sha512-IsNi7TmpHoRHzONOWJTT8+VYozQJnaJpKgnYNQjzNm2JlV8bDGbdGQ1a8LcEoChxnJ8v8aMZy7GTiQyGGABtEQ==", - "requires": { - "debug": "^4.1.1", - "graphlib": "^2.1.1", - "snyk-go-parser": "1.3.1", - "tmp": "0.0.33", - "tslib": "^1.10.0" - } - }, - "snyk-gradle-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-3.1.0.tgz", - "integrity": "sha512-789Rqyhv1+WYbfy1Qilgsw0FMccedSaCO5n+54CXXGVUZWMsVvqJj3T8k7+vis+9Eq+Sgbdzti8vDtApz6rWWQ==", - "requires": { - "@snyk/cli-interface": "^2.1.0", - "@types/debug": "^4.1.4", - "chalk": "^2.4.2", - "clone-deep": "^0.3.0", - "debug": "^4.1.1", - "tmp": "0.0.33", - "tslib": "^1.9.3" - } - }, - "snyk-module": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", - "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", - "requires": { - "debug": "^3.1.0", - "hosted-git-info": "^2.7.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-mvn-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.4.0.tgz", - "integrity": "sha512-Fmt6Mjx6zZz+4q6PnBkhuNGhEX++q/pKMI26ls4p3JPkx4KxBz89oncpkmf7P8YCkoaka8oHhtDEv/R4Z9LleQ==", - "requires": { - "lodash": "^4.17.15", - "tslib": "1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - } - } - }, - "snyk-nodejs-lockfile-parser": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.16.0.tgz", - "integrity": "sha512-cf3uozRXEG88nsjOQlo+SfOJPpcLs45qpnuk2vhBBZ577IMnV+fTOJQsP2YRiikLUbdgkVlduviwUO6OVn1PhA==", - "requires": { - "@yarnpkg/lockfile": "^1.0.2", - "graphlib": "^2.1.5", - "lodash": "^4.17.14", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3", - "uuid": "^3.3.2" - } - }, - "snyk-nuget-plugin": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.13.1.tgz", - "integrity": "sha512-2AQVeahBK7Rt38p0Acl1fMsFQu3dsqoRODPoRaS0IM/bOBzVdAkDF9pCb5yKMREGpMZcyRFkt8Q+hGiUk0Nlfg==", - "requires": { - "debug": "^3.1.0", - "dotnet-deps-parser": "4.5.2", - "jszip": "^3.1.5", - "lodash": "^4.17.14", - "snyk-paket-parser": "1.5.0", - "tslib": "^1.9.3", - "xml2js": "^0.4.17" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-paket-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.5.0.tgz", - "integrity": "sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "snyk-php-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.6.4.tgz", - "integrity": "sha512-FFQeimtbwq17nDUS0o0zuKgyjXSX7SpoC9iYTeKvxTXrmKf2QlxTtPvmMM4/hQxehEu1i40ow1Ozw0Ahxm8Dpw==", - "requires": { - "@snyk/composer-lockfile-parser": "1.0.3", - "tslib": "1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - } - } - }, - "snyk-policy": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", - "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", - "requires": { - "debug": "^3.1.0", - "email-validator": "^2.0.4", - "js-yaml": "^3.13.1", - "lodash.clonedeep": "^4.5.0", - "semver": "^6.0.0", - "snyk-module": "^1.9.1", - "snyk-resolve": "^1.0.1", - "snyk-try-require": "^1.3.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "snyk-python-plugin": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.13.3.tgz", - "integrity": "sha512-Ud7mHmpMG4uCChvYLx5jA8HwOV/FNpT65xTxSt+6wsOjIUTuLiqM86mbvgzgk3pir8vMP9yQEsCi1i0zYLBArw==", - "requires": { - "@snyk/cli-interface": "^2.0.3", - "tmp": "0.0.33" - } - }, - "snyk-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", - "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", - "requires": { - "debug": "^3.1.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-resolve-deps": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz", - "integrity": "sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ==", - "requires": { - "@types/node": "^6.14.4", - "@types/semver": "^5.5.0", - "ansicolors": "^0.3.2", - "debug": "^3.2.5", - "lodash.assign": "^4.2.0", - "lodash.assignin": "^4.2.0", - "lodash.clone": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lru-cache": "^4.0.0", - "semver": "^5.5.1", - "snyk-module": "^1.6.0", - "snyk-resolve": "^1.0.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "^1.1.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "@types/node": { - "version": "6.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.8.tgz", - "integrity": "sha512-ZVswkI0zxOcADy2b4T9Lj3N+OYyHwCyzMtmkRIi1P94vF/GOLpDPB76P1uBXX/QM6e5wICriSz2XBPSBdxIN5g==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-sbt-plugin": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.8.0.tgz", - "integrity": "sha512-ZzyBdND5CsaO0xkv05geZXu8Dd6Llvr/5oTj811U7h7UmrvljrAiABW4RGjRJPrPVuuJaDej2p633sgGtK9UsA==", - "requires": { - "semver": "^6.1.2", - "tmp": "^0.1.0", - "tree-kill": "^1.2.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, - "snyk-tree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", - "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", - "requires": { - "archy": "^1.0.0" - } - }, - "snyk-try-require": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", - "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", - "requires": { - "debug": "^3.1.0", - "lodash.clonedeep": "^4.3.0", - "lru-cache": "^4.0.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", - "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, - "stacktrace-parser": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.7.tgz", - "integrity": "sha512-Evm+NuZ2ZTwGazsbsZC+EV1EGsvyxgIvtNwbyFfeXaq/8L78M5Kdh0qpmQaTkUpbOAKbbPP7c7qZa7u8XFsrUA==", - "requires": { - "type-fest": "^0.7.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", - "requires": { - "readable-stream": "^3.0.1" - } - } - } - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" - } - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "then-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", - "requires": { - "promise": ">=3.2 <8" - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-secp256k1": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.3.tgz", - "integrity": "sha512-ZpobrhOtHP98VYEN51IYQH1YcrbFpnxFhI6ceWa3OEbJn7eHvSd8YFjGPxbedGCy7PNYU1v/+BRsdvyr5uRd4g==", - "requires": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" - }, - "typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz", - "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.20", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", - "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "requires": { - "ci-info": "^1.5.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" - }, - "util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", - "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "varuint-bitcoin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", - "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" - }, - "vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" - }, - "vue-eslint-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", - "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.2", - "esquery": "^1.0.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - } - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "dev": true, - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "requires": { - "makeerror": "1.0.x" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "requires": { - "isexe": "^1.1.1" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - } - }, - "wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", - "requires": { - "bs58check": "<3.0.0" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" - }, - "windows-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", - "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", - "requires": { - "execa": "^1.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - }, - "xcode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.0.0.tgz", - "integrity": "sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw==", - "requires": { - "simple-plist": "^1.0.0", - "uuid": "^3.3.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", - "requires": { - "sax": ">=0.6.0", - "util.promisify": "~1.0.0", - "xmlbuilder": "~11.0.0" - }, - "dependencies": { - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - } - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xmldoc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", - "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", - "requires": { - "sax": "^1.2.1" - } - }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - }, - "xpipe": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", - "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/package.json b/package.json index 50d839cb62..bcd0879fd1 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,61 @@ { - "name": "BlueWallet", - "version": "4.7.4", + "name": "veleswallet", + "version": "5.1.1", "devDependencies": { - "@babel/core": "^7.5.0", - "@babel/runtime": "^7.5.1", + "@babel/core": "^7.6.2", + "@babel/preset-flow": "^7.9.0", + "@babel/preset-typescript": "^7.9.0", + "@babel/runtime": "^7.6.2", "@react-native-community/eslint-config": "^0.0.5", - "babel-cli": "^6.26.0", + "@types/bip21": "^1.1.30", + "@types/i18next": "^13.0.0", + "@types/jest": "^25.1.4", + "@types/moment": "^2.13.0", + "@types/react": "^16.9.31", + "@types/react-native": "^0.61.23", + "@types/react-native-share": "^3.1.0", + "@types/react-native-snap-carousel": "^3.8.1", + "@types/react-navigation": "^3.4.0", + "@types/react-redux": "^7.1.7", + "@types/react-test-renderer": "^16.9.0", + "@types/uuid": "^3.4.8", + "@typescript-eslint/eslint-plugin": "^2.28.0", + "@typescript-eslint/parser": "^2.26.0", "babel-eslint": "^10.0.2", - "babel-jest": "^24.8.0", - "babel-preset-flow": "^6.23.0", - "eslint": "^6.0.1", - "eslint-plugin-babel": "^5.3.0", - "eslint-plugin-import": "^2.18.0", - "eslint-plugin-node": "^9.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-react": "^7.14.2", + "babel-jest": "^24.9.0", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-prettier": "^3.1.3", + "eslint-plugin-react": "^7.19.0", + "eslint-plugin-react-hooks": "^3.0.0", + "eslint-plugin-react-native": "^3.8.1", "flow-bin": "^0.102.0", - "jest": "^24.8.0", + "jest": "^24.9.0", "jetifier": "^1.6.3", + "lint-staged": "^10.1.1", "metro-react-native-babel-preset": "^0.56.0", - "prettier-eslint-cli": "^5.0.0", - "react-test-renderer": "16.8.6", + "prettier": "^1.19.1", + "redux-devtools-extension": "^2.13.8", "rn-nodeify": "github:tradle/rn-nodeify" }, "scripts": { - "prepare": "./patches/fix_mangle.sh; git apply patches/minifier.js.patch; git apply patches/minify.js.patch", "clean": "cd android/; ./gradlew clean; cd ..; rm -r -f /tmp/metro-cache/; rm -r -f node_modules/; npm cache clean --force; npm i; npm start -- --reset-cache", "releasenotes2json": "./release-notes.sh > release-notes.txt; node -e 'console.log(JSON.stringify(require(\"fs\").readFileSync(\"release-notes.txt\", \"utf8\")));' > release-notes.json", - "podinstall": "./podinstall.sh", "start": "node node_modules/react-native/local-cli/cli.js start", "android": "react-native run-android", "ios": "react-native run-ios", - "postinstall": "./node_modules/.bin/rn-nodeify --install buffer,events,process,stream,util,inherits,fs,path --hack; npm run releasenotes2json; npm run podinstall; npx jetify", - "test": "npm run unit && npm run jest && npm run lint", + "postinstall": "./node_modules/.bin/rn-nodeify --install buffer,events,process,stream,util,inherits,fs,path --hack; npm run releasenotes2json; npx jetify", + "test": "yarn jest", "jest": "node node_modules/jest/bin/jest.js tests/integration/*", - "lint": "./node_modules/.bin/eslint *.js screen/**/*.js screen/ class/ models/ loc/ tests/integration/ --fix", - "unit": "./node_modules/.bin/mocha tests/unit/*" + "install_local": "cd src && yarn install", + "lint": "eslint '**/*.{js,ts,tsx}'", + "lint": "yarn lint", + "unit": "./node_modules/.bin/mocha tests/unit/*", + "typescript:check": "tsc --noEmit", + "prettier:fix": "prettier --write '**/*.{js,ts,tsx}'", + "precommit": "yarn lint-staged", + "shake": "adb shell input keyevent 82" }, "jest": { "preset": "react-native", @@ -47,85 +67,102 @@ ] }, "dependencies": { + "@babel/cli": "^7.8.4", "@babel/preset-env": "7.5.0", - "@react-native-community/async-storage": "1.6.2", + "@react-native-community/async-storage": "1.9.0", "@react-native-community/blur": "3.3.1", + "@react-native-community/clipboard": "^1.2.2", + "@react-native-community/masked-view": "^0.1.10", "@react-native-community/slider": "2.0.0-rc.1", + "@react-navigation/bottom-tabs": "^5.6.0", + "@react-navigation/native": "^5.6.1", + "@react-navigation/stack": "^5.6.1", "@remobile/react-native-qrcode-local-image": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git", "@sentry/react-native": "1.0.9", - "amplitude-js": "5.6.0", - "appcenter": "2.5.0", - "appcenter-analytics": "2.5.0", - "appcenter-crashes": "2.5.0", + "@types/react-native-calendars": "^1.20.7", + "amplitude-js": "5.7.0", "bech32": "1.1.3", "bignumber.js": "9.0.0", - "bip21": "2.0.2", - "bip32": "2.0.3", + "bip21": "git+https://github.com/velescore/bip21.git", + "bip32": "git+https://github.com/mdfkbtc/bip32.git", "bip39": "2.5.0", - "bitcoinjs-lib": "5.1.6", + "bitcoinjs-lib": "git+https://github.com/mdfkbtc/bitcoinjs-lib.git", "buffer": "5.2.1", "buffer-reverse": "1.0.1", "coinselect": "3.1.11", "crypto-js": "3.1.9-1", - "dayjs": "1.8.14", + "dayjs": "1.8.27", "ecurve": "1.0.6", "electrum-client": "git+https://github.com/BlueWallet/rn-electrum-client.git", - "eslint-config-prettier": "6.0.0", - "eslint-config-standard": "12.0.0", - "eslint-config-standard-react": "7.0.2", - "eslint-plugin-prettier": "3.1.0", - "eslint-plugin-standard": "4.0.0", "events": "1.1.1", "frisbee": "2.0.9", + "i18next": "^19.4.5", "intl": "1.2.5", "lottie-react-native": "3.1.1", "mocha": "5.2.0", + "moment": "^2.24.0", "node-libs-react-native": "1.0.3", "path-browserify": "1.0.0", - "prettier": "1.18.2", "process": "0.11.10", "prop-types": "15.7.2", - "react": "16.8.6", + "react": "16.9.0", + "react-i18next": "^11.5.0", "react-localization": "1.0.13", - "react-native": "0.60.5", - "react-native-biometrics": "git+https://github.com/BlueWallet/react-native-biometrics.git", + "react-native": "0.61.5", + "react-native-biometrics": "2.1.4", + "react-native-calendars": "^1.489.0", "react-native-camera": "3.4.0", - "react-native-device-info": "4.0.1", + "react-native-confirmation-code-field": "5.1.0", + "react-native-default-preference": "1.4.1", + "react-native-device-info": "5.5.6", "react-native-elements": "0.19.0", + "react-native-fast-image": "^8.1.5", "react-native-flexi-radio-button": "0.2.2", "react-native-fs": "2.13.3", - "react-native-gesture-handler": "1.3.0", + "react-native-gesture-handler": "^1.6.1", "react-native-handoff": "git+https://github.com/marcosrdz/react-native-handoff.git", "react-native-haptic-feedback": "1.7.1", "react-native-image-picker": "1.1.0", "react-native-level-fs": "3.0.1", - "react-native-linear-gradient": "2.5.4", + "react-native-linear-gradient": "2.5.6", + "react-native-localize": "^1.4.0", "react-native-modal": "11.1.0", "react-native-obscure": "1.2.1", + "react-native-pin-view": "^3.0.0", "react-native-popup-menu-android": "1.0.3", "react-native-privacy-snapshot": "git+https://github.com/BlueWallet/react-native-privacy-snapshot.git", "react-native-prompt-android": "git+https://github.com/marcosrdz/react-native-prompt-android.git", - "react-native-qrcode-svg": "5.1.2", + "react-native-qrcode-svg": "6.0.3", + "react-native-quick-actions": "0.3.12", "react-native-randombytes": "3.5.3", "react-native-rate": "1.1.7", - "react-native-secure-key-store": "git+https://github.com/marcosrdz/react-native-secure-key-store.git", + "react-native-reanimated": "^1.9.0", + "react-native-restart": "^0.0.15", + "react-native-safe-area-context": "^3.0.6", + "react-native-screens": "^2.9.0", + "react-native-secure-key-store": "^2.0.7", "react-native-share": "2.0.0", - "react-native-snap-carousel": "3.8.0", + "react-native-snap-carousel": "3.8.4", "react-native-sortable-list": "0.0.23", + "react-native-splash-screen": "^3.2.0", "react-native-svg": "9.5.1", "react-native-tcp": "git+https://github.com/aprock/react-native-tcp.git", "react-native-tooltip": "git+https://github.com/marcosrdz/react-native-tooltip.git", "react-native-vector-icons": "6.6.0", - "react-native-watch-connectivity": "0.3.2", - "react-native-webview": "6.9.0", - "react-navigation": "3.11.0", - "react-navigation-hooks": "1.1.0", - "react-test-render": "1.1.2", + "react-native-watch-connectivity": "0.4.1", + "react-redux": "^7.2.0", + "react-test-renderer": "16.9.0", "readable-stream": "3.4.0", + "redux": "^4.0.5", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.3.0", "secure-random": "1.1.2", "stream-browserify": "2.0.2", + "ts-jest": "^25.3.1", + "typescript": "^3.8.3", "url": "0.11.0", "util": "0.12.1", + "uuid": "^3.4.0", "wif": "2.0.6" }, "react-native": { @@ -147,5 +184,12 @@ "_stream_duplex": "readable-stream/duplex", "_stream_passthrough": "readable-stream/passthrough", "stream": "stream-browserify" + }, + "lint-staged": { + "./**/*.{ts,tsx,js,jsx}": [ + ], + "./**/*.{ts|tsx}": [ + "yarn typescript:check" + ] } } diff --git a/podinstall.sh b/podinstall.sh deleted file mode 100755 index ccdcd8f83a..0000000000 --- a/podinstall.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -echo "AppCenter XCode Project: " -echo $APPCENTER_XCODE_PROJECT -echo -if [[ "$APPCENTER_XCODE_PROJECT" == "ios/BlueWallet.xcworkspace" && "$OSTYPE" == "darwin"* ]]; then - echo "Running pod update..." - cd ios - pod install -fi diff --git a/prompt.js b/prompt.js index 366962bb76..40e32cbf77 100644 --- a/prompt.js +++ b/prompt.js @@ -30,7 +30,7 @@ module.exports = (title, text, isCancelable = true, type = 'secure-text') => { ]; prompt(title, text, buttons, { - type: type, + type, cancelable: isCancelable, }); }); diff --git a/react-native.config.js b/react-native.config.js index daa0bcdb95..8b631b3f54 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -1,19 +1,8 @@ module.exports = { - dependencies: { - appcenter: { - platforms: { - android: null, // disable Android platform, other platforms will still autolink if provided - }, - }, - 'appcenter-analytics': { - platforms: { - android: null, // disable Android platform, other platforms will still autolink if provided - }, - }, - 'appcenter-crashes': { - platforms: { - android: null, // disable Android platform, other platforms will still autolink if provided - }, - }, + dependencies: {}, + project: { + ios: {}, + android: {}, }, + assets: ['./src/assets/fonts/'], }; diff --git a/screen/lnd/browser.js b/screen/lnd/browser.js deleted file mode 100644 index 2893833329..0000000000 --- a/screen/lnd/browser.js +++ /dev/null @@ -1,462 +0,0 @@ -import React, { Component } from 'react'; -import { TouchableOpacity, ActivityIndicator, TextInput, Keyboard, BackHandler, View, Alert, Platform } from 'react-native'; -import { WebView } from 'react-native-webview'; -import { BlueNavigationStyle, SafeBlueArea } from '../../BlueComponents'; -import Ionicons from 'react-native-vector-icons/Ionicons'; -import PropTypes from 'prop-types'; - -let processedInvoices = {}; -let lastTimeTriedToPay = 0; - -/// /////////////////////////////////////////////////////////////////////// -// this code has no use in RN, it gets copypasted in webview injected code -// -let bluewalletResponses = {}; -// eslint-disable-next-line -var webln = { - enable: function() { - window.ReactNativeWebView.postMessage(JSON.stringify({ enable: true })); - return new Promise(function(resolve, reject) { - resolve(true); - }); - }, - getInfo: function() { - window.ReactNativeWebView.postMessage('getInfo'); - return new Promise(function(resolve, reject) { - reject(new Error('not implemented')); - }); - }, - sendPayment: function(paymentRequest) { - window.ReactNativeWebView.postMessage(JSON.stringify({ sendPayment: paymentRequest })); - return new Promise(function(resolve, reject) { - /* nop. intentionally, forever hang promise. - lapp page usually asynchroniously checks payment itself, via ajax, - so atm there's no need to pass payment preimage from RN to webview and fullfill promise. - might change in future */ - }); - }, - makeInvoice: function(RequestInvoiceArgs) { - var id = Math.random(); - window.ReactNativeWebView.postMessage(JSON.stringify({ makeInvoice: RequestInvoiceArgs, id: id })); - return new Promise(function(resolve, reject) { - var interval = setInterval(function() { - if (bluewalletResponses[id]) { - clearInterval(interval); - resolve(bluewalletResponses[id]); - } - }, 1000); - }); - }, - signMessage: function() { - window.ReactNativeWebView.postMessage('signMessage'); - return new Promise(function(resolve, reject) { - reject(new Error('not implemented')); - }); - }, - verifyMessage: function() { - window.ReactNativeWebView.postMessage('verifyMessage'); - return new Promise(function(resolve, reject) { - reject(new Error('not implemented')); - }); - }, -}; -// end injected code -/// ///////////////// -/// ///////////////// - -let alreadyInjected = false; -const injectedParadise = ` - -/* rules: - no 'let', only 'var' - no arrow functions - globals without 'var' - should work if compressed to single line -*/ - - - -/* this is a storage of responses from OUTER code (react native) - it gets written by message bus handler callback: - webview makes a call through bus to RN, each request with a unique ID. - RN processes the request from the bus, and posts response to the bus, with the same ID. - webview callback handler writes it in this hashmap. Then, some other code that patiently - waits for a response will see that the answer with such ID is present, and will fulfill a promise */ - -bluewalletResponses = {}; - - -/* this is injected WEBLN provider */ - - -webln = { - enable : function () { - window.ReactNativeWebView.postMessage(JSON.stringify({'enable': true})); - return new Promise(function(resolve, reject){ - resolve(true); - }) - }, - getInfo : function () { - window.ReactNativeWebView.postMessage('getInfo'); - return new Promise(function(resolve, reject){ - reject('not implemented'); - }) - }, - sendPayment: function(paymentRequest) { - window.ReactNativeWebView.postMessage(JSON.stringify({ sendPayment: paymentRequest })); - return new Promise(function(resolve, reject) { - /* nop. intentionally, forever hang promise. - lapp page usually asynchroniously checks payment itself, via ajax, - so atm there's no need to pass payment preimage from RN to webview and fullfill promise. - might change in future */ - }); - }, - makeInvoice: function (RequestInvoiceArgs) { - var id = Math.random(); - window.ReactNativeWebView.postMessage(JSON.stringify({makeInvoice: RequestInvoiceArgs, id: id})); - return new Promise(function(resolve, reject) { - var interval = setInterval(function () { - if (bluewalletResponses[id]) { - clearInterval(interval); - resolve(bluewalletResponses[id]); - } - }, 1000); - }); - }, - signMessage: function () { - window.ReactNativeWebView.postMessage('signMessage'); - return new Promise(function(resolve, reject){ - reject('not implemented'); - }) - }, - verifyMessage: function () { - window.ReactNativeWebView.postMessage('verifyMessage'); - return new Promise(function(resolve, reject){ - reject('not implemented'); - }) - }, -}; - - -/* end WEBLN */ - -/* listening to events that might come from RN: */ -document.addEventListener("message", function(event) { - window.ReactNativeWebView.postMessage("inside webview, received post message: " + event.detail); - var json; - try { - json = JSON.parse(event.detail); - } catch (_) {} - - if (json && json.bluewalletResponse) { - /* this is an answer to one of our inside-webview calls. - we store it in answers hashmap for someone who cares about it */ - bluewalletResponses[json.id] = json.bluewalletResponse - } - -}, false); - - - - -function tryToPay(invoice) { - window.ReactNativeWebView.postMessage(JSON.stringify({sendPayment:invoice})); -} - -/* for non-webln compatible pages we do it oldschool, - searching for all bolt11 manually */ - -setInterval(function() { -window.ReactNativeWebView.postMessage('interval'); - - var searchText = "lnbc"; - - var aTags = document.getElementsByTagName("span"); - var i; - for (i = 0; i < aTags.length; i++) { - if (aTags[i].textContent.indexOf(searchText) === 0) { - tryToPay(aTags[i].textContent); - } - } - - /* ------------------------- */ - - aTags = document.getElementsByTagName("input"); - for (i = 0; i < aTags.length; i++) { - if (aTags[i].value.indexOf(searchText) === 0) { - tryToPay(aTags[i].value); - } - } - - /* ------------------------- */ - - aTags = document.getElementsByTagName("a"); - searchText = "lightning:lnbc"; - - - for (i = 0; i < aTags.length; i++) { - var href = aTags[i].getAttribute('href') + ''; - if (href.indexOf(searchText) === 0) { - tryToPay(href.replace('lightning:', '')); - } - } - -}, 1000); - - `; - -export default class Browser extends Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueNavigationStyle(navigation, true), - title: 'Lapp Browser', - headerLeft: null, - }); - - constructor(props) { - super(props); - if (!props.navigation.getParam('fromSecret')) throw new Error('Invalid param'); - if (!props.navigation.getParam('fromWallet')) throw new Error('Invalid param'); - let url; - if (props.navigation.getParam('url')) url = props.navigation.getParam('url'); - - this.state = { - url: url || 'https://bluewallet.io/marketplace/', - fromSecret: props.navigation.getParam('fromSecret'), - fromWallet: props.navigation.getParam('fromWallet'), - canGoBack: false, - pageIsLoading: false, - stateURL: url || 'https://bluewallet.io/marketplace/', - }; - BackHandler.addEventListener('hardwareBackPress', this.handleBackButton.bind(this)); - } - - componentWillUnmount = () => { - BackHandler.removeEventListener('hardwareBackPress', this.handleBackButton.bind(this)); - }; - - handleBackButton() { - this.state.canGoBack ? this.webview.goBack() : this.props.navigation.goBack(null); - return true; - } - - _onNavigationStateChange = webViewState => { - this.setState({ canGoBack: webViewState.canGoBack, stateURL: webViewState.url }); - }; - - renderWebView = () => { - return ( - (this.webview = ref)} - source={{ uri: this.state.url }} - onMessage={e => { - // this is a handler which receives messages sent from within the browser - console.log('---- message from the bus:', e.nativeEvent.data); - let json = false; - try { - json = JSON.parse(e.nativeEvent.data); - } catch (_) {} - // message from browser has ln invoice - if (json && json.sendPayment) { - // checking that already asked about this invoice: - if (processedInvoices[json.sendPayment]) { - return; - } else { - // checking that we do not trigger alert too often: - if (+new Date() - lastTimeTriedToPay < 3000) { - return; - } - lastTimeTriedToPay = +new Date(); - // - processedInvoices[json.sendPayment] = 1; - } - - Alert.alert( - 'Page', - 'This page asks for permission to pay an invoice', - [ - { text: 'Cancel', onPress: () => console.log('Cancel Pressed'), style: 'cancel' }, - { - text: 'Pay', - onPress: () => { - console.log('OK Pressed'); - this.props.navigation.navigate({ - routeName: 'ScanLndInvoice', - params: { - uri: json.sendPayment, - fromSecret: this.state.fromSecret, - }, - }); - }, - }, - ], - { cancelable: false }, - ); - } - - if (json && json.makeInvoice) { - let amount = Math.max( - json.makeInvoice.minimumAmount || 0, - json.makeInvoice.maximumAmount || 0, - json.makeInvoice.defaultAmount || 0, - json.makeInvoice.amount || 0, - ); - Alert.alert( - 'Page', - 'This page wants to pay you ' + amount + ' sats (' + json.makeInvoice.defaultMemo + ')', - [ - { text: 'No thanks', onPress: () => console.log('Cancel Pressed'), style: 'cancel' }, - { - text: 'Accept', - onPress: async () => { - /** @type {LightningCustodianWallet} */ - const fromWallet = this.state.fromWallet; - const payreq = await fromWallet.addInvoice(amount, json.makeInvoice.defaultMemo || ' '); - // this.webview.postMessage(JSON.stringify({ bluewalletResponse: { paymentRequest: payreq }, id: json.id })); - // Since webview.postMessage is removed from webview, we inject javascript that will manually triger document - // event; note how data is passed in 'detail', not 'data' - let jsonstr = JSON.stringify({ bluewalletResponse: { paymentRequest: payreq }, id: json.id }); - this.webview.injectJavaScript("document.dispatchEvent( new CustomEvent('message', { detail: '" + jsonstr + "' }) );"); - }, - }, - ], - { cancelable: false }, - ); - } - - if (json && json.enable) { - console.log('webln enabled'); - this.setState({ weblnEnabled: true }); - } - }} - onLoadStart={e => { - alreadyInjected = false; - console.log('load start'); - this.setState({ pageIsLoading: true, weblnEnabled: false }); - }} - onLoadEnd={e => { - console.log('load end'); - this.setState({ url: e.nativeEvent.url, pageIsLoading: false }); - }} - onLoadProgress={e => { - console.log('progress:', e.nativeEvent.progress); - if (!alreadyInjected && e.nativeEvent.progress > 0.5) { - this.webview.injectJavaScript(injectedParadise); - alreadyInjected = true; - console.log('injected'); - } - }} - /> - ); - }; - - render() { - return ( - - - { - this.webview.goBack(); - }} - style={{ marginHorizontal: 8 }} - > - - - - - - this.setState({ stateURL: text })} - value={this.state.stateURL} - numberOfLines={1} - style={{ flex: 1, marginLeft: 4, minHeight: 33 }} - editable - onSubmitEditing={() => { - Keyboard.dismiss(); - this.setState({ url: this.state.stateURL }); - }} - /> - - - - {Platform.OS !== 'ios' && ( // on iOS lappbrowser opens blank page, thus, no HOME button - { - processedInvoices = {}; - this.setState({ url: 'https://bluewallet.io/marketplace/' }); - }} - > - - - )} - - { - let reloadUrl = this.state.url; - this.setState({ url: 'about:blank' }); - processedInvoices = {}; - setTimeout(() => this.setState({ url: reloadUrl }), 500); - // this.webview.reload(); - }} - > - {!this.state.pageIsLoading ? ( - - ) : ( - - - - )} - - - - {this.renderWebView()} - - ); - } -} - -Browser.propTypes = { - navigation: PropTypes.shape({ - getParam: PropTypes.func, - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/lnd/lndCreateInvoice.js b/screen/lnd/lndCreateInvoice.js deleted file mode 100644 index 4af2da93c7..0000000000 --- a/screen/lnd/lndCreateInvoice.js +++ /dev/null @@ -1,272 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { - Dimensions, - ActivityIndicator, - View, - TextInput, - KeyboardAvoidingView, - Keyboard, - TouchableWithoutFeedback, - TouchableOpacity, - Text, -} from 'react-native'; -import { BlueNavigationStyle, BlueButton, BlueBitcoinAmount, BlueDismissKeyboardInputAccessory } from '../../BlueComponents'; -import { LightningCustodianWallet } from '../../class/lightning-custodian-wallet'; -import PropTypes from 'prop-types'; -import bech32 from 'bech32'; -import { BitcoinUnit } from '../../models/bitcoinUnits'; -import NavigationService from '../../NavigationService'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -let BlueApp = require('../../BlueApp'); -let EV = require('../../events'); -let loc = require('../../loc'); -const { width } = Dimensions.get('window'); - -export default class LNDCreateInvoice extends Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueNavigationStyle(navigation, true), - title: loc.receive.header, - }); - - constructor(props) { - super(props); - - let fromWallet; - if (props.navigation.state.params.fromWallet) fromWallet = props.navigation.getParam('fromWallet'); - - // fallback to first wallet if it exists - if (!fromWallet) { - const lightningWallets = BlueApp.getWallets().filter(item => item.type === LightningCustodianWallet.type); - if (lightningWallets.length > 0) { - fromWallet = lightningWallets[0]; - console.warn('warning: using ln wallet index 0'); - } - } - - this.state = { - fromWallet, - amount: '', - description: '', - isLoading: false, - lnurl: '', - lnurlParams: null, - }; - } - - componentDidMount() { - if (this.props.navigation.state.params.uri) { - this.processLnurl(this.props.navigation.getParam('uri')); - } - } - - async createInvoice() { - this.setState({ isLoading: true }, async () => { - try { - const invoiceRequest = await this.state.fromWallet.addInvoice(this.state.amount, this.state.description); - EV(EV.enum.TRANSACTIONS_COUNT_CHANGED); - ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false }); - - // send to lnurl-withdraw callback url if that exists - if (this.state.lnurlParams) { - let { callback, k1 } = this.state.lnurlParams; - let callbackUrl = callback + (callback.indexOf('?') !== -1 ? '&' : '?') + 'k1=' + k1 + '&pr=' + invoiceRequest; - let resp = await fetch(callbackUrl, { method: 'GET' }); - if (resp.status >= 300) { - let text = await resp.text(); - throw new Error(text); - } - let reply = await resp.json(); - if (reply.status === 'ERROR') { - throw new Error('Reply from server: ' + reply.reason); - } - } - await BlueApp.saveToDisk(); - this.props.navigation.navigate('LNDViewInvoice', { - invoice: invoiceRequest, - fromWallet: this.state.fromWallet, - isModal: true, - }); - } catch (Err) { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - this.setState({ isLoading: false }); - alert(Err.message); - } - }); - } - - processLnurl = data => { - this.setState({ isLoading: true }, async () => { - if (!this.state.fromWallet) { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - alert('Before paying a Lightning invoice, you must first add a Lightning wallet.'); - return this.props.navigation.goBack(); - } - - // handling fallback lnurl - let ind = data.indexOf('lightning='); - if (ind !== -1) { - data = data.substring(ind + 10).split('&')[0]; - } - - data = data.replace('LIGHTNING:', '').replace('lightning:', ''); - console.log(data); - - // decoding the lnurl - let decoded = bech32.decode(data, 1500); - let url = Buffer.from(bech32.fromWords(decoded.words)).toString(); - - // calling the url - try { - let resp = await fetch(url, { method: 'GET' }); - if (resp.status >= 300) { - throw new Error('Bad response from server'); - } - let reply = await resp.json(); - if (reply.status === 'ERROR') { - throw new Error('Reply from server: ' + reply.reason); - } - - if (reply.tag !== 'withdrawRequest') { - throw new Error('Unsupported lnurl'); - } - - // setting the invoice creating screen with the parameters - this.setState({ - isLoading: false, - lnurlParams: { - k1: reply.k1, - callback: reply.callback, - fixed: reply.minWithdrawable === reply.maxWithdrawable, - min: (reply.minWithdrawable || 0) / 1000, - max: reply.maxWithdrawable / 1000, - }, - amount: (reply.maxWithdrawable / 1000).toString(), - description: reply.defaultDescription, - }); - } catch (Err) { - Keyboard.dismiss(); - this.setState({ isLoading: false }); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - alert(Err.message); - } - }); - }; - - renderCreateButton = () => { - return ( - - {this.state.isLoading ? ( - - ) : ( - 0} onPress={() => this.createInvoice()} title={loc.send.details.create} /> - )} - - ); - }; - - renderScanClickable = () => { - return ( - - NavigationService.navigate('ScanQrAddress', { onBarScanned: this.processLnurl })} - style={{ - flex: 1, - flexDirection: 'row', - minWidth: width, - justifyContent: 'center', - alignItems: 'center', - }} - > - {loc.receive.scan_lnurl} - - - ); - }; - - render() { - if (!this.state.fromWallet) { - return ( - - System error: Source wallet not found (this should never happen) - - ); - } - - return ( - - - - - { - if (this.state.lnurlParams) { - // in this case we prevent the user from changing the amount to < min or > max - let { min, max } = this.state.lnurlParams; - let nextAmount = parseInt(text); - if (nextAmount < min) { - text = min.toString(); - } else if (nextAmount > max) { - text = max.toString(); - } - } - - this.setState({ amount: text }); - }} - disabled={this.state.isLoading || (this.state.lnurlParams && this.state.lnurlParams.fixed)} - unit={BitcoinUnit.SATS} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - - this.setState({ description: text })} - placeholder={loc.receive.details.label} - value={this.state.description} - numberOfLines={1} - style={{ flex: 1, marginHorizontal: 8, minHeight: 33 }} - editable={!this.state.isLoading} - onSubmitEditing={Keyboard.dismiss} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - - - {this.renderCreateButton()} - - - {this.state.lnurlParams ? null : this.renderScanClickable()} - - - ); - } -} - -LNDCreateInvoice.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - navigate: PropTypes.func, - getParam: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - uri: PropTypes.string, - fromWallet: PropTypes.string, - }), - }), - }), -}; diff --git a/screen/lnd/lndViewAdditionalInvoiceInformation.js b/screen/lnd/lndViewAdditionalInvoiceInformation.js deleted file mode 100644 index 2a6580e963..0000000000 --- a/screen/lnd/lndViewAdditionalInvoiceInformation.js +++ /dev/null @@ -1,90 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { View, Share } from 'react-native'; -import { - BlueLoading, - BlueCopyTextToClipboard, - SafeBlueArea, - BlueButton, - BlueNavigationStyle, - BlueText, - BlueSpacing20, -} from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import QRCode from 'react-native-qrcode-svg'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -const loc = require('../../loc'); - -export default class LNDViewAdditionalInvoiceInformation extends Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueNavigationStyle(), - title: 'Additional Information', - }); - - state = { walletInfo: undefined }; - - async componentDidMount() { - const fromWallet = this.props.navigation.getParam('fromWallet'); - try { - await fromWallet.fetchInfo(); - } catch (_) { - alert('Network error'); - return; - } - this.setState({ walletInfo: fromWallet.info_raw, addressText: fromWallet.info_raw.uris[0] }); - } - - render() { - if (typeof this.state.walletInfo === 'undefined') { - return ( - - - - ); - } - - return ( - - - - - - {loc.lndViewInvoice.open_direct_channel} - - - - { - Share.share({ - message: this.state.walletInfo.uris[0], - }); - }} - title={loc.receive.details.share} - /> - - - - ); - } -} - -LNDViewAdditionalInvoiceInformation.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - getParam: PropTypes.func, - dismiss: PropTypes.func, - }), -}; diff --git a/screen/lnd/lndViewInvoice.js b/screen/lnd/lndViewInvoice.js deleted file mode 100644 index 7ef411d8c5..0000000000 --- a/screen/lnd/lndViewInvoice.js +++ /dev/null @@ -1,298 +0,0 @@ -import React, { Component } from 'react'; -import { View, Dimensions, ScrollView, BackHandler, InteractionManager } from 'react-native'; -import Share from 'react-native-share'; -import { - BlueLoading, - BlueText, - SafeBlueArea, - BlueButton, - BlueCopyTextToClipboard, - BlueNavigationStyle, - BlueSpacing20, -} from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { Icon } from 'react-native-elements'; -import QRCode from 'react-native-qrcode-svg'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -const loc = require('../../loc'); -const EV = require('../../events'); -const { width, height } = Dimensions.get('window'); - -export default class LNDViewInvoice extends Component { - static navigationOptions = ({ navigation }) => - navigation.getParam('isModal') === true - ? { - ...BlueNavigationStyle(navigation, true, () => navigation.dismiss()), - title: 'Lightning Invoice', - headerLeft: null, - } - : { ...BlueNavigationStyle(), title: 'Lightning Invoice' }; - - constructor(props) { - super(props); - const invoice = props.navigation.getParam('invoice'); - const fromWallet = props.navigation.getParam('fromWallet'); - this.state = { - invoice, - fromWallet, - isLoading: typeof invoice === 'string', - addressText: typeof invoice === 'object' && invoice.hasOwnProperty('payment_request') ? invoice.payment_request : invoice, - isFetchingInvoices: true, - qrCodeHeight: height > width ? width - 20 : width / 2, - }; - this.fetchInvoiceInterval = undefined; - BackHandler.addEventListener('hardwareBackPress', this.handleBackButton); - } - - async componentDidMount() { - this.fetchInvoiceInterval = setInterval(async () => { - if (this.state.isFetchingInvoices) { - try { - const userInvoices = await this.state.fromWallet.getUserInvoices(20); - // fetching only last 20 invoices - // for invoice that was created just now - that should be enough (it is basically the last one, so limit=1 would be sufficient) - // but that might not work as intended IF user creates 21 invoices, and then tries to check the status of invoice #0, it just wont be updated - const updatedUserInvoice = userInvoices.filter(invoice => - typeof this.state.invoice === 'object' - ? invoice.payment_request === this.state.invoice.payment_request - : invoice.payment_request === this.state.invoice, - )[0]; - - if (typeof updatedUserInvoice !== 'undefined') { - this.setState({ invoice: updatedUserInvoice, isLoading: false, addressText: updatedUserInvoice.payment_request }); - if (updatedUserInvoice.ispaid) { - // we fetched the invoice, and it is paid :-) - this.setState({ isFetchingInvoices: false }); - ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false }); - clearInterval(this.fetchInvoiceInterval); - this.fetchInvoiceInterval = undefined; - EV(EV.enum.REMOTE_TRANSACTIONS_COUNT_CHANGED); // remote because we want to refetch from server tx list and balance - } else { - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = updatedUserInvoice.timestamp + updatedUserInvoice.expire_time; - if (invoiceExpiration < now && !updatedUserInvoice.ispaid) { - // invoice expired :-( - this.setState({ isFetchingInvoices: false }); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - clearInterval(this.fetchInvoiceInterval); - this.fetchInvoiceInterval = undefined; - EV(EV.enum.TRANSACTIONS_COUNT_CHANGED); - } - } - } - } catch (error) { - console.log(error); - } - } - }, 3000); - } - - async componentWillUnmount() { - clearInterval(this.fetchInvoiceInterval); - this.fetchInvoiceInterval = undefined; - BackHandler.removeEventListener('hardwareBackPress', this.handleBackButton); - } - - handleBackButton = () => { - this.props.navigation.goBack(null); - return true; - }; - - onLayout = () => { - const { height } = Dimensions.get('window'); - this.setState({ qrCodeHeight: height > width ? width - 20 : width / 2 }); - }; - - render() { - if (this.state.isLoading) { - return ; - } - - const { invoice } = this.state; - if (typeof invoice === 'object') { - const currentDate = new Date(); - const now = (currentDate.getTime() / 1000) | 0; - const invoiceExpiration = invoice.timestamp + invoice.expire_time; - - if (this.state.showPreimageQr) { - return ( - - - Preimage: - - (this.qrCodeSVG = c)} - color={BlueApp.settings.foregroundColor} - logoBackgroundColor={BlueApp.settings.brandingColor} - /> - - - - - ); - } - - if (invoice.ispaid || invoice.type === 'paid_invoice') { - return ( - - - - - - {loc.lndViewInvoice.has_been_paid} - {invoice.payment_preimage && typeof invoice.payment_preimage === 'string' && ( - - this.setState({ showPreimageQr: true })} - title=" " - /> - - )} - - - ); - } - if (invoiceExpiration < now && !invoice.ispaid) { - return ( - - - - - - {loc.lndViewInvoice.wasnt_paid_and_expired} - - - ); - } else if (invoiceExpiration > now && invoice.ispaid) { - if (invoice.ispaid) { - return ( - - - {loc.lndViewInvoice.has_been_paid} - - - ); - } - } - } - // Invoice has not expired, nor has it been paid for. - return ( - - - - - (this.qrCodeSVG = c)} - color={BlueApp.settings.foregroundColor} - logoBackgroundColor={BlueApp.settings.brandingColor} - /> - - - - {invoice && invoice.amt && ( - - {loc.lndViewInvoice.please_pay} {invoice.amt} {loc.lndViewInvoice.sats} - - )} - {invoice && invoice.hasOwnProperty('description') && invoice.description.length > 0 && ( - - {loc.lndViewInvoice.for} {invoice.description} - - )} - - - { - if (this.qrCodeSVG === undefined) { - Share.open({ message: `lightning:${invoice.payment_request}` }).catch(error => console.log(error)); - } else { - InteractionManager.runAfterInteractions(async () => { - this.qrCodeSVG.toDataURL(data => { - let shareImageBase64 = { - message: `lightning:${invoice.payment_request}`, - url: `data:image/png;base64,${data}`, - }; - Share.open(shareImageBase64).catch(error => console.log(error)); - }); - }); - } - }} - title={loc.receive.details.share} - /> - - this.props.navigation.navigate('LNDViewAdditionalInvoiceInformation', { fromWallet: this.state.fromWallet })} - title={loc.lndViewInvoice.additional_info} - /> - - - - - ); - } -} - -LNDViewInvoice.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - navigate: PropTypes.func, - getParam: PropTypes.func, - popToTop: PropTypes.func, - }), -}; diff --git a/screen/lnd/scanLndInvoice.js b/screen/lnd/scanLndInvoice.js deleted file mode 100644 index 3dd7612dae..0000000000 --- a/screen/lnd/scanLndInvoice.js +++ /dev/null @@ -1,353 +0,0 @@ -/* global alert */ -import React from 'react'; -import { Text, ActivityIndicator, View, TouchableWithoutFeedback, TouchableOpacity, Keyboard } from 'react-native'; -import PropTypes from 'prop-types'; -import { - BlueButton, - SafeBlueArea, - BlueCard, - BlueDismissKeyboardInputAccessory, - BlueNavigationStyle, - BlueAddressInput, - BlueBitcoinAmount, -} from '../../BlueComponents'; -import { LightningCustodianWallet } from '../../class/lightning-custodian-wallet'; -import { BitcoinUnit, Chain } from '../../models/bitcoinUnits'; -import { Icon } from 'react-native-elements'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import Biometric from '../../class/biometrics'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -let EV = require('../../events'); -const loc = require('../../loc'); - -export default class ScanLndInvoice extends React.Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueNavigationStyle(navigation, true), - title: loc.send.header, - headerLeft: null, - }); - - state = { - isLoading: false, - isAmountInitiallyEmpty: false, - renderWalletSelectionButtonHidden: false, - }; - - constructor(props) { - super(props); - - if (!BlueApp.getWallets().some(item => item.type === LightningCustodianWallet.type)) { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - alert('Before paying a Lightning invoice, you must first add a Lightning wallet.'); - props.navigation.dismiss(); - } else { - let fromSecret; - if (props.navigation.state.params.fromSecret) fromSecret = props.navigation.state.params.fromSecret; - let fromWallet = {}; - - if (!fromSecret) { - const lightningWallets = BlueApp.getWallets().filter(item => item.type === LightningCustodianWallet.type); - if (lightningWallets.length > 0) { - fromSecret = lightningWallets[0].getSecret(); - console.warn('warning: using ln wallet index 0'); - } - } - - for (let w of BlueApp.getWallets()) { - if (w.getSecret() === fromSecret) { - fromWallet = w; - break; - } - } - - this.state = { - fromWallet, - fromSecret, - destination: '', - }; - } - } - - async componentDidMount() { - this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow); - this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide); - if (this.props.navigation.state.params.uri) { - this.processTextForInvoice(this.props.navigation.getParam('uri')); - } - } - - componentWillUnmount() { - this.keyboardDidShowListener.remove(); - this.keyboardDidHideListener.remove(); - } - - _keyboardDidShow = () => { - this.setState({ renderWalletSelectionButtonHidden: true }); - }; - - _keyboardDidHide = () => { - this.setState({ renderWalletSelectionButtonHidden: false }); - }; - - processInvoice = data => { - this.setState({ isLoading: true }, async () => { - if (!this.state.fromWallet) { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - alert('Before paying a Lightning invoice, you must first add a Lightning wallet.'); - return this.props.navigation.goBack(); - } - - // handling BIP21 w/BOLT11 support - let ind = data.indexOf('lightning='); - if (ind !== -1) { - data = data.substring(ind + 10).split('&')[0]; - } - - data = data.replace('LIGHTNING:', '').replace('lightning:', ''); - console.log(data); - - /** - * @type {LightningCustodianWallet} - */ - let w = this.state.fromWallet; - let decoded; - try { - decoded = await w.decodeInvoice(data); - - let expiresIn = (decoded.timestamp * 1 + decoded.expiry * 1) * 1000; // ms - if (+new Date() > expiresIn) { - expiresIn = 'expired'; - } else { - expiresIn = Math.round((expiresIn - +new Date()) / (60 * 1000)) + ' min'; - } - Keyboard.dismiss(); - this.setState({ - invoice: data, - decoded, - expiresIn, - destination: data, - isAmountInitiallyEmpty: decoded.num_satoshis === '0', - isLoading: false, - }); - } catch (Err) { - Keyboard.dismiss(); - this.setState({ isLoading: false }); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - alert(Err.message); - } - }); - }; - - async pay() { - if (!this.state.hasOwnProperty('decoded')) { - return null; - } - - const isBiometricsEnabled = await Biometric.isBiometricUseCapableAndEnabled(); - - if (isBiometricsEnabled) { - if (!(await Biometric.unlockWithBiometrics())) { - return; - } - } - - this.setState( - { - isLoading: true, - }, - async () => { - let decoded = this.state.decoded; - - /** @type {LightningCustodianWallet} */ - let fromWallet = this.state.fromWallet; - - let expiresIn = (decoded.timestamp * 1 + decoded.expiry * 1) * 1000; // ms - if (+new Date() > expiresIn) { - this.setState({ isLoading: false }); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - return alert('Invoice expired'); - } - - const currentUserInvoices = fromWallet.user_invoices_raw; // not fetching invoices, as we assume they were loaded previously - if (currentUserInvoices.some(invoice => invoice.payment_hash === decoded.payment_hash)) { - this.setState({ isLoading: false }); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - return alert(loc.lnd.sameWalletAsInvoiceError); - } - - try { - await fromWallet.payInvoice(this.state.invoice, this.state.decoded.num_satoshis); - } catch (Err) { - console.log(Err.message); - this.setState({ isLoading: false }); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - return alert(Err.message); - } - - EV(EV.enum.REMOTE_TRANSACTIONS_COUNT_CHANGED); // someone should fetch txs - this.props.navigation.navigate('Success', { - amount: this.state.decoded.num_satoshis, - amountUnit: BitcoinUnit.SATS, - invoiceDescription: this.state.decoded.description, - }); - }, - ); - } - - processTextForInvoice = text => { - if (text.toLowerCase().startsWith('lnb') || text.toLowerCase().startsWith('lightning:lnb')) { - this.processInvoice(text); - } else { - this.setState({ decoded: undefined, expiresIn: undefined, destination: text }); - } - }; - - shouldDisablePayButton = () => { - if (typeof this.state.decoded !== 'object') { - return true; - } else { - if (!this.state.decoded.hasOwnProperty('num_satoshis')) { - return true; - } - } - return this.state.decoded.num_satoshis <= 0 || this.state.isLoading || isNaN(this.state.decoded.num_satoshis); - }; - - renderWalletSelectionButton = () => { - if (this.state.renderWalletSelectionButtonHidden) return; - return ( - - {!this.state.isLoading && ( - - this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.OFFCHAIN }) - } - > - {loc.wallets.select_wallet.toLowerCase()} - - - )} - - - this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.OFFCHAIN }) - } - > - {this.state.fromWallet.getLabel()} - - {loc.formatBalanceWithoutSuffix(this.state.fromWallet.getBalance(), BitcoinUnit.SATS, false)} - - - {BitcoinUnit.SATS} - - - - - ); - }; - - onWalletSelect = wallet => { - this.setState({ fromSecret: wallet.getSecret(), fromWallet: wallet }, () => { - this.props.navigation.pop(); - }); - }; - - render() { - return ( - - - - - - { - if (typeof this.state.decoded === 'object') { - text = parseInt(text || 0); - let decoded = this.state.decoded; - decoded.num_satoshis = text; - this.setState({ decoded: decoded }); - } - }} - disabled={typeof this.state.decoded !== 'object' || this.state.isLoading} - unit={BitcoinUnit.SATS} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - - - - { - this.setState({ destination: text }); - this.processTextForInvoice(text); - }} - onBarScanned={this.processInvoice} - address={this.state.destination} - isLoading={this.state.isLoading} - placeholder={loc.lnd.placeholder} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - - - {this.state.hasOwnProperty('decoded') && this.state.decoded !== undefined ? this.state.decoded.description : ''} - - - {this.state.expiresIn !== undefined && ( - Expires in: {this.state.expiresIn} - )} - - - {this.state.isLoading ? ( - - - - ) : ( - { - this.pay(); - }} - disabled={this.shouldDisablePayButton()} - /> - )} - - - - - {this.renderWalletSelectionButton()} - - - - - ); - } -} - -ScanLndInvoice.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - navigate: PropTypes.func, - pop: PropTypes.func, - getParam: PropTypes.func, - dismiss: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - uri: PropTypes.string, - fromSecret: PropTypes.string, - }), - }), - }), -}; diff --git a/screen/plausibledeniability.js b/screen/plausibledeniability.js deleted file mode 100644 index 0d61fa850f..0000000000 --- a/screen/plausibledeniability.js +++ /dev/null @@ -1,89 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { ScrollView } from 'react-native'; -import { BlueLoading, BlueButton, SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle, BlueSpacing20 } from '../BlueComponents'; -import PropTypes from 'prop-types'; -/** @type {AppStorage} */ -let BlueApp = require('../BlueApp'); -let prompt = require('../prompt'); -let EV = require('../events'); -let loc = require('../loc'); - -export default class PlausibleDeniability extends Component { - static navigationOptions = { - ...BlueNavigationStyle(), - title: loc.plausibledeniability.title, - }; - - constructor(props) { - super(props); - this.state = { - isLoading: true, - }; - } - - async componentDidMount() { - this.setState({ - isLoading: false, - }); - } - - render() { - if (this.state.isLoading) { - return ; - } - - return ( - - - - {loc.plausibledeniability.help} - - - - {loc.plausibledeniability.help2} - - - - { - let p1 = await prompt(loc.plausibledeniability.create_password, loc.plausibledeniability.create_password_explanation); - if (p1 === BlueApp.cachedPassword) { - return alert(loc.plausibledeniability.password_should_not_match); - } - - if (!p1) { - return; - } - - let p2 = await prompt(loc.plausibledeniability.retype_password); - if (p1 !== p2) { - return alert(loc.plausibledeniability.passwords_do_not_match); - } - - await BlueApp.createFakeStorage(p1); - EV(EV.enum.WALLETS_COUNT_CHANGED); - EV(EV.enum.TRANSACTIONS_COUNT_CHANGED); - alert(loc.plausibledeniability.success); - this.props.navigation.navigate('Wallets'); - }} - /> - - - - ); - } -} - -PlausibleDeniability.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/receive/details.js b/screen/receive/details.js deleted file mode 100644 index eda7c6e0cc..0000000000 --- a/screen/receive/details.js +++ /dev/null @@ -1,180 +0,0 @@ -import React, { Component } from 'react'; -import { View, InteractionManager, ScrollView } from 'react-native'; -import QRCode from 'react-native-qrcode-svg'; -import bip21 from 'bip21'; -import { - BlueLoading, - SafeBlueArea, - BlueCopyTextToClipboard, - BlueButton, - BlueButtonLink, - BlueNavigationStyle, - is, -} from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import Privacy from '../../Privacy'; -import Share from 'react-native-share'; -import { Chain } from '../../models/bitcoinUnits'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -let loc = require('../../loc'); - -export default class ReceiveDetails extends Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueNavigationStyle(navigation, true), - title: loc.receive.header, - headerLeft: null, - }); - - constructor(props) { - super(props); - let secret = props.navigation.state.params.secret || ''; - - this.state = { - secret: secret, - addressText: '', - bip21encoded: undefined, - }; - } - - async componentDidMount() { - Privacy.enableBlur(); - console.log('receive/details - componentDidMount'); - - { - let address; - let wallet; - for (let w of BlueApp.getWallets()) { - if (w.getSecret() === this.state.secret) { - // found our wallet - wallet = w; - } - } - if (wallet) { - if (wallet.getAddressAsync) { - if (wallet.chain === Chain.ONCHAIN) { - try { - address = await Promise.race([wallet.getAddressAsync(), BlueApp.sleep(1000)]); - } catch (_) {} - if (!address) { - // either sleep expired or getAddressAsync threw an exception - console.warn('either sleep expired or getAddressAsync threw an exception'); - address = wallet._getExternalAddressByIndex(wallet.next_free_address_index); - } else { - BlueApp.saveToDisk(); // caching whatever getAddressAsync() generated internally - } - this.setState({ - address: address, - addressText: address, - }); - } else if (wallet.chain === Chain.OFFCHAIN) { - try { - await Promise.race([wallet.getAddressAsync(), BlueApp.sleep(1000)]); - address = wallet.getAddress(); - } catch (_) {} - if (!address) { - // either sleep expired or getAddressAsync threw an exception - console.warn('either sleep expired or getAddressAsync threw an exception'); - address = wallet.getAddress(); - } else { - BlueApp.saveToDisk(); // caching whatever getAddressAsync() generated internally - } - } - this.setState({ - address: address, - addressText: address, - }); - } else if (wallet.getAddress) { - this.setState({ - address: wallet.getAddress(), - addressText: wallet.getAddress(), - }); - } - } - } - - InteractionManager.runAfterInteractions(async () => { - const bip21encoded = bip21.encode(this.state.address); - this.setState({ bip21encoded }); - }); - } - - async componentWillUnmount() { - Privacy.disableBlur(); - } - - render() { - return ( - - - - {this.state.bip21encoded === undefined ? ( - - - - ) : ( - (this.qrCodeSVG = c)} - /> - )} - - - - { - this.props.navigation.navigate('ReceiveAmount', { - address: this.state.address, - }); - }} - /> - - { - if (this.qrCodeSVG === undefined) { - Share.open({ message: `bitcoin:${this.state.address}` }).catch(error => console.log(error)); - } else { - InteractionManager.runAfterInteractions(async () => { - this.qrCodeSVG.toDataURL(data => { - let shareImageBase64 = { - message: `bitcoin:${this.state.address}`, - url: `data:image/png;base64,${data}`, - }; - Share.open(shareImageBase64).catch(error => console.log(error)); - }); - }); - } - }} - title={loc.receive.details.share} - /> - - - - - ); - } -} - -ReceiveDetails.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - navigate: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - secret: PropTypes.string, - }), - }), - }), -}; diff --git a/screen/receive/receiveAmount.js b/screen/receive/receiveAmount.js deleted file mode 100644 index abfa1195f6..0000000000 --- a/screen/receive/receiveAmount.js +++ /dev/null @@ -1,168 +0,0 @@ -import React, { Component } from 'react'; -import { View, Share, TextInput, KeyboardAvoidingView, Dimensions, ScrollView } from 'react-native'; -import QRCode from 'react-native-qrcode-svg'; -import bip21 from 'bip21'; -import { - SafeBlueArea, - BlueCard, - BlueButton, - BlueNavigationStyle, - BlueBitcoinAmount, - BlueText, - BlueCopyTextToClipboard, -} from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import Privacy from '../../Privacy'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -let loc = require('../../loc'); -const { width } = Dimensions.get('window'); - -export default class ReceiveAmount extends Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueNavigationStyle(navigation, true), - title: loc.receive.header, - headerLeft: null, - }); - - static propTypes = { - navigation: PropTypes.shape({ - state: PropTypes.shape({ - params: PropTypes.shape({ - address: PropTypes.string, - }), - }), - }), - }; - - constructor(props) { - super(props); - let address = props.navigation.state.params.address; - - this.state = { - address: address, - addressText: address, - amount: undefined, - label: undefined, - amountSet: false, - }; - } - - async componentDidMount() { - Privacy.enableBlur(); - } - - async componentWillUnmount() { - Privacy.disableBlur(); - } - - determineSize = () => { - if (width > 312) { - return width - 48; - } - return 312; - }; - - renderDefault() { - return ( - - - this.setState({ label: text })} - placeholder={loc.receive.details.label} - value={this.state.label || ''} - numberOfLines={1} - style={{ flex: 1, marginHorizontal: 8, minHeight: 33 }} - editable={!this.state.isLoading} - /> - - - { - this.setState({ - amountSet: true, - bip21: bip21.encode(this.state.address, { amount: this.state.amount, label: this.state.label }), - }); - }} - /> - - - ); - } - - renderWithSetAmount() { - return ( - - - {this.state.label} - - - - - - - - - ); - } - - render() { - return ( - - - - - this.setState({ amount: text })} - disabled={this.state.amountSet} - /> - {this.state.amountSet ? this.renderWithSetAmount() : this.renderDefault()} - - {this.state.amountSet && ( - - { - Share.share({ - message: this.state.bip21, - }); - }} - title={loc.receive.details.share} - /> - - )} - - - - ); - } -} diff --git a/screen/selftest.js b/screen/selftest.js deleted file mode 100644 index 8fcdeca521..0000000000 --- a/screen/selftest.js +++ /dev/null @@ -1,333 +0,0 @@ -import React, { Component } from 'react'; -import { ScrollView, View } from 'react-native'; -import { BlueLoading, BlueSpacing20, SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle } from '../BlueComponents'; -import PropTypes from 'prop-types'; -import { SegwitP2SHWallet, LegacyWallet, HDSegwitP2SHWallet, HDSegwitBech32Wallet } from '../class'; -const bitcoin = require('bitcoinjs-lib'); -let BigNumber = require('bignumber.js'); -let encryption = require('../encryption'); -let BlueElectrum = require('../BlueElectrum'); - -export default class Selftest extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: 'Self test', - }); - - constructor(props) { - super(props); - this.state = { - isLoading: true, - }; - } - - async componentDidMount() { - let errorMessage = ''; - let isOk = true; - - try { - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - let uniqs = {}; - let w = new SegwitP2SHWallet(); - for (let c = 0; c < 1000; c++) { - await w.generate(); - if (uniqs[w.getSecret()]) { - errorMessage += 'failed to generate unique private key; '; - isOk = false; - break; - } - uniqs[w.getSecret()] = 1; - } - } else { - console.warn('skipping RN-specific test'); - } - - // - - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - await BlueElectrum.ping(); - await BlueElectrum.waitTillConnected(); - let addr4elect = '3GCvDBAktgQQtsbN6x5DYiQCMmgZ9Yk8BK'; - let electrumBalance = await BlueElectrum.getBalanceByAddress(addr4elect); - if (electrumBalance.confirmed !== 51432) - throw new Error('BlueElectrum getBalanceByAddress failure, got ' + JSON.stringify(electrumBalance)); - - let electrumTxs = await BlueElectrum.getTransactionsByAddress(addr4elect); - if (electrumTxs.length !== 1) throw new Error('BlueElectrum getTransactionsByAddress failure, got ' + JSON.stringify(electrumTxs)); - } else { - console.warn('skipping RN-specific test'); - } - - // - - let l = new LegacyWallet(); - l.setSecret('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct'); - if (l.getAddress() !== '19AAjaTUbRjQCMuVczepkoPswiZRhjtg31') { - errorMessage += 'failed to generate legacy address from WIF; '; - isOk = false; - } - - // - - // utxos as received from blockcypher - let utxos = [ - { - tx_hash: '2f445cf016fa2772db7d473bff97515355b4e6148e1c980ce351d47cf54c517f', - block_height: 523186, - tx_input_n: -1, - tx_output_n: 1, - value: 100000, - ref_balance: 100000, - spent: false, - confirmations: 215, - confirmed: '2018-05-18T03:16:34Z', - double_spend: false, - }, - ]; - let toAddr = '1GX36PGBUrF8XahZEGQqHqnJGW2vCZteoB'; - let amount = 0.0009; - let fee = 0.0001; - let txHex = l.createTx(utxos, amount, fee, toAddr); - if ( - txHex !== - '01000000017f514cf57cd451e30c981c8e14e6b455535197ff3b477ddb7227fa16f05c442f010000006b483045022100b9a6545847bd30418c133437c7660a6676afafe6e7e837a37ef2ead931ebd586022056bc43cbf71855d0719f54151c8fcaaaa03367ecafdd7296dbe39f042e432f4f012103aea0dfd576151cb399347aa6732f8fdf027b9ea3ea2e65fb754803f776e0a509ffffffff01905f0100000000001976a914aa381cd428a4e91327fd4434aa0a08ff131f1a5a88ac00000000' - ) { - errorMessage += 'failed to create TX from legacy address; '; - isOk = false; - } - - // now, several utxos - // utxos as received from blockcypher - utxos = [ - { - amount: '0.002', - block_height: 523416, - confirmations: 6, - confirmed: '2018-05-19T15:46:43Z', - double_spend: false, - ref_balance: 300000, - spent: false, - tx_hash: 'dc3605040a03724bc584ed43bc22a559f5d32a1b0708ca05b20b9018fdd523ef', - tx_input_n: -1, - tx_output_n: 0, - txid: 'dc3605040a03724bc584ed43bc22a559f5d32a1b0708ca05b20b9018fdd523ef', - value: 200000, - vout: 0, - }, - { - amount: '0.001', - block_height: 523186, - confirmations: 6, - confirmed: '2018-05-18T03:16:34Z', - double_spend: false, - ref_balance: 100000, - spent: false, - tx_hash: 'c473c104febfe6621804976d1082a1468c1198d0339e35f30a8ba1515d9eb017', - tx_input_n: -1, - tx_output_n: 0, - txid: 'c473c104febfe6621804976d1082a1468c1198d0339e35f30a8ba1515d9eb017', - value: 100000, - vout: 0, - }, - ]; - - toAddr = '1GX36PGBUrF8XahZEGQqHqnJGW2vCZteoB'; - amount = 0.0009; - fee = 0.0001; - try { - txHex = l.createTx(utxos, amount, fee, toAddr); - } catch (e) { - errorMessage += e.message + '; '; - isOk = false; - } - if ( - txHex !== - '0100000002ef23d5fd18900bb205ca08071b2ad3f559a522bc43ed84c54b72030a040536dc000000006a47304402206b4f03e471d60dff19f4df1a8203ca97f6282658160034cea0f2b7d748c33d9802206058d23861dabdfb252c8df14249d1a2b00345dd90d32ab451cc3c6cfcb3b402012103aea0dfd576151cb399347aa6732f8fdf027b9ea3ea2e65fb754803f776e0a509ffffffff17b09e5d51a18b0af3359e33d098118c46a182106d97041862e6bffe04c173c4000000006b4830450221009785a61358a1ee7ab5885a98b111275226e0046a48b69980c4f53ecf99cdce0a02200503249e0b23d633ec1fbae5d41a0dcf9758dce3560066d1aee9ecfbfeefcfb7012103aea0dfd576151cb399347aa6732f8fdf027b9ea3ea2e65fb754803f776e0a509ffffffff02905f0100000000001976a914aa381cd428a4e91327fd4434aa0a08ff131f1a5a88ac400d0300000000001976a914597ce022baa887799951e0496c769d9cc0c759dc88ac00000000' - ) { - errorMessage += 'failed to create TX from legacy address; '; - isOk = false; - } - - // - - l = new SegwitP2SHWallet(); - l.setSecret('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct'); - if (l.getAddress() !== '34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53') { - errorMessage += 'failed to generate segwit P2SH address from WIF; '; - isOk = false; - } - - // - - // utxos as received from blockcypher - let utxo = [ - { - tx_hash: '0f5eea78fb19e72b55bd119252ff29fc16c503d0e956a9c1b5b2ab0e95e0c323', - block_height: 514991, - tx_input_n: -1, - tx_output_n: 2, - value: 110000, - ref_balance: 546, - spent: false, - confirmations: 9, - confirmed: '2018-03-24T18:13:36Z', - double_spend: false, - }, - ]; - - let tx = l.createTx(utxo, 0.001, 0.0001, '1QHf8Gp3wfmFiSdEX4FtrssCGR68diN1cj'); - let txDecoded = bitcoin.Transaction.fromHex(tx); - let txid = txDecoded.getId(); - - if (txid !== '110f51d28d585e922adbf701cba802e549b8fe3a53fa5d62426ab42549c9b6de') { - errorMessage += 'created txid doesnt match; '; - isOk = false; - } - if ( - tx !== - '0100000000010123c3e0950eabb2b5c1a956e9d003c516fc29ff529211bd552be719fb78ea5e0f0200000017160014597ce022baa887799951e0496c769d9cc0c759dc0000000001a0860100000000001976a914ff715fb722cb10646d80709aeac7f2f4ee00278f88ac02473044022075670317a0e5b5d4eef154b03db97396a64cbc6ef3b576d98367e1a83c1c488002206d6df1e8085fd711d6ea264de3803340f80fa2c6e30683879d9ad40f3228c56c012103aea0dfd576151cb399347aa6732f8fdf027b9ea3ea2e65fb754803f776e0a50900000000' - ) { - errorMessage += 'created tx hex doesnt match; '; - isOk = false; - } - - let feeSatoshi = new BigNumber(0.0001); - feeSatoshi = feeSatoshi.multipliedBy(100000000); - let satoshiPerByte = feeSatoshi.dividedBy(Math.round(tx.length / 2)); - satoshiPerByte = Math.round(satoshiPerByte.toString(10)); - - if (satoshiPerByte !== 46) { - errorMessage += 'created tx satoshiPerByte doesnt match; '; - isOk = false; - } - - // - - let crypted = encryption.encrypt('data', 'password'); - let decrypted = encryption.decrypt(crypted, 'password'); - - if (decrypted !== 'data' && crypted && decrypted) { - errorMessage += 'encryption lib is not ok; '; - isOk = false; - } - - // - - let bip39 = require('bip39'); - let mnemonic = - 'honey risk juice trip orient galaxy win situate shoot anchor bounce remind horse traffic exotic since escape mimic ramp skin judge owner topple erode'; - let seed = bip39.mnemonicToSeed(mnemonic); - let root = bitcoin.bip32.fromSeed(seed); - - let path = "m/49'/0'/0'/0/0"; - let child = root.derivePath(path); - let address = bitcoin.payments.p2sh({ - redeem: bitcoin.payments.p2wpkh({ - pubkey: child.publicKey, - network: bitcoin.networks.bitcoin, - }), - network: bitcoin.networks.bitcoin, - }).address; - - if (address !== '3GcKN7q7gZuZ8eHygAhHrvPa5zZbG5Q1rK') { - errorMessage += 'bip49 is not ok; '; - isOk = false; - } - - // - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - let hd = new HDSegwitP2SHWallet(); - let hashmap = {}; - for (let c = 0; c < 1000; c++) { - await hd.generate(); - let secret = hd.getSecret(); - if (hashmap[secret]) { - throw new Error('Duplicate secret generated!'); - } - hashmap[secret] = 1; - if (secret.split(' ').length !== 12 && secret.split(' ').length !== 24) { - throw new Error('mnemonic phrase not ok'); - } - } - - let hd2 = new HDSegwitP2SHWallet(); - hd2.setSecret(hd.getSecret()); - if (!hd2.validateMnemonic()) { - throw new Error('mnemonic phrase validation not ok'); - } - - // - - let hd3 = new HDSegwitP2SHWallet(); - hd3._xpub = 'ypub6Wb82D7F38b48uzRVyTwydMCPcos4njzygPRCJ4x1enm6EA5YUthtWgJUPYiFTs7Sk53q8rJ9d1SJ2fBNqsyhjUTDR7gyF1SXbBnaa9xcQj'; - await hd3.fetchBalance(); - if (hd3.getBalance() !== 26000) throw new Error('Could not fetch HD balance'); - await hd3.fetchTransactions(); - if (hd3.transactions.length !== 1) throw new Error('Could not fetch HD transactions'); - - // - - let hd4 = new HDSegwitBech32Wallet(); - hd4._xpub = 'zpub6r7jhKKm7BAVx3b3nSnuadY1WnshZYkhK8gKFoRLwK9rF3Mzv28BrGcCGA3ugGtawi1WLb2vyjQAX9ZTDGU5gNk2bLdTc3iEXr6tzR1ipNP'; - await hd4.fetchBalance(); - if (hd4.getBalance() !== 200000) throw new Error('Could not fetch HD Bech32 balance'); - await hd4.fetchTransactions(); - if (hd4.getTransactions().length !== 4) throw new Error('Could not fetch HD Bech32 transactions'); - } else { - console.warn('skipping RN-specific test'); - } - - // - } catch (Err) { - errorMessage += Err; - isOk = false; - } - - this.setState({ - isLoading: false, - isOk, - errorMessage, - }); - } - - render() { - if (this.state.isLoading) { - return ; - } - - return ( - - - - - - {(() => { - if (this.state.isOk) { - return ( - - OK - - ); - } else { - return ( - - - error: {this.state.errorMessage} - - - ); - } - })()} - - - - ); - } -} - -Selftest.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/send/confirm.js b/screen/send/confirm.js deleted file mode 100644 index 3a22ff9f37..0000000000 --- a/screen/send/confirm.js +++ /dev/null @@ -1,243 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { ActivityIndicator, FlatList, TouchableOpacity, StyleSheet, View } from 'react-native'; -import { Text } from 'react-native-elements'; -import { BlueButton, BlueText, SafeBlueArea, BlueCard, BlueSpacing40, BlueNavigationStyle } from '../../BlueComponents'; -import { BitcoinUnit } from '../../models/bitcoinUnits'; -import PropTypes from 'prop-types'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import Biometric from '../../class/biometrics'; -import { HDSegwitBech32Wallet } from '../../class'; -let loc = require('../../loc'); -let EV = require('../../events'); -let currency = require('../../currency'); -let BlueElectrum = require('../../BlueElectrum'); -let Bignumber = require('bignumber.js'); -/** @type {AppStorage} */ -const BlueApp = require('../../BlueApp'); - -export default class Confirm extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(null, false), - title: loc.send.confirm.header, - }); - - constructor(props) { - super(props); - - this.state = { - isLoading: false, - fee: props.navigation.getParam('fee'), - feeSatoshi: new Bignumber(props.navigation.getParam('fee')).multipliedBy(100000000).toNumber(), - memo: props.navigation.getParam('memo'), - recipients: props.navigation.getParam('recipients'), - size: Math.round(props.navigation.getParam('tx').length / 2), - tx: props.navigation.getParam('tx'), - satoshiPerByte: props.navigation.getParam('satoshiPerByte'), - fromWallet: props.navigation.getParam('fromWallet'), - }; - } - - async componentDidMount() { - console.log('send/confirm - componentDidMount'); - console.log('address = ', this.state.recipients); - this.isBiometricUseCapableAndEnabled = await Biometric.isBiometricUseCapableAndEnabled(); - } - - broadcast() { - this.setState({ isLoading: true }, async () => { - try { - await BlueElectrum.ping(); - await BlueElectrum.waitTillConnected(); - - if (this.isBiometricUseCapableAndEnabled) { - if (!(await Biometric.unlockWithBiometrics())) { - return; - } - } - - let result = await this.state.fromWallet.broadcastTx(this.state.tx); - if (result && result.code) { - if (result.code === 1) { - const message = result.message.split('\n'); - throw new Error(`${message[0]}: ${message[2]}`); - } - } else { - console.log('broadcast result = ', result); - EV(EV.enum.REMOTE_TRANSACTIONS_COUNT_CHANGED); // someone should fetch txs - let amount = 0; - const recipients = this.state.recipients; - if (recipients[0].amount === BitcoinUnit.MAX) { - amount = this.state.fromWallet.getBalance() - this.state.feeSatoshi; - } else { - for (const recipient of recipients) { - amount += recipient.amount ? +recipient.amount : recipient.value; - } - } - - if (this.state.fromWallet.type === HDSegwitBech32Wallet.type) { - amount = loc.formatBalanceWithoutSuffix(amount, BitcoinUnit.BTC, false); - } - - this.props.navigation.navigate('Success', { - fee: Number(this.state.fee), - amount, - dismissModal: () => this.props.navigation.dismiss(), - }); - this.setState({ isLoading: false }); - } - } catch (error) { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - this.setState({ isLoading: false }); - alert(error.message); - } - }); - } - - _renderItem = ({ index, item }) => { - return ( - <> - - - {item.amount === BitcoinUnit.MAX - ? currency.satoshiToBTC(this.state.fromWallet.getBalance() - this.state.feeSatoshi) - : item.amount || currency.satoshiToBTC(item.value)} - - - {' ' + BitcoinUnit.BTC} - - - - {loc.send.create.to} - {item.address} - - {this.state.recipients.length > 1 && ( - - {index + 1} of {this.state.recipients.length} - - )} - - ); - }; - - renderSeparator = () => { - return ; - }; - - render() { - return ( - - - 1} - extraData={this.state.recipients} - data={this.state.recipients} - renderItem={this._renderItem} - keyExtractor={(_item, index) => `${index}`} - ItemSeparatorComponent={this.renderSeparator} - style={{ maxHeight: '55%' }} - /> - - - - {loc.send.create.fee}: {loc.formatBalance(this.state.feeSatoshi, BitcoinUnit.BTC)} ( - {currency.satoshiToLocalCurrency(this.state.feeSatoshi)}) - - - {this.state.isLoading ? ( - - ) : ( - this.broadcast()} title={loc.send.confirm.sendNow} /> - )} - - { - if (this.isBiometricUseCapableAndEnabled) { - if (!(await Biometric.unlockWithBiometrics())) { - return; - } - } - - this.props.navigation.navigate('CreateTransaction', { - fee: this.state.fee, - recipients: this.state.recipients, - memo: this.state.memo, - tx: this.state.tx, - satoshiPerByte: this.state.satoshiPerByte, - wallet: this.state.fromWallet, - feeSatoshi: this.state.feeSatoshi, - }); - }} - > - - {loc.transactions.details.transaction_details} - - - - - - - ); - } -} - -const styles = StyleSheet.create({ - transactionDetailsTitle: { - color: '#0c2550', - fontWeight: '500', - fontSize: 17, - marginBottom: 2, - }, - transactionDetailsSubtitle: { - color: '#9aa0aa', - fontWeight: '500', - fontSize: 15, - marginBottom: 20, - }, -}); - -Confirm.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - getParam: PropTypes.func, - navigate: PropTypes.func, - dismiss: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - amount: PropTypes.string, - fee: PropTypes.number, - address: PropTypes.string, - memo: PropTypes.string, - fromWallet: PropTypes.shape({ - fromAddress: PropTypes.string, - fromSecret: PropTypes.string, - }), - }), - }), - }), -}; diff --git a/screen/send/create.js b/screen/send/create.js deleted file mode 100644 index 7fb67d98ce..0000000000 --- a/screen/send/create.js +++ /dev/null @@ -1,179 +0,0 @@ -import React, { Component } from 'react'; -import { - TextInput, - FlatList, - ScrollView, - Linking, - TouchableOpacity, - Clipboard, - StyleSheet, - TouchableWithoutFeedback, - Keyboard, - Text, - View, -} from 'react-native'; -import { BlueNavigationStyle, SafeBlueArea, BlueCard, BlueText } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import Privacy from '../../Privacy'; -import { BitcoinUnit } from '../../models/bitcoinUnits'; -/** @type {AppStorage} */ -const BlueApp = require('../../BlueApp'); -const loc = require('../../loc'); -const currency = require('../../currency'); - -export default class SendCreate extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle, - title: loc.send.create.details, - }); - - constructor(props) { - super(props); - console.log('send/create constructor'); - - this.state = { - isLoading: false, - fee: props.navigation.getParam('fee'), - recipients: props.navigation.getParam('recipients'), - memo: props.navigation.getParam('memo') || '', - size: Math.round(props.navigation.getParam('tx').length / 2), - tx: props.navigation.getParam('tx'), - satoshiPerByte: props.navigation.getParam('satoshiPerByte'), - wallet: props.navigation.getParam('wallet'), - feeSatoshi: props.navigation.getParam('feeSatoshi'), - }; - } - - async componentDidMount() { - Privacy.enableBlur(); - console.log('send/create - componentDidMount'); - } - - componentWillUnmount() { - Privacy.disableBlur(); - } - - _renderItem = ({ index, item }) => { - return ( - <> - - {loc.send.create.to} - {item.address} - {loc.send.create.amount} - - {item.amount === BitcoinUnit.MAX - ? currency.satoshiToBTC(this.state.wallet.getBalance()) - this.state.fee - : item.amount || currency.satoshiToBTC(item.value)}{' '} - {BitcoinUnit.BTC} - - {this.state.recipients.length > 1 && ( - - {index + 1} of {this.state.recipients.length} - - )} - - - ); - }; - - renderSeparator = () => { - return ; - }; - - render() { - return ( - - - - - {loc.send.create.this_is_hex} - - - Clipboard.setString(this.state.tx)}> - Copy and broadcast later - - Linking.openURL('https://coinb.in/?verify=' + this.state.tx)}> - Verify on coinb.in - - - - 1} - extraData={this.state.recipients} - data={this.state.recipients} - renderItem={this._renderItem} - keyExtractor={(_item, index) => `${index}`} - ItemSeparatorComponent={this.renderSeparator} - /> - {loc.send.create.fee} - - {this.state.fee} {BitcoinUnit.BTC} - - - {loc.send.create.tx_size} - {this.state.size} bytes - - {loc.send.create.satoshi_per_byte} - {this.state.satoshiPerByte} Sat/B - {this.state.memo.length > 0 && ( - <> - {loc.send.create.memo} - {this.state.memo} - - )} - - - - - ); - } -} - -const styles = StyleSheet.create({ - transactionDetailsTitle: { - color: '#0c2550', - fontWeight: '500', - fontSize: 17, - marginBottom: 2, - }, - transactionDetailsSubtitle: { - color: '#9aa0aa', - fontWeight: '500', - fontSize: 15, - marginBottom: 20, - }, -}); - -SendCreate.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - getParam: PropTypes.func, - navigate: PropTypes.func, - dismiss: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - amount: PropTypes.string, - fee: PropTypes.number, - address: PropTypes.string, - memo: PropTypes.string, - }), - }), - }), -}; diff --git a/screen/send/details.js b/screen/send/details.js deleted file mode 100644 index 3917988507..0000000000 --- a/screen/send/details.js +++ /dev/null @@ -1,1079 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { - ActivityIndicator, - View, - TextInput, - Alert, - StatusBar, - TouchableOpacity, - KeyboardAvoidingView, - Keyboard, - TouchableWithoutFeedback, - StyleSheet, - Dimensions, - Platform, - ScrollView, - Text, -} from 'react-native'; -import { Icon } from 'react-native-elements'; -import AsyncStorage from '@react-native-community/async-storage'; -import { - BlueCreateTxNavigationStyle, - BlueButton, - BlueBitcoinAmount, - BlueAddressInput, - BlueDismissKeyboardInputAccessory, - BlueLoading, - BlueUseAllFundsButton, - BlueListItem, - BlueText, -} from '../../BlueComponents'; -import Slider from '@react-native-community/slider'; -import PropTypes from 'prop-types'; -import Modal from 'react-native-modal'; -import NetworkTransactionFees, { NetworkTransactionFee } from '../../models/networkTransactionFees'; -import BitcoinBIP70TransactionDecode from '../../bip70/bip70'; -import { BitcoinUnit, Chain } from '../../models/bitcoinUnits'; -import { HDLegacyP2PKHWallet, HDSegwitBech32Wallet, HDSegwitP2SHWallet, LightningCustodianWallet, WatchOnlyWallet } from '../../class'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { BitcoinTransaction } from '../../models/bitcoinTransactionInfo'; -const bitcoin = require('bitcoinjs-lib'); -const bip21 = require('bip21'); -let BigNumber = require('bignumber.js'); -const { width } = Dimensions.get('window'); -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -let loc = require('../../loc'); - -const btcAddressRx = /^[a-zA-Z0-9]{26,35}$/; - -export default class SendDetails extends Component { - static navigationOptions = ({ navigation }) => ({ - ...BlueCreateTxNavigationStyle( - navigation, - navigation.state.params.withAdvancedOptionsMenuButton, - navigation.state.params.advancedOptionsMenuButtonAction, - ), - title: loc.send.header, - }); - - constructor(props) { - super(props); - - let fromAddress; - if (props.navigation.state.params) fromAddress = props.navigation.state.params.fromAddress; - let fromSecret; - if (props.navigation.state.params) fromSecret = props.navigation.state.params.fromSecret; - let fromWallet = null; - if (props.navigation.state.params) fromWallet = props.navigation.state.params.fromWallet; - - const wallets = BlueApp.getWallets().filter(wallet => wallet.type !== LightningCustodianWallet.type); - - if (wallets.length === 0) { - alert('Before creating a transaction, you must first add a Bitcoin wallet.'); - return props.navigation.goBack(null); - } else { - if (!fromWallet && wallets.length > 0) { - fromWallet = wallets[0]; - fromAddress = fromWallet.getAddress(); - fromSecret = fromWallet.getSecret(); - } - this.state = { - isLoading: false, - showSendMax: false, - isFeeSelectionModalVisible: false, - isAdvancedTransactionOptionsVisible: false, - recipientsScrollIndex: 0, - fromAddress, - fromWallet, - fromSecret, - addresses: [], - memo: '', - networkTransactionFees: new NetworkTransactionFee(1, 1, 1), - fee: 1, - feeSliderValue: 1, - bip70TransactionExpiration: null, - renderWalletSelectionButtonHidden: false, - }; - } - } - - renderNavigationHeader() { - this.props.navigation.setParams({ - withAdvancedOptionsMenuButton: this.state.fromWallet.allowBatchSend(), - advancedOptionsMenuButtonAction: () => { - Keyboard.dismiss(); - this.setState({ isAdvancedTransactionOptionsVisible: true }); - }, - }); - } - - /** - * TODO: refactor this mess, get rid of regexp, use https://github.com/bitcoinjs/bitcoinjs-lib/issues/890 etc etc - * - * @param data {String} Can be address or `bitcoin:xxxxxxx` uri scheme, or invalid garbage - */ - processAddressData = data => { - this.setState({ isLoading: true }, async () => { - if (BitcoinBIP70TransactionDecode.matchesPaymentURL(data)) { - const bip70 = await this.processBIP70Invoice(data); - this.setState({ - addresses: [bip70.recipient], - memo: bip70.memo, - feeSliderValue: bip70.feeSliderValue, - fee: bip70.fee, - isLoading: false, - bip70TransactionExpiration: bip70.bip70TransactionExpiration, - }); - } else { - let recipients = this.state.addresses; - const dataWithoutSchema = data.replace('bitcoin:', ''); - if (btcAddressRx.test(dataWithoutSchema) || (dataWithoutSchema.indexOf('bc1') === 0 && dataWithoutSchema.indexOf('?') === -1)) { - recipients[[this.state.recipientsScrollIndex]].address = dataWithoutSchema; - this.setState({ - address: recipients, - bip70TransactionExpiration: null, - isLoading: false, - }); - } else { - let address = ''; - let options; - try { - if (!data.toLowerCase().startsWith('bitcoin:')) { - data = `bitcoin:${data}`; - } - const decoded = bip21.decode(data); - address = decoded.address; - options = decoded.options; - } catch (error) { - data = data.replace(/(amount)=([^&]+)/g, '').replace(/(amount)=([^&]+)&/g, ''); - const decoded = bip21.decode(data); - decoded.options.amount = 0; - address = decoded.address; - options = decoded.options; - this.setState({ isLoading: false }); - } - console.log(options); - if (btcAddressRx.test(address) || address.indexOf('bc1') === 0) { - recipients[[this.state.recipientsScrollIndex]].address = address; - recipients[[this.state.recipientsScrollIndex]].amount = options.amount; - this.setState({ - addresses: recipients, - memo: options.label || options.message, - bip70TransactionExpiration: null, - isLoading: false, - }); - } else { - this.setState({ isLoading: false }); - } - } - } - }); - }; - - async componentDidMount() { - this.renderNavigationHeader(); - console.log('send/details - componentDidMount'); - StatusBar.setBarStyle('dark-content'); - this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow); - this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide); - - let addresses = []; - let initialMemo = ''; - if (this.props.navigation.state.params.uri) { - const uri = this.props.navigation.state.params.uri; - if (BitcoinBIP70TransactionDecode.matchesPaymentURL(uri)) { - const { recipient, memo, fee, feeSliderValue } = await this.processBIP70Invoice(uri); - addresses.push(recipient); - initialMemo = memo; - this.setState({ addresses, memo: initialMemo, fee, feeSliderValue, isLoading: false }); - } else { - try { - const { address, amount, memo } = this.decodeBitcoinUri(uri); - addresses.push(new BitcoinTransaction(address, amount)); - initialMemo = memo; - this.setState({ addresses, memo: initialMemo, isLoading: false }); - } catch (error) { - console.log(error); - alert('Error: Unable to decode Bitcoin address'); - } - } - } else if (this.props.navigation.state.params.address) { - addresses.push(new BitcoinTransaction(this.props.navigation.state.params.address)); - if (this.props.navigation.state.params.memo) initialMemo = this.props.navigation.state.params.memo; - this.setState({ addresses, memo: initialMemo, isLoading: false }); - } else { - this.setState({ addresses: [new BitcoinTransaction()], isLoading: false }); - } - - try { - const cachedNetworkTransactionFees = JSON.parse(await AsyncStorage.getItem(NetworkTransactionFee.StorageKey)); - - if (cachedNetworkTransactionFees && cachedNetworkTransactionFees.hasOwnProperty('halfHourFee')) { - this.setState({ - fee: cachedNetworkTransactionFees.fastestFee, - networkTransactionFees: cachedNetworkTransactionFees, - feeSliderValue: cachedNetworkTransactionFees.fastestFee, - }); - } - } catch (_) {} - - try { - let recommendedFees = await NetworkTransactionFees.recommendedFees(); - if (recommendedFees && recommendedFees.hasOwnProperty('fastestFee')) { - await AsyncStorage.setItem(NetworkTransactionFee.StorageKey, JSON.stringify(recommendedFees)); - this.setState({ - fee: recommendedFees.fastestFee, - networkTransactionFees: recommendedFees, - feeSliderValue: recommendedFees.fastestFee, - }); - - if (this.props.navigation.state.params.uri) { - if (BitcoinBIP70TransactionDecode.matchesPaymentURL(this.props.navigation.state.params.uri)) { - this.processBIP70Invoice(this.props.navigation.state.params.uri); - } else { - try { - const { address, amount, memo } = this.decodeBitcoinUri(this.props.navigation.getParam('uri')); - this.setState({ address, amount, memo, isLoading: false }); - } catch (error) { - console.log(error); - this.setState({ isLoading: false }); - alert('Error: Unable to decode Bitcoin address'); - } - } - } - } else { - this.setState({ isLoading: false }); - } - } catch (_e) {} - } - - componentWillUnmount() { - this.keyboardDidShowListener.remove(); - this.keyboardDidHideListener.remove(); - } - - _keyboardDidShow = () => { - this.setState({ renderWalletSelectionButtonHidden: true }); - }; - - _keyboardDidHide = () => { - this.setState({ renderWalletSelectionButtonHidden: false }); - }; - - decodeBitcoinUri(uri) { - let amount = ''; - let parsedBitcoinUri = null; - let address = uri || ''; - let memo = ''; - try { - parsedBitcoinUri = bip21.decode(uri); - address = parsedBitcoinUri.hasOwnProperty('address') ? parsedBitcoinUri.address : address; - if (parsedBitcoinUri.hasOwnProperty('options')) { - if (parsedBitcoinUri.options.hasOwnProperty('amount')) { - amount = parsedBitcoinUri.options.amount.toString(); - amount = parsedBitcoinUri.options.amount; - } - if (parsedBitcoinUri.options.hasOwnProperty('label')) { - memo = parsedBitcoinUri.options.label || memo; - } - } - } catch (_) {} - return { address, amount, memo }; - } - - recalculateAvailableBalance(balance, amount, fee) { - if (!amount) amount = 0; - if (!fee) fee = 0; - let availableBalance; - try { - availableBalance = new BigNumber(balance); - availableBalance = availableBalance.div(100000000); // sat2btc - availableBalance = availableBalance.minus(amount); - availableBalance = availableBalance.minus(fee); - availableBalance = availableBalance.toString(10); - } catch (err) { - return balance; - } - - return (availableBalance === 'NaN' && balance) || availableBalance; - } - - calculateFee(utxos, txhex, utxoIsInSatoshis) { - let index = {}; - let c = 1; - index[0] = 0; - for (let utxo of utxos) { - if (!utxoIsInSatoshis) { - utxo.amount = new BigNumber(utxo.amount).multipliedBy(100000000).toNumber(); - } - index[c] = utxo.amount + index[c - 1]; - c++; - } - - let tx = bitcoin.Transaction.fromHex(txhex); - let totalInput = index[tx.ins.length]; - // ^^^ dumb way to calculate total input. we assume that signer uses utxos sequentially - // so total input == sum of yongest used inputs (and num of used inputs is `tx.ins.length`) - // TODO: good candidate to refactor and move to appropriate class. some day - - let totalOutput = 0; - for (let o of tx.outs) { - totalOutput += o.value * 1; - } - - return new BigNumber(totalInput - totalOutput).dividedBy(100000000).toNumber(); - } - - async processBIP70Invoice(text) { - try { - if (BitcoinBIP70TransactionDecode.matchesPaymentURL(text)) { - Keyboard.dismiss(); - return BitcoinBIP70TransactionDecode.decode(text) - .then(response => { - const recipient = new BitcoinTransaction( - response.address, - loc.formatBalanceWithoutSuffix(response.amount, BitcoinUnit.BTC, false), - ); - return { - recipient, - memo: response.memo, - fee: response.fee, - feeSliderValue: response.fee, - bip70TransactionExpiration: response.expires, - }; - }) - .catch(error => { - alert(error.errorMessage); - throw error; - }); - } - } catch (error) { - return false; - } - throw new Error('BIP70: Unable to process.'); - } - - async createTransaction() { - Keyboard.dismiss(); - this.setState({ isLoading: true }); - let error = false; - let requestedSatPerByte = this.state.fee.toString().replace(/\D/g, ''); - for (const [index, transaction] of this.state.addresses.entries()) { - if (!transaction.amount || transaction.amount < 0 || parseFloat(transaction.amount) === 0) { - error = loc.send.details.amount_field_is_not_valid; - console.log('validation error'); - } else if (!this.state.fee || !requestedSatPerByte || parseFloat(requestedSatPerByte) < 1) { - error = loc.send.details.fee_field_is_not_valid; - console.log('validation error'); - } else if (!transaction.address) { - error = loc.send.details.address_field_is_not_valid; - console.log('validation error'); - } else if (this.recalculateAvailableBalance(this.state.fromWallet.getBalance(), transaction.amount, 0) < 0) { - // first sanity check is that sending amount is not bigger than available balance - error = loc.send.details.total_exceeds_balance; - console.log('validation error'); - } else if (BitcoinBIP70TransactionDecode.isExpired(this.state.bip70TransactionExpiration)) { - error = 'Transaction has expired.'; - console.log('validation error'); - } else if (transaction.address) { - const address = transaction.address.trim().toLowerCase(); - if (address.startsWith('lnb') || address.startsWith('lightning:lnb')) { - error = - 'This address appears to be for a Lightning invoice. Please, go to your Lightning wallet in order to make a payment for this invoice.'; - console.log('validation error'); - } - } - - if (!error) { - try { - bitcoin.address.toOutputScript(transaction.address); - } catch (err) { - console.log('validation error'); - console.log(err); - error = loc.send.details.address_field_is_not_valid; - } - } - if (error) { - if (index === 0) { - this.scrollView.scrollTo(); - } else if (index === this.state.addresses.length - 1) { - this.scrollView.scrollToEnd(); - } else { - const page = Math.round(width * (this.state.addresses.length - 2)); - this.scrollView.scrollTo({ x: page, y: 0, animated: true }); - } - this.setState({ isLoading: false, recipientsScrollIndex: index }); - alert(error); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - break; - } - } - - if (error) { - return; - } - - if (this.state.fromWallet.type === HDSegwitBech32Wallet.type || this.state.fromWallet.type === WatchOnlyWallet.type) { - // new send is supported by BIP84 or watchonly with HW wallet support (it uses BIP84 under the hood anyway) - try { - await this.createHDBech32Transaction(); - } catch (Err) { - this.setState({ isLoading: false }, () => { - alert(Err.message); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - }); - } - return; - } - - // legacy send below - - this.setState({ isLoading: true }, async () => { - let utxo; - let actualSatoshiPerByte; - let tx, txid; - let tries = 1; - let fee = 0.000001; // initial fee guess - const firstTransaction = this.state.addresses[0]; - try { - await this.state.fromWallet.fetchUtxo(); - if (this.state.fromWallet.getChangeAddressAsync) { - await this.state.fromWallet.getChangeAddressAsync(); // to refresh internal pointer to next free address - } - if (this.state.fromWallet.getAddressAsync) { - await this.state.fromWallet.getAddressAsync(); // to refresh internal pointer to next free address - } - - utxo = this.state.fromWallet.utxo; - - do { - console.log('try #', tries, 'fee=', fee); - if (this.recalculateAvailableBalance(this.state.fromWallet.getBalance(), firstTransaction.amount, fee) < 0) { - // we could not add any fee. user is trying to send all he's got. that wont work - throw new Error(loc.send.details.total_exceeds_balance); - } - - let startTime = Date.now(); - tx = this.state.fromWallet.createTx(utxo, firstTransaction.amount, fee, firstTransaction.address, this.state.memo); - let endTime = Date.now(); - console.log('create tx ', (endTime - startTime) / 1000, 'sec'); - - let txDecoded = bitcoin.Transaction.fromHex(tx); - txid = txDecoded.getId(); - console.log('txid', txid); - console.log('txhex', tx); - - let feeSatoshi = new BigNumber(fee).multipliedBy(100000000); - actualSatoshiPerByte = feeSatoshi.dividedBy(Math.round(tx.length / 2)); - actualSatoshiPerByte = actualSatoshiPerByte.toNumber(); - console.log({ satoshiPerByte: actualSatoshiPerByte }); - - if (Math.round(actualSatoshiPerByte) !== requestedSatPerByte * 1 || Math.floor(actualSatoshiPerByte) < 1) { - console.log('fee is not correct, retrying'); - fee = feeSatoshi - .multipliedBy(requestedSatPerByte / actualSatoshiPerByte) - .plus(10) - .dividedBy(100000000) - .toNumber(); - } else { - break; - } - } while (tries++ < 5); - - BlueApp.tx_metadata = BlueApp.tx_metadata || {}; - BlueApp.tx_metadata[txid] = { - txhex: tx, - memo: this.state.memo, - }; - await BlueApp.saveToDisk(); - } catch (err) { - console.log(err); - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - alert(err); - this.setState({ isLoading: false }); - return; - } - - this.setState({ isLoading: false }, () => - this.props.navigation.navigate('Confirm', { - recipients: [firstTransaction], - // HD wallet's utxo is in sats, classic segwit wallet utxos are in btc - fee: this.calculateFee( - utxo, - tx, - this.state.fromWallet.type === HDSegwitP2SHWallet.type || this.state.fromWallet.type === HDLegacyP2PKHWallet.type, - ), - memo: this.state.memo, - fromWallet: this.state.fromWallet, - tx: tx, - satoshiPerByte: actualSatoshiPerByte.toFixed(2), - }), - ); - }); - } - - async createHDBech32Transaction() { - /** @type {HDSegwitBech32Wallet} */ - const wallet = this.state.fromWallet; - await wallet.fetchUtxo(); - const firstTransaction = this.state.addresses[0]; - const changeAddress = await wallet.getChangeAddressAsync(); - let satoshis = new BigNumber(firstTransaction.amount).multipliedBy(100000000).toNumber(); - const requestedSatPerByte = +this.state.fee.toString().replace(/\D/g, ''); - console.log({ satoshis, requestedSatPerByte, utxo: wallet.getUtxo() }); - - let targets = []; - for (const transaction of this.state.addresses) { - const amount = - transaction.amount === BitcoinUnit.MAX ? BitcoinUnit.MAX : new BigNumber(transaction.amount).multipliedBy(100000000).toNumber(); - if (amount > 0.0 || amount === BitcoinUnit.MAX) { - targets.push({ address: transaction.address, value: amount }); - } - } - - if (firstTransaction.amount === BitcoinUnit.MAX) { - targets = [{ address: firstTransaction.address, amount: BitcoinUnit.MAX }]; - } - - let { tx, fee, psbt } = wallet.createTransaction(wallet.getUtxo(), targets, requestedSatPerByte, changeAddress); - - if (wallet.type === WatchOnlyWallet.type) { - // watch-only wallets with enabled HW wallet support have different flow. we have to show PSBT to user as QR code - // so he can scan it and sign it. then we have to scan it back from user (via camera and QR code), and ask - // user whether he wants to broadcast it - - this.setState({ isLoading: false }, () => - this.props.navigation.navigate('PsbtWithHardwareWallet', { - memo: this.state.memo, - fromWallet: wallet, - psbt, - }), - ); - return; - } - - BlueApp.tx_metadata = BlueApp.tx_metadata || {}; - BlueApp.tx_metadata[tx.getId()] = { - txhex: tx.toHex(), - memo: this.state.memo, - }; - await BlueApp.saveToDisk(); - this.setState({ isLoading: false }, () => - this.props.navigation.navigate('Confirm', { - fee: new BigNumber(fee).dividedBy(100000000).toNumber(), - memo: this.state.memo, - fromWallet: wallet, - tx: tx.toHex(), - recipients: targets, - satoshiPerByte: requestedSatPerByte, - }), - ); - } - - onWalletSelect = wallet => { - const changeWallet = () => { - this.setState({ fromAddress: wallet.getAddress(), fromSecret: wallet.getSecret(), fromWallet: wallet }, () => { - this.renderNavigationHeader(); - this.props.navigation.pop(); - }); - }; - if (this.state.addresses.length > 1 && !wallet.allowBatchSend()) { - ReactNativeHapticFeedback.trigger('notificationWarning'); - Alert.alert( - 'Wallet Selection', - `The selected wallet does not support sending Bitcoin to multiple recipients. Are you sure to want to select this wallet?`, - [ - { - text: loc._.ok, - onPress: async () => { - const firstTransaction = - this.state.addresses.find(element => { - const feeSatoshi = new BigNumber(element.amount).multipliedBy(100000000); - return element.address.length > 0 && feeSatoshi > 0; - }) || this.state.addresses[0]; - this.setState({ addresses: [firstTransaction], recipientsScrollIndex: 0 }, () => changeWallet()); - }, - style: 'default', - }, - { text: loc.send.details.cancel, onPress: () => {}, style: 'cancel' }, - ], - { cancelable: false }, - ); - } else if (this.state.addresses.some(element => element.amount === BitcoinUnit.MAX) && !wallet.allowSendMax()) { - ReactNativeHapticFeedback.trigger('notificationWarning'); - Alert.alert( - 'Wallet Selection', - `The selected wallet does not support automatic maximum balance calculation. Are you sure to want to select this wallet?`, - [ - { - text: loc._.ok, - onPress: async () => { - const firstTransaction = - this.state.addresses.find(element => { - return element.amount === BitcoinUnit.MAX; - }) || this.state.addresses[0]; - firstTransaction.amount = 0; - this.setState({ addresses: [firstTransaction], recipientsScrollIndex: 0 }, () => changeWallet()); - }, - style: 'default', - }, - { text: loc.send.details.cancel, onPress: () => {}, style: 'cancel' }, - ], - { cancelable: false }, - ); - } else { - changeWallet(); - } - }; - - renderFeeSelectionModal = () => { - return ( - { - if (this.state.fee < 1 || this.state.feeSliderValue < 1) { - this.setState({ fee: Number(1), feeSliderValue: Number(1) }); - } - Keyboard.dismiss(); - this.setState({ isFeeSelectionModalVisible: false }); - }} - > - - - this.textInput.focus()}> - { - this.textInput = ref; - }} - value={this.state.fee.toString()} - onEndEditing={() => { - if (this.state.fee < 1 || this.state.feeSliderValue < 1) { - this.setState({ fee: Number(1), feeSliderValue: Number(1) }); - } - }} - onChangeText={value => { - let newValue = value.replace(/\D/g, ''); - this.setState({ fee: newValue, feeSliderValue: Number(newValue) }); - }} - maxLength={9} - editable={!this.state.isLoading} - placeholderTextColor="#37c0a1" - placeholder={this.state.networkTransactionFees.halfHourFee.toString()} - style={{ fontWeight: '600', color: '#37c0a1', marginBottom: 0, marginRight: 4, textAlign: 'right', fontSize: 36 }} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - - sat/b - - - {this.state.networkTransactionFees.fastestFee > 1 && ( - - this.setState({ feeSliderValue: value.toFixed(0), fee: value.toFixed(0) })} - minimumValue={1} - maximumValue={Number(this.state.networkTransactionFees.fastestFee)} - value={Number(this.state.feeSliderValue)} - maximumTrackTintColor="#d8d8d8" - minimumTrackTintColor="#37c0a1" - style={{ flex: 1 }} - /> - - slow - fast - - - )} - - - - ); - }; - - renderAdvancedTransactionOptionsModal = () => { - return ( - { - Keyboard.dismiss(); - this.setState({ isAdvancedTransactionOptionsVisible: false }); - }} - > - - - element.amount === BitcoinUnit.MAX)} - onPress={() => { - const addresses = this.state.addresses; - addresses.push(new BitcoinTransaction()); - this.setState( - { - addresses, - isAdvancedTransactionOptionsVisible: false, - }, - () => { - this.scrollView.scrollToEnd(); - if (this.state.addresses.length > 1) this.scrollView.flashScrollIndicators(); - }, - ); - }} - > - element.amount === BitcoinUnit.MAX)} - title="Add Recipient" - hideChevron - /> - - - { - const addresses = this.state.addresses; - addresses.splice(this.state.recipientsScrollIndex, 1); - this.setState( - { - addresses, - isAdvancedTransactionOptionsVisible: false, - }, - () => { - if (this.state.addresses.length > 1) this.scrollView.flashScrollIndicators(); - this.setState({ recipientsScrollIndex: this.scrollViewCurrentIndex }); - }, - ); - }} - > - - - - - - ); - }; - - renderCreateButton = () => { - return ( - - {this.state.isLoading ? : this.createTransaction()} title={'Next'} />} - - ); - }; - - renderWalletSelectionButton = () => { - if (this.state.renderWalletSelectionButtonHidden) return; - return ( - - {!this.state.isLoading && ( - - this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.ONCHAIN }) - } - > - {loc.wallets.select_wallet.toLowerCase()} - - - )} - - - this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.ONCHAIN }) - } - > - {this.state.fromWallet.getLabel()} - - - - ); - }; - - handlePageChange = e => { - Keyboard.dismiss(); - var offset = e.nativeEvent.contentOffset; - if (offset) { - const page = Math.round(offset.x / width); - if (this.state.recipientsScrollIndex !== page) { - this.setState({ recipientsScrollIndex: page }); - } - } - }; - - scrollViewCurrentIndex = () => { - Keyboard.dismiss(); - var offset = this.scrollView.contentOffset; - if (offset) { - const page = Math.round(offset.x / width); - return page; - } - return 0; - }; - - renderBitcoinTransactionInfoFields = () => { - let rows = []; - for (let [index, item] of this.state.addresses.entries()) { - rows.push( - - { - item.amount = text; - const transactions = this.state.addresses; - transactions[index] = item; - this.setState({ addresses: transactions }); - }} - inputAccessoryViewID={this.state.fromWallet.allowSendMax() ? BlueUseAllFundsButton.InputAccessoryViewID : null} - onFocus={() => this.setState({ isAmountToolbarVisibleForAndroid: true })} - onBlur={() => this.setState({ isAmountToolbarVisibleForAndroid: false })} - /> - { - text = text.trim(); - let transactions = this.state.addresses; - try { - const { recipient, memo, fee, feeSliderValue } = await this.processBIP70Invoice(text); - transactions[index].address = recipient.address; - transactions[index].amount = recipient.amount; - this.setState({ addresses: transactions, memo: memo, fee, feeSliderValue, isLoading: false }); - } catch (_e) { - const { address, amount, memo } = this.decodeBitcoinUri(text); - item.address = address || text; - item.amount = amount || item.amount; - transactions[index] = item; - this.setState({ - addresses: transactions, - memo: memo || this.state.memo, - isLoading: false, - bip70TransactionExpiration: null, - }); - } - }} - onBarScanned={this.processAddressData} - address={item.address} - isLoading={this.state.isLoading} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - {this.state.addresses.length > 1 && ( - - {index + 1} of {this.state.addresses.length} - - )} - , - ); - } - return rows; - }; - - render() { - if (this.state.isLoading || typeof this.state.fromWallet === 'undefined') { - return ( - - - - ); - } - return ( - - - - - (this.scrollView = ref)} - onContentSizeChange={() => this.scrollView.scrollToEnd()} - onLayout={() => this.scrollView.scrollToEnd()} - onMomentumScrollEnd={this.handlePageChange} - scrollEnabled={this.state.addresses.length > 1} - scrollIndicatorInsets={{ top: 0, left: 8, bottom: 0, right: 8 }} - > - {this.renderBitcoinTransactionInfoFields()} - - - this.setState({ memo: text })} - placeholder={loc.send.details.note_placeholder} - value={this.state.memo} - numberOfLines={1} - style={{ flex: 1, marginHorizontal: 8, minHeight: 33 }} - editable={!this.state.isLoading} - onSubmitEditing={Keyboard.dismiss} - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - /> - - this.setState({ isFeeSelectionModalVisible: true })} - disabled={this.state.isLoading} - style={{ flexDirection: 'row', marginHorizontal: 20, justifyContent: 'space-between', alignItems: 'center' }} - > - Fee - - {this.state.fee} - sat/b - - - {this.renderCreateButton()} - {this.renderFeeSelectionModal()} - {this.renderAdvancedTransactionOptionsModal()} - - - - {Platform.select({ - ios: ( - { - ReactNativeHapticFeedback.trigger('notificationWarning'); - Alert.alert( - 'Use full balance', - `Are you sure you want to use your wallet's full balance for this transaction? ${ - this.state.addresses.length > 1 ? 'Your other recipients will be removed from this transaction.' : '' - }`, - [ - { - text: loc._.ok, - onPress: async () => { - Keyboard.dismiss(); - const recipient = this.state.addresses[this.state.recipientsScrollIndex]; - recipient.amount = BitcoinUnit.MAX; - this.setState({ addresses: [recipient], recipientsScrollIndex: 0 }); - }, - style: 'default', - }, - { text: loc.send.details.cancel, onPress: () => {}, style: 'cancel' }, - ], - { cancelable: false }, - ); - }} - wallet={this.state.fromWallet} - /> - ), - android: this.state.isAmountToolbarVisibleForAndroid && ( - { - Alert.alert( - 'Use all funds', - `Are you sure you want to use your all of your wallet's funds for this transaction?`, - [ - { - text: loc._.ok, - onPress: async () => { - Keyboard.dismiss(); - this.setState({ amount: BitcoinUnit.MAX }); - }, - style: 'default', - }, - { text: loc.send.details.cancel, onPress: () => {}, style: 'cancel' }, - ], - { cancelable: false }, - ); - }} - wallet={this.state.fromWallet} - /> - ), - })} - - {this.renderWalletSelectionButton()} - - - ); - } -} - -const styles = StyleSheet.create({ - modalContent: { - backgroundColor: '#FFFFFF', - padding: 22, - justifyContent: 'center', - alignItems: 'center', - borderTopLeftRadius: 16, - borderTopRightRadius: 16, - borderColor: 'rgba(0, 0, 0, 0.1)', - minHeight: 200, - height: 200, - }, - advancedTransactionOptionsModalContent: { - backgroundColor: '#FFFFFF', - padding: 22, - borderTopLeftRadius: 16, - borderTopRightRadius: 16, - borderColor: 'rgba(0, 0, 0, 0.1)', - minHeight: 130, - }, - bottomModal: { - justifyContent: 'flex-end', - margin: 0, - }, - satoshisTextInput: { - backgroundColor: '#d2f8d6', - minWidth: 127, - height: 60, - borderRadius: 8, - flexDirection: 'row', - justifyContent: 'center', - paddingHorizontal: 8, - }, -}); - -SendDetails.propTypes = { - navigation: PropTypes.shape({ - pop: PropTypes.func, - goBack: PropTypes.func, - navigate: PropTypes.func, - getParam: PropTypes.func, - setParams: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - amount: PropTypes.number, - address: PropTypes.string, - fromAddress: PropTypes.string, - satoshiPerByte: PropTypes.string, - fromSecret: PropTypes.fromSecret, - fromWallet: PropTypes.fromWallet, - memo: PropTypes.string, - uri: PropTypes.string, - }), - }), - }), -}; diff --git a/screen/send/psbtWithHardwareWallet.js b/screen/send/psbtWithHardwareWallet.js deleted file mode 100644 index 45e22dd981..0000000000 --- a/screen/send/psbtWithHardwareWallet.js +++ /dev/null @@ -1,245 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { ActivityIndicator, TouchableOpacity, View, Dimensions, Image, TextInput, Clipboard, Linking } from 'react-native'; -import QRCode from 'react-native-qrcode-svg'; -import { Icon, Text } from 'react-native-elements'; -import { - BlueButton, - BlueText, - SafeBlueArea, - BlueCard, - BlueNavigationStyle, - BlueSpacing20, - BlueCopyToClipboardButton, -} from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { RNCamera } from 'react-native-camera'; -let loc = require('../../loc'); -let EV = require('../../events'); -let BlueElectrum = require('../../BlueElectrum'); -/** @type {AppStorage} */ -const BlueApp = require('../../BlueApp'); -const bitcoin = require('bitcoinjs-lib'); -const { height, width } = Dimensions.get('window'); - -export default class PsbtWithHardwareWallet extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(null, false), - title: loc.send.header, - }); - - cameraRef = null; - - onBarCodeRead = ret => { - if (RNCamera.Constants.CameraStatus === RNCamera.Constants.CameraStatus.READY) this.cameraRef.pausePreview(); - this.setState({ renderScanner: false }, () => { - console.log(ret.data); - try { - let Tx = this.state.fromWallet.combinePsbt(this.state.psbt.toBase64(), ret.data); - this.setState({ txhex: Tx.toHex() }); - } catch (Err) { - alert(Err); - } - }); - }; - - constructor(props) { - super(props); - - this.state = { - isLoading: false, - renderScanner: false, - qrCodeHeight: height > width ? width - 40 : width / 2, - memo: props.navigation.getParam('memo'), - psbt: props.navigation.getParam('psbt'), - fromWallet: props.navigation.getParam('fromWallet'), - }; - } - - async componentDidMount() { - console.log('send/psbtWithHardwareWallet - componentDidMount'); - } - - broadcast = () => { - this.setState({ isLoading: true }, async () => { - try { - await BlueElectrum.ping(); - await BlueElectrum.waitTillConnected(); - let result = await this.state.fromWallet.broadcastTx(this.state.txhex); - if (result) { - console.log('broadcast result = ', result); - EV(EV.enum.REMOTE_TRANSACTIONS_COUNT_CHANGED); // someone should fetch txs - this.setState({ success: true, isLoading: false }); - if (this.state.memo) { - let txDecoded = bitcoin.Transaction.fromHex(this.state.txhex); - const txid = txDecoded.getId(); - BlueApp.tx_metadata[txid] = { memo: this.state.memo }; - } - } else { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - this.setState({ isLoading: false }); - alert('Broadcast failed'); - } - } catch (error) { - ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); - this.setState({ isLoading: false }); - alert(error.message); - } - }); - }; - - _renderScanner() { - return ( - - (this.cameraRef = ref)} - style={{ flex: 1, justifyContent: 'space-between' }} - onBarCodeRead={this.onBarCodeRead} - barCodeTypes={[RNCamera.Constants.BarCodeType.qr]} - /> - this.setState({ renderScanner: false })} - > - - - - ); - } - - _renderSuccess() { - return ( - - - - - - - - - ); - } - - _renderBroadcastHex() { - return ( - - - {loc.send.create.this_is_hex} - - - Clipboard.setString(this.state.txhex)}> - Copy and broadcast later - - Linking.openURL('https://coinb.in/?verify=' + this.state.txhex)}> - Verify on coinb.in - - - - - - ); - } - - render() { - if (this.state.isLoading) { - return ( - - - - ); - } - - if (this.state.success) return this._renderSuccess(); - if (this.state.renderScanner) return this._renderScanner(); - if (this.state.txhex) return this._renderBroadcastHex(); - - return ( - - - - - This is partially signed bitcoin transaction (PSBT). Please finish signing it with your hardware wallet. - - - - this.setState({ renderScanner: true })} title={'Scan signed transaction'} /> - - - - - - - - - ); - } -} - -PsbtWithHardwareWallet.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - getParam: PropTypes.func, - navigate: PropTypes.func, - dismiss: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - memo: PropTypes.string, - fromWallet: PropTypes.shape({ - fromAddress: PropTypes.string, - fromSecret: PropTypes.string, - }), - }), - }), - }), -}; diff --git a/screen/send/scanQrAddress.js b/screen/send/scanQrAddress.js deleted file mode 100644 index 6c83a2e5f3..0000000000 --- a/screen/send/scanQrAddress.js +++ /dev/null @@ -1,106 +0,0 @@ -/* global alert */ -import React from 'react'; -import { Image, TouchableOpacity } from 'react-native'; -import PropTypes from 'prop-types'; -import { RNCamera } from 'react-native-camera'; -import { SafeBlueArea } from '../../BlueComponents'; -import { Icon } from 'react-native-elements'; -import ImagePicker from 'react-native-image-picker'; -const LocalQRCode = require('@remobile/react-native-qrcode-local-image'); - -export default class ScanQRCode extends React.Component { - static navigationOptions = { - header: null, - }; - - cameraRef = null; - - onBarCodeRead = ret => { - if (RNCamera.Constants.CameraStatus === RNCamera.Constants.CameraStatus.READY) this.cameraRef.pausePreview(); - const onBarScannedProp = this.props.navigation.getParam('onBarScanned'); - this.props.navigation.goBack(); - onBarScannedProp(ret.data); - }; // end - - render() { - return ( - - (this.cameraRef = ref)} - style={{ flex: 1, justifyContent: 'space-between' }} - onBarCodeRead={this.onBarCodeRead} - barCodeTypes={[RNCamera.Constants.BarCodeType.qr]} - /> - this.props.navigation.goBack(null)} - > - - - { - if (RNCamera.Constants.CameraStatus === RNCamera.Constants.CameraStatus.READY) this.cameraRef.pausePreview(); - ImagePicker.launchImageLibrary( - { - title: null, - mediaType: 'photo', - takePhotoButtonTitle: null, - }, - response => { - if (response.uri) { - const uri = response.uri.toString().replace('file://', ''); - LocalQRCode.decode(uri, (error, result) => { - if (!error) { - this.onBarCodeRead({ data: result }); - } else { - if (RNCamera.Constants.CameraStatus === RNCamera.Constants.CameraStatus.READY) this.cameraRef.resumePreview(); - alert('The selected image does not contain a QR Code.'); - } - }); - } else { - if (RNCamera.Constants.CameraStatus === RNCamera.Constants.CameraStatus.READY) this.cameraRef.resumePreview(); - } - }, - ); - }} - > - - - - ); - } -} - -ScanQRCode.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - dismiss: PropTypes.func, - getParam: PropTypes.func, - }), -}; diff --git a/screen/send/success.js b/screen/send/success.js deleted file mode 100644 index 8dce863d65..0000000000 --- a/screen/send/success.js +++ /dev/null @@ -1,130 +0,0 @@ -import React, { Component } from 'react'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { View } from 'react-native'; -import { Text, Icon } from 'react-native-elements'; -import { BlueButton, SafeBlueArea, BlueCard } from '../../BlueComponents'; -import { BitcoinUnit } from '../../models/bitcoinUnits'; -import PropTypes from 'prop-types'; -let loc = require('../../loc'); - -export default class Success extends Component { - static navigationOptions = { - header: null, - gesturesEnabled: false, - }; - - constructor(props) { - super(props); - console.log('send/success constructor'); - - this.state = { - amount: props.navigation.getParam('amount'), - fee: props.navigation.getParam('fee') || 0, - amountUnit: props.navigation.getParam('amountUnit') || BitcoinUnit.BTC, - invoiceDescription: props.navigation.getParam('invoiceDescription') || '', - }; - } - - async componentDidMount() { - console.log('send/success - componentDidMount'); - ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false }); - } - - render() { - return ( - - - - - {this.state.amount} - - - {' ' + this.state.amountUnit} - - - {this.state.fee > 0 && ( - - {loc.send.create.fee}: {this.state.fee} {BitcoinUnit.BTC} - - )} - {this.state.fee <= 0 && ( - - {this.state.invoiceDescription} - - )} - - - - - - { - this.props.navigation.dismiss(); - }} - title={loc.send.success.done} - /> - - - ); - } -} - -Success.propTypes = { - navigation: PropTypes.shape({ - goBack: PropTypes.func, - getParam: PropTypes.func, - navigate: PropTypes.func, - dismiss: PropTypes.func, - state: PropTypes.shape({ - params: PropTypes.shape({ - amount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - fee: PropTypes.number, - }), - }), - }), -}; diff --git a/screen/settings/about.js b/screen/settings/about.js deleted file mode 100644 index c522b79e25..0000000000 --- a/screen/settings/about.js +++ /dev/null @@ -1,165 +0,0 @@ -import React, { Component } from 'react'; -import { ScrollView, Linking, Dimensions } from 'react-native'; -import { - BlueTextCentered, - BlueLoading, - BlueSpacing20, - BlueButton, - SafeBlueArea, - BlueCard, - BlueText, - BlueNavigationStyle, -} from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import { getApplicationName, getVersion, getBundleId, getBuildNumber } from 'react-native-device-info'; -import Rate, { AndroidMarket } from 'react-native-rate'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -const { width, height } = Dimensions.get('window'); -const loc = require('../../loc/'); - -export default class About extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: loc.settings.about, - }); - - constructor(props) { - super(props); - this.state = { - isLoading: true, - }; - } - - async componentDidMount() { - this.setState({ - isLoading: false, - }); - } - - render() { - if (this.state.isLoading) { - return ; - } - - return ( - - - - BlueWallet is a free and open source Bitcoin wallet. Licensed MIT. - - - Always backup your keys - - - { - Linking.openURL('https://github.com/BlueWallet/BlueWallet'); - }} - title="github.com/BlueWallet/BlueWallet" - /> - - - { - Linking.openURL('https://twitter.com/bluewalletio'); - }} - title="Follow us on Twitter" - /> - - - { - Linking.openURL('https://t.me/bluewallet'); - }} - title="Join Telegram chat" - /> - - - { - let options = { - AppleAppID: '1376878040', - GooglePackageName: 'io.bluewallet.bluewallet', - preferredAndroidMarket: AndroidMarket.Google, - preferInApp: true, - openAppStoreIfInAppFails: true, - fallbackPlatformURL: 'https://bluewallet.io', - }; - Rate.rate(options, success => { - if (success) { - console.log('User Rated.'); - } - }); - }} - title="Rate BlueWallet" - /> - - - Built with awesome: - - * React Native - * Bitcoinjs-lib - * blockcypher.com API - * Nodejs - * react-native-elements - * rn-nodeify - * bignumber.js - - - { - this.props.navigation.navigate('ReleaseNotes'); - }} - title="Release notes" - /> - - - { - this.props.navigation.navigate('Selftest'); - }} - title="Run self test" - /> - - - {getApplicationName()} ver {getVersion()} (build {getBuildNumber()}) - - {new Date(getBuildNumber() * 1000).toGMTString()} - {getBundleId()} - - w, h = {width}, {height} - - - - - ); - } -} - -About.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/settings/currency.js b/screen/settings/currency.js deleted file mode 100644 index c511b196c0..0000000000 --- a/screen/settings/currency.js +++ /dev/null @@ -1,90 +0,0 @@ -import React, { Component } from 'react'; -import { FlatList, TouchableOpacity, ActivityIndicator, View } from 'react-native'; -import { SafeBlueArea, BlueNavigationStyle, BlueListItem, BlueText, BlueCard } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import { Icon } from 'react-native-elements'; -import { FiatUnit } from '../../models/fiatUnit'; -let loc = require('../../loc'); -let currency = require('../../currency'); - -export default class Currency extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: loc.settings.currency, - }); - - constructor(props) { - super(props); - this.state = { data: Object.values(FiatUnit), isSavingNewPreferredCurrency: false }; - } - - async componentDidMount() { - try { - const preferredCurrency = await currency.getPreferredCurrency(); - if (preferredCurrency === null) { - throw Error(); - } - this.setState({ selectedCurrency: preferredCurrency }); - } catch (_error) { - this.setState({ selectedCurrency: FiatUnit.USD }); - } - } - - renderItem = ({ item }) => { - return ( - { - this.setState({ isSavingNewPreferredCurrency: true, selectedCurrency: item }, async () => { - await currency.setPrefferedCurrency(item); - await currency.startUpdater(); - this.setState({ isSavingNewPreferredCurrency: false }); - }); - }} - > - - ) : ( - - ), - } - : { hideChevron: true })} - /> - - ); - }; - - render() { - if (this.state.selectedCurrency !== null && this.state.selectedCurrency !== undefined) { - return ( - - `${index}`} - data={this.state.data} - extraData={this.state.data} - renderItem={this.renderItem} - /> - - Prices are obtained from CoinDesk - - - ); - } - return ( - - - - ); - } -} - -Currency.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/settings/defaultView.js b/screen/settings/defaultView.js deleted file mode 100644 index fa944e747c..0000000000 --- a/screen/settings/defaultView.js +++ /dev/null @@ -1,80 +0,0 @@ -import React, { Component } from 'react'; -import { TouchableOpacity, View } from 'react-native'; -import { SafeBlueArea, BlueNavigationStyle, BlueListItem } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import OnAppLaunch from '../../class/onAppLaunch'; -const BlueApp = require('../../BlueApp'); - -export default class DefaultView extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: 'On Launch', - }); - - constructor(props) { - super(props); - this.state = { defaultWalletLabel: '', viewAllWalletsEnabled: true }; - } - - async componentDidMount() { - const viewAllWalletsEnabled = await OnAppLaunch.isViewAllWalletsEnabled(); - let defaultWalletLabel = ''; - const wallet = await OnAppLaunch.getSelectedDefaultWallet(); - if (wallet) { - defaultWalletLabel = wallet.getLabel(); - } - this.setState({ viewAllWalletsEnabled, defaultWalletLabel }); - } - - selectWallet = () => { - this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelectValueChanged }); - }; - - onViewAllWalletsSwitchValueChanged = async value => { - await OnAppLaunch.setViewAllWalletsEnabled(value); - if (value) { - return this.setState({ viewAllWalletsEnabled: true, defaultWalletLabel: '' }); - } else { - const selectedWallet = await OnAppLaunch.getSelectedDefaultWallet(); - return this.setState({ viewAllWalletsEnabled: false, defaultWalletLabel: selectedWallet.getLabel() }); - } - }; - - onWalletSelectValueChanged = async wallet => { - await OnAppLaunch.setViewAllWalletsEnabled(false); - await OnAppLaunch.setSelectedDefaultWallet(wallet.getID()); - this.setState({ defaultWalletLabel: wallet.getLabel(), viewAllWalletsEnabled: false }, () => this.props.navigation.pop()); - }; - - render() { - return ( - - - 0} - switched={this.state.viewAllWalletsEnabled} - onSwitch={this.onViewAllWalletsSwitchValueChanged} - /> - {!this.state.viewAllWalletsEnabled && ( - - )} - - - ); - } -} - -DefaultView.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - pop: PropTypes.func, - }), -}; diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js deleted file mode 100644 index 912d5c4bd2..0000000000 --- a/screen/settings/electrumSettings.js +++ /dev/null @@ -1,139 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { View, TextInput } from 'react-native'; -import { AppStorage } from '../../class'; -import AsyncStorage from '@react-native-community/async-storage'; -import { BlueLoading, BlueSpacing20, BlueButton, SafeBlueArea, BlueCard, BlueNavigationStyle, BlueText } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -let loc = require('../../loc'); -let BlueElectrum = require('../../BlueElectrum'); - -export default class ElectrumSettings extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: loc.settings.electrum_settings, - }); - - constructor(props) { - super(props); - this.state = { - isLoading: true, - config: {}, - }; - } - - async componentDidMount() { - let host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST); - let port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT); - - this.setState({ - isLoading: false, - host, - port, - }); - - await this.setState({ - config: await BlueElectrum.getConfig(), - }); - } - - save = () => { - this.setState({ isLoading: true }, async () => { - this.state.host = this.state.host ? this.state.host : ''; - this.state.port = this.state.port ? this.state.port : ''; - try { - if (!this.state.host && !this.state.port) { - await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, ''); - await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, ''); - alert('Your changes have been saved successfully. Restart may be required for changes to take effect.'); - } else if (!(await BlueElectrum.testConnection(this.state.host, this.state.port))) { - alert("Can't connect to provided Electrum server"); - } else { - await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, this.state.host); - await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, this.state.port); - alert('Your changes have been saved successfully. Restart may be required for changes to take effect.'); - } - } catch (_) {} - this.setState({ isLoading: false }); - }); - }; - - render() { - return ( - - - {loc.settings.electrum_settings_explain} - - - - this.setState({ host: text })} - numberOfLines={1} - style={{ flex: 1, marginHorizontal: 8, minHeight: 36, height: 36 }} - editable={!this.state.isLoading} - underlineColorAndroid="transparent" - /> - - - - this.setState({ port: text })} - numberOfLines={1} - style={{ flex: 1, marginHorizontal: 8, minHeight: 36, height: 36 }} - editable={!this.state.isLoading} - underlineColorAndroid="transparent" - /> - - - - {this.state.isLoading ? : } - - - - - Currently using: - Host: {this.state.config.host} - Port: {this.state.config.port} - Connected: {(this.state.config.status === 1 && 'Yes') || 'No'} - - - ); - } -} - -ElectrumSettings.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/settings/encryptStorage.js b/screen/settings/encryptStorage.js deleted file mode 100644 index 1b77812329..0000000000 --- a/screen/settings/encryptStorage.js +++ /dev/null @@ -1,105 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { View } from 'react-native'; -import { FormValidationMessage } from 'react-native-elements'; -import { BlueLoading, BlueSpacing20, BlueButton, SafeBlueArea, BlueCard, BlueText, BlueNavigationStyle } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -let prompt = require('../../prompt'); -let loc = require('../../loc'); - -export default class EncryptStorage extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: loc.settings.encrypt_storage, - }); - - constructor(props) { - super(props); - this.state = { - isLoading: true, - language: loc.getLanguage(), - }; - } - - async componentDidMount() { - this.setState({ - isLoading: false, - storageIsEncrypted: await BlueApp.storageIsEncrypted(), - }); - } - - render() { - if (this.state.isLoading) { - return ; - } - - return ( - - - {(() => { - if (this.state.storageIsEncrypted) { - return ( - - {loc.settings.storage_encrypted} - - this.props.navigation.navigate('PlausibleDeniability')} - title={loc.settings.plausible_deniability} - /> - - ); - } else { - return ( - - {loc.settings.storage_not_encrypted} - - { - this.setState({ isLoading: true }); - let p1 = await prompt(loc.settings.password, loc.settings.password_explain).catch(() => { - this.setState({ isLoading: false }); - p1 = undefined; - }); - if (!p1) { - this.setState({ isLoading: false }); - return; - } - let p2 = await prompt(loc.settings.password, loc.settings.retype_password).catch(() => { - this.setState({ isLoading: false }); - }); - if (p1 === p2) { - await BlueApp.encryptStorage(p1); - this.setState({ - isLoading: false, - storageIsEncrypted: await BlueApp.storageIsEncrypted(), - }); - } else { - this.setState({ isLoading: false }); - alert(loc.settings.passwords_do_not_match); - } - }} - title={loc.settings.encrypt_storage} - /> - - ); - } - })()} - - - ); - } -} - -EncryptStorage.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/settings/language.js b/screen/settings/language.js deleted file mode 100644 index cc25283b2e..0000000000 --- a/screen/settings/language.js +++ /dev/null @@ -1,105 +0,0 @@ -import React, { Component } from 'react'; -import { FlatList, TouchableOpacity } from 'react-native'; -import { BlueLoading, BlueText, SafeBlueArea, BlueListItem, BlueCard, BlueNavigationStyle } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import { Icon } from 'react-native-elements'; -let loc = require('../../loc'); - -export default class Language extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: loc.settings.language, - }); - - constructor(props) { - super(props); - this.state = { - isLoading: true, - language: loc.getLanguage(), - availableLanguages: [ - { label: 'English', value: 'en' }, - { label: 'Afrikaans (AFR)', value: 'zar_afr' }, - { label: 'Chinese (ZH)', value: 'zh_cn' }, - { label: 'Chinese (TW)', value: 'zh_tw' }, - { label: 'Croatian (HR)', value: 'hr_hr' }, - { label: 'Česky (CZ)', value: 'cs_cz' }, - { label: 'Danish (DK)', value: 'da_dk' }, - { label: 'Deutsch (DE)', value: 'de_de' }, - { label: 'Español (ES)', value: 'es' }, - { label: 'Ελληνικά (EL)', value: 'el' }, - { label: 'Italiano (IT)', value: 'it' }, - { label: 'Suomi (FI)', value: 'fi_fi' }, - { label: 'Français (FR)', value: 'fr_fr' }, - { label: 'Indonesia (ID)', value: 'id_id' }, - { label: 'Magyar (HU)', value: 'hu_hu' }, - { label: '日本語 (JP)', value: 'jp_jp' }, - { label: 'Nederlands (NL)', value: 'nl_nl' }, - { label: 'Norsk (NB)', value: 'nb_no' }, - { label: 'Português (BR)', value: 'pt_br' }, - { label: 'Português (PT)', value: 'pt_pt' }, - { label: 'Русский', value: 'ru' }, - { label: 'Svenska (SE)', value: 'sv_se' }, - { label: 'Thai (TH)', value: 'th_th' }, - { label: 'Vietnamese (VN)', value: 'vi_vn' }, - { label: 'Українська', value: 'ua' }, - { label: 'Türkçe (TR)', value: 'tr_tr' }, - { label: 'Xhosa (XHO)', value: 'zar_xho' }, - ], - }; - } - - async componentDidMount() { - this.setState({ - isLoading: false, - }); - } - - renderItem = ({ item }) => { - return ( - { - console.log('setLanguage', item.value); - loc.saveLanguage(item.value); - return this.setState({ language: item.value }); - }} - > - , - } - : { hideChevron: true })} - /> - - ); - }; - - render() { - if (this.state.isLoading) { - return ; - } - - return ( - - `${index}`} - data={this.state.availableLanguages} - extraData={this.state.availableLanguages} - renderItem={this.renderItem} - /> - - When selecting a new language, restarting BlueWallet may be required for the change to take effect. - - - ); - } -} - -Language.propTypes = { - navigation: PropTypes.shape({ - navigate: PropTypes.func, - goBack: PropTypes.func, - }), -}; diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.js deleted file mode 100644 index 70f159287f..0000000000 --- a/screen/settings/lightningSettings.js +++ /dev/null @@ -1,117 +0,0 @@ -/* global alert */ -import React, { Component } from 'react'; -import { View, TextInput, Linking } from 'react-native'; -import { AppStorage } from '../../class'; -import AsyncStorage from '@react-native-community/async-storage'; -import { BlueLoading, BlueSpacing20, BlueButton, SafeBlueArea, BlueCard, BlueNavigationStyle, BlueText } from '../../BlueComponents'; -import PropTypes from 'prop-types'; -import { Button } from 'react-native-elements'; -import { LightningCustodianWallet } from '../../class/lightning-custodian-wallet'; -/** @type {AppStorage} */ -let BlueApp = require('../../BlueApp'); -let loc = require('../../loc'); - -export default class LightningSettings extends Component { - static navigationOptions = () => ({ - ...BlueNavigationStyle(), - title: loc.settings.lightning_settings, - }); - - constructor(props) { - super(props); - this.state = { - isLoading: true, - }; - } - - async componentDidMount() { - let URI = await AsyncStorage.getItem(AppStorage.LNDHUB); - - this.setState({ - isLoading: false, - URI, - }); - } - - save = () => { - this.setState({ isLoading: true }, async () => { - this.state.URI = this.state.URI ? this.state.URI : ''; - try { - if (this.state.URI) { - await LightningCustodianWallet.isValidNodeAddress(this.state.URI); - // validating only if its not empty. empty means use default - } - await AsyncStorage.setItem(AppStorage.LNDHUB, this.state.URI); - alert('Your changes have been saved successfully'); - } catch (error) { - alert('Not a valid LndHub URI'); - console.log(error); - } - this.setState({ isLoading: false }); - }); - }; - - render() { - return ( - - - {loc.settings.lightning_settings_explain} - - -